@wealthx/shadcn 1.4.0 → 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 +12 -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,615 @@
1
+ import React, { useState } from "react";
2
+ import {
3
+ CalendarIcon,
4
+ InfoIcon,
5
+ MailIcon,
6
+ PhoneIcon,
7
+ PlusIcon,
8
+ } from "lucide-react";
9
+ import { Button } from "./button";
10
+ import { Checkbox } from "./checkbox";
11
+ import { ColorPicker } from "./color-picker";
12
+ import { Field, FieldError, FieldLabel } from "./field";
13
+ import { Input } from "./input";
14
+ import { Separator } from "./separator";
15
+ import {
16
+ Select,
17
+ SelectContent,
18
+ SelectItem,
19
+ SelectTrigger,
20
+ SelectValue,
21
+ } from "./select";
22
+ import {
23
+ Tooltip,
24
+ TooltipContent,
25
+ TooltipProvider,
26
+ TooltipTrigger,
27
+ } from "./tooltip";
28
+ import { UploadCard } from "./upload-card";
29
+ import {
30
+ FormField,
31
+ PasswordField,
32
+ SectionHeading,
33
+ StaffMember,
34
+ StaffRowItem,
35
+ } from "./signup-form-primitives";
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Pricing constants (WealthX Professional Plan)
39
+ // ---------------------------------------------------------------------------
40
+
41
+ const BASE_PLAN_PRICE = 299;
42
+
43
+ const ROLE_INFO: Record<string, string> = {
44
+ Admin: "Admin seats have full access to manage the platform.",
45
+ Broker: "Broker seats can manage client portfolios.",
46
+ Support: "Support seats handle client inquiries and tickets.",
47
+ };
48
+
49
+ const ROLE_SUBTITLE: Record<string, string> = {
50
+ Admin: "$89/month/company (first seat included)",
51
+ Broker: "$89/month/company",
52
+ Support: "$0/month/company",
53
+ };
54
+
55
+ // ---------------------------------------------------------------------------
56
+ // Step 1 — Personal Details
57
+ // ---------------------------------------------------------------------------
58
+
59
+ export interface PersonalDetailsStepProps {
60
+ onValidChange?: (valid: boolean) => void;
61
+ }
62
+
63
+ export function PersonalDetailsStep({
64
+ onValidChange,
65
+ }: PersonalDetailsStepProps) {
66
+ const [firstName, setFirstName] = useState("");
67
+ const [lastName, setLastName] = useState("");
68
+ const [email, setEmail] = useState("");
69
+ const [emailError, setEmailError] = useState("");
70
+ const [emailTouched, setEmailTouched] = useState(false);
71
+ const [passwordValue, setPasswordValue] = useState("");
72
+ const [confirmValue, setConfirmValue] = useState("");
73
+ const [termsAccepted, setTermsAccepted] = useState(false);
74
+
75
+ const validateEmail = (v: string) => {
76
+ if (v.length > 0 && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v))
77
+ return "Please enter a valid email address";
78
+ return "";
79
+ };
80
+
81
+ const passwordRules = (v: string) =>
82
+ v.length >= 8 &&
83
+ /[A-Z]/.test(v) &&
84
+ /[a-z]/.test(v) &&
85
+ /[0-9]/.test(v) &&
86
+ /[^A-Za-z0-9]/.test(v);
87
+
88
+ const emailValid = email.length > 0 && validateEmail(email) === "";
89
+ const passwordValid = passwordRules(passwordValue);
90
+ const confirmPasswordValid =
91
+ confirmValue.length > 0 && confirmValue === passwordValue;
92
+
93
+ React.useEffect(() => {
94
+ onValidChange?.(
95
+ firstName.trim().length > 0 &&
96
+ lastName.trim().length > 0 &&
97
+ emailValid &&
98
+ passwordValid &&
99
+ confirmPasswordValid &&
100
+ termsAccepted,
101
+ );
102
+ }, [
103
+ firstName,
104
+ lastName,
105
+ emailValid,
106
+ passwordValid,
107
+ confirmPasswordValid,
108
+ termsAccepted,
109
+ onValidChange,
110
+ ]);
111
+
112
+ return (
113
+ <div className="flex flex-col gap-1">
114
+ <div className="flex gap-4">
115
+ <Field>
116
+ <FieldLabel>
117
+ First Name<span className="text-destructive ml-0.5">*</span>
118
+ </FieldLabel>
119
+ <Input
120
+ placeholder="First Name"
121
+ value={firstName}
122
+ onChange={(e) => setFirstName(e.target.value)}
123
+ />
124
+ <div className="min-h-5" />
125
+ </Field>
126
+ <Field>
127
+ <FieldLabel>
128
+ Last Name<span className="text-destructive ml-0.5">*</span>
129
+ </FieldLabel>
130
+ <Input
131
+ placeholder="Last Name"
132
+ value={lastName}
133
+ onChange={(e) => setLastName(e.target.value)}
134
+ />
135
+ <div className="min-h-5" />
136
+ </Field>
137
+ </div>
138
+ <Field>
139
+ <FieldLabel>
140
+ Email Address<span className="text-destructive ml-0.5">*</span>
141
+ </FieldLabel>
142
+ <Input
143
+ type="email"
144
+ placeholder="Email Address"
145
+ value={email}
146
+ onChange={(e) => {
147
+ setEmail(e.target.value);
148
+ if (emailTouched) setEmailError(validateEmail(e.target.value));
149
+ }}
150
+ onBlur={() => {
151
+ setEmailTouched(true);
152
+ setEmailError(validateEmail(email));
153
+ }}
154
+ />
155
+ <div className="min-h-5">
156
+ {emailTouched && emailError && <FieldError>{emailError}</FieldError>}
157
+ </div>
158
+ </Field>
159
+ <PasswordField
160
+ label="Set Your Password"
161
+ placeholder="Password"
162
+ required
163
+ showStrengthPopover
164
+ onValueChange={setPasswordValue}
165
+ />
166
+ <PasswordField
167
+ label="Confirm Password"
168
+ placeholder="Confirm Your Password"
169
+ required
170
+ onValueChange={setConfirmValue}
171
+ />
172
+ <Field>
173
+ <FieldLabel>Phone Number</FieldLabel>
174
+ <Input placeholder="Phone Number" />
175
+ <div className="min-h-5" />
176
+ </Field>
177
+ <div className="flex items-start gap-3">
178
+ <Checkbox
179
+ id="terms"
180
+ checked={termsAccepted}
181
+ onCheckedChange={(v) => setTermsAccepted(!!v)}
182
+ />
183
+ <label
184
+ htmlFor="terms"
185
+ className="text-sm text-muted-foreground leading-relaxed cursor-pointer select-none"
186
+ >
187
+ I agree to the{" "}
188
+ <span className="text-foreground underline">
189
+ Terms and Conditions
190
+ </span>{" "}
191
+ and <span className="text-foreground underline">Privacy Policy</span>
192
+ </label>
193
+ </div>
194
+ </div>
195
+ );
196
+ }
197
+
198
+ // ---------------------------------------------------------------------------
199
+ // Step 2 — Company Info
200
+ // ---------------------------------------------------------------------------
201
+
202
+ export function CompanyInfoStep() {
203
+ return (
204
+ <div className="flex flex-col gap-4">
205
+ <SectionHeading>Company Details</SectionHeading>
206
+ <FormField label="Business Name" required>
207
+ <Input placeholder="Business Name" />
208
+ </FormField>
209
+ <FormField label="ABN (Australian Business Number)" required>
210
+ <Input placeholder="Input ABN" />
211
+ </FormField>
212
+ <FormField label="Australian Credit License Number" required>
213
+ <Input placeholder="Input License Number" />
214
+ </FormField>
215
+ <FormField label="Customer Support Email" required>
216
+ <Input type="email" placeholder="Customer Support Email" />
217
+ </FormField>
218
+ <FormField label="Main Business Phone Number" required>
219
+ <Input placeholder="Main Business Phone Number" />
220
+ </FormField>
221
+ <FormField label="Domain" required>
222
+ <Input placeholder="Input Domain" />
223
+ </FormField>
224
+ <SectionHeading>
225
+ Connective Details{" "}
226
+ <span className="text-muted-foreground font-normal">
227
+ (connective brokers only)
228
+ </span>
229
+ </SectionHeading>
230
+ <FormField label="CA Number">
231
+ <Input placeholder="CA Number" />
232
+ </FormField>
233
+ <FormField label="Company ID">
234
+ <Input placeholder="Company ID" />
235
+ </FormField>
236
+ <FormField label="API Key">
237
+ <Input placeholder="API Key" />
238
+ </FormField>
239
+ <FormField label="API Token">
240
+ <Input placeholder="API Token" />
241
+ </FormField>
242
+ </div>
243
+ );
244
+ }
245
+
246
+ // ---------------------------------------------------------------------------
247
+ // Step 3 — Branding Info
248
+ // ---------------------------------------------------------------------------
249
+
250
+ export function BrandingInfoStep() {
251
+ const [primaryColor, setPrimaryColor] = useState("#131C24");
252
+ const [secondaryColor, setSecondaryColor] = useState("#00E599");
253
+ const [calendarType, setCalendarType] = useState("Calendly");
254
+
255
+ return (
256
+ <div className="flex flex-col gap-6">
257
+ <div className="flex flex-col gap-4">
258
+ <SectionHeading>Admin Advisor Content</SectionHeading>
259
+ <FormField label="Calendar URL">
260
+ <div className="flex gap-2">
261
+ <Select
262
+ value={calendarType}
263
+ onValueChange={(v) => setCalendarType(v as string)}
264
+ >
265
+ <SelectTrigger className="w-[140px] shrink-0">
266
+ <SelectValue />
267
+ </SelectTrigger>
268
+ <SelectContent>
269
+ <SelectItem value="Calendly">Calendly</SelectItem>
270
+ <SelectItem value="Gmail">Gmail Calendar</SelectItem>
271
+ <SelectItem value="Outlook">Outlook Calendar</SelectItem>
272
+ </SelectContent>
273
+ </Select>
274
+ <Input placeholder="Paste calendar URL" className="flex-1" />
275
+ </div>
276
+ </FormField>
277
+ <FormField label="Video URL (Youtube, Vimeo, Wistia)">
278
+ <Input placeholder="Input Video URL" />
279
+ </FormField>
280
+ <Field>
281
+ <FieldLabel>Upload professional photo (800x450)</FieldLabel>
282
+ <UploadCard
283
+ size="sm"
284
+ label="Upload image"
285
+ description="PNG, JPG · 800×450px"
286
+ />
287
+ </Field>
288
+ </div>
289
+
290
+ <div className="flex flex-col gap-4">
291
+ <SectionHeading>Company Branding</SectionHeading>
292
+ <Field>
293
+ <FieldLabel>Color Code Primary</FieldLabel>
294
+ <ColorPicker value={primaryColor} onChange={setPrimaryColor} />
295
+ </Field>
296
+ <Field>
297
+ <FieldLabel>Color Code Secondary</FieldLabel>
298
+ <ColorPicker value={secondaryColor} onChange={setSecondaryColor} />
299
+ </Field>
300
+ <div className="grid grid-cols-2 gap-4">
301
+ <Field>
302
+ <FieldLabel>Primary Symbol Logo (50x50)</FieldLabel>
303
+ <UploadCard
304
+ size="sm"
305
+ label="Upload image"
306
+ description="PNG, JPG · 50×50px"
307
+ />
308
+ </Field>
309
+ <Field>
310
+ <FieldLabel>Symbol Logo in White (50x50)</FieldLabel>
311
+ <UploadCard
312
+ size="sm"
313
+ label="Upload image"
314
+ description="PNG, JPG · 50×50px"
315
+ />
316
+ </Field>
317
+ </div>
318
+ <div className="grid grid-cols-2 gap-4">
319
+ <Field>
320
+ <FieldLabel>Primary Business Logo (150x100)</FieldLabel>
321
+ <UploadCard
322
+ size="sm"
323
+ label="Upload image"
324
+ description="PNG, JPG · 150×100px"
325
+ />
326
+ </Field>
327
+ <Field>
328
+ <FieldLabel>Primary Business Logo in White (150x100)</FieldLabel>
329
+ <UploadCard
330
+ size="sm"
331
+ label="Upload image"
332
+ description="PNG, JPG · 150×100px"
333
+ />
334
+ </Field>
335
+ </div>
336
+ </div>
337
+ </div>
338
+ );
339
+ }
340
+
341
+ // ---------------------------------------------------------------------------
342
+ // Step 4a — Invite Staff
343
+ // ---------------------------------------------------------------------------
344
+
345
+ export interface InviteStaffViewProps {
346
+ onNext: () => void;
347
+ onPrev: () => void;
348
+ }
349
+
350
+ export function InviteStaffView({
351
+ onNext: _onNext,
352
+ onPrev: _onPrev,
353
+ }: InviteStaffViewProps) {
354
+ const [staffList, setStaffList] = useState<StaffMember[]>([
355
+ { id: "1", email: "", role: "" },
356
+ ]);
357
+
358
+ const addStaff = () =>
359
+ setStaffList((p) => [
360
+ ...p,
361
+ { id: crypto.randomUUID(), email: "", role: "" },
362
+ ]);
363
+ const removeStaff = (id: string) =>
364
+ setStaffList((p) => p.filter((m) => m.id !== id));
365
+ const changeStaff = (id: string, field: "email" | "role", value: string) =>
366
+ setStaffList((p) =>
367
+ p.map((m) => (m.id === id ? { ...m, [field]: value } : m)),
368
+ );
369
+
370
+ return (
371
+ <div className="flex flex-col gap-6">
372
+ <div className="flex flex-col gap-4">
373
+ <SectionHeading>Invite Staff Members</SectionHeading>
374
+ <div className="flex flex-col gap-3 border border-border p-6">
375
+ <div className="flex items-center gap-3 w-full">
376
+ <span className="flex-1 text-sm font-medium text-foreground">
377
+ Email
378
+ </span>
379
+ <span className="w-[140px] shrink-0 text-sm font-medium text-foreground">
380
+ Role
381
+ </span>
382
+ <span className="size-8 shrink-0" />
383
+ </div>
384
+ {staffList.map((m) => (
385
+ <StaffRowItem
386
+ key={m.id}
387
+ member={m}
388
+ onRemove={removeStaff}
389
+ onChange={changeStaff}
390
+ showRemove={staffList.length > 1}
391
+ />
392
+ ))}
393
+ <Button variant="outline" onClick={addStaff} className="w-full">
394
+ <PlusIcon className="size-4" />
395
+ Add Staff
396
+ </Button>
397
+ </div>
398
+ </div>
399
+
400
+ <div className="flex flex-col gap-4">
401
+ <SectionHeading>Or Bulk Upload</SectionHeading>
402
+ <UploadCard
403
+ size="lg"
404
+ accept=".csv"
405
+ label="Drop files here"
406
+ description="Or browse files from your computer"
407
+ />
408
+ <p className="text-sm text-muted-foreground text-center">
409
+ Ensure your CSV file includes columns for:
410
+ <br />
411
+ No., First Name, Last Name, Email, Phone (Optional) and Staff Role.
412
+ </p>
413
+ <div className="flex justify-center gap-1 text-sm text-muted-foreground">
414
+ Or you can download the{" "}
415
+ <Button variant="link" className="h-auto p-0">
416
+ Template file
417
+ </Button>
418
+ </div>
419
+ </div>
420
+ </div>
421
+ );
422
+ }
423
+
424
+ // ---------------------------------------------------------------------------
425
+ // Step 4b — Payment / Seat Selection
426
+ // ---------------------------------------------------------------------------
427
+
428
+ export interface PaymentViewProps {
429
+ onNext: () => void;
430
+ onPrev: () => void;
431
+ }
432
+
433
+ export function PaymentView({
434
+ onNext: _onNext,
435
+ onPrev: _onPrev,
436
+ }: PaymentViewProps) {
437
+ const [seats, setSeats] = useState({ Admin: 1, Broker: 0, Support: 0 });
438
+ const additionalCost = Math.max(0, seats.Admin - 1) * 89 + seats.Broker * 89;
439
+ const total = BASE_PLAN_PRICE + additionalCost;
440
+
441
+ return (
442
+ <div className="flex flex-col gap-6">
443
+ <div className="border border-border px-6 py-8 flex flex-col gap-4">
444
+ <div className="flex items-start justify-between">
445
+ <div>
446
+ <p className="font-bold text-lg">Professional Plan</p>
447
+ <p className="text-muted-foreground text-sm">included 1 Broker</p>
448
+ </div>
449
+ <div className="text-right">
450
+ <p className="font-bold text-lg">
451
+ ${BASE_PLAN_PRICE}/month/company
452
+ </p>
453
+ <p className="text-muted-foreground text-sm">
454
+ Billed monthly. Cancel anytime.
455
+ </p>
456
+ </div>
457
+ </div>
458
+
459
+ <Separator />
460
+
461
+ <p className="font-semibold text-base">Total Staff seats</p>
462
+ <TooltipProvider>
463
+ {(["Admin", "Broker", "Support"] as const).map((role) => (
464
+ <div key={role} className="flex items-start justify-between">
465
+ <div className="flex flex-col gap-1">
466
+ <div className="flex items-center gap-2">
467
+ <span className="text-base w-[60px]">{role}</span>
468
+ <Tooltip>
469
+ <TooltipTrigger>
470
+ <Button variant="ghost" size="icon-sm" aria-label="Info">
471
+ <InfoIcon className="size-4" />
472
+ </Button>
473
+ </TooltipTrigger>
474
+ <TooltipContent side="top">
475
+ {ROLE_INFO[role]}
476
+ </TooltipContent>
477
+ </Tooltip>
478
+ </div>
479
+ <p className="text-xs text-muted-foreground">
480
+ {ROLE_SUBTITLE[role]}
481
+ </p>
482
+ </div>
483
+ <Input
484
+ type="number"
485
+ value={seats[role]}
486
+ onChange={(e) =>
487
+ setSeats((s) => ({
488
+ ...s,
489
+ [role]: Math.max(0, Number(e.target.value)),
490
+ }))
491
+ }
492
+ aria-label={`${role} seats`}
493
+ className="w-[76px] text-center"
494
+ />
495
+ </div>
496
+ ))}
497
+ </TooltipProvider>
498
+
499
+ <p className="text-sm text-muted-foreground">
500
+ You can add or remove seats anytime. Changes are billed monthly.
501
+ </p>
502
+
503
+ <Separator />
504
+
505
+ <TooltipProvider>
506
+ <Tooltip>
507
+ <TooltipTrigger>
508
+ <div className="flex items-center justify-between">
509
+ <p className="font-semibold text-lg">Total (Est.)</p>
510
+ <p className="font-semibold text-lg">${total}</p>
511
+ </div>
512
+ </TooltipTrigger>
513
+ <TooltipContent side="top">
514
+ This is an estimated amount. You will be charged at the end of the
515
+ billing period.
516
+ </TooltipContent>
517
+ </Tooltip>
518
+ </TooltipProvider>
519
+ </div>
520
+ </div>
521
+ );
522
+ }
523
+
524
+ // ---------------------------------------------------------------------------
525
+ // Step 4c — Stripe / Card Details
526
+ // ---------------------------------------------------------------------------
527
+
528
+ export interface StripeViewProps {
529
+ onPrev: () => void;
530
+ onComplete: () => void;
531
+ }
532
+
533
+ export function StripeView({
534
+ onPrev: _onPrev,
535
+ onComplete: _onComplete,
536
+ }: StripeViewProps) {
537
+ return (
538
+ <div className="flex flex-col gap-6">
539
+ <div className="border border-border p-6 flex flex-col gap-4">
540
+ <p className="font-semibold text-base text-foreground">
541
+ Payment Details
542
+ </p>
543
+ <Field>
544
+ <FieldLabel>Card Number</FieldLabel>
545
+ <div className="flex h-9 w-full border border-input bg-muted/30 px-3 py-2 text-sm text-muted-foreground items-center">
546
+ •••• •••• •••• 4242
547
+ </div>
548
+ </Field>
549
+ <div className="flex gap-4">
550
+ <Field className="flex-1">
551
+ <FieldLabel>Expiry</FieldLabel>
552
+ <div className="flex h-9 w-full border border-input bg-muted/30 px-3 py-2 text-sm text-muted-foreground items-center">
553
+ MM / YY
554
+ </div>
555
+ </Field>
556
+ <Field className="flex-1">
557
+ <FieldLabel>CVC</FieldLabel>
558
+ <div className="flex h-9 w-full border border-input bg-muted/30 px-3 py-2 text-sm text-muted-foreground items-center">
559
+ •••
560
+ </div>
561
+ </Field>
562
+ </div>
563
+ <p className="text-xs text-muted-foreground">
564
+ Powered by Stripe. Your payment information is encrypted and secure.
565
+ </p>
566
+ </div>
567
+ </div>
568
+ );
569
+ }
570
+
571
+ // ---------------------------------------------------------------------------
572
+ // Success screen
573
+ // ---------------------------------------------------------------------------
574
+
575
+ export function BackofficeSuccessStep() {
576
+ return (
577
+ <div className="flex flex-col items-center justify-center min-h-full py-16 gap-6 text-center px-4">
578
+ <div className="size-16 bg-success/10 flex items-center justify-center">
579
+ <svg
580
+ viewBox="0 0 24 24"
581
+ className="size-8 text-success"
582
+ fill="none"
583
+ stroke="currentColor"
584
+ strokeWidth={2}
585
+ >
586
+ <polyline points="20 6 9 17 4 12" />
587
+ </svg>
588
+ </div>
589
+ <div className="flex flex-col gap-2">
590
+ <h2 className="text-2xl font-bold text-foreground">You're all set!</h2>
591
+ <p className="text-muted-foreground max-w-[400px]">
592
+ You will receive an email on next steps and we will contact you for
593
+ final approval.
594
+ </p>
595
+ </div>
596
+ <div className="border border-border p-6 flex flex-col gap-4 text-left w-full max-w-[400px]">
597
+ <p className="font-semibold text-base text-foreground">
598
+ Contact us anytime if you have any concerns.
599
+ </p>
600
+ <div className="flex items-center gap-2.5">
601
+ <PhoneIcon className="size-5 text-success shrink-0" />
602
+ <span className="text-base text-foreground">0416 338 438</span>
603
+ </div>
604
+ <div className="flex items-center gap-2.5">
605
+ <CalendarIcon className="size-5 text-success shrink-0" />
606
+ <span className="text-base text-foreground">Book call back</span>
607
+ </div>
608
+ <div className="flex items-center gap-2.5">
609
+ <MailIcon className="size-5 text-success shrink-0" />
610
+ <span className="text-base text-foreground">clint@wealthx.au</span>
611
+ </div>
612
+ </div>
613
+ </div>
614
+ );
615
+ }