@wealthx/shadcn 1.4.1 → 1.5.1

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 +356 -176
  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 +367 -3
  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
@@ -345,7 +345,10 @@ function MonthView({
345
345
  // Derive year/month from today prop
346
346
  const todayDate = new Date(today + "T00:00:00");
347
347
  const grid = generateMonthGrid(todayDate.getFullYear(), todayDate.getMonth());
348
- const toIso = (d: Date) => d.toISOString().slice(0, 10);
348
+ // Use local date parts toISOString() converts to UTC first, which shifts the
349
+ // date back 1 day for UTC+ timezones (e.g. UTC+7 shows Thu booking on Wed cell).
350
+ const toIso = (d: Date) =>
351
+ `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
349
352
 
350
353
  return (
351
354
  <div className="flex flex-col">
@@ -21,6 +21,7 @@ import {
21
21
  Check,
22
22
  CircleUser,
23
23
  Clock,
24
+ ExternalLink,
24
25
  FileText,
25
26
  Mail,
26
27
  MapPin,
@@ -54,6 +55,10 @@ export interface AppointmentDetailItem {
54
55
  meetingFormat?: AppointmentMeetingFormat;
55
56
  /** Formatted location string — shown for offline meetings */
56
57
  meetingLocation?: string;
58
+ /** Phone number — shown for call meetings */
59
+ callPhone?: string;
60
+ /** Join URL — shown for google-meet and microsoft-teams meetings */
61
+ meetingLink?: string;
57
62
  }
58
63
 
59
64
  export type LoanApplicationStatus =
@@ -123,6 +128,34 @@ const STATUS_CONFIG: Record<
123
128
  },
124
129
  };
125
130
 
131
+ // ---------------------------------------------------------------------------
132
+ // Meeting format config
133
+ // ---------------------------------------------------------------------------
134
+
135
+ const ICON_CLASS = "mt-0.5 h-4 w-4 shrink-0 text-muted-foreground";
136
+
137
+ const MEETING_FORMAT_META: Record<
138
+ AppointmentMeetingFormat,
139
+ { icon: React.ReactNode; label: string }
140
+ > = {
141
+ call: { icon: <Phone className={ICON_CLASS} />, label: "Phone Call" },
142
+ "google-meet": {
143
+ icon: <Video className={ICON_CLASS} />,
144
+ label: "Google Meet",
145
+ },
146
+ "microsoft-teams": {
147
+ icon: <Users className={ICON_CLASS} />,
148
+ label: "Microsoft Teams",
149
+ },
150
+ offline: { icon: <MapPin className={ICON_CLASS} />, label: "In Person" },
151
+ };
152
+
153
+ /** Formats that use a join link rather than a phone number or physical location */
154
+ const ONLINE_FORMATS = new Set<AppointmentMeetingFormat>([
155
+ "google-meet",
156
+ "microsoft-teams",
157
+ ]);
158
+
126
159
  // ---------------------------------------------------------------------------
127
160
  // Component
128
161
  // ---------------------------------------------------------------------------
@@ -148,6 +181,8 @@ export function AppointmentDetailSheet({
148
181
  const { variant, label, icon } = STATUS_CONFIG[appointment.status];
149
182
  const isCancelled = appointment.status === "cancelled";
150
183
  const isConfirmed = appointment.status === "confirmed";
184
+ const fmt = appointment.meetingFormat;
185
+ const meetingMeta = fmt ? MEETING_FORMAT_META[fmt] : undefined;
151
186
 
152
187
  return (
153
188
  <>
@@ -232,32 +267,32 @@ export function AppointmentDetailSheet({
232
267
  </span>
233
268
  </div>
234
269
 
235
- {/* Meeting format for offline, location is shown inline to avoid a second MapPin */}
236
- {appointment.meetingFormat && (
270
+ {fmt && meetingMeta && (
237
271
  <div className="flex items-start gap-3 text-sm">
238
- {appointment.meetingFormat === "call" && (
239
- <Phone className="h-4 w-4 shrink-0 text-muted-foreground" />
240
- )}
241
- {appointment.meetingFormat === "google-meet" && (
242
- <Video className="h-4 w-4 shrink-0 text-muted-foreground" />
243
- )}
244
- {appointment.meetingFormat === "offline" && (
245
- <MapPin className="mt-0.5 h-4 w-4 shrink-0 text-muted-foreground" />
246
- )}
272
+ {meetingMeta.icon}
247
273
  <div className="flex flex-col gap-0.5">
248
- <span className="font-medium">
249
- {appointment.meetingFormat === "call" && "Phone Call"}
250
- {appointment.meetingFormat === "google-meet" &&
251
- "Google Meet"}
252
- {appointment.meetingFormat === "offline" && "In Person"}
253
- </span>
254
- {/* Location shown below format label — only for offline, avoids duplicate MapPin */}
255
- {appointment.meetingFormat === "offline" &&
256
- appointment.meetingLocation && (
257
- <span className="text-muted-foreground">
258
- {appointment.meetingLocation}
259
- </span>
260
- )}
274
+ <span className="font-medium">{meetingMeta.label}</span>
275
+ {fmt === "call" && appointment.callPhone && (
276
+ <span className="text-muted-foreground">
277
+ {appointment.callPhone}
278
+ </span>
279
+ )}
280
+ {ONLINE_FORMATS.has(fmt) && appointment.meetingLink && (
281
+ <a
282
+ href={appointment.meetingLink}
283
+ target="_blank"
284
+ rel="noreferrer"
285
+ className="flex items-center gap-1 text-primary hover:underline"
286
+ >
287
+ <ExternalLink className="h-3 w-3" />
288
+ Join Meeting
289
+ </a>
290
+ )}
291
+ {fmt === "offline" && appointment.meetingLocation && (
292
+ <span className="text-muted-foreground">
293
+ {appointment.meetingLocation}
294
+ </span>
295
+ )}
261
296
  </div>
262
297
  </div>
263
298
  )}
@@ -14,7 +14,11 @@ export type AppointmentStatus =
14
14
  | "cancelled"
15
15
  | "rescheduled";
16
16
 
17
- export type AppointmentMeetingFormat = "call" | "google-meet" | "offline";
17
+ export type AppointmentMeetingFormat =
18
+ | "call"
19
+ | "google-meet"
20
+ | "microsoft-teams"
21
+ | "offline";
18
22
 
19
23
  // ---------------------------------------------------------------------------
20
24
  // Time slot
@@ -0,0 +1,241 @@
1
+ import * as React from "react";
2
+ import { cn } from "@/lib/utils";
3
+ import {
4
+ Accordion,
5
+ AccordionContent,
6
+ AccordionItem,
7
+ AccordionTrigger,
8
+ } from "@/components/ui/accordion";
9
+ import { Button } from "@/components/ui/button";
10
+ import { formatCurrency } from "@/lib/format-currency";
11
+
12
+ export type AssetItem = {
13
+ id: string;
14
+ description: string;
15
+ estimatedValue: number;
16
+ subLabel?: string;
17
+ };
18
+
19
+ export type AssetGroup = {
20
+ assetType: string;
21
+ label: string;
22
+ items: AssetItem[];
23
+ };
24
+
25
+ export type AssetAccordionProps = {
26
+ groups: AssetGroup[];
27
+ /** Which group values are expanded (controlled). */
28
+ openGroups?: string[];
29
+ onToggleGroup?: (assetType: string) => void;
30
+ onAddItem?: (assetType: string) => void;
31
+ onEditItem?: (assetType: string, itemId: string) => void;
32
+ onDeleteItem?: (assetType: string, itemId: string) => void;
33
+ onPrev?: () => void;
34
+ onNext?: () => void;
35
+ nextLabel?: string;
36
+ /** Accessible label for the accordion landmark region. */
37
+ "aria-label"?: string;
38
+ className?: string;
39
+ };
40
+
41
+ export function AssetAccordion({
42
+ groups,
43
+ openGroups,
44
+ onToggleGroup,
45
+ onAddItem,
46
+ onEditItem,
47
+ onDeleteItem,
48
+ onPrev,
49
+ onNext,
50
+ nextLabel = "Next",
51
+ "aria-label": ariaLabel = "Asset list",
52
+ className,
53
+ }: AssetAccordionProps) {
54
+ const totalAssets = groups
55
+ .flatMap((g) => g.items)
56
+ .reduce((sum, item) => sum + item.estimatedValue, 0);
57
+
58
+ return (
59
+ <div className={cn("flex flex-col gap-4 font-sans", className)}>
60
+ <div className="flex items-center justify-between pb-2">
61
+ <h3 className="text-sm font-semibold text-foreground">Assets</h3>
62
+ <span className="text-sm font-medium text-foreground">
63
+ Total: {formatCurrency(totalAssets)}
64
+ </span>
65
+ </div>
66
+
67
+ <Accordion
68
+ type="multiple"
69
+ aria-label={ariaLabel}
70
+ value={openGroups}
71
+ onValueChange={(vals) => {
72
+ // Fire toggle for each value change
73
+ const prev = new Set(openGroups ?? []);
74
+ const next = new Set(vals as string[]);
75
+ for (const v of next) {
76
+ if (!prev.has(v)) onToggleGroup?.(v);
77
+ }
78
+ for (const v of prev) {
79
+ if (!next.has(v)) onToggleGroup?.(v);
80
+ }
81
+ }}
82
+ >
83
+ {groups.map((group) => (
84
+ <AccordionItem key={group.assetType} value={group.assetType}>
85
+ <AccordionTrigger>
86
+ <div className="flex w-full items-center justify-between pr-2">
87
+ <span>{group.label}</span>
88
+ <span className="text-xs text-muted-foreground">
89
+ {group.items.length}{" "}
90
+ {group.items.length === 1 ? "item" : "items"} ·{" "}
91
+ {formatCurrency(
92
+ group.items.reduce((s, i) => s + i.estimatedValue, 0),
93
+ )}
94
+ </span>
95
+ </div>
96
+ </AccordionTrigger>
97
+ <AccordionContent>
98
+ <div className="flex flex-col gap-2 pb-2">
99
+ {group.items.length === 0 ? (
100
+ <p className="text-xs text-muted-foreground">
101
+ No {group.label.toLowerCase()} added yet.
102
+ </p>
103
+ ) : (
104
+ group.items.map((item) => (
105
+ <AssetItemRow
106
+ key={item.id}
107
+ item={item}
108
+ onEdit={() => onEditItem?.(group.assetType, item.id)}
109
+ onDelete={() => onDeleteItem?.(group.assetType, item.id)}
110
+ />
111
+ ))
112
+ )}
113
+ <button
114
+ type="button"
115
+ onClick={() => onAddItem?.(group.assetType)}
116
+ className="mt-1 flex items-center gap-1 text-xs text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
117
+ >
118
+ <PlusIcon className="size-3" />
119
+ Add {group.label}
120
+ </button>
121
+ </div>
122
+ </AccordionContent>
123
+ </AccordionItem>
124
+ ))}
125
+ </Accordion>
126
+
127
+ <div className="flex items-center justify-between pt-2">
128
+ {onPrev ? (
129
+ <Button variant="outline" onClick={onPrev}>
130
+ <ChevronLeftIcon className="mr-1 size-4" />
131
+ Previous
132
+ </Button>
133
+ ) : (
134
+ <span />
135
+ )}
136
+ {onNext && (
137
+ <Button onClick={onNext}>
138
+ {nextLabel}
139
+ <ChevronRightIcon className="ml-1 size-4" />
140
+ </Button>
141
+ )}
142
+ </div>
143
+ </div>
144
+ );
145
+ }
146
+
147
+ function AssetItemRow({
148
+ item,
149
+ onEdit,
150
+ onDelete,
151
+ }: {
152
+ item: AssetItem;
153
+ onEdit?: () => void;
154
+ onDelete?: () => void;
155
+ }) {
156
+ return (
157
+ <div className="flex items-center justify-between border border-border p-3">
158
+ <div className="flex flex-col gap-0.5">
159
+ <span className="text-sm font-medium text-foreground">
160
+ {item.description}
161
+ </span>
162
+ {item.subLabel && (
163
+ <span className="text-xs text-muted-foreground">{item.subLabel}</span>
164
+ )}
165
+ <span className="text-sm text-foreground">
166
+ {formatCurrency(item.estimatedValue)}
167
+ </span>
168
+ </div>
169
+ <div className="flex items-center gap-2">
170
+ <button
171
+ type="button"
172
+ onClick={onEdit}
173
+ className="text-xs text-primary hover:underline focus-visible:outline-none"
174
+ >
175
+ Edit
176
+ </button>
177
+ <button
178
+ type="button"
179
+ onClick={onDelete}
180
+ className="text-xs text-destructive hover:underline focus-visible:outline-none"
181
+ >
182
+ Delete
183
+ </button>
184
+ </div>
185
+ </div>
186
+ );
187
+ }
188
+
189
+ function PlusIcon({ className }: { className?: string }) {
190
+ return (
191
+ <svg
192
+ xmlns="http://www.w3.org/2000/svg"
193
+ viewBox="0 0 24 24"
194
+ fill="none"
195
+ stroke="currentColor"
196
+ strokeWidth={2}
197
+ strokeLinecap="round"
198
+ strokeLinejoin="round"
199
+ className={className}
200
+ aria-hidden="true"
201
+ >
202
+ <path d="M12 5v14M5 12h14" />
203
+ </svg>
204
+ );
205
+ }
206
+
207
+ function ChevronLeftIcon({ className }: { className?: string }) {
208
+ return (
209
+ <svg
210
+ xmlns="http://www.w3.org/2000/svg"
211
+ viewBox="0 0 24 24"
212
+ fill="none"
213
+ stroke="currentColor"
214
+ strokeWidth={2}
215
+ strokeLinecap="round"
216
+ strokeLinejoin="round"
217
+ className={className}
218
+ aria-hidden="true"
219
+ >
220
+ <path d="m15 18-6-6 6-6" />
221
+ </svg>
222
+ );
223
+ }
224
+
225
+ function ChevronRightIcon({ className }: { className?: string }) {
226
+ return (
227
+ <svg
228
+ xmlns="http://www.w3.org/2000/svg"
229
+ viewBox="0 0 24 24"
230
+ fill="none"
231
+ stroke="currentColor"
232
+ strokeWidth={2}
233
+ strokeLinecap="round"
234
+ strokeLinejoin="round"
235
+ className={className}
236
+ aria-hidden="true"
237
+ >
238
+ <path d="m9 18 6-6-6-6" />
239
+ </svg>
240
+ );
241
+ }
@@ -0,0 +1,157 @@
1
+ import React from "react";
2
+ import { Info } from "lucide-react";
3
+ import { Card, CardContent, CardHeader, CardTitle } from "./card";
4
+ import {
5
+ Tooltip,
6
+ TooltipContent,
7
+ TooltipProvider,
8
+ TooltipTrigger,
9
+ } from "./tooltip";
10
+ import { cn } from "@/lib/utils";
11
+ import { formatCurrencyAbbrev } from "@/lib/format-currency";
12
+
13
+ // ─── Types ───────────────────────────────────────────────────────────────────
14
+
15
+ export interface AssetsLiabilitiesSideCardProps {
16
+ /** Total liabilities in dollars (positive number — displayed as negative) */
17
+ liabilities: number;
18
+ /** Total cash assets in dollars */
19
+ assets: number;
20
+ /** Net position in dollars (may be negative) */
21
+ netPosition: number;
22
+ /** Total property value in dollars */
23
+ propertyValue: number;
24
+ title?: string;
25
+ /** Tooltip text explaining the snapshot context */
26
+ tooltipText?: string;
27
+ className?: string;
28
+ }
29
+
30
+ // ─── Metric row ──────────────────────────────────────────────────────────────
31
+
32
+ function MetricRow({
33
+ label,
34
+ value,
35
+ valueClass,
36
+ }: {
37
+ label: string;
38
+ value: string;
39
+ valueClass?: string;
40
+ }) {
41
+ return (
42
+ <div className="flex items-center justify-between gap-2">
43
+ <span className="text-sm font-medium text-foreground">{label}</span>
44
+ <span className={cn("text-base font-semibold shrink-0", valueClass)}>
45
+ {value}
46
+ </span>
47
+ </div>
48
+ );
49
+ }
50
+
51
+ // ─── Sub-row ─────────────────────────────────────────────────────────────────
52
+
53
+ function SubRow({ label, value }: { label: string; value: string }) {
54
+ return (
55
+ <div className="flex items-center justify-between gap-2 pl-3 text-sm">
56
+ <span className="text-muted-foreground">{label}</span>
57
+ <span className="font-medium text-foreground">{value}</span>
58
+ </div>
59
+ );
60
+ }
61
+
62
+ // ─── Component ────────────────────────────────────────────────────────────────
63
+
64
+ export function AssetsLiabilitiesSideCard({
65
+ liabilities,
66
+ assets,
67
+ netPosition,
68
+ propertyValue,
69
+ title = "Assets & Liabilities",
70
+ tooltipText = "Current snapshot of your financial position. These values are not affected by the date range filter.",
71
+ className,
72
+ }: AssetsLiabilitiesSideCardProps) {
73
+ const totalAssets = assets + propertyValue;
74
+ const netPositive = netPosition >= 0;
75
+
76
+ return (
77
+ <Card className={cn("flex flex-col", className)}>
78
+ <CardHeader className="pb-2">
79
+ <div className="flex items-center gap-1">
80
+ <CardTitle className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
81
+ {title}
82
+ </CardTitle>
83
+ <TooltipProvider>
84
+ <Tooltip>
85
+ <TooltipTrigger asChild>
86
+ <Info
87
+ size={13}
88
+ className="cursor-help text-muted-foreground"
89
+ aria-label="About this data"
90
+ />
91
+ </TooltipTrigger>
92
+ <TooltipContent className="max-w-56">
93
+ {tooltipText}
94
+ </TooltipContent>
95
+ </Tooltip>
96
+ </TooltipProvider>
97
+ </div>
98
+ </CardHeader>
99
+
100
+ <CardContent className="flex flex-1 flex-col gap-4 pb-5">
101
+ {/* Hero: Net Position */}
102
+ <div className="flex items-center justify-between gap-2">
103
+ <span className="text-sm font-medium text-foreground">
104
+ Net Position
105
+ </span>
106
+ <TooltipProvider>
107
+ <Tooltip>
108
+ <TooltipTrigger asChild>
109
+ <span
110
+ className={cn(
111
+ "cursor-default text-xl font-bold leading-tight shrink-0",
112
+ netPositive ? "text-foreground" : "text-destructive",
113
+ )}
114
+ >
115
+ {netPositive ? "" : "-"}
116
+ {formatCurrencyAbbrev(Math.abs(netPosition))}
117
+ </span>
118
+ </TooltipTrigger>
119
+ <TooltipContent>
120
+ {netPositive ? "" : "-"}$
121
+ {Math.abs(netPosition).toLocaleString()}
122
+ </TooltipContent>
123
+ </Tooltip>
124
+ </TooltipProvider>
125
+ </div>
126
+
127
+ {/* Divider */}
128
+ <div className="border-t border-border" />
129
+
130
+ {/* Total Assets */}
131
+ <div className="flex flex-col gap-2">
132
+ <MetricRow
133
+ label="Total Assets"
134
+ value={formatCurrencyAbbrev(totalAssets)}
135
+ valueClass="text-xl"
136
+ />
137
+ <div className="flex flex-col gap-1.5">
138
+ <SubRow label="Cash Assets" value={formatCurrencyAbbrev(assets)} />
139
+ <SubRow
140
+ label="Property Value"
141
+ value={formatCurrencyAbbrev(propertyValue)}
142
+ />
143
+ </div>
144
+ </div>
145
+
146
+ <div className="border-t border-border" />
147
+
148
+ {/* Total Liabilities */}
149
+ <MetricRow
150
+ label="Total Liabilities"
151
+ value={`-${formatCurrencyAbbrev(liabilities)}`}
152
+ valueClass="text-xl text-destructive"
153
+ />
154
+ </CardContent>
155
+ </Card>
156
+ );
157
+ }
@@ -21,7 +21,7 @@ export function AuthPageLayout({
21
21
  return (
22
22
  <div
23
23
  className={cn(
24
- "relative flex min-h-screen w-full flex-col items-center justify-center px-10 py-16 font-sans",
24
+ "relative flex min-h-screen w-full flex-col items-center justify-center px-4 py-10 font-sans sm:px-10 sm:py-16",
25
25
  className,
26
26
  )}
27
27
  >
@@ -36,7 +36,7 @@ export function AuthPageLayout({
36
36
  )}
37
37
  >
38
38
  {(title || subtitle) && (
39
- <div className="flex w-[320px] flex-col items-center gap-2 text-center">
39
+ <div className="flex w-full max-w-[320px] flex-col items-center gap-2 text-center">
40
40
  {title && (
41
41
  <h1 className="m-0 text-[30px] font-semibold leading-9 text-card-foreground">
42
42
  {title}
@@ -50,7 +50,7 @@ export function AuthPageLayout({
50
50
  </div>
51
51
  )}
52
52
 
53
- <div className={cn("w-full", wide ? "max-w-full" : "w-[320px]")}>
53
+ <div className={cn("w-full", wide ? "max-w-full" : "max-w-[320px]")}>
54
54
  {children}
55
55
  </div>
56
56
  </div>