@wealthx/shadcn 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/.turbo/turbo-build.log +360 -180
  2. package/CHANGELOG.md +12 -0
  3. package/dist/chunk-2A53WPEC.mjs +182 -0
  4. package/dist/{chunk-SIVYAI3M.mjs → chunk-2LLFNGJZ.mjs} +15 -15
  5. package/dist/chunk-2QNOPXMQ.mjs +360 -0
  6. package/dist/{chunk-K5QV4TT6.mjs → chunk-2WCIORP7.mjs} +29 -4
  7. package/dist/{chunk-5NF6T2RS.mjs → chunk-3AREQTZU.mjs} +8 -8
  8. package/dist/{chunk-2EM2FRU6.mjs → chunk-3WGFIFP6.mjs} +5 -5
  9. package/dist/{chunk-K4KOD3KR.mjs → chunk-42NEC57Y.mjs} +44 -25
  10. package/dist/{chunk-FL6DZFJK.mjs → chunk-46Q4335I.mjs} +121 -39
  11. package/dist/chunk-4DO3WM7V.mjs +48 -0
  12. package/dist/chunk-5FHBC6DY.mjs +68 -0
  13. package/dist/chunk-5SAYZ4CI.mjs +40 -0
  14. package/dist/chunk-5WMFKQZ6.mjs +180 -0
  15. package/dist/chunk-623YVI5O.mjs +43 -0
  16. package/dist/{chunk-SFH2NJEJ.mjs → chunk-6OSULDEO.mjs} +3 -3
  17. package/dist/{chunk-UALR6JGV.mjs → chunk-6SR4K5T5.mjs} +1 -1
  18. package/dist/{chunk-D2NSIIXG.mjs → chunk-7KT5HPYM.mjs} +11 -11
  19. package/dist/chunk-A6ER36CW.mjs +456 -0
  20. package/dist/{chunk-QX7IFQSF.mjs → chunk-AHKHVBWR.mjs} +4 -4
  21. package/dist/chunk-AHSCWXYJ.mjs +113 -0
  22. package/dist/{chunk-7GWRPXHD.mjs → chunk-AL6GOL2Y.mjs} +1 -1
  23. package/dist/{chunk-OIKBW2QD.mjs → chunk-AUEUTZIC.mjs} +13 -13
  24. package/dist/{chunk-FYPSTTEJ.mjs → chunk-B7DD3ODQ.mjs} +1 -1
  25. package/dist/{chunk-TLAWKTSA.mjs → chunk-BD3DWDT4.mjs} +3 -3
  26. package/dist/{chunk-S2FKV4M5.mjs → chunk-BDESHD25.mjs} +4 -4
  27. package/dist/{chunk-OKTJFDPN.mjs → chunk-BFB3UH7V.mjs} +2 -2
  28. package/dist/{chunk-DGNHGNYH.mjs → chunk-C6SWS7OW.mjs} +1 -1
  29. package/dist/chunk-CDVG7SFT.mjs +271 -0
  30. package/dist/chunk-CUSHAIUL.mjs +109 -0
  31. package/dist/{chunk-QXKGOMUX.mjs → chunk-CW32WTZU.mjs} +4 -4
  32. package/dist/{chunk-SET2ANTY.mjs → chunk-D447W45Z.mjs} +3 -3
  33. package/dist/{chunk-RCAOCHWA.mjs → chunk-DFL5CV75.mjs} +18 -18
  34. package/dist/chunk-DYSVJ473.mjs +162 -0
  35. package/dist/chunk-E3PQDBYI.mjs +288 -0
  36. package/dist/chunk-EMYBNPIA.mjs +83 -0
  37. package/dist/chunk-EUYPMDQG.mjs +348 -0
  38. package/dist/{chunk-XYPW2XA5.mjs → chunk-EW72FINW.mjs} +11 -11
  39. package/dist/chunk-F24U4QQQ.mjs +234 -0
  40. package/dist/{chunk-VB5M6OZQ.mjs → chunk-F4O2YPXJ.mjs} +1 -1
  41. package/dist/chunk-FFXTQTB4.mjs +84 -0
  42. package/dist/{chunk-ZOWL2L5J.mjs → chunk-FYUSF5KO.mjs} +5 -1
  43. package/dist/{chunk-FTPBQVQ6.mjs → chunk-GNER6MCO.mjs} +1 -1
  44. package/dist/{chunk-2D3HQPFN.mjs → chunk-HF4FUBCY.mjs} +5 -5
  45. package/dist/{chunk-RSUIPKGX.mjs → chunk-HNDTLT5X.mjs} +1 -1
  46. package/dist/{chunk-N6Q5IPKT.mjs → chunk-HO6S3ECM.mjs} +46 -18
  47. package/dist/{chunk-L4NSRQ3T.mjs → chunk-HROG643K.mjs} +1 -1
  48. package/dist/chunk-I2EKKSEF.mjs +148 -0
  49. package/dist/{chunk-QTRSCVQ3.mjs → chunk-I3UDLWQ7.mjs} +1 -1
  50. package/dist/{chunk-AE7MASLF.mjs → chunk-IQGKOT7A.mjs} +9 -6
  51. package/dist/chunk-IXR4BQSQ.mjs +290 -0
  52. package/dist/{chunk-4MM7LHM5.mjs → chunk-J5NW5NCT.mjs} +1 -1
  53. package/dist/{chunk-OLKMCXAR.mjs → chunk-JTG5R5YV.mjs} +24 -24
  54. package/dist/chunk-JUBUN65Q.mjs +106 -0
  55. package/dist/chunk-K7TWMLLW.mjs +520 -0
  56. package/dist/{chunk-BOW7U26Y.mjs → chunk-K7WSRWOU.mjs} +4 -4
  57. package/dist/{chunk-NTYQWVLI.mjs → chunk-KAD26MCC.mjs} +1 -1
  58. package/dist/{chunk-KCWNDYPZ.mjs → chunk-KB7MZMED.mjs} +4 -4
  59. package/dist/chunk-KCKYGQVQ.mjs +61 -0
  60. package/dist/{chunk-VY5NEUP7.mjs → chunk-KLJLDNCA.mjs} +1 -1
  61. package/dist/chunk-LLAGF6BA.mjs +49 -0
  62. package/dist/{chunk-G27TSQLQ.mjs → chunk-M4LTX3MH.mjs} +1 -1
  63. package/dist/{chunk-YIZHS72Z.mjs → chunk-MHHA7QGO.mjs} +94 -54
  64. package/dist/{chunk-P2N2PEFY.mjs → chunk-NCUH54IZ.mjs} +4 -4
  65. package/dist/{chunk-PNRUH7JY.mjs → chunk-OECGKCVF.mjs} +5 -5
  66. package/dist/{chunk-YE67AALL.mjs → chunk-OL65UQHQ.mjs} +10 -10
  67. package/dist/{chunk-LQULK2E3.mjs → chunk-OYBIUEGE.mjs} +1 -1
  68. package/dist/{chunk-LR6LHDP3.mjs → chunk-PGR53HMH.mjs} +7 -7
  69. package/dist/chunk-PUJ42INK.mjs +141 -0
  70. package/dist/{chunk-M4VYX2PV.mjs → chunk-PV3Y7QGK.mjs} +2 -2
  71. package/dist/{chunk-UJZ4UHWI.mjs → chunk-PV7PNA6K.mjs} +4 -4
  72. package/dist/{chunk-6HIOM2HL.mjs → chunk-Q35PNFJ7.mjs} +1 -1
  73. package/dist/{chunk-JZY6TNIS.mjs → chunk-Q5SGEIJV.mjs} +27 -27
  74. package/dist/{chunk-ZFCDYW6N.mjs → chunk-QAX6HCUH.mjs} +1 -1
  75. package/dist/chunk-QHJDGB54.mjs +135 -0
  76. package/dist/chunk-QQSOZQOC.mjs +27 -0
  77. package/dist/chunk-RUX3OLVZ.mjs +59 -0
  78. package/dist/{chunk-QOJ2DQD6.mjs → chunk-S4CTM3UE.mjs} +5 -0
  79. package/dist/{chunk-ZEDMKQK2.mjs → chunk-TAX3KL66.mjs} +1 -1
  80. package/dist/chunk-TC43SMIN.mjs +133 -0
  81. package/dist/chunk-TGVXRD53.mjs +174 -0
  82. package/dist/{chunk-K5VHK7CM.mjs → chunk-TLYSVRSK.mjs} +12 -12
  83. package/dist/{chunk-YCWLFG27.mjs → chunk-TOIVHWNC.mjs} +1 -1
  84. package/dist/chunk-TXUBGKB7.mjs +160 -0
  85. package/dist/chunk-UEREFDAE.mjs +75 -0
  86. package/dist/chunk-UTCQN6XU.mjs +123 -0
  87. package/dist/{chunk-37AE3OM5.mjs → chunk-V4CUTCHS.mjs} +4 -4
  88. package/dist/{chunk-THVO2N47.mjs → chunk-VFH632TB.mjs} +9 -9
  89. package/dist/{chunk-3ERBUVHC.mjs → chunk-VJ3GC7W3.mjs} +95 -49
  90. package/dist/{chunk-V6XGXYCJ.mjs → chunk-VLELWBEW.mjs} +4 -4
  91. package/dist/{chunk-FEZKMUCF.mjs → chunk-WDTXHLYM.mjs} +1 -1
  92. package/dist/chunk-WUA546RX.mjs +129 -0
  93. package/dist/chunk-XHGISOX5.mjs +257 -0
  94. package/dist/chunk-XIY5DJXI.mjs +168 -0
  95. package/dist/{chunk-TOWTPLRC.mjs → chunk-XN37434W.mjs} +8 -8
  96. package/dist/{chunk-KLTACJ2G.mjs → chunk-XTWAJWCQ.mjs} +1 -1
  97. package/dist/chunk-Y24TXIFJ.mjs +518 -0
  98. package/dist/{chunk-DMXYRCHM.mjs → chunk-Y6UM3VTN.mjs} +4 -4
  99. package/dist/components/ui/about-you-form.js +1120 -0
  100. package/dist/components/ui/about-you-form.mjs +323 -0
  101. package/dist/components/ui/account-list-carousel.js +304 -0
  102. package/dist/components/ui/account-list-carousel.mjs +11 -0
  103. package/dist/components/ui/add-column-modal.js +1 -1
  104. package/dist/components/ui/add-column-modal.mjs +6 -6
  105. package/dist/components/ui/add-lead-modal.js +2 -2
  106. package/dist/components/ui/add-lead-modal.mjs +6 -6
  107. package/dist/components/ui/advisor-card.mjs +2 -2
  108. package/dist/components/ui/agent-evaluation-toast.js +299 -0
  109. package/dist/components/ui/agent-evaluation-toast.mjs +12 -0
  110. package/dist/components/ui/ai-assistant-drawer.mjs +5 -5
  111. package/dist/components/ui/ai-builder.js +3 -3
  112. package/dist/components/ui/ai-builder.mjs +5 -5
  113. package/dist/components/ui/ai-conversations.js +2 -2
  114. package/dist/components/ui/ai-conversations.mjs +11 -11
  115. package/dist/components/ui/alert-dialog.mjs +3 -3
  116. package/dist/components/ui/applicant-document-checklist.js +346 -0
  117. package/dist/components/ui/applicant-document-checklist.mjs +10 -0
  118. package/dist/components/ui/applicant-expenses-section.js +455 -0
  119. package/dist/components/ui/applicant-expenses-section.mjs +220 -0
  120. package/dist/components/ui/applicant-navigation-bar.js +309 -0
  121. package/dist/components/ui/applicant-navigation-bar.mjs +87 -0
  122. package/dist/components/ui/applicant-switcher.js +268 -0
  123. package/dist/components/ui/applicant-switcher.mjs +46 -0
  124. package/dist/components/ui/application-mobile-layout.js +88 -0
  125. package/dist/components/ui/application-mobile-layout.mjs +8 -0
  126. package/dist/components/ui/appointment-action-dialogs.js +1 -1
  127. package/dist/components/ui/appointment-action-dialogs.mjs +10 -10
  128. package/dist/components/ui/appointment-availability-settings.js +78 -31
  129. package/dist/components/ui/appointment-availability-settings.mjs +12 -10
  130. package/dist/components/ui/appointment-book-dialog.js +137 -58
  131. package/dist/components/ui/appointment-book-dialog.mjs +14 -14
  132. package/dist/components/ui/appointment-calendar-view.js +1 -1
  133. package/dist/components/ui/appointment-calendar-view.mjs +4 -4
  134. package/dist/components/ui/appointment-detail-sheet.js +38 -11
  135. package/dist/components/ui/appointment-detail-sheet.mjs +13 -13
  136. package/dist/components/ui/appointment-gmail-connect.mjs +2 -2
  137. package/dist/components/ui/appointment-time-slot-picker.mjs +2 -2
  138. package/dist/components/ui/appointment-upcoming-card.js +1 -1
  139. package/dist/components/ui/appointment-upcoming-card.mjs +10 -10
  140. package/dist/components/ui/asset-accordion.js +506 -0
  141. package/dist/components/ui/asset-accordion.mjs +202 -0
  142. package/dist/components/ui/assets-liabilities-side-card.js +328 -0
  143. package/dist/components/ui/assets-liabilities-side-card.mjs +127 -0
  144. package/dist/components/ui/auth-page-layout.js +3 -3
  145. package/dist/components/ui/auth-page-layout.mjs +1 -1
  146. package/dist/components/ui/backoffice-alert-history-chart.mjs +4 -4
  147. package/dist/components/ui/backoffice-alert-matching-chart.js +786 -0
  148. package/dist/components/ui/backoffice-alert-matching-chart.mjs +19 -0
  149. package/dist/components/ui/backoffice-alerts-chart.mjs +4 -4
  150. package/dist/components/ui/backoffice-connections-chart.mjs +4 -4
  151. package/dist/components/ui/backoffice-contact-history-chart.mjs +4 -4
  152. package/dist/components/ui/backoffice-contact-matching-chart.js +803 -0
  153. package/dist/components/ui/backoffice-contact-matching-chart.mjs +19 -0
  154. package/dist/components/ui/backoffice-signup-steps.js +1673 -0
  155. package/dist/components/ui/backoffice-signup-steps.mjs +36 -0
  156. package/dist/components/ui/bank-statement-document-table.js +467 -0
  157. package/dist/components/ui/bank-statement-document-table.mjs +12 -0
  158. package/dist/components/ui/bank-statement-generate-dialog.js +1517 -0
  159. package/dist/components/ui/bank-statement-generate-dialog.mjs +27 -0
  160. package/dist/components/ui/bank-statement-pdf-viewer.js +525 -0
  161. package/dist/components/ui/bank-statement-pdf-viewer.mjs +14 -0
  162. package/dist/components/ui/banking-accounts-connect.js +336 -0
  163. package/dist/components/ui/banking-accounts-connect.mjs +114 -0
  164. package/dist/components/ui/borrowing-capacity-atoms.js +382 -0
  165. package/dist/components/ui/borrowing-capacity-atoms.mjs +17 -0
  166. package/dist/components/ui/borrowing-capacity-card.js +835 -0
  167. package/dist/components/ui/borrowing-capacity-card.mjs +89 -0
  168. package/dist/components/ui/borrowing-capacity-line-chart.mjs +4 -4
  169. package/dist/components/ui/broker-info-panel.js +281 -0
  170. package/dist/components/ui/broker-info-panel.mjs +59 -0
  171. package/dist/components/ui/calculator-input-item.js +101 -0
  172. package/dist/components/ui/calculator-input-item.mjs +8 -0
  173. package/dist/components/ui/calculator-section.js +743 -0
  174. package/dist/components/ui/calculator-section.mjs +220 -0
  175. package/dist/components/ui/calendar.mjs +2 -2
  176. package/dist/components/ui/cash-balance-line-chart.mjs +5 -5
  177. package/dist/components/ui/cashflow-bar-chart.mjs +4 -4
  178. package/dist/components/ui/category-edit-dialog.js +737 -0
  179. package/dist/components/ui/category-edit-dialog.mjs +16 -0
  180. package/dist/components/ui/chat-widget.mjs +3 -3
  181. package/dist/components/ui/color-picker.mjs +4 -4
  182. package/dist/components/ui/connect-bank-step.js +511 -0
  183. package/dist/components/ui/connect-bank-step.mjs +287 -0
  184. package/dist/components/ui/contact-alert-dialog.js +1405 -0
  185. package/dist/components/ui/contact-alert-dialog.mjs +27 -0
  186. package/dist/components/ui/create-contact-modal.js +1028 -0
  187. package/dist/components/ui/create-contact-modal.mjs +21 -0
  188. package/dist/components/ui/csv-import-modal.js +583 -0
  189. package/dist/components/ui/csv-import-modal.mjs +14 -0
  190. package/dist/components/ui/currency-input.js +439 -0
  191. package/dist/components/ui/currency-input.mjs +13 -0
  192. package/dist/components/ui/dashboard-expense-categories.js +355 -0
  193. package/dist/components/ui/dashboard-expense-categories.mjs +186 -0
  194. package/dist/components/ui/dashboard-transactions-table.js +1083 -0
  195. package/dist/components/ui/dashboard-transactions-table.mjs +177 -0
  196. package/dist/components/ui/data-table.mjs +6 -6
  197. package/dist/components/ui/date-picker.mjs +6 -6
  198. package/dist/components/ui/debt-accordion.js +523 -0
  199. package/dist/components/ui/debt-accordion.mjs +219 -0
  200. package/dist/components/ui/delete-contact-component.js +479 -0
  201. package/dist/components/ui/delete-contact-component.mjs +14 -0
  202. package/dist/components/ui/dialog.js +1 -1
  203. package/dist/components/ui/dialog.mjs +3 -3
  204. package/dist/components/ui/document-checklist-template.mjs +4 -4
  205. package/dist/components/ui/drawer.mjs +3 -3
  206. package/dist/components/ui/dropdown-menu.mjs +3 -3
  207. package/dist/components/ui/dynamic-tabs.js +274 -0
  208. package/dist/components/ui/dynamic-tabs.mjs +116 -0
  209. package/dist/components/ui/editable-money-item.js +306 -0
  210. package/dist/components/ui/editable-money-item.mjs +12 -0
  211. package/dist/components/ui/expense-bar-chart.mjs +4 -4
  212. package/dist/components/ui/expense-detail-item.js +506 -0
  213. package/dist/components/ui/expense-detail-item.mjs +15 -0
  214. package/dist/components/ui/expense-work-details.js +1259 -0
  215. package/dist/components/ui/expense-work-details.mjs +175 -0
  216. package/dist/components/ui/field.mjs +2 -2
  217. package/dist/components/ui/file-preview-dialog.js +704 -0
  218. package/dist/components/ui/file-preview-dialog.mjs +17 -0
  219. package/dist/components/ui/financial-cards.mjs +2 -2
  220. package/dist/components/ui/financial-drawers.js +1 -1
  221. package/dist/components/ui/financial-drawers.mjs +5 -5
  222. package/dist/components/ui/financial-sections.mjs +4 -4
  223. package/dist/components/ui/form-primitives.mjs +2 -2
  224. package/dist/components/ui/frontend-signup-steps.js +1239 -0
  225. package/dist/components/ui/frontend-signup-steps.mjs +38 -0
  226. package/dist/components/ui/income-bar-chart.mjs +4 -4
  227. package/dist/components/ui/income-sources-card.js +269 -0
  228. package/dist/components/ui/income-sources-card.mjs +100 -0
  229. package/dist/components/ui/income-summary-component.js +361 -0
  230. package/dist/components/ui/income-summary-component.mjs +84 -0
  231. package/dist/components/ui/income-work-details.js +1663 -0
  232. package/dist/components/ui/income-work-details.mjs +28 -0
  233. package/dist/components/ui/incoming-outgoings-card.js +218 -0
  234. package/dist/components/ui/incoming-outgoings-card.mjs +82 -0
  235. package/dist/components/ui/interest-rate-input.js +442 -0
  236. package/dist/components/ui/interest-rate-input.mjs +90 -0
  237. package/dist/components/ui/interest-rate-section.js +337 -0
  238. package/dist/components/ui/interest-rate-section.mjs +84 -0
  239. package/dist/components/ui/interest-rate-used.js +202 -0
  240. package/dist/components/ui/interest-rate-used.mjs +62 -0
  241. package/dist/components/ui/kanban-column.js +338 -160
  242. package/dist/components/ui/kanban-column.mjs +13 -11
  243. package/dist/components/ui/loan-applicant-information.js +336 -0
  244. package/dist/components/ui/loan-applicant-information.mjs +59 -0
  245. package/dist/components/ui/loan-applicant-invite.js +319 -0
  246. package/dist/components/ui/loan-applicant-invite.mjs +68 -0
  247. package/dist/components/ui/loan-application-badge.js +236 -0
  248. package/dist/components/ui/loan-application-badge.mjs +10 -0
  249. package/dist/components/ui/loan-application-cards.js +356 -0
  250. package/dist/components/ui/loan-application-cards.mjs +110 -0
  251. package/dist/components/ui/loan-entry-shell.js +104 -0
  252. package/dist/components/ui/loan-entry-shell.mjs +8 -0
  253. package/dist/components/ui/loan-financials.js +410 -0
  254. package/dist/components/ui/loan-financials.mjs +76 -0
  255. package/dist/components/ui/loan-option-card.js +102 -0
  256. package/dist/components/ui/loan-option-card.mjs +41 -0
  257. package/dist/components/ui/loan-option-group.js +288 -0
  258. package/dist/components/ui/loan-option-group.mjs +10 -0
  259. package/dist/components/ui/loan-steps.js +1121 -0
  260. package/dist/components/ui/loan-steps.mjs +509 -0
  261. package/dist/components/ui/loan-wizard-shell.js +452 -0
  262. package/dist/components/ui/loan-wizard-shell.mjs +11 -0
  263. package/dist/components/ui/money-input-with-slider.js +210 -0
  264. package/dist/components/ui/money-input-with-slider.mjs +10 -0
  265. package/dist/components/ui/money-item-with-color-indicator.js +314 -0
  266. package/dist/components/ui/money-item-with-color-indicator.mjs +20 -0
  267. package/dist/components/ui/opportunity-card.js +235 -97
  268. package/dist/components/ui/opportunity-card.mjs +11 -9
  269. package/dist/components/ui/opportunity-edit-modals.js +1 -1
  270. package/dist/components/ui/opportunity-edit-modals.mjs +15 -15
  271. package/dist/components/ui/opportunity-summary-tab.js +1 -1
  272. package/dist/components/ui/opportunity-summary-tab.mjs +19 -19
  273. package/dist/components/ui/pagination.mjs +4 -4
  274. package/dist/components/ui/password-strength-tooltip.mjs +4 -4
  275. package/dist/components/ui/pipeline-board.js +358 -176
  276. package/dist/components/ui/pipeline-board.mjs +16 -14
  277. package/dist/components/ui/pipeline-chart.mjs +3 -3
  278. package/dist/components/ui/pipeline-dialogs.js +1 -1
  279. package/dist/components/ui/pipeline-dialogs.mjs +9 -9
  280. package/dist/components/ui/pipeline-primitives.js +75 -8
  281. package/dist/components/ui/pipeline-primitives.mjs +3 -2
  282. package/dist/components/ui/popover.mjs +3 -3
  283. package/dist/components/ui/property-asset-card.js +428 -0
  284. package/dist/components/ui/property-asset-card.mjs +156 -0
  285. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +4 -4
  286. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +4 -4
  287. package/dist/components/ui/property-list-carousel.js +295 -0
  288. package/dist/components/ui/property-list-carousel.mjs +11 -0
  289. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +4 -4
  290. package/dist/components/ui/property-report-dialog.js +1148 -0
  291. package/dist/components/ui/property-report-dialog.mjs +25 -0
  292. package/dist/components/ui/resource-center.js +748 -0
  293. package/dist/components/ui/resource-center.mjs +24 -0
  294. package/dist/components/ui/review-alerts-dialog.js +569 -0
  295. package/dist/components/ui/review-alerts-dialog.mjs +15 -0
  296. package/dist/components/ui/savings-goal-modal.js +1148 -0
  297. package/dist/components/ui/savings-goal-modal.mjs +160 -0
  298. package/dist/components/ui/scenario-drawer.js +791 -0
  299. package/dist/components/ui/scenario-drawer.mjs +294 -0
  300. package/dist/components/ui/scenario-item.js +256 -0
  301. package/dist/components/ui/scenario-item.mjs +11 -0
  302. package/dist/components/ui/scenario-list.js +507 -0
  303. package/dist/components/ui/scenario-list.mjs +100 -0
  304. package/dist/components/ui/select.mjs +3 -3
  305. package/dist/components/ui/share-details-dialog.js +636 -0
  306. package/dist/components/ui/share-details-dialog.mjs +19 -0
  307. package/dist/components/ui/sheet.mjs +3 -3
  308. package/dist/components/ui/sidebar-nav.mjs +5 -5
  309. package/dist/components/ui/signup-form-primitives.js +770 -0
  310. package/dist/components/ui/signup-form-primitives.mjs +25 -0
  311. package/dist/components/ui/signup-shell.js +338 -0
  312. package/dist/components/ui/signup-shell.mjs +13 -0
  313. package/dist/components/ui/stage-timeline.js +103 -33
  314. package/dist/components/ui/stage-timeline.mjs +5 -4
  315. package/dist/components/ui/submission-confirmation-card.js +284 -0
  316. package/dist/components/ui/submission-confirmation-card.mjs +62 -0
  317. package/dist/components/ui/tooltip.mjs +3 -3
  318. package/dist/components/ui/top-three-product.js +374 -0
  319. package/dist/components/ui/top-three-product.mjs +129 -0
  320. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +4 -4
  321. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -5
  322. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +4 -4
  323. package/dist/components/ui/transactions-summary-block.js +95 -0
  324. package/dist/components/ui/transactions-summary-block.mjs +34 -0
  325. package/dist/components/ui/two-fa-setup-form.mjs +3 -3
  326. package/dist/index.js +9430 -4573
  327. package/dist/index.mjs +404 -251
  328. package/dist/lib/colors.js +6 -0
  329. package/dist/lib/colors.mjs +3 -1
  330. package/dist/lib/theme-provider.mjs +2 -2
  331. package/dist/styles.css +1 -1
  332. package/package.json +366 -2
  333. package/src/components/index.tsx +223 -0
  334. package/src/components/ui/about-you-form.tsx +397 -0
  335. package/src/components/ui/account-list-carousel.tsx +87 -0
  336. package/src/components/ui/add-lead-modal.tsx +1 -1
  337. package/src/components/ui/agent-evaluation-toast.tsx +191 -0
  338. package/src/components/ui/ai-builder.tsx +3 -5
  339. package/src/components/ui/ai-conversations.tsx +1 -1
  340. package/src/components/ui/applicant-document-checklist.tsx +175 -0
  341. package/src/components/ui/applicant-expenses-section.tsx +260 -0
  342. package/src/components/ui/applicant-navigation-bar.tsx +104 -0
  343. package/src/components/ui/applicant-switcher.tsx +54 -0
  344. package/src/components/ui/application-mobile-layout.tsx +34 -0
  345. package/src/components/ui/appointment-availability-settings.tsx +115 -23
  346. package/src/components/ui/appointment-book-dialog.tsx +406 -259
  347. package/src/components/ui/appointment-calendar-view.tsx +4 -1
  348. package/src/components/ui/appointment-detail-sheet.tsx +59 -24
  349. package/src/components/ui/appointment-time-slot-picker.tsx +5 -1
  350. package/src/components/ui/asset-accordion.tsx +241 -0
  351. package/src/components/ui/assets-liabilities-side-card.tsx +157 -0
  352. package/src/components/ui/auth-page-layout.tsx +3 -3
  353. package/src/components/ui/backoffice-alert-matching-chart.tsx +320 -0
  354. package/src/components/ui/backoffice-contact-matching-chart.tsx +341 -0
  355. package/src/components/ui/backoffice-signup-steps.tsx +615 -0
  356. package/src/components/ui/bank-statement-document-table.tsx +222 -0
  357. package/src/components/ui/bank-statement-generate-dialog.tsx +435 -0
  358. package/src/components/ui/bank-statement-pdf-viewer.tsx +241 -0
  359. package/src/components/ui/banking-accounts-connect.tsx +187 -0
  360. package/src/components/ui/borrowing-capacity-atoms.tsx +228 -0
  361. package/src/components/ui/borrowing-capacity-card.tsx +155 -0
  362. package/src/components/ui/broker-info-panel.tsx +94 -0
  363. package/src/components/ui/calculator-input-item.tsx +49 -0
  364. package/src/components/ui/calculator-section.tsx +275 -0
  365. package/src/components/ui/category-edit-dialog.tsx +300 -0
  366. package/src/components/ui/connect-bank-step.tsx +379 -0
  367. package/src/components/ui/contact-alert-dialog.tsx +710 -0
  368. package/src/components/ui/create-contact-modal.tsx +237 -0
  369. package/src/components/ui/csv-import-modal.tsx +153 -0
  370. package/src/components/ui/currency-input.tsx +104 -0
  371. package/src/components/ui/dashboard-expense-categories.tsx +262 -0
  372. package/src/components/ui/dashboard-transactions-table.tsx +241 -0
  373. package/src/components/ui/debt-accordion.tsx +254 -0
  374. package/src/components/ui/delete-contact-component.tsx +87 -0
  375. package/src/components/ui/dialog.tsx +2 -2
  376. package/src/components/ui/dynamic-tabs.tsx +149 -0
  377. package/src/components/ui/editable-money-item.tsx +176 -0
  378. package/src/components/ui/expense-detail-item.tsx +216 -0
  379. package/src/components/ui/expense-work-details.tsx +229 -0
  380. package/src/components/ui/file-preview-dialog.tsx +292 -0
  381. package/src/components/ui/financial-drawers.tsx +1 -1
  382. package/src/components/ui/frontend-signup-steps.tsx +548 -0
  383. package/src/components/ui/income-sources-card.tsx +143 -0
  384. package/src/components/ui/income-summary-component.tsx +120 -0
  385. package/src/components/ui/income-work-details.tsx +429 -0
  386. package/src/components/ui/incoming-outgoings-card.tsx +111 -0
  387. package/src/components/ui/interest-rate-input.tsx +111 -0
  388. package/src/components/ui/interest-rate-section.tsx +158 -0
  389. package/src/components/ui/interest-rate-used.tsx +82 -0
  390. package/src/components/ui/kanban-column.tsx +53 -2
  391. package/src/components/ui/loan-applicant-information.tsx +64 -0
  392. package/src/components/ui/loan-applicant-invite.tsx +67 -0
  393. package/src/components/ui/loan-application-badge.tsx +70 -0
  394. package/src/components/ui/loan-application-cards.tsx +152 -0
  395. package/src/components/ui/loan-entry-shell.tsx +86 -0
  396. package/src/components/ui/loan-financials.tsx +77 -0
  397. package/src/components/ui/loan-option-card.tsx +62 -0
  398. package/src/components/ui/loan-option-group.tsx +106 -0
  399. package/src/components/ui/loan-steps.tsx +630 -0
  400. package/src/components/ui/loan-wizard-shell.tsx +235 -0
  401. package/src/components/ui/money-input-with-slider.tsx +77 -0
  402. package/src/components/ui/money-item-with-color-indicator.tsx +30 -0
  403. package/src/components/ui/opportunity-card.tsx +46 -18
  404. package/src/components/ui/pipeline-board.tsx +13 -0
  405. package/src/components/ui/pipeline-primitives.tsx +28 -0
  406. package/src/components/ui/property-asset-card.tsx +221 -0
  407. package/src/components/ui/property-list-carousel.tsx +73 -0
  408. package/src/components/ui/property-report-dialog.tsx +355 -0
  409. package/src/components/ui/resource-center.tsx +539 -0
  410. package/src/components/ui/review-alerts-dialog.tsx +163 -0
  411. package/src/components/ui/savings-goal-modal.tsx +169 -0
  412. package/src/components/ui/scenario-drawer.tsx +358 -0
  413. package/src/components/ui/scenario-item.tsx +141 -0
  414. package/src/components/ui/scenario-list.tsx +150 -0
  415. package/src/components/ui/share-details-dialog.tsx +238 -0
  416. package/src/components/ui/signup-form-primitives.tsx +212 -0
  417. package/src/components/ui/signup-shell.tsx +180 -0
  418. package/src/components/ui/stage-timeline.tsx +11 -0
  419. package/src/components/ui/submission-confirmation-card.tsx +68 -0
  420. package/src/components/ui/top-three-product.tsx +207 -0
  421. package/src/components/ui/transactions-summary-block.tsx +59 -0
  422. package/src/lib/colors.ts +12 -0
  423. package/src/lib/format-date.ts +2 -2
  424. package/src/styles/styles-css.ts +1 -1
  425. package/tsup.config.ts +77 -1
  426. package/dist/{chunk-5VOTTIXF.mjs → chunk-FRT3S72S.mjs} +3 -3
  427. package/dist/{chunk-7BTFGCFC.mjs → chunk-MUV4EGDW.mjs} +3 -3
  428. package/dist/{chunk-57ZXILTS.mjs → chunk-MXP2RX2V.mjs} +3 -3
  429. package/dist/{chunk-ZKWXDQDG.mjs → chunk-VCDGLN25.mjs} +3 -3
  430. package/dist/{chunk-FLL633WS.mjs → chunk-ZXEUBBHJ.mjs} +3 -3
@@ -0,0 +1,1148 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __objRest = (source, exclude) => {
26
+ var target = {};
27
+ for (var prop in source)
28
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
29
+ target[prop] = source[prop];
30
+ if (source != null && __getOwnPropSymbols)
31
+ for (var prop of __getOwnPropSymbols(source)) {
32
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
33
+ target[prop] = source[prop];
34
+ }
35
+ return target;
36
+ };
37
+ var __export = (target, all) => {
38
+ for (var name in all)
39
+ __defProp(target, name, { get: all[name], enumerable: true });
40
+ };
41
+ var __copyProps = (to, from, except, desc) => {
42
+ if (from && typeof from === "object" || typeof from === "function") {
43
+ for (let key of __getOwnPropNames(from))
44
+ if (!__hasOwnProp.call(to, key) && key !== except)
45
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
46
+ }
47
+ return to;
48
+ };
49
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
50
+ // If the importer is in node compatibility mode or this is not an ESM
51
+ // file that has been converted to a CommonJS file using a Babel-
52
+ // compatible transform (i.e. "__esModule" has not been set), then set
53
+ // "default" to the CommonJS "module.exports" for node compatibility.
54
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
55
+ mod
56
+ ));
57
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
58
+
59
+ // src/components/ui/savings-goal-modal.tsx
60
+ var savings_goal_modal_exports = {};
61
+ __export(savings_goal_modal_exports, {
62
+ SavingsGoalModal: () => SavingsGoalModal
63
+ });
64
+ module.exports = __toCommonJS(savings_goal_modal_exports);
65
+ var import_react3 = require("react");
66
+ var import_date_fns3 = require("date-fns");
67
+
68
+ // src/lib/utils.ts
69
+ var import_clsx = require("clsx");
70
+ var import_tailwind_merge = require("tailwind-merge");
71
+ var twMerge = (0, import_tailwind_merge.extendTailwindMerge)({
72
+ extend: {
73
+ classGroups: {
74
+ "font-size": [
75
+ {
76
+ text: [
77
+ "display-large",
78
+ "display-medium",
79
+ "display-small",
80
+ "h1",
81
+ "h2",
82
+ "h3",
83
+ "h4",
84
+ "h5",
85
+ "h6",
86
+ "body-large",
87
+ "body-medium",
88
+ "body-small",
89
+ "label-large",
90
+ "label-medium",
91
+ "label-small",
92
+ "button",
93
+ "button-xs",
94
+ "caption",
95
+ "overline",
96
+ "code"
97
+ ]
98
+ }
99
+ ]
100
+ }
101
+ }
102
+ });
103
+ function cn(...inputs) {
104
+ return twMerge((0, import_clsx.clsx)(inputs));
105
+ }
106
+
107
+ // src/lib/format-currency.ts
108
+ function formatCurrency(value, options) {
109
+ const { decimals = 0, showSign = false } = options != null ? options : {};
110
+ const abs = Math.abs(value);
111
+ const formatted = new Intl.NumberFormat("en-AU", {
112
+ style: "currency",
113
+ currency: "AUD",
114
+ minimumFractionDigits: decimals,
115
+ maximumFractionDigits: decimals
116
+ }).format(abs);
117
+ if (!showSign) return value < 0 ? `-${formatted}` : formatted;
118
+ if (value > 0) return `+${formatted}`;
119
+ if (value < 0) return `-${formatted}`;
120
+ return formatted;
121
+ }
122
+ function formatCurrencyAbbrev(value) {
123
+ const abs = Math.abs(value);
124
+ const sign = value < 0 ? "-" : "";
125
+ if (abs >= 1e9)
126
+ return `${sign}$${(abs / 1e9).toFixed(1)}B`;
127
+ if (abs >= 1e6) return `${sign}$${(abs / 1e6).toFixed(1)}M`;
128
+ if (abs >= 1e3) return `${sign}$${(abs / 1e3).toFixed(0)}K`;
129
+ return `${sign}$${abs.toFixed(0)}`;
130
+ }
131
+
132
+ // src/components/ui/dialog.tsx
133
+ var import_lucide_react2 = require("lucide-react");
134
+ var import_dialog = require("@base-ui/react/dialog");
135
+
136
+ // src/lib/theme-provider.tsx
137
+ var import_react = require("react");
138
+ var import_jsx_runtime = require("react/jsx-runtime");
139
+ var ThemeVarsContext = (0, import_react.createContext)({});
140
+ function useThemeVars() {
141
+ return (0, import_react.useContext)(ThemeVarsContext);
142
+ }
143
+
144
+ // src/components/ui/button.tsx
145
+ var import_react2 = require("react");
146
+ var import_class_variance_authority = require("class-variance-authority");
147
+ var import_lucide_react = require("lucide-react");
148
+
149
+ // src/lib/slot.tsx
150
+ var React2 = __toESM(require("react"));
151
+ function mergeRefs(...refs) {
152
+ return (value) => {
153
+ for (const ref of refs) {
154
+ if (typeof ref === "function") ref(value);
155
+ else if (ref !== null)
156
+ ref.current = value;
157
+ }
158
+ };
159
+ }
160
+ var Slot = React2.forwardRef(
161
+ (_a, forwardedRef) => {
162
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
163
+ const child = React2.Children.only(children);
164
+ if (!React2.isValidElement(child)) return null;
165
+ const childProps = child.props;
166
+ const merged = __spreadValues({}, props);
167
+ for (const key of Object.keys(childProps)) {
168
+ if (key === "className") {
169
+ merged.className = [props.className, childProps.className].filter(Boolean).join(" ");
170
+ } else if (key === "style") {
171
+ merged.style = __spreadValues(__spreadValues({}, props.style), childProps.style);
172
+ } else if (key.startsWith("on") && typeof childProps[key] === "function") {
173
+ const parentHandler = props[key];
174
+ if (typeof parentHandler === "function") {
175
+ merged[key] = (...args) => {
176
+ childProps[key](...args);
177
+ parentHandler(...args);
178
+ };
179
+ } else {
180
+ merged[key] = childProps[key];
181
+ }
182
+ } else {
183
+ merged[key] = childProps[key];
184
+ }
185
+ }
186
+ const childRef = child.ref;
187
+ merged.ref = forwardedRef ? mergeRefs(forwardedRef, childRef) : childRef;
188
+ return React2.cloneElement(
189
+ child,
190
+ merged
191
+ );
192
+ }
193
+ );
194
+ Slot.displayName = "Slot";
195
+
196
+ // src/components/ui/button.tsx
197
+ var import_jsx_runtime2 = require("react/jsx-runtime");
198
+ var buttonVariants = (0, import_class_variance_authority.cva)(
199
+ "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",
200
+ {
201
+ variants: {
202
+ variant: {
203
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
204
+ secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
205
+ 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",
206
+ 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",
207
+ "outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
208
+ "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",
209
+ ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
210
+ link: "text-primary underline-offset-4 hover:underline"
211
+ },
212
+ size: {
213
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
214
+ xs: "h-6 gap-1 px-2 text-button-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
215
+ sm: "h-8 gap-1.5 px-3 has-[>svg]:px-2.5",
216
+ lg: "h-10 px-6 has-[>svg]:px-4",
217
+ icon: "size-9",
218
+ "icon-xs": "size-6 [&_svg:not([class*='size-'])]:size-3",
219
+ "icon-sm": "size-8",
220
+ "icon-lg": "size-10"
221
+ }
222
+ },
223
+ defaultVariants: {
224
+ variant: "default",
225
+ size: "default"
226
+ }
227
+ }
228
+ );
229
+ var Button = (0, import_react2.forwardRef)(function Button2(_a, ref) {
230
+ var _b = _a, {
231
+ className,
232
+ variant,
233
+ size,
234
+ asChild = false,
235
+ loading = false,
236
+ disabled,
237
+ type = "button",
238
+ children
239
+ } = _b, props = __objRest(_b, [
240
+ "className",
241
+ "variant",
242
+ "size",
243
+ "asChild",
244
+ "loading",
245
+ "disabled",
246
+ "type",
247
+ "children"
248
+ ]);
249
+ const Comp = asChild ? Slot : "button";
250
+ const isIconOnly = size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg";
251
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
252
+ Comp,
253
+ __spreadProps(__spreadValues({
254
+ className: cn(buttonVariants({ variant, size, className })),
255
+ "data-size": size,
256
+ "data-slot": "button",
257
+ "data-variant": variant,
258
+ disabled: loading || disabled,
259
+ ref,
260
+ type
261
+ }, props), {
262
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
263
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
264
+ !isIconOnly && children
265
+ ] }) : children
266
+ })
267
+ );
268
+ });
269
+
270
+ // src/components/ui/dialog.tsx
271
+ var import_jsx_runtime3 = require("react/jsx-runtime");
272
+ function Dialog(_a) {
273
+ var props = __objRest(_a, []);
274
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_dialog.Dialog.Root, __spreadValues({ "data-slot": "dialog" }, props));
275
+ }
276
+ function DialogPortal(_a) {
277
+ var props = __objRest(_a, []);
278
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_dialog.Dialog.Portal, __spreadValues({ "data-slot": "dialog-portal" }, props));
279
+ }
280
+ function DialogOverlay(_a) {
281
+ var _b = _a, {
282
+ className
283
+ } = _b, props = __objRest(_b, [
284
+ "className"
285
+ ]);
286
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
287
+ import_dialog.Dialog.Backdrop,
288
+ __spreadValues({
289
+ className: cn(
290
+ // WealthX: foreground/50 scrim (matches Figma — foreground token at 50% opacity)
291
+ "fixed inset-0 z-50 bg-foreground/50 data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:fill-mode-forwards data-open:animate-in data-open:fade-in-0",
292
+ className
293
+ ),
294
+ "data-slot": "dialog-overlay"
295
+ }, props)
296
+ );
297
+ }
298
+ var DIALOG_MAX_WIDTHS = {
299
+ sm: "24rem",
300
+ md: "28rem",
301
+ lg: "32rem",
302
+ xl: "36rem",
303
+ "2xl": "42rem",
304
+ "3xl": "48rem",
305
+ "4xl": "56rem",
306
+ full: "100%"
307
+ };
308
+ var DIALOG_AUTO_MIN_WIDTH = "20rem";
309
+ function DialogContent(_a) {
310
+ var _b = _a, {
311
+ className,
312
+ children,
313
+ showCloseButton = true,
314
+ style,
315
+ container,
316
+ align = "top",
317
+ size = "lg",
318
+ minWidth
319
+ } = _b, props = __objRest(_b, [
320
+ "className",
321
+ "children",
322
+ "showCloseButton",
323
+ "style",
324
+ "container",
325
+ "align",
326
+ "size",
327
+ "minWidth"
328
+ ]);
329
+ const themeVars = useThemeVars();
330
+ const isAuto = size === "auto";
331
+ const sizeStyle = isAuto ? { minWidth: minWidth != null ? minWidth : DIALOG_AUTO_MIN_WIDTH } : { maxWidth: DIALOG_MAX_WIDTHS[size] };
332
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(DialogPortal, { container: container != null ? container : void 0, children: [
333
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(DialogOverlay, { style: themeVars }),
334
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
335
+ import_dialog.Dialog.Popup,
336
+ __spreadProps(__spreadValues({
337
+ className: cn(
338
+ // WealthX: removed rounded-lg (sharp corners), shadow-lg (flat panels)
339
+ // max-w-[calc(100%-2rem)] acts as a viewport-edge guard on all sizes.
340
+ // Fixed max-width is applied via inline style (sizeStyle) to avoid
341
+ // Tailwind v4 class-scanning gaps with dynamic class lookups.
342
+ "fixed left-[50%] z-50 grid max-w-[calc(100%-2rem)] translate-x-[-50%] gap-4 border bg-background p-6 duration-200 outline-none 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",
343
+ // "auto" → hug content (with min-width floor); fixed sizes → fill to max-width
344
+ isAuto ? "w-auto" : "w-full",
345
+ align === "center" ? "top-[50%] translate-y-[-50%]" : "top-4 translate-y-0",
346
+ className
347
+ ),
348
+ "data-slot": "dialog-content",
349
+ style: __spreadValues(__spreadValues(__spreadValues({}, themeVars), sizeStyle), style)
350
+ }, props), {
351
+ children: [
352
+ children,
353
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
354
+ import_dialog.Dialog.Close,
355
+ {
356
+ 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",
357
+ "data-slot": "dialog-close",
358
+ children: [
359
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.XIcon, {}),
360
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "sr-only", children: "Close" })
361
+ ]
362
+ }
363
+ ) : null
364
+ ]
365
+ })
366
+ )
367
+ ] });
368
+ }
369
+ function DialogHeader(_a) {
370
+ var _b = _a, {
371
+ className
372
+ } = _b, props = __objRest(_b, [
373
+ "className"
374
+ ]);
375
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
376
+ "div",
377
+ __spreadValues({
378
+ className: cn("flex flex-col gap-1.5", className),
379
+ "data-slot": "dialog-header"
380
+ }, props)
381
+ );
382
+ }
383
+ function DialogFooter(_a) {
384
+ var _b = _a, {
385
+ className,
386
+ showCloseButton = false,
387
+ children
388
+ } = _b, props = __objRest(_b, [
389
+ "className",
390
+ "showCloseButton",
391
+ "children"
392
+ ]);
393
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
394
+ "div",
395
+ __spreadProps(__spreadValues({
396
+ className: cn(
397
+ // WealthX: always row layout, right-aligned, separator above footer
398
+ "flex flex-row justify-end gap-2 border-t border-border pt-4",
399
+ className
400
+ ),
401
+ "data-slot": "dialog-footer"
402
+ }, props), {
403
+ children: [
404
+ children,
405
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
406
+ import_dialog.Dialog.Close,
407
+ {
408
+ className: cn(buttonVariants({ variant: "outline" })),
409
+ type: "button",
410
+ children: "Close"
411
+ }
412
+ ) : null
413
+ ]
414
+ })
415
+ );
416
+ }
417
+ function DialogTitle(_a) {
418
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
419
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
420
+ import_dialog.Dialog.Title,
421
+ __spreadValues({
422
+ className: cn("text-h5 leading-none", className),
423
+ "data-slot": "dialog-title"
424
+ }, props)
425
+ );
426
+ }
427
+
428
+ // src/components/ui/date-picker.tsx
429
+ var React4 = __toESM(require("react"));
430
+ var import_date_fns2 = require("date-fns");
431
+ var import_lucide_react4 = require("lucide-react");
432
+
433
+ // src/components/ui/input.tsx
434
+ var import_jsx_runtime4 = require("react/jsx-runtime");
435
+ function Input(_a) {
436
+ var _b = _a, { className, type } = _b, props = __objRest(_b, ["className", "type"]);
437
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
438
+ "input",
439
+ __spreadValues({
440
+ className: cn(
441
+ "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",
442
+ "focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20",
443
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
444
+ className
445
+ ),
446
+ "data-slot": "input",
447
+ type
448
+ }, props)
449
+ );
450
+ }
451
+
452
+ // src/components/ui/calendar.tsx
453
+ var React3 = __toESM(require("react"));
454
+ var import_lucide_react3 = require("lucide-react");
455
+ var import_react_day_picker = require("react-day-picker");
456
+
457
+ // src/lib/format-date.ts
458
+ var import_date_fns = require("date-fns");
459
+ function safeParse(iso) {
460
+ return (0, import_date_fns.parseISO)(iso);
461
+ }
462
+ function formatDateShort(iso) {
463
+ if (!iso) return "\u2014";
464
+ try {
465
+ return (0, import_date_fns.format)(safeParse(iso), "dd MMM yyyy");
466
+ } catch (e) {
467
+ return iso;
468
+ }
469
+ }
470
+
471
+ // src/components/ui/calendar.tsx
472
+ var import_jsx_runtime5 = require("react/jsx-runtime");
473
+ function CalendarRoot(_a) {
474
+ var _b = _a, {
475
+ className,
476
+ rootRef
477
+ } = _b, props = __objRest(_b, [
478
+ "className",
479
+ "rootRef"
480
+ ]);
481
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
482
+ "div",
483
+ __spreadValues({
484
+ className: cn(className),
485
+ "data-slot": "calendar",
486
+ ref: rootRef
487
+ }, props)
488
+ );
489
+ }
490
+ function CalendarChevron(_a) {
491
+ var _b = _a, {
492
+ className,
493
+ orientation
494
+ } = _b, props = __objRest(_b, [
495
+ "className",
496
+ "orientation"
497
+ ]);
498
+ if (orientation === "left") {
499
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.ChevronLeftIcon, __spreadValues({ className: cn("size-4", className) }, props));
500
+ }
501
+ if (orientation === "right") {
502
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.ChevronRightIcon, __spreadValues({ className: cn("size-4", className) }, props));
503
+ }
504
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.ChevronDownIcon, __spreadValues({ className: cn("size-4", className) }, props));
505
+ }
506
+ function CalendarWeekNumber(_a) {
507
+ var _b = _a, {
508
+ children
509
+ } = _b, props = __objRest(_b, [
510
+ "children"
511
+ ]);
512
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("td", __spreadProps(__spreadValues({}, props), { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children }) }));
513
+ }
514
+ function Calendar(_a) {
515
+ var _b = _a, {
516
+ className,
517
+ classNames,
518
+ showOutsideDays = true,
519
+ captionLayout = "dropdown",
520
+ buttonVariant = "ghost",
521
+ formatters,
522
+ components
523
+ } = _b, props = __objRest(_b, [
524
+ "className",
525
+ "classNames",
526
+ "showOutsideDays",
527
+ "captionLayout",
528
+ "buttonVariant",
529
+ "formatters",
530
+ "components"
531
+ ]);
532
+ const defaultClassNames = (0, import_react_day_picker.getDefaultClassNames)();
533
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
534
+ import_react_day_picker.DayPicker,
535
+ __spreadValues({
536
+ captionLayout,
537
+ className: cn(
538
+ "group/calendar bg-background p-3 font-sans border border-border shadow-sm [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
539
+ String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
540
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
541
+ className
542
+ ),
543
+ classNames: __spreadValues({
544
+ root: cn("w-fit", defaultClassNames.root),
545
+ months: cn(
546
+ "relative flex flex-col gap-4 md:flex-row",
547
+ defaultClassNames.months
548
+ ),
549
+ month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
550
+ nav: cn(
551
+ "absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",
552
+ defaultClassNames.nav
553
+ ),
554
+ button_previous: cn(
555
+ buttonVariants({ variant: buttonVariant }),
556
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
557
+ defaultClassNames.button_previous
558
+ ),
559
+ button_next: cn(
560
+ buttonVariants({ variant: buttonVariant }),
561
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
562
+ defaultClassNames.button_next
563
+ ),
564
+ month_caption: cn(
565
+ "flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)",
566
+ defaultClassNames.month_caption
567
+ ),
568
+ dropdowns: cn(
569
+ "flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-label-small",
570
+ defaultClassNames.dropdowns
571
+ ),
572
+ dropdown_root: cn(
573
+ "relative border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50",
574
+ defaultClassNames.dropdown_root
575
+ ),
576
+ dropdown: cn(
577
+ "absolute inset-0 bg-popover opacity-0",
578
+ defaultClassNames.dropdown
579
+ ),
580
+ caption_label: cn(
581
+ "select-none",
582
+ captionLayout === "label" ? "text-label-small" : "flex h-8 items-center gap-1 pr-1 pl-2 text-label-small [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
583
+ defaultClassNames.caption_label
584
+ ),
585
+ table: "w-full border-collapse",
586
+ weekdays: cn("flex", defaultClassNames.weekdays),
587
+ weekday: cn(
588
+ "flex-1 text-caption font-normal text-muted-foreground select-none",
589
+ defaultClassNames.weekday
590
+ ),
591
+ week: cn("mt-2 flex w-full", defaultClassNames.week),
592
+ week_number_header: cn(
593
+ "w-(--cell-size) select-none",
594
+ defaultClassNames.week_number_header
595
+ ),
596
+ week_number: cn(
597
+ "text-caption text-muted-foreground select-none",
598
+ defaultClassNames.week_number
599
+ ),
600
+ day: cn(
601
+ "group/day relative aspect-square h-full w-full p-0 text-center select-none",
602
+ defaultClassNames.day
603
+ ),
604
+ range_start: cn("bg-accent", defaultClassNames.range_start),
605
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
606
+ range_end: cn("bg-accent", defaultClassNames.range_end),
607
+ today: cn("bg-accent text-accent-foreground", defaultClassNames.today),
608
+ outside: cn(
609
+ "text-muted-foreground aria-selected:text-muted-foreground",
610
+ defaultClassNames.outside
611
+ ),
612
+ disabled: cn(
613
+ "text-muted-foreground opacity-50",
614
+ defaultClassNames.disabled
615
+ ),
616
+ hidden: cn("invisible", defaultClassNames.hidden)
617
+ }, classNames),
618
+ components: __spreadValues({
619
+ Root: CalendarRoot,
620
+ Chevron: CalendarChevron,
621
+ DayButton: CalendarDayButton,
622
+ WeekNumber: CalendarWeekNumber
623
+ }, components),
624
+ formatters: __spreadValues({
625
+ formatMonthDropdown: (date) => date.toLocaleString("default", { month: "short" })
626
+ }, formatters),
627
+ showOutsideDays
628
+ }, props)
629
+ );
630
+ }
631
+ function CalendarDayButton(_a) {
632
+ var _b = _a, {
633
+ className,
634
+ day,
635
+ modifiers
636
+ } = _b, props = __objRest(_b, [
637
+ "className",
638
+ "day",
639
+ "modifiers"
640
+ ]);
641
+ const defaultClassNames = (0, import_react_day_picker.getDefaultClassNames)();
642
+ const ref = React3.useRef(null);
643
+ React3.useEffect(() => {
644
+ var _a2;
645
+ if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
646
+ }, [modifiers.focused]);
647
+ const selectedSingle = modifiers.selected && !modifiers.range_start && !modifiers.range_end ? !modifiers.range_middle : null;
648
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
649
+ Button,
650
+ __spreadValues({
651
+ className: cn(
652
+ "flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 font-normal rounded-none group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-accent-foreground [&>span]:text-caption [&>span]:opacity-70",
653
+ defaultClassNames.day,
654
+ className
655
+ ),
656
+ "data-day": formatDateShort(day.date.toISOString()),
657
+ "data-range-end": modifiers.range_end,
658
+ "data-range-middle": modifiers.range_middle,
659
+ "data-range-start": modifiers.range_start,
660
+ "data-selected-single": selectedSingle,
661
+ ref,
662
+ size: "icon",
663
+ variant: "ghost"
664
+ }, props)
665
+ );
666
+ }
667
+
668
+ // src/components/ui/popover.tsx
669
+ var import_popover = require("@base-ui/react/popover");
670
+ var import_jsx_runtime6 = require("react/jsx-runtime");
671
+ function Popover(_a) {
672
+ var props = __objRest(_a, []);
673
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_popover.Popover.Root, __spreadValues({ "data-slot": "popover" }, props));
674
+ }
675
+ function PopoverTrigger(_a) {
676
+ var props = __objRest(_a, []);
677
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_popover.Popover.Trigger, __spreadValues({ "data-slot": "popover-trigger" }, props));
678
+ }
679
+ function PopoverContent(_a) {
680
+ var _b = _a, {
681
+ className,
682
+ align = "center",
683
+ sideOffset = 4,
684
+ style
685
+ } = _b, props = __objRest(_b, [
686
+ "className",
687
+ "align",
688
+ "sideOffset",
689
+ "style"
690
+ ]);
691
+ const themeVars = useThemeVars();
692
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_popover.Popover.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
693
+ import_popover.Popover.Positioner,
694
+ {
695
+ className: "z-[200]",
696
+ align,
697
+ sideOffset,
698
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
699
+ import_popover.Popover.Popup,
700
+ __spreadValues({
701
+ className: cn(
702
+ "z-50 w-72 border border-border bg-popover p-4 text-popover-foreground shadow-md outline-hidden 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",
703
+ className
704
+ ),
705
+ "data-slot": "popover-content",
706
+ style: __spreadValues(__spreadValues({}, themeVars), style)
707
+ }, props)
708
+ )
709
+ }
710
+ ) });
711
+ }
712
+
713
+ // src/components/ui/date-picker.tsx
714
+ var import_jsx_runtime7 = require("react/jsx-runtime");
715
+ function DatePicker({
716
+ value,
717
+ onChange,
718
+ placeholder = "Pick a date",
719
+ showTimePicker = false,
720
+ disabled = false,
721
+ className,
722
+ calendarProps
723
+ }) {
724
+ const [open, setOpen] = React4.useState(false);
725
+ function handleDaySelect(day) {
726
+ if (!day) {
727
+ onChange == null ? void 0 : onChange(void 0);
728
+ return;
729
+ }
730
+ if (showTimePicker && value) {
731
+ day.setHours(value.getHours(), value.getMinutes());
732
+ }
733
+ onChange == null ? void 0 : onChange(day);
734
+ if (!showTimePicker) setOpen(false);
735
+ }
736
+ function handleTimeChange(e) {
737
+ const [hours, minutes] = e.target.value.split(":").map(Number);
738
+ const next = value ? new Date(value) : /* @__PURE__ */ new Date();
739
+ next.setHours(hours, minutes, 0, 0);
740
+ onChange == null ? void 0 : onChange(next);
741
+ }
742
+ const timeValue = value ? `${String(value.getHours()).padStart(2, "0")}:${String(value.getMinutes()).padStart(2, "0")}` : "";
743
+ let displayValue;
744
+ if (value && showTimePicker) {
745
+ displayValue = (0, import_date_fns2.format)(value, "dd/MM/yyyy HH:mm");
746
+ } else if (value) {
747
+ displayValue = (0, import_date_fns2.format)(value, "dd/MM/yyyy");
748
+ }
749
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Popover, { onOpenChange: disabled ? void 0 : setOpen, open, children: [
750
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
751
+ PopoverTrigger,
752
+ {
753
+ render: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
754
+ Button,
755
+ {
756
+ className: cn(
757
+ "w-full justify-start rounded-none font-normal data-[empty=true]:text-muted-foreground",
758
+ // Show open/focus state when the popover is expanded
759
+ "aria-expanded:border-ring aria-expanded:ring-2 aria-expanded:ring-ring/20",
760
+ className
761
+ ),
762
+ "data-empty": !value,
763
+ "data-slot": "date-picker-trigger",
764
+ disabled,
765
+ variant: "outline"
766
+ }
767
+ ),
768
+ children: [
769
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react4.CalendarIcon, {}),
770
+ value ? displayValue : placeholder
771
+ ]
772
+ }
773
+ ),
774
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
775
+ PopoverContent,
776
+ {
777
+ align: "start",
778
+ className: "w-auto rounded-none p-0 shadow-sm",
779
+ children: [
780
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
781
+ Calendar,
782
+ __spreadProps(__spreadValues({
783
+ captionLayout: "dropdown",
784
+ mode: "single",
785
+ onSelect: handleDaySelect,
786
+ selected: value
787
+ }, calendarProps), {
788
+ className: cn(
789
+ "rounded-none border-0 shadow-none",
790
+ calendarProps == null ? void 0 : calendarProps.className
791
+ )
792
+ })
793
+ ),
794
+ showTimePicker ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "border-t border-border px-3 pb-3 pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("label", { className: "mb-1.5 block text-xs font-medium text-muted-foreground", children: [
795
+ "Time",
796
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
797
+ Input,
798
+ {
799
+ className: "mt-1.5 h-8",
800
+ onChange: handleTimeChange,
801
+ type: "time",
802
+ value: timeValue
803
+ }
804
+ )
805
+ ] }) }) : null
806
+ ]
807
+ }
808
+ )
809
+ ] });
810
+ }
811
+
812
+ // src/components/ui/toggle-group.tsx
813
+ var React5 = __toESM(require("react"));
814
+ var import_toggle_group = require("@base-ui/react/toggle-group");
815
+ var import_toggle2 = require("@base-ui/react/toggle");
816
+
817
+ // src/components/ui/toggle.tsx
818
+ var import_class_variance_authority2 = require("class-variance-authority");
819
+ var import_toggle = require("@base-ui/react/toggle");
820
+ var import_jsx_runtime8 = require("react/jsx-runtime");
821
+ var toggleVariants = (0, import_class_variance_authority2.cva)(
822
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap transition-[color,box-shadow] 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 data-pressed:bg-primary/10 data-pressed:inset-ring data-pressed:inset-ring-primary data-pressed:text-foreground data-pressed:hover:bg-primary/10 data-pressed:hover:text-foreground dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
823
+ {
824
+ variants: {
825
+ variant: {
826
+ default: "bg-transparent hover:bg-muted hover:text-muted-foreground",
827
+ outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground"
828
+ },
829
+ size: {
830
+ default: "h-9 min-w-9 px-2 text-label-large",
831
+ sm: "h-8 min-w-8 px-1.5 text-label-medium",
832
+ lg: "h-10 min-w-10 px-2.5 text-h5"
833
+ }
834
+ },
835
+ defaultVariants: {
836
+ variant: "default",
837
+ size: "default"
838
+ }
839
+ }
840
+ );
841
+
842
+ // src/components/ui/toggle-group.tsx
843
+ var import_jsx_runtime9 = require("react/jsx-runtime");
844
+ var ToggleGroupContext = React5.createContext({
845
+ size: "default",
846
+ variant: "default",
847
+ spacing: 0
848
+ });
849
+ function ToggleGroup(_a) {
850
+ var _b = _a, {
851
+ className,
852
+ variant,
853
+ size,
854
+ spacing = 0,
855
+ type,
856
+ children
857
+ } = _b, props = __objRest(_b, [
858
+ "className",
859
+ "variant",
860
+ "size",
861
+ "spacing",
862
+ "type",
863
+ "children"
864
+ ]);
865
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
866
+ import_toggle_group.ToggleGroup,
867
+ __spreadProps(__spreadValues({
868
+ className: cn(
869
+ // WealthX: removed rounded-md (sharp corners) and shadow-xs (flat panels)
870
+ "group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))]",
871
+ className
872
+ ),
873
+ "data-size": size,
874
+ "data-slot": "toggle-group",
875
+ "data-spacing": spacing,
876
+ "data-variant": variant,
877
+ multiple: type === "multiple",
878
+ style: { "--gap": spacing }
879
+ }, props), {
880
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ToggleGroupContext.Provider, { value: { variant, size, spacing }, children })
881
+ })
882
+ );
883
+ }
884
+ function ToggleGroupItem(_a) {
885
+ var _b = _a, {
886
+ className,
887
+ children,
888
+ variant,
889
+ size
890
+ } = _b, props = __objRest(_b, [
891
+ "className",
892
+ "children",
893
+ "variant",
894
+ "size"
895
+ ]);
896
+ const context = React5.useContext(ToggleGroupContext);
897
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
898
+ import_toggle2.Toggle,
899
+ __spreadProps(__spreadValues({
900
+ className: cn(
901
+ toggleVariants({
902
+ variant: context.variant || variant,
903
+ size: context.size || size
904
+ }),
905
+ "w-auto min-w-0 shrink-0 focus:z-10 focus-visible:z-10",
906
+ // WealthX: no rounded corners on grouped items
907
+ "data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l",
908
+ className
909
+ ),
910
+ "data-size": context.size || size,
911
+ "data-slot": "toggle-group-item",
912
+ "data-spacing": context.spacing,
913
+ "data-variant": context.variant || variant
914
+ }, props), {
915
+ children
916
+ })
917
+ );
918
+ }
919
+
920
+ // src/components/ui/slider.tsx
921
+ var React6 = __toESM(require("react"));
922
+ var import_slider = require("@base-ui/react/slider");
923
+ var import_jsx_runtime10 = require("react/jsx-runtime");
924
+ var Slider = React6.forwardRef(
925
+ ({
926
+ className,
927
+ value,
928
+ defaultValue = 0,
929
+ min = 0,
930
+ max = 100,
931
+ step = 1,
932
+ disabled = false,
933
+ onValueChange
934
+ }, ref) => {
935
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
936
+ import_slider.Slider.Root,
937
+ {
938
+ ref,
939
+ value,
940
+ defaultValue,
941
+ min,
942
+ max,
943
+ step,
944
+ disabled,
945
+ thumbAlignment: "edge",
946
+ onValueChange: (val) => onValueChange == null ? void 0 : onValueChange(val),
947
+ "data-slot": "slider",
948
+ className: cn(
949
+ "relative w-full touch-none select-none",
950
+ disabled && "opacity-50",
951
+ className
952
+ ),
953
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
954
+ import_slider.Slider.Control,
955
+ {
956
+ className: "relative flex h-5 w-full cursor-pointer items-center",
957
+ "data-slot": "slider-control",
958
+ children: [
959
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
960
+ import_slider.Slider.Track,
961
+ {
962
+ className: "relative h-2 w-full overflow-hidden rounded-full bg-muted",
963
+ "data-slot": "slider-track",
964
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
965
+ import_slider.Slider.Indicator,
966
+ {
967
+ className: "absolute h-full rounded-full bg-primary",
968
+ "data-slot": "slider-indicator"
969
+ }
970
+ )
971
+ }
972
+ ),
973
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
974
+ import_slider.Slider.Thumb,
975
+ {
976
+ className: cn(
977
+ "block size-5 rounded-full border-2 border-primary bg-background shadow-sm",
978
+ "outline-none"
979
+ ),
980
+ "data-slot": "slider-thumb"
981
+ }
982
+ )
983
+ ]
984
+ }
985
+ )
986
+ }
987
+ );
988
+ }
989
+ );
990
+ Slider.displayName = "Slider";
991
+
992
+ // src/components/ui/money-input-with-slider.tsx
993
+ var import_jsx_runtime11 = require("react/jsx-runtime");
994
+ function MoneyInputWithSlider({
995
+ label,
996
+ value,
997
+ min,
998
+ max,
999
+ step = 1e3,
1000
+ onChange,
1001
+ disabled = false,
1002
+ className
1003
+ }) {
1004
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: cn("flex flex-col gap-2", className), children: [
1005
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
1006
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-sm text-muted-foreground", children: label }),
1007
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-sm font-semibold tabular-nums text-foreground", children: formatCurrency(value) })
1008
+ ] }),
1009
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1010
+ Slider,
1011
+ {
1012
+ value,
1013
+ min,
1014
+ max,
1015
+ step,
1016
+ disabled,
1017
+ onValueChange: onChange
1018
+ }
1019
+ ),
1020
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between", children: [
1021
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-xs text-muted-foreground", children: formatCurrencyAbbrev(min) }),
1022
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-xs text-muted-foreground", children: formatCurrencyAbbrev(max) })
1023
+ ] })
1024
+ ] });
1025
+ }
1026
+
1027
+ // src/components/ui/savings-goal-modal.tsx
1028
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1029
+ var PERIOD_OPTIONS = [
1030
+ { id: "90d", label: "90 Days", days: 90 },
1031
+ { id: "180d", label: "180 Days", days: 180 },
1032
+ { id: "360d", label: "360 Days", days: 360 },
1033
+ { id: "custom", label: "Custom", days: 0 }
1034
+ ];
1035
+ var PERIOD_DAYS = Object.fromEntries(
1036
+ PERIOD_OPTIONS.map((p) => [p.id, p.days])
1037
+ );
1038
+ function SummaryRow({ label, value }) {
1039
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center justify-between", children: [
1040
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-sm text-foreground", children: label }),
1041
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-sm font-semibold tabular-nums text-foreground", children: formatCurrency(value) })
1042
+ ] });
1043
+ }
1044
+ function SavingsGoalModal({
1045
+ open,
1046
+ onOpenChange,
1047
+ currentMonthlyTrend = 0,
1048
+ defaultGoalAmount = 0,
1049
+ onSave,
1050
+ className
1051
+ }) {
1052
+ var _a;
1053
+ const [goalAmount, setGoalAmount] = (0, import_react3.useState)(defaultGoalAmount);
1054
+ const [selectedPeriod, setSelectedPeriod] = (0, import_react3.useState)("90d");
1055
+ const [customStart, setCustomStart] = (0, import_react3.useState)(void 0);
1056
+ const [customEnd, setCustomEnd] = (0, import_react3.useState)(void 0);
1057
+ const isCustom = selectedPeriod === "custom";
1058
+ const today = /* @__PURE__ */ new Date();
1059
+ const periodDays = isCustom ? customStart && customEnd && customEnd > customStart ? (0, import_date_fns3.differenceInDays)(customEnd, customStart) : 0 : (_a = PERIOD_DAYS[selectedPeriod]) != null ? _a : 90;
1060
+ const monthlyTarget = periodDays > 0 ? Math.round(goalAmount / periodDays * 30) : 0;
1061
+ const canSave = goalAmount > 0 && (!isCustom || periodDays > 0);
1062
+ const handleSave = () => {
1063
+ onSave == null ? void 0 : onSave(goalAmount, periodDays);
1064
+ onOpenChange(false);
1065
+ };
1066
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(DialogContent, { className: cn("max-w-sm top-8 translate-y-0", className), children: [
1067
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DialogTitle, { children: "Savings Target Setter" }) }),
1068
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex flex-col gap-6 py-2", children: [
1069
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1070
+ MoneyInputWithSlider,
1071
+ {
1072
+ label: "Savings Goal",
1073
+ value: goalAmount,
1074
+ min: 0,
1075
+ max: 2e5,
1076
+ step: 500,
1077
+ onChange: setGoalAmount
1078
+ }
1079
+ ),
1080
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex flex-col gap-3", children: [
1081
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-sm font-medium text-foreground", children: "End Goal Date" }),
1082
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1083
+ ToggleGroup,
1084
+ {
1085
+ type: "single",
1086
+ variant: "outline",
1087
+ size: "sm",
1088
+ className: "w-full",
1089
+ value: [selectedPeriod],
1090
+ onValueChange: (values) => {
1091
+ const next = values[0];
1092
+ if (next) setSelectedPeriod(next);
1093
+ },
1094
+ children: PERIOD_OPTIONS.map((option) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1095
+ ToggleGroupItem,
1096
+ {
1097
+ value: option.id,
1098
+ className: "flex-1",
1099
+ children: option.label
1100
+ },
1101
+ option.id
1102
+ ))
1103
+ }
1104
+ ),
1105
+ isCustom && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "grid grid-cols-2 gap-2", children: [
1106
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex flex-col gap-1", children: [
1107
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-xs text-muted-foreground", children: "Start Date" }),
1108
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1109
+ DatePicker,
1110
+ {
1111
+ value: customStart,
1112
+ onChange: setCustomStart,
1113
+ placeholder: "Start date",
1114
+ calendarProps: { disabled: { before: today } }
1115
+ }
1116
+ )
1117
+ ] }),
1118
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex flex-col gap-1", children: [
1119
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-xs text-muted-foreground", children: "End Date" }),
1120
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1121
+ DatePicker,
1122
+ {
1123
+ value: customEnd,
1124
+ onChange: setCustomEnd,
1125
+ placeholder: "End date",
1126
+ calendarProps: {
1127
+ disabled: { before: customStart != null ? customStart : today }
1128
+ }
1129
+ }
1130
+ )
1131
+ ] })
1132
+ ] })
1133
+ ] }),
1134
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex flex-col gap-3 border-t border-border pt-4", children: [
1135
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SummaryRow, { label: "Monthly Savings Target", value: monthlyTarget }),
1136
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SummaryRow, { label: "Current Trend", value: currentMonthlyTrend })
1137
+ ] })
1138
+ ] }),
1139
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(DialogFooter, { children: [
1140
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Button, { variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }),
1141
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Button, { onClick: handleSave, disabled: !canSave, children: "Set Now" })
1142
+ ] })
1143
+ ] }) });
1144
+ }
1145
+ // Annotate the CommonJS export names for ESM import in node:
1146
+ 0 && (module.exports = {
1147
+ SavingsGoalModal
1148
+ });