@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.
- package/.turbo/turbo-build.log +360 -180
- package/CHANGELOG.md +6 -0
- package/dist/chunk-2A53WPEC.mjs +182 -0
- package/dist/{chunk-SIVYAI3M.mjs → chunk-2LLFNGJZ.mjs} +15 -15
- package/dist/chunk-2QNOPXMQ.mjs +360 -0
- package/dist/{chunk-K5QV4TT6.mjs → chunk-2WCIORP7.mjs} +29 -4
- package/dist/{chunk-5NF6T2RS.mjs → chunk-3AREQTZU.mjs} +8 -8
- package/dist/{chunk-2EM2FRU6.mjs → chunk-3WGFIFP6.mjs} +5 -5
- package/dist/{chunk-K4KOD3KR.mjs → chunk-42NEC57Y.mjs} +44 -25
- package/dist/{chunk-FL6DZFJK.mjs → chunk-46Q4335I.mjs} +121 -39
- package/dist/chunk-4DO3WM7V.mjs +48 -0
- package/dist/chunk-5FHBC6DY.mjs +68 -0
- package/dist/chunk-5SAYZ4CI.mjs +40 -0
- package/dist/chunk-5WMFKQZ6.mjs +180 -0
- package/dist/chunk-623YVI5O.mjs +43 -0
- package/dist/{chunk-SFH2NJEJ.mjs → chunk-6OSULDEO.mjs} +3 -3
- package/dist/{chunk-UALR6JGV.mjs → chunk-6SR4K5T5.mjs} +1 -1
- package/dist/{chunk-D2NSIIXG.mjs → chunk-7KT5HPYM.mjs} +11 -11
- package/dist/chunk-A6ER36CW.mjs +456 -0
- package/dist/{chunk-QX7IFQSF.mjs → chunk-AHKHVBWR.mjs} +4 -4
- package/dist/chunk-AHSCWXYJ.mjs +113 -0
- package/dist/{chunk-7GWRPXHD.mjs → chunk-AL6GOL2Y.mjs} +1 -1
- package/dist/{chunk-OIKBW2QD.mjs → chunk-AUEUTZIC.mjs} +13 -13
- package/dist/{chunk-FYPSTTEJ.mjs → chunk-B7DD3ODQ.mjs} +1 -1
- package/dist/{chunk-TLAWKTSA.mjs → chunk-BD3DWDT4.mjs} +3 -3
- package/dist/{chunk-S2FKV4M5.mjs → chunk-BDESHD25.mjs} +4 -4
- package/dist/{chunk-OKTJFDPN.mjs → chunk-BFB3UH7V.mjs} +2 -2
- package/dist/{chunk-DGNHGNYH.mjs → chunk-C6SWS7OW.mjs} +1 -1
- package/dist/chunk-CDVG7SFT.mjs +271 -0
- package/dist/chunk-CUSHAIUL.mjs +109 -0
- package/dist/{chunk-QXKGOMUX.mjs → chunk-CW32WTZU.mjs} +4 -4
- package/dist/{chunk-SET2ANTY.mjs → chunk-D447W45Z.mjs} +3 -3
- package/dist/{chunk-RCAOCHWA.mjs → chunk-DFL5CV75.mjs} +18 -18
- package/dist/chunk-DYSVJ473.mjs +162 -0
- package/dist/chunk-E3PQDBYI.mjs +288 -0
- package/dist/chunk-EMYBNPIA.mjs +83 -0
- package/dist/chunk-EUYPMDQG.mjs +348 -0
- package/dist/{chunk-XYPW2XA5.mjs → chunk-EW72FINW.mjs} +11 -11
- package/dist/chunk-F24U4QQQ.mjs +234 -0
- package/dist/{chunk-VB5M6OZQ.mjs → chunk-F4O2YPXJ.mjs} +1 -1
- package/dist/chunk-FFXTQTB4.mjs +84 -0
- package/dist/{chunk-ZOWL2L5J.mjs → chunk-FYUSF5KO.mjs} +5 -1
- package/dist/{chunk-FTPBQVQ6.mjs → chunk-GNER6MCO.mjs} +1 -1
- package/dist/{chunk-2D3HQPFN.mjs → chunk-HF4FUBCY.mjs} +5 -5
- package/dist/{chunk-RSUIPKGX.mjs → chunk-HNDTLT5X.mjs} +1 -1
- package/dist/{chunk-N6Q5IPKT.mjs → chunk-HO6S3ECM.mjs} +46 -18
- package/dist/{chunk-L4NSRQ3T.mjs → chunk-HROG643K.mjs} +1 -1
- package/dist/chunk-I2EKKSEF.mjs +148 -0
- package/dist/{chunk-QTRSCVQ3.mjs → chunk-I3UDLWQ7.mjs} +1 -1
- package/dist/{chunk-AE7MASLF.mjs → chunk-IQGKOT7A.mjs} +9 -6
- package/dist/chunk-IXR4BQSQ.mjs +290 -0
- package/dist/{chunk-4MM7LHM5.mjs → chunk-J5NW5NCT.mjs} +1 -1
- package/dist/{chunk-OLKMCXAR.mjs → chunk-JTG5R5YV.mjs} +24 -24
- package/dist/chunk-JUBUN65Q.mjs +106 -0
- package/dist/chunk-K7TWMLLW.mjs +520 -0
- package/dist/{chunk-BOW7U26Y.mjs → chunk-K7WSRWOU.mjs} +4 -4
- package/dist/{chunk-NTYQWVLI.mjs → chunk-KAD26MCC.mjs} +1 -1
- package/dist/{chunk-KCWNDYPZ.mjs → chunk-KB7MZMED.mjs} +4 -4
- package/dist/chunk-KCKYGQVQ.mjs +61 -0
- package/dist/{chunk-VY5NEUP7.mjs → chunk-KLJLDNCA.mjs} +1 -1
- package/dist/chunk-LLAGF6BA.mjs +49 -0
- package/dist/{chunk-G27TSQLQ.mjs → chunk-M4LTX3MH.mjs} +1 -1
- package/dist/{chunk-YIZHS72Z.mjs → chunk-MHHA7QGO.mjs} +94 -54
- package/dist/{chunk-P2N2PEFY.mjs → chunk-NCUH54IZ.mjs} +4 -4
- package/dist/{chunk-PNRUH7JY.mjs → chunk-OECGKCVF.mjs} +5 -5
- package/dist/{chunk-YE67AALL.mjs → chunk-OL65UQHQ.mjs} +10 -10
- package/dist/{chunk-LQULK2E3.mjs → chunk-OYBIUEGE.mjs} +1 -1
- package/dist/{chunk-LR6LHDP3.mjs → chunk-PGR53HMH.mjs} +7 -7
- package/dist/chunk-PUJ42INK.mjs +141 -0
- package/dist/{chunk-M4VYX2PV.mjs → chunk-PV3Y7QGK.mjs} +2 -2
- package/dist/{chunk-UJZ4UHWI.mjs → chunk-PV7PNA6K.mjs} +4 -4
- package/dist/{chunk-6HIOM2HL.mjs → chunk-Q35PNFJ7.mjs} +1 -1
- package/dist/{chunk-JZY6TNIS.mjs → chunk-Q5SGEIJV.mjs} +27 -27
- package/dist/{chunk-ZFCDYW6N.mjs → chunk-QAX6HCUH.mjs} +1 -1
- package/dist/chunk-QHJDGB54.mjs +135 -0
- package/dist/chunk-QQSOZQOC.mjs +27 -0
- package/dist/chunk-RUX3OLVZ.mjs +59 -0
- package/dist/{chunk-QOJ2DQD6.mjs → chunk-S4CTM3UE.mjs} +5 -0
- package/dist/{chunk-ZEDMKQK2.mjs → chunk-TAX3KL66.mjs} +1 -1
- package/dist/chunk-TC43SMIN.mjs +133 -0
- package/dist/chunk-TGVXRD53.mjs +174 -0
- package/dist/{chunk-K5VHK7CM.mjs → chunk-TLYSVRSK.mjs} +12 -12
- package/dist/{chunk-YCWLFG27.mjs → chunk-TOIVHWNC.mjs} +1 -1
- package/dist/chunk-TXUBGKB7.mjs +160 -0
- package/dist/chunk-UEREFDAE.mjs +75 -0
- package/dist/chunk-UTCQN6XU.mjs +123 -0
- package/dist/{chunk-37AE3OM5.mjs → chunk-V4CUTCHS.mjs} +4 -4
- package/dist/{chunk-THVO2N47.mjs → chunk-VFH632TB.mjs} +9 -9
- package/dist/{chunk-3ERBUVHC.mjs → chunk-VJ3GC7W3.mjs} +95 -49
- package/dist/{chunk-V6XGXYCJ.mjs → chunk-VLELWBEW.mjs} +4 -4
- package/dist/{chunk-FEZKMUCF.mjs → chunk-WDTXHLYM.mjs} +1 -1
- package/dist/chunk-WUA546RX.mjs +129 -0
- package/dist/chunk-XHGISOX5.mjs +257 -0
- package/dist/chunk-XIY5DJXI.mjs +168 -0
- package/dist/{chunk-TOWTPLRC.mjs → chunk-XN37434W.mjs} +8 -8
- package/dist/{chunk-KLTACJ2G.mjs → chunk-XTWAJWCQ.mjs} +1 -1
- package/dist/chunk-Y24TXIFJ.mjs +518 -0
- package/dist/{chunk-DMXYRCHM.mjs → chunk-Y6UM3VTN.mjs} +4 -4
- package/dist/components/ui/about-you-form.js +1120 -0
- package/dist/components/ui/about-you-form.mjs +323 -0
- package/dist/components/ui/account-list-carousel.js +304 -0
- package/dist/components/ui/account-list-carousel.mjs +11 -0
- package/dist/components/ui/add-column-modal.js +1 -1
- package/dist/components/ui/add-column-modal.mjs +6 -6
- package/dist/components/ui/add-lead-modal.js +2 -2
- package/dist/components/ui/add-lead-modal.mjs +6 -6
- package/dist/components/ui/advisor-card.mjs +2 -2
- package/dist/components/ui/agent-evaluation-toast.js +299 -0
- package/dist/components/ui/agent-evaluation-toast.mjs +12 -0
- package/dist/components/ui/ai-assistant-drawer.mjs +5 -5
- package/dist/components/ui/ai-builder.js +3 -3
- package/dist/components/ui/ai-builder.mjs +5 -5
- package/dist/components/ui/ai-conversations.js +2 -2
- package/dist/components/ui/ai-conversations.mjs +11 -11
- package/dist/components/ui/alert-dialog.mjs +3 -3
- package/dist/components/ui/applicant-document-checklist.js +346 -0
- package/dist/components/ui/applicant-document-checklist.mjs +10 -0
- package/dist/components/ui/applicant-expenses-section.js +455 -0
- package/dist/components/ui/applicant-expenses-section.mjs +220 -0
- package/dist/components/ui/applicant-navigation-bar.js +309 -0
- package/dist/components/ui/applicant-navigation-bar.mjs +87 -0
- package/dist/components/ui/applicant-switcher.js +268 -0
- package/dist/components/ui/applicant-switcher.mjs +46 -0
- package/dist/components/ui/application-mobile-layout.js +88 -0
- package/dist/components/ui/application-mobile-layout.mjs +8 -0
- package/dist/components/ui/appointment-action-dialogs.js +1 -1
- package/dist/components/ui/appointment-action-dialogs.mjs +10 -10
- package/dist/components/ui/appointment-availability-settings.js +78 -31
- package/dist/components/ui/appointment-availability-settings.mjs +12 -10
- package/dist/components/ui/appointment-book-dialog.js +137 -58
- package/dist/components/ui/appointment-book-dialog.mjs +14 -14
- package/dist/components/ui/appointment-calendar-view.js +1 -1
- package/dist/components/ui/appointment-calendar-view.mjs +4 -4
- package/dist/components/ui/appointment-detail-sheet.js +38 -11
- package/dist/components/ui/appointment-detail-sheet.mjs +13 -13
- package/dist/components/ui/appointment-gmail-connect.mjs +2 -2
- package/dist/components/ui/appointment-time-slot-picker.mjs +2 -2
- package/dist/components/ui/appointment-upcoming-card.js +1 -1
- package/dist/components/ui/appointment-upcoming-card.mjs +10 -10
- package/dist/components/ui/asset-accordion.js +506 -0
- package/dist/components/ui/asset-accordion.mjs +202 -0
- package/dist/components/ui/assets-liabilities-side-card.js +328 -0
- package/dist/components/ui/assets-liabilities-side-card.mjs +127 -0
- package/dist/components/ui/auth-page-layout.js +3 -3
- package/dist/components/ui/auth-page-layout.mjs +1 -1
- package/dist/components/ui/backoffice-alert-history-chart.mjs +4 -4
- package/dist/components/ui/backoffice-alert-matching-chart.js +786 -0
- package/dist/components/ui/backoffice-alert-matching-chart.mjs +19 -0
- package/dist/components/ui/backoffice-alerts-chart.mjs +4 -4
- package/dist/components/ui/backoffice-connections-chart.mjs +4 -4
- package/dist/components/ui/backoffice-contact-history-chart.mjs +4 -4
- package/dist/components/ui/backoffice-contact-matching-chart.js +803 -0
- package/dist/components/ui/backoffice-contact-matching-chart.mjs +19 -0
- package/dist/components/ui/backoffice-signup-steps.js +1673 -0
- package/dist/components/ui/backoffice-signup-steps.mjs +36 -0
- package/dist/components/ui/bank-statement-document-table.js +467 -0
- package/dist/components/ui/bank-statement-document-table.mjs +12 -0
- package/dist/components/ui/bank-statement-generate-dialog.js +1517 -0
- package/dist/components/ui/bank-statement-generate-dialog.mjs +27 -0
- package/dist/components/ui/bank-statement-pdf-viewer.js +525 -0
- package/dist/components/ui/bank-statement-pdf-viewer.mjs +14 -0
- package/dist/components/ui/banking-accounts-connect.js +336 -0
- package/dist/components/ui/banking-accounts-connect.mjs +114 -0
- package/dist/components/ui/borrowing-capacity-atoms.js +382 -0
- package/dist/components/ui/borrowing-capacity-atoms.mjs +17 -0
- package/dist/components/ui/borrowing-capacity-card.js +835 -0
- package/dist/components/ui/borrowing-capacity-card.mjs +89 -0
- package/dist/components/ui/borrowing-capacity-line-chart.mjs +4 -4
- package/dist/components/ui/broker-info-panel.js +281 -0
- package/dist/components/ui/broker-info-panel.mjs +59 -0
- package/dist/components/ui/calculator-input-item.js +101 -0
- package/dist/components/ui/calculator-input-item.mjs +8 -0
- package/dist/components/ui/calculator-section.js +743 -0
- package/dist/components/ui/calculator-section.mjs +220 -0
- package/dist/components/ui/calendar.mjs +2 -2
- package/dist/components/ui/cash-balance-line-chart.mjs +5 -5
- package/dist/components/ui/cashflow-bar-chart.mjs +4 -4
- package/dist/components/ui/category-edit-dialog.js +737 -0
- package/dist/components/ui/category-edit-dialog.mjs +16 -0
- package/dist/components/ui/chat-widget.mjs +3 -3
- package/dist/components/ui/color-picker.mjs +4 -4
- package/dist/components/ui/connect-bank-step.js +511 -0
- package/dist/components/ui/connect-bank-step.mjs +287 -0
- package/dist/components/ui/contact-alert-dialog.js +1405 -0
- package/dist/components/ui/contact-alert-dialog.mjs +27 -0
- package/dist/components/ui/create-contact-modal.js +1028 -0
- package/dist/components/ui/create-contact-modal.mjs +21 -0
- package/dist/components/ui/csv-import-modal.js +583 -0
- package/dist/components/ui/csv-import-modal.mjs +14 -0
- package/dist/components/ui/currency-input.js +439 -0
- package/dist/components/ui/currency-input.mjs +13 -0
- package/dist/components/ui/dashboard-expense-categories.js +355 -0
- package/dist/components/ui/dashboard-expense-categories.mjs +186 -0
- package/dist/components/ui/dashboard-transactions-table.js +1083 -0
- package/dist/components/ui/dashboard-transactions-table.mjs +177 -0
- package/dist/components/ui/data-table.mjs +6 -6
- package/dist/components/ui/date-picker.mjs +6 -6
- package/dist/components/ui/debt-accordion.js +523 -0
- package/dist/components/ui/debt-accordion.mjs +219 -0
- package/dist/components/ui/delete-contact-component.js +479 -0
- package/dist/components/ui/delete-contact-component.mjs +14 -0
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dialog.mjs +3 -3
- package/dist/components/ui/document-checklist-template.mjs +4 -4
- package/dist/components/ui/drawer.mjs +3 -3
- package/dist/components/ui/dropdown-menu.mjs +3 -3
- package/dist/components/ui/dynamic-tabs.js +274 -0
- package/dist/components/ui/dynamic-tabs.mjs +116 -0
- package/dist/components/ui/editable-money-item.js +306 -0
- package/dist/components/ui/editable-money-item.mjs +12 -0
- package/dist/components/ui/expense-bar-chart.mjs +4 -4
- package/dist/components/ui/expense-detail-item.js +506 -0
- package/dist/components/ui/expense-detail-item.mjs +15 -0
- package/dist/components/ui/expense-work-details.js +1259 -0
- package/dist/components/ui/expense-work-details.mjs +175 -0
- package/dist/components/ui/field.mjs +2 -2
- package/dist/components/ui/file-preview-dialog.js +704 -0
- package/dist/components/ui/file-preview-dialog.mjs +17 -0
- package/dist/components/ui/financial-cards.mjs +2 -2
- package/dist/components/ui/financial-drawers.js +1 -1
- package/dist/components/ui/financial-drawers.mjs +5 -5
- package/dist/components/ui/financial-sections.mjs +4 -4
- package/dist/components/ui/form-primitives.mjs +2 -2
- package/dist/components/ui/frontend-signup-steps.js +1239 -0
- package/dist/components/ui/frontend-signup-steps.mjs +38 -0
- package/dist/components/ui/income-bar-chart.mjs +4 -4
- package/dist/components/ui/income-sources-card.js +269 -0
- package/dist/components/ui/income-sources-card.mjs +100 -0
- package/dist/components/ui/income-summary-component.js +361 -0
- package/dist/components/ui/income-summary-component.mjs +84 -0
- package/dist/components/ui/income-work-details.js +1663 -0
- package/dist/components/ui/income-work-details.mjs +28 -0
- package/dist/components/ui/incoming-outgoings-card.js +218 -0
- package/dist/components/ui/incoming-outgoings-card.mjs +82 -0
- package/dist/components/ui/interest-rate-input.js +442 -0
- package/dist/components/ui/interest-rate-input.mjs +90 -0
- package/dist/components/ui/interest-rate-section.js +337 -0
- package/dist/components/ui/interest-rate-section.mjs +84 -0
- package/dist/components/ui/interest-rate-used.js +202 -0
- package/dist/components/ui/interest-rate-used.mjs +62 -0
- package/dist/components/ui/kanban-column.js +338 -160
- package/dist/components/ui/kanban-column.mjs +13 -11
- package/dist/components/ui/loan-applicant-information.js +336 -0
- package/dist/components/ui/loan-applicant-information.mjs +59 -0
- package/dist/components/ui/loan-applicant-invite.js +319 -0
- package/dist/components/ui/loan-applicant-invite.mjs +68 -0
- package/dist/components/ui/loan-application-badge.js +236 -0
- package/dist/components/ui/loan-application-badge.mjs +10 -0
- package/dist/components/ui/loan-application-cards.js +356 -0
- package/dist/components/ui/loan-application-cards.mjs +110 -0
- package/dist/components/ui/loan-entry-shell.js +104 -0
- package/dist/components/ui/loan-entry-shell.mjs +8 -0
- package/dist/components/ui/loan-financials.js +410 -0
- package/dist/components/ui/loan-financials.mjs +76 -0
- package/dist/components/ui/loan-option-card.js +102 -0
- package/dist/components/ui/loan-option-card.mjs +41 -0
- package/dist/components/ui/loan-option-group.js +288 -0
- package/dist/components/ui/loan-option-group.mjs +10 -0
- package/dist/components/ui/loan-steps.js +1121 -0
- package/dist/components/ui/loan-steps.mjs +509 -0
- package/dist/components/ui/loan-wizard-shell.js +452 -0
- package/dist/components/ui/loan-wizard-shell.mjs +11 -0
- package/dist/components/ui/money-input-with-slider.js +210 -0
- package/dist/components/ui/money-input-with-slider.mjs +10 -0
- package/dist/components/ui/money-item-with-color-indicator.js +314 -0
- package/dist/components/ui/money-item-with-color-indicator.mjs +20 -0
- package/dist/components/ui/opportunity-card.js +235 -97
- package/dist/components/ui/opportunity-card.mjs +11 -9
- package/dist/components/ui/opportunity-edit-modals.js +1 -1
- package/dist/components/ui/opportunity-edit-modals.mjs +15 -15
- package/dist/components/ui/opportunity-summary-tab.js +1 -1
- package/dist/components/ui/opportunity-summary-tab.mjs +19 -19
- package/dist/components/ui/pagination.mjs +4 -4
- package/dist/components/ui/password-strength-tooltip.mjs +4 -4
- package/dist/components/ui/pipeline-board.js +358 -176
- package/dist/components/ui/pipeline-board.mjs +16 -14
- package/dist/components/ui/pipeline-chart.mjs +3 -3
- package/dist/components/ui/pipeline-dialogs.js +1 -1
- package/dist/components/ui/pipeline-dialogs.mjs +9 -9
- package/dist/components/ui/pipeline-primitives.js +75 -8
- package/dist/components/ui/pipeline-primitives.mjs +3 -2
- package/dist/components/ui/popover.mjs +3 -3
- package/dist/components/ui/property-asset-card.js +428 -0
- package/dist/components/ui/property-asset-card.mjs +156 -0
- package/dist/components/ui/property-cashflow-doughnut-chart.mjs +4 -4
- package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +4 -4
- package/dist/components/ui/property-list-carousel.js +295 -0
- package/dist/components/ui/property-list-carousel.mjs +11 -0
- package/dist/components/ui/property-mobile-estimate-line-chart.mjs +4 -4
- package/dist/components/ui/property-report-dialog.js +1148 -0
- package/dist/components/ui/property-report-dialog.mjs +25 -0
- package/dist/components/ui/resource-center.js +748 -0
- package/dist/components/ui/resource-center.mjs +24 -0
- package/dist/components/ui/review-alerts-dialog.js +569 -0
- package/dist/components/ui/review-alerts-dialog.mjs +15 -0
- package/dist/components/ui/savings-goal-modal.js +1148 -0
- package/dist/components/ui/savings-goal-modal.mjs +160 -0
- package/dist/components/ui/scenario-drawer.js +791 -0
- package/dist/components/ui/scenario-drawer.mjs +294 -0
- package/dist/components/ui/scenario-item.js +256 -0
- package/dist/components/ui/scenario-item.mjs +11 -0
- package/dist/components/ui/scenario-list.js +507 -0
- package/dist/components/ui/scenario-list.mjs +100 -0
- package/dist/components/ui/select.mjs +3 -3
- package/dist/components/ui/share-details-dialog.js +636 -0
- package/dist/components/ui/share-details-dialog.mjs +19 -0
- package/dist/components/ui/sheet.mjs +3 -3
- package/dist/components/ui/sidebar-nav.mjs +5 -5
- package/dist/components/ui/signup-form-primitives.js +770 -0
- package/dist/components/ui/signup-form-primitives.mjs +25 -0
- package/dist/components/ui/signup-shell.js +338 -0
- package/dist/components/ui/signup-shell.mjs +13 -0
- package/dist/components/ui/stage-timeline.js +103 -33
- package/dist/components/ui/stage-timeline.mjs +5 -4
- package/dist/components/ui/submission-confirmation-card.js +284 -0
- package/dist/components/ui/submission-confirmation-card.mjs +62 -0
- package/dist/components/ui/tooltip.mjs +3 -3
- package/dist/components/ui/top-three-product.js +374 -0
- package/dist/components/ui/top-three-product.mjs +129 -0
- package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +4 -4
- package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -5
- package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +4 -4
- package/dist/components/ui/transactions-summary-block.js +95 -0
- package/dist/components/ui/transactions-summary-block.mjs +34 -0
- package/dist/components/ui/two-fa-setup-form.mjs +3 -3
- package/dist/index.js +9430 -4573
- package/dist/index.mjs +404 -251
- package/dist/lib/colors.js +6 -0
- package/dist/lib/colors.mjs +3 -1
- package/dist/lib/theme-provider.mjs +2 -2
- package/dist/styles.css +1 -1
- package/package.json +366 -2
- package/src/components/index.tsx +223 -0
- package/src/components/ui/about-you-form.tsx +397 -0
- package/src/components/ui/account-list-carousel.tsx +87 -0
- package/src/components/ui/add-lead-modal.tsx +1 -1
- package/src/components/ui/agent-evaluation-toast.tsx +191 -0
- package/src/components/ui/ai-builder.tsx +3 -5
- package/src/components/ui/ai-conversations.tsx +1 -1
- package/src/components/ui/applicant-document-checklist.tsx +175 -0
- package/src/components/ui/applicant-expenses-section.tsx +260 -0
- package/src/components/ui/applicant-navigation-bar.tsx +104 -0
- package/src/components/ui/applicant-switcher.tsx +54 -0
- package/src/components/ui/application-mobile-layout.tsx +34 -0
- package/src/components/ui/appointment-availability-settings.tsx +115 -23
- package/src/components/ui/appointment-book-dialog.tsx +406 -259
- package/src/components/ui/appointment-calendar-view.tsx +4 -1
- package/src/components/ui/appointment-detail-sheet.tsx +59 -24
- package/src/components/ui/appointment-time-slot-picker.tsx +5 -1
- package/src/components/ui/asset-accordion.tsx +241 -0
- package/src/components/ui/assets-liabilities-side-card.tsx +157 -0
- package/src/components/ui/auth-page-layout.tsx +3 -3
- package/src/components/ui/backoffice-alert-matching-chart.tsx +320 -0
- package/src/components/ui/backoffice-contact-matching-chart.tsx +341 -0
- package/src/components/ui/backoffice-signup-steps.tsx +615 -0
- package/src/components/ui/bank-statement-document-table.tsx +222 -0
- package/src/components/ui/bank-statement-generate-dialog.tsx +435 -0
- package/src/components/ui/bank-statement-pdf-viewer.tsx +241 -0
- package/src/components/ui/banking-accounts-connect.tsx +187 -0
- package/src/components/ui/borrowing-capacity-atoms.tsx +228 -0
- package/src/components/ui/borrowing-capacity-card.tsx +155 -0
- package/src/components/ui/broker-info-panel.tsx +94 -0
- package/src/components/ui/calculator-input-item.tsx +49 -0
- package/src/components/ui/calculator-section.tsx +275 -0
- package/src/components/ui/category-edit-dialog.tsx +300 -0
- package/src/components/ui/connect-bank-step.tsx +379 -0
- package/src/components/ui/contact-alert-dialog.tsx +710 -0
- package/src/components/ui/create-contact-modal.tsx +237 -0
- package/src/components/ui/csv-import-modal.tsx +153 -0
- package/src/components/ui/currency-input.tsx +104 -0
- package/src/components/ui/dashboard-expense-categories.tsx +262 -0
- package/src/components/ui/dashboard-transactions-table.tsx +241 -0
- package/src/components/ui/debt-accordion.tsx +254 -0
- package/src/components/ui/delete-contact-component.tsx +87 -0
- package/src/components/ui/dialog.tsx +2 -2
- package/src/components/ui/dynamic-tabs.tsx +149 -0
- package/src/components/ui/editable-money-item.tsx +176 -0
- package/src/components/ui/expense-detail-item.tsx +216 -0
- package/src/components/ui/expense-work-details.tsx +229 -0
- package/src/components/ui/file-preview-dialog.tsx +292 -0
- package/src/components/ui/financial-drawers.tsx +1 -1
- package/src/components/ui/frontend-signup-steps.tsx +548 -0
- package/src/components/ui/income-sources-card.tsx +143 -0
- package/src/components/ui/income-summary-component.tsx +120 -0
- package/src/components/ui/income-work-details.tsx +429 -0
- package/src/components/ui/incoming-outgoings-card.tsx +111 -0
- package/src/components/ui/interest-rate-input.tsx +111 -0
- package/src/components/ui/interest-rate-section.tsx +158 -0
- package/src/components/ui/interest-rate-used.tsx +82 -0
- package/src/components/ui/kanban-column.tsx +53 -2
- package/src/components/ui/loan-applicant-information.tsx +64 -0
- package/src/components/ui/loan-applicant-invite.tsx +67 -0
- package/src/components/ui/loan-application-badge.tsx +70 -0
- package/src/components/ui/loan-application-cards.tsx +152 -0
- package/src/components/ui/loan-entry-shell.tsx +86 -0
- package/src/components/ui/loan-financials.tsx +77 -0
- package/src/components/ui/loan-option-card.tsx +62 -0
- package/src/components/ui/loan-option-group.tsx +106 -0
- package/src/components/ui/loan-steps.tsx +630 -0
- package/src/components/ui/loan-wizard-shell.tsx +235 -0
- package/src/components/ui/money-input-with-slider.tsx +77 -0
- package/src/components/ui/money-item-with-color-indicator.tsx +30 -0
- package/src/components/ui/opportunity-card.tsx +46 -18
- package/src/components/ui/pipeline-board.tsx +13 -0
- package/src/components/ui/pipeline-primitives.tsx +28 -0
- package/src/components/ui/property-asset-card.tsx +221 -0
- package/src/components/ui/property-list-carousel.tsx +73 -0
- package/src/components/ui/property-report-dialog.tsx +355 -0
- package/src/components/ui/resource-center.tsx +539 -0
- package/src/components/ui/review-alerts-dialog.tsx +163 -0
- package/src/components/ui/savings-goal-modal.tsx +169 -0
- package/src/components/ui/scenario-drawer.tsx +358 -0
- package/src/components/ui/scenario-item.tsx +141 -0
- package/src/components/ui/scenario-list.tsx +150 -0
- package/src/components/ui/share-details-dialog.tsx +238 -0
- package/src/components/ui/signup-form-primitives.tsx +212 -0
- package/src/components/ui/signup-shell.tsx +180 -0
- package/src/components/ui/stage-timeline.tsx +11 -0
- package/src/components/ui/submission-confirmation-card.tsx +68 -0
- package/src/components/ui/top-three-product.tsx +207 -0
- package/src/components/ui/transactions-summary-block.tsx +59 -0
- package/src/lib/colors.ts +12 -0
- package/src/lib/format-date.ts +2 -2
- package/src/styles/styles-css.ts +1 -1
- package/tsup.config.ts +77 -1
- package/dist/{chunk-5VOTTIXF.mjs → chunk-FRT3S72S.mjs} +3 -3
- package/dist/{chunk-7BTFGCFC.mjs → chunk-MUV4EGDW.mjs} +3 -3
- package/dist/{chunk-57ZXILTS.mjs → chunk-MXP2RX2V.mjs} +3 -3
- package/dist/{chunk-ZKWXDQDG.mjs → chunk-VCDGLN25.mjs} +3 -3
- package/dist/{chunk-FLL633WS.mjs → chunk-ZXEUBBHJ.mjs} +3 -3
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { cn } from "@/lib/utils";
|
|
3
|
+
import { Button } from "@/components/ui/button";
|
|
4
|
+
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
5
|
+
|
|
6
|
+
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
7
|
+
|
|
8
|
+
export type LoanWizardSection = {
|
|
9
|
+
value: string;
|
|
10
|
+
label: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type LoanWizardApplicantOption = {
|
|
15
|
+
id: string;
|
|
16
|
+
label: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type LoanWizardShellProps = {
|
|
20
|
+
// Header
|
|
21
|
+
/** Broker logo / wordmark rendered in the top-left. */
|
|
22
|
+
logo?: React.ReactNode;
|
|
23
|
+
onSaveAndLogOut?: () => void;
|
|
24
|
+
/** Label for the primary header action. Defaults to "Login App". */
|
|
25
|
+
loginAppLabel?: string;
|
|
26
|
+
onLoginApp?: () => void;
|
|
27
|
+
|
|
28
|
+
// Hero
|
|
29
|
+
/** Application headline. Defaults to WealthX copy. */
|
|
30
|
+
heroTitle?: string;
|
|
31
|
+
heroSubtitle?: string;
|
|
32
|
+
/** Broker info block rendered on the right of the hero. */
|
|
33
|
+
brokerSlot?: React.ReactNode;
|
|
34
|
+
|
|
35
|
+
// Tab navigation
|
|
36
|
+
sections: LoanWizardSection[];
|
|
37
|
+
activeSection: string;
|
|
38
|
+
onSectionChange: (section: string) => void;
|
|
39
|
+
|
|
40
|
+
// Applicant switcher (optional — shows a Main / Co-Applicant toggle)
|
|
41
|
+
applicantOptions?: LoanWizardApplicantOption[];
|
|
42
|
+
activeApplicantId?: string;
|
|
43
|
+
onApplicantChange?: (id: string) => void;
|
|
44
|
+
|
|
45
|
+
// Content
|
|
46
|
+
children?: React.ReactNode;
|
|
47
|
+
|
|
48
|
+
// Bottom navigation
|
|
49
|
+
onPrev?: () => void;
|
|
50
|
+
onNext?: () => void;
|
|
51
|
+
nextLabel?: string;
|
|
52
|
+
|
|
53
|
+
className?: string;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export type { LoanWizardSection as LoanWizardSectionItem };
|
|
57
|
+
export type { LoanWizardApplicantOption as LoanWizardApplicant };
|
|
58
|
+
|
|
59
|
+
// ─── Component ────────────────────────────────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
export function LoanWizardShell({
|
|
62
|
+
logo,
|
|
63
|
+
onSaveAndLogOut,
|
|
64
|
+
loginAppLabel = "Login App",
|
|
65
|
+
onLoginApp,
|
|
66
|
+
heroTitle = "Quick Online Application,\nThat Get's You Answers Fast!",
|
|
67
|
+
heroSubtitle = "(This does not effect your credit score)",
|
|
68
|
+
brokerSlot,
|
|
69
|
+
sections,
|
|
70
|
+
activeSection,
|
|
71
|
+
onSectionChange,
|
|
72
|
+
applicantOptions,
|
|
73
|
+
activeApplicantId,
|
|
74
|
+
onApplicantChange,
|
|
75
|
+
children,
|
|
76
|
+
onPrev,
|
|
77
|
+
onNext,
|
|
78
|
+
nextLabel = "Next",
|
|
79
|
+
className,
|
|
80
|
+
}: LoanWizardShellProps) {
|
|
81
|
+
return (
|
|
82
|
+
<div
|
|
83
|
+
className={cn(
|
|
84
|
+
"flex min-h-screen flex-col bg-background font-sans",
|
|
85
|
+
className,
|
|
86
|
+
)}
|
|
87
|
+
>
|
|
88
|
+
{/* ── Header ── */}
|
|
89
|
+
<header className="flex shrink-0 items-center justify-between border-b border-border px-4 py-4 sm:px-8 sm:py-5 lg:px-[200px]">
|
|
90
|
+
<div className="flex items-center">{logo}</div>
|
|
91
|
+
<div className="flex items-center gap-3">
|
|
92
|
+
{onSaveAndLogOut && (
|
|
93
|
+
<Button variant="outline" size="sm" onClick={onSaveAndLogOut}>
|
|
94
|
+
Save & Log Out
|
|
95
|
+
</Button>
|
|
96
|
+
)}
|
|
97
|
+
{onLoginApp && (
|
|
98
|
+
<Button size="sm" onClick={onLoginApp}>
|
|
99
|
+
{loginAppLabel}
|
|
100
|
+
</Button>
|
|
101
|
+
)}
|
|
102
|
+
</div>
|
|
103
|
+
</header>
|
|
104
|
+
|
|
105
|
+
{/* ── Hero ── */}
|
|
106
|
+
<div className="flex shrink-0 items-center justify-between px-4 py-8 sm:px-8 sm:py-12 lg:px-[200px]">
|
|
107
|
+
<div className="flex flex-col gap-2">
|
|
108
|
+
<h1 className="text-2xl font-bold text-foreground lg:text-[38px] lg:leading-tight">
|
|
109
|
+
{heroTitle.split("\n").map((line, i) => (
|
|
110
|
+
<React.Fragment key={i}>
|
|
111
|
+
{line}
|
|
112
|
+
{i < heroTitle.split("\n").length - 1 && <br />}
|
|
113
|
+
</React.Fragment>
|
|
114
|
+
))}
|
|
115
|
+
</h1>
|
|
116
|
+
{heroSubtitle && (
|
|
117
|
+
<p className="text-sm text-muted-foreground">{heroSubtitle}</p>
|
|
118
|
+
)}
|
|
119
|
+
<div className="mt-2 h-[3px] w-24 bg-primary" />
|
|
120
|
+
</div>
|
|
121
|
+
{brokerSlot && <div className="hidden lg:flex">{brokerSlot}</div>}
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
{/* ── Tab navigation ── */}
|
|
125
|
+
<div className="shrink-0 px-4 sm:px-8 lg:px-[200px]">
|
|
126
|
+
<div className="flex items-end gap-0 border-b border-border">
|
|
127
|
+
{sections.map((s) => (
|
|
128
|
+
<button
|
|
129
|
+
key={s.value}
|
|
130
|
+
type="button"
|
|
131
|
+
disabled={s.disabled}
|
|
132
|
+
onClick={() => onSectionChange(s.value)}
|
|
133
|
+
className={cn(
|
|
134
|
+
"px-3 py-1 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
135
|
+
s.value === activeSection
|
|
136
|
+
? "border-b-[3px] border-primary font-semibold text-foreground"
|
|
137
|
+
: "text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:opacity-40",
|
|
138
|
+
)}
|
|
139
|
+
>
|
|
140
|
+
{s.label}
|
|
141
|
+
</button>
|
|
142
|
+
))}
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
{/* ── Content area ── */}
|
|
147
|
+
<div className="flex flex-1 flex-col gap-6 px-4 pb-10 pt-6 sm:px-8 sm:pb-16 sm:pt-10 lg:px-[200px]">
|
|
148
|
+
{/* Applicant switcher */}
|
|
149
|
+
{applicantOptions && applicantOptions.length > 1 && (
|
|
150
|
+
<Tabs
|
|
151
|
+
value={activeApplicantId}
|
|
152
|
+
onValueChange={onApplicantChange}
|
|
153
|
+
className="w-fit"
|
|
154
|
+
>
|
|
155
|
+
<TabsList>
|
|
156
|
+
{applicantOptions.map((opt) => (
|
|
157
|
+
<TabsTrigger key={opt.id} value={opt.id}>
|
|
158
|
+
{opt.label}
|
|
159
|
+
</TabsTrigger>
|
|
160
|
+
))}
|
|
161
|
+
</TabsList>
|
|
162
|
+
</Tabs>
|
|
163
|
+
)}
|
|
164
|
+
|
|
165
|
+
{/* sr-only h2 establishes heading hierarchy: h1 (hero) → h2 (section) → h3 (organisms) */}
|
|
166
|
+
<h2 className="sr-only">
|
|
167
|
+
{sections.find((s) => s.value === activeSection)?.label}
|
|
168
|
+
</h2>
|
|
169
|
+
|
|
170
|
+
{/* Section content — constrained to ~628px matching design */}
|
|
171
|
+
<div className="w-full max-w-[628px]">{children}</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
{/* ── Bottom navigation ── */}
|
|
175
|
+
{(onPrev || onNext) && (
|
|
176
|
+
<div className="shrink-0 px-4 pb-6 sm:px-8 sm:pb-10 lg:px-[200px]">
|
|
177
|
+
<div className="flex max-w-[628px] items-center justify-between border-t border-border pt-6">
|
|
178
|
+
{onPrev ? (
|
|
179
|
+
<Button variant="outline" onClick={onPrev}>
|
|
180
|
+
<ChevronLeftIcon className="mr-1 size-4" />
|
|
181
|
+
Previous
|
|
182
|
+
</Button>
|
|
183
|
+
) : (
|
|
184
|
+
<span />
|
|
185
|
+
)}
|
|
186
|
+
{onNext && (
|
|
187
|
+
<Button variant="outline" onClick={onNext}>
|
|
188
|
+
{nextLabel}
|
|
189
|
+
<ChevronRightIcon className="ml-1 size-4" />
|
|
190
|
+
</Button>
|
|
191
|
+
)}
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
)}
|
|
195
|
+
</div>
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ─── Icons ────────────────────────────────────────────────────────────────────
|
|
200
|
+
|
|
201
|
+
function ChevronLeftIcon({ className }: { className?: string }) {
|
|
202
|
+
return (
|
|
203
|
+
<svg
|
|
204
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
205
|
+
viewBox="0 0 24 24"
|
|
206
|
+
fill="none"
|
|
207
|
+
stroke="currentColor"
|
|
208
|
+
strokeWidth={2}
|
|
209
|
+
strokeLinecap="round"
|
|
210
|
+
strokeLinejoin="round"
|
|
211
|
+
className={className}
|
|
212
|
+
aria-hidden="true"
|
|
213
|
+
>
|
|
214
|
+
<path d="m15 18-6-6 6-6" />
|
|
215
|
+
</svg>
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function ChevronRightIcon({ className }: { className?: string }) {
|
|
220
|
+
return (
|
|
221
|
+
<svg
|
|
222
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
223
|
+
viewBox="0 0 24 24"
|
|
224
|
+
fill="none"
|
|
225
|
+
stroke="currentColor"
|
|
226
|
+
strokeWidth={2}
|
|
227
|
+
strokeLinecap="round"
|
|
228
|
+
strokeLinejoin="round"
|
|
229
|
+
className={className}
|
|
230
|
+
aria-hidden="true"
|
|
231
|
+
>
|
|
232
|
+
<path d="m9 18 6-6-6-6" />
|
|
233
|
+
</svg>
|
|
234
|
+
);
|
|
235
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { cn } from "@/lib/utils";
|
|
3
|
+
import { formatCurrency, formatCurrencyAbbrev } from "@/lib/format-currency";
|
|
4
|
+
import { Slider } from "./slider";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A labeled slider molecule for selecting a dollar amount within a range.
|
|
8
|
+
*
|
|
9
|
+
* Layout (top-to-bottom):
|
|
10
|
+
* - Label (left) + current value (right)
|
|
11
|
+
* - Slider track + thumb
|
|
12
|
+
* - Min label (left) + max label (right) — abbreviated currency
|
|
13
|
+
*
|
|
14
|
+
* Used in the Borrowing Capacity page for inputs like interest rate, purchase
|
|
15
|
+
* price range, or LVR settings where a slider gives better UX than a bare text
|
|
16
|
+
* input.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export interface MoneyInputWithSliderProps {
|
|
20
|
+
/** Label shown above the slider (e.g. "Purchase Price") */
|
|
21
|
+
label: string;
|
|
22
|
+
/** Current value in whole dollars */
|
|
23
|
+
value: number;
|
|
24
|
+
/** Minimum selectable value in whole dollars */
|
|
25
|
+
min: number;
|
|
26
|
+
/** Maximum selectable value in whole dollars */
|
|
27
|
+
max: number;
|
|
28
|
+
/** Step size in dollars (default: 1000) */
|
|
29
|
+
step?: number;
|
|
30
|
+
/** Called on every slider change with the new dollar value */
|
|
31
|
+
onChange?: (value: number) => void;
|
|
32
|
+
disabled?: boolean;
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function MoneyInputWithSlider({
|
|
37
|
+
label,
|
|
38
|
+
value,
|
|
39
|
+
min,
|
|
40
|
+
max,
|
|
41
|
+
step = 1000,
|
|
42
|
+
onChange,
|
|
43
|
+
disabled = false,
|
|
44
|
+
className,
|
|
45
|
+
}: MoneyInputWithSliderProps) {
|
|
46
|
+
return (
|
|
47
|
+
<div className={cn("flex flex-col gap-2", className)}>
|
|
48
|
+
{/* Label row */}
|
|
49
|
+
<div className="flex items-center justify-between gap-2">
|
|
50
|
+
<span className="text-sm text-muted-foreground">{label}</span>
|
|
51
|
+
<span className="text-sm font-semibold tabular-nums text-foreground">
|
|
52
|
+
{formatCurrency(value)}
|
|
53
|
+
</span>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
{/* Slider */}
|
|
57
|
+
<Slider
|
|
58
|
+
value={value}
|
|
59
|
+
min={min}
|
|
60
|
+
max={max}
|
|
61
|
+
step={step}
|
|
62
|
+
disabled={disabled}
|
|
63
|
+
onValueChange={onChange}
|
|
64
|
+
/>
|
|
65
|
+
|
|
66
|
+
{/* Min / max labels */}
|
|
67
|
+
<div className="flex items-center justify-between">
|
|
68
|
+
<span className="text-xs text-muted-foreground">
|
|
69
|
+
{formatCurrencyAbbrev(min)}
|
|
70
|
+
</span>
|
|
71
|
+
<span className="text-xs text-muted-foreground">
|
|
72
|
+
{formatCurrencyAbbrev(max)}
|
|
73
|
+
</span>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { EditableMoneyItem } from "./editable-money-item";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A read-only variant of `EditableMoneyItem` — same swatch + label + tooltip
|
|
6
|
+
* layout, but without the pencil edit trigger.
|
|
7
|
+
*
|
|
8
|
+
* The pencil slot is still reserved (invisible) so value text stays
|
|
9
|
+
* column-aligned when mixed with editable rows in the same list.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export interface MoneyItemWithColorIndicatorProps {
|
|
13
|
+
/** Row label (e.g. "Surplus Income") */
|
|
14
|
+
label: string;
|
|
15
|
+
/** Pre-formatted value string (e.g. "$2,400") */
|
|
16
|
+
value: string;
|
|
17
|
+
/** CSS color used for the swatch border and tinted fill */
|
|
18
|
+
color: string;
|
|
19
|
+
/** Fill opacity for the swatch background (default: 0.4) */
|
|
20
|
+
fillOpacity?: number;
|
|
21
|
+
/** Optional tooltip text shown on the info icon */
|
|
22
|
+
tooltip?: string;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function MoneyItemWithColorIndicator(
|
|
27
|
+
props: MoneyItemWithColorIndicatorProps,
|
|
28
|
+
) {
|
|
29
|
+
return <EditableMoneyItem {...props} />;
|
|
30
|
+
}
|
|
@@ -29,6 +29,12 @@ import {
|
|
|
29
29
|
AccordionTrigger,
|
|
30
30
|
} from "@/components/ui/accordion";
|
|
31
31
|
import { TaskCheckItem } from "@/components/ui/pipeline-primitives";
|
|
32
|
+
import {
|
|
33
|
+
Tooltip,
|
|
34
|
+
TooltipContent,
|
|
35
|
+
TooltipProvider,
|
|
36
|
+
TooltipTrigger,
|
|
37
|
+
} from "@/components/ui/tooltip";
|
|
32
38
|
|
|
33
39
|
/**
|
|
34
40
|
* OpportunityCard — WealthX DS (L3 Card)
|
|
@@ -104,6 +110,8 @@ export interface OpportunityCardProps {
|
|
|
104
110
|
loanApplicationUrl?: string;
|
|
105
111
|
|
|
106
112
|
// ── Actions ──────────────────────────────────────────────────
|
|
113
|
+
/** Fires when clicking the non-interactive card body (e.g. to open the summary drawer). */
|
|
114
|
+
onCardClick?: () => void;
|
|
107
115
|
onViewDetails?: () => void;
|
|
108
116
|
onTaskToggle?: (taskId: string) => void;
|
|
109
117
|
onMarkAsDone?: () => void;
|
|
@@ -115,6 +123,9 @@ export interface OpportunityCardProps {
|
|
|
115
123
|
|
|
116
124
|
/** Shows a loading state on action buttons while an async op is in flight. */
|
|
117
125
|
isSubmitting?: boolean;
|
|
126
|
+
/** Whether the card is draggable (HTML5 native DnD). */
|
|
127
|
+
draggable?: boolean;
|
|
128
|
+
onDragStart?: React.DragEventHandler<HTMLDivElement>;
|
|
118
129
|
className?: string;
|
|
119
130
|
}
|
|
120
131
|
|
|
@@ -151,7 +162,6 @@ function resolvePriority(
|
|
|
151
162
|
return priority;
|
|
152
163
|
}
|
|
153
164
|
|
|
154
|
-
|
|
155
165
|
function formatLoanType(type: string): string {
|
|
156
166
|
return type
|
|
157
167
|
.split("-")
|
|
@@ -180,6 +190,7 @@ export function OpportunityCard({
|
|
|
180
190
|
isModifyCompletedLoan,
|
|
181
191
|
tasks = [],
|
|
182
192
|
nextTask,
|
|
193
|
+
onCardClick,
|
|
183
194
|
onViewDetails,
|
|
184
195
|
onTaskToggle,
|
|
185
196
|
onMarkAsDone,
|
|
@@ -189,6 +200,8 @@ export function OpportunityCard({
|
|
|
189
200
|
onDelete,
|
|
190
201
|
onPutOnHold,
|
|
191
202
|
isSubmitting = false,
|
|
203
|
+
draggable = false,
|
|
204
|
+
onDragStart,
|
|
192
205
|
className,
|
|
193
206
|
}: OpportunityCardProps) {
|
|
194
207
|
const resolvedPriority = resolvePriority(
|
|
@@ -205,14 +218,21 @@ export function OpportunityCard({
|
|
|
205
218
|
const hasActions = onMarkAsDone || onMoveToNextStage;
|
|
206
219
|
const hasMenu = onViewDetails || onChangePriority || onPutOnHold || onDelete;
|
|
207
220
|
|
|
221
|
+
const stopProp = (e: React.MouseEvent) => e.stopPropagation();
|
|
222
|
+
|
|
208
223
|
return (
|
|
209
224
|
<div
|
|
210
225
|
className={cn(
|
|
211
226
|
"flex flex-col gap-2 border border-border bg-background p-4 text-foreground shadow-sm",
|
|
227
|
+
onCardClick && "cursor-pointer",
|
|
228
|
+
draggable && "cursor-grab active:cursor-grabbing",
|
|
212
229
|
isSubmitting && "opacity-60",
|
|
213
230
|
className,
|
|
214
231
|
)}
|
|
215
232
|
data-slot="opportunity-card"
|
|
233
|
+
draggable={draggable}
|
|
234
|
+
onDragStart={onDragStart}
|
|
235
|
+
onClick={onCardClick}
|
|
216
236
|
>
|
|
217
237
|
{/* ── On-hold banner ── */}
|
|
218
238
|
{onHoldTo && (
|
|
@@ -248,19 +268,25 @@ export function OpportunityCard({
|
|
|
248
268
|
</span>
|
|
249
269
|
</div>
|
|
250
270
|
|
|
251
|
-
<div className="flex items-center gap-1 -mr-1 -mt-1">
|
|
271
|
+
<div className="flex items-center gap-1 -mr-1 -mt-1" onClick={stopProp}>
|
|
252
272
|
{onLaunchAssistant && (
|
|
253
|
-
<
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
273
|
+
<TooltipProvider delay={0}>
|
|
274
|
+
<Tooltip>
|
|
275
|
+
<TooltipTrigger asChild>
|
|
276
|
+
<Button
|
|
277
|
+
type="button"
|
|
278
|
+
variant="ghost"
|
|
279
|
+
size="icon"
|
|
280
|
+
className="size-7 shrink-0"
|
|
281
|
+
onClick={onLaunchAssistant}
|
|
282
|
+
aria-label="Launch AI"
|
|
283
|
+
>
|
|
284
|
+
<Bot className="size-4" />
|
|
285
|
+
</Button>
|
|
286
|
+
</TooltipTrigger>
|
|
287
|
+
<TooltipContent>Launch AI</TooltipContent>
|
|
288
|
+
</Tooltip>
|
|
289
|
+
</TooltipProvider>
|
|
264
290
|
)}
|
|
265
291
|
{hasMenu && (
|
|
266
292
|
<DropdownMenu>
|
|
@@ -374,7 +400,8 @@ export function OpportunityCard({
|
|
|
374
400
|
|
|
375
401
|
{/* ── Tasks: segmented progress bar + animated accordion ── */}
|
|
376
402
|
{hasTasks && (
|
|
377
|
-
|
|
403
|
+
// stopPropagation: accordion expand/collapse + task checkboxes must not bubble to onCardClick
|
|
404
|
+
<div onClick={stopProp}>
|
|
378
405
|
{/* Segmented bar — one segment per task, filled = completed */}
|
|
379
406
|
<div
|
|
380
407
|
className="flex gap-0.5"
|
|
@@ -431,15 +458,16 @@ export function OpportunityCard({
|
|
|
431
458
|
<span className="text-muted-foreground">{nextTask}</span>
|
|
432
459
|
</div>
|
|
433
460
|
)}
|
|
434
|
-
|
|
461
|
+
</div>
|
|
435
462
|
)}
|
|
436
463
|
|
|
437
464
|
{/* ── Action buttons ── */}
|
|
438
465
|
{hasActions && (
|
|
439
|
-
|
|
466
|
+
// stopPropagation: button clicks must not bubble to onCardClick
|
|
467
|
+
<div onClick={stopProp}>
|
|
440
468
|
<Separator />
|
|
441
469
|
{(onMoveToNextStage || onMarkAsDone) && (
|
|
442
|
-
<div className="flex gap-2">
|
|
470
|
+
<div className="flex gap-2 pt-2">
|
|
443
471
|
{onMoveToNextStage && (
|
|
444
472
|
<Button
|
|
445
473
|
variant="outline"
|
|
@@ -464,7 +492,7 @@ export function OpportunityCard({
|
|
|
464
492
|
)}
|
|
465
493
|
</div>
|
|
466
494
|
)}
|
|
467
|
-
|
|
495
|
+
</div>
|
|
468
496
|
)}
|
|
469
497
|
</div>
|
|
470
498
|
);
|
|
@@ -83,6 +83,13 @@ export interface PipelineBoardProps {
|
|
|
83
83
|
onRefresh?: () => void;
|
|
84
84
|
|
|
85
85
|
// ── Card callbacks ───────────────────────────────────────────
|
|
86
|
+
/**
|
|
87
|
+
* Fires when a card is dragged from one column and dropped into another.
|
|
88
|
+
* The app is responsible for updating `columns` accordingly.
|
|
89
|
+
*/
|
|
90
|
+
onMoveCard?: (cardId: string, toColumnKey: string) => void;
|
|
91
|
+
/** Fires when clicking the non-interactive card body. */
|
|
92
|
+
onCardClick?: (opportunityId: string) => void;
|
|
86
93
|
onTaskToggle?: (opportunityId: string, taskId: string) => void;
|
|
87
94
|
onMarkAsDone?: (opportunityId: string) => void;
|
|
88
95
|
onMoveToNextStage?: (opportunityId: string) => void;
|
|
@@ -196,6 +203,8 @@ export function PipelineBoard({
|
|
|
196
203
|
onRefresh,
|
|
197
204
|
onEditColumn,
|
|
198
205
|
onDeleteColumn,
|
|
206
|
+
onMoveCard,
|
|
207
|
+
onCardClick,
|
|
199
208
|
onTaskToggle,
|
|
200
209
|
onMarkAsDone,
|
|
201
210
|
onMoveToNextStage,
|
|
@@ -249,6 +258,10 @@ export function PipelineBoard({
|
|
|
249
258
|
? () => onDeleteColumn(col.stage.id)
|
|
250
259
|
: undefined
|
|
251
260
|
}
|
|
261
|
+
onCardDrop={
|
|
262
|
+
onMoveCard ? (cardId) => onMoveCard(cardId, col.key) : undefined
|
|
263
|
+
}
|
|
264
|
+
onCardClick={onCardClick}
|
|
252
265
|
onTaskToggle={onTaskToggle}
|
|
253
266
|
onMarkAsDone={onMarkAsDone}
|
|
254
267
|
onMoveToNextStage={onMoveToNextStage}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { cn } from "@/lib/utils";
|
|
2
2
|
import { Badge } from "@/components/ui/badge";
|
|
3
3
|
import { Checkbox } from "@/components/ui/checkbox";
|
|
4
|
+
import { Switch } from "@/components/ui/switch";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Pipeline domain primitives — WealthX DS
|
|
@@ -26,6 +27,14 @@ export interface TaskCheckItemProps {
|
|
|
26
27
|
completed: boolean;
|
|
27
28
|
/** Name of the AI agent assigned to this task, if any. */
|
|
28
29
|
aiAgentName?: string | null;
|
|
30
|
+
/**
|
|
31
|
+
* When `aiAgentName` is set and this prop is provided (true/false),
|
|
32
|
+
* a "Allow Agent to Auto Complete" switch is shown beneath the agent badge.
|
|
33
|
+
* Omit this prop to hide the switch entirely.
|
|
34
|
+
*/
|
|
35
|
+
autoCompleteEnabled?: boolean;
|
|
36
|
+
/** Called when the auto-complete switch is toggled. */
|
|
37
|
+
onAutoCompleteToggle?: () => void;
|
|
29
38
|
/** Called when the checkbox is toggled. */
|
|
30
39
|
onToggle?: () => void;
|
|
31
40
|
/** Disables interaction (e.g. while saving). */
|
|
@@ -55,6 +64,8 @@ export function TaskCheckItem({
|
|
|
55
64
|
title,
|
|
56
65
|
completed,
|
|
57
66
|
aiAgentName,
|
|
67
|
+
autoCompleteEnabled,
|
|
68
|
+
onAutoCompleteToggle,
|
|
58
69
|
onToggle,
|
|
59
70
|
disabled = false,
|
|
60
71
|
size = "xs",
|
|
@@ -102,6 +113,23 @@ export function TaskCheckItem({
|
|
|
102
113
|
{aiAgentName}
|
|
103
114
|
</Badge>
|
|
104
115
|
)}
|
|
116
|
+
{aiAgentName && autoCompleteEnabled !== undefined && (
|
|
117
|
+
<span
|
|
118
|
+
className="flex items-center gap-1.5"
|
|
119
|
+
onClick={(e) => e.stopPropagation()}
|
|
120
|
+
>
|
|
121
|
+
<Switch
|
|
122
|
+
checked={autoCompleteEnabled}
|
|
123
|
+
onCheckedChange={() => onAutoCompleteToggle?.()}
|
|
124
|
+
disabled={disabled}
|
|
125
|
+
className="scale-75 origin-left"
|
|
126
|
+
aria-label="Allow agent to auto complete"
|
|
127
|
+
/>
|
|
128
|
+
<span className="text-[10px] text-muted-foreground">
|
|
129
|
+
Allow Agent to Auto Complete
|
|
130
|
+
</span>
|
|
131
|
+
</span>
|
|
132
|
+
)}
|
|
105
133
|
</span>
|
|
106
134
|
</div>
|
|
107
135
|
);
|