@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,152 @@
1
+ import React from "react";
2
+ import { cn } from "@/lib/utils";
3
+ import { formatCurrency } from "@/lib/format-currency";
4
+ import { formatDateShort } from "@/lib/format-date";
5
+ import { Button } from "@/components/ui/button";
6
+
7
+ /**
8
+ * Loan draft selector shown on the "Select application to continue" screen.
9
+ * Two variants (BUILD-1612):
10
+ * - Multi-draft: grid of cards — consumer renders when loans.length > 1
11
+ * - Single-draft: consumer can skip this screen entirely when loans.length === 1
12
+ *
13
+ * This component always renders the grid. The caller decides whether to show it.
14
+ */
15
+
16
+ export type LoanCardApplicant = {
17
+ name: string;
18
+ isMain: boolean;
19
+ };
20
+
21
+ export type LoanCardItem = {
22
+ id: string;
23
+ /** ISO date string */
24
+ createdAt: string;
25
+ desiredLoanAmount?: number;
26
+ isJoint: boolean;
27
+ applicants: LoanCardApplicant[];
28
+ };
29
+
30
+ export type LoanApplicationCardsProps = {
31
+ loans: LoanCardItem[];
32
+ onSelect: (id: string) => void;
33
+ onBack: () => void;
34
+ companyName?: string;
35
+ className?: string;
36
+ };
37
+
38
+ export function LoanApplicationCards({
39
+ loans,
40
+ onSelect,
41
+ onBack,
42
+ companyName,
43
+ className,
44
+ }: LoanApplicationCardsProps) {
45
+ return (
46
+ <div className={cn("flex flex-col gap-6", className)}>
47
+ {/* Header */}
48
+ <div className="flex flex-col gap-2">
49
+ <h2 className="text-xl font-bold">Select an application to continue</h2>
50
+ <p className="text-sm text-muted-foreground">
51
+ Tip: Get technical and broker support by visiting the support section
52
+ within the app
53
+ </p>
54
+ </div>
55
+
56
+ {/* Section */}
57
+ <div className="flex flex-col gap-4">
58
+ <p className="text-sm font-medium">
59
+ What loan application would you like to continue?
60
+ </p>
61
+
62
+ {/* Card grid */}
63
+ <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
64
+ {loans.map((loan) => (
65
+ <div
66
+ key={loan.id}
67
+ className="flex flex-col justify-between gap-4 border border-border p-4"
68
+ >
69
+ <div className="flex flex-col gap-3">
70
+ {/* Meta: date + company */}
71
+ <div className="flex items-center justify-between text-sm">
72
+ <div className="flex items-center gap-1.5 text-muted-foreground">
73
+ <CalendarIcon />
74
+ <span>
75
+ <strong className="text-foreground">Started</strong>{" "}
76
+ {formatDateShort(loan.createdAt)}
77
+ </span>
78
+ </div>
79
+ {companyName && (
80
+ <span className="text-xs text-muted-foreground">
81
+ {companyName}
82
+ </span>
83
+ )}
84
+ </div>
85
+
86
+ {/* Loan amount */}
87
+ <div className="flex items-center justify-between text-sm">
88
+ <span className="text-muted-foreground">Loan Amount</span>
89
+ <strong>{formatCurrency(loan.desiredLoanAmount ?? 0)}</strong>
90
+ </div>
91
+
92
+ <hr className="border-border" />
93
+
94
+ {/* Applicant type + names */}
95
+ <div className="flex flex-col gap-1 text-sm">
96
+ <strong>
97
+ {loan.isJoint
98
+ ? "Joint Application"
99
+ : "Individual Application"}
100
+ </strong>
101
+ {loan.applicants.map((a) => (
102
+ <span key={a.name} className="text-muted-foreground">
103
+ {a.name}
104
+ {loan.isJoint && (
105
+ <span className="text-xs">
106
+ {" "}
107
+ ({a.isMain ? "Main Applicant" : "Co-Applicant"})
108
+ </span>
109
+ )}
110
+ </span>
111
+ ))}
112
+ </div>
113
+ </div>
114
+
115
+ <Button
116
+ type="button"
117
+ variant="outline"
118
+ className="w-full"
119
+ onClick={() => onSelect(loan.id)}
120
+ >
121
+ Continue
122
+ </Button>
123
+ </div>
124
+ ))}
125
+ </div>
126
+
127
+ <Button type="button" variant="ghost" onClick={onBack}>
128
+ Back
129
+ </Button>
130
+ </div>
131
+ </div>
132
+ );
133
+ }
134
+
135
+ function CalendarIcon() {
136
+ return (
137
+ <svg
138
+ xmlns="http://www.w3.org/2000/svg"
139
+ viewBox="0 0 24 24"
140
+ fill="none"
141
+ stroke="currentColor"
142
+ strokeWidth={1.5}
143
+ strokeLinecap="round"
144
+ strokeLinejoin="round"
145
+ className="size-3.5 shrink-0"
146
+ aria-hidden="true"
147
+ >
148
+ <rect x="3" y="4" width="18" height="18" rx="2" />
149
+ <path d="M16 2v4M8 2v4M3 10h18" />
150
+ </svg>
151
+ );
152
+ }
@@ -0,0 +1,86 @@
1
+ import * as React from "react";
2
+ import { cn } from "@/lib/utils";
3
+
4
+ // ─── Types ────────────────────────────────────────────────────────────────────
5
+
6
+ export type LoanEntryShellProps = {
7
+ /**
8
+ * Hero image URL shown on the left panel (desktop only).
9
+ * Falls back to a muted placeholder panel when omitted.
10
+ */
11
+ heroSrc?: string;
12
+ /** Alt text for the hero image. Pass "" when decorative. */
13
+ heroAlt?: string;
14
+ /** Logo node — typically <AuthLogo /> */
15
+ logo?: React.ReactNode;
16
+ /** Screen heading */
17
+ title: string;
18
+ /** Optional subtitle beneath the heading */
19
+ subtitle?: string;
20
+ className?: string;
21
+ children: React.ReactNode;
22
+ };
23
+
24
+ // ─── Component ────────────────────────────────────────────────────────────────
25
+
26
+ /**
27
+ * Two-column entry screen shell for the loan application flow.
28
+ *
29
+ * - Desktop (md+): left 50% = hero image, right 50% = logo + content
30
+ * - Mobile (<md): single column, hero hidden, content full-width
31
+ *
32
+ * Figma: WealthX-Backoffice---Mobile-App
33
+ * Entry screen → node 19308:56690
34
+ * App-type screen → node 19308:56893
35
+ */
36
+ export function LoanEntryShell({
37
+ heroSrc,
38
+ heroAlt = "",
39
+ logo,
40
+ title,
41
+ subtitle,
42
+ className,
43
+ children,
44
+ }: LoanEntryShellProps) {
45
+ return (
46
+ <div className={cn("flex min-h-screen w-full font-sans", className)}>
47
+ {/* ── Left: hero panel (desktop only) ──────────────────────────────── */}
48
+ <div className="hidden shrink-0 md:block md:w-1/2">
49
+ {heroSrc ? (
50
+ // alt="" is sufficient for decorative images — no aria-hidden needed
51
+ <img
52
+ src={heroSrc}
53
+ alt={heroAlt}
54
+ className="h-full w-full object-cover"
55
+ />
56
+ ) : (
57
+ <div className="h-full w-full bg-muted" aria-hidden="true" />
58
+ )}
59
+ </div>
60
+
61
+ {/* ── Right: content panel ─────────────────────────────────────────── */}
62
+ <div className="flex w-full flex-col md:w-1/2">
63
+ {/* Logo — pinned to top-left */}
64
+ {logo && <div className="px-4 pt-6 sm:px-10 sm:pt-10">{logo}</div>}
65
+
66
+ {/* Vertically centred content */}
67
+ <div className="flex flex-1 flex-col items-center justify-center gap-6 px-4 py-6 sm:gap-10 sm:px-10 sm:py-10">
68
+ {/* Heading block */}
69
+ <div className="flex flex-col items-center gap-3 text-center">
70
+ <h1 className="m-0 text-[28px] font-bold leading-9 text-foreground">
71
+ {title}
72
+ </h1>
73
+ {subtitle && (
74
+ <p className="m-0 max-w-sm text-sm font-normal leading-5 text-muted-foreground">
75
+ {subtitle}
76
+ </p>
77
+ )}
78
+ </div>
79
+
80
+ {/* Option cards / content */}
81
+ {children}
82
+ </div>
83
+ </div>
84
+ </div>
85
+ );
86
+ }
@@ -0,0 +1,77 @@
1
+ import React from "react";
2
+ import { cn } from "@/lib/utils";
3
+ import {
4
+ AccountListCarousel,
5
+ type AccountCarouselItem,
6
+ } from "./account-list-carousel";
7
+ import {
8
+ PropertyListCarousel,
9
+ type PropertyCarouselItem,
10
+ } from "./property-list-carousel";
11
+
12
+ export interface LoanFinancialsProps {
13
+ /** Name shown in the section heading (e.g. applicant's first name) */
14
+ ownerName: string;
15
+ bankAccounts: AccountCarouselItem[];
16
+ creditAccounts: AccountCarouselItem[];
17
+ propertyLoans: AccountCarouselItem[];
18
+ properties: PropertyCarouselItem[];
19
+ onAddAccount?: () => void;
20
+ onAddProperty?: () => void;
21
+ className?: string;
22
+ }
23
+
24
+ function SectionTitle({ children }: { children: React.ReactNode }) {
25
+ return <p className="text-sm font-semibold text-foreground">{children}</p>;
26
+ }
27
+
28
+ export function LoanFinancials({
29
+ ownerName,
30
+ bankAccounts,
31
+ creditAccounts,
32
+ propertyLoans,
33
+ properties,
34
+ onAddAccount,
35
+ onAddProperty,
36
+ className,
37
+ }: LoanFinancialsProps) {
38
+ return (
39
+ <div className={cn("flex flex-col gap-6", className)}>
40
+ <p className="text-sm font-bold text-foreground">
41
+ {ownerName}&apos;s Information
42
+ </p>
43
+
44
+ <div className="flex flex-col gap-2">
45
+ <SectionTitle>Linked Bank Accounts</SectionTitle>
46
+ <AccountListCarousel
47
+ accounts={bankAccounts}
48
+ type="bankAccount"
49
+ onAddAccount={onAddAccount}
50
+ />
51
+ </div>
52
+
53
+ <div className="flex flex-col gap-2">
54
+ <SectionTitle>Credit Cards &amp; Personal Loans</SectionTitle>
55
+ <AccountListCarousel
56
+ accounts={creditAccounts}
57
+ type="credit"
58
+ onAddAccount={onAddAccount}
59
+ />
60
+ </div>
61
+
62
+ <div className="flex flex-col gap-2">
63
+ <SectionTitle>Property Loans</SectionTitle>
64
+ <AccountListCarousel accounts={propertyLoans} type="propertyLoan" />
65
+ </div>
66
+
67
+ <div className="flex flex-col gap-2">
68
+ <SectionTitle>Property Assets</SectionTitle>
69
+ <PropertyListCarousel
70
+ properties={properties}
71
+ type="property"
72
+ onAddProperty={onAddProperty}
73
+ />
74
+ </div>
75
+ </div>
76
+ );
77
+ }
@@ -0,0 +1,62 @@
1
+ import * as React from "react";
2
+ import { cn } from "@/lib/utils";
3
+
4
+ // ─── Types ────────────────────────────────────────────────────────────────────
5
+
6
+ export type LoanOptionCardProps = {
7
+ /** Card label displayed at the top */
8
+ title: string;
9
+ /** Icon rendered below the title — pass any ReactNode (SVG, img, lucide icon) */
10
+ icon: React.ReactNode;
11
+ /** Whether this card is currently selected */
12
+ selected?: boolean;
13
+ /** Click / select handler */
14
+ onClick?: () => void;
15
+ /** Disable interaction */
16
+ disabled?: boolean;
17
+ className?: string;
18
+ };
19
+
20
+ // ─── Component ────────────────────────────────────────────────────────────────
21
+
22
+ /**
23
+ * Selectable option card used in loan application entry screens.
24
+ *
25
+ * Figma: WealthX-Backoffice---Mobile-App
26
+ * Entry screen → node 19308:56690
27
+ * App-type screen → node 19308:56893
28
+ */
29
+ export function LoanOptionCard({
30
+ title,
31
+ icon,
32
+ selected = false,
33
+ onClick,
34
+ disabled = false,
35
+ className,
36
+ }: LoanOptionCardProps) {
37
+ return (
38
+ <button
39
+ type="button"
40
+ onClick={onClick}
41
+ disabled={disabled}
42
+ aria-pressed={selected}
43
+ className={cn(
44
+ // Base — fixed height so all cards in a row are equal regardless of title length
45
+ "flex h-[200px] w-[300px] flex-col items-center justify-between border-2 p-8 font-sans",
46
+ "outline-none transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
47
+ // States
48
+ selected
49
+ ? "border-primary bg-primary/5"
50
+ : "border-border hover:bg-accent",
51
+ disabled && "pointer-events-none opacity-40",
52
+ className,
53
+ )}
54
+ >
55
+ <span className="text-center text-lg font-bold leading-normal text-foreground">
56
+ {title}
57
+ </span>
58
+ {/* Icon container — 56 × 56px */}
59
+ <div className="flex size-14 items-center justify-center">{icon}</div>
60
+ </button>
61
+ );
62
+ }
@@ -0,0 +1,106 @@
1
+ import * as React from "react";
2
+ import { cn } from "@/lib/utils";
3
+ import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
4
+
5
+ export type LoanOptionItem = {
6
+ value: string;
7
+ label: string;
8
+ };
9
+
10
+ export type LoanOptionGroupProps = {
11
+ title?: string;
12
+ options: LoanOptionItem[];
13
+ /** Current value for single-select. Mutually exclusive with `values`. */
14
+ value?: string;
15
+ /** Current values for multi-select. Mutually exclusive with `value`. */
16
+ values?: string[];
17
+ onChange: (next: string | string[]) => void;
18
+ multiple?: boolean;
19
+ /** When `multiple`, maximum number of options that can be selected. */
20
+ max?: number;
21
+ /** Show rank badge on multi-selected items (#1, #2, #3). */
22
+ showRank?: boolean;
23
+ /** Allow deselecting the current selection. */
24
+ allowUnSelect?: boolean;
25
+ error?: boolean;
26
+ helperText?: string;
27
+ disabled?: boolean;
28
+ className?: string;
29
+ };
30
+
31
+ export function LoanOptionGroup({
32
+ title,
33
+ options,
34
+ value,
35
+ values = [],
36
+ onChange,
37
+ multiple = false,
38
+ max,
39
+ showRank = false,
40
+ allowUnSelect = true,
41
+ error = false,
42
+ helperText,
43
+ disabled = false,
44
+ className,
45
+ }: LoanOptionGroupProps) {
46
+ const controlledValue: readonly string[] = multiple
47
+ ? values
48
+ : value
49
+ ? [value]
50
+ : [];
51
+
52
+ const handleValueChange = (next: readonly string[]) => {
53
+ if (multiple) {
54
+ if (max !== undefined && next.length > max) return;
55
+ onChange([...next]);
56
+ } else {
57
+ if (next.length === 0 && !allowUnSelect) return;
58
+ onChange(next[0] ?? "");
59
+ }
60
+ };
61
+
62
+ return (
63
+ <div className={cn("flex flex-col gap-3 font-sans", className)}>
64
+ {title && (
65
+ <p
66
+ className={cn(
67
+ "text-sm font-medium text-foreground",
68
+ error && "text-destructive",
69
+ )}
70
+ >
71
+ {title}
72
+ </p>
73
+ )}
74
+ <ToggleGroup
75
+ value={controlledValue}
76
+ onValueChange={handleValueChange}
77
+ variant="outline"
78
+ type={multiple ? "multiple" : "single"}
79
+ spacing={2}
80
+ disabled={disabled}
81
+ className="flex-wrap justify-start"
82
+ >
83
+ {options.map((opt) => {
84
+ const rank = showRank && multiple ? values.indexOf(opt.value) : -1;
85
+ return (
86
+ <ToggleGroupItem
87
+ key={opt.value}
88
+ value={opt.value}
89
+ className="h-auto px-4 py-2 text-sm font-medium"
90
+ >
91
+ {rank >= 0 && (
92
+ <span className="text-xs font-bold opacity-70">
93
+ #{rank + 1}
94
+ </span>
95
+ )}
96
+ {opt.label}
97
+ </ToggleGroupItem>
98
+ );
99
+ })}
100
+ </ToggleGroup>
101
+ {error && helperText && (
102
+ <p className="text-xs text-destructive">{helperText}</p>
103
+ )}
104
+ </div>
105
+ );
106
+ }