@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
|
@@ -357,6 +357,7 @@ function ToggleGroupItem(_a) {
|
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
// src/components/ui/kanban-column.tsx
|
|
360
|
+
var React4 = __toESM(require("react"));
|
|
360
361
|
var import_lucide_react7 = require("lucide-react");
|
|
361
362
|
|
|
362
363
|
// src/lib/theme-provider.tsx
|
|
@@ -694,18 +695,65 @@ function Checkbox(_a) {
|
|
|
694
695
|
);
|
|
695
696
|
}
|
|
696
697
|
|
|
697
|
-
// src/components/ui/
|
|
698
|
+
// src/components/ui/switch.tsx
|
|
699
|
+
var import_react4 = require("react");
|
|
700
|
+
var import_switch = require("@base-ui/react/switch");
|
|
698
701
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
702
|
+
function Switch(_a) {
|
|
703
|
+
var _b = _a, {
|
|
704
|
+
className,
|
|
705
|
+
size = "default"
|
|
706
|
+
} = _b, props = __objRest(_b, [
|
|
707
|
+
"className",
|
|
708
|
+
"size"
|
|
709
|
+
]);
|
|
710
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
711
|
+
import_switch.Switch.Root,
|
|
712
|
+
__spreadProps(__spreadValues({
|
|
713
|
+
className: cn(
|
|
714
|
+
"peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none",
|
|
715
|
+
"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
|
|
716
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
717
|
+
"data-[size=default]:h-[1.15rem] data-[size=default]:w-8",
|
|
718
|
+
"data-[size=sm]:h-3.5 data-[size=sm]:w-6",
|
|
719
|
+
"data-checked:bg-primary data-unchecked:bg-input",
|
|
720
|
+
"aria-invalid:data-checked:bg-destructive aria-invalid:border-destructive",
|
|
721
|
+
"dark:data-unchecked:bg-input/80",
|
|
722
|
+
className
|
|
723
|
+
),
|
|
724
|
+
"data-size": size,
|
|
725
|
+
"data-slot": "switch"
|
|
726
|
+
}, props), {
|
|
727
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
728
|
+
import_switch.Switch.Thumb,
|
|
729
|
+
{
|
|
730
|
+
className: cn(
|
|
731
|
+
"pointer-events-none block rounded-full bg-background ring-0 transition-transform",
|
|
732
|
+
"group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3",
|
|
733
|
+
"data-checked:translate-x-[calc(100%-2px)] data-unchecked:translate-x-0",
|
|
734
|
+
"dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground"
|
|
735
|
+
),
|
|
736
|
+
"data-slot": "switch-thumb"
|
|
737
|
+
}
|
|
738
|
+
)
|
|
739
|
+
})
|
|
740
|
+
);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
// src/components/ui/pipeline-primitives.tsx
|
|
744
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
699
745
|
function TaskCheckItem({
|
|
700
746
|
title,
|
|
701
747
|
completed,
|
|
702
748
|
aiAgentName,
|
|
749
|
+
autoCompleteEnabled,
|
|
750
|
+
onAutoCompleteToggle,
|
|
703
751
|
onToggle,
|
|
704
752
|
disabled = false,
|
|
705
753
|
size = "xs",
|
|
706
754
|
className
|
|
707
755
|
}) {
|
|
708
|
-
return /* @__PURE__ */ (0,
|
|
756
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
709
757
|
"div",
|
|
710
758
|
{
|
|
711
759
|
className: cn(
|
|
@@ -716,7 +764,7 @@ function TaskCheckItem({
|
|
|
716
764
|
onClick: () => onToggle == null ? void 0 : onToggle(),
|
|
717
765
|
"data-slot": "task-check-item",
|
|
718
766
|
children: [
|
|
719
|
-
/* @__PURE__ */ (0,
|
|
767
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { onClick: (e) => e.stopPropagation(), className: "mt-0.5 shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
720
768
|
Checkbox,
|
|
721
769
|
{
|
|
722
770
|
checked: completed,
|
|
@@ -724,8 +772,8 @@ function TaskCheckItem({
|
|
|
724
772
|
disabled
|
|
725
773
|
}
|
|
726
774
|
) }),
|
|
727
|
-
/* @__PURE__ */ (0,
|
|
728
|
-
/* @__PURE__ */ (0,
|
|
775
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
776
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
729
777
|
"span",
|
|
730
778
|
{
|
|
731
779
|
className: cn(
|
|
@@ -736,8 +784,8 @@ function TaskCheckItem({
|
|
|
736
784
|
children: title
|
|
737
785
|
}
|
|
738
786
|
),
|
|
739
|
-
aiAgentName && /* @__PURE__ */ (0,
|
|
740
|
-
/* @__PURE__ */ (0,
|
|
787
|
+
aiAgentName && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Badge, { variant: "secondary", className: "gap-1 text-[10px]", children: [
|
|
788
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
741
789
|
"span",
|
|
742
790
|
{
|
|
743
791
|
className: "size-1.5 rounded-full bg-primary",
|
|
@@ -745,15 +793,93 @@ function TaskCheckItem({
|
|
|
745
793
|
}
|
|
746
794
|
),
|
|
747
795
|
aiAgentName
|
|
748
|
-
] })
|
|
796
|
+
] }),
|
|
797
|
+
aiAgentName && autoCompleteEnabled !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
798
|
+
"span",
|
|
799
|
+
{
|
|
800
|
+
className: "flex items-center gap-1.5",
|
|
801
|
+
onClick: (e) => e.stopPropagation(),
|
|
802
|
+
children: [
|
|
803
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
804
|
+
Switch,
|
|
805
|
+
{
|
|
806
|
+
checked: autoCompleteEnabled,
|
|
807
|
+
onCheckedChange: () => onAutoCompleteToggle == null ? void 0 : onAutoCompleteToggle(),
|
|
808
|
+
disabled,
|
|
809
|
+
className: "scale-75 origin-left",
|
|
810
|
+
"aria-label": "Allow agent to auto complete"
|
|
811
|
+
}
|
|
812
|
+
),
|
|
813
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-[10px] text-muted-foreground", children: "Allow Agent to Auto Complete" })
|
|
814
|
+
]
|
|
815
|
+
}
|
|
816
|
+
)
|
|
749
817
|
] })
|
|
750
818
|
]
|
|
751
819
|
}
|
|
752
820
|
);
|
|
753
821
|
}
|
|
754
822
|
|
|
823
|
+
// src/components/ui/tooltip.tsx
|
|
824
|
+
var import_tooltip = require("@base-ui/react/tooltip");
|
|
825
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
826
|
+
function TooltipProvider(_a) {
|
|
827
|
+
var _b = _a, {
|
|
828
|
+
delay = 0
|
|
829
|
+
} = _b, props = __objRest(_b, [
|
|
830
|
+
"delay"
|
|
831
|
+
]);
|
|
832
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
833
|
+
import_tooltip.Tooltip.Provider,
|
|
834
|
+
__spreadValues({
|
|
835
|
+
"data-slot": "tooltip-provider",
|
|
836
|
+
delay
|
|
837
|
+
}, props)
|
|
838
|
+
);
|
|
839
|
+
}
|
|
840
|
+
function Tooltip(_a) {
|
|
841
|
+
var props = __objRest(_a, []);
|
|
842
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_tooltip.Tooltip.Root, __spreadValues({ "data-slot": "tooltip" }, props));
|
|
843
|
+
}
|
|
844
|
+
function TooltipTrigger(_a) {
|
|
845
|
+
var props = __objRest(_a, []);
|
|
846
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_tooltip.Tooltip.Trigger, __spreadValues({ "data-slot": "tooltip-trigger" }, props));
|
|
847
|
+
}
|
|
848
|
+
function TooltipContent(_a) {
|
|
849
|
+
var _b = _a, {
|
|
850
|
+
className,
|
|
851
|
+
sideOffset = 8,
|
|
852
|
+
side,
|
|
853
|
+
children,
|
|
854
|
+
style
|
|
855
|
+
} = _b, props = __objRest(_b, [
|
|
856
|
+
"className",
|
|
857
|
+
"sideOffset",
|
|
858
|
+
"side",
|
|
859
|
+
"children",
|
|
860
|
+
"style"
|
|
861
|
+
]);
|
|
862
|
+
const themeVars = useThemeVars();
|
|
863
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_tooltip.Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_tooltip.Tooltip.Positioner, { sideOffset, side, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
864
|
+
import_tooltip.Tooltip.Popup,
|
|
865
|
+
__spreadProps(__spreadValues({
|
|
866
|
+
className: cn(
|
|
867
|
+
"relative z-50 w-fit animate-in overflow-visible bg-brand-secondary px-3 py-1.5 text-caption text-balance text-brand-secondary-foreground fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:zoom-out-95 data-ending-style:fill-mode-forwards",
|
|
868
|
+
className
|
|
869
|
+
),
|
|
870
|
+
"data-slot": "tooltip-content",
|
|
871
|
+
style: __spreadValues(__spreadValues({}, themeVars), style)
|
|
872
|
+
}, props), {
|
|
873
|
+
children: [
|
|
874
|
+
children,
|
|
875
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_tooltip.Tooltip.Arrow, { className: "z-50 size-2.5 rotate-45 bg-brand-secondary data-[side=bottom]:-top-1 data-[side=left]:-right-1 data-[side=right]:-left-1 data-[side=top]:-bottom-1" })
|
|
876
|
+
]
|
|
877
|
+
})
|
|
878
|
+
) }) });
|
|
879
|
+
}
|
|
880
|
+
|
|
755
881
|
// src/components/ui/opportunity-card.tsx
|
|
756
|
-
var
|
|
882
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
757
883
|
var PRIORITY_COLORS = {
|
|
758
884
|
HIGH: "var(--color-destructive)",
|
|
759
885
|
MEDIUM: "var(--color-warning)",
|
|
@@ -793,6 +919,7 @@ function OpportunityCard({
|
|
|
793
919
|
isModifyCompletedLoan,
|
|
794
920
|
tasks = [],
|
|
795
921
|
nextTask,
|
|
922
|
+
onCardClick,
|
|
796
923
|
onViewDetails,
|
|
797
924
|
onTaskToggle,
|
|
798
925
|
onMarkAsDone,
|
|
@@ -802,6 +929,8 @@ function OpportunityCard({
|
|
|
802
929
|
onDelete,
|
|
803
930
|
onPutOnHold,
|
|
804
931
|
isSubmitting = false,
|
|
932
|
+
draggable = false,
|
|
933
|
+
onDragStart,
|
|
805
934
|
className
|
|
806
935
|
}) {
|
|
807
936
|
const resolvedPriority = resolvePriority(
|
|
@@ -816,29 +945,35 @@ function OpportunityCard({
|
|
|
816
945
|
const hasTasks = tasks.length > 0;
|
|
817
946
|
const hasActions = onMarkAsDone || onMoveToNextStage;
|
|
818
947
|
const hasMenu = onViewDetails || onChangePriority || onPutOnHold || onDelete;
|
|
819
|
-
|
|
948
|
+
const stopProp = (e) => e.stopPropagation();
|
|
949
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
820
950
|
"div",
|
|
821
951
|
{
|
|
822
952
|
className: cn(
|
|
823
953
|
"flex flex-col gap-2 border border-border bg-background p-4 text-foreground shadow-sm",
|
|
954
|
+
onCardClick && "cursor-pointer",
|
|
955
|
+
draggable && "cursor-grab active:cursor-grabbing",
|
|
824
956
|
isSubmitting && "opacity-60",
|
|
825
957
|
className
|
|
826
958
|
),
|
|
827
959
|
"data-slot": "opportunity-card",
|
|
960
|
+
draggable,
|
|
961
|
+
onDragStart,
|
|
962
|
+
onClick: onCardClick,
|
|
828
963
|
children: [
|
|
829
|
-
onHoldTo && /* @__PURE__ */ (0,
|
|
964
|
+
onHoldTo && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
830
965
|
"div",
|
|
831
966
|
{
|
|
832
967
|
className: "flex items-center gap-1.5 rounded border border-warning/30 bg-warning/10 px-2 py-1 text-xs font-medium",
|
|
833
968
|
style: { color: "var(--color-warning-text)" },
|
|
834
969
|
children: [
|
|
835
|
-
/* @__PURE__ */ (0,
|
|
970
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Clock, { className: "size-3 shrink-0" }),
|
|
836
971
|
"On hold until ",
|
|
837
972
|
formatDateDayMonth(onHoldTo)
|
|
838
973
|
]
|
|
839
974
|
}
|
|
840
975
|
),
|
|
841
|
-
isModifyCompletedLoan && /* @__PURE__ */ (0,
|
|
976
|
+
isModifyCompletedLoan && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
842
977
|
"div",
|
|
843
978
|
{
|
|
844
979
|
className: "flex items-center gap-1.5 rounded border border-info/30 bg-info/10 px-2 py-1 text-xs font-medium",
|
|
@@ -846,27 +981,29 @@ function OpportunityCard({
|
|
|
846
981
|
children: "Modify completed loan"
|
|
847
982
|
}
|
|
848
983
|
),
|
|
849
|
-
/* @__PURE__ */ (0,
|
|
850
|
-
/* @__PURE__ */ (0,
|
|
851
|
-
(loanPurposeLabel || loanType) && /* @__PURE__ */ (0,
|
|
852
|
-
/* @__PURE__ */ (0,
|
|
984
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
985
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
986
|
+
(loanPurposeLabel || loanType) && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Badge, { variant: "outline", className: "self-start", children: loanPurposeLabel != null ? loanPurposeLabel : formatLoanType(loanType) }),
|
|
987
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "text-base font-bold tabular-nums text-foreground", children: formatCurrency(amount) })
|
|
853
988
|
] }),
|
|
854
|
-
/* @__PURE__ */ (0,
|
|
855
|
-
onLaunchAssistant && /* @__PURE__ */ (0,
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
989
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center gap-1 -mr-1 -mt-1", onClick: stopProp, children: [
|
|
990
|
+
onLaunchAssistant && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(TooltipProvider, { delay: 0, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(Tooltip, { children: [
|
|
991
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
992
|
+
Button,
|
|
993
|
+
{
|
|
994
|
+
type: "button",
|
|
995
|
+
variant: "ghost",
|
|
996
|
+
size: "icon",
|
|
997
|
+
className: "size-7 shrink-0",
|
|
998
|
+
onClick: onLaunchAssistant,
|
|
999
|
+
"aria-label": "Launch AI",
|
|
1000
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Bot, { className: "size-4" })
|
|
1001
|
+
}
|
|
1002
|
+
) }),
|
|
1003
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(TooltipContent, { children: "Launch AI" })
|
|
1004
|
+
] }) }),
|
|
1005
|
+
hasMenu && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(DropdownMenu, { children: [
|
|
1006
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
870
1007
|
DropdownMenuTrigger,
|
|
871
1008
|
{
|
|
872
1009
|
className: cn(
|
|
@@ -874,51 +1011,51 @@ function OpportunityCard({
|
|
|
874
1011
|
"size-7 shrink-0"
|
|
875
1012
|
),
|
|
876
1013
|
"aria-label": "Opportunity actions",
|
|
877
|
-
children: /* @__PURE__ */ (0,
|
|
1014
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.MoreVertical, { className: "size-4" })
|
|
878
1015
|
}
|
|
879
1016
|
),
|
|
880
|
-
/* @__PURE__ */ (0,
|
|
881
|
-
onViewDetails && /* @__PURE__ */ (0,
|
|
882
|
-
onChangePriority && /* @__PURE__ */ (0,
|
|
883
|
-
onPutOnHold && /* @__PURE__ */ (0,
|
|
884
|
-
onDelete && /* @__PURE__ */ (0,
|
|
885
|
-
/* @__PURE__ */ (0,
|
|
886
|
-
/* @__PURE__ */ (0,
|
|
1017
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(DropdownMenuContent, { align: "end", children: [
|
|
1018
|
+
onViewDetails && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownMenuItem, { onClick: onViewDetails, children: "View details" }),
|
|
1019
|
+
onChangePriority && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownMenuItem, { onClick: onChangePriority, children: "Change priority" }),
|
|
1020
|
+
onPutOnHold && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownMenuItem, { onClick: onPutOnHold, children: "Put on hold" }),
|
|
1021
|
+
onDelete && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
1022
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownMenuSeparator, {}),
|
|
1023
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownMenuItem, { onClick: onDelete, variant: "destructive", children: "Delete" })
|
|
887
1024
|
] })
|
|
888
1025
|
] })
|
|
889
1026
|
] })
|
|
890
1027
|
] })
|
|
891
1028
|
] }),
|
|
892
|
-
/* @__PURE__ */ (0,
|
|
893
|
-
/* @__PURE__ */ (0,
|
|
894
|
-
/* @__PURE__ */ (0,
|
|
895
|
-
/* @__PURE__ */ (0,
|
|
896
|
-
additionalContacts && additionalContacts > 0 ? /* @__PURE__ */ (0,
|
|
897
|
-
/* @__PURE__ */ (0,
|
|
1029
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Separator, {}),
|
|
1030
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex flex-col gap-1", children: [
|
|
1031
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
|
|
1032
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "truncate text-sm font-semibold text-foreground", children: customerName }),
|
|
1033
|
+
additionalContacts && additionalContacts > 0 ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(Badge, { variant: "secondary", className: "shrink-0 gap-1", children: [
|
|
1034
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Users, { className: "size-3", "aria-hidden": "true" }),
|
|
898
1035
|
"Joint"
|
|
899
|
-
] }) : /* @__PURE__ */ (0,
|
|
900
|
-
/* @__PURE__ */ (0,
|
|
1036
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(Badge, { variant: "secondary", className: "shrink-0 gap-1", children: [
|
|
1037
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.User, { className: "size-3", "aria-hidden": "true" }),
|
|
901
1038
|
"Individual"
|
|
902
1039
|
] })
|
|
903
1040
|
] }),
|
|
904
|
-
customerPhone && /* @__PURE__ */ (0,
|
|
905
|
-
/* @__PURE__ */ (0,
|
|
1041
|
+
customerPhone && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1042
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Phone, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
906
1043
|
customerPhone
|
|
907
1044
|
] }),
|
|
908
|
-
customerEmail && /* @__PURE__ */ (0,
|
|
909
|
-
/* @__PURE__ */ (0,
|
|
910
|
-
/* @__PURE__ */ (0,
|
|
1045
|
+
customerEmail && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1046
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Mail, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
1047
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "truncate", children: customerEmail })
|
|
911
1048
|
] })
|
|
912
1049
|
] }),
|
|
913
|
-
/* @__PURE__ */ (0,
|
|
914
|
-
/* @__PURE__ */ (0,
|
|
915
|
-
/* @__PURE__ */ (0,
|
|
916
|
-
/* @__PURE__ */ (0,
|
|
1050
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Separator, {}),
|
|
1051
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
1052
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1053
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Calendar, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
917
1054
|
formatDateShort(date)
|
|
918
1055
|
] }),
|
|
919
|
-
/* @__PURE__ */ (0,
|
|
920
|
-
daysSinceColumnChanged !== void 0 && /* @__PURE__ */ (0,
|
|
921
|
-
/* @__PURE__ */ (0,
|
|
1056
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "flex items-center gap-1.5", children: [
|
|
1057
|
+
daysSinceColumnChanged !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
1058
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
922
1059
|
import_lucide_react6.Clock,
|
|
923
1060
|
{
|
|
924
1061
|
className: "size-3 shrink-0",
|
|
@@ -926,7 +1063,7 @@ function OpportunityCard({
|
|
|
926
1063
|
"aria-hidden": "true"
|
|
927
1064
|
}
|
|
928
1065
|
),
|
|
929
|
-
/* @__PURE__ */ (0,
|
|
1066
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
930
1067
|
"span",
|
|
931
1068
|
{
|
|
932
1069
|
className: "text-xs font-medium tabular-nums",
|
|
@@ -938,7 +1075,7 @@ function OpportunityCard({
|
|
|
938
1075
|
}
|
|
939
1076
|
)
|
|
940
1077
|
] }),
|
|
941
|
-
/* @__PURE__ */ (0,
|
|
1078
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
942
1079
|
"span",
|
|
943
1080
|
{
|
|
944
1081
|
role: "img",
|
|
@@ -949,8 +1086,9 @@ function OpportunityCard({
|
|
|
949
1086
|
)
|
|
950
1087
|
] })
|
|
951
1088
|
] }),
|
|
952
|
-
hasTasks &&
|
|
953
|
-
|
|
1089
|
+
hasTasks && // stopPropagation: accordion expand/collapse + task checkboxes must not bubble to onCardClick
|
|
1090
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { onClick: stopProp, children: [
|
|
1091
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
954
1092
|
"div",
|
|
955
1093
|
{
|
|
956
1094
|
className: "flex gap-0.5",
|
|
@@ -959,7 +1097,7 @@ function OpportunityCard({
|
|
|
959
1097
|
"aria-valuemin": 0,
|
|
960
1098
|
"aria-valuemax": tasks.length,
|
|
961
1099
|
"aria-label": `${completedCount} of ${tasks.length} tasks complete`,
|
|
962
|
-
children: tasks.map((t, i) => /* @__PURE__ */ (0,
|
|
1100
|
+
children: tasks.map((t, i) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
963
1101
|
"div",
|
|
964
1102
|
{
|
|
965
1103
|
className: cn(
|
|
@@ -971,15 +1109,15 @@ function OpportunityCard({
|
|
|
971
1109
|
))
|
|
972
1110
|
}
|
|
973
1111
|
),
|
|
974
|
-
/* @__PURE__ */ (0,
|
|
975
|
-
/* @__PURE__ */ (0,
|
|
1112
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Accordion, { type: "single", collapsible: true, className: "-mx-4", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(AccordionItem, { value: "tasks", className: "border-0", children: [
|
|
1113
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(AccordionTrigger, { className: "px-4 py-1.5 text-xs font-normal text-muted-foreground hover:no-underline hover:text-foreground [&>svg]:size-3.5", children: [
|
|
976
1114
|
"Tasks (",
|
|
977
1115
|
completedCount,
|
|
978
1116
|
"/",
|
|
979
1117
|
tasks.length,
|
|
980
1118
|
")"
|
|
981
1119
|
] }),
|
|
982
|
-
/* @__PURE__ */ (0,
|
|
1120
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(AccordionContent, { className: "px-4", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "flex flex-col", children: tasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
983
1121
|
TaskCheckItem,
|
|
984
1122
|
{
|
|
985
1123
|
title: task.title,
|
|
@@ -991,22 +1129,23 @@ function OpportunityCard({
|
|
|
991
1129
|
task.id
|
|
992
1130
|
)) }) })
|
|
993
1131
|
] }) }),
|
|
994
|
-
nextTask && /* @__PURE__ */ (0,
|
|
995
|
-
/* @__PURE__ */ (0,
|
|
1132
|
+
nextTask && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-start gap-1.5 border border-primary/30 bg-primary/5 px-2 py-1.5 text-xs", children: [
|
|
1133
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
996
1134
|
import_lucide_react6.ArrowRight,
|
|
997
1135
|
{
|
|
998
1136
|
className: "mt-0.5 size-3 shrink-0 text-primary",
|
|
999
1137
|
"aria-hidden": "true"
|
|
1000
1138
|
}
|
|
1001
1139
|
),
|
|
1002
|
-
/* @__PURE__ */ (0,
|
|
1003
|
-
/* @__PURE__ */ (0,
|
|
1140
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "font-medium", children: "Next:" }),
|
|
1141
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "text-muted-foreground", children: nextTask })
|
|
1004
1142
|
] })
|
|
1005
1143
|
] }),
|
|
1006
|
-
hasActions &&
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1144
|
+
hasActions && // stopPropagation: button clicks must not bubble to onCardClick
|
|
1145
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { onClick: stopProp, children: [
|
|
1146
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Separator, {}),
|
|
1147
|
+
(onMoveToNextStage || onMarkAsDone) && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex gap-2 pt-2", children: [
|
|
1148
|
+
onMoveToNextStage && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1010
1149
|
Button,
|
|
1011
1150
|
{
|
|
1012
1151
|
variant: "outline",
|
|
@@ -1017,7 +1156,7 @@ function OpportunityCard({
|
|
|
1017
1156
|
children: "Move to next stage"
|
|
1018
1157
|
}
|
|
1019
1158
|
),
|
|
1020
|
-
onMarkAsDone && /* @__PURE__ */ (0,
|
|
1159
|
+
onMarkAsDone && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1021
1160
|
Button,
|
|
1022
1161
|
{
|
|
1023
1162
|
variant: "default",
|
|
@@ -1044,7 +1183,7 @@ function LeadCard({
|
|
|
1044
1183
|
isSubmitting = false,
|
|
1045
1184
|
className
|
|
1046
1185
|
}) {
|
|
1047
|
-
return /* @__PURE__ */ (0,
|
|
1186
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
1048
1187
|
"div",
|
|
1049
1188
|
{
|
|
1050
1189
|
className: cn(
|
|
@@ -1054,20 +1193,20 @@ function LeadCard({
|
|
|
1054
1193
|
),
|
|
1055
1194
|
"data-slot": "lead-card",
|
|
1056
1195
|
children: [
|
|
1057
|
-
/* @__PURE__ */ (0,
|
|
1058
|
-
/* @__PURE__ */ (0,
|
|
1059
|
-
/* @__PURE__ */ (0,
|
|
1060
|
-
customerPhone && /* @__PURE__ */ (0,
|
|
1061
|
-
/* @__PURE__ */ (0,
|
|
1196
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
1197
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
1198
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "text-sm font-semibold text-foreground", children: customerName }),
|
|
1199
|
+
customerPhone && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1200
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Phone, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
1062
1201
|
customerPhone
|
|
1063
1202
|
] }),
|
|
1064
|
-
customerEmail && /* @__PURE__ */ (0,
|
|
1065
|
-
/* @__PURE__ */ (0,
|
|
1066
|
-
/* @__PURE__ */ (0,
|
|
1203
|
+
customerEmail && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1204
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.Mail, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
1205
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "truncate", children: customerEmail })
|
|
1067
1206
|
] })
|
|
1068
1207
|
] }),
|
|
1069
|
-
onDelete && /* @__PURE__ */ (0,
|
|
1070
|
-
/* @__PURE__ */ (0,
|
|
1208
|
+
onDelete && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(DropdownMenu, { children: [
|
|
1209
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1071
1210
|
DropdownMenuTrigger,
|
|
1072
1211
|
{
|
|
1073
1212
|
className: cn(
|
|
@@ -1075,10 +1214,10 @@ function LeadCard({
|
|
|
1075
1214
|
"-mr-1 -mt-1 size-7 shrink-0"
|
|
1076
1215
|
),
|
|
1077
1216
|
"aria-label": "Lead actions",
|
|
1078
|
-
children: /* @__PURE__ */ (0,
|
|
1217
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react6.MoreVertical, { className: "size-4" })
|
|
1079
1218
|
}
|
|
1080
1219
|
),
|
|
1081
|
-
/* @__PURE__ */ (0,
|
|
1220
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownMenuContent, { align: "end", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1082
1221
|
DropdownMenuItem,
|
|
1083
1222
|
{
|
|
1084
1223
|
onClick: onDelete,
|
|
@@ -1088,9 +1227,9 @@ function LeadCard({
|
|
|
1088
1227
|
) })
|
|
1089
1228
|
] })
|
|
1090
1229
|
] }),
|
|
1091
|
-
/* @__PURE__ */ (0,
|
|
1092
|
-
onSendLoanApplication && /* @__PURE__ */ (0,
|
|
1093
|
-
/* @__PURE__ */ (0,
|
|
1230
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Separator, {}),
|
|
1231
|
+
onSendLoanApplication && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex flex-col gap-2", children: [
|
|
1232
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1094
1233
|
Button,
|
|
1095
1234
|
{
|
|
1096
1235
|
variant: "outline",
|
|
@@ -1101,10 +1240,10 @@ function LeadCard({
|
|
|
1101
1240
|
children: "Send Loan Application Request"
|
|
1102
1241
|
}
|
|
1103
1242
|
),
|
|
1104
|
-
loanApplicationUrl && /* @__PURE__ */ (0,
|
|
1243
|
+
loanApplicationUrl && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
1105
1244
|
"Or the link below to fill out the loan application directly.",
|
|
1106
|
-
/* @__PURE__ */ (0,
|
|
1107
|
-
/* @__PURE__ */ (0,
|
|
1245
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("br", {}),
|
|
1246
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1108
1247
|
"a",
|
|
1109
1248
|
{
|
|
1110
1249
|
href: `https://${loanApplicationUrl.replace(/^https?:\/\//, "")}`,
|
|
@@ -1122,7 +1261,7 @@ function LeadCard({
|
|
|
1122
1261
|
}
|
|
1123
1262
|
|
|
1124
1263
|
// src/components/ui/kanban-column.tsx
|
|
1125
|
-
var
|
|
1264
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1126
1265
|
function formatTotalValue(value) {
|
|
1127
1266
|
return formatCurrency(value);
|
|
1128
1267
|
}
|
|
@@ -1145,11 +1284,13 @@ function KanbanColumn({
|
|
|
1145
1284
|
onMarkAsDone,
|
|
1146
1285
|
onMoveToNextStage,
|
|
1147
1286
|
onSendLoanApplication,
|
|
1287
|
+
onCardClick,
|
|
1148
1288
|
onViewDetails,
|
|
1149
1289
|
onChangePriority,
|
|
1150
1290
|
onLaunchAssistant,
|
|
1151
1291
|
onPutOnHold,
|
|
1152
1292
|
onDeleteOpportunity,
|
|
1293
|
+
onCardDrop,
|
|
1153
1294
|
submittingOpportunityId,
|
|
1154
1295
|
className
|
|
1155
1296
|
}) {
|
|
@@ -1157,7 +1298,26 @@ function KanbanColumn({
|
|
|
1157
1298
|
const themeVars = useThemeVars();
|
|
1158
1299
|
const accentColor = (_a = stage.accentColor) != null ? _a : "var(--color-border)";
|
|
1159
1300
|
const hasMenu = onEditColumn || !isDefault && onDeleteColumn;
|
|
1160
|
-
|
|
1301
|
+
const [isDragOver, setIsDragOver] = React4.useState(false);
|
|
1302
|
+
function handleDragOver(e) {
|
|
1303
|
+
if (!onCardDrop) return;
|
|
1304
|
+
e.preventDefault();
|
|
1305
|
+
e.dataTransfer.dropEffect = "move";
|
|
1306
|
+
setIsDragOver(true);
|
|
1307
|
+
}
|
|
1308
|
+
function handleDragLeave(e) {
|
|
1309
|
+
if (!e.currentTarget.contains(e.relatedTarget)) {
|
|
1310
|
+
setIsDragOver(false);
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
function handleDrop(e) {
|
|
1314
|
+
if (!onCardDrop) return;
|
|
1315
|
+
e.preventDefault();
|
|
1316
|
+
setIsDragOver(false);
|
|
1317
|
+
const cardId = e.dataTransfer.getData("text/plain");
|
|
1318
|
+
if (cardId) onCardDrop(cardId);
|
|
1319
|
+
}
|
|
1320
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
1161
1321
|
"div",
|
|
1162
1322
|
{
|
|
1163
1323
|
className: cn(
|
|
@@ -1171,15 +1331,15 @@ function KanbanColumn({
|
|
|
1171
1331
|
}),
|
|
1172
1332
|
"data-slot": "kanban-column",
|
|
1173
1333
|
children: [
|
|
1174
|
-
/* @__PURE__ */ (0,
|
|
1175
|
-
/* @__PURE__ */ (0,
|
|
1176
|
-
/* @__PURE__ */ (0,
|
|
1177
|
-
/* @__PURE__ */ (0,
|
|
1334
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex flex-col gap-2 border-b border-border bg-background px-3 py-3", children: [
|
|
1335
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
|
|
1336
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("h2", { className: "text-sm font-semibold text-foreground", children: [
|
|
1337
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-muted-foreground", children: stage.count }),
|
|
1178
1338
|
" ",
|
|
1179
1339
|
stage.name
|
|
1180
1340
|
] }),
|
|
1181
|
-
hasMenu && /* @__PURE__ */ (0,
|
|
1182
|
-
/* @__PURE__ */ (0,
|
|
1341
|
+
hasMenu && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(DropdownMenu, { children: [
|
|
1342
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1183
1343
|
DropdownMenuTrigger,
|
|
1184
1344
|
{
|
|
1185
1345
|
className: cn(
|
|
@@ -1187,14 +1347,14 @@ function KanbanColumn({
|
|
|
1187
1347
|
"-mr-1 size-7 shrink-0"
|
|
1188
1348
|
),
|
|
1189
1349
|
"aria-label": "Column actions",
|
|
1190
|
-
children: /* @__PURE__ */ (0,
|
|
1350
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_lucide_react7.MoreVertical, { className: "size-4" })
|
|
1191
1351
|
}
|
|
1192
1352
|
),
|
|
1193
|
-
/* @__PURE__ */ (0,
|
|
1194
|
-
onEditColumn && /* @__PURE__ */ (0,
|
|
1195
|
-
!isDefault && onDeleteColumn && /* @__PURE__ */ (0,
|
|
1196
|
-
onEditColumn && /* @__PURE__ */ (0,
|
|
1197
|
-
/* @__PURE__ */ (0,
|
|
1353
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(DropdownMenuContent, { align: "end", children: [
|
|
1354
|
+
onEditColumn && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DropdownMenuItem, { onClick: onEditColumn, children: "Edit column settings" }),
|
|
1355
|
+
!isDefault && onDeleteColumn && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
|
|
1356
|
+
onEditColumn && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DropdownMenuSeparator, {}),
|
|
1357
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1198
1358
|
DropdownMenuItem,
|
|
1199
1359
|
{
|
|
1200
1360
|
onClick: onDeleteColumn,
|
|
@@ -1206,8 +1366,8 @@ function KanbanColumn({
|
|
|
1206
1366
|
] })
|
|
1207
1367
|
] })
|
|
1208
1368
|
] }),
|
|
1209
|
-
/* @__PURE__ */ (0,
|
|
1210
|
-
stage.growth != null ? /* @__PURE__ */ (0,
|
|
1369
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
|
|
1370
|
+
stage.growth != null ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
1211
1371
|
Badge,
|
|
1212
1372
|
{
|
|
1213
1373
|
variant: "outline",
|
|
@@ -1217,63 +1377,81 @@ function KanbanColumn({
|
|
|
1217
1377
|
stage.growth
|
|
1218
1378
|
]
|
|
1219
1379
|
}
|
|
1220
|
-
) : /* @__PURE__ */ (0,
|
|
1221
|
-
/* @__PURE__ */ (0,
|
|
1380
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", {}),
|
|
1381
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-xs font-medium tabular-nums text-muted-foreground", children: formatTotalValue(stage.totalValue) })
|
|
1222
1382
|
] })
|
|
1223
1383
|
] }),
|
|
1224
|
-
/* @__PURE__ */ (0,
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
opportunities.map(
|
|
1231
|
-
(opp) => onSendLoanApplication ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1232
|
-
LeadCard,
|
|
1233
|
-
{
|
|
1234
|
-
id: opp.id,
|
|
1235
|
-
customerName: opp.customerName,
|
|
1236
|
-
customerPhone: opp.customerPhone,
|
|
1237
|
-
customerEmail: opp.customerEmail,
|
|
1238
|
-
loanApplicationUrl: opp.loanApplicationUrl,
|
|
1239
|
-
onSendLoanApplication: () => onSendLoanApplication(opp.id),
|
|
1240
|
-
onDelete: onDeleteOpportunity ? () => onDeleteOpportunity(opp.id) : void 0,
|
|
1241
|
-
isSubmitting: submittingOpportunityId === opp.id
|
|
1242
|
-
},
|
|
1243
|
-
opp.id
|
|
1244
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1245
|
-
OpportunityCard,
|
|
1246
|
-
__spreadProps(__spreadValues({}, opp), {
|
|
1247
|
-
onTaskToggle: onTaskToggle ? (taskId) => onTaskToggle(opp.id, taskId) : void 0,
|
|
1248
|
-
onMarkAsDone: onMarkAsDone ? () => onMarkAsDone(opp.id) : void 0,
|
|
1249
|
-
onMoveToNextStage: onMoveToNextStage ? () => onMoveToNextStage(opp.id) : void 0,
|
|
1250
|
-
onViewDetails: onViewDetails ? () => onViewDetails(opp.id) : void 0,
|
|
1251
|
-
onChangePriority: onChangePriority ? () => onChangePriority(opp.id) : void 0,
|
|
1252
|
-
onLaunchAssistant: onLaunchAssistant ? () => onLaunchAssistant(opp.id) : void 0,
|
|
1253
|
-
onPutOnHold: onPutOnHold ? () => onPutOnHold(opp.id) : void 0,
|
|
1254
|
-
onDelete: onDeleteOpportunity ? () => onDeleteOpportunity(opp.id) : void 0,
|
|
1255
|
-
isSubmitting: submittingOpportunityId === opp.id
|
|
1256
|
-
}),
|
|
1257
|
-
opp.id
|
|
1258
|
-
)
|
|
1384
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
1385
|
+
"div",
|
|
1386
|
+
{
|
|
1387
|
+
className: cn(
|
|
1388
|
+
"flex flex-1 flex-col gap-2 overflow-y-auto p-2",
|
|
1389
|
+
isDragOver && "ring-2 ring-primary ring-inset bg-primary/5"
|
|
1259
1390
|
),
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1391
|
+
onDragOver: handleDragOver,
|
|
1392
|
+
onDragLeave: handleDragLeave,
|
|
1393
|
+
onDrop: handleDrop,
|
|
1394
|
+
children: [
|
|
1395
|
+
(isDropTarget || isDragOver) && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "border border-dashed border-primary/40 bg-primary/5 px-3 py-2 text-center text-xs text-primary", children: [
|
|
1396
|
+
"Drop here \u2192 ",
|
|
1397
|
+
stage.name
|
|
1398
|
+
] }),
|
|
1399
|
+
isLoading ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "flex flex-1 items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Spinner, { className: "size-5 text-muted-foreground" }) }) : opportunities.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "flex flex-1 items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "text-xs text-muted-foreground", children: "No opportunities in this stage" }) }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
|
|
1400
|
+
opportunities.map(
|
|
1401
|
+
(opp) => onSendLoanApplication ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1402
|
+
LeadCard,
|
|
1403
|
+
{
|
|
1404
|
+
id: opp.id,
|
|
1405
|
+
customerName: opp.customerName,
|
|
1406
|
+
customerPhone: opp.customerPhone,
|
|
1407
|
+
customerEmail: opp.customerEmail,
|
|
1408
|
+
loanApplicationUrl: opp.loanApplicationUrl,
|
|
1409
|
+
onSendLoanApplication: () => onSendLoanApplication(opp.id),
|
|
1410
|
+
onDelete: onDeleteOpportunity ? () => onDeleteOpportunity(opp.id) : void 0,
|
|
1411
|
+
isSubmitting: submittingOpportunityId === opp.id
|
|
1412
|
+
},
|
|
1413
|
+
opp.id
|
|
1414
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1415
|
+
OpportunityCard,
|
|
1416
|
+
__spreadProps(__spreadValues({}, opp), {
|
|
1417
|
+
draggable: !!onCardDrop,
|
|
1418
|
+
onDragStart: onCardDrop ? (e) => {
|
|
1419
|
+
e.dataTransfer.setData("text/plain", opp.id);
|
|
1420
|
+
e.dataTransfer.effectAllowed = "move";
|
|
1421
|
+
} : void 0,
|
|
1422
|
+
onCardClick: onCardClick ? () => onCardClick(opp.id) : void 0,
|
|
1423
|
+
onTaskToggle: onTaskToggle ? (taskId) => onTaskToggle(opp.id, taskId) : void 0,
|
|
1424
|
+
onMarkAsDone: onMarkAsDone ? () => onMarkAsDone(opp.id) : void 0,
|
|
1425
|
+
onMoveToNextStage: onMoveToNextStage ? () => onMoveToNextStage(opp.id) : void 0,
|
|
1426
|
+
onViewDetails: onViewDetails ? () => onViewDetails(opp.id) : void 0,
|
|
1427
|
+
onChangePriority: onChangePriority ? () => onChangePriority(opp.id) : void 0,
|
|
1428
|
+
onLaunchAssistant: onLaunchAssistant ? () => onLaunchAssistant(opp.id) : void 0,
|
|
1429
|
+
onPutOnHold: onPutOnHold ? () => onPutOnHold(opp.id) : void 0,
|
|
1430
|
+
onDelete: onDeleteOpportunity ? () => onDeleteOpportunity(opp.id) : void 0,
|
|
1431
|
+
isSubmitting: submittingOpportunityId === opp.id
|
|
1432
|
+
}),
|
|
1433
|
+
opp.id
|
|
1434
|
+
)
|
|
1435
|
+
),
|
|
1436
|
+
hasMore && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1437
|
+
"div",
|
|
1438
|
+
{
|
|
1439
|
+
ref: loaderRef,
|
|
1440
|
+
className: "flex min-h-[50px] items-center justify-center",
|
|
1441
|
+
children: isLoadingMore && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Spinner, { className: "size-5 text-muted-foreground" })
|
|
1442
|
+
}
|
|
1443
|
+
)
|
|
1444
|
+
] })
|
|
1445
|
+
]
|
|
1446
|
+
}
|
|
1447
|
+
)
|
|
1270
1448
|
]
|
|
1271
1449
|
}
|
|
1272
1450
|
);
|
|
1273
1451
|
}
|
|
1274
1452
|
|
|
1275
1453
|
// src/components/ui/pipeline-board.tsx
|
|
1276
|
-
var
|
|
1454
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
1277
1455
|
function Toolbar({
|
|
1278
1456
|
searchValue,
|
|
1279
1457
|
onSearchChange,
|
|
@@ -1282,10 +1460,10 @@ function Toolbar({
|
|
|
1282
1460
|
onFilterChange,
|
|
1283
1461
|
onRefresh
|
|
1284
1462
|
}) {
|
|
1285
|
-
return /* @__PURE__ */ (0,
|
|
1286
|
-
/* @__PURE__ */ (0,
|
|
1287
|
-
/* @__PURE__ */ (0,
|
|
1288
|
-
/* @__PURE__ */ (0,
|
|
1463
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex flex-wrap items-center gap-3 border-b border-border bg-background px-4 py-3", children: [
|
|
1464
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "relative w-56 shrink-0", children: [
|
|
1465
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react8.Search, { className: "absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
|
|
1466
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1289
1467
|
Input,
|
|
1290
1468
|
{
|
|
1291
1469
|
placeholder: "Search opportunities\u2026",
|
|
@@ -1294,7 +1472,7 @@ function Toolbar({
|
|
|
1294
1472
|
className: "h-8 pl-8 text-sm"
|
|
1295
1473
|
}
|
|
1296
1474
|
),
|
|
1297
|
-
searchValue && /* @__PURE__ */ (0,
|
|
1475
|
+
searchValue && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1298
1476
|
Button,
|
|
1299
1477
|
{
|
|
1300
1478
|
type: "button",
|
|
@@ -1303,11 +1481,11 @@ function Toolbar({
|
|
|
1303
1481
|
onClick: () => onSearchChange(""),
|
|
1304
1482
|
className: "absolute right-2 top-1/2 size-6 -translate-y-1/2 text-muted-foreground hover:text-foreground",
|
|
1305
1483
|
"aria-label": "Clear search",
|
|
1306
|
-
children: /* @__PURE__ */ (0,
|
|
1484
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react8.X, { className: "size-3.5" })
|
|
1307
1485
|
}
|
|
1308
1486
|
)
|
|
1309
1487
|
] }),
|
|
1310
|
-
filterOptions.length > 0 && /* @__PURE__ */ (0,
|
|
1488
|
+
filterOptions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1311
1489
|
ToggleGroup,
|
|
1312
1490
|
{
|
|
1313
1491
|
type: "multiple",
|
|
@@ -1320,10 +1498,10 @@ function Toolbar({
|
|
|
1320
1498
|
const toggled = (_a = newValues.find((v) => !activeFilters.includes(v))) != null ? _a : activeFilters.find((v) => !newValues.includes(v));
|
|
1321
1499
|
if (toggled) onFilterChange(toggled);
|
|
1322
1500
|
},
|
|
1323
|
-
children: filterOptions.map((option) => /* @__PURE__ */ (0,
|
|
1501
|
+
children: filterOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ToggleGroupItem, { value: option, children: option }, option))
|
|
1324
1502
|
}
|
|
1325
1503
|
),
|
|
1326
|
-
onRefresh && /* @__PURE__ */ (0,
|
|
1504
|
+
onRefresh && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1327
1505
|
Button,
|
|
1328
1506
|
{
|
|
1329
1507
|
type: "button",
|
|
@@ -1332,7 +1510,7 @@ function Toolbar({
|
|
|
1332
1510
|
onClick: onRefresh,
|
|
1333
1511
|
className: "ml-auto text-muted-foreground hover:text-foreground",
|
|
1334
1512
|
"aria-label": "Refresh board",
|
|
1335
|
-
children: /* @__PURE__ */ (0,
|
|
1513
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react8.RefreshCw, { className: "size-4" })
|
|
1336
1514
|
}
|
|
1337
1515
|
)
|
|
1338
1516
|
] });
|
|
@@ -1347,6 +1525,8 @@ function PipelineBoard({
|
|
|
1347
1525
|
onRefresh,
|
|
1348
1526
|
onEditColumn,
|
|
1349
1527
|
onDeleteColumn,
|
|
1528
|
+
onMoveCard,
|
|
1529
|
+
onCardClick,
|
|
1350
1530
|
onTaskToggle,
|
|
1351
1531
|
onMarkAsDone,
|
|
1352
1532
|
onMoveToNextStage,
|
|
@@ -1359,13 +1539,13 @@ function PipelineBoard({
|
|
|
1359
1539
|
className
|
|
1360
1540
|
}) {
|
|
1361
1541
|
const hasToolbar = onSearchChange || filterOptions.length > 0 && onFilterChange;
|
|
1362
|
-
return /* @__PURE__ */ (0,
|
|
1542
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
1363
1543
|
"div",
|
|
1364
1544
|
{
|
|
1365
1545
|
className: cn("flex h-full flex-col bg-muted/20", className),
|
|
1366
1546
|
"data-slot": "pipeline-board",
|
|
1367
1547
|
children: [
|
|
1368
|
-
hasToolbar && /* @__PURE__ */ (0,
|
|
1548
|
+
hasToolbar && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1369
1549
|
Toolbar,
|
|
1370
1550
|
{
|
|
1371
1551
|
searchValue,
|
|
@@ -1378,8 +1558,8 @@ function PipelineBoard({
|
|
|
1378
1558
|
onRefresh
|
|
1379
1559
|
}
|
|
1380
1560
|
),
|
|
1381
|
-
/* @__PURE__ */ (0,
|
|
1382
|
-
columns.map((col) => /* @__PURE__ */ (0,
|
|
1561
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex flex-1 gap-3 overflow-x-auto p-4", children: [
|
|
1562
|
+
columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1383
1563
|
KanbanColumn,
|
|
1384
1564
|
{
|
|
1385
1565
|
stage: col.stage,
|
|
@@ -1393,6 +1573,8 @@ function PipelineBoard({
|
|
|
1393
1573
|
loaderRef: col.loaderRef,
|
|
1394
1574
|
onEditColumn: onEditColumn ? () => onEditColumn(col.stage.id) : void 0,
|
|
1395
1575
|
onDeleteColumn: onDeleteColumn && !col.isDefault ? () => onDeleteColumn(col.stage.id) : void 0,
|
|
1576
|
+
onCardDrop: onMoveCard ? (cardId) => onMoveCard(cardId, col.key) : void 0,
|
|
1577
|
+
onCardClick,
|
|
1396
1578
|
onTaskToggle,
|
|
1397
1579
|
onMarkAsDone,
|
|
1398
1580
|
onMoveToNextStage,
|
|
@@ -1406,7 +1588,7 @@ function PipelineBoard({
|
|
|
1406
1588
|
},
|
|
1407
1589
|
col.key
|
|
1408
1590
|
)),
|
|
1409
|
-
columns.length === 0 && /* @__PURE__ */ (0,
|
|
1591
|
+
columns.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "flex flex-1 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-sm text-muted-foreground", children: "No columns to display." }) })
|
|
1410
1592
|
] })
|
|
1411
1593
|
]
|
|
1412
1594
|
}
|