@wealthx/shadcn 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/.turbo/turbo-build.log +360 -180
  2. package/CHANGELOG.md +6 -0
  3. package/dist/chunk-2A53WPEC.mjs +182 -0
  4. package/dist/{chunk-SIVYAI3M.mjs → chunk-2LLFNGJZ.mjs} +15 -15
  5. package/dist/chunk-2QNOPXMQ.mjs +360 -0
  6. package/dist/{chunk-K5QV4TT6.mjs → chunk-2WCIORP7.mjs} +29 -4
  7. package/dist/{chunk-5NF6T2RS.mjs → chunk-3AREQTZU.mjs} +8 -8
  8. package/dist/{chunk-2EM2FRU6.mjs → chunk-3WGFIFP6.mjs} +5 -5
  9. package/dist/{chunk-K4KOD3KR.mjs → chunk-42NEC57Y.mjs} +44 -25
  10. package/dist/{chunk-FL6DZFJK.mjs → chunk-46Q4335I.mjs} +121 -39
  11. package/dist/chunk-4DO3WM7V.mjs +48 -0
  12. package/dist/chunk-5FHBC6DY.mjs +68 -0
  13. package/dist/chunk-5SAYZ4CI.mjs +40 -0
  14. package/dist/chunk-5WMFKQZ6.mjs +180 -0
  15. package/dist/chunk-623YVI5O.mjs +43 -0
  16. package/dist/{chunk-SFH2NJEJ.mjs → chunk-6OSULDEO.mjs} +3 -3
  17. package/dist/{chunk-UALR6JGV.mjs → chunk-6SR4K5T5.mjs} +1 -1
  18. package/dist/{chunk-D2NSIIXG.mjs → chunk-7KT5HPYM.mjs} +11 -11
  19. package/dist/chunk-A6ER36CW.mjs +456 -0
  20. package/dist/{chunk-QX7IFQSF.mjs → chunk-AHKHVBWR.mjs} +4 -4
  21. package/dist/chunk-AHSCWXYJ.mjs +113 -0
  22. package/dist/{chunk-7GWRPXHD.mjs → chunk-AL6GOL2Y.mjs} +1 -1
  23. package/dist/{chunk-OIKBW2QD.mjs → chunk-AUEUTZIC.mjs} +13 -13
  24. package/dist/{chunk-FYPSTTEJ.mjs → chunk-B7DD3ODQ.mjs} +1 -1
  25. package/dist/{chunk-TLAWKTSA.mjs → chunk-BD3DWDT4.mjs} +3 -3
  26. package/dist/{chunk-S2FKV4M5.mjs → chunk-BDESHD25.mjs} +4 -4
  27. package/dist/{chunk-OKTJFDPN.mjs → chunk-BFB3UH7V.mjs} +2 -2
  28. package/dist/{chunk-DGNHGNYH.mjs → chunk-C6SWS7OW.mjs} +1 -1
  29. package/dist/chunk-CDVG7SFT.mjs +271 -0
  30. package/dist/chunk-CUSHAIUL.mjs +109 -0
  31. package/dist/{chunk-QXKGOMUX.mjs → chunk-CW32WTZU.mjs} +4 -4
  32. package/dist/{chunk-SET2ANTY.mjs → chunk-D447W45Z.mjs} +3 -3
  33. package/dist/{chunk-RCAOCHWA.mjs → chunk-DFL5CV75.mjs} +18 -18
  34. package/dist/chunk-DYSVJ473.mjs +162 -0
  35. package/dist/chunk-E3PQDBYI.mjs +288 -0
  36. package/dist/chunk-EMYBNPIA.mjs +83 -0
  37. package/dist/chunk-EUYPMDQG.mjs +348 -0
  38. package/dist/{chunk-XYPW2XA5.mjs → chunk-EW72FINW.mjs} +11 -11
  39. package/dist/chunk-F24U4QQQ.mjs +234 -0
  40. package/dist/{chunk-VB5M6OZQ.mjs → chunk-F4O2YPXJ.mjs} +1 -1
  41. package/dist/chunk-FFXTQTB4.mjs +84 -0
  42. package/dist/{chunk-ZOWL2L5J.mjs → chunk-FYUSF5KO.mjs} +5 -1
  43. package/dist/{chunk-FTPBQVQ6.mjs → chunk-GNER6MCO.mjs} +1 -1
  44. package/dist/{chunk-2D3HQPFN.mjs → chunk-HF4FUBCY.mjs} +5 -5
  45. package/dist/{chunk-RSUIPKGX.mjs → chunk-HNDTLT5X.mjs} +1 -1
  46. package/dist/{chunk-N6Q5IPKT.mjs → chunk-HO6S3ECM.mjs} +46 -18
  47. package/dist/{chunk-L4NSRQ3T.mjs → chunk-HROG643K.mjs} +1 -1
  48. package/dist/chunk-I2EKKSEF.mjs +148 -0
  49. package/dist/{chunk-QTRSCVQ3.mjs → chunk-I3UDLWQ7.mjs} +1 -1
  50. package/dist/{chunk-AE7MASLF.mjs → chunk-IQGKOT7A.mjs} +9 -6
  51. package/dist/chunk-IXR4BQSQ.mjs +290 -0
  52. package/dist/{chunk-4MM7LHM5.mjs → chunk-J5NW5NCT.mjs} +1 -1
  53. package/dist/{chunk-OLKMCXAR.mjs → chunk-JTG5R5YV.mjs} +24 -24
  54. package/dist/chunk-JUBUN65Q.mjs +106 -0
  55. package/dist/chunk-K7TWMLLW.mjs +520 -0
  56. package/dist/{chunk-BOW7U26Y.mjs → chunk-K7WSRWOU.mjs} +4 -4
  57. package/dist/{chunk-NTYQWVLI.mjs → chunk-KAD26MCC.mjs} +1 -1
  58. package/dist/{chunk-KCWNDYPZ.mjs → chunk-KB7MZMED.mjs} +4 -4
  59. package/dist/chunk-KCKYGQVQ.mjs +61 -0
  60. package/dist/{chunk-VY5NEUP7.mjs → chunk-KLJLDNCA.mjs} +1 -1
  61. package/dist/chunk-LLAGF6BA.mjs +49 -0
  62. package/dist/{chunk-G27TSQLQ.mjs → chunk-M4LTX3MH.mjs} +1 -1
  63. package/dist/{chunk-YIZHS72Z.mjs → chunk-MHHA7QGO.mjs} +94 -54
  64. package/dist/{chunk-P2N2PEFY.mjs → chunk-NCUH54IZ.mjs} +4 -4
  65. package/dist/{chunk-PNRUH7JY.mjs → chunk-OECGKCVF.mjs} +5 -5
  66. package/dist/{chunk-YE67AALL.mjs → chunk-OL65UQHQ.mjs} +10 -10
  67. package/dist/{chunk-LQULK2E3.mjs → chunk-OYBIUEGE.mjs} +1 -1
  68. package/dist/{chunk-LR6LHDP3.mjs → chunk-PGR53HMH.mjs} +7 -7
  69. package/dist/chunk-PUJ42INK.mjs +141 -0
  70. package/dist/{chunk-M4VYX2PV.mjs → chunk-PV3Y7QGK.mjs} +2 -2
  71. package/dist/{chunk-UJZ4UHWI.mjs → chunk-PV7PNA6K.mjs} +4 -4
  72. package/dist/{chunk-6HIOM2HL.mjs → chunk-Q35PNFJ7.mjs} +1 -1
  73. package/dist/{chunk-JZY6TNIS.mjs → chunk-Q5SGEIJV.mjs} +27 -27
  74. package/dist/{chunk-ZFCDYW6N.mjs → chunk-QAX6HCUH.mjs} +1 -1
  75. package/dist/chunk-QHJDGB54.mjs +135 -0
  76. package/dist/chunk-QQSOZQOC.mjs +27 -0
  77. package/dist/chunk-RUX3OLVZ.mjs +59 -0
  78. package/dist/{chunk-QOJ2DQD6.mjs → chunk-S4CTM3UE.mjs} +5 -0
  79. package/dist/{chunk-ZEDMKQK2.mjs → chunk-TAX3KL66.mjs} +1 -1
  80. package/dist/chunk-TC43SMIN.mjs +133 -0
  81. package/dist/chunk-TGVXRD53.mjs +174 -0
  82. package/dist/{chunk-K5VHK7CM.mjs → chunk-TLYSVRSK.mjs} +12 -12
  83. package/dist/{chunk-YCWLFG27.mjs → chunk-TOIVHWNC.mjs} +1 -1
  84. package/dist/chunk-TXUBGKB7.mjs +160 -0
  85. package/dist/chunk-UEREFDAE.mjs +75 -0
  86. package/dist/chunk-UTCQN6XU.mjs +123 -0
  87. package/dist/{chunk-37AE3OM5.mjs → chunk-V4CUTCHS.mjs} +4 -4
  88. package/dist/{chunk-THVO2N47.mjs → chunk-VFH632TB.mjs} +9 -9
  89. package/dist/{chunk-3ERBUVHC.mjs → chunk-VJ3GC7W3.mjs} +95 -49
  90. package/dist/{chunk-V6XGXYCJ.mjs → chunk-VLELWBEW.mjs} +4 -4
  91. package/dist/{chunk-FEZKMUCF.mjs → chunk-WDTXHLYM.mjs} +1 -1
  92. package/dist/chunk-WUA546RX.mjs +129 -0
  93. package/dist/chunk-XHGISOX5.mjs +257 -0
  94. package/dist/chunk-XIY5DJXI.mjs +168 -0
  95. package/dist/{chunk-TOWTPLRC.mjs → chunk-XN37434W.mjs} +8 -8
  96. package/dist/{chunk-KLTACJ2G.mjs → chunk-XTWAJWCQ.mjs} +1 -1
  97. package/dist/chunk-Y24TXIFJ.mjs +518 -0
  98. package/dist/{chunk-DMXYRCHM.mjs → chunk-Y6UM3VTN.mjs} +4 -4
  99. package/dist/components/ui/about-you-form.js +1120 -0
  100. package/dist/components/ui/about-you-form.mjs +323 -0
  101. package/dist/components/ui/account-list-carousel.js +304 -0
  102. package/dist/components/ui/account-list-carousel.mjs +11 -0
  103. package/dist/components/ui/add-column-modal.js +1 -1
  104. package/dist/components/ui/add-column-modal.mjs +6 -6
  105. package/dist/components/ui/add-lead-modal.js +2 -2
  106. package/dist/components/ui/add-lead-modal.mjs +6 -6
  107. package/dist/components/ui/advisor-card.mjs +2 -2
  108. package/dist/components/ui/agent-evaluation-toast.js +299 -0
  109. package/dist/components/ui/agent-evaluation-toast.mjs +12 -0
  110. package/dist/components/ui/ai-assistant-drawer.mjs +5 -5
  111. package/dist/components/ui/ai-builder.js +3 -3
  112. package/dist/components/ui/ai-builder.mjs +5 -5
  113. package/dist/components/ui/ai-conversations.js +2 -2
  114. package/dist/components/ui/ai-conversations.mjs +11 -11
  115. package/dist/components/ui/alert-dialog.mjs +3 -3
  116. package/dist/components/ui/applicant-document-checklist.js +346 -0
  117. package/dist/components/ui/applicant-document-checklist.mjs +10 -0
  118. package/dist/components/ui/applicant-expenses-section.js +455 -0
  119. package/dist/components/ui/applicant-expenses-section.mjs +220 -0
  120. package/dist/components/ui/applicant-navigation-bar.js +309 -0
  121. package/dist/components/ui/applicant-navigation-bar.mjs +87 -0
  122. package/dist/components/ui/applicant-switcher.js +268 -0
  123. package/dist/components/ui/applicant-switcher.mjs +46 -0
  124. package/dist/components/ui/application-mobile-layout.js +88 -0
  125. package/dist/components/ui/application-mobile-layout.mjs +8 -0
  126. package/dist/components/ui/appointment-action-dialogs.js +1 -1
  127. package/dist/components/ui/appointment-action-dialogs.mjs +10 -10
  128. package/dist/components/ui/appointment-availability-settings.js +78 -31
  129. package/dist/components/ui/appointment-availability-settings.mjs +12 -10
  130. package/dist/components/ui/appointment-book-dialog.js +137 -58
  131. package/dist/components/ui/appointment-book-dialog.mjs +14 -14
  132. package/dist/components/ui/appointment-calendar-view.js +1 -1
  133. package/dist/components/ui/appointment-calendar-view.mjs +4 -4
  134. package/dist/components/ui/appointment-detail-sheet.js +38 -11
  135. package/dist/components/ui/appointment-detail-sheet.mjs +13 -13
  136. package/dist/components/ui/appointment-gmail-connect.mjs +2 -2
  137. package/dist/components/ui/appointment-time-slot-picker.mjs +2 -2
  138. package/dist/components/ui/appointment-upcoming-card.js +1 -1
  139. package/dist/components/ui/appointment-upcoming-card.mjs +10 -10
  140. package/dist/components/ui/asset-accordion.js +506 -0
  141. package/dist/components/ui/asset-accordion.mjs +202 -0
  142. package/dist/components/ui/assets-liabilities-side-card.js +328 -0
  143. package/dist/components/ui/assets-liabilities-side-card.mjs +127 -0
  144. package/dist/components/ui/auth-page-layout.js +3 -3
  145. package/dist/components/ui/auth-page-layout.mjs +1 -1
  146. package/dist/components/ui/backoffice-alert-history-chart.mjs +4 -4
  147. package/dist/components/ui/backoffice-alert-matching-chart.js +786 -0
  148. package/dist/components/ui/backoffice-alert-matching-chart.mjs +19 -0
  149. package/dist/components/ui/backoffice-alerts-chart.mjs +4 -4
  150. package/dist/components/ui/backoffice-connections-chart.mjs +4 -4
  151. package/dist/components/ui/backoffice-contact-history-chart.mjs +4 -4
  152. package/dist/components/ui/backoffice-contact-matching-chart.js +803 -0
  153. package/dist/components/ui/backoffice-contact-matching-chart.mjs +19 -0
  154. package/dist/components/ui/backoffice-signup-steps.js +1673 -0
  155. package/dist/components/ui/backoffice-signup-steps.mjs +36 -0
  156. package/dist/components/ui/bank-statement-document-table.js +467 -0
  157. package/dist/components/ui/bank-statement-document-table.mjs +12 -0
  158. package/dist/components/ui/bank-statement-generate-dialog.js +1517 -0
  159. package/dist/components/ui/bank-statement-generate-dialog.mjs +27 -0
  160. package/dist/components/ui/bank-statement-pdf-viewer.js +525 -0
  161. package/dist/components/ui/bank-statement-pdf-viewer.mjs +14 -0
  162. package/dist/components/ui/banking-accounts-connect.js +336 -0
  163. package/dist/components/ui/banking-accounts-connect.mjs +114 -0
  164. package/dist/components/ui/borrowing-capacity-atoms.js +382 -0
  165. package/dist/components/ui/borrowing-capacity-atoms.mjs +17 -0
  166. package/dist/components/ui/borrowing-capacity-card.js +835 -0
  167. package/dist/components/ui/borrowing-capacity-card.mjs +89 -0
  168. package/dist/components/ui/borrowing-capacity-line-chart.mjs +4 -4
  169. package/dist/components/ui/broker-info-panel.js +281 -0
  170. package/dist/components/ui/broker-info-panel.mjs +59 -0
  171. package/dist/components/ui/calculator-input-item.js +101 -0
  172. package/dist/components/ui/calculator-input-item.mjs +8 -0
  173. package/dist/components/ui/calculator-section.js +743 -0
  174. package/dist/components/ui/calculator-section.mjs +220 -0
  175. package/dist/components/ui/calendar.mjs +2 -2
  176. package/dist/components/ui/cash-balance-line-chart.mjs +5 -5
  177. package/dist/components/ui/cashflow-bar-chart.mjs +4 -4
  178. package/dist/components/ui/category-edit-dialog.js +737 -0
  179. package/dist/components/ui/category-edit-dialog.mjs +16 -0
  180. package/dist/components/ui/chat-widget.mjs +3 -3
  181. package/dist/components/ui/color-picker.mjs +4 -4
  182. package/dist/components/ui/connect-bank-step.js +511 -0
  183. package/dist/components/ui/connect-bank-step.mjs +287 -0
  184. package/dist/components/ui/contact-alert-dialog.js +1405 -0
  185. package/dist/components/ui/contact-alert-dialog.mjs +27 -0
  186. package/dist/components/ui/create-contact-modal.js +1028 -0
  187. package/dist/components/ui/create-contact-modal.mjs +21 -0
  188. package/dist/components/ui/csv-import-modal.js +583 -0
  189. package/dist/components/ui/csv-import-modal.mjs +14 -0
  190. package/dist/components/ui/currency-input.js +439 -0
  191. package/dist/components/ui/currency-input.mjs +13 -0
  192. package/dist/components/ui/dashboard-expense-categories.js +355 -0
  193. package/dist/components/ui/dashboard-expense-categories.mjs +186 -0
  194. package/dist/components/ui/dashboard-transactions-table.js +1083 -0
  195. package/dist/components/ui/dashboard-transactions-table.mjs +177 -0
  196. package/dist/components/ui/data-table.mjs +6 -6
  197. package/dist/components/ui/date-picker.mjs +6 -6
  198. package/dist/components/ui/debt-accordion.js +523 -0
  199. package/dist/components/ui/debt-accordion.mjs +219 -0
  200. package/dist/components/ui/delete-contact-component.js +479 -0
  201. package/dist/components/ui/delete-contact-component.mjs +14 -0
  202. package/dist/components/ui/dialog.js +1 -1
  203. package/dist/components/ui/dialog.mjs +3 -3
  204. package/dist/components/ui/document-checklist-template.mjs +4 -4
  205. package/dist/components/ui/drawer.mjs +3 -3
  206. package/dist/components/ui/dropdown-menu.mjs +3 -3
  207. package/dist/components/ui/dynamic-tabs.js +274 -0
  208. package/dist/components/ui/dynamic-tabs.mjs +116 -0
  209. package/dist/components/ui/editable-money-item.js +306 -0
  210. package/dist/components/ui/editable-money-item.mjs +12 -0
  211. package/dist/components/ui/expense-bar-chart.mjs +4 -4
  212. package/dist/components/ui/expense-detail-item.js +506 -0
  213. package/dist/components/ui/expense-detail-item.mjs +15 -0
  214. package/dist/components/ui/expense-work-details.js +1259 -0
  215. package/dist/components/ui/expense-work-details.mjs +175 -0
  216. package/dist/components/ui/field.mjs +2 -2
  217. package/dist/components/ui/file-preview-dialog.js +704 -0
  218. package/dist/components/ui/file-preview-dialog.mjs +17 -0
  219. package/dist/components/ui/financial-cards.mjs +2 -2
  220. package/dist/components/ui/financial-drawers.js +1 -1
  221. package/dist/components/ui/financial-drawers.mjs +5 -5
  222. package/dist/components/ui/financial-sections.mjs +4 -4
  223. package/dist/components/ui/form-primitives.mjs +2 -2
  224. package/dist/components/ui/frontend-signup-steps.js +1239 -0
  225. package/dist/components/ui/frontend-signup-steps.mjs +38 -0
  226. package/dist/components/ui/income-bar-chart.mjs +4 -4
  227. package/dist/components/ui/income-sources-card.js +269 -0
  228. package/dist/components/ui/income-sources-card.mjs +100 -0
  229. package/dist/components/ui/income-summary-component.js +361 -0
  230. package/dist/components/ui/income-summary-component.mjs +84 -0
  231. package/dist/components/ui/income-work-details.js +1663 -0
  232. package/dist/components/ui/income-work-details.mjs +28 -0
  233. package/dist/components/ui/incoming-outgoings-card.js +218 -0
  234. package/dist/components/ui/incoming-outgoings-card.mjs +82 -0
  235. package/dist/components/ui/interest-rate-input.js +442 -0
  236. package/dist/components/ui/interest-rate-input.mjs +90 -0
  237. package/dist/components/ui/interest-rate-section.js +337 -0
  238. package/dist/components/ui/interest-rate-section.mjs +84 -0
  239. package/dist/components/ui/interest-rate-used.js +202 -0
  240. package/dist/components/ui/interest-rate-used.mjs +62 -0
  241. package/dist/components/ui/kanban-column.js +338 -160
  242. package/dist/components/ui/kanban-column.mjs +13 -11
  243. package/dist/components/ui/loan-applicant-information.js +336 -0
  244. package/dist/components/ui/loan-applicant-information.mjs +59 -0
  245. package/dist/components/ui/loan-applicant-invite.js +319 -0
  246. package/dist/components/ui/loan-applicant-invite.mjs +68 -0
  247. package/dist/components/ui/loan-application-badge.js +236 -0
  248. package/dist/components/ui/loan-application-badge.mjs +10 -0
  249. package/dist/components/ui/loan-application-cards.js +356 -0
  250. package/dist/components/ui/loan-application-cards.mjs +110 -0
  251. package/dist/components/ui/loan-entry-shell.js +104 -0
  252. package/dist/components/ui/loan-entry-shell.mjs +8 -0
  253. package/dist/components/ui/loan-financials.js +410 -0
  254. package/dist/components/ui/loan-financials.mjs +76 -0
  255. package/dist/components/ui/loan-option-card.js +102 -0
  256. package/dist/components/ui/loan-option-card.mjs +41 -0
  257. package/dist/components/ui/loan-option-group.js +288 -0
  258. package/dist/components/ui/loan-option-group.mjs +10 -0
  259. package/dist/components/ui/loan-steps.js +1121 -0
  260. package/dist/components/ui/loan-steps.mjs +509 -0
  261. package/dist/components/ui/loan-wizard-shell.js +452 -0
  262. package/dist/components/ui/loan-wizard-shell.mjs +11 -0
  263. package/dist/components/ui/money-input-with-slider.js +210 -0
  264. package/dist/components/ui/money-input-with-slider.mjs +10 -0
  265. package/dist/components/ui/money-item-with-color-indicator.js +314 -0
  266. package/dist/components/ui/money-item-with-color-indicator.mjs +20 -0
  267. package/dist/components/ui/opportunity-card.js +235 -97
  268. package/dist/components/ui/opportunity-card.mjs +11 -9
  269. package/dist/components/ui/opportunity-edit-modals.js +1 -1
  270. package/dist/components/ui/opportunity-edit-modals.mjs +15 -15
  271. package/dist/components/ui/opportunity-summary-tab.js +1 -1
  272. package/dist/components/ui/opportunity-summary-tab.mjs +19 -19
  273. package/dist/components/ui/pagination.mjs +4 -4
  274. package/dist/components/ui/password-strength-tooltip.mjs +4 -4
  275. package/dist/components/ui/pipeline-board.js +358 -176
  276. package/dist/components/ui/pipeline-board.mjs +16 -14
  277. package/dist/components/ui/pipeline-chart.mjs +3 -3
  278. package/dist/components/ui/pipeline-dialogs.js +1 -1
  279. package/dist/components/ui/pipeline-dialogs.mjs +9 -9
  280. package/dist/components/ui/pipeline-primitives.js +75 -8
  281. package/dist/components/ui/pipeline-primitives.mjs +3 -2
  282. package/dist/components/ui/popover.mjs +3 -3
  283. package/dist/components/ui/property-asset-card.js +428 -0
  284. package/dist/components/ui/property-asset-card.mjs +156 -0
  285. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +4 -4
  286. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +4 -4
  287. package/dist/components/ui/property-list-carousel.js +295 -0
  288. package/dist/components/ui/property-list-carousel.mjs +11 -0
  289. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +4 -4
  290. package/dist/components/ui/property-report-dialog.js +1148 -0
  291. package/dist/components/ui/property-report-dialog.mjs +25 -0
  292. package/dist/components/ui/resource-center.js +748 -0
  293. package/dist/components/ui/resource-center.mjs +24 -0
  294. package/dist/components/ui/review-alerts-dialog.js +569 -0
  295. package/dist/components/ui/review-alerts-dialog.mjs +15 -0
  296. package/dist/components/ui/savings-goal-modal.js +1148 -0
  297. package/dist/components/ui/savings-goal-modal.mjs +160 -0
  298. package/dist/components/ui/scenario-drawer.js +791 -0
  299. package/dist/components/ui/scenario-drawer.mjs +294 -0
  300. package/dist/components/ui/scenario-item.js +256 -0
  301. package/dist/components/ui/scenario-item.mjs +11 -0
  302. package/dist/components/ui/scenario-list.js +507 -0
  303. package/dist/components/ui/scenario-list.mjs +100 -0
  304. package/dist/components/ui/select.mjs +3 -3
  305. package/dist/components/ui/share-details-dialog.js +636 -0
  306. package/dist/components/ui/share-details-dialog.mjs +19 -0
  307. package/dist/components/ui/sheet.mjs +3 -3
  308. package/dist/components/ui/sidebar-nav.mjs +5 -5
  309. package/dist/components/ui/signup-form-primitives.js +770 -0
  310. package/dist/components/ui/signup-form-primitives.mjs +25 -0
  311. package/dist/components/ui/signup-shell.js +338 -0
  312. package/dist/components/ui/signup-shell.mjs +13 -0
  313. package/dist/components/ui/stage-timeline.js +103 -33
  314. package/dist/components/ui/stage-timeline.mjs +5 -4
  315. package/dist/components/ui/submission-confirmation-card.js +284 -0
  316. package/dist/components/ui/submission-confirmation-card.mjs +62 -0
  317. package/dist/components/ui/tooltip.mjs +3 -3
  318. package/dist/components/ui/top-three-product.js +374 -0
  319. package/dist/components/ui/top-three-product.mjs +129 -0
  320. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +4 -4
  321. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -5
  322. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +4 -4
  323. package/dist/components/ui/transactions-summary-block.js +95 -0
  324. package/dist/components/ui/transactions-summary-block.mjs +34 -0
  325. package/dist/components/ui/two-fa-setup-form.mjs +3 -3
  326. package/dist/index.js +9430 -4573
  327. package/dist/index.mjs +404 -251
  328. package/dist/lib/colors.js +6 -0
  329. package/dist/lib/colors.mjs +3 -1
  330. package/dist/lib/theme-provider.mjs +2 -2
  331. package/dist/styles.css +1 -1
  332. package/package.json +366 -2
  333. package/src/components/index.tsx +223 -0
  334. package/src/components/ui/about-you-form.tsx +397 -0
  335. package/src/components/ui/account-list-carousel.tsx +87 -0
  336. package/src/components/ui/add-lead-modal.tsx +1 -1
  337. package/src/components/ui/agent-evaluation-toast.tsx +191 -0
  338. package/src/components/ui/ai-builder.tsx +3 -5
  339. package/src/components/ui/ai-conversations.tsx +1 -1
  340. package/src/components/ui/applicant-document-checklist.tsx +175 -0
  341. package/src/components/ui/applicant-expenses-section.tsx +260 -0
  342. package/src/components/ui/applicant-navigation-bar.tsx +104 -0
  343. package/src/components/ui/applicant-switcher.tsx +54 -0
  344. package/src/components/ui/application-mobile-layout.tsx +34 -0
  345. package/src/components/ui/appointment-availability-settings.tsx +115 -23
  346. package/src/components/ui/appointment-book-dialog.tsx +406 -259
  347. package/src/components/ui/appointment-calendar-view.tsx +4 -1
  348. package/src/components/ui/appointment-detail-sheet.tsx +59 -24
  349. package/src/components/ui/appointment-time-slot-picker.tsx +5 -1
  350. package/src/components/ui/asset-accordion.tsx +241 -0
  351. package/src/components/ui/assets-liabilities-side-card.tsx +157 -0
  352. package/src/components/ui/auth-page-layout.tsx +3 -3
  353. package/src/components/ui/backoffice-alert-matching-chart.tsx +320 -0
  354. package/src/components/ui/backoffice-contact-matching-chart.tsx +341 -0
  355. package/src/components/ui/backoffice-signup-steps.tsx +615 -0
  356. package/src/components/ui/bank-statement-document-table.tsx +222 -0
  357. package/src/components/ui/bank-statement-generate-dialog.tsx +435 -0
  358. package/src/components/ui/bank-statement-pdf-viewer.tsx +241 -0
  359. package/src/components/ui/banking-accounts-connect.tsx +187 -0
  360. package/src/components/ui/borrowing-capacity-atoms.tsx +228 -0
  361. package/src/components/ui/borrowing-capacity-card.tsx +155 -0
  362. package/src/components/ui/broker-info-panel.tsx +94 -0
  363. package/src/components/ui/calculator-input-item.tsx +49 -0
  364. package/src/components/ui/calculator-section.tsx +275 -0
  365. package/src/components/ui/category-edit-dialog.tsx +300 -0
  366. package/src/components/ui/connect-bank-step.tsx +379 -0
  367. package/src/components/ui/contact-alert-dialog.tsx +710 -0
  368. package/src/components/ui/create-contact-modal.tsx +237 -0
  369. package/src/components/ui/csv-import-modal.tsx +153 -0
  370. package/src/components/ui/currency-input.tsx +104 -0
  371. package/src/components/ui/dashboard-expense-categories.tsx +262 -0
  372. package/src/components/ui/dashboard-transactions-table.tsx +241 -0
  373. package/src/components/ui/debt-accordion.tsx +254 -0
  374. package/src/components/ui/delete-contact-component.tsx +87 -0
  375. package/src/components/ui/dialog.tsx +2 -2
  376. package/src/components/ui/dynamic-tabs.tsx +149 -0
  377. package/src/components/ui/editable-money-item.tsx +176 -0
  378. package/src/components/ui/expense-detail-item.tsx +216 -0
  379. package/src/components/ui/expense-work-details.tsx +229 -0
  380. package/src/components/ui/file-preview-dialog.tsx +292 -0
  381. package/src/components/ui/financial-drawers.tsx +1 -1
  382. package/src/components/ui/frontend-signup-steps.tsx +548 -0
  383. package/src/components/ui/income-sources-card.tsx +143 -0
  384. package/src/components/ui/income-summary-component.tsx +120 -0
  385. package/src/components/ui/income-work-details.tsx +429 -0
  386. package/src/components/ui/incoming-outgoings-card.tsx +111 -0
  387. package/src/components/ui/interest-rate-input.tsx +111 -0
  388. package/src/components/ui/interest-rate-section.tsx +158 -0
  389. package/src/components/ui/interest-rate-used.tsx +82 -0
  390. package/src/components/ui/kanban-column.tsx +53 -2
  391. package/src/components/ui/loan-applicant-information.tsx +64 -0
  392. package/src/components/ui/loan-applicant-invite.tsx +67 -0
  393. package/src/components/ui/loan-application-badge.tsx +70 -0
  394. package/src/components/ui/loan-application-cards.tsx +152 -0
  395. package/src/components/ui/loan-entry-shell.tsx +86 -0
  396. package/src/components/ui/loan-financials.tsx +77 -0
  397. package/src/components/ui/loan-option-card.tsx +62 -0
  398. package/src/components/ui/loan-option-group.tsx +106 -0
  399. package/src/components/ui/loan-steps.tsx +630 -0
  400. package/src/components/ui/loan-wizard-shell.tsx +235 -0
  401. package/src/components/ui/money-input-with-slider.tsx +77 -0
  402. package/src/components/ui/money-item-with-color-indicator.tsx +30 -0
  403. package/src/components/ui/opportunity-card.tsx +46 -18
  404. package/src/components/ui/pipeline-board.tsx +13 -0
  405. package/src/components/ui/pipeline-primitives.tsx +28 -0
  406. package/src/components/ui/property-asset-card.tsx +221 -0
  407. package/src/components/ui/property-list-carousel.tsx +73 -0
  408. package/src/components/ui/property-report-dialog.tsx +355 -0
  409. package/src/components/ui/resource-center.tsx +539 -0
  410. package/src/components/ui/review-alerts-dialog.tsx +163 -0
  411. package/src/components/ui/savings-goal-modal.tsx +169 -0
  412. package/src/components/ui/scenario-drawer.tsx +358 -0
  413. package/src/components/ui/scenario-item.tsx +141 -0
  414. package/src/components/ui/scenario-list.tsx +150 -0
  415. package/src/components/ui/share-details-dialog.tsx +238 -0
  416. package/src/components/ui/signup-form-primitives.tsx +212 -0
  417. package/src/components/ui/signup-shell.tsx +180 -0
  418. package/src/components/ui/stage-timeline.tsx +11 -0
  419. package/src/components/ui/submission-confirmation-card.tsx +68 -0
  420. package/src/components/ui/top-three-product.tsx +207 -0
  421. package/src/components/ui/transactions-summary-block.tsx +59 -0
  422. package/src/lib/colors.ts +12 -0
  423. package/src/lib/format-date.ts +2 -2
  424. package/src/styles/styles-css.ts +1 -1
  425. package/tsup.config.ts +77 -1
  426. package/dist/{chunk-5VOTTIXF.mjs → chunk-FRT3S72S.mjs} +3 -3
  427. package/dist/{chunk-7BTFGCFC.mjs → chunk-MUV4EGDW.mjs} +3 -3
  428. package/dist/{chunk-57ZXILTS.mjs → chunk-MXP2RX2V.mjs} +3 -3
  429. package/dist/{chunk-ZKWXDQDG.mjs → chunk-VCDGLN25.mjs} +3 -3
  430. package/dist/{chunk-FLL633WS.mjs → chunk-ZXEUBBHJ.mjs} +3 -3
@@ -0,0 +1,1083 @@
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/dashboard-transactions-table.tsx
60
+ var dashboard_transactions_table_exports = {};
61
+ __export(dashboard_transactions_table_exports, {
62
+ DashboardTransactionsTable: () => DashboardTransactionsTable
63
+ });
64
+ module.exports = __toCommonJS(dashboard_transactions_table_exports);
65
+ var import_react5 = require("react");
66
+ var import_lucide_react7 = require("lucide-react");
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/components/ui/card.tsx
108
+ var import_jsx_runtime = require("react/jsx-runtime");
109
+ function Card(_a) {
110
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
111
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
112
+ "div",
113
+ __spreadValues({
114
+ className: cn(
115
+ "flex flex-col gap-6 border bg-card py-6 text-card-foreground shadow-sm",
116
+ className
117
+ ),
118
+ "data-slot": "card"
119
+ }, props)
120
+ );
121
+ }
122
+ function CardHeader(_a) {
123
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
124
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
125
+ "div",
126
+ __spreadValues({
127
+ className: cn(
128
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-center gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
129
+ className
130
+ ),
131
+ "data-slot": "card-header"
132
+ }, props)
133
+ );
134
+ }
135
+ function CardTitle(_a) {
136
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
137
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
138
+ "div",
139
+ __spreadValues({
140
+ className: cn("text-label-large", className),
141
+ "data-slot": "card-title"
142
+ }, props)
143
+ );
144
+ }
145
+ function CardContent(_a) {
146
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
147
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
148
+ "div",
149
+ __spreadValues({
150
+ className: cn("px-6", className),
151
+ "data-slot": "card-content"
152
+ }, props)
153
+ );
154
+ }
155
+
156
+ // src/components/ui/button.tsx
157
+ var import_react = require("react");
158
+ var import_class_variance_authority = require("class-variance-authority");
159
+ var import_lucide_react = require("lucide-react");
160
+
161
+ // src/lib/slot.tsx
162
+ var React = __toESM(require("react"));
163
+ function mergeRefs(...refs) {
164
+ return (value) => {
165
+ for (const ref of refs) {
166
+ if (typeof ref === "function") ref(value);
167
+ else if (ref !== null)
168
+ ref.current = value;
169
+ }
170
+ };
171
+ }
172
+ var Slot = React.forwardRef(
173
+ (_a, forwardedRef) => {
174
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
175
+ const child = React.Children.only(children);
176
+ if (!React.isValidElement(child)) return null;
177
+ const childProps = child.props;
178
+ const merged = __spreadValues({}, props);
179
+ for (const key of Object.keys(childProps)) {
180
+ if (key === "className") {
181
+ merged.className = [props.className, childProps.className].filter(Boolean).join(" ");
182
+ } else if (key === "style") {
183
+ merged.style = __spreadValues(__spreadValues({}, props.style), childProps.style);
184
+ } else if (key.startsWith("on") && typeof childProps[key] === "function") {
185
+ const parentHandler = props[key];
186
+ if (typeof parentHandler === "function") {
187
+ merged[key] = (...args) => {
188
+ childProps[key](...args);
189
+ parentHandler(...args);
190
+ };
191
+ } else {
192
+ merged[key] = childProps[key];
193
+ }
194
+ } else {
195
+ merged[key] = childProps[key];
196
+ }
197
+ }
198
+ const childRef = child.ref;
199
+ merged.ref = forwardedRef ? mergeRefs(forwardedRef, childRef) : childRef;
200
+ return React.cloneElement(
201
+ child,
202
+ merged
203
+ );
204
+ }
205
+ );
206
+ Slot.displayName = "Slot";
207
+
208
+ // src/components/ui/button.tsx
209
+ var import_jsx_runtime2 = require("react/jsx-runtime");
210
+ var buttonVariants = (0, import_class_variance_authority.cva)(
211
+ "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",
212
+ {
213
+ variants: {
214
+ variant: {
215
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
216
+ secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
217
+ 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",
218
+ 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",
219
+ "outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
220
+ "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",
221
+ ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
222
+ link: "text-primary underline-offset-4 hover:underline"
223
+ },
224
+ size: {
225
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
226
+ xs: "h-6 gap-1 px-2 text-button-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
227
+ sm: "h-8 gap-1.5 px-3 has-[>svg]:px-2.5",
228
+ lg: "h-10 px-6 has-[>svg]:px-4",
229
+ icon: "size-9",
230
+ "icon-xs": "size-6 [&_svg:not([class*='size-'])]:size-3",
231
+ "icon-sm": "size-8",
232
+ "icon-lg": "size-10"
233
+ }
234
+ },
235
+ defaultVariants: {
236
+ variant: "default",
237
+ size: "default"
238
+ }
239
+ }
240
+ );
241
+ var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
242
+ var _b = _a, {
243
+ className,
244
+ variant,
245
+ size,
246
+ asChild = false,
247
+ loading = false,
248
+ disabled,
249
+ type = "button",
250
+ children
251
+ } = _b, props = __objRest(_b, [
252
+ "className",
253
+ "variant",
254
+ "size",
255
+ "asChild",
256
+ "loading",
257
+ "disabled",
258
+ "type",
259
+ "children"
260
+ ]);
261
+ const Comp = asChild ? Slot : "button";
262
+ const isIconOnly = size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg";
263
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
264
+ Comp,
265
+ __spreadProps(__spreadValues({
266
+ className: cn(buttonVariants({ variant, size, className })),
267
+ "data-size": size,
268
+ "data-slot": "button",
269
+ "data-variant": variant,
270
+ disabled: loading || disabled,
271
+ ref,
272
+ type
273
+ }, props), {
274
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
275
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
276
+ !isIconOnly && children
277
+ ] }) : children
278
+ })
279
+ );
280
+ });
281
+
282
+ // src/components/ui/spinner.tsx
283
+ var import_class_variance_authority2 = require("class-variance-authority");
284
+ var import_lucide_react2 = require("lucide-react");
285
+ var import_jsx_runtime3 = require("react/jsx-runtime");
286
+ var spinnerVariants = (0, import_class_variance_authority2.cva)("animate-spin shrink-0", {
287
+ variants: {
288
+ size: {
289
+ sm: "size-3",
290
+ default: "size-4",
291
+ lg: "size-6",
292
+ xl: "size-8"
293
+ }
294
+ },
295
+ defaultVariants: {
296
+ size: "default"
297
+ }
298
+ });
299
+ function Spinner(_a) {
300
+ var _b = _a, { className, size } = _b, props = __objRest(_b, ["className", "size"]);
301
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
302
+ import_lucide_react2.LoaderCircle,
303
+ __spreadValues({
304
+ "aria-hidden": "true",
305
+ className: cn(spinnerVariants({ size }), className),
306
+ "data-slot": "spinner"
307
+ }, props)
308
+ );
309
+ }
310
+
311
+ // src/components/ui/badge.tsx
312
+ var import_class_variance_authority3 = require("class-variance-authority");
313
+ var import_jsx_runtime4 = require("react/jsx-runtime");
314
+ var badgeVariants = (0, import_class_variance_authority3.cva)(
315
+ "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",
316
+ {
317
+ variants: {
318
+ variant: {
319
+ default: "border-primary/40 bg-primary/10 text-foreground [a&]:hover:bg-primary/15",
320
+ secondary: "border-border bg-muted text-muted-foreground [a&]:hover:bg-muted/80",
321
+ 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",
322
+ success: "border-success/40 bg-success/10 text-success-text [a&]:hover:bg-success/15",
323
+ warning: "border-warning/40 bg-warning/10 text-warning-text [a&]:hover:bg-warning/15",
324
+ info: "border-info/40 bg-info/10 text-info-text [a&]:hover:bg-info/15",
325
+ outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
326
+ ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
327
+ link: "text-primary underline-offset-4 [a&]:hover:underline"
328
+ }
329
+ },
330
+ defaultVariants: {
331
+ variant: "default"
332
+ }
333
+ }
334
+ );
335
+ function Badge(_a) {
336
+ var _b = _a, {
337
+ className,
338
+ variant = "default",
339
+ asChild = false
340
+ } = _b, props = __objRest(_b, [
341
+ "className",
342
+ "variant",
343
+ "asChild"
344
+ ]);
345
+ const Comp = asChild ? Slot : "span";
346
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
347
+ Comp,
348
+ __spreadValues({
349
+ className: cn(badgeVariants({ variant }), className),
350
+ "data-slot": "badge",
351
+ "data-variant": variant
352
+ }, props)
353
+ );
354
+ }
355
+
356
+ // src/components/ui/chip.tsx
357
+ var import_lucide_react3 = require("lucide-react");
358
+ var import_jsx_runtime5 = require("react/jsx-runtime");
359
+ function Chip(_a) {
360
+ var _b = _a, {
361
+ className,
362
+ variant = "secondary",
363
+ onRemove,
364
+ disabled,
365
+ children
366
+ } = _b, props = __objRest(_b, [
367
+ "className",
368
+ "variant",
369
+ "onRemove",
370
+ "disabled",
371
+ "children"
372
+ ]);
373
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
374
+ "span",
375
+ __spreadProps(__spreadValues({
376
+ "aria-disabled": disabled,
377
+ className: cn(
378
+ badgeVariants({ variant }),
379
+ // extra right padding only when dismiss button is present
380
+ onRemove && "pr-1",
381
+ disabled && "pointer-events-none opacity-50",
382
+ className
383
+ ),
384
+ "data-slot": "chip",
385
+ "data-variant": variant
386
+ }, props), {
387
+ children: [
388
+ children,
389
+ onRemove ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
390
+ Button,
391
+ {
392
+ type: "button",
393
+ variant: "ghost",
394
+ size: "icon",
395
+ "aria-label": "Remove",
396
+ className: "ml-0.5 size-4 shrink-0 rounded-full p-0.5 opacity-60 hover:opacity-100 disabled:pointer-events-none",
397
+ "data-slot": "chip-remove",
398
+ disabled,
399
+ onClick: (e) => {
400
+ e.stopPropagation();
401
+ onRemove();
402
+ },
403
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.X, { className: "size-3" })
404
+ }
405
+ ) : null
406
+ ]
407
+ })
408
+ );
409
+ }
410
+
411
+ // src/components/ui/category-edit-dialog.tsx
412
+ var import_react4 = require("react");
413
+ var import_lucide_react6 = require("lucide-react");
414
+
415
+ // src/components/ui/dialog.tsx
416
+ var import_lucide_react4 = require("lucide-react");
417
+ var import_dialog = require("@base-ui/react/dialog");
418
+
419
+ // src/lib/theme-provider.tsx
420
+ var import_react2 = require("react");
421
+ var import_jsx_runtime6 = require("react/jsx-runtime");
422
+ var ThemeVarsContext = (0, import_react2.createContext)({});
423
+ function useThemeVars() {
424
+ return (0, import_react2.useContext)(ThemeVarsContext);
425
+ }
426
+
427
+ // src/components/ui/dialog.tsx
428
+ var import_jsx_runtime7 = require("react/jsx-runtime");
429
+ function Dialog(_a) {
430
+ var props = __objRest(_a, []);
431
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_dialog.Dialog.Root, __spreadValues({ "data-slot": "dialog" }, props));
432
+ }
433
+ function DialogPortal(_a) {
434
+ var props = __objRest(_a, []);
435
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_dialog.Dialog.Portal, __spreadValues({ "data-slot": "dialog-portal" }, props));
436
+ }
437
+ function DialogOverlay(_a) {
438
+ var _b = _a, {
439
+ className
440
+ } = _b, props = __objRest(_b, [
441
+ "className"
442
+ ]);
443
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
444
+ import_dialog.Dialog.Backdrop,
445
+ __spreadValues({
446
+ className: cn(
447
+ // WealthX: foreground/50 scrim (matches Figma — foreground token at 50% opacity)
448
+ "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",
449
+ className
450
+ ),
451
+ "data-slot": "dialog-overlay"
452
+ }, props)
453
+ );
454
+ }
455
+ var DIALOG_MAX_WIDTHS = {
456
+ sm: "24rem",
457
+ md: "28rem",
458
+ lg: "32rem",
459
+ xl: "36rem",
460
+ "2xl": "42rem",
461
+ "3xl": "48rem",
462
+ "4xl": "56rem",
463
+ full: "100%"
464
+ };
465
+ var DIALOG_AUTO_MIN_WIDTH = "20rem";
466
+ function DialogContent(_a) {
467
+ var _b = _a, {
468
+ className,
469
+ children,
470
+ showCloseButton = true,
471
+ style,
472
+ container,
473
+ align = "top",
474
+ size = "lg",
475
+ minWidth
476
+ } = _b, props = __objRest(_b, [
477
+ "className",
478
+ "children",
479
+ "showCloseButton",
480
+ "style",
481
+ "container",
482
+ "align",
483
+ "size",
484
+ "minWidth"
485
+ ]);
486
+ const themeVars = useThemeVars();
487
+ const isAuto = size === "auto";
488
+ const sizeStyle = isAuto ? { minWidth: minWidth != null ? minWidth : DIALOG_AUTO_MIN_WIDTH } : { maxWidth: DIALOG_MAX_WIDTHS[size] };
489
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(DialogPortal, { container: container != null ? container : void 0, children: [
490
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(DialogOverlay, { style: themeVars }),
491
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
492
+ import_dialog.Dialog.Popup,
493
+ __spreadProps(__spreadValues({
494
+ className: cn(
495
+ // WealthX: removed rounded-lg (sharp corners), shadow-lg (flat panels)
496
+ // max-w-[calc(100%-2rem)] acts as a viewport-edge guard on all sizes.
497
+ // Fixed max-width is applied via inline style (sizeStyle) to avoid
498
+ // Tailwind v4 class-scanning gaps with dynamic class lookups.
499
+ "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",
500
+ // "auto" → hug content (with min-width floor); fixed sizes → fill to max-width
501
+ isAuto ? "w-auto" : "w-full",
502
+ align === "center" ? "top-[50%] translate-y-[-50%]" : "top-4 translate-y-0",
503
+ className
504
+ ),
505
+ "data-slot": "dialog-content",
506
+ style: __spreadValues(__spreadValues(__spreadValues({}, themeVars), sizeStyle), style)
507
+ }, props), {
508
+ children: [
509
+ children,
510
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
511
+ import_dialog.Dialog.Close,
512
+ {
513
+ 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",
514
+ "data-slot": "dialog-close",
515
+ children: [
516
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react4.XIcon, {}),
517
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "sr-only", children: "Close" })
518
+ ]
519
+ }
520
+ ) : null
521
+ ]
522
+ })
523
+ )
524
+ ] });
525
+ }
526
+ function DialogHeader(_a) {
527
+ var _b = _a, {
528
+ className
529
+ } = _b, props = __objRest(_b, [
530
+ "className"
531
+ ]);
532
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
533
+ "div",
534
+ __spreadValues({
535
+ className: cn("flex flex-col gap-1.5", className),
536
+ "data-slot": "dialog-header"
537
+ }, props)
538
+ );
539
+ }
540
+ function DialogTitle(_a) {
541
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
542
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
543
+ import_dialog.Dialog.Title,
544
+ __spreadValues({
545
+ className: cn("text-h5 leading-none", className),
546
+ "data-slot": "dialog-title"
547
+ }, props)
548
+ );
549
+ }
550
+
551
+ // src/components/ui/accordion.tsx
552
+ var import_lucide_react5 = require("lucide-react");
553
+ var import_accordion = require("@base-ui/react/accordion");
554
+ var import_jsx_runtime8 = require("react/jsx-runtime");
555
+ function Accordion(props) {
556
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_accordion.Accordion.Root, __spreadValues({ "data-slot": "accordion" }, props));
557
+ }
558
+ function AccordionItem(_a) {
559
+ var _b = _a, {
560
+ className
561
+ } = _b, props = __objRest(_b, [
562
+ "className"
563
+ ]);
564
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
565
+ import_accordion.Accordion.Item,
566
+ __spreadValues({
567
+ className: cn("border-b", className),
568
+ "data-slot": "accordion-item"
569
+ }, props)
570
+ );
571
+ }
572
+ function AccordionTrigger(_a) {
573
+ var _b = _a, {
574
+ className,
575
+ children
576
+ } = _b, props = __objRest(_b, [
577
+ "className",
578
+ "children"
579
+ ]);
580
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_accordion.Accordion.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
581
+ import_accordion.Accordion.Trigger,
582
+ __spreadProps(__spreadValues({
583
+ className: cn(
584
+ // layout
585
+ "flex flex-1 items-center justify-between gap-4 py-4 text-left",
586
+ // typography
587
+ "text-label-medium",
588
+ // base
589
+ "rounded-none outline-none transition-[color,opacity]",
590
+ // interactive states
591
+ "hover:underline",
592
+ "focus-visible:ring-2 focus-visible:ring-foreground/30",
593
+ "disabled:pointer-events-none disabled:opacity-50",
594
+ // chevron rotation when open
595
+ "[&[data-panel-open]>svg]:rotate-180",
596
+ className
597
+ ),
598
+ "data-slot": "accordion-trigger"
599
+ }, props), {
600
+ children: [
601
+ children,
602
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react5.ChevronDownIcon, { className: "pointer-events-none size-4 shrink-0 text-muted-foreground transition-transform duration-200" })
603
+ ]
604
+ })
605
+ ) });
606
+ }
607
+ function AccordionContent(_a) {
608
+ var _b = _a, {
609
+ className,
610
+ children
611
+ } = _b, props = __objRest(_b, [
612
+ "className",
613
+ "children"
614
+ ]);
615
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
616
+ import_accordion.Accordion.Panel,
617
+ __spreadProps(__spreadValues({
618
+ 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",
619
+ "data-slot": "accordion-content"
620
+ }, props), {
621
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: cn("pb-4 text-muted-foreground", className), children })
622
+ })
623
+ );
624
+ }
625
+
626
+ // src/components/ui/input.tsx
627
+ var import_jsx_runtime9 = require("react/jsx-runtime");
628
+ function Input(_a) {
629
+ var _b = _a, { className, type } = _b, props = __objRest(_b, ["className", "type"]);
630
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
631
+ "input",
632
+ __spreadValues({
633
+ className: cn(
634
+ "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",
635
+ "focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20",
636
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
637
+ className
638
+ ),
639
+ "data-slot": "input",
640
+ type
641
+ }, props)
642
+ );
643
+ }
644
+
645
+ // src/components/ui/switch.tsx
646
+ var import_react3 = require("react");
647
+ var import_switch = require("@base-ui/react/switch");
648
+ var import_jsx_runtime10 = require("react/jsx-runtime");
649
+ function Switch(_a) {
650
+ var _b = _a, {
651
+ className,
652
+ size = "default"
653
+ } = _b, props = __objRest(_b, [
654
+ "className",
655
+ "size"
656
+ ]);
657
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
658
+ import_switch.Switch.Root,
659
+ __spreadProps(__spreadValues({
660
+ className: cn(
661
+ "peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none",
662
+ "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
663
+ "disabled:cursor-not-allowed disabled:opacity-50",
664
+ "data-[size=default]:h-[1.15rem] data-[size=default]:w-8",
665
+ "data-[size=sm]:h-3.5 data-[size=sm]:w-6",
666
+ "data-checked:bg-primary data-unchecked:bg-input",
667
+ "aria-invalid:data-checked:bg-destructive aria-invalid:border-destructive",
668
+ "dark:data-unchecked:bg-input/80",
669
+ className
670
+ ),
671
+ "data-size": size,
672
+ "data-slot": "switch"
673
+ }, props), {
674
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
675
+ import_switch.Switch.Thumb,
676
+ {
677
+ className: cn(
678
+ "pointer-events-none block rounded-full bg-background ring-0 transition-transform",
679
+ "group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3",
680
+ "data-checked:translate-x-[calc(100%-2px)] data-unchecked:translate-x-0",
681
+ "dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground"
682
+ ),
683
+ "data-slot": "switch-thumb"
684
+ }
685
+ )
686
+ })
687
+ );
688
+ }
689
+
690
+ // src/components/ui/category-edit-dialog.tsx
691
+ var import_jsx_runtime11 = require("react/jsx-runtime");
692
+ function ItemIcon({
693
+ icon,
694
+ active
695
+ }) {
696
+ if (!icon) return null;
697
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
698
+ "span",
699
+ {
700
+ className: cn(
701
+ "shrink-0",
702
+ active ? "text-primary" : "text-muted-foreground"
703
+ ),
704
+ children: icon
705
+ }
706
+ );
707
+ }
708
+ function CategoryRow({
709
+ name,
710
+ icon,
711
+ isSelected,
712
+ indent = false,
713
+ onClick
714
+ }) {
715
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
716
+ "button",
717
+ {
718
+ type: "button",
719
+ onClick,
720
+ className: cn(
721
+ "flex w-full items-center gap-2 text-left text-body-small transition-colors hover:bg-muted",
722
+ indent ? "py-2 pl-9 pr-4" : "px-4 py-2.5",
723
+ isSelected && "bg-primary/10"
724
+ ),
725
+ children: [
726
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ItemIcon, { icon, active: isSelected }),
727
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "flex-1", children: name }),
728
+ isSelected && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.Check, { className: "size-3.5 shrink-0 text-primary" })
729
+ ]
730
+ }
731
+ );
732
+ }
733
+ function CategoryEditDialog({
734
+ open,
735
+ onOpenChange,
736
+ transactionDescription,
737
+ currentCategoryId,
738
+ categories,
739
+ onSave
740
+ }) {
741
+ const [search, setSearch] = (0, import_react4.useState)("");
742
+ const [selected, setSelected] = (0, import_react4.useState)(currentCategoryId != null ? currentCategoryId : "");
743
+ const [applyToFuture, setApplyToFuture] = (0, import_react4.useState)(false);
744
+ const [openItem, setOpenItem] = (0, import_react4.useState)("");
745
+ (0, import_react4.useEffect)(() => {
746
+ var _a;
747
+ if (!open) return;
748
+ setSelected(currentCategoryId != null ? currentCategoryId : "");
749
+ setSearch("");
750
+ setApplyToFuture(false);
751
+ const parent = categories.find(
752
+ (c) => {
753
+ var _a2;
754
+ return c.id === currentCategoryId || ((_a2 = c.subCategories) == null ? void 0 : _a2.some((s) => s.id === currentCategoryId));
755
+ }
756
+ );
757
+ setOpenItem((_a = parent == null ? void 0 : parent.id) != null ? _a : "");
758
+ }, [open, currentCategoryId, categories]);
759
+ const q = search.toLowerCase();
760
+ const filtered = categories.filter(
761
+ (c) => {
762
+ var _a;
763
+ return !q || c.name.toLowerCase().includes(q) || ((_a = c.subCategories) == null ? void 0 : _a.some((s) => s.name.toLowerCase().includes(q)));
764
+ }
765
+ );
766
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(DialogContent, { size: "sm", className: "gap-0 p-0", children: [
767
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(DialogHeader, { className: "px-5 pt-5 pb-3", children: [
768
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DialogTitle, { children: "Change Category" }),
769
+ transactionDescription && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "truncate text-caption text-muted-foreground", children: transactionDescription })
770
+ ] }),
771
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "px-4 pb-3", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "relative", children: [
772
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react6.Search, { className: "absolute left-3 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
773
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
774
+ Input,
775
+ {
776
+ placeholder: "Search categories\u2026",
777
+ value: search,
778
+ onChange: (e) => setSearch(e.target.value),
779
+ className: "h-8 pl-8 text-body-small"
780
+ }
781
+ )
782
+ ] }) }),
783
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "max-h-64 overflow-y-auto border-y border-border", children: filtered.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "py-8 text-center text-caption text-muted-foreground", children: "No categories found" }) : q ? (
784
+ // Search mode — flat list, no animation
785
+ filtered.map((cat) => {
786
+ var _a, _b, _c;
787
+ const hasChildren = ((_b = (_a = cat.subCategories) == null ? void 0 : _a.length) != null ? _b : 0) > 0;
788
+ const matchingChildren = (_c = cat.subCategories) == null ? void 0 : _c.filter(
789
+ (s) => s.name.toLowerCase().includes(q)
790
+ );
791
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { children: [
792
+ (!hasChildren || cat.name.toLowerCase().includes(q)) && (hasChildren ? (
793
+ // Non-selectable group header
794
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center gap-2 px-4 py-2.5 text-body-small", children: [
795
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ItemIcon, { icon: cat.icon, active: false }),
796
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "flex-1 text-muted-foreground", children: cat.name })
797
+ ] })
798
+ ) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
799
+ CategoryRow,
800
+ {
801
+ name: cat.name,
802
+ icon: cat.icon,
803
+ isSelected: selected === cat.id,
804
+ onClick: () => setSelected(cat.id)
805
+ }
806
+ )),
807
+ matchingChildren == null ? void 0 : matchingChildren.map((sub) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
808
+ CategoryRow,
809
+ {
810
+ name: sub.name,
811
+ icon: sub.icon,
812
+ isSelected: selected === sub.id,
813
+ indent: true,
814
+ onClick: () => setSelected(sub.id)
815
+ },
816
+ sub.id
817
+ ))
818
+ ] }, cat.id);
819
+ })
820
+ ) : (
821
+ // Browse mode — accordion with animated expand/collapse
822
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
823
+ Accordion,
824
+ {
825
+ type: "single",
826
+ collapsible: true,
827
+ value: openItem,
828
+ onValueChange: (v) => setOpenItem(v != null ? v : ""),
829
+ children: filtered.map((cat) => {
830
+ var _a, _b;
831
+ if (((_b = (_a = cat.subCategories) == null ? void 0 : _a.length) != null ? _b : 0) > 0) {
832
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
833
+ AccordionItem,
834
+ {
835
+ value: cat.id,
836
+ className: "border-b border-border last:border-0",
837
+ children: [
838
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(AccordionTrigger, { className: "gap-2 px-4 py-2.5 text-body-small hover:bg-muted hover:no-underline [&>svg:last-child]:size-3.5 [&>svg:last-child]:text-muted-foreground", children: [
839
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ItemIcon, { icon: cat.icon, active: false }),
840
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "flex-1 text-left", children: cat.name })
841
+ ] }),
842
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AccordionContent, { className: "p-0 text-current", children: cat.subCategories.map((sub) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
843
+ CategoryRow,
844
+ {
845
+ name: sub.name,
846
+ icon: sub.icon,
847
+ isSelected: selected === sub.id,
848
+ indent: true,
849
+ onClick: () => setSelected(sub.id)
850
+ },
851
+ sub.id
852
+ )) })
853
+ ]
854
+ },
855
+ cat.id
856
+ );
857
+ }
858
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
859
+ "div",
860
+ {
861
+ className: "border-b border-border last:border-0",
862
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
863
+ CategoryRow,
864
+ {
865
+ name: cat.name,
866
+ icon: cat.icon,
867
+ isSelected: selected === cat.id,
868
+ onClick: () => setSelected(cat.id)
869
+ }
870
+ )
871
+ },
872
+ cat.id
873
+ );
874
+ })
875
+ }
876
+ )
877
+ ) }),
878
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between gap-3 px-4 py-3", children: [
879
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("label", { className: "text-caption text-muted-foreground", children: "Apply to all future transactions from this merchant" }),
880
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
881
+ Switch,
882
+ {
883
+ checked: applyToFuture,
884
+ onCheckedChange: setApplyToFuture,
885
+ className: "shrink-0"
886
+ }
887
+ )
888
+ ] }),
889
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex gap-2 px-4 pb-4", children: [
890
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
891
+ Button,
892
+ {
893
+ variant: "outline",
894
+ size: "sm",
895
+ className: "flex-1",
896
+ onClick: () => onOpenChange(false),
897
+ children: "Cancel"
898
+ }
899
+ ),
900
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
901
+ Button,
902
+ {
903
+ size: "sm",
904
+ className: "flex-1",
905
+ disabled: !selected || selected === currentCategoryId,
906
+ onClick: () => {
907
+ onSave(selected, applyToFuture);
908
+ onOpenChange(false);
909
+ },
910
+ children: "Save"
911
+ }
912
+ )
913
+ ] })
914
+ ] }) });
915
+ }
916
+
917
+ // src/lib/format-currency.ts
918
+ function formatCurrency(value, options) {
919
+ const { decimals = 0, showSign = false } = options != null ? options : {};
920
+ const abs = Math.abs(value);
921
+ const formatted = new Intl.NumberFormat("en-AU", {
922
+ style: "currency",
923
+ currency: "AUD",
924
+ minimumFractionDigits: decimals,
925
+ maximumFractionDigits: decimals
926
+ }).format(abs);
927
+ if (!showSign) return value < 0 ? `-${formatted}` : formatted;
928
+ if (value > 0) return `+${formatted}`;
929
+ if (value < 0) return `-${formatted}`;
930
+ return formatted;
931
+ }
932
+
933
+ // src/lib/format-date.ts
934
+ var import_date_fns = require("date-fns");
935
+ function safeParse(iso) {
936
+ return (0, import_date_fns.parseISO)(iso);
937
+ }
938
+ function formatDateShort(iso) {
939
+ if (!iso) return "\u2014";
940
+ try {
941
+ return (0, import_date_fns.format)(safeParse(iso), "dd MMM yyyy");
942
+ } catch (e) {
943
+ return iso;
944
+ }
945
+ }
946
+
947
+ // src/components/ui/dashboard-transactions-table.tsx
948
+ var import_jsx_runtime12 = require("react/jsx-runtime");
949
+ function CategoryChip({
950
+ label,
951
+ canEdit,
952
+ onClick
953
+ }) {
954
+ if (canEdit) {
955
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
956
+ Badge,
957
+ {
958
+ asChild: true,
959
+ variant: "secondary",
960
+ className: "cursor-pointer transition-colors hover:border-primary/40 hover:bg-primary/10 hover:text-primary",
961
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("button", { type: "button", onClick, children: [
962
+ label,
963
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react7.Pencil, { className: "size-2.5 shrink-0 opacity-60" })
964
+ ] })
965
+ }
966
+ );
967
+ }
968
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Chip, { variant: "secondary", children: label });
969
+ }
970
+ function TransactionRow({
971
+ tx,
972
+ isDimmed,
973
+ canEdit,
974
+ onChipClick
975
+ }) {
976
+ var _a;
977
+ const isCredit = tx.amount >= 0;
978
+ const categoryLabel = (_a = tx.editedCategoryName) != null ? _a : tx.category;
979
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
980
+ "div",
981
+ {
982
+ className: cn(
983
+ "flex items-start justify-between gap-4 border-b border-border py-3 last:border-0 transition-opacity",
984
+ isDimmed && "opacity-30"
985
+ ),
986
+ children: [
987
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "min-w-0 flex-1", children: [
988
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-xs text-muted-foreground", children: formatDateShort(tx.date) }),
989
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "mt-0.5 truncate text-sm font-medium text-foreground", children: tx.description }),
990
+ tx.merchant && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "mt-0.5 truncate text-xs text-muted-foreground", children: tx.merchant }),
991
+ categoryLabel && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "mt-1", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
992
+ CategoryChip,
993
+ {
994
+ label: categoryLabel,
995
+ canEdit,
996
+ onClick: onChipClick
997
+ }
998
+ ) })
999
+ ] }),
1000
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1001
+ "span",
1002
+ {
1003
+ className: cn(
1004
+ "shrink-0 text-sm font-semibold",
1005
+ isCredit ? "text-success" : "text-foreground"
1006
+ ),
1007
+ children: [
1008
+ isCredit ? "+" : "",
1009
+ formatCurrency(tx.amount, { showSign: false })
1010
+ ]
1011
+ }
1012
+ )
1013
+ ]
1014
+ }
1015
+ );
1016
+ }
1017
+ function DashboardTransactionsTable({
1018
+ transactions = [],
1019
+ title = "Transaction History",
1020
+ hasNextPage = false,
1021
+ isLoadingMore = false,
1022
+ onLoadMore,
1023
+ isLoading = false,
1024
+ className,
1025
+ selectedCategoryId,
1026
+ categories,
1027
+ onCategoryChange
1028
+ }) {
1029
+ const isFiltering = selectedCategoryId != null;
1030
+ const canEdit = !!(categories == null ? void 0 : categories.length);
1031
+ const [editingTx, setEditingTx] = (0, import_react5.useState)(null);
1032
+ const handleSave = (categoryId, applyToFuture) => {
1033
+ if (editingTx) {
1034
+ onCategoryChange == null ? void 0 : onCategoryChange(editingTx.id, categoryId, applyToFuture);
1035
+ }
1036
+ setEditingTx(null);
1037
+ };
1038
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
1039
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(Card, { className: cn("flex flex-col", className), children: [
1040
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(CardHeader, { className: "pb-0", children: [
1041
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(CardTitle, { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: title }),
1042
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "mt-2 flex border-b border-border", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "border-b-2 border-foreground pb-1.5 text-xs font-semibold text-foreground", children: "Account Transaction" }) })
1043
+ ] }),
1044
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(CardContent, { className: "flex flex-1 flex-col px-4 pb-0 pt-0", children: [
1045
+ isLoading ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex flex-1 items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Spinner, { size: "default" }) }) : transactions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "py-8 text-center text-sm text-muted-foreground", children: "No transactions found" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex flex-col", children: transactions.map((tx) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1046
+ TransactionRow,
1047
+ {
1048
+ tx,
1049
+ isDimmed: isFiltering && tx.categoryId !== selectedCategoryId,
1050
+ canEdit,
1051
+ onChipClick: () => setEditingTx(tx)
1052
+ },
1053
+ tx.id
1054
+ )) }),
1055
+ hasNextPage && onLoadMore && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "py-4 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1056
+ Button,
1057
+ {
1058
+ variant: "outline",
1059
+ size: "sm",
1060
+ onClick: onLoadMore,
1061
+ disabled: isLoadingMore,
1062
+ children: isLoadingMore ? "Loading\u2026" : "Load More"
1063
+ }
1064
+ ) })
1065
+ ] })
1066
+ ] }),
1067
+ canEdit && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1068
+ CategoryEditDialog,
1069
+ {
1070
+ open: editingTx !== null,
1071
+ onOpenChange: (open) => !open && setEditingTx(null),
1072
+ transactionDescription: editingTx == null ? void 0 : editingTx.description,
1073
+ currentCategoryId: editingTx == null ? void 0 : editingTx.categoryId,
1074
+ categories,
1075
+ onSave: handleSave
1076
+ }
1077
+ )
1078
+ ] });
1079
+ }
1080
+ // Annotate the CommonJS export names for ESM import in node:
1081
+ 0 && (module.exports = {
1082
+ DashboardTransactionsTable
1083
+ });