@wealthx/shadcn 1.3.2 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/.turbo/turbo-build.log +227 -191
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{chunk-2UM72RJ7.mjs → chunk-2D3HQPFN.mjs} +12 -10
  4. package/dist/chunk-2EM2FRU6.mjs +613 -0
  5. package/dist/{chunk-FH6QVUVZ.mjs → chunk-2GIYVERS.mjs} +2 -2
  6. package/dist/chunk-2P7HP7LR.mjs +68 -0
  7. package/dist/{chunk-HISNT2MG.mjs → chunk-37AE3OM5.mjs} +5 -5
  8. package/dist/{chunk-HBZLGDIN.mjs → chunk-3ERBUVHC.mjs} +169 -110
  9. package/dist/{chunk-C7CQJNMR.mjs → chunk-3VDET466.mjs} +2 -2
  10. package/dist/{chunk-462HMNO4.mjs → chunk-4MM7LHM5.mjs} +2 -2
  11. package/dist/{chunk-QMY3AZJH.mjs → chunk-4Z66LMIQ.mjs} +2 -2
  12. package/dist/{chunk-U5X52X37.mjs → chunk-57ZXILTS.mjs} +6 -6
  13. package/dist/{chunk-2A5RRQGG.mjs → chunk-5NF6T2RS.mjs} +11 -20
  14. package/dist/{chunk-3OYFOX3X.mjs → chunk-5VOTTIXF.mjs} +2 -2
  15. package/dist/{chunk-LBMRIB3G.mjs → chunk-6AJUS7VX.mjs} +1 -1
  16. package/dist/{chunk-OODBHKG7.mjs → chunk-6HIOM2HL.mjs} +7 -4
  17. package/dist/{chunk-BDYZCBRT.mjs → chunk-6QAFGZC2.mjs} +2 -2
  18. package/dist/{chunk-U4NDAF2P.mjs → chunk-6TX73WG7.mjs} +1 -1
  19. package/dist/{chunk-GD4BJDJR.mjs → chunk-7BTFGCFC.mjs} +4 -4
  20. package/dist/{chunk-FAKPBKLT.mjs → chunk-7GWRPXHD.mjs} +4 -4
  21. package/dist/{chunk-NMOI6CQD.mjs → chunk-7YI3HEBH.mjs} +5 -5
  22. package/dist/{chunk-T4BJLT57.mjs → chunk-AE7MASLF.mjs} +5 -5
  23. package/dist/{chunk-VLQZANBF.mjs → chunk-AFML43VJ.mjs} +6 -1
  24. package/dist/chunk-BBXSNDS3.mjs +260 -0
  25. package/dist/chunk-BOW7U26Y.mjs +203 -0
  26. package/dist/{chunk-34NWQURD.mjs → chunk-BS75ICOO.mjs} +2 -2
  27. package/dist/chunk-D2NSIIXG.mjs +394 -0
  28. package/dist/{chunk-3GF7OVTP.mjs → chunk-DGNHGNYH.mjs} +2 -2
  29. package/dist/{chunk-VLARHE5V.mjs → chunk-DMXYRCHM.mjs} +6 -6
  30. package/dist/{chunk-OGOYQ7BG.mjs → chunk-DQB4EPIS.mjs} +1 -1
  31. package/dist/{chunk-MIZQHHUO.mjs → chunk-FL6DZFJK.mjs} +106 -38
  32. package/dist/{chunk-I3RZS7V2.mjs → chunk-FLL633WS.mjs} +19 -33
  33. package/dist/{chunk-PBL4OQV2.mjs → chunk-FTPBQVQ6.mjs} +4 -4
  34. package/dist/chunk-FYPSTTEJ.mjs +169 -0
  35. package/dist/{chunk-6O6KD7CE.mjs → chunk-G27TSQLQ.mjs} +6 -6
  36. package/dist/{chunk-66MI7Q4B.mjs → chunk-GT3RU6GA.mjs} +2 -2
  37. package/dist/{chunk-D6ID6M4V.mjs → chunk-GTAVSBDO.mjs} +2 -2
  38. package/dist/{chunk-24FUO7TD.mjs → chunk-H6NQTIF4.mjs} +2 -2
  39. package/dist/{chunk-7DHU4VGG.mjs → chunk-HK4HUQTV.mjs} +2 -2
  40. package/dist/chunk-I4KVSZCH.mjs +101 -0
  41. package/dist/{chunk-RGVKLTLH.mjs → chunk-IKXYTCSB.mjs} +2 -2
  42. package/dist/{chunk-Y6DWJSKZ.mjs → chunk-ISUA7DSB.mjs} +1 -1
  43. package/dist/{chunk-J5UICVJS.mjs → chunk-JPGL36WQ.mjs} +2 -2
  44. package/dist/{chunk-7XJHLGUV.mjs → chunk-JTK6VJXY.mjs} +2 -2
  45. package/dist/{chunk-7YAU5CY6.mjs → chunk-JVMXMFBB.mjs} +2 -2
  46. package/dist/{chunk-IAE3F7DR.mjs → chunk-JZY6TNIS.mjs} +21 -21
  47. package/dist/{chunk-K5A5L6T2.mjs → chunk-K4KOD3KR.mjs} +12 -12
  48. package/dist/{chunk-MBON7YRJ.mjs → chunk-K5QV4TT6.mjs} +3 -3
  49. package/dist/{chunk-IHMFS7NZ.mjs → chunk-K5VHK7CM.mjs} +21 -21
  50. package/dist/{chunk-RJI6GKVF.mjs → chunk-KCWNDYPZ.mjs} +5 -5
  51. package/dist/{chunk-UFYSFDER.mjs → chunk-KFH36NKF.mjs} +1 -1
  52. package/dist/{chunk-EBXQWIYG.mjs → chunk-KLTACJ2G.mjs} +5 -5
  53. package/dist/{chunk-3TTACBDP.mjs → chunk-KWD6GANL.mjs} +4 -4
  54. package/dist/{chunk-IOJRDS6V.mjs → chunk-L4NSRQ3T.mjs} +218 -147
  55. package/dist/{chunk-GYMYRIZP.mjs → chunk-LBTHZSBT.mjs} +2 -2
  56. package/dist/{chunk-AMQZRHEZ.mjs → chunk-LQULK2E3.mjs} +5 -5
  57. package/dist/{chunk-YJG55G2H.mjs → chunk-LR6LHDP3.mjs} +5 -5
  58. package/dist/{chunk-7PV3IWCN.mjs → chunk-M4VYX2PV.mjs} +19 -1
  59. package/dist/{chunk-P76HMUI6.mjs → chunk-MDUKXXIL.mjs} +2 -2
  60. package/dist/{chunk-LV35NGVG.mjs → chunk-N6Q5IPKT.mjs} +9 -9
  61. package/dist/{chunk-DOEO3CDL.mjs → chunk-NB3ZL36B.mjs} +1 -1
  62. package/dist/{chunk-XREGSKX3.mjs → chunk-NOOEKOWY.mjs} +5 -5
  63. package/dist/{chunk-NL3ZO62D.mjs → chunk-NT4FX27K.mjs} +1 -1
  64. package/dist/{chunk-QZ4RE6NA.mjs → chunk-NTYQWVLI.mjs} +6 -6
  65. package/dist/{chunk-ERGGHC2V.mjs → chunk-OEOOYMC2.mjs} +2 -2
  66. package/dist/{chunk-4GAWMKMI.mjs → chunk-OIKBW2QD.mjs} +291 -54
  67. package/dist/{chunk-DUJTAXMH.mjs → chunk-OKTJFDPN.mjs} +6 -6
  68. package/dist/chunk-OLKMCXAR.mjs +1219 -0
  69. package/dist/{chunk-EI5F6FMT.mjs → chunk-OWFQSXVD.mjs} +3 -3
  70. package/dist/{chunk-6DZEXFNB.mjs → chunk-P2N2PEFY.mjs} +3 -3
  71. package/dist/{chunk-NSLMILBT.mjs → chunk-P7CEBZM6.mjs} +2 -2
  72. package/dist/{chunk-7S5AESZO.mjs → chunk-PNRUH7JY.mjs} +6 -6
  73. package/dist/{chunk-ZU4NV6RG.mjs → chunk-PNSYFE3K.mjs} +2 -2
  74. package/dist/{chunk-JKGDCQTZ.mjs → chunk-QTRSCVQ3.mjs} +5 -5
  75. package/dist/{chunk-ABFDMHOR.mjs → chunk-QX7IFQSF.mjs} +5 -5
  76. package/dist/{chunk-CFMQP5QS.mjs → chunk-QXKGOMUX.mjs} +6 -6
  77. package/dist/{chunk-NQPOYKAQ.mjs → chunk-R2ON6CAN.mjs} +2 -2
  78. package/dist/{chunk-DBHJ5KC3.mjs → chunk-R4HCRDU5.mjs} +1 -1
  79. package/dist/{chunk-EWRB4PAD.mjs → chunk-RCAOCHWA.mjs} +14 -14
  80. package/dist/{chunk-EFRENWEJ.mjs → chunk-RSUIPKGX.mjs} +2 -2
  81. package/dist/{chunk-DGHAXJBN.mjs → chunk-S2FKV4M5.mjs} +5 -5
  82. package/dist/{chunk-RGU7HOEC.mjs → chunk-SET2ANTY.mjs} +5 -7
  83. package/dist/chunk-SFH2NJEJ.mjs +47 -0
  84. package/dist/{chunk-6AW4KJHE.mjs → chunk-SIVYAI3M.mjs} +12 -12
  85. package/dist/{chunk-5FQIKDKP.mjs → chunk-THVO2N47.mjs} +8 -8
  86. package/dist/{chunk-JMHR3YGZ.mjs → chunk-TLAWKTSA.mjs} +3 -3
  87. package/dist/{chunk-HVY6KCCF.mjs → chunk-TOWTPLRC.mjs} +68 -72
  88. package/dist/{chunk-6JQFUE5I.mjs → chunk-UALR6JGV.mjs} +2 -2
  89. package/dist/{chunk-N6TNTQL6.mjs → chunk-UJZ4UHWI.mjs} +9 -11
  90. package/dist/{chunk-MARPPFOJ.mjs → chunk-UNACI2YK.mjs} +2 -2
  91. package/dist/{chunk-3NCUZIFP.mjs → chunk-V6XGXYCJ.mjs} +7 -7
  92. package/dist/chunk-VB5M6OZQ.mjs +57 -0
  93. package/dist/{chunk-5IS7G74I.mjs → chunk-VY5NEUP7.mjs} +6 -6
  94. package/dist/{chunk-JHJHG4GO.mjs → chunk-WE4YKBDE.mjs} +2 -2
  95. package/dist/{chunk-BKNFWEH2.mjs → chunk-WL6WVV47.mjs} +3 -3
  96. package/dist/{chunk-FWCSY2DS.mjs → chunk-WNQUEZJF.mjs} +22 -1
  97. package/dist/{chunk-2Y7YJKPE.mjs → chunk-WZ6UJCBL.mjs} +1 -1
  98. package/dist/{chunk-UMTOX62O.mjs → chunk-XYPW2XA5.mjs} +13 -10
  99. package/dist/chunk-Y2MTAVAK.mjs +34 -0
  100. package/dist/{chunk-6CR5N2JW.mjs → chunk-YCWLFG27.mjs} +6 -6
  101. package/dist/{chunk-PU4YZQXV.mjs → chunk-YE67AALL.mjs} +12 -12
  102. package/dist/{chunk-M3FV7LOK.mjs → chunk-YEWNFK5S.mjs} +6 -1
  103. package/dist/{chunk-R3VSPKNP.mjs → chunk-YIZHS72Z.mjs} +11 -12
  104. package/dist/{chunk-7PYJD5JI.mjs → chunk-ZEDMKQK2.mjs} +2 -2
  105. package/dist/{chunk-N2PT566P.mjs → chunk-ZFCDYW6N.mjs} +4 -4
  106. package/dist/chunk-ZGQIVGIN.mjs +57 -0
  107. package/dist/{chunk-Q2BGOAMG.mjs → chunk-ZKWXDQDG.mjs} +4 -4
  108. package/dist/{chunk-GHC7LLUX.mjs → chunk-ZOWL2L5J.mjs} +5 -5
  109. package/dist/components/ui/accordion.mjs +3 -3
  110. package/dist/components/ui/add-column-modal.js +2 -2
  111. package/dist/components/ui/add-column-modal.mjs +10 -10
  112. package/dist/components/ui/add-lead-modal.js +424 -82
  113. package/dist/components/ui/add-lead-modal.mjs +12 -9
  114. package/dist/components/ui/advisor-card.js +2 -2
  115. package/dist/components/ui/advisor-card.mjs +8 -8
  116. package/dist/components/ui/ai-assistant-drawer.js +2 -2
  117. package/dist/components/ui/ai-assistant-drawer.mjs +9 -9
  118. package/dist/components/ui/ai-builder.js +958 -0
  119. package/dist/components/ui/ai-builder.mjs +25 -0
  120. package/dist/components/ui/ai-conversations.js +2045 -0
  121. package/dist/components/ui/ai-conversations.mjs +41 -0
  122. package/dist/components/ui/alert-dialog.js +2 -2
  123. package/dist/components/ui/alert-dialog.mjs +5 -5
  124. package/dist/components/ui/alert.mjs +3 -3
  125. package/dist/components/ui/appointment-action-dialogs.js +19 -3
  126. package/dist/components/ui/appointment-action-dialogs.mjs +15 -14
  127. package/dist/components/ui/appointment-availability-settings.js +181 -111
  128. package/dist/components/ui/appointment-availability-settings.mjs +20 -18
  129. package/dist/components/ui/appointment-book-dialog.js +113 -24
  130. package/dist/components/ui/appointment-book-dialog.mjs +21 -20
  131. package/dist/components/ui/appointment-calendar-view.js +19 -3
  132. package/dist/components/ui/appointment-calendar-view.mjs +10 -9
  133. package/dist/components/ui/appointment-detail-sheet.js +19 -3
  134. package/dist/components/ui/appointment-detail-sheet.mjs +18 -17
  135. package/dist/components/ui/appointment-gmail-connect.js +49 -89
  136. package/dist/components/ui/appointment-gmail-connect.mjs +8 -9
  137. package/dist/components/ui/appointment-mini-card.js +2 -2
  138. package/dist/components/ui/appointment-mini-card.mjs +6 -6
  139. package/dist/components/ui/appointment-time-slot-picker.mjs +6 -6
  140. package/dist/components/ui/appointment-upcoming-card.js +19 -3
  141. package/dist/components/ui/appointment-upcoming-card.mjs +15 -14
  142. package/dist/components/ui/auth-logo.js +95 -0
  143. package/dist/components/ui/auth-logo.mjs +8 -0
  144. package/dist/components/ui/auth-page-layout.js +108 -0
  145. package/dist/components/ui/auth-page-layout.mjs +8 -0
  146. package/dist/components/ui/avatar.mjs +3 -3
  147. package/dist/components/ui/backoffice-alert-history-chart.js +2 -2
  148. package/dist/components/ui/backoffice-alert-history-chart.mjs +9 -9
  149. package/dist/components/ui/backoffice-alerts-chart.js +2 -2
  150. package/dist/components/ui/backoffice-alerts-chart.mjs +11 -11
  151. package/dist/components/ui/backoffice-connections-chart.js +2 -2
  152. package/dist/components/ui/backoffice-connections-chart.mjs +11 -11
  153. package/dist/components/ui/backoffice-contact-history-chart.js +2 -2
  154. package/dist/components/ui/backoffice-contact-history-chart.mjs +9 -9
  155. package/dist/components/ui/badge.mjs +4 -4
  156. package/dist/components/ui/borrowing-capacity-line-chart.js +145 -132
  157. package/dist/components/ui/borrowing-capacity-line-chart.mjs +9 -9
  158. package/dist/components/ui/button.js +2 -2
  159. package/dist/components/ui/button.mjs +4 -4
  160. package/dist/components/ui/calendar.js +17 -3
  161. package/dist/components/ui/calendar.mjs +6 -5
  162. package/dist/components/ui/card.mjs +3 -3
  163. package/dist/components/ui/cash-balance-line-chart.js +158 -158
  164. package/dist/components/ui/cash-balance-line-chart.mjs +9 -9
  165. package/dist/components/ui/cashflow-bar-chart.js +2 -2
  166. package/dist/components/ui/cashflow-bar-chart.mjs +9 -9
  167. package/dist/components/ui/chat-widget-primitives.js +573 -0
  168. package/dist/components/ui/chat-widget-primitives.mjs +21 -0
  169. package/dist/components/ui/chat-widget.js +1268 -0
  170. package/dist/components/ui/chat-widget.mjs +29 -0
  171. package/dist/components/ui/checkbox.mjs +3 -3
  172. package/dist/components/ui/chip.js +2 -2
  173. package/dist/components/ui/chip.mjs +6 -6
  174. package/dist/components/ui/color-picker.js +2 -2
  175. package/dist/components/ui/color-picker.mjs +7 -7
  176. package/dist/components/ui/combobox.mjs +3 -3
  177. package/dist/components/ui/data-table.js +2 -2
  178. package/dist/components/ui/data-table.mjs +12 -12
  179. package/dist/components/ui/date-picker.js +22 -6
  180. package/dist/components/ui/date-picker.mjs +9 -8
  181. package/dist/components/ui/dialog.js +2 -2
  182. package/dist/components/ui/dialog.mjs +5 -5
  183. package/dist/components/ui/document-checklist-template.js +630 -0
  184. package/dist/components/ui/document-checklist-template.mjs +15 -0
  185. package/dist/components/ui/drawer.js +2 -2
  186. package/dist/components/ui/drawer.mjs +3 -3
  187. package/dist/components/ui/dropdown-menu.mjs +3 -3
  188. package/dist/components/ui/empty.mjs +3 -3
  189. package/dist/components/ui/expense-bar-chart.js +2 -2
  190. package/dist/components/ui/expense-bar-chart.mjs +9 -9
  191. package/dist/components/ui/field.mjs +5 -5
  192. package/dist/components/ui/financial-cards.js +431 -291
  193. package/dist/components/ui/financial-cards.mjs +10 -9
  194. package/dist/components/ui/financial-drawers.js +4 -4
  195. package/dist/components/ui/financial-drawers.mjs +8 -8
  196. package/dist/components/ui/financial-primitives.mjs +3 -3
  197. package/dist/components/ui/financial-sections.js +8 -9
  198. package/dist/components/ui/financial-sections.mjs +12 -12
  199. package/dist/components/ui/form-primitives.mjs +8 -8
  200. package/dist/components/ui/income-bar-chart.js +2 -2
  201. package/dist/components/ui/income-bar-chart.mjs +9 -9
  202. package/dist/components/ui/input-group.js +2 -2
  203. package/dist/components/ui/input-group.mjs +7 -7
  204. package/dist/components/ui/input-otp.mjs +3 -3
  205. package/dist/components/ui/input.mjs +3 -3
  206. package/dist/components/ui/kanban-column.js +19 -23
  207. package/dist/components/ui/kanban-column.mjs +14 -14
  208. package/dist/components/ui/label.mjs +3 -3
  209. package/dist/components/ui/onboarding-layout.js +476 -0
  210. package/dist/components/ui/onboarding-layout.mjs +11 -0
  211. package/dist/components/ui/opportunity-card.js +2 -2
  212. package/dist/components/ui/opportunity-card.mjs +12 -12
  213. package/dist/components/ui/opportunity-edit-modals.js +22 -6
  214. package/dist/components/ui/opportunity-edit-modals.mjs +21 -20
  215. package/dist/components/ui/opportunity-summary-tab.js +991 -674
  216. package/dist/components/ui/opportunity-summary-tab.mjs +26 -26
  217. package/dist/components/ui/page-header.mjs +3 -3
  218. package/dist/components/ui/page-top-bar.mjs +3 -3
  219. package/dist/components/ui/pagination.js +2 -2
  220. package/dist/components/ui/pagination.mjs +6 -6
  221. package/dist/components/ui/password-strength-tooltip.js +197 -0
  222. package/dist/components/ui/password-strength-tooltip.mjs +11 -0
  223. package/dist/components/ui/pipeline-alerts.mjs +3 -3
  224. package/dist/components/ui/pipeline-board.js +19 -23
  225. package/dist/components/ui/pipeline-board.mjs +18 -18
  226. package/dist/components/ui/pipeline-chart.js +12 -6
  227. package/dist/components/ui/pipeline-chart.mjs +4 -3
  228. package/dist/components/ui/pipeline-dialogs.js +28 -12
  229. package/dist/components/ui/pipeline-dialogs.mjs +14 -13
  230. package/dist/components/ui/pipeline-primitives.mjs +6 -6
  231. package/dist/components/ui/popover.mjs +3 -3
  232. package/dist/components/ui/progress.mjs +3 -3
  233. package/dist/components/ui/property-cashflow-doughnut-chart.js +2 -2
  234. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +9 -9
  235. package/dist/components/ui/property-debt-equity-doughnut-chart.js +2 -2
  236. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +9 -9
  237. package/dist/components/ui/property-mobile-estimate-line-chart.js +2 -2
  238. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +9 -9
  239. package/dist/components/ui/radio-group.mjs +3 -3
  240. package/dist/components/ui/select.mjs +3 -3
  241. package/dist/components/ui/separator.mjs +3 -3
  242. package/dist/components/ui/sheet.mjs +3 -3
  243. package/dist/components/ui/sidebar-nav.js +6 -5
  244. package/dist/components/ui/sidebar-nav.mjs +7 -7
  245. package/dist/components/ui/skeleton.mjs +3 -3
  246. package/dist/components/ui/slider.mjs +3 -3
  247. package/dist/components/ui/sonner.mjs +2 -2
  248. package/dist/components/ui/spinner.mjs +3 -3
  249. package/dist/components/ui/stage-timeline.mjs +10 -10
  250. package/dist/components/ui/stepper.mjs +3 -3
  251. package/dist/components/ui/switch.mjs +3 -3
  252. package/dist/components/ui/table.mjs +3 -3
  253. package/dist/components/ui/tabs.mjs +3 -3
  254. package/dist/components/ui/textarea.mjs +3 -3
  255. package/dist/components/ui/toggle-group.mjs +4 -4
  256. package/dist/components/ui/toggle.mjs +3 -3
  257. package/dist/components/ui/tooltip.mjs +3 -3
  258. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +2 -2
  259. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +9 -9
  260. package/dist/components/ui/transactions-income-expense-bar-chart.js +2 -2
  261. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +9 -9
  262. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +2 -2
  263. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +9 -9
  264. package/dist/components/ui/two-fa-setup-form.js +612 -0
  265. package/dist/components/ui/two-fa-setup-form.mjs +16 -0
  266. package/dist/components/ui/upload-card.js +187 -0
  267. package/dist/components/ui/upload-card.mjs +10 -0
  268. package/dist/components/ui/video-background.js +118 -0
  269. package/dist/components/ui/video-background.mjs +8 -0
  270. package/dist/index.js +12674 -9311
  271. package/dist/index.mjs +341 -245
  272. package/dist/lib/colors.mjs +1 -1
  273. package/dist/lib/theme-provider.mjs +1 -1
  274. package/dist/lib/typography.mjs +2 -2
  275. package/dist/lib/utils.js +8 -2
  276. package/dist/lib/utils.mjs +6 -4
  277. package/dist/styles.css +1 -1
  278. package/package.json +61 -1
  279. package/src/components/index.tsx +126 -1
  280. package/src/components/ui/add-lead-modal.tsx +101 -142
  281. package/src/components/ui/ai-builder.tsx +560 -0
  282. package/src/components/ui/ai-conversations.tsx +1690 -0
  283. package/src/components/ui/appointment-availability-settings.tsx +152 -101
  284. package/src/components/ui/appointment-book-dialog.tsx +138 -24
  285. package/src/components/ui/appointment-calendar-view.tsx +2 -3
  286. package/src/components/ui/appointment-gmail-connect.tsx +23 -42
  287. package/src/components/ui/auth-logo.tsx +50 -0
  288. package/src/components/ui/auth-page-layout.tsx +59 -0
  289. package/src/components/ui/borrowing-capacity-line-chart.tsx +10 -8
  290. package/src/components/ui/button.tsx +2 -2
  291. package/src/components/ui/calendar.tsx +2 -1
  292. package/src/components/ui/cash-balance-line-chart.tsx +11 -20
  293. package/src/components/ui/chart-shared.tsx +10 -0
  294. package/src/components/ui/chat-widget-primitives.tsx +336 -0
  295. package/src/components/ui/chat-widget.tsx +822 -0
  296. package/src/components/ui/document-checklist-template.tsx +264 -0
  297. package/src/components/ui/drawer.tsx +2 -2
  298. package/src/components/ui/financial-cards.tsx +176 -78
  299. package/src/components/ui/financial-drawers.tsx +2 -2
  300. package/src/components/ui/financial-sections.tsx +1 -1
  301. package/src/components/ui/kanban-column.tsx +2 -5
  302. package/src/components/ui/onboarding-layout.tsx +109 -0
  303. package/src/components/ui/opportunity-summary-tab.tsx +469 -142
  304. package/src/components/ui/password-strength-tooltip.tsx +70 -0
  305. package/src/components/ui/pipeline-chart.tsx +2 -6
  306. package/src/components/ui/sidebar-nav.tsx +1 -11
  307. package/src/components/ui/two-fa-setup-form.tsx +229 -0
  308. package/src/components/ui/upload-card.tsx +98 -0
  309. package/src/components/ui/video-background.tsx +55 -0
  310. package/src/lib/format-date.ts +26 -0
  311. package/src/lib/utils.ts +11 -0
  312. package/src/styles/styles-css.ts +1 -1
  313. package/tsup.config.ts +13 -0
@@ -62,13 +62,12 @@ __export(opportunity_summary_tab_exports, {
62
62
  OpportunitySummaryTab: () => OpportunitySummaryTab
63
63
  });
64
64
  module.exports = __toCommonJS(opportunity_summary_tab_exports);
65
+ var React10 = __toESM(require("react"));
65
66
  var import_react4 = require("react");
66
67
  var import_lucide_react12 = require("lucide-react");
67
68
 
68
- // src/components/ui/button.tsx
69
- var import_react = require("react");
69
+ // src/components/ui/badge.tsx
70
70
  var import_class_variance_authority = require("class-variance-authority");
71
- var import_lucide_react = require("lucide-react");
72
71
 
73
72
  // src/lib/utils.ts
74
73
  var import_clsx = require("clsx");
@@ -156,9 +155,213 @@ var Slot = React.forwardRef(
156
155
  );
157
156
  Slot.displayName = "Slot";
158
157
 
159
- // src/components/ui/button.tsx
158
+ // src/components/ui/badge.tsx
160
159
  var import_jsx_runtime = require("react/jsx-runtime");
161
- var buttonVariants = (0, import_class_variance_authority.cva)(
160
+ var badgeVariants = (0, import_class_variance_authority.cva)(
161
+ "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2.5 py-0.5 text-xs font-medium font-sans whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",
162
+ {
163
+ variants: {
164
+ variant: {
165
+ default: "border-primary/40 bg-primary/10 text-foreground [a&]:hover:bg-primary/15",
166
+ secondary: "border-border bg-muted text-muted-foreground [a&]:hover:bg-muted/80",
167
+ destructive: "border-destructive/40 bg-destructive/10 text-destructive-text focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/15",
168
+ success: "border-success/40 bg-success/10 text-success-text [a&]:hover:bg-success/15",
169
+ warning: "border-warning/40 bg-warning/10 text-warning-text [a&]:hover:bg-warning/15",
170
+ info: "border-info/40 bg-info/10 text-info-text [a&]:hover:bg-info/15",
171
+ outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
172
+ ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
173
+ link: "text-primary underline-offset-4 [a&]:hover:underline"
174
+ }
175
+ },
176
+ defaultVariants: {
177
+ variant: "default"
178
+ }
179
+ }
180
+ );
181
+ function Badge(_a) {
182
+ var _b = _a, {
183
+ className,
184
+ variant = "default",
185
+ asChild = false
186
+ } = _b, props = __objRest(_b, [
187
+ "className",
188
+ "variant",
189
+ "asChild"
190
+ ]);
191
+ const Comp = asChild ? Slot : "span";
192
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
193
+ Comp,
194
+ __spreadValues({
195
+ className: cn(badgeVariants({ variant }), className),
196
+ "data-slot": "badge",
197
+ "data-variant": variant
198
+ }, props)
199
+ );
200
+ }
201
+
202
+ // src/components/ui/select.tsx
203
+ var import_lucide_react = require("lucide-react");
204
+ var import_select = require("@base-ui/react/select");
205
+
206
+ // src/lib/theme-provider.tsx
207
+ var import_react = require("react");
208
+ var import_jsx_runtime2 = require("react/jsx-runtime");
209
+ var ThemeVarsContext = (0, import_react.createContext)({});
210
+ function useThemeVars() {
211
+ return (0, import_react.useContext)(ThemeVarsContext);
212
+ }
213
+
214
+ // src/components/ui/select.tsx
215
+ var import_jsx_runtime3 = require("react/jsx-runtime");
216
+ function Select(_a) {
217
+ var props = __objRest(_a, []);
218
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_select.Select.Root, __spreadValues({ "data-slot": "select" }, props));
219
+ }
220
+ function SelectValue(_a) {
221
+ var props = __objRest(_a, []);
222
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_select.Select.Value, __spreadValues({ "data-slot": "select-value" }, props));
223
+ }
224
+ function SelectTrigger(_a) {
225
+ var _b = _a, {
226
+ className,
227
+ size = "default",
228
+ children
229
+ } = _b, props = __objRest(_b, [
230
+ "className",
231
+ "size",
232
+ "children"
233
+ ]);
234
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
235
+ import_select.Select.Trigger,
236
+ __spreadProps(__spreadValues({
237
+ className: cn(
238
+ "flex w-fit items-center justify-between gap-2 border border-input bg-transparent px-3 py-2 text-body-medium whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 data-popup-open:border-primary data-popup-open:ring-[3px] data-popup-open:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-placeholder:font-normal data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
239
+ className
240
+ ),
241
+ "data-size": size,
242
+ "data-slot": "select-trigger"
243
+ }, props), {
244
+ children: [
245
+ children,
246
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_select.Select.Icon, { className: "transition-transform duration-200 data-popup-open:rotate-180", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.ChevronDownIcon, { className: "size-4 opacity-50" }) })
247
+ ]
248
+ })
249
+ );
250
+ }
251
+ function SelectContent(_a) {
252
+ var _b = _a, {
253
+ className,
254
+ children,
255
+ style
256
+ } = _b, props = __objRest(_b, [
257
+ "className",
258
+ "children",
259
+ "style"
260
+ ]);
261
+ const themeVars = useThemeVars();
262
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_select.Select.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
263
+ import_select.Select.Positioner,
264
+ {
265
+ className: "z-[200]",
266
+ align: "start",
267
+ alignItemWithTrigger: false,
268
+ sideOffset: 4,
269
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
270
+ import_select.Select.Popup,
271
+ __spreadProps(__spreadValues({
272
+ className: cn(
273
+ "relative max-h-[var(--available-height)] min-w-[var(--anchor-width,8rem)] overflow-x-hidden overflow-y-auto border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:zoom-out-95 data-ending-style:fill-mode-forwards data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
274
+ className
275
+ ),
276
+ "data-slot": "select-content",
277
+ style: __spreadValues(__spreadValues({}, themeVars), style)
278
+ }, props), {
279
+ children: [
280
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SelectScrollUpButton, {}),
281
+ children,
282
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SelectScrollDownButton, {})
283
+ ]
284
+ })
285
+ )
286
+ }
287
+ ) });
288
+ }
289
+ function SelectItem(_a) {
290
+ var _b = _a, {
291
+ className,
292
+ children
293
+ } = _b, props = __objRest(_b, [
294
+ "className",
295
+ "children"
296
+ ]);
297
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
298
+ import_select.Select.Item,
299
+ __spreadProps(__spreadValues({
300
+ className: cn(
301
+ "relative flex w-full cursor-default items-center gap-2 py-1.5 pr-8 pl-2 text-body-small outline-hidden select-none data-highlighted:bg-primary/5 data-highlighted:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
302
+ className
303
+ ),
304
+ "data-slot": "select-item"
305
+ }, props), {
306
+ children: [
307
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
308
+ "span",
309
+ {
310
+ className: "absolute right-2 flex size-3.5 items-center justify-center",
311
+ "data-slot": "select-item-indicator",
312
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_select.Select.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.CheckIcon, { className: "size-4" }) })
313
+ }
314
+ ),
315
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_select.Select.ItemText, { children })
316
+ ]
317
+ })
318
+ );
319
+ }
320
+ function SelectScrollUpButton(_a) {
321
+ var _b = _a, {
322
+ className
323
+ } = _b, props = __objRest(_b, [
324
+ "className"
325
+ ]);
326
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
327
+ import_select.Select.ScrollUpArrow,
328
+ __spreadProps(__spreadValues({
329
+ className: cn(
330
+ "flex cursor-default items-center justify-center py-1",
331
+ className
332
+ ),
333
+ "data-slot": "select-scroll-up-button"
334
+ }, props), {
335
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.ChevronUpIcon, { className: "size-4" })
336
+ })
337
+ );
338
+ }
339
+ function SelectScrollDownButton(_a) {
340
+ var _b = _a, {
341
+ className
342
+ } = _b, props = __objRest(_b, [
343
+ "className"
344
+ ]);
345
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
346
+ import_select.Select.ScrollDownArrow,
347
+ __spreadProps(__spreadValues({
348
+ className: cn(
349
+ "flex cursor-default items-center justify-center py-1",
350
+ className
351
+ ),
352
+ "data-slot": "select-scroll-down-button"
353
+ }, props), {
354
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.ChevronDownIcon, { className: "size-4" })
355
+ })
356
+ );
357
+ }
358
+
359
+ // src/components/ui/button.tsx
360
+ var import_react2 = require("react");
361
+ var import_class_variance_authority2 = require("class-variance-authority");
362
+ var import_lucide_react2 = require("lucide-react");
363
+ var import_jsx_runtime4 = require("react/jsx-runtime");
364
+ var buttonVariants = (0, import_class_variance_authority2.cva)(
162
365
  "inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 font-sans text-button whitespace-nowrap transition-all active:scale-[0.98] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
163
366
  {
164
367
  variants: {
@@ -166,9 +369,9 @@ var buttonVariants = (0, import_class_variance_authority.cva)(
166
369
  default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
167
370
  secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
168
371
  destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
169
- outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground focus-visible:ring-border/50 dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
372
+ outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground focus-visible:border-border focus-visible:ring-border/50 dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
170
373
  "outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
171
- "outline-secondary": "border border-brand-secondary text-brand-secondary bg-transparent shadow-xs hover:bg-brand-secondary/10 focus-visible:ring-brand-secondary/30",
374
+ "outline-secondary": "border border-brand-secondary text-brand-secondary bg-transparent shadow-xs hover:bg-brand-secondary/10 focus-visible:border-brand-secondary focus-visible:ring-brand-secondary/30",
172
375
  ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
173
376
  link: "text-primary underline-offset-4 hover:underline"
174
377
  },
@@ -189,7 +392,7 @@ var buttonVariants = (0, import_class_variance_authority.cva)(
189
392
  }
190
393
  }
191
394
  );
192
- var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
395
+ var Button = (0, import_react2.forwardRef)(function Button2(_a, ref) {
193
396
  var _b = _a, {
194
397
  className,
195
398
  variant,
@@ -211,7 +414,7 @@ var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
211
414
  ]);
212
415
  const Comp = asChild ? Slot : "button";
213
416
  const isIconOnly = size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg";
214
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
417
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
215
418
  Comp,
216
419
  __spreadProps(__spreadValues({
217
420
  className: cn(buttonVariants({ variant, size, className })),
@@ -222,14 +425,55 @@ var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
222
425
  ref,
223
426
  type
224
427
  }, props), {
225
- children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
226
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
428
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
429
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react2.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
227
430
  !isIconOnly && children
228
431
  ] }) : children
229
432
  })
230
433
  );
231
434
  });
232
435
 
436
+ // src/components/ui/checkbox.tsx
437
+ var import_react3 = require("react");
438
+ var import_lucide_react3 = require("lucide-react");
439
+ var import_checkbox = require("@base-ui/react/checkbox");
440
+ var import_jsx_runtime5 = require("react/jsx-runtime");
441
+ function Checkbox(_a) {
442
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
443
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
444
+ import_checkbox.Checkbox.Root,
445
+ __spreadProps(__spreadValues({
446
+ className: cn(
447
+ "peer group inline-flex size-4 shrink-0 border border-input shadow-xs transition-all outline-none",
448
+ "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
449
+ "disabled:cursor-not-allowed disabled:opacity-50",
450
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
451
+ "data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground",
452
+ "data-indeterminate:border-primary data-indeterminate:bg-primary data-indeterminate:text-primary-foreground",
453
+ // Dark mode (upstream shadcn)
454
+ "dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-checked:bg-primary",
455
+ // Stacked (2 attr selectors) → wins over single-attr rules above
456
+ "aria-invalid:data-checked:border-destructive aria-invalid:data-checked:bg-destructive aria-invalid:data-checked:text-destructive-foreground",
457
+ "aria-invalid:data-indeterminate:border-destructive aria-invalid:data-indeterminate:bg-destructive aria-invalid:data-indeterminate:text-destructive-foreground",
458
+ className
459
+ ),
460
+ "data-slot": "checkbox"
461
+ }, props), {
462
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
463
+ import_checkbox.Checkbox.Indicator,
464
+ {
465
+ className: "grid place-content-center text-current transition-none",
466
+ "data-slot": "checkbox-indicator",
467
+ children: [
468
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.CheckIcon, { className: "size-3.5 group-data-indeterminate:hidden" }),
469
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.MinusIcon, { className: "size-3.5 hidden group-data-indeterminate:block" })
470
+ ]
471
+ }
472
+ )
473
+ })
474
+ );
475
+ }
476
+
233
477
  // src/lib/format-currency.ts
234
478
  function formatCurrency(value, options) {
235
479
  const { decimals = 0, showSign = false } = options != null ? options : {};
@@ -256,9 +500,9 @@ var PROPERTY_ASSET_TYPES = /* @__PURE__ */ new Set([
256
500
  ]);
257
501
 
258
502
  // src/components/ui/tabs.tsx
259
- var import_class_variance_authority2 = require("class-variance-authority");
503
+ var import_class_variance_authority3 = require("class-variance-authority");
260
504
  var import_tabs = require("@base-ui/react/tabs");
261
- var import_jsx_runtime2 = require("react/jsx-runtime");
505
+ var import_jsx_runtime6 = require("react/jsx-runtime");
262
506
  function Tabs(_a) {
263
507
  var _b = _a, {
264
508
  className,
@@ -267,7 +511,7 @@ function Tabs(_a) {
267
511
  "className",
268
512
  "orientation"
269
513
  ]);
270
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
514
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
271
515
  import_tabs.Tabs.Root,
272
516
  __spreadValues({
273
517
  className: cn(
@@ -279,7 +523,7 @@ function Tabs(_a) {
279
523
  }, props)
280
524
  );
281
525
  }
282
- var tabsListVariants = (0, import_class_variance_authority2.cva)(
526
+ var tabsListVariants = (0, import_class_variance_authority3.cva)(
283
527
  "group/tabs-list inline-flex w-fit items-center justify-center gap-1 rounded-none p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col",
284
528
  {
285
529
  variants: {
@@ -301,7 +545,7 @@ function TabsList(_a) {
301
545
  "className",
302
546
  "variant"
303
547
  ]);
304
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
548
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
305
549
  import_tabs.Tabs.List,
306
550
  __spreadValues({
307
551
  className: cn(tabsListVariants({ variant }), className),
@@ -312,7 +556,7 @@ function TabsList(_a) {
312
556
  }
313
557
  function TabsTrigger(_a) {
314
558
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
315
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
559
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
316
560
  import_tabs.Tabs.Tab,
317
561
  __spreadValues({
318
562
  className: cn(
@@ -349,7 +593,7 @@ function TabsTrigger(_a) {
349
593
  }
350
594
  function TabsContent(_a) {
351
595
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
352
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
596
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
353
597
  import_tabs.Tabs.Panel,
354
598
  __spreadValues({
355
599
  className: cn("flex-1 outline-none", className),
@@ -359,17 +603,17 @@ function TabsContent(_a) {
359
603
  }
360
604
 
361
605
  // src/components/ui/financial-primitives.tsx
362
- var import_jsx_runtime3 = require("react/jsx-runtime");
606
+ var import_jsx_runtime7 = require("react/jsx-runtime");
363
607
  var NO_DATA = "\u2014";
364
608
  function FinancialSectionLabel({
365
609
  children
366
610
  }) {
367
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-label-small uppercase text-muted-foreground", children });
611
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-label-small uppercase text-muted-foreground", children });
368
612
  }
369
613
  function FinancialSubsectionTitle({
370
614
  children
371
615
  }) {
372
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-label-medium uppercase text-foreground", children });
616
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-label-medium uppercase text-foreground", children });
373
617
  }
374
618
  function FinancialDetailField({
375
619
  label,
@@ -377,13 +621,13 @@ function FinancialDetailField({
377
621
  variant = "caption"
378
622
  }) {
379
623
  if (variant === "footer") {
380
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-col justify-between min-w-0", children: [
381
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-overline text-muted-foreground", children: label }),
382
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-label-medium text-foreground mt-1 break-words", children: value != null ? value : NO_DATA })
624
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex flex-col justify-between min-w-0", children: [
625
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-overline text-muted-foreground", children: label }),
626
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-label-medium text-foreground mt-1 break-words", children: value != null ? value : NO_DATA })
383
627
  ] });
384
628
  }
385
629
  const labelClass = variant === "caption" ? "block min-h-[2rem] text-caption text-muted-foreground" : "min-h-[1.75rem] text-overline text-muted-foreground";
386
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
630
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
387
631
  "div",
388
632
  {
389
633
  className: cn(
@@ -391,8 +635,8 @@ function FinancialDetailField({
391
635
  variant === "overline" && "flex flex-col gap-0.5"
392
636
  ),
393
637
  children: [
394
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: labelClass, children: label }),
395
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-label-medium text-foreground break-words", children: value != null ? value : NO_DATA })
638
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: labelClass, children: label }),
639
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-label-medium text-foreground break-words", children: value != null ? value : NO_DATA })
396
640
  ]
397
641
  }
398
642
  );
@@ -402,9 +646,9 @@ function FinancialLineItem({
402
646
  value,
403
647
  destructive
404
648
  }) {
405
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center justify-between gap-4 py-0.5", children: [
406
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-body-small text-foreground", children: label }),
407
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
649
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center justify-between gap-4 py-0.5", children: [
650
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-body-small text-foreground", children: label }),
651
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
408
652
  "span",
409
653
  {
410
654
  className: cn(
@@ -436,12 +680,12 @@ function FinancialLvrBar({
436
680
  warning: "bg-warning",
437
681
  destructive: "bg-destructive"
438
682
  }[color];
439
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-col gap-2", children: [
440
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center justify-between", children: [
441
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-body-small text-muted-foreground", children: "LVR" }),
442
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: cn("text-label-medium", textClass), children: label })
683
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex flex-col gap-2", children: [
684
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center justify-between", children: [
685
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-body-small text-muted-foreground", children: "LVR" }),
686
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: cn("text-label-medium", textClass), children: label })
443
687
  ] }),
444
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: cn("h-2.5 w-full overflow-hidden", trackClass), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
688
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: cn("h-2.5 w-full overflow-hidden", trackClass), children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
445
689
  "div",
446
690
  {
447
691
  className: cn("h-full", fillClass),
@@ -453,7 +697,7 @@ function FinancialLvrBar({
453
697
  function FinancialSubtotalFrame({
454
698
  children
455
699
  }) {
456
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "mt-auto border-t border-primary/20 bg-primary/10 px-4 py-3", children });
700
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "mt-auto border-t border-primary/20 bg-primary/10 px-4 py-3", children });
457
701
  }
458
702
  function FinancialSubtotalBlock({
459
703
  monthlyAverage,
@@ -461,7 +705,7 @@ function FinancialSubtotalBlock({
461
705
  label
462
706
  }) {
463
707
  const isSingle = monthlyAverage && !totalLast12Months;
464
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
708
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
465
709
  "div",
466
710
  {
467
711
  className: cn(
@@ -469,7 +713,7 @@ function FinancialSubtotalBlock({
469
713
  isSingle ? "justify-end" : "justify-between"
470
714
  ),
471
715
  children: [
472
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
716
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
473
717
  "div",
474
718
  {
475
719
  className: cn(
@@ -477,14 +721,14 @@ function FinancialSubtotalBlock({
477
721
  isSingle ? "text-right" : "text-left"
478
722
  ),
479
723
  children: [
480
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "min-h-[1.75rem] text-overline text-muted-foreground", children: label != null ? label : "Monthly Average" }),
481
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-label-medium text-foreground", children: monthlyAverage != null ? monthlyAverage : NO_DATA })
724
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "min-h-[1.75rem] text-overline text-muted-foreground", children: label != null ? label : "Monthly Average" }),
725
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-label-medium text-foreground", children: monthlyAverage != null ? monthlyAverage : NO_DATA })
482
726
  ]
483
727
  }
484
728
  ),
485
- !isSingle && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-col gap-0.5 text-right", children: [
486
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "min-h-[1.75rem] text-overline text-muted-foreground", children: "Total Last 12 Months" }),
487
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-label-medium text-foreground", children: totalLast12Months != null ? totalLast12Months : NO_DATA })
729
+ !isSingle && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex flex-col gap-0.5 text-right", children: [
730
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "min-h-[1.75rem] text-overline text-muted-foreground", children: "Total Last 12 Months" }),
731
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-label-medium text-foreground", children: totalLast12Months != null ? totalLast12Months : NO_DATA })
488
732
  ] })
489
733
  ]
490
734
  }
@@ -492,8 +736,8 @@ function FinancialSubtotalBlock({
492
736
  }
493
737
 
494
738
  // src/components/ui/financial-cards.tsx
495
- var React2 = __toESM(require("react"));
496
- var import_lucide_react3 = require("lucide-react");
739
+ var React3 = __toESM(require("react"));
740
+ var import_lucide_react6 = require("lucide-react");
497
741
 
498
742
  // src/lib/format-date.ts
499
743
  var import_date_fns = require("date-fns");
@@ -509,56 +753,86 @@ function formatDateShort(iso) {
509
753
  }
510
754
  }
511
755
 
512
- // src/components/ui/badge.tsx
513
- var import_class_variance_authority3 = require("class-variance-authority");
514
- var import_jsx_runtime4 = require("react/jsx-runtime");
515
- var badgeVariants = (0, import_class_variance_authority3.cva)(
516
- "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2.5 py-0.5 text-xs font-medium font-sans whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",
517
- {
518
- variants: {
519
- variant: {
520
- default: "border-primary/40 bg-primary/10 text-foreground [a&]:hover:bg-primary/15",
521
- secondary: "border-border bg-muted text-muted-foreground [a&]:hover:bg-muted/80",
522
- destructive: "border-destructive/40 bg-destructive/10 text-destructive-text focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/15",
523
- success: "border-success/40 bg-success/10 text-success-text [a&]:hover:bg-success/15",
524
- warning: "border-warning/40 bg-warning/10 text-warning-text [a&]:hover:bg-warning/15",
525
- info: "border-info/40 bg-info/10 text-info-text [a&]:hover:bg-info/15",
526
- outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
527
- ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
528
- link: "text-primary underline-offset-4 [a&]:hover:underline"
529
- }
530
- },
531
- defaultVariants: {
532
- variant: "default"
533
- }
534
- }
535
- );
536
- function Badge(_a) {
756
+ // src/components/ui/accordion.tsx
757
+ var import_lucide_react4 = require("lucide-react");
758
+ var import_accordion = require("@base-ui/react/accordion");
759
+ var import_jsx_runtime8 = require("react/jsx-runtime");
760
+ function Accordion(props) {
761
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_accordion.Accordion.Root, __spreadValues({ "data-slot": "accordion" }, props));
762
+ }
763
+ function AccordionItem(_a) {
537
764
  var _b = _a, {
538
- className,
539
- variant = "default",
540
- asChild = false
765
+ className
541
766
  } = _b, props = __objRest(_b, [
542
- "className",
543
- "variant",
544
- "asChild"
767
+ "className"
545
768
  ]);
546
- const Comp = asChild ? Slot : "span";
547
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
548
- Comp,
769
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
770
+ import_accordion.Accordion.Item,
549
771
  __spreadValues({
550
- className: cn(badgeVariants({ variant }), className),
551
- "data-slot": "badge",
552
- "data-variant": variant
772
+ className: cn("border-b", className),
773
+ "data-slot": "accordion-item"
553
774
  }, props)
554
775
  );
555
776
  }
777
+ function AccordionTrigger(_a) {
778
+ var _b = _a, {
779
+ className,
780
+ children
781
+ } = _b, props = __objRest(_b, [
782
+ "className",
783
+ "children"
784
+ ]);
785
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
786
+ import_accordion.Accordion.Trigger,
787
+ __spreadProps(__spreadValues({
788
+ className: cn(
789
+ // layout
790
+ "flex flex-1 items-center justify-between gap-4 py-4 text-left",
791
+ // typography
792
+ "text-label-medium",
793
+ // base
794
+ "rounded-none outline-none transition-[color,opacity]",
795
+ // interactive states
796
+ "hover:underline",
797
+ "focus-visible:ring-2 focus-visible:ring-foreground/30",
798
+ "disabled:pointer-events-none disabled:opacity-50",
799
+ // chevron rotation when open
800
+ "[&[data-panel-open]>svg]:rotate-180",
801
+ className
802
+ ),
803
+ "data-slot": "accordion-trigger"
804
+ }, props), {
805
+ children: [
806
+ children,
807
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react4.ChevronDownIcon, { className: "pointer-events-none size-4 shrink-0 text-muted-foreground transition-transform duration-200" })
808
+ ]
809
+ })
810
+ ) });
811
+ }
812
+ function AccordionContent(_a) {
813
+ var _b = _a, {
814
+ className,
815
+ children
816
+ } = _b, props = __objRest(_b, [
817
+ "className",
818
+ "children"
819
+ ]);
820
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
821
+ import_accordion.Accordion.Panel,
822
+ __spreadProps(__spreadValues({
823
+ className: "overflow-hidden text-body-small h-(--accordion-panel-height) transition-[height] duration-200 ease-out data-starting-style:h-0 data-ending-style:h-0",
824
+ "data-slot": "accordion-content"
825
+ }, props), {
826
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: cn("pb-4 text-muted-foreground", className), children })
827
+ })
828
+ );
829
+ }
556
830
 
557
831
  // src/components/ui/radio-group.tsx
558
- var import_lucide_react2 = require("lucide-react");
832
+ var import_lucide_react5 = require("lucide-react");
559
833
  var import_radio_group = require("@base-ui/react/radio-group");
560
834
  var import_radio = require("@base-ui/react/radio");
561
- var import_jsx_runtime5 = require("react/jsx-runtime");
835
+ var import_jsx_runtime9 = require("react/jsx-runtime");
562
836
  var CIRCLE_BASE = "inline-flex items-center justify-center aspect-square size-4 shrink-0 rounded-full border border-primary bg-background";
563
837
  var INDICATOR_DOT = "size-2 fill-background text-background";
564
838
  function RadioGroup(_a) {
@@ -567,7 +841,7 @@ function RadioGroup(_a) {
567
841
  } = _b, props = __objRest(_b, [
568
842
  "className"
569
843
  ]);
570
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
844
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
571
845
  import_radio_group.RadioGroup,
572
846
  __spreadValues({
573
847
  className: cn("grid gap-3", className),
@@ -581,7 +855,7 @@ function RadioGroupItem(_a) {
581
855
  } = _b, props = __objRest(_b, [
582
856
  "className"
583
857
  ]);
584
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
858
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
585
859
  import_radio.Radio.Root,
586
860
  __spreadProps(__spreadValues({
587
861
  className: cn(
@@ -597,11 +871,11 @@ function RadioGroupItem(_a) {
597
871
  ),
598
872
  "data-slot": "radio-group-item"
599
873
  }, props), {
600
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
874
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
601
875
  import_radio.Radio.Indicator,
602
876
  {
603
877
  "data-slot": "radio-group-indicator",
604
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react2.CircleIcon, { className: INDICATOR_DOT })
878
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_lucide_react5.CircleIcon, { className: INDICATOR_DOT })
605
879
  }
606
880
  )
607
881
  })
@@ -609,7 +883,7 @@ function RadioGroupItem(_a) {
609
883
  }
610
884
 
611
885
  // src/components/ui/financial-cards.tsx
612
- var import_jsx_runtime6 = require("react/jsx-runtime");
886
+ var import_jsx_runtime10 = require("react/jsx-runtime");
613
887
  function PropertyCard({
614
888
  address,
615
889
  type,
@@ -632,8 +906,8 @@ function PropertyCard({
632
906
  interestCharged,
633
907
  principlePaidOff
634
908
  }) {
635
- const [expanded, setExpanded] = React2.useState(false);
636
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
909
+ const [expanded, setExpanded] = React3.useState(false);
910
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
637
911
  "div",
638
912
  {
639
913
  className: cn(
@@ -641,20 +915,19 @@ function PropertyCard({
641
915
  !borderless && "border border-border"
642
916
  ),
643
917
  children: [
644
- isLinkedToBank ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
918
+ isLinkedToBank ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
645
919
  Button,
646
920
  {
647
921
  type: "button",
648
922
  variant: "ghost",
649
923
  "aria-expanded": expanded,
650
924
  onClick: () => setExpanded((prev) => !prev),
651
- className: "h-auto w-full justify-start gap-1.5 px-5 py-3 text-left",
925
+ className: "h-auto w-full justify-start gap-1.5 px-5 py-3 text-left has-[>svg]:px-5",
652
926
  children: [
653
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-label-medium text-foreground", children: address }),
654
- type && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { variant: "outline", children: type }),
655
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "flex-1" }),
656
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
657
- import_lucide_react3.ChevronDown,
927
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "flex-1 min-w-0 truncate text-label-medium text-foreground", children: address }),
928
+ type && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Badge, { className: "shrink-0", variant: "outline", children: type }),
929
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
930
+ import_lucide_react6.ChevronDown,
658
931
  {
659
932
  className: cn(
660
933
  "h-5 w-5 shrink-0 text-muted-foreground transition-transform duration-200",
@@ -664,67 +937,67 @@ function PropertyCard({
664
937
  )
665
938
  ]
666
939
  }
667
- ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center gap-1.5 px-5 py-3", children: [
668
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-label-medium text-foreground", children: address }),
669
- type && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { variant: "outline", children: type })
940
+ ) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center gap-1.5 px-5 py-3", children: [
941
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-label-medium text-foreground", children: address }),
942
+ type && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Badge, { variant: "outline", children: type })
670
943
  ] }),
671
- !isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "px-5 pb-2 text-xs italic text-muted-foreground", children: "No mortgage account linked to this property" }),
672
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
944
+ !isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "px-5 pb-2 text-xs italic text-muted-foreground", children: "No mortgage account linked to this property" }),
945
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
673
946
  "div",
674
947
  {
675
948
  className: cn(
676
949
  "grid gap-5 px-5 py-[15px]",
677
- isLinkedToBank ? "grid-cols-3" : "grid-cols-1"
950
+ isLinkedToBank ? "grid-cols-2" : "grid-cols-1"
678
951
  ),
679
952
  children: [
680
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Estimated Value", value: estimated }),
681
- isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
682
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Loan Amount", value: loanAmount }),
683
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Equity", value: equity })
953
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Estimated Value", value: estimated }),
954
+ isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
955
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Loan Amount", value: loanAmount }),
956
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "col-span-2", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Equity", value: equity }) })
684
957
  ] })
685
958
  ]
686
959
  }
687
960
  ),
688
- isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "px-5 pb-[15px]", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
961
+ isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "px-5 pb-[15px]", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
689
962
  FinancialLvrBar,
690
963
  {
691
964
  percent: lvrPercent,
692
965
  label: lvr != null ? lvr : `${lvrPercent}%`
693
966
  }
694
967
  ) }),
695
- isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
968
+ isLinkedToBank && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
696
969
  "div",
697
970
  {
698
971
  className: cn(
699
972
  "grid transition-[grid-template-rows] duration-200 ease-in-out",
700
973
  expanded ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
701
974
  ),
702
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "overflow-hidden", children: [
703
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex flex-col gap-5 border-t border-border px-5 py-[15px]", children: [
704
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialSubsectionTitle, { children: "Loan" }),
705
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-4 gap-x-4 gap-y-4", children: [
706
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
975
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "overflow-hidden", children: [
976
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-col gap-5 border-t border-border px-5 py-[15px]", children: [
977
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialSubsectionTitle, { children: "Loan" }),
978
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-4 gap-y-4", children: [
979
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
707
980
  FinancialDetailField,
708
981
  {
709
982
  label: "Name of Lender",
710
983
  value: lenderName
711
984
  }
712
985
  ),
713
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
986
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
714
987
  FinancialDetailField,
715
988
  {
716
989
  label: "Current Loan Amount",
717
990
  value: loanAmount
718
991
  }
719
992
  ),
720
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
993
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
721
994
  FinancialDetailField,
722
995
  {
723
996
  label: "Interest Rate",
724
997
  value: interestRate
725
998
  }
726
999
  ),
727
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1000
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
728
1001
  FinancialDetailField,
729
1002
  {
730
1003
  label: "Years Remaining",
@@ -732,29 +1005,29 @@ function PropertyCard({
732
1005
  }
733
1006
  )
734
1007
  ] }),
735
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-4 gap-x-4 gap-y-4", children: [
736
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1008
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-4 gap-y-4", children: [
1009
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
737
1010
  FinancialDetailField,
738
1011
  {
739
1012
  label: "Min Repayments",
740
1013
  value: minRepayments
741
1014
  }
742
1015
  ),
743
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1016
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
744
1017
  FinancialDetailField,
745
1018
  {
746
1019
  label: "Average Repayments",
747
1020
  value: averageRepayments
748
1021
  }
749
1022
  ),
750
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1023
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
751
1024
  FinancialDetailField,
752
1025
  {
753
1026
  label: "Redraw Amount",
754
1027
  value: redrawAmount
755
1028
  }
756
1029
  ),
757
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1030
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
758
1031
  FinancialDetailField,
759
1032
  {
760
1033
  label: "Offset Account",
@@ -763,8 +1036,8 @@ function PropertyCard({
763
1036
  )
764
1037
  ] })
765
1038
  ] }),
766
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-4 gap-x-4 gap-y-1", children: [
767
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1039
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-4 gap-y-1", children: [
1040
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
768
1041
  FinancialDetailField,
769
1042
  {
770
1043
  variant: "footer",
@@ -772,7 +1045,7 @@ function PropertyCard({
772
1045
  value: totalMinRepayments
773
1046
  }
774
1047
  ),
775
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1048
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
776
1049
  FinancialDetailField,
777
1050
  {
778
1051
  variant: "footer",
@@ -780,7 +1053,7 @@ function PropertyCard({
780
1053
  value: totalExtraRepayments
781
1054
  }
782
1055
  ),
783
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1056
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
784
1057
  FinancialDetailField,
785
1058
  {
786
1059
  variant: "footer",
@@ -788,7 +1061,7 @@ function PropertyCard({
788
1061
  value: interestCharged
789
1062
  }
790
1063
  ),
791
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1064
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
792
1065
  FinancialDetailField,
793
1066
  {
794
1067
  variant: "footer",
@@ -818,17 +1091,17 @@ function DebtCard({
818
1091
  totalInterestPaid,
819
1092
  yearsRemaining
820
1093
  }) {
821
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "border border-border overflow-hidden flex flex-col h-full", children: [
822
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-3 gap-5 px-5 py-[15px] border-b border-border min-h-[7rem] items-start", children: [
823
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Name of Lender", value: lenderName }),
824
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1094
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "border border-border overflow-hidden flex flex-col h-full", children: [
1095
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-3 gap-5 px-5 py-[15px] border-b border-border min-h-[7rem] items-start", children: [
1096
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Name of Lender", value: lenderName }),
1097
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
825
1098
  FinancialDetailField,
826
1099
  {
827
1100
  label: "Current Loan Amount",
828
1101
  value: currentLoanAmount
829
1102
  }
830
1103
  ),
831
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1104
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
832
1105
  FinancialDetailField,
833
1106
  {
834
1107
  label: "Current Interest Rate",
@@ -836,24 +1109,24 @@ function DebtCard({
836
1109
  }
837
1110
  )
838
1111
  ] }),
839
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "px-5 py-[15px] flex flex-col gap-5 flex-1", children: [
840
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialSubsectionTitle, { children: "Loan Stats" }),
841
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-3 gap-5", children: [
842
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1112
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "px-5 py-[15px] flex flex-col gap-5 flex-1", children: [
1113
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialSubsectionTitle, { children: "Loan Stats" }),
1114
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-3 gap-5", children: [
1115
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
843
1116
  FinancialDetailField,
844
1117
  {
845
1118
  label: "Original Loan Amount",
846
1119
  value: originalLoanAmount
847
1120
  }
848
1121
  ),
849
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1122
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
850
1123
  FinancialDetailField,
851
1124
  {
852
1125
  label: "Original Loan Term",
853
1126
  value: originalLoanTerm
854
1127
  }
855
1128
  ),
856
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1129
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
857
1130
  FinancialDetailField,
858
1131
  {
859
1132
  label: "Monthly Repayments",
@@ -861,10 +1134,10 @@ function DebtCard({
861
1134
  }
862
1135
  )
863
1136
  ] }),
864
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-3 gap-5", children: [
865
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Redraw Amount", value: redrawAmount }),
866
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Offset Account", value: offsetAmount }),
867
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1137
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-3 gap-5", children: [
1138
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Redraw Amount", value: redrawAmount }),
1139
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Offset Account", value: offsetAmount }),
1140
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
868
1141
  FinancialDetailField,
869
1142
  {
870
1143
  label: "Extra Loan Repayments",
@@ -873,8 +1146,8 @@ function DebtCard({
873
1146
  )
874
1147
  ] })
875
1148
  ] }),
876
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-3 gap-x-4 gap-y-1", children: [
877
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1149
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-3 gap-x-4 gap-y-1", children: [
1150
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
878
1151
  FinancialDetailField,
879
1152
  {
880
1153
  variant: "footer",
@@ -882,7 +1155,7 @@ function DebtCard({
882
1155
  value: totalRepaymentsMade
883
1156
  }
884
1157
  ),
885
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1158
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
886
1159
  FinancialDetailField,
887
1160
  {
888
1161
  variant: "footer",
@@ -890,7 +1163,7 @@ function DebtCard({
890
1163
  value: totalInterestPaid
891
1164
  }
892
1165
  ),
893
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1166
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
894
1167
  FinancialDetailField,
895
1168
  {
896
1169
  variant: "footer",
@@ -901,6 +1174,16 @@ function DebtCard({
901
1174
  ] }) })
902
1175
  ] });
903
1176
  }
1177
+ function ageFromDob(dobStr) {
1178
+ if (!dobStr) return null;
1179
+ const dob = new Date(dobStr);
1180
+ if (isNaN(dob.getTime())) return null;
1181
+ const today = /* @__PURE__ */ new Date();
1182
+ let age = today.getFullYear() - dob.getFullYear();
1183
+ const m = today.getMonth() - dob.getMonth();
1184
+ if (m < 0 || m === 0 && today.getDate() < dob.getDate()) age--;
1185
+ return age >= 0 ? age : null;
1186
+ }
904
1187
  function AboutCard({
905
1188
  title,
906
1189
  firstName,
@@ -911,6 +1194,7 @@ function AboutCard({
911
1194
  gender,
912
1195
  maritalStatus,
913
1196
  numDependants,
1197
+ dependants,
914
1198
  citizenStatus,
915
1199
  residentialAddress,
916
1200
  residentialStatus,
@@ -919,210 +1203,265 @@ function AboutCard({
919
1203
  driversLicence,
920
1204
  passport,
921
1205
  propertyInTrust,
922
- companyOwnership
1206
+ companyOwnership,
1207
+ borderless = false
923
1208
  }) {
924
1209
  const fullName = [title, firstName, lastName].filter(Boolean).join(" ") || "\u2014";
925
1210
  const timeAtAddress = timeAtAddressYears || timeAtAddressMonths ? [
926
1211
  timeAtAddressYears && `${timeAtAddressYears}yr`,
927
1212
  timeAtAddressMonths && `${timeAtAddressMonths}mo`
928
1213
  ].filter(Boolean).join(" ") : void 0;
929
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "border border-border overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-2 gap-x-8 gap-y-4 px-5 py-4", children: [
930
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Full Name", value: fullName }),
931
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Date of Birth", value: dob || "\u2014" }),
932
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Gender", value: gender || "\u2014" }),
933
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Phone", value: phone || "\u2014" }),
934
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Email", value: email || "\u2014" }),
935
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
936
- FinancialDetailField,
937
- {
938
- label: "Marital Status",
939
- value: maritalStatus || "\u2014"
940
- }
941
- ),
942
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
943
- FinancialDetailField,
944
- {
945
- label: "No. of Dependants",
946
- value: numDependants != null ? numDependants : "\u2014"
947
- }
948
- ),
949
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
950
- FinancialDetailField,
951
- {
952
- label: "Citizenship",
953
- value: citizenStatus || "\u2014"
954
- }
955
- ),
956
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
957
- FinancialDetailField,
958
- {
959
- label: "Residential Address",
960
- value: residentialAddress || "\u2014"
961
- }
962
- ),
963
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
964
- FinancialDetailField,
965
- {
966
- label: "Residential Status",
967
- value: residentialStatus || "\u2014"
968
- }
969
- ),
970
- timeAtAddress && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Time at Address", value: timeAtAddress }),
971
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
972
- FinancialDetailField,
973
- {
974
- label: "Driver's Licence",
975
- value: driversLicence || "\u2014"
976
- }
977
- ),
978
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Passport", value: passport || "\u2014" }),
979
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
980
- FinancialDetailField,
981
- {
982
- label: "Property in Trust",
983
- value: propertyInTrust || "\u2014"
984
- }
985
- ),
986
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
987
- FinancialDetailField,
988
- {
989
- label: "Company Ownership",
990
- value: companyOwnership || "\u2014"
991
- }
992
- )
993
- ] }) });
1214
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1215
+ "div",
1216
+ {
1217
+ className: cn(
1218
+ "overflow-hidden divide-y divide-border",
1219
+ !borderless && "border border-border"
1220
+ ),
1221
+ children: [
1222
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-6 gap-y-4 px-5 py-4", children: [
1223
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Full Name", value: fullName }),
1224
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Date of Birth", value: dob || "\u2014" }),
1225
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Gender", value: gender || "\u2014" }),
1226
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1227
+ FinancialDetailField,
1228
+ {
1229
+ label: "Citizenship",
1230
+ value: citizenStatus || "\u2014"
1231
+ }
1232
+ ),
1233
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1234
+ FinancialDetailField,
1235
+ {
1236
+ label: "Driver's Licence",
1237
+ value: driversLicence || "\u2014"
1238
+ }
1239
+ ),
1240
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Passport", value: passport || "\u2014" })
1241
+ ] }),
1242
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-6 gap-y-4 px-5 py-4", children: [
1243
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Phone", value: phone || "\u2014" }),
1244
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Email", value: email || "\u2014" })
1245
+ ] }),
1246
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-6 gap-y-4 px-5 py-4", children: [
1247
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1248
+ FinancialDetailField,
1249
+ {
1250
+ label: "Marital Status",
1251
+ value: maritalStatus || "\u2014"
1252
+ }
1253
+ ),
1254
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1255
+ FinancialDetailField,
1256
+ {
1257
+ label: "No. of Dependants",
1258
+ value: numDependants != null ? numDependants : "\u2014"
1259
+ }
1260
+ ),
1261
+ dependants && dependants.map((dep, i) => {
1262
+ const age = ageFromDob(dep.dob);
1263
+ const dobFormatted = formatDateShort(dep.dob) || "\u2014";
1264
+ const value = age !== null ? `${dobFormatted} \xB7 age ${age}` : dobFormatted;
1265
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1266
+ FinancialDetailField,
1267
+ {
1268
+ label: `Dependant ${i + 1}`,
1269
+ value
1270
+ },
1271
+ i
1272
+ );
1273
+ })
1274
+ ] }),
1275
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-6 gap-y-4 px-5 py-4", children: [
1276
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "col-span-2", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1277
+ FinancialDetailField,
1278
+ {
1279
+ label: "Residential Address",
1280
+ value: residentialAddress || "\u2014"
1281
+ }
1282
+ ) }),
1283
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1284
+ FinancialDetailField,
1285
+ {
1286
+ label: "Residential Status",
1287
+ value: residentialStatus || "\u2014"
1288
+ }
1289
+ ),
1290
+ timeAtAddress && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialDetailField, { label: "Time at Address", value: timeAtAddress })
1291
+ ] }),
1292
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-4 gap-x-6 gap-y-4 px-5 py-4", children: [
1293
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1294
+ FinancialDetailField,
1295
+ {
1296
+ label: "Property in Trust",
1297
+ value: propertyInTrust || "\u2014"
1298
+ }
1299
+ ),
1300
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1301
+ FinancialDetailField,
1302
+ {
1303
+ label: "Company Ownership",
1304
+ value: companyOwnership || "\u2014"
1305
+ }
1306
+ )
1307
+ ] })
1308
+ ]
1309
+ }
1310
+ );
994
1311
  }
995
- function IncomeCard({ items, totalMonthly }) {
1312
+ function IncomeCard({
1313
+ items,
1314
+ totalMonthly,
1315
+ borderless = false
1316
+ }) {
996
1317
  if (items.length === 0) {
997
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "border border-border px-5 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: "No income recorded." }) });
1318
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: cn("px-5 py-4", !borderless && "border border-border"), children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-sm text-muted-foreground", children: "No income recorded." }) });
998
1319
  }
999
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "border border-border overflow-hidden flex flex-col", children: [
1000
- items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1001
- "div",
1002
- {
1003
- className: cn(
1004
- "flex flex-col gap-3 px-5 py-[15px]",
1005
- i < items.length - 1 && "border-b border-border"
1006
- ),
1007
- children: [
1008
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-3 gap-x-6", children: [
1009
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Type", value: item.incomeType || "\u2014" }),
1010
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1320
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1321
+ "div",
1322
+ {
1323
+ className: cn(
1324
+ "overflow-hidden flex flex-col",
1325
+ !borderless && "border border-border"
1326
+ ),
1327
+ children: [
1328
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Accordion, { openMultiple: true, children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(AccordionItem, { value: String(i), children: [
1329
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(AccordionTrigger, { className: "px-5", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-1 items-center justify-between pr-2", children: [
1330
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center gap-2", children: [
1331
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-label-medium text-foreground", children: item.incomeType }),
1332
+ item.jobTitle && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "text-body-small text-muted-foreground", children: [
1333
+ "\xB7 ",
1334
+ item.jobTitle
1335
+ ] })
1336
+ ] }),
1337
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-label-medium text-foreground", children: item.amountLabel })
1338
+ ] }) }),
1339
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(AccordionContent, { className: "px-5", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid grid-cols-3 gap-x-6 gap-y-4 pb-2 pt-1", children: [
1340
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1011
1341
  FinancialDetailField,
1012
1342
  {
1013
1343
  label: "Job Title",
1014
1344
  value: item.jobTitle || "\u2014"
1015
1345
  }
1016
1346
  ),
1017
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialDetailField, { label: "Amount", value: item.amountLabel })
1018
- ] }),
1019
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid grid-cols-3 gap-x-6", children: [
1020
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1347
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1021
1348
  FinancialDetailField,
1022
1349
  {
1023
1350
  label: "Company",
1024
1351
  value: item.companyName || "\u2014"
1025
1352
  }
1026
1353
  ),
1027
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1354
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1028
1355
  FinancialDetailField,
1029
1356
  {
1030
1357
  label: "Start Date",
1031
1358
  value: formatDateShort(item.startDate)
1032
1359
  }
1033
1360
  ),
1034
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1361
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1035
1362
  FinancialDetailField,
1036
1363
  {
1037
1364
  label: "Status",
1038
1365
  value: item.stillInPosition === void 0 ? "\u2014" : item.stillInPosition ? "Still in position" : item.endDate ? `Ended ${formatDateShort(item.endDate)}` : "No longer in position"
1039
1366
  }
1367
+ ),
1368
+ item.companyAddress && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1369
+ FinancialDetailField,
1370
+ {
1371
+ label: "Company Address",
1372
+ value: item.companyAddress
1373
+ }
1040
1374
  )
1041
- ] }),
1042
- item.companyAddress && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1043
- FinancialDetailField,
1044
- {
1045
- label: "Company Address",
1046
- value: item.companyAddress
1047
- }
1048
- )
1049
- ]
1050
- },
1051
- i
1052
- )),
1053
- totalMonthly && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1054
- FinancialSubtotalBlock,
1055
- {
1056
- monthlyAverage: totalMonthly,
1057
- label: "Total Monthly Income"
1058
- }
1059
- ) })
1060
- ] });
1375
+ ] }) })
1376
+ ] }, i)) }),
1377
+ totalMonthly && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1378
+ FinancialSubtotalBlock,
1379
+ {
1380
+ monthlyAverage: totalMonthly,
1381
+ label: "Total Monthly Income"
1382
+ }
1383
+ ) })
1384
+ ]
1385
+ }
1386
+ );
1061
1387
  }
1062
1388
  var EXPENSE_ICON_MAP = {
1063
- groceries: import_lucide_react3.ShoppingCart,
1064
- "dining out": import_lucide_react3.UtensilsCrossed,
1065
- dining: import_lucide_react3.UtensilsCrossed,
1066
- restaurants: import_lucide_react3.UtensilsCrossed,
1067
- transport: import_lucide_react3.Car,
1068
- transportation: import_lucide_react3.Car,
1069
- vehicle: import_lucide_react3.Car,
1070
- utilities: import_lucide_react3.Zap,
1071
- electricity: import_lucide_react3.Zap,
1072
- insurance: import_lucide_react3.Shield,
1073
- "council rates": import_lucide_react3.Landmark,
1074
- council: import_lucide_react3.Landmark,
1075
- rates: import_lucide_react3.Landmark,
1076
- medical: import_lucide_react3.HeartPulse,
1077
- health: import_lucide_react3.HeartPulse,
1078
- subscriptions: import_lucide_react3.RefreshCw,
1079
- subscription: import_lucide_react3.RefreshCw,
1080
- "credit card": import_lucide_react3.CreditCard,
1081
- education: import_lucide_react3.GraduationCap,
1082
- childcare: import_lucide_react3.Baby,
1083
- entertainment: import_lucide_react3.Tv,
1084
- gym: import_lucide_react3.Dumbbell,
1085
- fitness: import_lucide_react3.Dumbbell,
1086
- clothing: import_lucide_react3.Shirt,
1087
- rent: import_lucide_react3.Building2
1389
+ groceries: import_lucide_react6.ShoppingCart,
1390
+ "dining out": import_lucide_react6.UtensilsCrossed,
1391
+ dining: import_lucide_react6.UtensilsCrossed,
1392
+ restaurants: import_lucide_react6.UtensilsCrossed,
1393
+ transport: import_lucide_react6.Car,
1394
+ transportation: import_lucide_react6.Car,
1395
+ vehicle: import_lucide_react6.Car,
1396
+ utilities: import_lucide_react6.Zap,
1397
+ electricity: import_lucide_react6.Zap,
1398
+ insurance: import_lucide_react6.Shield,
1399
+ "council rates": import_lucide_react6.Landmark,
1400
+ council: import_lucide_react6.Landmark,
1401
+ rates: import_lucide_react6.Landmark,
1402
+ medical: import_lucide_react6.HeartPulse,
1403
+ health: import_lucide_react6.HeartPulse,
1404
+ subscriptions: import_lucide_react6.RefreshCw,
1405
+ subscription: import_lucide_react6.RefreshCw,
1406
+ "credit card": import_lucide_react6.CreditCard,
1407
+ education: import_lucide_react6.GraduationCap,
1408
+ childcare: import_lucide_react6.Baby,
1409
+ entertainment: import_lucide_react6.Tv,
1410
+ gym: import_lucide_react6.Dumbbell,
1411
+ fitness: import_lucide_react6.Dumbbell,
1412
+ clothing: import_lucide_react6.Shirt,
1413
+ rent: import_lucide_react6.Building2
1088
1414
  };
1089
1415
  function getExpenseIcon(expenseType) {
1090
1416
  var _a;
1091
- return (_a = EXPENSE_ICON_MAP[expenseType.toLowerCase()]) != null ? _a : import_lucide_react3.Receipt;
1417
+ return (_a = EXPENSE_ICON_MAP[expenseType.toLowerCase()]) != null ? _a : import_lucide_react6.Receipt;
1092
1418
  }
1093
- function ExpensesCard({ items, totalMonthly }) {
1419
+ function ExpensesCard({
1420
+ items,
1421
+ totalMonthly,
1422
+ borderless = false
1423
+ }) {
1094
1424
  if (items.length === 0) {
1095
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "border border-border px-5 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: "No expenses recorded." }) });
1425
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: cn("px-5 py-4", !borderless && "border border-border"), children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-sm text-muted-foreground", children: "No expenses recorded." }) });
1096
1426
  }
1097
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "border border-border overflow-hidden flex flex-col", children: [
1098
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex flex-col", children: items.map((item, i) => {
1099
- const Icon = getExpenseIcon(item.expenseType);
1100
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1101
- "div",
1102
- {
1103
- className: cn(
1104
- "flex items-center justify-between gap-4 px-5 py-2.5",
1105
- i < items.length - 1 && "border-b border-border"
1106
- ),
1107
- children: [
1108
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center gap-2.5", children: [
1109
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Icon, { className: "size-3.5 shrink-0 text-muted-foreground" }),
1110
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-body-small text-foreground", children: item.expenseType })
1111
- ] }),
1112
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-label-medium whitespace-nowrap text-destructive", children: item.amountLabel })
1113
- ]
1114
- },
1115
- item.expenseType
1116
- );
1117
- }) }),
1118
- totalMonthly && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1119
- FinancialSubtotalBlock,
1120
- {
1121
- monthlyAverage: totalMonthly,
1122
- label: "Total Monthly Expenses"
1123
- }
1124
- ) })
1125
- ] });
1427
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1428
+ "div",
1429
+ {
1430
+ className: cn(
1431
+ "overflow-hidden flex flex-col",
1432
+ !borderless && "border border-border"
1433
+ ),
1434
+ children: [
1435
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex flex-col", children: items.map((item, i) => {
1436
+ const Icon = getExpenseIcon(item.expenseType);
1437
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1438
+ "div",
1439
+ {
1440
+ className: cn(
1441
+ "flex items-center justify-between gap-4 px-5 py-2.5",
1442
+ i < items.length - 1 && "border-b border-border"
1443
+ ),
1444
+ children: [
1445
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center gap-2.5", children: [
1446
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Icon, { className: "size-3.5 shrink-0 text-muted-foreground" }),
1447
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-body-small text-foreground", children: item.expenseType })
1448
+ ] }),
1449
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-label-medium whitespace-nowrap text-destructive", children: item.amountLabel })
1450
+ ]
1451
+ },
1452
+ item.expenseType
1453
+ );
1454
+ }) }),
1455
+ totalMonthly && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FinancialSubtotalFrame, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1456
+ FinancialSubtotalBlock,
1457
+ {
1458
+ monthlyAverage: totalMonthly,
1459
+ label: "Total Monthly Expenses"
1460
+ }
1461
+ ) })
1462
+ ]
1463
+ }
1464
+ );
1126
1465
  }
1127
1466
 
1128
1467
  // src/components/ui/opportunity-edit-modals.tsx
@@ -1130,26 +1469,16 @@ var React9 = __toESM(require("react"));
1130
1469
  var import_lucide_react11 = require("lucide-react");
1131
1470
 
1132
1471
  // src/components/ui/dialog.tsx
1133
- var import_lucide_react4 = require("lucide-react");
1472
+ var import_lucide_react7 = require("lucide-react");
1134
1473
  var import_dialog = require("@base-ui/react/dialog");
1135
-
1136
- // src/lib/theme-provider.tsx
1137
- var import_react2 = require("react");
1138
- var import_jsx_runtime7 = require("react/jsx-runtime");
1139
- var ThemeVarsContext = (0, import_react2.createContext)({});
1140
- function useThemeVars() {
1141
- return (0, import_react2.useContext)(ThemeVarsContext);
1142
- }
1143
-
1144
- // src/components/ui/dialog.tsx
1145
- var import_jsx_runtime8 = require("react/jsx-runtime");
1474
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1146
1475
  function Dialog(_a) {
1147
1476
  var props = __objRest(_a, []);
1148
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_dialog.Dialog.Root, __spreadValues({ "data-slot": "dialog" }, props));
1477
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_dialog.Dialog.Root, __spreadValues({ "data-slot": "dialog" }, props));
1149
1478
  }
1150
1479
  function DialogPortal(_a) {
1151
1480
  var props = __objRest(_a, []);
1152
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_dialog.Dialog.Portal, __spreadValues({ "data-slot": "dialog-portal" }, props));
1481
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_dialog.Dialog.Portal, __spreadValues({ "data-slot": "dialog-portal" }, props));
1153
1482
  }
1154
1483
  function DialogOverlay(_a) {
1155
1484
  var _b = _a, {
@@ -1157,7 +1486,7 @@ function DialogOverlay(_a) {
1157
1486
  } = _b, props = __objRest(_b, [
1158
1487
  "className"
1159
1488
  ]);
1160
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1489
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1161
1490
  import_dialog.Dialog.Backdrop,
1162
1491
  __spreadValues({
1163
1492
  className: cn(
@@ -1203,9 +1532,9 @@ function DialogContent(_a) {
1203
1532
  const themeVars = useThemeVars();
1204
1533
  const isAuto = size === "auto";
1205
1534
  const sizeStyle = isAuto ? { minWidth: minWidth != null ? minWidth : DIALOG_AUTO_MIN_WIDTH } : { maxWidth: DIALOG_MAX_WIDTHS[size] };
1206
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(DialogPortal, { container: container != null ? container : void 0, children: [
1207
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(DialogOverlay, { style: themeVars }),
1208
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1535
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(DialogPortal, { container: container != null ? container : void 0, children: [
1536
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DialogOverlay, { style: themeVars }),
1537
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1209
1538
  import_dialog.Dialog.Popup,
1210
1539
  __spreadProps(__spreadValues({
1211
1540
  className: cn(
@@ -1224,14 +1553,14 @@ function DialogContent(_a) {
1224
1553
  }, props), {
1225
1554
  children: [
1226
1555
  children,
1227
- showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1556
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1228
1557
  import_dialog.Dialog.Close,
1229
1558
  {
1230
1559
  className: "absolute top-4 right-4 inline-flex size-7 items-center justify-center transition-colors hover:bg-foreground/5 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border focus-visible:ring-offset-0 disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1231
1560
  "data-slot": "dialog-close",
1232
1561
  children: [
1233
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react4.XIcon, {}),
1234
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "sr-only", children: "Close" })
1562
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react7.XIcon, {}),
1563
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "sr-only", children: "Close" })
1235
1564
  ]
1236
1565
  }
1237
1566
  ) : null
@@ -1244,341 +1573,113 @@ function DialogHeader(_a) {
1244
1573
  var _b = _a, {
1245
1574
  className
1246
1575
  } = _b, props = __objRest(_b, [
1247
- "className"
1248
- ]);
1249
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1250
- "div",
1251
- __spreadValues({
1252
- className: cn("flex flex-col gap-1.5", className),
1253
- "data-slot": "dialog-header"
1254
- }, props)
1255
- );
1256
- }
1257
- function DialogFooter(_a) {
1258
- var _b = _a, {
1259
- className,
1260
- showCloseButton = false,
1261
- children
1262
- } = _b, props = __objRest(_b, [
1263
- "className",
1264
- "showCloseButton",
1265
- "children"
1266
- ]);
1267
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1268
- "div",
1269
- __spreadProps(__spreadValues({
1270
- className: cn(
1271
- // WealthX: always row layout, right-aligned, separator above footer
1272
- "flex flex-row justify-end gap-2 border-t border-border pt-4",
1273
- className
1274
- ),
1275
- "data-slot": "dialog-footer"
1276
- }, props), {
1277
- children: [
1278
- children,
1279
- showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1280
- import_dialog.Dialog.Close,
1281
- {
1282
- className: cn(buttonVariants({ variant: "outline" })),
1283
- type: "button",
1284
- children: "Close"
1285
- }
1286
- ) : null
1287
- ]
1288
- })
1289
- );
1290
- }
1291
- function DialogTitle(_a) {
1292
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1293
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1294
- import_dialog.Dialog.Title,
1295
- __spreadValues({
1296
- className: cn("text-h5 leading-none", className),
1297
- "data-slot": "dialog-title"
1298
- }, props)
1299
- );
1300
- }
1301
-
1302
- // src/components/ui/input.tsx
1303
- var import_jsx_runtime9 = require("react/jsx-runtime");
1304
- function Input(_a) {
1305
- var _b = _a, { className, type } = _b, props = __objRest(_b, ["className", "type"]);
1306
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1307
- "input",
1308
- __spreadValues({
1309
- className: cn(
1310
- "h-9 w-full min-w-0 border border-input bg-transparent px-3 py-1 text-body-medium font-sans shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-label-medium file:text-foreground placeholder:font-normal placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-input/30",
1311
- "focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20",
1312
- "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
1313
- className
1314
- ),
1315
- "data-slot": "input",
1316
- type
1317
- }, props)
1318
- );
1319
- }
1320
-
1321
- // src/components/ui/label.tsx
1322
- var import_jsx_runtime10 = (
1323
- // eslint-disable-next-line jsx-a11y/label-has-associated-control -- htmlFor is passed by the consumer
1324
- require("react/jsx-runtime")
1325
- );
1326
- function Label(_a) {
1327
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1328
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1329
- "label",
1330
- __spreadValues({
1331
- className: cn(
1332
- "flex items-center gap-2 text-label-medium leading-none select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
1333
- className
1334
- ),
1335
- "data-slot": "label"
1336
- }, props)
1337
- );
1338
- }
1339
-
1340
- // src/components/ui/textarea.tsx
1341
- var import_jsx_runtime11 = require("react/jsx-runtime");
1342
- function Textarea(_a) {
1343
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1344
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1345
- "textarea",
1346
- __spreadValues({
1347
- className: cn(
1348
- // WealthX: removed shadow-xs (flat panels), added font-sans
1349
- "flex field-sizing-content min-h-16 w-full border border-input bg-transparent px-3 py-2 text-body-medium font-sans transition-[color,box-shadow] outline-none placeholder:font-normal placeholder:text-muted-foreground focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40",
1350
- className
1351
- ),
1352
- "data-slot": "textarea"
1353
- }, props)
1354
- );
1355
- }
1356
-
1357
- // src/components/ui/select.tsx
1358
- var import_lucide_react5 = require("lucide-react");
1359
- var import_select = require("@base-ui/react/select");
1360
- var import_jsx_runtime12 = require("react/jsx-runtime");
1361
- function Select(_a) {
1362
- var props = __objRest(_a, []);
1363
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_select.Select.Root, __spreadValues({ "data-slot": "select" }, props));
1364
- }
1365
- function SelectValue(_a) {
1366
- var props = __objRest(_a, []);
1367
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_select.Select.Value, __spreadValues({ "data-slot": "select-value" }, props));
1368
- }
1369
- function SelectTrigger(_a) {
1370
- var _b = _a, {
1371
- className,
1372
- size = "default",
1373
- children
1374
- } = _b, props = __objRest(_b, [
1375
- "className",
1376
- "size",
1377
- "children"
1378
- ]);
1379
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1380
- import_select.Select.Trigger,
1381
- __spreadProps(__spreadValues({
1382
- className: cn(
1383
- "flex w-fit items-center justify-between gap-2 border border-input bg-transparent px-3 py-2 text-body-medium whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 data-popup-open:border-primary data-popup-open:ring-[3px] data-popup-open:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-placeholder:font-normal data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
1384
- className
1385
- ),
1386
- "data-size": size,
1387
- "data-slot": "select-trigger"
1388
- }, props), {
1389
- children: [
1390
- children,
1391
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_select.Select.Icon, { className: "transition-transform duration-200 data-popup-open:rotate-180", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react5.ChevronDownIcon, { className: "size-4 opacity-50" }) })
1392
- ]
1393
- })
1394
- );
1395
- }
1396
- function SelectContent(_a) {
1397
- var _b = _a, {
1398
- className,
1399
- children,
1400
- style
1401
- } = _b, props = __objRest(_b, [
1402
- "className",
1403
- "children",
1404
- "style"
1576
+ "className"
1405
1577
  ]);
1406
- const themeVars = useThemeVars();
1407
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_select.Select.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1408
- import_select.Select.Positioner,
1409
- {
1410
- className: "z-[200]",
1411
- align: "start",
1412
- alignItemWithTrigger: false,
1413
- sideOffset: 4,
1414
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1415
- import_select.Select.Popup,
1416
- __spreadProps(__spreadValues({
1417
- className: cn(
1418
- "relative max-h-[var(--available-height)] min-w-[var(--anchor-width,8rem)] overflow-x-hidden overflow-y-auto border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:zoom-out-95 data-ending-style:fill-mode-forwards data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
1419
- className
1420
- ),
1421
- "data-slot": "select-content",
1422
- style: __spreadValues(__spreadValues({}, themeVars), style)
1423
- }, props), {
1424
- children: [
1425
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectScrollUpButton, {}),
1426
- children,
1427
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectScrollDownButton, {})
1428
- ]
1429
- })
1430
- )
1431
- }
1432
- ) });
1578
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1579
+ "div",
1580
+ __spreadValues({
1581
+ className: cn("flex flex-col gap-1.5", className),
1582
+ "data-slot": "dialog-header"
1583
+ }, props)
1584
+ );
1433
1585
  }
1434
- function SelectItem(_a) {
1586
+ function DialogFooter(_a) {
1435
1587
  var _b = _a, {
1436
1588
  className,
1589
+ showCloseButton = false,
1437
1590
  children
1438
1591
  } = _b, props = __objRest(_b, [
1439
1592
  "className",
1593
+ "showCloseButton",
1440
1594
  "children"
1441
1595
  ]);
1442
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1443
- import_select.Select.Item,
1596
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1597
+ "div",
1444
1598
  __spreadProps(__spreadValues({
1445
1599
  className: cn(
1446
- "relative flex w-full cursor-default items-center gap-2 py-1.5 pr-8 pl-2 text-body-small outline-hidden select-none data-highlighted:bg-primary/5 data-highlighted:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
1600
+ // WealthX: always row layout, right-aligned, separator above footer
1601
+ "flex flex-row justify-end gap-2 border-t border-border pt-4",
1447
1602
  className
1448
1603
  ),
1449
- "data-slot": "select-item"
1604
+ "data-slot": "dialog-footer"
1450
1605
  }, props), {
1451
1606
  children: [
1452
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1453
- "span",
1607
+ children,
1608
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1609
+ import_dialog.Dialog.Close,
1454
1610
  {
1455
- className: "absolute right-2 flex size-3.5 items-center justify-center",
1456
- "data-slot": "select-item-indicator",
1457
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_select.Select.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react5.CheckIcon, { className: "size-4" }) })
1611
+ className: cn(buttonVariants({ variant: "outline" })),
1612
+ type: "button",
1613
+ children: "Close"
1458
1614
  }
1459
- ),
1460
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_select.Select.ItemText, { children })
1615
+ ) : null
1461
1616
  ]
1462
1617
  })
1463
1618
  );
1464
1619
  }
1465
- function SelectScrollUpButton(_a) {
1466
- var _b = _a, {
1467
- className
1468
- } = _b, props = __objRest(_b, [
1469
- "className"
1470
- ]);
1471
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1472
- import_select.Select.ScrollUpArrow,
1473
- __spreadProps(__spreadValues({
1474
- className: cn(
1475
- "flex cursor-default items-center justify-center py-1",
1476
- className
1477
- ),
1478
- "data-slot": "select-scroll-up-button"
1479
- }, props), {
1480
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react5.ChevronUpIcon, { className: "size-4" })
1481
- })
1620
+ function DialogTitle(_a) {
1621
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1622
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1623
+ import_dialog.Dialog.Title,
1624
+ __spreadValues({
1625
+ className: cn("text-h5 leading-none", className),
1626
+ "data-slot": "dialog-title"
1627
+ }, props)
1482
1628
  );
1483
1629
  }
1484
- function SelectScrollDownButton(_a) {
1485
- var _b = _a, {
1486
- className
1487
- } = _b, props = __objRest(_b, [
1488
- "className"
1489
- ]);
1630
+
1631
+ // src/components/ui/input.tsx
1632
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1633
+ function Input(_a) {
1634
+ var _b = _a, { className, type } = _b, props = __objRest(_b, ["className", "type"]);
1490
1635
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1491
- import_select.Select.ScrollDownArrow,
1492
- __spreadProps(__spreadValues({
1636
+ "input",
1637
+ __spreadValues({
1493
1638
  className: cn(
1494
- "flex cursor-default items-center justify-center py-1",
1639
+ "h-9 w-full min-w-0 border border-input bg-transparent px-3 py-1 text-body-medium font-sans shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-label-medium file:text-foreground placeholder:font-normal placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-input/30",
1640
+ "focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20",
1641
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
1495
1642
  className
1496
1643
  ),
1497
- "data-slot": "select-scroll-down-button"
1498
- }, props), {
1499
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react5.ChevronDownIcon, { className: "size-4" })
1500
- })
1644
+ "data-slot": "input",
1645
+ type
1646
+ }, props)
1501
1647
  );
1502
1648
  }
1503
1649
 
1504
- // src/components/ui/accordion.tsx
1505
- var import_lucide_react6 = require("lucide-react");
1506
- var import_accordion = require("@base-ui/react/accordion");
1507
- var import_jsx_runtime13 = require("react/jsx-runtime");
1508
- function Accordion(props) {
1509
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_accordion.Accordion.Root, __spreadValues({ "data-slot": "accordion" }, props));
1510
- }
1511
- function AccordionItem(_a) {
1512
- var _b = _a, {
1513
- className
1514
- } = _b, props = __objRest(_b, [
1515
- "className"
1516
- ]);
1650
+ // src/components/ui/label.tsx
1651
+ var import_jsx_runtime13 = (
1652
+ // eslint-disable-next-line jsx-a11y/label-has-associated-control -- htmlFor is passed by the consumer
1653
+ require("react/jsx-runtime")
1654
+ );
1655
+ function Label(_a) {
1656
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1517
1657
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1518
- import_accordion.Accordion.Item,
1658
+ "label",
1519
1659
  __spreadValues({
1520
- className: cn("border-b", className),
1521
- "data-slot": "accordion-item"
1660
+ className: cn(
1661
+ "flex items-center gap-2 text-label-medium leading-none select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
1662
+ className
1663
+ ),
1664
+ "data-slot": "label"
1522
1665
  }, props)
1523
1666
  );
1524
1667
  }
1525
- function AccordionContent(_a) {
1526
- var _b = _a, {
1527
- className,
1528
- children
1529
- } = _b, props = __objRest(_b, [
1530
- "className",
1531
- "children"
1532
- ]);
1533
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1534
- import_accordion.Accordion.Panel,
1535
- __spreadProps(__spreadValues({
1536
- className: "overflow-hidden text-body-small h-(--accordion-panel-height) transition-[height] duration-200 ease-out data-starting-style:h-0 data-ending-style:h-0",
1537
- "data-slot": "accordion-content"
1538
- }, props), {
1539
- children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: cn("pb-4 text-muted-foreground", className), children })
1540
- })
1541
- );
1542
- }
1543
1668
 
1544
- // src/components/ui/checkbox.tsx
1545
- var import_react3 = require("react");
1546
- var import_lucide_react7 = require("lucide-react");
1547
- var import_checkbox = require("@base-ui/react/checkbox");
1669
+ // src/components/ui/textarea.tsx
1548
1670
  var import_jsx_runtime14 = require("react/jsx-runtime");
1549
- function Checkbox(_a) {
1671
+ function Textarea(_a) {
1550
1672
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1551
1673
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1552
- import_checkbox.Checkbox.Root,
1553
- __spreadProps(__spreadValues({
1674
+ "textarea",
1675
+ __spreadValues({
1554
1676
  className: cn(
1555
- "peer group inline-flex size-4 shrink-0 border border-input shadow-xs transition-all outline-none",
1556
- "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
1557
- "disabled:cursor-not-allowed disabled:opacity-50",
1558
- "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
1559
- "data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground",
1560
- "data-indeterminate:border-primary data-indeterminate:bg-primary data-indeterminate:text-primary-foreground",
1561
- // Dark mode (upstream shadcn)
1562
- "dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-checked:bg-primary",
1563
- // Stacked (2 attr selectors) → wins over single-attr rules above
1564
- "aria-invalid:data-checked:border-destructive aria-invalid:data-checked:bg-destructive aria-invalid:data-checked:text-destructive-foreground",
1565
- "aria-invalid:data-indeterminate:border-destructive aria-invalid:data-indeterminate:bg-destructive aria-invalid:data-indeterminate:text-destructive-foreground",
1677
+ // WealthX: removed shadow-xs (flat panels), added font-sans
1678
+ "flex field-sizing-content min-h-16 w-full border border-input bg-transparent px-3 py-2 text-body-medium font-sans transition-[color,box-shadow] outline-none placeholder:font-normal placeholder:text-muted-foreground focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40",
1566
1679
  className
1567
1680
  ),
1568
- "data-slot": "checkbox"
1569
- }, props), {
1570
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1571
- import_checkbox.Checkbox.Indicator,
1572
- {
1573
- className: "grid place-content-center text-current transition-none",
1574
- "data-slot": "checkbox-indicator",
1575
- children: [
1576
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react7.CheckIcon, { className: "size-3.5 group-data-indeterminate:hidden" }),
1577
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react7.MinusIcon, { className: "size-3.5 hidden group-data-indeterminate:block" })
1578
- ]
1579
- }
1580
- )
1581
- })
1681
+ "data-slot": "textarea"
1682
+ }, props)
1582
1683
  );
1583
1684
  }
1584
1685
 
@@ -1775,7 +1876,7 @@ function CalendarDayButton(_a) {
1775
1876
  defaultClassNames.day,
1776
1877
  className
1777
1878
  ),
1778
- "data-day": day.date.toLocaleDateString(),
1879
+ "data-day": formatDateShort(day.date.toISOString()),
1779
1880
  "data-range-end": modifiers.range_end,
1780
1881
  "data-range-middle": modifiers.range_middle,
1781
1882
  "data-range-start": modifiers.range_start,
@@ -2407,7 +2508,7 @@ function OwnershipSplit({
2407
2508
  }
2408
2509
 
2409
2510
  // src/components/ui/opportunity-edit-modals.tsx
2410
- var import_accordion3 = require("@base-ui/react/accordion");
2511
+ var import_accordion4 = require("@base-ui/react/accordion");
2411
2512
  var import_jsx_runtime22 = require("react/jsx-runtime");
2412
2513
  var LOAN_PURPOSES = [
2413
2514
  "Purchase a home",
@@ -2629,9 +2730,9 @@ function AccordionItemHeader({
2629
2730
  onRemove,
2630
2731
  removeLabel = "Remove item"
2631
2732
  }) {
2632
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_accordion3.Accordion.Header, { className: "flex items-center", children: [
2733
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_accordion4.Accordion.Header, { className: "flex items-center", children: [
2633
2734
  /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2634
- import_accordion3.Accordion.Trigger,
2735
+ import_accordion4.Accordion.Trigger,
2635
2736
  {
2636
2737
  className: cn(
2637
2738
  "flex flex-1 items-center justify-between gap-4 py-4 text-left",
@@ -4315,19 +4416,9 @@ function lvrColorClass(pct) {
4315
4416
  }
4316
4417
  function serviceabilityInfo(surplus) {
4317
4418
  if (surplus > 1500)
4318
- return {
4319
- label: "Likely Serviceable",
4320
- badgeClass: "bg-emerald-50 text-emerald-700 border border-emerald-200"
4321
- };
4322
- if (surplus > 0)
4323
- return {
4324
- label: "Borderline",
4325
- badgeClass: "bg-amber-50 text-amber-700 border border-amber-200"
4326
- };
4327
- return {
4328
- label: "At Risk",
4329
- badgeClass: "bg-red-50 text-destructive border border-red-200"
4330
- };
4419
+ return { label: "Likely Serviceable", variant: "success" };
4420
+ if (surplus > 0) return { label: "Borderline", variant: "warning" };
4421
+ return { label: "At Risk", variant: "destructive" };
4331
4422
  }
4332
4423
  function SectionEditButton({
4333
4424
  onClick,
@@ -4428,7 +4519,7 @@ function HeroBand({
4428
4519
  }
4429
4520
  )
4430
4521
  ] }),
4431
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: cn("px-2.5 py-1 text-xs font-medium", svc.badgeClass), children: svc.label })
4522
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Badge, { variant: svc.variant, children: svc.label })
4432
4523
  ] })
4433
4524
  ] });
4434
4525
  }
@@ -4453,14 +4544,15 @@ function ApplicantCardTab({
4453
4544
  )
4454
4545
  );
4455
4546
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-col gap-4 py-4", children: [
4456
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-col gap-2", children: [
4457
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between", children: [
4547
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "border border-border", children: [
4548
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between px-4 py-2.5", children: [
4458
4549
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialSectionLabel, { children: "About" }),
4459
4550
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SectionEditButton, { onClick: onEditAbout, title: "Edit About" })
4460
4551
  ] }),
4461
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4552
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "border-t border-border", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4462
4553
  AboutCard,
4463
4554
  {
4555
+ borderless: true,
4464
4556
  title: about.title,
4465
4557
  firstName: about.firstName,
4466
4558
  lastName: about.lastName,
@@ -4470,6 +4562,7 @@ function ApplicantCardTab({
4470
4562
  gender: about.gender,
4471
4563
  maritalStatus: about.maritalStatus,
4472
4564
  numDependants: about.numDependants,
4565
+ dependants: about.dependants,
4473
4566
  citizenStatus: about.citizenStatus,
4474
4567
  residentialAddress: about.residentialAddress,
4475
4568
  residentialStatus: about.residentialStatus,
@@ -4480,16 +4573,17 @@ function ApplicantCardTab({
4480
4573
  propertyInTrust: about.propertyInTrust,
4481
4574
  companyOwnership: about.companyOwnership
4482
4575
  }
4483
- )
4576
+ ) })
4484
4577
  ] }),
4485
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-col gap-2", children: [
4486
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between", children: [
4578
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "border border-border", children: [
4579
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between px-4 py-2.5", children: [
4487
4580
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialSectionLabel, { children: "Income" }),
4488
4581
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SectionEditButton, { onClick: onEditIncome, title: "Edit Income" })
4489
4582
  ] }),
4490
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4583
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "border-t border-border", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4491
4584
  IncomeCard,
4492
4585
  {
4586
+ borderless: true,
4493
4587
  items: income.items.map((i) => ({
4494
4588
  incomeType: i.incomeType,
4495
4589
  jobTitle: i.jobTitle,
@@ -4503,26 +4597,133 @@ function ApplicantCardTab({
4503
4597
  })),
4504
4598
  totalMonthly: totalMonthlyIncome
4505
4599
  }
4506
- )
4600
+ ) })
4507
4601
  ] }),
4508
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-col gap-2", children: [
4509
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between", children: [
4602
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "border border-border", children: [
4603
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between px-4 py-2.5", children: [
4510
4604
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialSectionLabel, { children: "Expenses" }),
4511
4605
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SectionEditButton, { onClick: onEditExpenses, title: "Edit Expenses" })
4512
4606
  ] }),
4513
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4607
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "border-t border-border", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4514
4608
  ExpensesCard,
4515
4609
  {
4610
+ borderless: true,
4516
4611
  items: expenses.items.map((e) => ({
4517
4612
  expenseType: e.expenseType,
4518
4613
  amountLabel: `${formatCurrency(e.amount)} / ${e.frequency}`
4519
4614
  })),
4520
4615
  totalMonthly: totalMonthlyExpenses
4521
4616
  }
4522
- )
4617
+ ) })
4523
4618
  ] })
4524
4619
  ] });
4525
4620
  }
4621
+ var STATUS_OPTIONS = ["verified", "pending", "rejected"];
4622
+ var STATUS_CONFIG = {
4623
+ verified: {
4624
+ Icon: import_lucide_react12.CheckCircle2,
4625
+ label: "Verified",
4626
+ iconCls: "text-success",
4627
+ triggerCls: "border-success text-success"
4628
+ },
4629
+ pending: {
4630
+ Icon: import_lucide_react12.AlertCircle,
4631
+ label: "Pending",
4632
+ iconCls: "text-warning",
4633
+ triggerCls: "border-warning text-warning"
4634
+ },
4635
+ rejected: {
4636
+ Icon: import_lucide_react12.AlertCircle,
4637
+ label: "Rejected",
4638
+ iconCls: "text-destructive",
4639
+ triggerCls: "border-destructive text-destructive"
4640
+ }
4641
+ };
4642
+ function DocRow({
4643
+ doc,
4644
+ status,
4645
+ isSelected,
4646
+ uploaderName,
4647
+ onRowClick,
4648
+ onStatusChange
4649
+ }) {
4650
+ const {
4651
+ Icon: StatusIcon,
4652
+ label: statusLabel,
4653
+ iconCls,
4654
+ triggerCls
4655
+ } = STATUS_CONFIG[status];
4656
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
4657
+ "div",
4658
+ {
4659
+ onClick: onRowClick,
4660
+ className: cn(
4661
+ "flex min-h-[44px] cursor-pointer items-center gap-3 px-4 transition-colors",
4662
+ isSelected ? "bg-primary/5" : "hover:bg-muted/40"
4663
+ ),
4664
+ children: [
4665
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "shrink-0", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Checkbox, { checked: isSelected, onCheckedChange: () => onRowClick() }) }),
4666
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react12.FileText, { className: "size-4 shrink-0 text-muted-foreground" }),
4667
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col", children: [
4668
+ doc.url ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4669
+ "a",
4670
+ {
4671
+ href: doc.url,
4672
+ target: "_blank",
4673
+ rel: "noreferrer",
4674
+ onClick: (e) => e.stopPropagation(),
4675
+ className: "w-fit text-label-medium text-foreground underline-offset-2 hover:underline",
4676
+ children: doc.name
4677
+ }
4678
+ ) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "text-label-medium text-foreground", children: doc.name }),
4679
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: "text-xs text-muted-foreground", children: [
4680
+ doc.documentType,
4681
+ doc.checklistItem ? ` \xB7 ${doc.checklistItem}` : ""
4682
+ ] })
4683
+ ] }),
4684
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Badge, { variant: "secondary", className: "shrink-0", children: uploaderName }),
4685
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "shrink-0", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
4686
+ Select,
4687
+ {
4688
+ value: status,
4689
+ onValueChange: (v) => onStatusChange(v),
4690
+ children: [
4691
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
4692
+ SelectTrigger,
4693
+ {
4694
+ size: "sm",
4695
+ className: cn("h-7 w-[116px] gap-1.5 text-xs", triggerCls),
4696
+ children: [
4697
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusIcon, { className: cn("size-3.5", iconCls) }),
4698
+ statusLabel
4699
+ ]
4700
+ }
4701
+ ),
4702
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SelectContent, { children: STATUS_OPTIONS.map((v) => {
4703
+ const { Icon, label, iconCls: iconCls2 } = STATUS_CONFIG[v];
4704
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SelectItem, { value: v, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: "flex items-center gap-1.5", children: [
4705
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Icon, { className: cn("size-3.5", iconCls2) }),
4706
+ label
4707
+ ] }) }, v);
4708
+ }) })
4709
+ ]
4710
+ }
4711
+ ) }),
4712
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "shrink-0 text-xs text-muted-foreground", children: doc.uploadedAt }),
4713
+ doc.url && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4714
+ "a",
4715
+ {
4716
+ href: doc.url,
4717
+ download: true,
4718
+ onClick: (e) => e.stopPropagation(),
4719
+ className: "shrink-0 text-muted-foreground transition-colors hover:text-foreground",
4720
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react12.Download, { className: "size-4" })
4721
+ }
4722
+ )
4723
+ ]
4724
+ }
4725
+ );
4726
+ }
4526
4727
  function OpportunitySummaryTab({
4527
4728
  isJoint = false,
4528
4729
  loanScenario,
@@ -4542,14 +4743,64 @@ function OpportunitySummaryTab({
4542
4743
  coIncome,
4543
4744
  onCoIncomeChange,
4544
4745
  coExpenses,
4545
- onCoExpensesChange
4746
+ onCoExpensesChange,
4747
+ documents = [],
4748
+ onDocumentsDownload,
4749
+ onDocumentStatusChange
4546
4750
  }) {
4547
4751
  var _a, _b;
4548
4752
  const [portalEl, setPortalEl] = (0, import_react4.useState)(null);
4549
4753
  const [summarySubTab, setSummarySubTab] = (0, import_react4.useState)(
4550
4754
  "joint"
4551
4755
  );
4552
- const [loanScenarioExpanded, setLoanScenarioExpanded] = (0, import_react4.useState)(true);
4756
+ const [selectedDocIds, setSelectedDocIds] = (0, import_react4.useState)(/* @__PURE__ */ new Set());
4757
+ function toggleDocSelection(id) {
4758
+ setSelectedDocIds((prev) => {
4759
+ const next = new Set(prev);
4760
+ if (next.has(id)) next.delete(id);
4761
+ else next.add(id);
4762
+ return next;
4763
+ });
4764
+ }
4765
+ const [docStatusOverrides, setDocStatusOverrides] = (0, import_react4.useState)({});
4766
+ function handleDocStatusChange(docId, status) {
4767
+ setDocStatusOverrides((prev) => __spreadProps(__spreadValues({}, prev), { [docId]: status }));
4768
+ onDocumentStatusChange == null ? void 0 : onDocumentStatusChange(docId, status);
4769
+ }
4770
+ function effectiveStatus(doc) {
4771
+ var _a2;
4772
+ return (_a2 = docStatusOverrides[doc.id]) != null ? _a2 : doc.status;
4773
+ }
4774
+ const checklistProgress = React10.useMemo(() => {
4775
+ var _a2, _b2;
4776
+ const map = /* @__PURE__ */ new Map();
4777
+ for (const doc of documents) {
4778
+ if (!doc.checklistItem) continue;
4779
+ const st = (_a2 = docStatusOverrides[doc.id]) != null ? _a2 : doc.status;
4780
+ const entry = (_b2 = map.get(doc.checklistItem)) != null ? _b2 : {
4781
+ count: 0,
4782
+ hasVerified: false,
4783
+ hasPending: false
4784
+ };
4785
+ entry.count += 1;
4786
+ if (st === "verified") entry.hasVerified = true;
4787
+ if (st === "pending") entry.hasPending = true;
4788
+ map.set(doc.checklistItem, entry);
4789
+ }
4790
+ return Array.from(map.entries()).map(([name, data]) => __spreadValues({ name }, data));
4791
+ }, [documents, docStatusOverrides]);
4792
+ const groupedDocs = React10.useMemo(() => {
4793
+ var _a2;
4794
+ if (documents.length <= 5 || !documents.some((d) => d.checklistItem))
4795
+ return null;
4796
+ const groups = {};
4797
+ for (const doc of documents) {
4798
+ const key = (_a2 = doc.checklistItem) != null ? _a2 : "Other";
4799
+ if (!groups[key]) groups[key] = [];
4800
+ groups[key].push(doc);
4801
+ }
4802
+ return groups;
4803
+ }, [documents]);
4553
4804
  const [editLoanOpen, setEditLoanOpen] = (0, import_react4.useState)(false);
4554
4805
  const [editAssetsOpen, setEditAssetsOpen] = (0, import_react4.useState)(false);
4555
4806
  const [editDebtsOpen, setEditDebtsOpen] = (0, import_react4.useState)(false);
@@ -4593,20 +4844,7 @@ function OpportunitySummaryTab({
4593
4844
  ),
4594
4845
  /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "mb-4 border border-border", children: [
4595
4846
  /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between px-4 py-2.5", children: [
4596
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
4597
- Button,
4598
- {
4599
- type: "button",
4600
- variant: "ghost",
4601
- className: "h-auto flex-1 justify-start gap-2 px-0 text-left",
4602
- onClick: () => setLoanScenarioExpanded((v) => !v),
4603
- "aria-expanded": loanScenarioExpanded,
4604
- children: [
4605
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialSectionLabel, { children: "Loan Scenario" }),
4606
- loanScenarioExpanded ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react12.ChevronUp, { className: "size-3.5 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react12.ChevronDown, { className: "size-3.5 text-muted-foreground" })
4607
- ]
4608
- }
4609
- ),
4847
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialSectionLabel, { children: "Loan Scenario" }),
4610
4848
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4611
4849
  SectionEditButton,
4612
4850
  {
@@ -4615,7 +4853,7 @@ function OpportunitySummaryTab({
4615
4853
  }
4616
4854
  )
4617
4855
  ] }),
4618
- loanScenarioExpanded && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "grid grid-cols-4 gap-x-6 gap-y-4 border-t border-border p-4", children: [
4856
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "grid grid-cols-4 gap-x-6 gap-y-4 border-t border-border p-4", children: [
4619
4857
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialDetailField, { label: "Lending Type", value: "Home Loan" }),
4620
4858
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4621
4859
  FinancialDetailField,
@@ -4749,8 +4987,87 @@ function OpportunitySummaryTab({
4749
4987
  ] })
4750
4988
  ] }),
4751
4989
  /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "border border-border", children: [
4752
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "px-4 py-2.5", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialSectionLabel, { children: "Documents" }) }),
4753
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "p-4", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-body-small text-muted-foreground", children: "No documents uploaded yet." }) })
4990
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex min-h-[40px] items-center justify-between px-4", children: [
4991
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FinancialSectionLabel, { children: "Documents" }),
4992
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center gap-3", children: [
4993
+ selectedDocIds.size > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
4994
+ Button,
4995
+ {
4996
+ size: "sm",
4997
+ variant: "outline-secondary",
4998
+ className: "h-7 gap-1.5 text-xs",
4999
+ onClick: () => {
5000
+ const selected = documents.filter(
5001
+ (d) => selectedDocIds.has(d.id)
5002
+ );
5003
+ onDocumentsDownload == null ? void 0 : onDocumentsDownload(selected);
5004
+ },
5005
+ children: [
5006
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react12.Download, { className: "size-3.5" }),
5007
+ "Download (",
5008
+ selectedDocIds.size,
5009
+ ")"
5010
+ ]
5011
+ }
5012
+ ),
5013
+ documents.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: "text-xs text-muted-foreground", children: [
5014
+ documents.length,
5015
+ " file",
5016
+ documents.length !== 1 ? "s" : ""
5017
+ ] })
5018
+ ] })
5019
+ ] }),
5020
+ checklistProgress.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex flex-wrap gap-x-4 gap-y-1.5 border-t border-border px-4 py-3", children: checklistProgress.map((cat) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
5021
+ "span",
5022
+ {
5023
+ className: cn(
5024
+ "flex items-center gap-1 text-xs",
5025
+ cat.hasVerified ? "text-success" : "text-warning"
5026
+ ),
5027
+ children: [
5028
+ cat.hasVerified ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react12.CheckCircle2, { className: "size-3.5 shrink-0" }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react12.AlertCircle, { className: "size-3.5 shrink-0" }),
5029
+ cat.name,
5030
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: "text-muted-foreground", children: [
5031
+ "(",
5032
+ cat.count,
5033
+ ")"
5034
+ ] })
5035
+ ]
5036
+ },
5037
+ cat.name
5038
+ )) }),
5039
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "border-t border-border", children: documents.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "px-4 py-4 text-body-small text-muted-foreground", children: "No documents uploaded yet." }) : groupedDocs ? (
5040
+ // Grouped by checklistItem
5041
+ Object.entries(groupedDocs).map(([category, docs]) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
5042
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "bg-muted/30 px-4 py-1.5 text-xs font-medium text-muted-foreground", children: category }),
5043
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex flex-col divide-y divide-border", children: docs.map((doc) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
5044
+ DocRow,
5045
+ {
5046
+ doc,
5047
+ status: effectiveStatus(doc),
5048
+ isSelected: selectedDocIds.has(doc.id),
5049
+ uploaderName: doc.uploadedBy === "main" ? mainAbout.firstName || "Main" : (coAbout == null ? void 0 : coAbout.firstName) || "Co",
5050
+ onRowClick: () => toggleDocSelection(doc.id),
5051
+ onStatusChange: (s) => handleDocStatusChange(doc.id, s)
5052
+ },
5053
+ doc.id
5054
+ )) })
5055
+ ] }, category))
5056
+ ) : (
5057
+ // Flat list
5058
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex flex-col divide-y divide-border", children: documents.map((doc) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
5059
+ DocRow,
5060
+ {
5061
+ doc,
5062
+ status: effectiveStatus(doc),
5063
+ isSelected: selectedDocIds.has(doc.id),
5064
+ uploaderName: doc.uploadedBy === "main" ? mainAbout.firstName || "Main" : (coAbout == null ? void 0 : coAbout.firstName) || "Co",
5065
+ onRowClick: () => toggleDocSelection(doc.id),
5066
+ onStatusChange: (s) => handleDocStatusChange(doc.id, s)
5067
+ },
5068
+ doc.id
5069
+ )) })
5070
+ ) })
4754
5071
  ] }),
4755
5072
  propertyCards.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "border border-border", children: [
4756
5073
  /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between px-4 py-2.5", children: [
@@ -4785,7 +5102,7 @@ function OpportunitySummaryTab({
4785
5102
  }
4786
5103
  )
4787
5104
  ] }),
4788
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "grid grid-cols-2 gap-3 p-4", children: debts.map((debt) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(DebtCard, __spreadValues({}, debtToCard(debt)), debt.id)) })
5105
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "grid grid-cols-2 gap-3 border-t border-border p-4", children: debts.map((debt) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(DebtCard, __spreadValues({}, debtToCard(debt)), debt.id)) })
4789
5106
  ] })
4790
5107
  ] }),
4791
5108
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TabsContent, { value: "main", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(