@wealthx/shadcn 1.3.2 → 1.3.4

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 +227 -191
  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-2A5RRQGG.mjs → chunk-5NF6T2RS.mjs} +11 -20
  14. package/dist/{chunk-3OYFOX3X.mjs → chunk-5VOTTIXF.mjs} +2 -2
  15. package/dist/{chunk-LBMRIB3G.mjs → chunk-6AJUS7VX.mjs} +1 -1
  16. package/dist/{chunk-OODBHKG7.mjs → chunk-6HIOM2HL.mjs} +7 -4
  17. package/dist/{chunk-BDYZCBRT.mjs → chunk-6QAFGZC2.mjs} +2 -2
  18. package/dist/{chunk-U4NDAF2P.mjs → chunk-6TX73WG7.mjs} +1 -1
  19. package/dist/{chunk-GD4BJDJR.mjs → chunk-7BTFGCFC.mjs} +4 -4
  20. package/dist/{chunk-FAKPBKLT.mjs → chunk-7GWRPXHD.mjs} +4 -4
  21. package/dist/{chunk-NMOI6CQD.mjs → chunk-7YI3HEBH.mjs} +5 -5
  22. package/dist/{chunk-T4BJLT57.mjs → chunk-AE7MASLF.mjs} +5 -5
  23. package/dist/{chunk-VLQZANBF.mjs → chunk-AFML43VJ.mjs} +6 -1
  24. package/dist/chunk-BBXSNDS3.mjs +260 -0
  25. package/dist/chunk-BOW7U26Y.mjs +203 -0
  26. package/dist/{chunk-34NWQURD.mjs → chunk-BS75ICOO.mjs} +2 -2
  27. package/dist/chunk-D2NSIIXG.mjs +394 -0
  28. package/dist/{chunk-3GF7OVTP.mjs → chunk-DGNHGNYH.mjs} +2 -2
  29. package/dist/{chunk-VLARHE5V.mjs → chunk-DMXYRCHM.mjs} +6 -6
  30. package/dist/{chunk-OGOYQ7BG.mjs → chunk-DQB4EPIS.mjs} +1 -1
  31. package/dist/{chunk-MIZQHHUO.mjs → chunk-FL6DZFJK.mjs} +106 -38
  32. package/dist/{chunk-I3RZS7V2.mjs → chunk-FLL633WS.mjs} +19 -33
  33. package/dist/{chunk-PBL4OQV2.mjs → chunk-FTPBQVQ6.mjs} +4 -4
  34. package/dist/chunk-FYPSTTEJ.mjs +169 -0
  35. package/dist/{chunk-6O6KD7CE.mjs → chunk-G27TSQLQ.mjs} +6 -6
  36. package/dist/{chunk-66MI7Q4B.mjs → chunk-GT3RU6GA.mjs} +2 -2
  37. package/dist/{chunk-D6ID6M4V.mjs → chunk-GTAVSBDO.mjs} +2 -2
  38. package/dist/{chunk-24FUO7TD.mjs → chunk-H6NQTIF4.mjs} +2 -2
  39. package/dist/{chunk-7DHU4VGG.mjs → chunk-HK4HUQTV.mjs} +2 -2
  40. package/dist/chunk-I4KVSZCH.mjs +101 -0
  41. package/dist/{chunk-RGVKLTLH.mjs → chunk-IKXYTCSB.mjs} +2 -2
  42. package/dist/{chunk-Y6DWJSKZ.mjs → chunk-ISUA7DSB.mjs} +1 -1
  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-N6TNTQL6.mjs → chunk-UJZ4UHWI.mjs} +9 -11
  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 +158 -158
  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 +6 -5
  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 +12674 -9311
  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 +11 -20
  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 +1 -11
  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
@@ -0,0 +1,560 @@
1
+ import React, { useState } from "react";
2
+ import {
3
+ Check,
4
+ CheckCircle2,
5
+ Clock,
6
+ Copy,
7
+ Mail,
8
+ MoreHorizontal,
9
+ Settings,
10
+ Shield,
11
+ User,
12
+ } from "lucide-react";
13
+ import { Avatar, AvatarFallback, AvatarImage } from "./avatar";
14
+ import { Badge } from "./badge";
15
+ import { Button } from "./button";
16
+ import { Card, CardContent } from "./card";
17
+ import {
18
+ Dialog,
19
+ DialogContent,
20
+ DialogDescription,
21
+ DialogFooter,
22
+ DialogHeader,
23
+ DialogTitle,
24
+ } from "./dialog";
25
+ import { Switch } from "./switch";
26
+ import { cn } from "../../lib/utils";
27
+
28
+ // ─── Types ────────────────────────────────────────────────────────────────────
29
+
30
+ export type AiBuilderAgentItem = {
31
+ id: string;
32
+ title: string;
33
+ description: string;
34
+ tags: string[];
35
+ isEnabled: boolean;
36
+ slug?: string;
37
+ infoBadge?: string;
38
+ isComingSoon?: boolean;
39
+ };
40
+
41
+ export type AiBuilderServiceType = "email" | "app";
42
+
43
+ export type AiBuilderServiceData = {
44
+ accountIdentifier: string;
45
+ accountIdentifierLabel: string;
46
+ connectedOn: string;
47
+ lastSynced: string;
48
+ permissions: string[];
49
+ syncLabel: string;
50
+ syncDescription: string;
51
+ syncEnabled: boolean;
52
+ onSyncToggle: (enabled: boolean) => void;
53
+ };
54
+
55
+ // ─── AgentCard ────────────────────────────────────────────────────────────────
56
+
57
+ export type AgentCardProps = {
58
+ agent: AiBuilderAgentItem;
59
+ onToggle: (agentId: string, enabled: boolean) => void;
60
+ onMenuClick: (agentId: string) => void;
61
+ className?: string;
62
+ };
63
+
64
+ const AGENT_FEATURES = [
65
+ {
66
+ title: "Lead Capture",
67
+ description:
68
+ "Automatically collect and qualify leads from website visitors.",
69
+ },
70
+ {
71
+ title: "Initial Engagement",
72
+ description:
73
+ "Instantly respond to inquiries with personalised mortgage guidance.",
74
+ },
75
+ {
76
+ title: "Smart Follow-Up",
77
+ description:
78
+ "Re-engage cold leads with timely, context-aware follow-up messages.",
79
+ },
80
+ {
81
+ title: "Appointment Scheduling",
82
+ description:
83
+ "Book qualified leads directly into advisor calendars without manual coordination.",
84
+ },
85
+ {
86
+ title: "Performance Tracking",
87
+ description:
88
+ "Monitor agent activity, response rates, and conversion metrics.",
89
+ },
90
+ ];
91
+
92
+ export function AgentCard({
93
+ agent,
94
+ onToggle,
95
+ onMenuClick,
96
+ className,
97
+ }: AgentCardProps) {
98
+ const { id, title, description, tags, isEnabled, infoBadge, isComingSoon } =
99
+ agent;
100
+
101
+ return (
102
+ <Card
103
+ className={cn(
104
+ "flex flex-col gap-3 p-4 transition-opacity",
105
+ isComingSoon && "opacity-60",
106
+ className,
107
+ )}
108
+ >
109
+ <div className="flex items-start justify-between gap-2">
110
+ <div className="flex flex-1 items-center gap-2 min-w-0">
111
+ <span
112
+ className={cn(
113
+ "mt-0.5 size-2 shrink-0 rounded-full",
114
+ isEnabled && !isComingSoon
115
+ ? "bg-success"
116
+ : "bg-muted-foreground/40",
117
+ )}
118
+ />
119
+ <span className="truncate text-sm font-semibold leading-tight">
120
+ {title}
121
+ </span>
122
+ {isComingSoon && (
123
+ <Badge variant="outline" className="shrink-0 text-xs">
124
+ Coming Soon
125
+ </Badge>
126
+ )}
127
+ </div>
128
+ <div className="flex shrink-0 items-center gap-1">
129
+ <Switch
130
+ checked={isEnabled}
131
+ disabled={isComingSoon}
132
+ onCheckedChange={(checked) => onToggle(id, checked)}
133
+ aria-label={`Toggle ${title}`}
134
+ />
135
+ <Button
136
+ variant="ghost"
137
+ size="icon"
138
+ className="h-7 w-7"
139
+ onClick={() => onMenuClick(id)}
140
+ aria-label={`View details for ${title}`}
141
+ >
142
+ <MoreHorizontal className="h-4 w-4" />
143
+ </Button>
144
+ </div>
145
+ </div>
146
+
147
+ <p className="text-muted-foreground text-xs leading-relaxed flex-1">
148
+ {description}
149
+ </p>
150
+
151
+ <div className="flex flex-col gap-2">
152
+ {infoBadge && (
153
+ <p className="bg-info/10 text-info px-2 py-1 text-xs">
154
+ {infoBadge}
155
+ </p>
156
+ )}
157
+ {tags.length > 0 && (
158
+ <div className="flex flex-wrap gap-1">
159
+ {tags.map((tag) => (
160
+ <Badge key={tag} variant="secondary" className="text-xs">
161
+ {tag}
162
+ </Badge>
163
+ ))}
164
+ </div>
165
+ )}
166
+ </div>
167
+ </Card>
168
+ );
169
+ }
170
+
171
+ // ─── AgentMenuModal ───────────────────────────────────────────────────────────
172
+
173
+ export type AgentMenuModalProps = {
174
+ open: boolean;
175
+ onOpenChange: (open: boolean) => void;
176
+ agentTitle: string;
177
+ description?: string;
178
+ features?: Array<{ title: string; description: string }>;
179
+ };
180
+
181
+ export function AgentMenuModal({
182
+ open,
183
+ onOpenChange,
184
+ agentTitle,
185
+ description = "AI-powered lead management that works around the clock to grow your mortgage business.",
186
+ features = AGENT_FEATURES,
187
+ }: AgentMenuModalProps) {
188
+ return (
189
+ <Dialog open={open} onOpenChange={onOpenChange}>
190
+ <DialogContent className="max-w-lg" align="top">
191
+ <DialogHeader>
192
+ <DialogTitle>{agentTitle}</DialogTitle>
193
+ <DialogDescription>{description}</DialogDescription>
194
+ </DialogHeader>
195
+
196
+ <div className="flex flex-col gap-3 py-2">
197
+ {features.map((feature, index) => (
198
+ <div key={feature.title} className="flex gap-3">
199
+ <Badge
200
+ variant="default"
201
+ className="h-6 w-6 shrink-0 p-0 text-xs font-bold"
202
+ >
203
+ {index + 1}
204
+ </Badge>
205
+ <div className="flex flex-col gap-0.5">
206
+ <p className="text-sm font-semibold">{feature.title}</p>
207
+ <p className="text-muted-foreground text-xs leading-relaxed">
208
+ {feature.description}
209
+ </p>
210
+ </div>
211
+ </div>
212
+ ))}
213
+ </div>
214
+ </DialogContent>
215
+ </Dialog>
216
+ );
217
+ }
218
+
219
+ // ─── IntegrationServiceCard ───────────────────────────────────────────────────
220
+
221
+ export type IntegrationServiceCardProps = {
222
+ title: string;
223
+ imageUrl?: string;
224
+ iconNode?: React.ReactNode;
225
+ description: string;
226
+ isConnected: boolean;
227
+ onCardClick: () => void;
228
+ onSettingsClick: () => void;
229
+ className?: string;
230
+ };
231
+
232
+ export function IntegrationServiceCard({
233
+ title,
234
+ imageUrl,
235
+ iconNode,
236
+ description,
237
+ isConnected,
238
+ onCardClick,
239
+ onSettingsClick,
240
+ className,
241
+ }: IntegrationServiceCardProps) {
242
+ return (
243
+ <Card
244
+ className={cn(
245
+ "flex flex-col gap-3 p-4",
246
+ !isConnected && "cursor-pointer transition-colors hover:bg-accent/50",
247
+ className,
248
+ )}
249
+ onClick={!isConnected ? onCardClick : undefined}
250
+ >
251
+ <div className="flex items-start gap-3">
252
+ <Avatar className="h-10 w-10 shrink-0">
253
+ {imageUrl && <AvatarImage src={imageUrl} alt={title} />}
254
+ <AvatarFallback className={iconNode ? "bg-transparent p-0.5" : ""}>
255
+ {iconNode ?? <User className="h-5 w-5" />}
256
+ </AvatarFallback>
257
+ </Avatar>
258
+
259
+ <div className="flex min-w-0 flex-1 flex-col gap-0.5">
260
+ <div className="flex items-center gap-2">
261
+ <span className="text-base font-semibold">{title}</span>
262
+ {isConnected && (
263
+ <Badge variant="success" className="gap-1 text-xs">
264
+ <CheckCircle2 className="h-3 w-3" />
265
+ Connected
266
+ </Badge>
267
+ )}
268
+ </div>
269
+ </div>
270
+
271
+ {isConnected && (
272
+ <Button
273
+ variant="ghost"
274
+ size="icon"
275
+ className="h-7 w-7 shrink-0"
276
+ onClick={(e) => {
277
+ e.stopPropagation();
278
+ onSettingsClick();
279
+ }}
280
+ aria-label={`Settings for ${title}`}
281
+ >
282
+ <Settings className="h-4 w-4" />
283
+ </Button>
284
+ )}
285
+ </div>
286
+
287
+ <p className="text-sm leading-relaxed text-muted-foreground">
288
+ {description}
289
+ </p>
290
+ </Card>
291
+ );
292
+ }
293
+
294
+ // ─── IntegrationInstructionCard ───────────────────────────────────────────────
295
+
296
+ export type IntegrationInstructionCardProps = {
297
+ title: string;
298
+ codeBlock: string;
299
+ onCopy?: () => void;
300
+ className?: string;
301
+ };
302
+
303
+ export function IntegrationInstructionCard({
304
+ title,
305
+ codeBlock,
306
+ onCopy,
307
+ className,
308
+ }: IntegrationInstructionCardProps) {
309
+ const [copied, setCopied] = useState(false);
310
+
311
+ const handleCopy = async () => {
312
+ try {
313
+ await navigator.clipboard.writeText(codeBlock);
314
+ setCopied(true);
315
+ onCopy?.();
316
+ setTimeout(() => setCopied(false), 2000);
317
+ } catch {
318
+ // clipboard unavailable (non-HTTPS or permissions denied)
319
+ }
320
+ };
321
+
322
+ return (
323
+ <Card className={cn("flex flex-col gap-3 p-4", className)}>
324
+ <div className="flex items-center justify-between gap-2">
325
+ <h3 className="text-sm font-semibold">{title}</h3>
326
+ <Button
327
+ variant="outline"
328
+ size="sm"
329
+ className="h-7 gap-1.5 text-xs"
330
+ onClick={handleCopy}
331
+ >
332
+ {copied ? (
333
+ <>
334
+ <Check className="h-3 w-3" />
335
+ Copied
336
+ </>
337
+ ) : (
338
+ <>
339
+ <Copy className="h-3 w-3" />
340
+ Copy
341
+ </>
342
+ )}
343
+ </Button>
344
+ </div>
345
+ <pre className="bg-muted overflow-x-auto p-3 text-xs leading-relaxed">
346
+ <code>{codeBlock}</code>
347
+ </pre>
348
+ </Card>
349
+ );
350
+ }
351
+
352
+ // ─── ServiceConfigurationModal ────────────────────────────────────────────────
353
+
354
+ export type ServiceConfigurationModalProps = {
355
+ open: boolean;
356
+ onOpenChange: (open: boolean) => void;
357
+ serviceTitle: string;
358
+ isConnected: boolean;
359
+ serviceData?: AiBuilderServiceData;
360
+ /** Brand icon node shown in the not-connected centered layout */
361
+ iconNode?: React.ReactNode;
362
+ /** Permissions shown in the not-connected state */
363
+ connectPermissions?: string[];
364
+ /** Subtitle shown below the service name in the not-connected state */
365
+ connectDescription?: string;
366
+ onConnect: () => void;
367
+ onDisconnect: () => void;
368
+ onReconnect: () => void;
369
+ };
370
+
371
+ export function ServiceConfigurationModal({
372
+ open,
373
+ onOpenChange,
374
+ serviceTitle,
375
+ isConnected,
376
+ serviceData,
377
+ iconNode,
378
+ connectPermissions,
379
+ connectDescription = "Link your account to enable automated workflows with WealthX.",
380
+ onConnect,
381
+ onDisconnect,
382
+ onReconnect,
383
+ }: ServiceConfigurationModalProps) {
384
+ return (
385
+ <Dialog open={open} onOpenChange={onOpenChange}>
386
+ <DialogContent className="max-w-md" align="top">
387
+ {isConnected ? (
388
+ <>
389
+ <DialogHeader>
390
+ <DialogTitle>{serviceTitle}</DialogTitle>
391
+ <DialogDescription>
392
+ Manage your integration settings.
393
+ </DialogDescription>
394
+ </DialogHeader>
395
+
396
+ <div className="flex flex-col gap-4 py-2">
397
+ <div className="flex items-center gap-2 px-3 py-2 text-xs font-medium bg-success/10 text-success">
398
+ <CheckCircle2 className="h-3.5 w-3.5 shrink-0" />
399
+ Active — integration is running
400
+ </div>
401
+
402
+ {serviceData && (
403
+ <>
404
+ <div className="flex flex-col gap-2">
405
+ <p className="text-muted-foreground text-xs font-medium uppercase tracking-wide">
406
+ Account Information
407
+ </p>
408
+ <Card className="py-0">
409
+ <CardContent className="flex flex-col gap-3 p-3">
410
+ <div className="flex items-center gap-2 text-xs">
411
+ <User className="text-muted-foreground h-3.5 w-3.5 shrink-0" />
412
+ <span className="text-muted-foreground">
413
+ {serviceData.accountIdentifierLabel}:
414
+ </span>
415
+ <span className="font-medium">
416
+ {serviceData.accountIdentifier}
417
+ </span>
418
+ </div>
419
+ <div className="flex items-center gap-2 text-xs">
420
+ <Clock className="text-muted-foreground h-3.5 w-3.5 shrink-0" />
421
+ <span className="text-muted-foreground">
422
+ Connected on:
423
+ </span>
424
+ <span className="font-medium">
425
+ {serviceData.connectedOn}
426
+ </span>
427
+ </div>
428
+ <div className="flex items-center gap-2 text-xs">
429
+ <Clock className="text-muted-foreground h-3.5 w-3.5 shrink-0" />
430
+ <span className="text-muted-foreground">
431
+ Last synced:
432
+ </span>
433
+ <span className="font-medium">
434
+ {serviceData.lastSynced}
435
+ </span>
436
+ </div>
437
+ </CardContent>
438
+ </Card>
439
+ </div>
440
+
441
+ <div className="flex flex-col gap-2">
442
+ <p className="text-muted-foreground text-xs font-medium uppercase tracking-wide">
443
+ Granted Permissions
444
+ </p>
445
+ <Card className="py-0">
446
+ <CardContent className="flex flex-col gap-2 p-3">
447
+ {serviceData.permissions.map((permission) => (
448
+ <div
449
+ key={permission}
450
+ className="flex items-center gap-2 text-xs"
451
+ >
452
+ <Shield className="text-success h-3.5 w-3.5 shrink-0" />
453
+ <span>{permission}</span>
454
+ </div>
455
+ ))}
456
+ </CardContent>
457
+ </Card>
458
+ </div>
459
+
460
+ <div className="flex flex-col gap-2">
461
+ <p className="text-muted-foreground text-xs font-medium uppercase tracking-wide">
462
+ Sync Settings
463
+ </p>
464
+ <Card className="py-0">
465
+ <CardContent className="flex items-center justify-between gap-3 p-3">
466
+ <div className="flex flex-col gap-0.5">
467
+ <p className="text-sm font-medium">
468
+ {serviceData.syncLabel}
469
+ </p>
470
+ <p className="text-muted-foreground text-xs">
471
+ {serviceData.syncDescription}
472
+ </p>
473
+ </div>
474
+ <Switch
475
+ checked={serviceData.syncEnabled}
476
+ onCheckedChange={serviceData.onSyncToggle}
477
+ aria-label={serviceData.syncLabel}
478
+ />
479
+ </CardContent>
480
+ </Card>
481
+ </div>
482
+ </>
483
+ )}
484
+ </div>
485
+
486
+ <DialogFooter>
487
+ <Button
488
+ variant="destructive"
489
+ size="sm"
490
+ onClick={onDisconnect}
491
+ className="mr-auto"
492
+ >
493
+ Disconnect
494
+ </Button>
495
+ <Button
496
+ variant="outline-secondary"
497
+ size="sm"
498
+ onClick={() => onOpenChange(false)}
499
+ >
500
+ Cancel
501
+ </Button>
502
+ <Button size="sm" onClick={onReconnect}>
503
+ Reconnect
504
+ </Button>
505
+ </DialogFooter>
506
+ </>
507
+ ) : (
508
+ <>
509
+ <div className="flex flex-col gap-4 py-2">
510
+ <div className="flex items-center gap-3">
511
+ <div className="flex h-10 w-10 shrink-0 items-center justify-center bg-muted">
512
+ {iconNode ?? (
513
+ <Mail className="h-5 w-5 text-muted-foreground" />
514
+ )}
515
+ </div>
516
+ <div className="flex flex-col gap-0.5">
517
+ <p className="text-sm font-semibold">
518
+ Connect {serviceTitle}
519
+ </p>
520
+ <p className="text-muted-foreground text-xs">
521
+ {connectDescription}
522
+ </p>
523
+ </div>
524
+ </div>
525
+
526
+ {connectPermissions && connectPermissions.length > 0 && (
527
+ <div className="flex flex-col gap-2 border border-border px-4 py-3">
528
+ <p className="text-xs font-medium text-muted-foreground uppercase tracking-wide">
529
+ Permissions requested
530
+ </p>
531
+ {connectPermissions.map((perm) => (
532
+ <div key={perm} className="flex items-center gap-2">
533
+ <Check className="h-3.5 w-3.5 shrink-0 text-success" />
534
+ <span className="text-sm text-muted-foreground">
535
+ {perm}
536
+ </span>
537
+ </div>
538
+ ))}
539
+ </div>
540
+ )}
541
+ </div>
542
+
543
+ <DialogFooter>
544
+ <Button
545
+ variant="outline-secondary"
546
+ size="sm"
547
+ onClick={() => onOpenChange(false)}
548
+ >
549
+ Cancel
550
+ </Button>
551
+ <Button size="sm" onClick={onConnect}>
552
+ Connect
553
+ </Button>
554
+ </DialogFooter>
555
+ </>
556
+ )}
557
+ </DialogContent>
558
+ </Dialog>
559
+ );
560
+ }