@wealthx/shadcn 1.4.1 → 1.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 (430) hide show
  1. package/.turbo/turbo-build.log +360 -180
  2. package/CHANGELOG.md +6 -0
  3. package/dist/chunk-2A53WPEC.mjs +182 -0
  4. package/dist/{chunk-SIVYAI3M.mjs → chunk-2LLFNGJZ.mjs} +15 -15
  5. package/dist/chunk-2QNOPXMQ.mjs +360 -0
  6. package/dist/{chunk-K5QV4TT6.mjs → chunk-2WCIORP7.mjs} +29 -4
  7. package/dist/{chunk-5NF6T2RS.mjs → chunk-3AREQTZU.mjs} +8 -8
  8. package/dist/{chunk-2EM2FRU6.mjs → chunk-3WGFIFP6.mjs} +5 -5
  9. package/dist/{chunk-K4KOD3KR.mjs → chunk-42NEC57Y.mjs} +44 -25
  10. package/dist/{chunk-FL6DZFJK.mjs → chunk-46Q4335I.mjs} +121 -39
  11. package/dist/chunk-4DO3WM7V.mjs +48 -0
  12. package/dist/chunk-5FHBC6DY.mjs +68 -0
  13. package/dist/chunk-5SAYZ4CI.mjs +40 -0
  14. package/dist/chunk-5WMFKQZ6.mjs +180 -0
  15. package/dist/chunk-623YVI5O.mjs +43 -0
  16. package/dist/{chunk-SFH2NJEJ.mjs → chunk-6OSULDEO.mjs} +3 -3
  17. package/dist/{chunk-UALR6JGV.mjs → chunk-6SR4K5T5.mjs} +1 -1
  18. package/dist/{chunk-D2NSIIXG.mjs → chunk-7KT5HPYM.mjs} +11 -11
  19. package/dist/chunk-A6ER36CW.mjs +456 -0
  20. package/dist/{chunk-QX7IFQSF.mjs → chunk-AHKHVBWR.mjs} +4 -4
  21. package/dist/chunk-AHSCWXYJ.mjs +113 -0
  22. package/dist/{chunk-7GWRPXHD.mjs → chunk-AL6GOL2Y.mjs} +1 -1
  23. package/dist/{chunk-OIKBW2QD.mjs → chunk-AUEUTZIC.mjs} +13 -13
  24. package/dist/{chunk-FYPSTTEJ.mjs → chunk-B7DD3ODQ.mjs} +1 -1
  25. package/dist/{chunk-TLAWKTSA.mjs → chunk-BD3DWDT4.mjs} +3 -3
  26. package/dist/{chunk-S2FKV4M5.mjs → chunk-BDESHD25.mjs} +4 -4
  27. package/dist/{chunk-OKTJFDPN.mjs → chunk-BFB3UH7V.mjs} +2 -2
  28. package/dist/{chunk-DGNHGNYH.mjs → chunk-C6SWS7OW.mjs} +1 -1
  29. package/dist/chunk-CDVG7SFT.mjs +271 -0
  30. package/dist/chunk-CUSHAIUL.mjs +109 -0
  31. package/dist/{chunk-QXKGOMUX.mjs → chunk-CW32WTZU.mjs} +4 -4
  32. package/dist/{chunk-SET2ANTY.mjs → chunk-D447W45Z.mjs} +3 -3
  33. package/dist/{chunk-RCAOCHWA.mjs → chunk-DFL5CV75.mjs} +18 -18
  34. package/dist/chunk-DYSVJ473.mjs +162 -0
  35. package/dist/chunk-E3PQDBYI.mjs +288 -0
  36. package/dist/chunk-EMYBNPIA.mjs +83 -0
  37. package/dist/chunk-EUYPMDQG.mjs +348 -0
  38. package/dist/{chunk-XYPW2XA5.mjs → chunk-EW72FINW.mjs} +11 -11
  39. package/dist/chunk-F24U4QQQ.mjs +234 -0
  40. package/dist/{chunk-VB5M6OZQ.mjs → chunk-F4O2YPXJ.mjs} +1 -1
  41. package/dist/chunk-FFXTQTB4.mjs +84 -0
  42. package/dist/{chunk-ZOWL2L5J.mjs → chunk-FYUSF5KO.mjs} +5 -1
  43. package/dist/{chunk-FTPBQVQ6.mjs → chunk-GNER6MCO.mjs} +1 -1
  44. package/dist/{chunk-2D3HQPFN.mjs → chunk-HF4FUBCY.mjs} +5 -5
  45. package/dist/{chunk-RSUIPKGX.mjs → chunk-HNDTLT5X.mjs} +1 -1
  46. package/dist/{chunk-N6Q5IPKT.mjs → chunk-HO6S3ECM.mjs} +46 -18
  47. package/dist/{chunk-L4NSRQ3T.mjs → chunk-HROG643K.mjs} +1 -1
  48. package/dist/chunk-I2EKKSEF.mjs +148 -0
  49. package/dist/{chunk-QTRSCVQ3.mjs → chunk-I3UDLWQ7.mjs} +1 -1
  50. package/dist/{chunk-AE7MASLF.mjs → chunk-IQGKOT7A.mjs} +9 -6
  51. package/dist/chunk-IXR4BQSQ.mjs +290 -0
  52. package/dist/{chunk-4MM7LHM5.mjs → chunk-J5NW5NCT.mjs} +1 -1
  53. package/dist/{chunk-OLKMCXAR.mjs → chunk-JTG5R5YV.mjs} +24 -24
  54. package/dist/chunk-JUBUN65Q.mjs +106 -0
  55. package/dist/chunk-K7TWMLLW.mjs +520 -0
  56. package/dist/{chunk-BOW7U26Y.mjs → chunk-K7WSRWOU.mjs} +4 -4
  57. package/dist/{chunk-NTYQWVLI.mjs → chunk-KAD26MCC.mjs} +1 -1
  58. package/dist/{chunk-KCWNDYPZ.mjs → chunk-KB7MZMED.mjs} +4 -4
  59. package/dist/chunk-KCKYGQVQ.mjs +61 -0
  60. package/dist/{chunk-VY5NEUP7.mjs → chunk-KLJLDNCA.mjs} +1 -1
  61. package/dist/chunk-LLAGF6BA.mjs +49 -0
  62. package/dist/{chunk-G27TSQLQ.mjs → chunk-M4LTX3MH.mjs} +1 -1
  63. package/dist/{chunk-YIZHS72Z.mjs → chunk-MHHA7QGO.mjs} +94 -54
  64. package/dist/{chunk-P2N2PEFY.mjs → chunk-NCUH54IZ.mjs} +4 -4
  65. package/dist/{chunk-PNRUH7JY.mjs → chunk-OECGKCVF.mjs} +5 -5
  66. package/dist/{chunk-YE67AALL.mjs → chunk-OL65UQHQ.mjs} +10 -10
  67. package/dist/{chunk-LQULK2E3.mjs → chunk-OYBIUEGE.mjs} +1 -1
  68. package/dist/{chunk-LR6LHDP3.mjs → chunk-PGR53HMH.mjs} +7 -7
  69. package/dist/chunk-PUJ42INK.mjs +141 -0
  70. package/dist/{chunk-M4VYX2PV.mjs → chunk-PV3Y7QGK.mjs} +2 -2
  71. package/dist/{chunk-UJZ4UHWI.mjs → chunk-PV7PNA6K.mjs} +4 -4
  72. package/dist/{chunk-6HIOM2HL.mjs → chunk-Q35PNFJ7.mjs} +1 -1
  73. package/dist/{chunk-JZY6TNIS.mjs → chunk-Q5SGEIJV.mjs} +27 -27
  74. package/dist/{chunk-ZFCDYW6N.mjs → chunk-QAX6HCUH.mjs} +1 -1
  75. package/dist/chunk-QHJDGB54.mjs +135 -0
  76. package/dist/chunk-QQSOZQOC.mjs +27 -0
  77. package/dist/chunk-RUX3OLVZ.mjs +59 -0
  78. package/dist/{chunk-QOJ2DQD6.mjs → chunk-S4CTM3UE.mjs} +5 -0
  79. package/dist/{chunk-ZEDMKQK2.mjs → chunk-TAX3KL66.mjs} +1 -1
  80. package/dist/chunk-TC43SMIN.mjs +133 -0
  81. package/dist/chunk-TGVXRD53.mjs +174 -0
  82. package/dist/{chunk-K5VHK7CM.mjs → chunk-TLYSVRSK.mjs} +12 -12
  83. package/dist/{chunk-YCWLFG27.mjs → chunk-TOIVHWNC.mjs} +1 -1
  84. package/dist/chunk-TXUBGKB7.mjs +160 -0
  85. package/dist/chunk-UEREFDAE.mjs +75 -0
  86. package/dist/chunk-UTCQN6XU.mjs +123 -0
  87. package/dist/{chunk-37AE3OM5.mjs → chunk-V4CUTCHS.mjs} +4 -4
  88. package/dist/{chunk-THVO2N47.mjs → chunk-VFH632TB.mjs} +9 -9
  89. package/dist/{chunk-3ERBUVHC.mjs → chunk-VJ3GC7W3.mjs} +95 -49
  90. package/dist/{chunk-V6XGXYCJ.mjs → chunk-VLELWBEW.mjs} +4 -4
  91. package/dist/{chunk-FEZKMUCF.mjs → chunk-WDTXHLYM.mjs} +1 -1
  92. package/dist/chunk-WUA546RX.mjs +129 -0
  93. package/dist/chunk-XHGISOX5.mjs +257 -0
  94. package/dist/chunk-XIY5DJXI.mjs +168 -0
  95. package/dist/{chunk-TOWTPLRC.mjs → chunk-XN37434W.mjs} +8 -8
  96. package/dist/{chunk-KLTACJ2G.mjs → chunk-XTWAJWCQ.mjs} +1 -1
  97. package/dist/chunk-Y24TXIFJ.mjs +518 -0
  98. package/dist/{chunk-DMXYRCHM.mjs → chunk-Y6UM3VTN.mjs} +4 -4
  99. package/dist/components/ui/about-you-form.js +1120 -0
  100. package/dist/components/ui/about-you-form.mjs +323 -0
  101. package/dist/components/ui/account-list-carousel.js +304 -0
  102. package/dist/components/ui/account-list-carousel.mjs +11 -0
  103. package/dist/components/ui/add-column-modal.js +1 -1
  104. package/dist/components/ui/add-column-modal.mjs +6 -6
  105. package/dist/components/ui/add-lead-modal.js +2 -2
  106. package/dist/components/ui/add-lead-modal.mjs +6 -6
  107. package/dist/components/ui/advisor-card.mjs +2 -2
  108. package/dist/components/ui/agent-evaluation-toast.js +299 -0
  109. package/dist/components/ui/agent-evaluation-toast.mjs +12 -0
  110. package/dist/components/ui/ai-assistant-drawer.mjs +5 -5
  111. package/dist/components/ui/ai-builder.js +3 -3
  112. package/dist/components/ui/ai-builder.mjs +5 -5
  113. package/dist/components/ui/ai-conversations.js +2 -2
  114. package/dist/components/ui/ai-conversations.mjs +11 -11
  115. package/dist/components/ui/alert-dialog.mjs +3 -3
  116. package/dist/components/ui/applicant-document-checklist.js +346 -0
  117. package/dist/components/ui/applicant-document-checklist.mjs +10 -0
  118. package/dist/components/ui/applicant-expenses-section.js +455 -0
  119. package/dist/components/ui/applicant-expenses-section.mjs +220 -0
  120. package/dist/components/ui/applicant-navigation-bar.js +309 -0
  121. package/dist/components/ui/applicant-navigation-bar.mjs +87 -0
  122. package/dist/components/ui/applicant-switcher.js +268 -0
  123. package/dist/components/ui/applicant-switcher.mjs +46 -0
  124. package/dist/components/ui/application-mobile-layout.js +88 -0
  125. package/dist/components/ui/application-mobile-layout.mjs +8 -0
  126. package/dist/components/ui/appointment-action-dialogs.js +1 -1
  127. package/dist/components/ui/appointment-action-dialogs.mjs +10 -10
  128. package/dist/components/ui/appointment-availability-settings.js +78 -31
  129. package/dist/components/ui/appointment-availability-settings.mjs +12 -10
  130. package/dist/components/ui/appointment-book-dialog.js +137 -58
  131. package/dist/components/ui/appointment-book-dialog.mjs +14 -14
  132. package/dist/components/ui/appointment-calendar-view.js +1 -1
  133. package/dist/components/ui/appointment-calendar-view.mjs +4 -4
  134. package/dist/components/ui/appointment-detail-sheet.js +38 -11
  135. package/dist/components/ui/appointment-detail-sheet.mjs +13 -13
  136. package/dist/components/ui/appointment-gmail-connect.mjs +2 -2
  137. package/dist/components/ui/appointment-time-slot-picker.mjs +2 -2
  138. package/dist/components/ui/appointment-upcoming-card.js +1 -1
  139. package/dist/components/ui/appointment-upcoming-card.mjs +10 -10
  140. package/dist/components/ui/asset-accordion.js +506 -0
  141. package/dist/components/ui/asset-accordion.mjs +202 -0
  142. package/dist/components/ui/assets-liabilities-side-card.js +328 -0
  143. package/dist/components/ui/assets-liabilities-side-card.mjs +127 -0
  144. package/dist/components/ui/auth-page-layout.js +3 -3
  145. package/dist/components/ui/auth-page-layout.mjs +1 -1
  146. package/dist/components/ui/backoffice-alert-history-chart.mjs +4 -4
  147. package/dist/components/ui/backoffice-alert-matching-chart.js +786 -0
  148. package/dist/components/ui/backoffice-alert-matching-chart.mjs +19 -0
  149. package/dist/components/ui/backoffice-alerts-chart.mjs +4 -4
  150. package/dist/components/ui/backoffice-connections-chart.mjs +4 -4
  151. package/dist/components/ui/backoffice-contact-history-chart.mjs +4 -4
  152. package/dist/components/ui/backoffice-contact-matching-chart.js +803 -0
  153. package/dist/components/ui/backoffice-contact-matching-chart.mjs +19 -0
  154. package/dist/components/ui/backoffice-signup-steps.js +1673 -0
  155. package/dist/components/ui/backoffice-signup-steps.mjs +36 -0
  156. package/dist/components/ui/bank-statement-document-table.js +467 -0
  157. package/dist/components/ui/bank-statement-document-table.mjs +12 -0
  158. package/dist/components/ui/bank-statement-generate-dialog.js +1517 -0
  159. package/dist/components/ui/bank-statement-generate-dialog.mjs +27 -0
  160. package/dist/components/ui/bank-statement-pdf-viewer.js +525 -0
  161. package/dist/components/ui/bank-statement-pdf-viewer.mjs +14 -0
  162. package/dist/components/ui/banking-accounts-connect.js +336 -0
  163. package/dist/components/ui/banking-accounts-connect.mjs +114 -0
  164. package/dist/components/ui/borrowing-capacity-atoms.js +382 -0
  165. package/dist/components/ui/borrowing-capacity-atoms.mjs +17 -0
  166. package/dist/components/ui/borrowing-capacity-card.js +835 -0
  167. package/dist/components/ui/borrowing-capacity-card.mjs +89 -0
  168. package/dist/components/ui/borrowing-capacity-line-chart.mjs +4 -4
  169. package/dist/components/ui/broker-info-panel.js +281 -0
  170. package/dist/components/ui/broker-info-panel.mjs +59 -0
  171. package/dist/components/ui/calculator-input-item.js +101 -0
  172. package/dist/components/ui/calculator-input-item.mjs +8 -0
  173. package/dist/components/ui/calculator-section.js +743 -0
  174. package/dist/components/ui/calculator-section.mjs +220 -0
  175. package/dist/components/ui/calendar.mjs +2 -2
  176. package/dist/components/ui/cash-balance-line-chart.mjs +5 -5
  177. package/dist/components/ui/cashflow-bar-chart.mjs +4 -4
  178. package/dist/components/ui/category-edit-dialog.js +737 -0
  179. package/dist/components/ui/category-edit-dialog.mjs +16 -0
  180. package/dist/components/ui/chat-widget.mjs +3 -3
  181. package/dist/components/ui/color-picker.mjs +4 -4
  182. package/dist/components/ui/connect-bank-step.js +511 -0
  183. package/dist/components/ui/connect-bank-step.mjs +287 -0
  184. package/dist/components/ui/contact-alert-dialog.js +1405 -0
  185. package/dist/components/ui/contact-alert-dialog.mjs +27 -0
  186. package/dist/components/ui/create-contact-modal.js +1028 -0
  187. package/dist/components/ui/create-contact-modal.mjs +21 -0
  188. package/dist/components/ui/csv-import-modal.js +583 -0
  189. package/dist/components/ui/csv-import-modal.mjs +14 -0
  190. package/dist/components/ui/currency-input.js +439 -0
  191. package/dist/components/ui/currency-input.mjs +13 -0
  192. package/dist/components/ui/dashboard-expense-categories.js +355 -0
  193. package/dist/components/ui/dashboard-expense-categories.mjs +186 -0
  194. package/dist/components/ui/dashboard-transactions-table.js +1083 -0
  195. package/dist/components/ui/dashboard-transactions-table.mjs +177 -0
  196. package/dist/components/ui/data-table.mjs +6 -6
  197. package/dist/components/ui/date-picker.mjs +6 -6
  198. package/dist/components/ui/debt-accordion.js +523 -0
  199. package/dist/components/ui/debt-accordion.mjs +219 -0
  200. package/dist/components/ui/delete-contact-component.js +479 -0
  201. package/dist/components/ui/delete-contact-component.mjs +14 -0
  202. package/dist/components/ui/dialog.js +1 -1
  203. package/dist/components/ui/dialog.mjs +3 -3
  204. package/dist/components/ui/document-checklist-template.mjs +4 -4
  205. package/dist/components/ui/drawer.mjs +3 -3
  206. package/dist/components/ui/dropdown-menu.mjs +3 -3
  207. package/dist/components/ui/dynamic-tabs.js +274 -0
  208. package/dist/components/ui/dynamic-tabs.mjs +116 -0
  209. package/dist/components/ui/editable-money-item.js +306 -0
  210. package/dist/components/ui/editable-money-item.mjs +12 -0
  211. package/dist/components/ui/expense-bar-chart.mjs +4 -4
  212. package/dist/components/ui/expense-detail-item.js +506 -0
  213. package/dist/components/ui/expense-detail-item.mjs +15 -0
  214. package/dist/components/ui/expense-work-details.js +1259 -0
  215. package/dist/components/ui/expense-work-details.mjs +175 -0
  216. package/dist/components/ui/field.mjs +2 -2
  217. package/dist/components/ui/file-preview-dialog.js +704 -0
  218. package/dist/components/ui/file-preview-dialog.mjs +17 -0
  219. package/dist/components/ui/financial-cards.mjs +2 -2
  220. package/dist/components/ui/financial-drawers.js +1 -1
  221. package/dist/components/ui/financial-drawers.mjs +5 -5
  222. package/dist/components/ui/financial-sections.mjs +4 -4
  223. package/dist/components/ui/form-primitives.mjs +2 -2
  224. package/dist/components/ui/frontend-signup-steps.js +1239 -0
  225. package/dist/components/ui/frontend-signup-steps.mjs +38 -0
  226. package/dist/components/ui/income-bar-chart.mjs +4 -4
  227. package/dist/components/ui/income-sources-card.js +269 -0
  228. package/dist/components/ui/income-sources-card.mjs +100 -0
  229. package/dist/components/ui/income-summary-component.js +361 -0
  230. package/dist/components/ui/income-summary-component.mjs +84 -0
  231. package/dist/components/ui/income-work-details.js +1663 -0
  232. package/dist/components/ui/income-work-details.mjs +28 -0
  233. package/dist/components/ui/incoming-outgoings-card.js +218 -0
  234. package/dist/components/ui/incoming-outgoings-card.mjs +82 -0
  235. package/dist/components/ui/interest-rate-input.js +442 -0
  236. package/dist/components/ui/interest-rate-input.mjs +90 -0
  237. package/dist/components/ui/interest-rate-section.js +337 -0
  238. package/dist/components/ui/interest-rate-section.mjs +84 -0
  239. package/dist/components/ui/interest-rate-used.js +202 -0
  240. package/dist/components/ui/interest-rate-used.mjs +62 -0
  241. package/dist/components/ui/kanban-column.js +338 -160
  242. package/dist/components/ui/kanban-column.mjs +13 -11
  243. package/dist/components/ui/loan-applicant-information.js +336 -0
  244. package/dist/components/ui/loan-applicant-information.mjs +59 -0
  245. package/dist/components/ui/loan-applicant-invite.js +319 -0
  246. package/dist/components/ui/loan-applicant-invite.mjs +68 -0
  247. package/dist/components/ui/loan-application-badge.js +236 -0
  248. package/dist/components/ui/loan-application-badge.mjs +10 -0
  249. package/dist/components/ui/loan-application-cards.js +356 -0
  250. package/dist/components/ui/loan-application-cards.mjs +110 -0
  251. package/dist/components/ui/loan-entry-shell.js +104 -0
  252. package/dist/components/ui/loan-entry-shell.mjs +8 -0
  253. package/dist/components/ui/loan-financials.js +410 -0
  254. package/dist/components/ui/loan-financials.mjs +76 -0
  255. package/dist/components/ui/loan-option-card.js +102 -0
  256. package/dist/components/ui/loan-option-card.mjs +41 -0
  257. package/dist/components/ui/loan-option-group.js +288 -0
  258. package/dist/components/ui/loan-option-group.mjs +10 -0
  259. package/dist/components/ui/loan-steps.js +1121 -0
  260. package/dist/components/ui/loan-steps.mjs +509 -0
  261. package/dist/components/ui/loan-wizard-shell.js +452 -0
  262. package/dist/components/ui/loan-wizard-shell.mjs +11 -0
  263. package/dist/components/ui/money-input-with-slider.js +210 -0
  264. package/dist/components/ui/money-input-with-slider.mjs +10 -0
  265. package/dist/components/ui/money-item-with-color-indicator.js +314 -0
  266. package/dist/components/ui/money-item-with-color-indicator.mjs +20 -0
  267. package/dist/components/ui/opportunity-card.js +235 -97
  268. package/dist/components/ui/opportunity-card.mjs +11 -9
  269. package/dist/components/ui/opportunity-edit-modals.js +1 -1
  270. package/dist/components/ui/opportunity-edit-modals.mjs +15 -15
  271. package/dist/components/ui/opportunity-summary-tab.js +1 -1
  272. package/dist/components/ui/opportunity-summary-tab.mjs +19 -19
  273. package/dist/components/ui/pagination.mjs +4 -4
  274. package/dist/components/ui/password-strength-tooltip.mjs +4 -4
  275. package/dist/components/ui/pipeline-board.js +358 -176
  276. package/dist/components/ui/pipeline-board.mjs +16 -14
  277. package/dist/components/ui/pipeline-chart.mjs +3 -3
  278. package/dist/components/ui/pipeline-dialogs.js +1 -1
  279. package/dist/components/ui/pipeline-dialogs.mjs +9 -9
  280. package/dist/components/ui/pipeline-primitives.js +75 -8
  281. package/dist/components/ui/pipeline-primitives.mjs +3 -2
  282. package/dist/components/ui/popover.mjs +3 -3
  283. package/dist/components/ui/property-asset-card.js +428 -0
  284. package/dist/components/ui/property-asset-card.mjs +156 -0
  285. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +4 -4
  286. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +4 -4
  287. package/dist/components/ui/property-list-carousel.js +295 -0
  288. package/dist/components/ui/property-list-carousel.mjs +11 -0
  289. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +4 -4
  290. package/dist/components/ui/property-report-dialog.js +1148 -0
  291. package/dist/components/ui/property-report-dialog.mjs +25 -0
  292. package/dist/components/ui/resource-center.js +748 -0
  293. package/dist/components/ui/resource-center.mjs +24 -0
  294. package/dist/components/ui/review-alerts-dialog.js +569 -0
  295. package/dist/components/ui/review-alerts-dialog.mjs +15 -0
  296. package/dist/components/ui/savings-goal-modal.js +1148 -0
  297. package/dist/components/ui/savings-goal-modal.mjs +160 -0
  298. package/dist/components/ui/scenario-drawer.js +791 -0
  299. package/dist/components/ui/scenario-drawer.mjs +294 -0
  300. package/dist/components/ui/scenario-item.js +256 -0
  301. package/dist/components/ui/scenario-item.mjs +11 -0
  302. package/dist/components/ui/scenario-list.js +507 -0
  303. package/dist/components/ui/scenario-list.mjs +100 -0
  304. package/dist/components/ui/select.mjs +3 -3
  305. package/dist/components/ui/share-details-dialog.js +636 -0
  306. package/dist/components/ui/share-details-dialog.mjs +19 -0
  307. package/dist/components/ui/sheet.mjs +3 -3
  308. package/dist/components/ui/sidebar-nav.mjs +5 -5
  309. package/dist/components/ui/signup-form-primitives.js +770 -0
  310. package/dist/components/ui/signup-form-primitives.mjs +25 -0
  311. package/dist/components/ui/signup-shell.js +338 -0
  312. package/dist/components/ui/signup-shell.mjs +13 -0
  313. package/dist/components/ui/stage-timeline.js +103 -33
  314. package/dist/components/ui/stage-timeline.mjs +5 -4
  315. package/dist/components/ui/submission-confirmation-card.js +284 -0
  316. package/dist/components/ui/submission-confirmation-card.mjs +62 -0
  317. package/dist/components/ui/tooltip.mjs +3 -3
  318. package/dist/components/ui/top-three-product.js +374 -0
  319. package/dist/components/ui/top-three-product.mjs +129 -0
  320. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +4 -4
  321. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -5
  322. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +4 -4
  323. package/dist/components/ui/transactions-summary-block.js +95 -0
  324. package/dist/components/ui/transactions-summary-block.mjs +34 -0
  325. package/dist/components/ui/two-fa-setup-form.mjs +3 -3
  326. package/dist/index.js +9430 -4573
  327. package/dist/index.mjs +404 -251
  328. package/dist/lib/colors.js +6 -0
  329. package/dist/lib/colors.mjs +3 -1
  330. package/dist/lib/theme-provider.mjs +2 -2
  331. package/dist/styles.css +1 -1
  332. package/package.json +366 -2
  333. package/src/components/index.tsx +223 -0
  334. package/src/components/ui/about-you-form.tsx +397 -0
  335. package/src/components/ui/account-list-carousel.tsx +87 -0
  336. package/src/components/ui/add-lead-modal.tsx +1 -1
  337. package/src/components/ui/agent-evaluation-toast.tsx +191 -0
  338. package/src/components/ui/ai-builder.tsx +3 -5
  339. package/src/components/ui/ai-conversations.tsx +1 -1
  340. package/src/components/ui/applicant-document-checklist.tsx +175 -0
  341. package/src/components/ui/applicant-expenses-section.tsx +260 -0
  342. package/src/components/ui/applicant-navigation-bar.tsx +104 -0
  343. package/src/components/ui/applicant-switcher.tsx +54 -0
  344. package/src/components/ui/application-mobile-layout.tsx +34 -0
  345. package/src/components/ui/appointment-availability-settings.tsx +115 -23
  346. package/src/components/ui/appointment-book-dialog.tsx +406 -259
  347. package/src/components/ui/appointment-calendar-view.tsx +4 -1
  348. package/src/components/ui/appointment-detail-sheet.tsx +59 -24
  349. package/src/components/ui/appointment-time-slot-picker.tsx +5 -1
  350. package/src/components/ui/asset-accordion.tsx +241 -0
  351. package/src/components/ui/assets-liabilities-side-card.tsx +157 -0
  352. package/src/components/ui/auth-page-layout.tsx +3 -3
  353. package/src/components/ui/backoffice-alert-matching-chart.tsx +320 -0
  354. package/src/components/ui/backoffice-contact-matching-chart.tsx +341 -0
  355. package/src/components/ui/backoffice-signup-steps.tsx +615 -0
  356. package/src/components/ui/bank-statement-document-table.tsx +222 -0
  357. package/src/components/ui/bank-statement-generate-dialog.tsx +435 -0
  358. package/src/components/ui/bank-statement-pdf-viewer.tsx +241 -0
  359. package/src/components/ui/banking-accounts-connect.tsx +187 -0
  360. package/src/components/ui/borrowing-capacity-atoms.tsx +228 -0
  361. package/src/components/ui/borrowing-capacity-card.tsx +155 -0
  362. package/src/components/ui/broker-info-panel.tsx +94 -0
  363. package/src/components/ui/calculator-input-item.tsx +49 -0
  364. package/src/components/ui/calculator-section.tsx +275 -0
  365. package/src/components/ui/category-edit-dialog.tsx +300 -0
  366. package/src/components/ui/connect-bank-step.tsx +379 -0
  367. package/src/components/ui/contact-alert-dialog.tsx +710 -0
  368. package/src/components/ui/create-contact-modal.tsx +237 -0
  369. package/src/components/ui/csv-import-modal.tsx +153 -0
  370. package/src/components/ui/currency-input.tsx +104 -0
  371. package/src/components/ui/dashboard-expense-categories.tsx +262 -0
  372. package/src/components/ui/dashboard-transactions-table.tsx +241 -0
  373. package/src/components/ui/debt-accordion.tsx +254 -0
  374. package/src/components/ui/delete-contact-component.tsx +87 -0
  375. package/src/components/ui/dialog.tsx +2 -2
  376. package/src/components/ui/dynamic-tabs.tsx +149 -0
  377. package/src/components/ui/editable-money-item.tsx +176 -0
  378. package/src/components/ui/expense-detail-item.tsx +216 -0
  379. package/src/components/ui/expense-work-details.tsx +229 -0
  380. package/src/components/ui/file-preview-dialog.tsx +292 -0
  381. package/src/components/ui/financial-drawers.tsx +1 -1
  382. package/src/components/ui/frontend-signup-steps.tsx +548 -0
  383. package/src/components/ui/income-sources-card.tsx +143 -0
  384. package/src/components/ui/income-summary-component.tsx +120 -0
  385. package/src/components/ui/income-work-details.tsx +429 -0
  386. package/src/components/ui/incoming-outgoings-card.tsx +111 -0
  387. package/src/components/ui/interest-rate-input.tsx +111 -0
  388. package/src/components/ui/interest-rate-section.tsx +158 -0
  389. package/src/components/ui/interest-rate-used.tsx +82 -0
  390. package/src/components/ui/kanban-column.tsx +53 -2
  391. package/src/components/ui/loan-applicant-information.tsx +64 -0
  392. package/src/components/ui/loan-applicant-invite.tsx +67 -0
  393. package/src/components/ui/loan-application-badge.tsx +70 -0
  394. package/src/components/ui/loan-application-cards.tsx +152 -0
  395. package/src/components/ui/loan-entry-shell.tsx +86 -0
  396. package/src/components/ui/loan-financials.tsx +77 -0
  397. package/src/components/ui/loan-option-card.tsx +62 -0
  398. package/src/components/ui/loan-option-group.tsx +106 -0
  399. package/src/components/ui/loan-steps.tsx +630 -0
  400. package/src/components/ui/loan-wizard-shell.tsx +235 -0
  401. package/src/components/ui/money-input-with-slider.tsx +77 -0
  402. package/src/components/ui/money-item-with-color-indicator.tsx +30 -0
  403. package/src/components/ui/opportunity-card.tsx +46 -18
  404. package/src/components/ui/pipeline-board.tsx +13 -0
  405. package/src/components/ui/pipeline-primitives.tsx +28 -0
  406. package/src/components/ui/property-asset-card.tsx +221 -0
  407. package/src/components/ui/property-list-carousel.tsx +73 -0
  408. package/src/components/ui/property-report-dialog.tsx +355 -0
  409. package/src/components/ui/resource-center.tsx +539 -0
  410. package/src/components/ui/review-alerts-dialog.tsx +163 -0
  411. package/src/components/ui/savings-goal-modal.tsx +169 -0
  412. package/src/components/ui/scenario-drawer.tsx +358 -0
  413. package/src/components/ui/scenario-item.tsx +141 -0
  414. package/src/components/ui/scenario-list.tsx +150 -0
  415. package/src/components/ui/share-details-dialog.tsx +238 -0
  416. package/src/components/ui/signup-form-primitives.tsx +212 -0
  417. package/src/components/ui/signup-shell.tsx +180 -0
  418. package/src/components/ui/stage-timeline.tsx +11 -0
  419. package/src/components/ui/submission-confirmation-card.tsx +68 -0
  420. package/src/components/ui/top-three-product.tsx +207 -0
  421. package/src/components/ui/transactions-summary-block.tsx +59 -0
  422. package/src/lib/colors.ts +12 -0
  423. package/src/lib/format-date.ts +2 -2
  424. package/src/styles/styles-css.ts +1 -1
  425. package/tsup.config.ts +77 -1
  426. package/dist/{chunk-5VOTTIXF.mjs → chunk-FRT3S72S.mjs} +3 -3
  427. package/dist/{chunk-7BTFGCFC.mjs → chunk-MUV4EGDW.mjs} +3 -3
  428. package/dist/{chunk-57ZXILTS.mjs → chunk-MXP2RX2V.mjs} +3 -3
  429. package/dist/{chunk-ZKWXDQDG.mjs → chunk-VCDGLN25.mjs} +3 -3
  430. package/dist/{chunk-FLL633WS.mjs → chunk-ZXEUBBHJ.mjs} +3 -3
@@ -0,0 +1,235 @@
1
+ import * as React from "react";
2
+ import { cn } from "@/lib/utils";
3
+ import { Button } from "@/components/ui/button";
4
+ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
5
+
6
+ // ─── Types ────────────────────────────────────────────────────────────────────
7
+
8
+ export type LoanWizardSection = {
9
+ value: string;
10
+ label: string;
11
+ disabled?: boolean;
12
+ };
13
+
14
+ export type LoanWizardApplicantOption = {
15
+ id: string;
16
+ label: string;
17
+ };
18
+
19
+ export type LoanWizardShellProps = {
20
+ // Header
21
+ /** Broker logo / wordmark rendered in the top-left. */
22
+ logo?: React.ReactNode;
23
+ onSaveAndLogOut?: () => void;
24
+ /** Label for the primary header action. Defaults to "Login App". */
25
+ loginAppLabel?: string;
26
+ onLoginApp?: () => void;
27
+
28
+ // Hero
29
+ /** Application headline. Defaults to WealthX copy. */
30
+ heroTitle?: string;
31
+ heroSubtitle?: string;
32
+ /** Broker info block rendered on the right of the hero. */
33
+ brokerSlot?: React.ReactNode;
34
+
35
+ // Tab navigation
36
+ sections: LoanWizardSection[];
37
+ activeSection: string;
38
+ onSectionChange: (section: string) => void;
39
+
40
+ // Applicant switcher (optional — shows a Main / Co-Applicant toggle)
41
+ applicantOptions?: LoanWizardApplicantOption[];
42
+ activeApplicantId?: string;
43
+ onApplicantChange?: (id: string) => void;
44
+
45
+ // Content
46
+ children?: React.ReactNode;
47
+
48
+ // Bottom navigation
49
+ onPrev?: () => void;
50
+ onNext?: () => void;
51
+ nextLabel?: string;
52
+
53
+ className?: string;
54
+ };
55
+
56
+ export type { LoanWizardSection as LoanWizardSectionItem };
57
+ export type { LoanWizardApplicantOption as LoanWizardApplicant };
58
+
59
+ // ─── Component ────────────────────────────────────────────────────────────────
60
+
61
+ export function LoanWizardShell({
62
+ logo,
63
+ onSaveAndLogOut,
64
+ loginAppLabel = "Login App",
65
+ onLoginApp,
66
+ heroTitle = "Quick Online Application,\nThat Get's You Answers Fast!",
67
+ heroSubtitle = "(This does not effect your credit score)",
68
+ brokerSlot,
69
+ sections,
70
+ activeSection,
71
+ onSectionChange,
72
+ applicantOptions,
73
+ activeApplicantId,
74
+ onApplicantChange,
75
+ children,
76
+ onPrev,
77
+ onNext,
78
+ nextLabel = "Next",
79
+ className,
80
+ }: LoanWizardShellProps) {
81
+ return (
82
+ <div
83
+ className={cn(
84
+ "flex min-h-screen flex-col bg-background font-sans",
85
+ className,
86
+ )}
87
+ >
88
+ {/* ── Header ── */}
89
+ <header className="flex shrink-0 items-center justify-between border-b border-border px-4 py-4 sm:px-8 sm:py-5 lg:px-[200px]">
90
+ <div className="flex items-center">{logo}</div>
91
+ <div className="flex items-center gap-3">
92
+ {onSaveAndLogOut && (
93
+ <Button variant="outline" size="sm" onClick={onSaveAndLogOut}>
94
+ Save &amp; Log Out
95
+ </Button>
96
+ )}
97
+ {onLoginApp && (
98
+ <Button size="sm" onClick={onLoginApp}>
99
+ {loginAppLabel}
100
+ </Button>
101
+ )}
102
+ </div>
103
+ </header>
104
+
105
+ {/* ── Hero ── */}
106
+ <div className="flex shrink-0 items-center justify-between px-4 py-8 sm:px-8 sm:py-12 lg:px-[200px]">
107
+ <div className="flex flex-col gap-2">
108
+ <h1 className="text-2xl font-bold text-foreground lg:text-[38px] lg:leading-tight">
109
+ {heroTitle.split("\n").map((line, i) => (
110
+ <React.Fragment key={i}>
111
+ {line}
112
+ {i < heroTitle.split("\n").length - 1 && <br />}
113
+ </React.Fragment>
114
+ ))}
115
+ </h1>
116
+ {heroSubtitle && (
117
+ <p className="text-sm text-muted-foreground">{heroSubtitle}</p>
118
+ )}
119
+ <div className="mt-2 h-[3px] w-24 bg-primary" />
120
+ </div>
121
+ {brokerSlot && <div className="hidden lg:flex">{brokerSlot}</div>}
122
+ </div>
123
+
124
+ {/* ── Tab navigation ── */}
125
+ <div className="shrink-0 px-4 sm:px-8 lg:px-[200px]">
126
+ <div className="flex items-end gap-0 border-b border-border">
127
+ {sections.map((s) => (
128
+ <button
129
+ key={s.value}
130
+ type="button"
131
+ disabled={s.disabled}
132
+ onClick={() => onSectionChange(s.value)}
133
+ className={cn(
134
+ "px-3 py-1 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
135
+ s.value === activeSection
136
+ ? "border-b-[3px] border-primary font-semibold text-foreground"
137
+ : "text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:opacity-40",
138
+ )}
139
+ >
140
+ {s.label}
141
+ </button>
142
+ ))}
143
+ </div>
144
+ </div>
145
+
146
+ {/* ── Content area ── */}
147
+ <div className="flex flex-1 flex-col gap-6 px-4 pb-10 pt-6 sm:px-8 sm:pb-16 sm:pt-10 lg:px-[200px]">
148
+ {/* Applicant switcher */}
149
+ {applicantOptions && applicantOptions.length > 1 && (
150
+ <Tabs
151
+ value={activeApplicantId}
152
+ onValueChange={onApplicantChange}
153
+ className="w-fit"
154
+ >
155
+ <TabsList>
156
+ {applicantOptions.map((opt) => (
157
+ <TabsTrigger key={opt.id} value={opt.id}>
158
+ {opt.label}
159
+ </TabsTrigger>
160
+ ))}
161
+ </TabsList>
162
+ </Tabs>
163
+ )}
164
+
165
+ {/* sr-only h2 establishes heading hierarchy: h1 (hero) → h2 (section) → h3 (organisms) */}
166
+ <h2 className="sr-only">
167
+ {sections.find((s) => s.value === activeSection)?.label}
168
+ </h2>
169
+
170
+ {/* Section content — constrained to ~628px matching design */}
171
+ <div className="w-full max-w-[628px]">{children}</div>
172
+ </div>
173
+
174
+ {/* ── Bottom navigation ── */}
175
+ {(onPrev || onNext) && (
176
+ <div className="shrink-0 px-4 pb-6 sm:px-8 sm:pb-10 lg:px-[200px]">
177
+ <div className="flex max-w-[628px] items-center justify-between border-t border-border pt-6">
178
+ {onPrev ? (
179
+ <Button variant="outline" onClick={onPrev}>
180
+ <ChevronLeftIcon className="mr-1 size-4" />
181
+ Previous
182
+ </Button>
183
+ ) : (
184
+ <span />
185
+ )}
186
+ {onNext && (
187
+ <Button variant="outline" onClick={onNext}>
188
+ {nextLabel}
189
+ <ChevronRightIcon className="ml-1 size-4" />
190
+ </Button>
191
+ )}
192
+ </div>
193
+ </div>
194
+ )}
195
+ </div>
196
+ );
197
+ }
198
+
199
+ // ─── Icons ────────────────────────────────────────────────────────────────────
200
+
201
+ function ChevronLeftIcon({ className }: { className?: string }) {
202
+ return (
203
+ <svg
204
+ xmlns="http://www.w3.org/2000/svg"
205
+ viewBox="0 0 24 24"
206
+ fill="none"
207
+ stroke="currentColor"
208
+ strokeWidth={2}
209
+ strokeLinecap="round"
210
+ strokeLinejoin="round"
211
+ className={className}
212
+ aria-hidden="true"
213
+ >
214
+ <path d="m15 18-6-6 6-6" />
215
+ </svg>
216
+ );
217
+ }
218
+
219
+ function ChevronRightIcon({ className }: { className?: string }) {
220
+ return (
221
+ <svg
222
+ xmlns="http://www.w3.org/2000/svg"
223
+ viewBox="0 0 24 24"
224
+ fill="none"
225
+ stroke="currentColor"
226
+ strokeWidth={2}
227
+ strokeLinecap="round"
228
+ strokeLinejoin="round"
229
+ className={className}
230
+ aria-hidden="true"
231
+ >
232
+ <path d="m9 18 6-6-6-6" />
233
+ </svg>
234
+ );
235
+ }
@@ -0,0 +1,77 @@
1
+ import React from "react";
2
+ import { cn } from "@/lib/utils";
3
+ import { formatCurrency, formatCurrencyAbbrev } from "@/lib/format-currency";
4
+ import { Slider } from "./slider";
5
+
6
+ /**
7
+ * A labeled slider molecule for selecting a dollar amount within a range.
8
+ *
9
+ * Layout (top-to-bottom):
10
+ * - Label (left) + current value (right)
11
+ * - Slider track + thumb
12
+ * - Min label (left) + max label (right) — abbreviated currency
13
+ *
14
+ * Used in the Borrowing Capacity page for inputs like interest rate, purchase
15
+ * price range, or LVR settings where a slider gives better UX than a bare text
16
+ * input.
17
+ */
18
+
19
+ export interface MoneyInputWithSliderProps {
20
+ /** Label shown above the slider (e.g. "Purchase Price") */
21
+ label: string;
22
+ /** Current value in whole dollars */
23
+ value: number;
24
+ /** Minimum selectable value in whole dollars */
25
+ min: number;
26
+ /** Maximum selectable value in whole dollars */
27
+ max: number;
28
+ /** Step size in dollars (default: 1000) */
29
+ step?: number;
30
+ /** Called on every slider change with the new dollar value */
31
+ onChange?: (value: number) => void;
32
+ disabled?: boolean;
33
+ className?: string;
34
+ }
35
+
36
+ export function MoneyInputWithSlider({
37
+ label,
38
+ value,
39
+ min,
40
+ max,
41
+ step = 1000,
42
+ onChange,
43
+ disabled = false,
44
+ className,
45
+ }: MoneyInputWithSliderProps) {
46
+ return (
47
+ <div className={cn("flex flex-col gap-2", className)}>
48
+ {/* Label row */}
49
+ <div className="flex items-center justify-between gap-2">
50
+ <span className="text-sm text-muted-foreground">{label}</span>
51
+ <span className="text-sm font-semibold tabular-nums text-foreground">
52
+ {formatCurrency(value)}
53
+ </span>
54
+ </div>
55
+
56
+ {/* Slider */}
57
+ <Slider
58
+ value={value}
59
+ min={min}
60
+ max={max}
61
+ step={step}
62
+ disabled={disabled}
63
+ onValueChange={onChange}
64
+ />
65
+
66
+ {/* Min / max labels */}
67
+ <div className="flex items-center justify-between">
68
+ <span className="text-xs text-muted-foreground">
69
+ {formatCurrencyAbbrev(min)}
70
+ </span>
71
+ <span className="text-xs text-muted-foreground">
72
+ {formatCurrencyAbbrev(max)}
73
+ </span>
74
+ </div>
75
+ </div>
76
+ );
77
+ }
@@ -0,0 +1,30 @@
1
+ import React from "react";
2
+ import { EditableMoneyItem } from "./editable-money-item";
3
+
4
+ /**
5
+ * A read-only variant of `EditableMoneyItem` — same swatch + label + tooltip
6
+ * layout, but without the pencil edit trigger.
7
+ *
8
+ * The pencil slot is still reserved (invisible) so value text stays
9
+ * column-aligned when mixed with editable rows in the same list.
10
+ */
11
+
12
+ export interface MoneyItemWithColorIndicatorProps {
13
+ /** Row label (e.g. "Surplus Income") */
14
+ label: string;
15
+ /** Pre-formatted value string (e.g. "$2,400") */
16
+ value: string;
17
+ /** CSS color used for the swatch border and tinted fill */
18
+ color: string;
19
+ /** Fill opacity for the swatch background (default: 0.4) */
20
+ fillOpacity?: number;
21
+ /** Optional tooltip text shown on the info icon */
22
+ tooltip?: string;
23
+ className?: string;
24
+ }
25
+
26
+ export function MoneyItemWithColorIndicator(
27
+ props: MoneyItemWithColorIndicatorProps,
28
+ ) {
29
+ return <EditableMoneyItem {...props} />;
30
+ }
@@ -29,6 +29,12 @@ import {
29
29
  AccordionTrigger,
30
30
  } from "@/components/ui/accordion";
31
31
  import { TaskCheckItem } from "@/components/ui/pipeline-primitives";
32
+ import {
33
+ Tooltip,
34
+ TooltipContent,
35
+ TooltipProvider,
36
+ TooltipTrigger,
37
+ } from "@/components/ui/tooltip";
32
38
 
33
39
  /**
34
40
  * OpportunityCard — WealthX DS (L3 Card)
@@ -104,6 +110,8 @@ export interface OpportunityCardProps {
104
110
  loanApplicationUrl?: string;
105
111
 
106
112
  // ── Actions ──────────────────────────────────────────────────
113
+ /** Fires when clicking the non-interactive card body (e.g. to open the summary drawer). */
114
+ onCardClick?: () => void;
107
115
  onViewDetails?: () => void;
108
116
  onTaskToggle?: (taskId: string) => void;
109
117
  onMarkAsDone?: () => void;
@@ -115,6 +123,9 @@ export interface OpportunityCardProps {
115
123
 
116
124
  /** Shows a loading state on action buttons while an async op is in flight. */
117
125
  isSubmitting?: boolean;
126
+ /** Whether the card is draggable (HTML5 native DnD). */
127
+ draggable?: boolean;
128
+ onDragStart?: React.DragEventHandler<HTMLDivElement>;
118
129
  className?: string;
119
130
  }
120
131
 
@@ -151,7 +162,6 @@ function resolvePriority(
151
162
  return priority;
152
163
  }
153
164
 
154
-
155
165
  function formatLoanType(type: string): string {
156
166
  return type
157
167
  .split("-")
@@ -180,6 +190,7 @@ export function OpportunityCard({
180
190
  isModifyCompletedLoan,
181
191
  tasks = [],
182
192
  nextTask,
193
+ onCardClick,
183
194
  onViewDetails,
184
195
  onTaskToggle,
185
196
  onMarkAsDone,
@@ -189,6 +200,8 @@ export function OpportunityCard({
189
200
  onDelete,
190
201
  onPutOnHold,
191
202
  isSubmitting = false,
203
+ draggable = false,
204
+ onDragStart,
192
205
  className,
193
206
  }: OpportunityCardProps) {
194
207
  const resolvedPriority = resolvePriority(
@@ -205,14 +218,21 @@ export function OpportunityCard({
205
218
  const hasActions = onMarkAsDone || onMoveToNextStage;
206
219
  const hasMenu = onViewDetails || onChangePriority || onPutOnHold || onDelete;
207
220
 
221
+ const stopProp = (e: React.MouseEvent) => e.stopPropagation();
222
+
208
223
  return (
209
224
  <div
210
225
  className={cn(
211
226
  "flex flex-col gap-2 border border-border bg-background p-4 text-foreground shadow-sm",
227
+ onCardClick && "cursor-pointer",
228
+ draggable && "cursor-grab active:cursor-grabbing",
212
229
  isSubmitting && "opacity-60",
213
230
  className,
214
231
  )}
215
232
  data-slot="opportunity-card"
233
+ draggable={draggable}
234
+ onDragStart={onDragStart}
235
+ onClick={onCardClick}
216
236
  >
217
237
  {/* ── On-hold banner ── */}
218
238
  {onHoldTo && (
@@ -248,19 +268,25 @@ export function OpportunityCard({
248
268
  </span>
249
269
  </div>
250
270
 
251
- <div className="flex items-center gap-1 -mr-1 -mt-1">
271
+ <div className="flex items-center gap-1 -mr-1 -mt-1" onClick={stopProp}>
252
272
  {onLaunchAssistant && (
253
- <Button
254
- type="button"
255
- variant="ghost"
256
- size="icon"
257
- className="size-7 shrink-0"
258
- onClick={onLaunchAssistant}
259
- aria-label="Launch AI Assistant"
260
- title="Launch AI Assistant"
261
- >
262
- <Bot className="size-4" />
263
- </Button>
273
+ <TooltipProvider delay={0}>
274
+ <Tooltip>
275
+ <TooltipTrigger asChild>
276
+ <Button
277
+ type="button"
278
+ variant="ghost"
279
+ size="icon"
280
+ className="size-7 shrink-0"
281
+ onClick={onLaunchAssistant}
282
+ aria-label="Launch AI"
283
+ >
284
+ <Bot className="size-4" />
285
+ </Button>
286
+ </TooltipTrigger>
287
+ <TooltipContent>Launch AI</TooltipContent>
288
+ </Tooltip>
289
+ </TooltipProvider>
264
290
  )}
265
291
  {hasMenu && (
266
292
  <DropdownMenu>
@@ -374,7 +400,8 @@ export function OpportunityCard({
374
400
 
375
401
  {/* ── Tasks: segmented progress bar + animated accordion ── */}
376
402
  {hasTasks && (
377
- <>
403
+ // stopPropagation: accordion expand/collapse + task checkboxes must not bubble to onCardClick
404
+ <div onClick={stopProp}>
378
405
  {/* Segmented bar — one segment per task, filled = completed */}
379
406
  <div
380
407
  className="flex gap-0.5"
@@ -431,15 +458,16 @@ export function OpportunityCard({
431
458
  <span className="text-muted-foreground">{nextTask}</span>
432
459
  </div>
433
460
  )}
434
- </>
461
+ </div>
435
462
  )}
436
463
 
437
464
  {/* ── Action buttons ── */}
438
465
  {hasActions && (
439
- <>
466
+ // stopPropagation: button clicks must not bubble to onCardClick
467
+ <div onClick={stopProp}>
440
468
  <Separator />
441
469
  {(onMoveToNextStage || onMarkAsDone) && (
442
- <div className="flex gap-2">
470
+ <div className="flex gap-2 pt-2">
443
471
  {onMoveToNextStage && (
444
472
  <Button
445
473
  variant="outline"
@@ -464,7 +492,7 @@ export function OpportunityCard({
464
492
  )}
465
493
  </div>
466
494
  )}
467
- </>
495
+ </div>
468
496
  )}
469
497
  </div>
470
498
  );
@@ -83,6 +83,13 @@ export interface PipelineBoardProps {
83
83
  onRefresh?: () => void;
84
84
 
85
85
  // ── Card callbacks ───────────────────────────────────────────
86
+ /**
87
+ * Fires when a card is dragged from one column and dropped into another.
88
+ * The app is responsible for updating `columns` accordingly.
89
+ */
90
+ onMoveCard?: (cardId: string, toColumnKey: string) => void;
91
+ /** Fires when clicking the non-interactive card body. */
92
+ onCardClick?: (opportunityId: string) => void;
86
93
  onTaskToggle?: (opportunityId: string, taskId: string) => void;
87
94
  onMarkAsDone?: (opportunityId: string) => void;
88
95
  onMoveToNextStage?: (opportunityId: string) => void;
@@ -196,6 +203,8 @@ export function PipelineBoard({
196
203
  onRefresh,
197
204
  onEditColumn,
198
205
  onDeleteColumn,
206
+ onMoveCard,
207
+ onCardClick,
199
208
  onTaskToggle,
200
209
  onMarkAsDone,
201
210
  onMoveToNextStage,
@@ -249,6 +258,10 @@ export function PipelineBoard({
249
258
  ? () => onDeleteColumn(col.stage.id)
250
259
  : undefined
251
260
  }
261
+ onCardDrop={
262
+ onMoveCard ? (cardId) => onMoveCard(cardId, col.key) : undefined
263
+ }
264
+ onCardClick={onCardClick}
252
265
  onTaskToggle={onTaskToggle}
253
266
  onMarkAsDone={onMarkAsDone}
254
267
  onMoveToNextStage={onMoveToNextStage}
@@ -1,6 +1,7 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import { Badge } from "@/components/ui/badge";
3
3
  import { Checkbox } from "@/components/ui/checkbox";
4
+ import { Switch } from "@/components/ui/switch";
4
5
 
5
6
  /**
6
7
  * Pipeline domain primitives — WealthX DS
@@ -26,6 +27,14 @@ export interface TaskCheckItemProps {
26
27
  completed: boolean;
27
28
  /** Name of the AI agent assigned to this task, if any. */
28
29
  aiAgentName?: string | null;
30
+ /**
31
+ * When `aiAgentName` is set and this prop is provided (true/false),
32
+ * a "Allow Agent to Auto Complete" switch is shown beneath the agent badge.
33
+ * Omit this prop to hide the switch entirely.
34
+ */
35
+ autoCompleteEnabled?: boolean;
36
+ /** Called when the auto-complete switch is toggled. */
37
+ onAutoCompleteToggle?: () => void;
29
38
  /** Called when the checkbox is toggled. */
30
39
  onToggle?: () => void;
31
40
  /** Disables interaction (e.g. while saving). */
@@ -55,6 +64,8 @@ export function TaskCheckItem({
55
64
  title,
56
65
  completed,
57
66
  aiAgentName,
67
+ autoCompleteEnabled,
68
+ onAutoCompleteToggle,
58
69
  onToggle,
59
70
  disabled = false,
60
71
  size = "xs",
@@ -102,6 +113,23 @@ export function TaskCheckItem({
102
113
  {aiAgentName}
103
114
  </Badge>
104
115
  )}
116
+ {aiAgentName && autoCompleteEnabled !== undefined && (
117
+ <span
118
+ className="flex items-center gap-1.5"
119
+ onClick={(e) => e.stopPropagation()}
120
+ >
121
+ <Switch
122
+ checked={autoCompleteEnabled}
123
+ onCheckedChange={() => onAutoCompleteToggle?.()}
124
+ disabled={disabled}
125
+ className="scale-75 origin-left"
126
+ aria-label="Allow agent to auto complete"
127
+ />
128
+ <span className="text-[10px] text-muted-foreground">
129
+ Allow Agent to Auto Complete
130
+ </span>
131
+ </span>
132
+ )}
105
133
  </span>
106
134
  </div>
107
135
  );