@wealthx/shadcn 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/.turbo/turbo-build.log +259 -223
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{chunk-2UM72RJ7.mjs → chunk-2D3HQPFN.mjs} +12 -10
  4. package/dist/chunk-2EM2FRU6.mjs +613 -0
  5. package/dist/{chunk-FH6QVUVZ.mjs → chunk-2GIYVERS.mjs} +2 -2
  6. package/dist/chunk-2P7HP7LR.mjs +68 -0
  7. package/dist/{chunk-HISNT2MG.mjs → chunk-37AE3OM5.mjs} +5 -5
  8. package/dist/{chunk-HBZLGDIN.mjs → chunk-3ERBUVHC.mjs} +169 -110
  9. package/dist/{chunk-C7CQJNMR.mjs → chunk-3VDET466.mjs} +2 -2
  10. package/dist/{chunk-462HMNO4.mjs → chunk-4MM7LHM5.mjs} +2 -2
  11. package/dist/{chunk-QMY3AZJH.mjs → chunk-4Z66LMIQ.mjs} +2 -2
  12. package/dist/{chunk-U5X52X37.mjs → chunk-57ZXILTS.mjs} +6 -6
  13. package/dist/{chunk-3OYFOX3X.mjs → chunk-5VOTTIXF.mjs} +2 -2
  14. package/dist/{chunk-LBMRIB3G.mjs → chunk-6AJUS7VX.mjs} +1 -1
  15. package/dist/{chunk-OODBHKG7.mjs → chunk-6HIOM2HL.mjs} +7 -4
  16. package/dist/{chunk-BDYZCBRT.mjs → chunk-6QAFGZC2.mjs} +2 -2
  17. package/dist/{chunk-U4NDAF2P.mjs → chunk-6TX73WG7.mjs} +1 -1
  18. package/dist/{chunk-GD4BJDJR.mjs → chunk-7BTFGCFC.mjs} +4 -4
  19. package/dist/{chunk-FAKPBKLT.mjs → chunk-7GWRPXHD.mjs} +4 -4
  20. package/dist/{chunk-NMOI6CQD.mjs → chunk-7YI3HEBH.mjs} +5 -5
  21. package/dist/{chunk-T4BJLT57.mjs → chunk-AE7MASLF.mjs} +5 -5
  22. package/dist/{chunk-VLQZANBF.mjs → chunk-AFML43VJ.mjs} +6 -1
  23. package/dist/chunk-BBXSNDS3.mjs +260 -0
  24. package/dist/chunk-BOW7U26Y.mjs +203 -0
  25. package/dist/{chunk-34NWQURD.mjs → chunk-BS75ICOO.mjs} +2 -2
  26. package/dist/chunk-D2NSIIXG.mjs +394 -0
  27. package/dist/{chunk-3GF7OVTP.mjs → chunk-DGNHGNYH.mjs} +2 -2
  28. package/dist/{chunk-VLARHE5V.mjs → chunk-DMXYRCHM.mjs} +6 -6
  29. package/dist/{chunk-OGOYQ7BG.mjs → chunk-DQB4EPIS.mjs} +1 -1
  30. package/dist/{chunk-MIZQHHUO.mjs → chunk-FL6DZFJK.mjs} +106 -38
  31. package/dist/{chunk-I3RZS7V2.mjs → chunk-FLL633WS.mjs} +19 -33
  32. package/dist/{chunk-PBL4OQV2.mjs → chunk-FTPBQVQ6.mjs} +4 -4
  33. package/dist/chunk-FYPSTTEJ.mjs +169 -0
  34. package/dist/{chunk-6O6KD7CE.mjs → chunk-G27TSQLQ.mjs} +6 -6
  35. package/dist/{chunk-66MI7Q4B.mjs → chunk-GT3RU6GA.mjs} +2 -2
  36. package/dist/{chunk-D6ID6M4V.mjs → chunk-GTAVSBDO.mjs} +2 -2
  37. package/dist/{chunk-24FUO7TD.mjs → chunk-H6NQTIF4.mjs} +2 -2
  38. package/dist/{chunk-7DHU4VGG.mjs → chunk-HK4HUQTV.mjs} +2 -2
  39. package/dist/chunk-I4KVSZCH.mjs +101 -0
  40. package/dist/{chunk-RGVKLTLH.mjs → chunk-IKXYTCSB.mjs} +2 -2
  41. package/dist/{chunk-Y6DWJSKZ.mjs → chunk-ISUA7DSB.mjs} +1 -1
  42. package/dist/{chunk-2A5RRQGG.mjs → chunk-JD3YWRNP.mjs} +10 -14
  43. package/dist/{chunk-J5UICVJS.mjs → chunk-JPGL36WQ.mjs} +2 -2
  44. package/dist/{chunk-7XJHLGUV.mjs → chunk-JTK6VJXY.mjs} +2 -2
  45. package/dist/{chunk-7YAU5CY6.mjs → chunk-JVMXMFBB.mjs} +2 -2
  46. package/dist/{chunk-IAE3F7DR.mjs → chunk-JZY6TNIS.mjs} +21 -21
  47. package/dist/{chunk-K5A5L6T2.mjs → chunk-K4KOD3KR.mjs} +12 -12
  48. package/dist/{chunk-MBON7YRJ.mjs → chunk-K5QV4TT6.mjs} +3 -3
  49. package/dist/{chunk-IHMFS7NZ.mjs → chunk-K5VHK7CM.mjs} +21 -21
  50. package/dist/{chunk-RJI6GKVF.mjs → chunk-KCWNDYPZ.mjs} +5 -5
  51. package/dist/{chunk-UFYSFDER.mjs → chunk-KFH36NKF.mjs} +1 -1
  52. package/dist/{chunk-EBXQWIYG.mjs → chunk-KLTACJ2G.mjs} +5 -5
  53. package/dist/{chunk-3TTACBDP.mjs → chunk-KWD6GANL.mjs} +4 -4
  54. package/dist/{chunk-IOJRDS6V.mjs → chunk-L4NSRQ3T.mjs} +218 -147
  55. package/dist/{chunk-GYMYRIZP.mjs → chunk-LBTHZSBT.mjs} +2 -2
  56. package/dist/{chunk-AMQZRHEZ.mjs → chunk-LQULK2E3.mjs} +5 -5
  57. package/dist/{chunk-YJG55G2H.mjs → chunk-LR6LHDP3.mjs} +5 -5
  58. package/dist/{chunk-7PV3IWCN.mjs → chunk-M4VYX2PV.mjs} +19 -1
  59. package/dist/{chunk-P76HMUI6.mjs → chunk-MDUKXXIL.mjs} +2 -2
  60. package/dist/{chunk-LV35NGVG.mjs → chunk-N6Q5IPKT.mjs} +9 -9
  61. package/dist/{chunk-DOEO3CDL.mjs → chunk-NB3ZL36B.mjs} +1 -1
  62. package/dist/{chunk-XREGSKX3.mjs → chunk-NOOEKOWY.mjs} +5 -5
  63. package/dist/{chunk-NL3ZO62D.mjs → chunk-NT4FX27K.mjs} +1 -1
  64. package/dist/{chunk-QZ4RE6NA.mjs → chunk-NTYQWVLI.mjs} +6 -6
  65. package/dist/{chunk-ERGGHC2V.mjs → chunk-OEOOYMC2.mjs} +2 -2
  66. package/dist/{chunk-4GAWMKMI.mjs → chunk-OIKBW2QD.mjs} +291 -54
  67. package/dist/{chunk-DUJTAXMH.mjs → chunk-OKTJFDPN.mjs} +6 -6
  68. package/dist/chunk-OLKMCXAR.mjs +1219 -0
  69. package/dist/{chunk-EI5F6FMT.mjs → chunk-OWFQSXVD.mjs} +3 -3
  70. package/dist/{chunk-6DZEXFNB.mjs → chunk-P2N2PEFY.mjs} +3 -3
  71. package/dist/{chunk-NSLMILBT.mjs → chunk-P7CEBZM6.mjs} +2 -2
  72. package/dist/{chunk-7S5AESZO.mjs → chunk-PNRUH7JY.mjs} +6 -6
  73. package/dist/{chunk-ZU4NV6RG.mjs → chunk-PNSYFE3K.mjs} +2 -2
  74. package/dist/{chunk-JKGDCQTZ.mjs → chunk-QTRSCVQ3.mjs} +5 -5
  75. package/dist/{chunk-ABFDMHOR.mjs → chunk-QX7IFQSF.mjs} +5 -5
  76. package/dist/{chunk-CFMQP5QS.mjs → chunk-QXKGOMUX.mjs} +6 -6
  77. package/dist/{chunk-NQPOYKAQ.mjs → chunk-R2ON6CAN.mjs} +2 -2
  78. package/dist/{chunk-DBHJ5KC3.mjs → chunk-R4HCRDU5.mjs} +1 -1
  79. package/dist/{chunk-EWRB4PAD.mjs → chunk-RCAOCHWA.mjs} +14 -14
  80. package/dist/{chunk-EFRENWEJ.mjs → chunk-RSUIPKGX.mjs} +2 -2
  81. package/dist/{chunk-DGHAXJBN.mjs → chunk-S2FKV4M5.mjs} +5 -5
  82. package/dist/{chunk-RGU7HOEC.mjs → chunk-SET2ANTY.mjs} +5 -7
  83. package/dist/chunk-SFH2NJEJ.mjs +47 -0
  84. package/dist/{chunk-6AW4KJHE.mjs → chunk-SIVYAI3M.mjs} +12 -12
  85. package/dist/{chunk-5FQIKDKP.mjs → chunk-THVO2N47.mjs} +8 -8
  86. package/dist/{chunk-JMHR3YGZ.mjs → chunk-TLAWKTSA.mjs} +3 -3
  87. package/dist/{chunk-HVY6KCCF.mjs → chunk-TOWTPLRC.mjs} +68 -72
  88. package/dist/{chunk-6JQFUE5I.mjs → chunk-UALR6JGV.mjs} +2 -2
  89. package/dist/{chunk-MLNEWRWV.mjs → chunk-UJZ4UHWI.mjs} +10 -15
  90. package/dist/{chunk-MARPPFOJ.mjs → chunk-UNACI2YK.mjs} +2 -2
  91. package/dist/{chunk-3NCUZIFP.mjs → chunk-V6XGXYCJ.mjs} +7 -7
  92. package/dist/chunk-VB5M6OZQ.mjs +57 -0
  93. package/dist/{chunk-5IS7G74I.mjs → chunk-VY5NEUP7.mjs} +6 -6
  94. package/dist/{chunk-JHJHG4GO.mjs → chunk-WE4YKBDE.mjs} +2 -2
  95. package/dist/{chunk-BKNFWEH2.mjs → chunk-WL6WVV47.mjs} +3 -3
  96. package/dist/{chunk-FWCSY2DS.mjs → chunk-WNQUEZJF.mjs} +22 -1
  97. package/dist/{chunk-2Y7YJKPE.mjs → chunk-WZ6UJCBL.mjs} +1 -1
  98. package/dist/{chunk-UMTOX62O.mjs → chunk-XYPW2XA5.mjs} +13 -10
  99. package/dist/chunk-Y2MTAVAK.mjs +34 -0
  100. package/dist/{chunk-6CR5N2JW.mjs → chunk-YCWLFG27.mjs} +6 -6
  101. package/dist/{chunk-PU4YZQXV.mjs → chunk-YE67AALL.mjs} +12 -12
  102. package/dist/{chunk-M3FV7LOK.mjs → chunk-YEWNFK5S.mjs} +6 -1
  103. package/dist/{chunk-R3VSPKNP.mjs → chunk-YIZHS72Z.mjs} +11 -12
  104. package/dist/{chunk-7PYJD5JI.mjs → chunk-ZEDMKQK2.mjs} +2 -2
  105. package/dist/{chunk-N2PT566P.mjs → chunk-ZFCDYW6N.mjs} +4 -4
  106. package/dist/chunk-ZGQIVGIN.mjs +57 -0
  107. package/dist/{chunk-Q2BGOAMG.mjs → chunk-ZKWXDQDG.mjs} +4 -4
  108. package/dist/{chunk-GHC7LLUX.mjs → chunk-ZOWL2L5J.mjs} +5 -5
  109. package/dist/components/ui/accordion.mjs +3 -3
  110. package/dist/components/ui/add-column-modal.js +2 -2
  111. package/dist/components/ui/add-column-modal.mjs +10 -10
  112. package/dist/components/ui/add-lead-modal.js +424 -82
  113. package/dist/components/ui/add-lead-modal.mjs +12 -9
  114. package/dist/components/ui/advisor-card.js +2 -2
  115. package/dist/components/ui/advisor-card.mjs +8 -8
  116. package/dist/components/ui/ai-assistant-drawer.js +2 -2
  117. package/dist/components/ui/ai-assistant-drawer.mjs +9 -9
  118. package/dist/components/ui/ai-builder.js +958 -0
  119. package/dist/components/ui/ai-builder.mjs +25 -0
  120. package/dist/components/ui/ai-conversations.js +2045 -0
  121. package/dist/components/ui/ai-conversations.mjs +41 -0
  122. package/dist/components/ui/alert-dialog.js +2 -2
  123. package/dist/components/ui/alert-dialog.mjs +5 -5
  124. package/dist/components/ui/alert.mjs +3 -3
  125. package/dist/components/ui/appointment-action-dialogs.js +19 -3
  126. package/dist/components/ui/appointment-action-dialogs.mjs +15 -14
  127. package/dist/components/ui/appointment-availability-settings.js +181 -111
  128. package/dist/components/ui/appointment-availability-settings.mjs +20 -18
  129. package/dist/components/ui/appointment-book-dialog.js +113 -24
  130. package/dist/components/ui/appointment-book-dialog.mjs +21 -20
  131. package/dist/components/ui/appointment-calendar-view.js +19 -3
  132. package/dist/components/ui/appointment-calendar-view.mjs +10 -9
  133. package/dist/components/ui/appointment-detail-sheet.js +19 -3
  134. package/dist/components/ui/appointment-detail-sheet.mjs +18 -17
  135. package/dist/components/ui/appointment-gmail-connect.js +49 -89
  136. package/dist/components/ui/appointment-gmail-connect.mjs +8 -9
  137. package/dist/components/ui/appointment-mini-card.js +2 -2
  138. package/dist/components/ui/appointment-mini-card.mjs +6 -6
  139. package/dist/components/ui/appointment-time-slot-picker.mjs +6 -6
  140. package/dist/components/ui/appointment-upcoming-card.js +19 -3
  141. package/dist/components/ui/appointment-upcoming-card.mjs +15 -14
  142. package/dist/components/ui/auth-logo.js +95 -0
  143. package/dist/components/ui/auth-logo.mjs +8 -0
  144. package/dist/components/ui/auth-page-layout.js +108 -0
  145. package/dist/components/ui/auth-page-layout.mjs +8 -0
  146. package/dist/components/ui/avatar.mjs +3 -3
  147. package/dist/components/ui/backoffice-alert-history-chart.js +2 -2
  148. package/dist/components/ui/backoffice-alert-history-chart.mjs +9 -9
  149. package/dist/components/ui/backoffice-alerts-chart.js +2 -2
  150. package/dist/components/ui/backoffice-alerts-chart.mjs +11 -11
  151. package/dist/components/ui/backoffice-connections-chart.js +2 -2
  152. package/dist/components/ui/backoffice-connections-chart.mjs +11 -11
  153. package/dist/components/ui/backoffice-contact-history-chart.js +2 -2
  154. package/dist/components/ui/backoffice-contact-history-chart.mjs +9 -9
  155. package/dist/components/ui/badge.mjs +4 -4
  156. package/dist/components/ui/borrowing-capacity-line-chart.js +145 -132
  157. package/dist/components/ui/borrowing-capacity-line-chart.mjs +9 -9
  158. package/dist/components/ui/button.js +2 -2
  159. package/dist/components/ui/button.mjs +4 -4
  160. package/dist/components/ui/calendar.js +17 -3
  161. package/dist/components/ui/calendar.mjs +6 -5
  162. package/dist/components/ui/card.mjs +3 -3
  163. package/dist/components/ui/cash-balance-line-chart.js +157 -152
  164. package/dist/components/ui/cash-balance-line-chart.mjs +9 -9
  165. package/dist/components/ui/cashflow-bar-chart.js +2 -2
  166. package/dist/components/ui/cashflow-bar-chart.mjs +9 -9
  167. package/dist/components/ui/chat-widget-primitives.js +573 -0
  168. package/dist/components/ui/chat-widget-primitives.mjs +21 -0
  169. package/dist/components/ui/chat-widget.js +1268 -0
  170. package/dist/components/ui/chat-widget.mjs +29 -0
  171. package/dist/components/ui/checkbox.mjs +3 -3
  172. package/dist/components/ui/chip.js +2 -2
  173. package/dist/components/ui/chip.mjs +6 -6
  174. package/dist/components/ui/color-picker.js +2 -2
  175. package/dist/components/ui/color-picker.mjs +7 -7
  176. package/dist/components/ui/combobox.mjs +3 -3
  177. package/dist/components/ui/data-table.js +2 -2
  178. package/dist/components/ui/data-table.mjs +12 -12
  179. package/dist/components/ui/date-picker.js +22 -6
  180. package/dist/components/ui/date-picker.mjs +9 -8
  181. package/dist/components/ui/dialog.js +2 -2
  182. package/dist/components/ui/dialog.mjs +5 -5
  183. package/dist/components/ui/document-checklist-template.js +630 -0
  184. package/dist/components/ui/document-checklist-template.mjs +15 -0
  185. package/dist/components/ui/drawer.js +2 -2
  186. package/dist/components/ui/drawer.mjs +3 -3
  187. package/dist/components/ui/dropdown-menu.mjs +3 -3
  188. package/dist/components/ui/empty.mjs +3 -3
  189. package/dist/components/ui/expense-bar-chart.js +2 -2
  190. package/dist/components/ui/expense-bar-chart.mjs +9 -9
  191. package/dist/components/ui/field.mjs +5 -5
  192. package/dist/components/ui/financial-cards.js +431 -291
  193. package/dist/components/ui/financial-cards.mjs +10 -9
  194. package/dist/components/ui/financial-drawers.js +4 -4
  195. package/dist/components/ui/financial-drawers.mjs +8 -8
  196. package/dist/components/ui/financial-primitives.mjs +3 -3
  197. package/dist/components/ui/financial-sections.js +8 -9
  198. package/dist/components/ui/financial-sections.mjs +12 -12
  199. package/dist/components/ui/form-primitives.mjs +8 -8
  200. package/dist/components/ui/income-bar-chart.js +2 -2
  201. package/dist/components/ui/income-bar-chart.mjs +9 -9
  202. package/dist/components/ui/input-group.js +2 -2
  203. package/dist/components/ui/input-group.mjs +7 -7
  204. package/dist/components/ui/input-otp.mjs +3 -3
  205. package/dist/components/ui/input.mjs +3 -3
  206. package/dist/components/ui/kanban-column.js +19 -23
  207. package/dist/components/ui/kanban-column.mjs +14 -14
  208. package/dist/components/ui/label.mjs +3 -3
  209. package/dist/components/ui/onboarding-layout.js +476 -0
  210. package/dist/components/ui/onboarding-layout.mjs +11 -0
  211. package/dist/components/ui/opportunity-card.js +2 -2
  212. package/dist/components/ui/opportunity-card.mjs +12 -12
  213. package/dist/components/ui/opportunity-edit-modals.js +22 -6
  214. package/dist/components/ui/opportunity-edit-modals.mjs +21 -20
  215. package/dist/components/ui/opportunity-summary-tab.js +991 -674
  216. package/dist/components/ui/opportunity-summary-tab.mjs +26 -26
  217. package/dist/components/ui/page-header.mjs +3 -3
  218. package/dist/components/ui/page-top-bar.mjs +3 -3
  219. package/dist/components/ui/pagination.js +2 -2
  220. package/dist/components/ui/pagination.mjs +6 -6
  221. package/dist/components/ui/password-strength-tooltip.js +197 -0
  222. package/dist/components/ui/password-strength-tooltip.mjs +11 -0
  223. package/dist/components/ui/pipeline-alerts.mjs +3 -3
  224. package/dist/components/ui/pipeline-board.js +19 -23
  225. package/dist/components/ui/pipeline-board.mjs +18 -18
  226. package/dist/components/ui/pipeline-chart.js +12 -6
  227. package/dist/components/ui/pipeline-chart.mjs +4 -3
  228. package/dist/components/ui/pipeline-dialogs.js +28 -12
  229. package/dist/components/ui/pipeline-dialogs.mjs +14 -13
  230. package/dist/components/ui/pipeline-primitives.mjs +6 -6
  231. package/dist/components/ui/popover.mjs +3 -3
  232. package/dist/components/ui/progress.mjs +3 -3
  233. package/dist/components/ui/property-cashflow-doughnut-chart.js +2 -2
  234. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +9 -9
  235. package/dist/components/ui/property-debt-equity-doughnut-chart.js +2 -2
  236. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +9 -9
  237. package/dist/components/ui/property-mobile-estimate-line-chart.js +2 -2
  238. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +9 -9
  239. package/dist/components/ui/radio-group.mjs +3 -3
  240. package/dist/components/ui/select.mjs +3 -3
  241. package/dist/components/ui/separator.mjs +3 -3
  242. package/dist/components/ui/sheet.mjs +3 -3
  243. package/dist/components/ui/sidebar-nav.js +7 -9
  244. package/dist/components/ui/sidebar-nav.mjs +7 -7
  245. package/dist/components/ui/skeleton.mjs +3 -3
  246. package/dist/components/ui/slider.mjs +3 -3
  247. package/dist/components/ui/sonner.mjs +2 -2
  248. package/dist/components/ui/spinner.mjs +3 -3
  249. package/dist/components/ui/stage-timeline.mjs +10 -10
  250. package/dist/components/ui/stepper.mjs +3 -3
  251. package/dist/components/ui/switch.mjs +3 -3
  252. package/dist/components/ui/table.mjs +3 -3
  253. package/dist/components/ui/tabs.mjs +3 -3
  254. package/dist/components/ui/textarea.mjs +3 -3
  255. package/dist/components/ui/toggle-group.mjs +4 -4
  256. package/dist/components/ui/toggle.mjs +3 -3
  257. package/dist/components/ui/tooltip.mjs +3 -3
  258. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +2 -2
  259. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +9 -9
  260. package/dist/components/ui/transactions-income-expense-bar-chart.js +2 -2
  261. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +9 -9
  262. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +2 -2
  263. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +9 -9
  264. package/dist/components/ui/two-fa-setup-form.js +612 -0
  265. package/dist/components/ui/two-fa-setup-form.mjs +16 -0
  266. package/dist/components/ui/upload-card.js +187 -0
  267. package/dist/components/ui/upload-card.mjs +10 -0
  268. package/dist/components/ui/video-background.js +118 -0
  269. package/dist/components/ui/video-background.mjs +8 -0
  270. package/dist/index.js +12765 -9400
  271. package/dist/index.mjs +341 -245
  272. package/dist/lib/colors.mjs +1 -1
  273. package/dist/lib/theme-provider.mjs +1 -1
  274. package/dist/lib/typography.mjs +2 -2
  275. package/dist/lib/utils.js +8 -2
  276. package/dist/lib/utils.mjs +6 -4
  277. package/dist/styles.css +1 -1
  278. package/package.json +61 -1
  279. package/src/components/index.tsx +126 -1
  280. package/src/components/ui/add-lead-modal.tsx +101 -142
  281. package/src/components/ui/ai-builder.tsx +560 -0
  282. package/src/components/ui/ai-conversations.tsx +1690 -0
  283. package/src/components/ui/appointment-availability-settings.tsx +152 -101
  284. package/src/components/ui/appointment-book-dialog.tsx +138 -24
  285. package/src/components/ui/appointment-calendar-view.tsx +2 -3
  286. package/src/components/ui/appointment-gmail-connect.tsx +23 -42
  287. package/src/components/ui/auth-logo.tsx +50 -0
  288. package/src/components/ui/auth-page-layout.tsx +59 -0
  289. package/src/components/ui/borrowing-capacity-line-chart.tsx +10 -8
  290. package/src/components/ui/button.tsx +2 -2
  291. package/src/components/ui/calendar.tsx +2 -1
  292. package/src/components/ui/cash-balance-line-chart.tsx +10 -14
  293. package/src/components/ui/chart-shared.tsx +10 -0
  294. package/src/components/ui/chat-widget-primitives.tsx +336 -0
  295. package/src/components/ui/chat-widget.tsx +822 -0
  296. package/src/components/ui/document-checklist-template.tsx +264 -0
  297. package/src/components/ui/drawer.tsx +2 -2
  298. package/src/components/ui/financial-cards.tsx +176 -78
  299. package/src/components/ui/financial-drawers.tsx +2 -2
  300. package/src/components/ui/financial-sections.tsx +1 -1
  301. package/src/components/ui/kanban-column.tsx +2 -5
  302. package/src/components/ui/onboarding-layout.tsx +109 -0
  303. package/src/components/ui/opportunity-summary-tab.tsx +469 -142
  304. package/src/components/ui/password-strength-tooltip.tsx +70 -0
  305. package/src/components/ui/pipeline-chart.tsx +2 -6
  306. package/src/components/ui/sidebar-nav.tsx +2 -15
  307. package/src/components/ui/two-fa-setup-form.tsx +229 -0
  308. package/src/components/ui/upload-card.tsx +98 -0
  309. package/src/components/ui/video-background.tsx +55 -0
  310. package/src/lib/format-date.ts +26 -0
  311. package/src/lib/utils.ts +11 -0
  312. package/src/styles/styles-css.ts +1 -1
  313. package/tsup.config.ts +13 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wealthx/shadcn",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./src/index.ts",
@@ -238,6 +238,11 @@
238
238
  "import": "./dist/components/ui/data-table.mjs",
239
239
  "require": "./dist/components/ui/data-table.js"
240
240
  },
241
+ "./document-checklist-template": {
242
+ "types": "./src/components/ui/document-checklist-template.tsx",
243
+ "import": "./dist/components/ui/document-checklist-template.mjs",
244
+ "require": "./dist/components/ui/document-checklist-template.js"
245
+ },
241
246
  "./drawer": {
242
247
  "types": "./src/components/ui/drawer.tsx",
243
248
  "import": "./dist/components/ui/drawer.mjs",
@@ -283,6 +288,11 @@
283
288
  "import": "./dist/components/ui/accordion.mjs",
284
289
  "require": "./dist/components/ui/accordion.js"
285
290
  },
291
+ "./ai-builder": {
292
+ "types": "./src/components/ui/ai-builder.tsx",
293
+ "import": "./dist/components/ui/ai-builder.mjs",
294
+ "require": "./dist/components/ui/ai-builder.js"
295
+ },
286
296
  "./empty": {
287
297
  "types": "./src/components/ui/empty.tsx",
288
298
  "import": "./dist/components/ui/empty.mjs",
@@ -393,6 +403,11 @@
393
403
  "import": "./dist/components/ui/pipeline-primitives.mjs",
394
404
  "require": "./dist/components/ui/pipeline-primitives.js"
395
405
  },
406
+ "./onboarding-layout": {
407
+ "types": "./src/components/ui/onboarding-layout.tsx",
408
+ "import": "./dist/components/ui/onboarding-layout.mjs",
409
+ "require": "./dist/components/ui/onboarding-layout.js"
410
+ },
396
411
  "./opportunity-card": {
397
412
  "types": "./src/components/ui/opportunity-card.tsx",
398
413
  "import": "./dist/components/ui/opportunity-card.mjs",
@@ -448,6 +463,21 @@
448
463
  "import": "./dist/components/ui/ai-assistant-drawer.mjs",
449
464
  "require": "./dist/components/ui/ai-assistant-drawer.js"
450
465
  },
466
+ "./ai-conversations": {
467
+ "types": "./src/components/ui/ai-conversations.tsx",
468
+ "import": "./dist/components/ui/ai-conversations.mjs",
469
+ "require": "./dist/components/ui/ai-conversations.js"
470
+ },
471
+ "./chat-widget-primitives": {
472
+ "types": "./src/components/ui/chat-widget-primitives.tsx",
473
+ "import": "./dist/components/ui/chat-widget-primitives.mjs",
474
+ "require": "./dist/components/ui/chat-widget-primitives.js"
475
+ },
476
+ "./chat-widget": {
477
+ "types": "./src/components/ui/chat-widget.tsx",
478
+ "import": "./dist/components/ui/chat-widget.mjs",
479
+ "require": "./dist/components/ui/chat-widget.js"
480
+ },
451
481
  "./opportunity-edit-modals": {
452
482
  "types": "./src/components/ui/opportunity-edit-modals.tsx",
453
483
  "import": "./dist/components/ui/opportunity-edit-modals.mjs",
@@ -517,6 +547,36 @@
517
547
  "types": "./src/components/ui/appointment-availability-settings.tsx",
518
548
  "import": "./dist/components/ui/appointment-availability-settings.mjs",
519
549
  "require": "./dist/components/ui/appointment-availability-settings.js"
550
+ },
551
+ "./auth-logo": {
552
+ "types": "./src/components/ui/auth-logo.tsx",
553
+ "import": "./dist/components/ui/auth-logo.mjs",
554
+ "require": "./dist/components/ui/auth-logo.js"
555
+ },
556
+ "./auth-page-layout": {
557
+ "types": "./src/components/ui/auth-page-layout.tsx",
558
+ "import": "./dist/components/ui/auth-page-layout.mjs",
559
+ "require": "./dist/components/ui/auth-page-layout.js"
560
+ },
561
+ "./password-strength-tooltip": {
562
+ "types": "./src/components/ui/password-strength-tooltip.tsx",
563
+ "import": "./dist/components/ui/password-strength-tooltip.mjs",
564
+ "require": "./dist/components/ui/password-strength-tooltip.js"
565
+ },
566
+ "./two-fa-setup-form": {
567
+ "types": "./src/components/ui/two-fa-setup-form.tsx",
568
+ "import": "./dist/components/ui/two-fa-setup-form.mjs",
569
+ "require": "./dist/components/ui/two-fa-setup-form.js"
570
+ },
571
+ "./video-background": {
572
+ "types": "./src/components/ui/video-background.tsx",
573
+ "import": "./dist/components/ui/video-background.mjs",
574
+ "require": "./dist/components/ui/video-background.js"
575
+ },
576
+ "./upload-card": {
577
+ "types": "./src/components/ui/upload-card.tsx",
578
+ "import": "./dist/components/ui/upload-card.mjs",
579
+ "require": "./dist/components/ui/upload-card.js"
520
580
  }
521
581
  }
522
582
  }
@@ -11,6 +11,61 @@ export type {
11
11
  AccordionContentProps,
12
12
  } from "./ui/accordion";
13
13
 
14
+ export {
15
+ AgentCard,
16
+ AgentMenuModal,
17
+ IntegrationServiceCard,
18
+ IntegrationInstructionCard,
19
+ ServiceConfigurationModal,
20
+ } from "./ui/ai-builder";
21
+ export type {
22
+ AiBuilderAgentItem,
23
+ AiBuilderServiceType,
24
+ AiBuilderServiceData,
25
+ AgentCardProps,
26
+ AgentMenuModalProps,
27
+ IntegrationServiceCardProps,
28
+ IntegrationInstructionCardProps,
29
+ ServiceConfigurationModalProps,
30
+ } from "./ui/ai-builder";
31
+
32
+ export {
33
+ ConversationStatusChip,
34
+ ConversationListItem,
35
+ ConversationList,
36
+ ChatBubble,
37
+ ChatComposer,
38
+ ChatThread,
39
+ AICollectedDataSection,
40
+ LeadInfoPanel,
41
+ ConversationsPage,
42
+ AiConvAssignAdvisorDialog,
43
+ } from "./ui/ai-conversations";
44
+ export type {
45
+ AiConvStatus,
46
+ AiConvMessageRole,
47
+ AiConvFieldConfidence,
48
+ AiConvFilterTab,
49
+ AiConvMode,
50
+ AiConvMeetingType,
51
+ AiConvContact,
52
+ AiConvAdvisor,
53
+ AiConvListItemData,
54
+ AiConvMessage,
55
+ AiConvDataField,
56
+ AiConvAppointmentData,
57
+ ConversationStatusChipProps,
58
+ ConversationListItemProps,
59
+ ConversationListProps,
60
+ ChatBubbleProps,
61
+ ChatComposerProps,
62
+ ChatThreadProps,
63
+ AICollectedDataSectionProps,
64
+ LeadInfoPanelProps,
65
+ ConversationsPageProps,
66
+ AiConvAssignAdvisorDialogProps,
67
+ } from "./ui/ai-conversations";
68
+
14
69
  export { AdvisorCard, AdvisorInviteCard } from "./ui/advisor-card";
15
70
  export type {
16
71
  AdvisorCardProps,
@@ -45,6 +100,47 @@ export type {
45
100
  AiTaskSuggestion,
46
101
  } from "./ui/ai-assistant-drawer";
47
102
 
103
+ export {
104
+ ChatWidgetLauncher,
105
+ ChatWidgetHeader,
106
+ ChatWidgetMessage,
107
+ ChatWidgetTypingIndicator,
108
+ ChatWidgetInputBar,
109
+ } from "./ui/chat-widget-primitives";
110
+ export type {
111
+ ChatWidgetLauncherProps,
112
+ ChatWidgetHeaderProps,
113
+ ChatWidgetMessageProps,
114
+ ChatWidgetMessageRole,
115
+ ChatWidgetTypingIndicatorProps,
116
+ ChatWidgetInputBarProps,
117
+ } from "./ui/chat-widget-primitives";
118
+
119
+ export {
120
+ ChatWidget,
121
+ ChatWidgetWindow,
122
+ ChatWidgetIntakeForm,
123
+ ChatWidgetTopicCard,
124
+ ChatWidgetTopicGrid,
125
+ ChatWidgetInteractiveCard,
126
+ DEFAULT_CHAT_WIDGET_TOPICS,
127
+ } from "./ui/chat-widget";
128
+ export type {
129
+ ChatWidgetProps,
130
+ ChatWidgetWindowProps,
131
+ ChatWidgetIntakeFormProps,
132
+ ChatWidgetTopicCardProps,
133
+ ChatWidgetTopicGridProps,
134
+ ChatWidgetInteractiveCardProps,
135
+ ChatWidgetInteractiveCardType,
136
+ ChatWidgetUser,
137
+ ChatWidgetTopic,
138
+ ChatWidgetChatMessage,
139
+ ChatWidgetScreen,
140
+ ChatWidgetQuickReplyOption,
141
+ ChatWidgetAppointmentSlot,
142
+ } from "./ui/chat-widget";
143
+
48
144
  export { Alert, AlertTitle, AlertDescription } from "./ui/alert";
49
145
  export type {
50
146
  AlertProps,
@@ -126,7 +222,6 @@ export { AppointmentGmailConnect } from "./ui/appointment-gmail-connect";
126
222
  export type {
127
223
  AppointmentGmailConnectProps,
128
224
  GmailConnection,
129
- GmailConnectionState,
130
225
  } from "./ui/appointment-gmail-connect";
131
226
 
132
227
  export { AppointmentMiniCard } from "./ui/appointment-mini-card";
@@ -309,6 +404,12 @@ export type {
309
404
  } from "./ui/data-table";
310
405
 
311
406
  export { DatePicker } from "./ui/date-picker";
407
+
408
+ export { DocumentChecklistTemplate } from "./ui/document-checklist-template";
409
+ export type {
410
+ DocumentChecklistTemplateProps,
411
+ ChecklistCategory,
412
+ } from "./ui/document-checklist-template";
312
413
  export type { DatePickerProps } from "./ui/date-picker";
313
414
 
314
415
  export {
@@ -593,6 +694,12 @@ export type { KanbanColumnProps, KanbanColumnStage } from "./ui/kanban-column";
593
694
  export { Label } from "./ui/label";
594
695
  export type { LabelProps } from "./ui/label";
595
696
 
697
+ export { OnboardingLayout } from "./ui/onboarding-layout";
698
+ export type {
699
+ OnboardingStep,
700
+ OnboardingLayoutProps,
701
+ } from "./ui/onboarding-layout";
702
+
596
703
  export { OpportunityCard, LeadCard } from "./ui/opportunity-card";
597
704
  export type {
598
705
  OpportunityCardProps,
@@ -827,6 +934,21 @@ export type {
827
934
  StepItemProps,
828
935
  } from "./ui/stepper";
829
936
 
937
+ export { AuthLogo } from "./ui/auth-logo";
938
+ export type { AuthLogoProps } from "./ui/auth-logo";
939
+
940
+ export { AuthPageLayout } from "./ui/auth-page-layout";
941
+ export type { AuthPageLayoutProps } from "./ui/auth-page-layout";
942
+
943
+ export { PasswordStrengthTooltip } from "./ui/password-strength-tooltip";
944
+ export type { PasswordStrengthTooltipProps } from "./ui/password-strength-tooltip";
945
+
946
+ export { TwoFASetupForm } from "./ui/two-fa-setup-form";
947
+ export type { TwoFASetupFormProps, TwoFAApp } from "./ui/two-fa-setup-form";
948
+
949
+ export { VideoBackground } from "./ui/video-background";
950
+ export type { VideoBackgroundProps } from "./ui/video-background";
951
+
830
952
  export { Switch, SwitchCard } from "./ui/switch";
831
953
  export type { SwitchProps, SwitchCardProps } from "./ui/switch";
832
954
 
@@ -868,6 +990,9 @@ export type {
868
990
  export { Textarea } from "./ui/textarea";
869
991
  export type { TextareaProps } from "./ui/textarea";
870
992
 
993
+ export { UploadCard, uploadCardVariants } from "./ui/upload-card";
994
+ export type { UploadCardProps } from "./ui/upload-card";
995
+
871
996
  export { Toggle, toggleVariants } from "./ui/toggle";
872
997
  export type { ToggleProps } from "./ui/toggle";
873
998
 
@@ -11,21 +11,17 @@ import { Button } from "@/components/ui/button";
11
11
  import { Input } from "@/components/ui/input";
12
12
  import { Checkbox } from "@/components/ui/checkbox";
13
13
  import { Spinner } from "@/components/ui/spinner";
14
+ import {
15
+ Table,
16
+ TableHeader,
17
+ TableHead,
18
+ TableBody,
19
+ TableRow,
20
+ TableCell,
21
+ } from "@/components/ui/table";
22
+ import { TablePagination } from "@/components/ui/pagination";
14
23
  import { cn } from "@/lib/utils";
15
24
 
16
- /**
17
- * AddLeadModal — WealthX DS (L4 Dialog)
18
- *
19
- * Search and select contacts to add as pipeline leads.
20
- * Pagination and search are server-side — the parent controls them.
21
- *
22
- * Data source: `getLeadContactList()` in `loan-crm.ts`
23
- */
24
-
25
- // ---------------------------------------------------------------------------
26
- // Types
27
- // ---------------------------------------------------------------------------
28
-
29
25
  export interface LeadContact {
30
26
  id: string;
31
27
  name: string;
@@ -36,27 +32,29 @@ export interface LeadContact {
36
32
  export interface AddLeadModalProps {
37
33
  open: boolean;
38
34
  onOpenChange: (open: boolean) => void;
39
- /** Contacts for the current page — supplied and paginated by the parent. */
35
+ /** Contacts for the current page — server-side pagination, parent slices. */
40
36
  contacts: LeadContact[];
41
37
  /** Total contacts matching the current search (drives pagination). */
42
38
  total: number;
43
39
  isLoading?: boolean;
44
40
  isSubmitting?: boolean;
45
- /** Controlled search query. */
46
41
  searchValue?: string;
47
42
  onSearchChange?: (value: string) => void;
48
43
  /** 0-indexed current page. */
49
44
  page?: number;
50
45
  pageSize?: number;
46
+ pageSizeOptions?: number[];
51
47
  onPageChange?: (page: number) => void;
52
- /** Called with the selected contact IDs when the user clicks Add. */
48
+ onPageSizeChange?: (pageSize: number) => void;
53
49
  onAdd?: (selectedIds: string[]) => void;
54
50
  className?: string;
55
51
  }
56
52
 
57
- // ---------------------------------------------------------------------------
58
- // Component
59
- // ---------------------------------------------------------------------------
53
+ function toggleInSet<T>(prev: Set<T>, value: T): Set<T> {
54
+ const next = new Set(prev);
55
+ next.has(value) ? next.delete(value) : next.add(value);
56
+ return next;
57
+ }
60
58
 
61
59
  export function AddLeadModal({
62
60
  open,
@@ -69,13 +67,14 @@ export function AddLeadModal({
69
67
  onSearchChange,
70
68
  page = 0,
71
69
  pageSize = 10,
70
+ pageSizeOptions,
72
71
  onPageChange,
72
+ onPageSizeChange,
73
73
  onAdd,
74
74
  className,
75
75
  }: AddLeadModalProps) {
76
76
  const [selectedIds, setSelectedIds] = React.useState<Set<string>>(new Set());
77
77
 
78
- // Reset selection when dialog opens
79
78
  React.useEffect(() => {
80
79
  if (open) setSelectedIds(new Set());
81
80
  }, [open]);
@@ -96,26 +95,15 @@ export function AddLeadModal({
96
95
  });
97
96
  }
98
97
 
99
- function toggleOne(id: string) {
100
- setSelectedIds((prev) => {
101
- const next = new Set(prev);
102
- next.has(id) ? next.delete(id) : next.add(id);
103
- return next;
104
- });
105
- }
106
-
107
98
  const totalPages = Math.max(1, Math.ceil(total / pageSize));
108
- const canPrev = page > 0;
109
- const canNext = page < totalPages - 1;
110
99
 
111
100
  return (
112
101
  <Dialog open={open} onOpenChange={isSubmitting ? undefined : onOpenChange}>
113
- <DialogContent className={cn("sm:max-w-2xl", className)}>
102
+ <DialogContent size="2xl" align="top" className={className}>
114
103
  <DialogHeader>
115
104
  <DialogTitle>Add Lead</DialogTitle>
116
105
  </DialogHeader>
117
106
 
118
- {/* Search */}
119
107
  <div className="relative">
120
108
  <Search className="absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" />
121
109
  <Input
@@ -139,136 +127,107 @@ export function AddLeadModal({
139
127
  )}
140
128
  </div>
141
129
 
142
- {/* Contact table
143
- border-separate + border-spacing-0 + inner <div h-12>: row height is
144
- anchored to the fixed-height div, not td padding+content+border arithmetic,
145
- so selected and unselected rows are always pixel-identical. */}
146
130
  <div className="relative min-h-[200px] overflow-auto border border-border">
147
131
  {isLoading && (
148
132
  <div className="absolute inset-0 z-10 flex items-center justify-center bg-background/60">
149
133
  <Spinner />
150
134
  </div>
151
135
  )}
152
- <table className="w-full border-separate border-spacing-0 text-sm">
153
- <thead className="sticky top-0 bg-muted/50">
154
- <tr>
155
- <th className="w-10 border-b border-border">
156
- <div className="flex h-10 w-full items-center justify-center">
157
- <span onClick={(e) => e.stopPropagation()}>
158
- <Checkbox
159
- checked={
160
- somePageSelected && !allPageSelected
161
- ? "indeterminate"
162
- : allPageSelected
163
- }
164
- onCheckedChange={toggleAll}
165
- aria-label="Select all on page"
166
- disabled={contacts.length === 0 || isSubmitting}
167
- />
168
- </span>
169
- </div>
170
- </th>
171
- {(["Name", "Email", "Phone"] as const).map((col) => (
172
- <th key={col} className="border-b border-border">
173
- <div className="flex h-10 items-center px-3 text-xs font-semibold text-foreground">
174
- {col}
175
- </div>
176
- </th>
177
- ))}
178
- </tr>
179
- </thead>
180
- <tbody>
136
+ <Table>
137
+ <TableHeader>
138
+ <TableRow className="hover:bg-transparent">
139
+ <TableHead className="w-10">
140
+ <span onClick={(e) => e.stopPropagation()}>
141
+ <Checkbox
142
+ checked={
143
+ somePageSelected && !allPageSelected
144
+ ? "indeterminate"
145
+ : allPageSelected
146
+ }
147
+ onCheckedChange={toggleAll}
148
+ aria-label="Select all on page"
149
+ disabled={contacts.length === 0 || isSubmitting}
150
+ />
151
+ </span>
152
+ </TableHead>
153
+ <TableHead>Name</TableHead>
154
+ <TableHead>Email</TableHead>
155
+ <TableHead>Phone</TableHead>
156
+ </TableRow>
157
+ </TableHeader>
158
+ <TableBody>
181
159
  {contacts.length === 0 && !isLoading ? (
182
- <tr>
183
- <td
160
+ <TableRow className="hover:bg-transparent">
161
+ <TableCell
184
162
  colSpan={4}
185
- className="py-10 text-center text-xs text-muted-foreground"
163
+ className="py-10 text-center text-muted-foreground"
186
164
  >
187
165
  No contacts found.
188
- </td>
189
- </tr>
166
+ </TableCell>
167
+ </TableRow>
190
168
  ) : (
191
- contacts.map((contact, idx) => {
169
+ contacts.map((contact) => {
192
170
  const isSelected = selectedIds.has(contact.id);
193
- const tdCls = cn(
194
- idx < contacts.length - 1 && "border-b border-border",
195
- );
196
171
  return (
197
- <tr
172
+ <TableRow
198
173
  key={contact.id}
199
- className={cn(
200
- "cursor-pointer",
201
- isSelected
202
- ? "bg-primary/5 hover:bg-primary/10"
203
- : "hover:bg-muted/30",
204
- )}
205
- onClick={() => !isSubmitting && toggleOne(contact.id)}
174
+ data-state={isSelected ? "selected" : undefined}
175
+ className="cursor-pointer"
176
+ onClick={() =>
177
+ !isSubmitting &&
178
+ setSelectedIds((prev) => toggleInSet(prev, contact.id))
179
+ }
206
180
  >
207
- <td className={tdCls}>
208
- <div className="flex h-12 w-full items-center justify-center">
209
- <span onClick={(e) => e.stopPropagation()}>
210
- <Checkbox
211
- checked={isSelected}
212
- onCheckedChange={() => toggleOne(contact.id)}
213
- disabled={isSubmitting}
214
- />
215
- </span>
216
- </div>
217
- </td>
218
- <td className={tdCls}>
219
- <div className="flex h-12 items-center px-3 font-medium text-foreground">
220
- {contact.name}
221
- </div>
222
- </td>
223
- <td className={tdCls}>
224
- <div className="flex h-12 items-center px-3 text-muted-foreground">
225
- {contact.email ?? "—"}
226
- </div>
227
- </td>
228
- <td className={tdCls}>
229
- <div className="flex h-12 items-center px-3 text-muted-foreground">
230
- {contact.phone ?? "—"}
231
- </div>
232
- </td>
233
- </tr>
181
+ <TableCell className="h-12">
182
+ <span onClick={(e) => e.stopPropagation()}>
183
+ <Checkbox
184
+ checked={isSelected}
185
+ onCheckedChange={() =>
186
+ setSelectedIds((prev) =>
187
+ toggleInSet(prev, contact.id),
188
+ )
189
+ }
190
+ disabled={isSubmitting}
191
+ />
192
+ </span>
193
+ </TableCell>
194
+ <TableCell className="h-12 font-medium text-foreground">
195
+ {contact.name}
196
+ </TableCell>
197
+ <TableCell className="h-12 text-muted-foreground">
198
+ {contact.email ?? "—"}
199
+ </TableCell>
200
+ <TableCell className="h-12 text-muted-foreground">
201
+ {contact.phone ?? "—"}
202
+ </TableCell>
203
+ </TableRow>
234
204
  );
235
205
  })
236
206
  )}
237
- </tbody>
238
- </table>
207
+ </TableBody>
208
+ </Table>
239
209
  </div>
240
210
 
241
- {/* Pagination */}
242
- {totalPages > 1 && (
243
- <div className="flex items-center justify-between text-xs text-muted-foreground">
244
- <span>
245
- {total} contact{total !== 1 ? "s" : ""}
246
- </span>
247
- <div className="flex items-center gap-2">
248
- <Button
249
- variant="outline"
250
- size="sm"
251
- className="h-7 text-xs"
252
- onClick={() => onPageChange?.(page - 1)}
253
- disabled={!canPrev || isLoading || isSubmitting}
254
- >
255
- Prev
256
- </Button>
257
- <span>
258
- {page + 1} / {totalPages}
259
- </span>
260
- <Button
261
- variant="outline"
262
- size="sm"
263
- className="h-7 text-xs"
264
- onClick={() => onPageChange?.(page + 1)}
265
- disabled={!canNext || isLoading || isSubmitting}
266
- >
267
- Next
268
- </Button>
269
- </div>
270
- </div>
271
- )}
211
+ {/* TablePagination is 1-indexed; props are 0-indexed — converted here */}
212
+ <div
213
+ className={cn(
214
+ (isLoading || isSubmitting) && "pointer-events-none opacity-50",
215
+ )}
216
+ >
217
+ <TablePagination
218
+ page={page + 1}
219
+ pageCount={totalPages}
220
+ pageSize={pageSize}
221
+ pageSizeOptions={pageSizeOptions}
222
+ selectedCount={selectedIds.size || undefined}
223
+ totalCount={total}
224
+ onPageChange={(p) => onPageChange?.(p - 1)}
225
+ onPageSizeChange={(size) => {
226
+ onPageSizeChange?.(size);
227
+ onPageChange?.(0);
228
+ }}
229
+ />
230
+ </div>
272
231
 
273
232
  <DialogFooter>
274
233
  <Button