@wealthx/shadcn 1.4.1 → 1.5.1
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 +356 -176
- package/CHANGELOG.md +12 -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 +367 -3
- 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,615 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
CalendarIcon,
|
|
4
|
+
InfoIcon,
|
|
5
|
+
MailIcon,
|
|
6
|
+
PhoneIcon,
|
|
7
|
+
PlusIcon,
|
|
8
|
+
} from "lucide-react";
|
|
9
|
+
import { Button } from "./button";
|
|
10
|
+
import { Checkbox } from "./checkbox";
|
|
11
|
+
import { ColorPicker } from "./color-picker";
|
|
12
|
+
import { Field, FieldError, FieldLabel } from "./field";
|
|
13
|
+
import { Input } from "./input";
|
|
14
|
+
import { Separator } from "./separator";
|
|
15
|
+
import {
|
|
16
|
+
Select,
|
|
17
|
+
SelectContent,
|
|
18
|
+
SelectItem,
|
|
19
|
+
SelectTrigger,
|
|
20
|
+
SelectValue,
|
|
21
|
+
} from "./select";
|
|
22
|
+
import {
|
|
23
|
+
Tooltip,
|
|
24
|
+
TooltipContent,
|
|
25
|
+
TooltipProvider,
|
|
26
|
+
TooltipTrigger,
|
|
27
|
+
} from "./tooltip";
|
|
28
|
+
import { UploadCard } from "./upload-card";
|
|
29
|
+
import {
|
|
30
|
+
FormField,
|
|
31
|
+
PasswordField,
|
|
32
|
+
SectionHeading,
|
|
33
|
+
StaffMember,
|
|
34
|
+
StaffRowItem,
|
|
35
|
+
} from "./signup-form-primitives";
|
|
36
|
+
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Pricing constants (WealthX Professional Plan)
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
const BASE_PLAN_PRICE = 299;
|
|
42
|
+
|
|
43
|
+
const ROLE_INFO: Record<string, string> = {
|
|
44
|
+
Admin: "Admin seats have full access to manage the platform.",
|
|
45
|
+
Broker: "Broker seats can manage client portfolios.",
|
|
46
|
+
Support: "Support seats handle client inquiries and tickets.",
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const ROLE_SUBTITLE: Record<string, string> = {
|
|
50
|
+
Admin: "$89/month/company (first seat included)",
|
|
51
|
+
Broker: "$89/month/company",
|
|
52
|
+
Support: "$0/month/company",
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Step 1 — Personal Details
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
export interface PersonalDetailsStepProps {
|
|
60
|
+
onValidChange?: (valid: boolean) => void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function PersonalDetailsStep({
|
|
64
|
+
onValidChange,
|
|
65
|
+
}: PersonalDetailsStepProps) {
|
|
66
|
+
const [firstName, setFirstName] = useState("");
|
|
67
|
+
const [lastName, setLastName] = useState("");
|
|
68
|
+
const [email, setEmail] = useState("");
|
|
69
|
+
const [emailError, setEmailError] = useState("");
|
|
70
|
+
const [emailTouched, setEmailTouched] = useState(false);
|
|
71
|
+
const [passwordValue, setPasswordValue] = useState("");
|
|
72
|
+
const [confirmValue, setConfirmValue] = useState("");
|
|
73
|
+
const [termsAccepted, setTermsAccepted] = useState(false);
|
|
74
|
+
|
|
75
|
+
const validateEmail = (v: string) => {
|
|
76
|
+
if (v.length > 0 && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v))
|
|
77
|
+
return "Please enter a valid email address";
|
|
78
|
+
return "";
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const passwordRules = (v: string) =>
|
|
82
|
+
v.length >= 8 &&
|
|
83
|
+
/[A-Z]/.test(v) &&
|
|
84
|
+
/[a-z]/.test(v) &&
|
|
85
|
+
/[0-9]/.test(v) &&
|
|
86
|
+
/[^A-Za-z0-9]/.test(v);
|
|
87
|
+
|
|
88
|
+
const emailValid = email.length > 0 && validateEmail(email) === "";
|
|
89
|
+
const passwordValid = passwordRules(passwordValue);
|
|
90
|
+
const confirmPasswordValid =
|
|
91
|
+
confirmValue.length > 0 && confirmValue === passwordValue;
|
|
92
|
+
|
|
93
|
+
React.useEffect(() => {
|
|
94
|
+
onValidChange?.(
|
|
95
|
+
firstName.trim().length > 0 &&
|
|
96
|
+
lastName.trim().length > 0 &&
|
|
97
|
+
emailValid &&
|
|
98
|
+
passwordValid &&
|
|
99
|
+
confirmPasswordValid &&
|
|
100
|
+
termsAccepted,
|
|
101
|
+
);
|
|
102
|
+
}, [
|
|
103
|
+
firstName,
|
|
104
|
+
lastName,
|
|
105
|
+
emailValid,
|
|
106
|
+
passwordValid,
|
|
107
|
+
confirmPasswordValid,
|
|
108
|
+
termsAccepted,
|
|
109
|
+
onValidChange,
|
|
110
|
+
]);
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<div className="flex flex-col gap-1">
|
|
114
|
+
<div className="flex gap-4">
|
|
115
|
+
<Field>
|
|
116
|
+
<FieldLabel>
|
|
117
|
+
First Name<span className="text-destructive ml-0.5">*</span>
|
|
118
|
+
</FieldLabel>
|
|
119
|
+
<Input
|
|
120
|
+
placeholder="First Name"
|
|
121
|
+
value={firstName}
|
|
122
|
+
onChange={(e) => setFirstName(e.target.value)}
|
|
123
|
+
/>
|
|
124
|
+
<div className="min-h-5" />
|
|
125
|
+
</Field>
|
|
126
|
+
<Field>
|
|
127
|
+
<FieldLabel>
|
|
128
|
+
Last Name<span className="text-destructive ml-0.5">*</span>
|
|
129
|
+
</FieldLabel>
|
|
130
|
+
<Input
|
|
131
|
+
placeholder="Last Name"
|
|
132
|
+
value={lastName}
|
|
133
|
+
onChange={(e) => setLastName(e.target.value)}
|
|
134
|
+
/>
|
|
135
|
+
<div className="min-h-5" />
|
|
136
|
+
</Field>
|
|
137
|
+
</div>
|
|
138
|
+
<Field>
|
|
139
|
+
<FieldLabel>
|
|
140
|
+
Email Address<span className="text-destructive ml-0.5">*</span>
|
|
141
|
+
</FieldLabel>
|
|
142
|
+
<Input
|
|
143
|
+
type="email"
|
|
144
|
+
placeholder="Email Address"
|
|
145
|
+
value={email}
|
|
146
|
+
onChange={(e) => {
|
|
147
|
+
setEmail(e.target.value);
|
|
148
|
+
if (emailTouched) setEmailError(validateEmail(e.target.value));
|
|
149
|
+
}}
|
|
150
|
+
onBlur={() => {
|
|
151
|
+
setEmailTouched(true);
|
|
152
|
+
setEmailError(validateEmail(email));
|
|
153
|
+
}}
|
|
154
|
+
/>
|
|
155
|
+
<div className="min-h-5">
|
|
156
|
+
{emailTouched && emailError && <FieldError>{emailError}</FieldError>}
|
|
157
|
+
</div>
|
|
158
|
+
</Field>
|
|
159
|
+
<PasswordField
|
|
160
|
+
label="Set Your Password"
|
|
161
|
+
placeholder="Password"
|
|
162
|
+
required
|
|
163
|
+
showStrengthPopover
|
|
164
|
+
onValueChange={setPasswordValue}
|
|
165
|
+
/>
|
|
166
|
+
<PasswordField
|
|
167
|
+
label="Confirm Password"
|
|
168
|
+
placeholder="Confirm Your Password"
|
|
169
|
+
required
|
|
170
|
+
onValueChange={setConfirmValue}
|
|
171
|
+
/>
|
|
172
|
+
<Field>
|
|
173
|
+
<FieldLabel>Phone Number</FieldLabel>
|
|
174
|
+
<Input placeholder="Phone Number" />
|
|
175
|
+
<div className="min-h-5" />
|
|
176
|
+
</Field>
|
|
177
|
+
<div className="flex items-start gap-3">
|
|
178
|
+
<Checkbox
|
|
179
|
+
id="terms"
|
|
180
|
+
checked={termsAccepted}
|
|
181
|
+
onCheckedChange={(v) => setTermsAccepted(!!v)}
|
|
182
|
+
/>
|
|
183
|
+
<label
|
|
184
|
+
htmlFor="terms"
|
|
185
|
+
className="text-sm text-muted-foreground leading-relaxed cursor-pointer select-none"
|
|
186
|
+
>
|
|
187
|
+
I agree to the{" "}
|
|
188
|
+
<span className="text-foreground underline">
|
|
189
|
+
Terms and Conditions
|
|
190
|
+
</span>{" "}
|
|
191
|
+
and <span className="text-foreground underline">Privacy Policy</span>
|
|
192
|
+
</label>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// Step 2 — Company Info
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
|
|
202
|
+
export function CompanyInfoStep() {
|
|
203
|
+
return (
|
|
204
|
+
<div className="flex flex-col gap-4">
|
|
205
|
+
<SectionHeading>Company Details</SectionHeading>
|
|
206
|
+
<FormField label="Business Name" required>
|
|
207
|
+
<Input placeholder="Business Name" />
|
|
208
|
+
</FormField>
|
|
209
|
+
<FormField label="ABN (Australian Business Number)" required>
|
|
210
|
+
<Input placeholder="Input ABN" />
|
|
211
|
+
</FormField>
|
|
212
|
+
<FormField label="Australian Credit License Number" required>
|
|
213
|
+
<Input placeholder="Input License Number" />
|
|
214
|
+
</FormField>
|
|
215
|
+
<FormField label="Customer Support Email" required>
|
|
216
|
+
<Input type="email" placeholder="Customer Support Email" />
|
|
217
|
+
</FormField>
|
|
218
|
+
<FormField label="Main Business Phone Number" required>
|
|
219
|
+
<Input placeholder="Main Business Phone Number" />
|
|
220
|
+
</FormField>
|
|
221
|
+
<FormField label="Domain" required>
|
|
222
|
+
<Input placeholder="Input Domain" />
|
|
223
|
+
</FormField>
|
|
224
|
+
<SectionHeading>
|
|
225
|
+
Connective Details{" "}
|
|
226
|
+
<span className="text-muted-foreground font-normal">
|
|
227
|
+
(connective brokers only)
|
|
228
|
+
</span>
|
|
229
|
+
</SectionHeading>
|
|
230
|
+
<FormField label="CA Number">
|
|
231
|
+
<Input placeholder="CA Number" />
|
|
232
|
+
</FormField>
|
|
233
|
+
<FormField label="Company ID">
|
|
234
|
+
<Input placeholder="Company ID" />
|
|
235
|
+
</FormField>
|
|
236
|
+
<FormField label="API Key">
|
|
237
|
+
<Input placeholder="API Key" />
|
|
238
|
+
</FormField>
|
|
239
|
+
<FormField label="API Token">
|
|
240
|
+
<Input placeholder="API Token" />
|
|
241
|
+
</FormField>
|
|
242
|
+
</div>
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// Step 3 — Branding Info
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
|
|
250
|
+
export function BrandingInfoStep() {
|
|
251
|
+
const [primaryColor, setPrimaryColor] = useState("#131C24");
|
|
252
|
+
const [secondaryColor, setSecondaryColor] = useState("#00E599");
|
|
253
|
+
const [calendarType, setCalendarType] = useState("Calendly");
|
|
254
|
+
|
|
255
|
+
return (
|
|
256
|
+
<div className="flex flex-col gap-6">
|
|
257
|
+
<div className="flex flex-col gap-4">
|
|
258
|
+
<SectionHeading>Admin Advisor Content</SectionHeading>
|
|
259
|
+
<FormField label="Calendar URL">
|
|
260
|
+
<div className="flex gap-2">
|
|
261
|
+
<Select
|
|
262
|
+
value={calendarType}
|
|
263
|
+
onValueChange={(v) => setCalendarType(v as string)}
|
|
264
|
+
>
|
|
265
|
+
<SelectTrigger className="w-[140px] shrink-0">
|
|
266
|
+
<SelectValue />
|
|
267
|
+
</SelectTrigger>
|
|
268
|
+
<SelectContent>
|
|
269
|
+
<SelectItem value="Calendly">Calendly</SelectItem>
|
|
270
|
+
<SelectItem value="Gmail">Gmail Calendar</SelectItem>
|
|
271
|
+
<SelectItem value="Outlook">Outlook Calendar</SelectItem>
|
|
272
|
+
</SelectContent>
|
|
273
|
+
</Select>
|
|
274
|
+
<Input placeholder="Paste calendar URL" className="flex-1" />
|
|
275
|
+
</div>
|
|
276
|
+
</FormField>
|
|
277
|
+
<FormField label="Video URL (Youtube, Vimeo, Wistia)">
|
|
278
|
+
<Input placeholder="Input Video URL" />
|
|
279
|
+
</FormField>
|
|
280
|
+
<Field>
|
|
281
|
+
<FieldLabel>Upload professional photo (800x450)</FieldLabel>
|
|
282
|
+
<UploadCard
|
|
283
|
+
size="sm"
|
|
284
|
+
label="Upload image"
|
|
285
|
+
description="PNG, JPG · 800×450px"
|
|
286
|
+
/>
|
|
287
|
+
</Field>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
<div className="flex flex-col gap-4">
|
|
291
|
+
<SectionHeading>Company Branding</SectionHeading>
|
|
292
|
+
<Field>
|
|
293
|
+
<FieldLabel>Color Code Primary</FieldLabel>
|
|
294
|
+
<ColorPicker value={primaryColor} onChange={setPrimaryColor} />
|
|
295
|
+
</Field>
|
|
296
|
+
<Field>
|
|
297
|
+
<FieldLabel>Color Code Secondary</FieldLabel>
|
|
298
|
+
<ColorPicker value={secondaryColor} onChange={setSecondaryColor} />
|
|
299
|
+
</Field>
|
|
300
|
+
<div className="grid grid-cols-2 gap-4">
|
|
301
|
+
<Field>
|
|
302
|
+
<FieldLabel>Primary Symbol Logo (50x50)</FieldLabel>
|
|
303
|
+
<UploadCard
|
|
304
|
+
size="sm"
|
|
305
|
+
label="Upload image"
|
|
306
|
+
description="PNG, JPG · 50×50px"
|
|
307
|
+
/>
|
|
308
|
+
</Field>
|
|
309
|
+
<Field>
|
|
310
|
+
<FieldLabel>Symbol Logo in White (50x50)</FieldLabel>
|
|
311
|
+
<UploadCard
|
|
312
|
+
size="sm"
|
|
313
|
+
label="Upload image"
|
|
314
|
+
description="PNG, JPG · 50×50px"
|
|
315
|
+
/>
|
|
316
|
+
</Field>
|
|
317
|
+
</div>
|
|
318
|
+
<div className="grid grid-cols-2 gap-4">
|
|
319
|
+
<Field>
|
|
320
|
+
<FieldLabel>Primary Business Logo (150x100)</FieldLabel>
|
|
321
|
+
<UploadCard
|
|
322
|
+
size="sm"
|
|
323
|
+
label="Upload image"
|
|
324
|
+
description="PNG, JPG · 150×100px"
|
|
325
|
+
/>
|
|
326
|
+
</Field>
|
|
327
|
+
<Field>
|
|
328
|
+
<FieldLabel>Primary Business Logo in White (150x100)</FieldLabel>
|
|
329
|
+
<UploadCard
|
|
330
|
+
size="sm"
|
|
331
|
+
label="Upload image"
|
|
332
|
+
description="PNG, JPG · 150×100px"
|
|
333
|
+
/>
|
|
334
|
+
</Field>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// ---------------------------------------------------------------------------
|
|
342
|
+
// Step 4a — Invite Staff
|
|
343
|
+
// ---------------------------------------------------------------------------
|
|
344
|
+
|
|
345
|
+
export interface InviteStaffViewProps {
|
|
346
|
+
onNext: () => void;
|
|
347
|
+
onPrev: () => void;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export function InviteStaffView({
|
|
351
|
+
onNext: _onNext,
|
|
352
|
+
onPrev: _onPrev,
|
|
353
|
+
}: InviteStaffViewProps) {
|
|
354
|
+
const [staffList, setStaffList] = useState<StaffMember[]>([
|
|
355
|
+
{ id: "1", email: "", role: "" },
|
|
356
|
+
]);
|
|
357
|
+
|
|
358
|
+
const addStaff = () =>
|
|
359
|
+
setStaffList((p) => [
|
|
360
|
+
...p,
|
|
361
|
+
{ id: crypto.randomUUID(), email: "", role: "" },
|
|
362
|
+
]);
|
|
363
|
+
const removeStaff = (id: string) =>
|
|
364
|
+
setStaffList((p) => p.filter((m) => m.id !== id));
|
|
365
|
+
const changeStaff = (id: string, field: "email" | "role", value: string) =>
|
|
366
|
+
setStaffList((p) =>
|
|
367
|
+
p.map((m) => (m.id === id ? { ...m, [field]: value } : m)),
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
return (
|
|
371
|
+
<div className="flex flex-col gap-6">
|
|
372
|
+
<div className="flex flex-col gap-4">
|
|
373
|
+
<SectionHeading>Invite Staff Members</SectionHeading>
|
|
374
|
+
<div className="flex flex-col gap-3 border border-border p-6">
|
|
375
|
+
<div className="flex items-center gap-3 w-full">
|
|
376
|
+
<span className="flex-1 text-sm font-medium text-foreground">
|
|
377
|
+
Email
|
|
378
|
+
</span>
|
|
379
|
+
<span className="w-[140px] shrink-0 text-sm font-medium text-foreground">
|
|
380
|
+
Role
|
|
381
|
+
</span>
|
|
382
|
+
<span className="size-8 shrink-0" />
|
|
383
|
+
</div>
|
|
384
|
+
{staffList.map((m) => (
|
|
385
|
+
<StaffRowItem
|
|
386
|
+
key={m.id}
|
|
387
|
+
member={m}
|
|
388
|
+
onRemove={removeStaff}
|
|
389
|
+
onChange={changeStaff}
|
|
390
|
+
showRemove={staffList.length > 1}
|
|
391
|
+
/>
|
|
392
|
+
))}
|
|
393
|
+
<Button variant="outline" onClick={addStaff} className="w-full">
|
|
394
|
+
<PlusIcon className="size-4" />
|
|
395
|
+
Add Staff
|
|
396
|
+
</Button>
|
|
397
|
+
</div>
|
|
398
|
+
</div>
|
|
399
|
+
|
|
400
|
+
<div className="flex flex-col gap-4">
|
|
401
|
+
<SectionHeading>Or Bulk Upload</SectionHeading>
|
|
402
|
+
<UploadCard
|
|
403
|
+
size="lg"
|
|
404
|
+
accept=".csv"
|
|
405
|
+
label="Drop files here"
|
|
406
|
+
description="Or browse files from your computer"
|
|
407
|
+
/>
|
|
408
|
+
<p className="text-sm text-muted-foreground text-center">
|
|
409
|
+
Ensure your CSV file includes columns for:
|
|
410
|
+
<br />
|
|
411
|
+
No., First Name, Last Name, Email, Phone (Optional) and Staff Role.
|
|
412
|
+
</p>
|
|
413
|
+
<div className="flex justify-center gap-1 text-sm text-muted-foreground">
|
|
414
|
+
Or you can download the{" "}
|
|
415
|
+
<Button variant="link" className="h-auto p-0">
|
|
416
|
+
Template file
|
|
417
|
+
</Button>
|
|
418
|
+
</div>
|
|
419
|
+
</div>
|
|
420
|
+
</div>
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// ---------------------------------------------------------------------------
|
|
425
|
+
// Step 4b — Payment / Seat Selection
|
|
426
|
+
// ---------------------------------------------------------------------------
|
|
427
|
+
|
|
428
|
+
export interface PaymentViewProps {
|
|
429
|
+
onNext: () => void;
|
|
430
|
+
onPrev: () => void;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
export function PaymentView({
|
|
434
|
+
onNext: _onNext,
|
|
435
|
+
onPrev: _onPrev,
|
|
436
|
+
}: PaymentViewProps) {
|
|
437
|
+
const [seats, setSeats] = useState({ Admin: 1, Broker: 0, Support: 0 });
|
|
438
|
+
const additionalCost = Math.max(0, seats.Admin - 1) * 89 + seats.Broker * 89;
|
|
439
|
+
const total = BASE_PLAN_PRICE + additionalCost;
|
|
440
|
+
|
|
441
|
+
return (
|
|
442
|
+
<div className="flex flex-col gap-6">
|
|
443
|
+
<div className="border border-border px-6 py-8 flex flex-col gap-4">
|
|
444
|
+
<div className="flex items-start justify-between">
|
|
445
|
+
<div>
|
|
446
|
+
<p className="font-bold text-lg">Professional Plan</p>
|
|
447
|
+
<p className="text-muted-foreground text-sm">included 1 Broker</p>
|
|
448
|
+
</div>
|
|
449
|
+
<div className="text-right">
|
|
450
|
+
<p className="font-bold text-lg">
|
|
451
|
+
${BASE_PLAN_PRICE}/month/company
|
|
452
|
+
</p>
|
|
453
|
+
<p className="text-muted-foreground text-sm">
|
|
454
|
+
Billed monthly. Cancel anytime.
|
|
455
|
+
</p>
|
|
456
|
+
</div>
|
|
457
|
+
</div>
|
|
458
|
+
|
|
459
|
+
<Separator />
|
|
460
|
+
|
|
461
|
+
<p className="font-semibold text-base">Total Staff seats</p>
|
|
462
|
+
<TooltipProvider>
|
|
463
|
+
{(["Admin", "Broker", "Support"] as const).map((role) => (
|
|
464
|
+
<div key={role} className="flex items-start justify-between">
|
|
465
|
+
<div className="flex flex-col gap-1">
|
|
466
|
+
<div className="flex items-center gap-2">
|
|
467
|
+
<span className="text-base w-[60px]">{role}</span>
|
|
468
|
+
<Tooltip>
|
|
469
|
+
<TooltipTrigger>
|
|
470
|
+
<Button variant="ghost" size="icon-sm" aria-label="Info">
|
|
471
|
+
<InfoIcon className="size-4" />
|
|
472
|
+
</Button>
|
|
473
|
+
</TooltipTrigger>
|
|
474
|
+
<TooltipContent side="top">
|
|
475
|
+
{ROLE_INFO[role]}
|
|
476
|
+
</TooltipContent>
|
|
477
|
+
</Tooltip>
|
|
478
|
+
</div>
|
|
479
|
+
<p className="text-xs text-muted-foreground">
|
|
480
|
+
{ROLE_SUBTITLE[role]}
|
|
481
|
+
</p>
|
|
482
|
+
</div>
|
|
483
|
+
<Input
|
|
484
|
+
type="number"
|
|
485
|
+
value={seats[role]}
|
|
486
|
+
onChange={(e) =>
|
|
487
|
+
setSeats((s) => ({
|
|
488
|
+
...s,
|
|
489
|
+
[role]: Math.max(0, Number(e.target.value)),
|
|
490
|
+
}))
|
|
491
|
+
}
|
|
492
|
+
aria-label={`${role} seats`}
|
|
493
|
+
className="w-[76px] text-center"
|
|
494
|
+
/>
|
|
495
|
+
</div>
|
|
496
|
+
))}
|
|
497
|
+
</TooltipProvider>
|
|
498
|
+
|
|
499
|
+
<p className="text-sm text-muted-foreground">
|
|
500
|
+
You can add or remove seats anytime. Changes are billed monthly.
|
|
501
|
+
</p>
|
|
502
|
+
|
|
503
|
+
<Separator />
|
|
504
|
+
|
|
505
|
+
<TooltipProvider>
|
|
506
|
+
<Tooltip>
|
|
507
|
+
<TooltipTrigger>
|
|
508
|
+
<div className="flex items-center justify-between">
|
|
509
|
+
<p className="font-semibold text-lg">Total (Est.)</p>
|
|
510
|
+
<p className="font-semibold text-lg">${total}</p>
|
|
511
|
+
</div>
|
|
512
|
+
</TooltipTrigger>
|
|
513
|
+
<TooltipContent side="top">
|
|
514
|
+
This is an estimated amount. You will be charged at the end of the
|
|
515
|
+
billing period.
|
|
516
|
+
</TooltipContent>
|
|
517
|
+
</Tooltip>
|
|
518
|
+
</TooltipProvider>
|
|
519
|
+
</div>
|
|
520
|
+
</div>
|
|
521
|
+
);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// ---------------------------------------------------------------------------
|
|
525
|
+
// Step 4c — Stripe / Card Details
|
|
526
|
+
// ---------------------------------------------------------------------------
|
|
527
|
+
|
|
528
|
+
export interface StripeViewProps {
|
|
529
|
+
onPrev: () => void;
|
|
530
|
+
onComplete: () => void;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export function StripeView({
|
|
534
|
+
onPrev: _onPrev,
|
|
535
|
+
onComplete: _onComplete,
|
|
536
|
+
}: StripeViewProps) {
|
|
537
|
+
return (
|
|
538
|
+
<div className="flex flex-col gap-6">
|
|
539
|
+
<div className="border border-border p-6 flex flex-col gap-4">
|
|
540
|
+
<p className="font-semibold text-base text-foreground">
|
|
541
|
+
Payment Details
|
|
542
|
+
</p>
|
|
543
|
+
<Field>
|
|
544
|
+
<FieldLabel>Card Number</FieldLabel>
|
|
545
|
+
<div className="flex h-9 w-full border border-input bg-muted/30 px-3 py-2 text-sm text-muted-foreground items-center">
|
|
546
|
+
•••• •••• •••• 4242
|
|
547
|
+
</div>
|
|
548
|
+
</Field>
|
|
549
|
+
<div className="flex gap-4">
|
|
550
|
+
<Field className="flex-1">
|
|
551
|
+
<FieldLabel>Expiry</FieldLabel>
|
|
552
|
+
<div className="flex h-9 w-full border border-input bg-muted/30 px-3 py-2 text-sm text-muted-foreground items-center">
|
|
553
|
+
MM / YY
|
|
554
|
+
</div>
|
|
555
|
+
</Field>
|
|
556
|
+
<Field className="flex-1">
|
|
557
|
+
<FieldLabel>CVC</FieldLabel>
|
|
558
|
+
<div className="flex h-9 w-full border border-input bg-muted/30 px-3 py-2 text-sm text-muted-foreground items-center">
|
|
559
|
+
•••
|
|
560
|
+
</div>
|
|
561
|
+
</Field>
|
|
562
|
+
</div>
|
|
563
|
+
<p className="text-xs text-muted-foreground">
|
|
564
|
+
Powered by Stripe. Your payment information is encrypted and secure.
|
|
565
|
+
</p>
|
|
566
|
+
</div>
|
|
567
|
+
</div>
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// ---------------------------------------------------------------------------
|
|
572
|
+
// Success screen
|
|
573
|
+
// ---------------------------------------------------------------------------
|
|
574
|
+
|
|
575
|
+
export function BackofficeSuccessStep() {
|
|
576
|
+
return (
|
|
577
|
+
<div className="flex flex-col items-center justify-center min-h-full py-16 gap-6 text-center px-4">
|
|
578
|
+
<div className="size-16 bg-success/10 flex items-center justify-center">
|
|
579
|
+
<svg
|
|
580
|
+
viewBox="0 0 24 24"
|
|
581
|
+
className="size-8 text-success"
|
|
582
|
+
fill="none"
|
|
583
|
+
stroke="currentColor"
|
|
584
|
+
strokeWidth={2}
|
|
585
|
+
>
|
|
586
|
+
<polyline points="20 6 9 17 4 12" />
|
|
587
|
+
</svg>
|
|
588
|
+
</div>
|
|
589
|
+
<div className="flex flex-col gap-2">
|
|
590
|
+
<h2 className="text-2xl font-bold text-foreground">You're all set!</h2>
|
|
591
|
+
<p className="text-muted-foreground max-w-[400px]">
|
|
592
|
+
You will receive an email on next steps and we will contact you for
|
|
593
|
+
final approval.
|
|
594
|
+
</p>
|
|
595
|
+
</div>
|
|
596
|
+
<div className="border border-border p-6 flex flex-col gap-4 text-left w-full max-w-[400px]">
|
|
597
|
+
<p className="font-semibold text-base text-foreground">
|
|
598
|
+
Contact us anytime if you have any concerns.
|
|
599
|
+
</p>
|
|
600
|
+
<div className="flex items-center gap-2.5">
|
|
601
|
+
<PhoneIcon className="size-5 text-success shrink-0" />
|
|
602
|
+
<span className="text-base text-foreground">0416 338 438</span>
|
|
603
|
+
</div>
|
|
604
|
+
<div className="flex items-center gap-2.5">
|
|
605
|
+
<CalendarIcon className="size-5 text-success shrink-0" />
|
|
606
|
+
<span className="text-base text-foreground">Book call back</span>
|
|
607
|
+
</div>
|
|
608
|
+
<div className="flex items-center gap-2.5">
|
|
609
|
+
<MailIcon className="size-5 text-success shrink-0" />
|
|
610
|
+
<span className="text-base text-foreground">clint@wealthx.au</span>
|
|
611
|
+
</div>
|
|
612
|
+
</div>
|
|
613
|
+
</div>
|
|
614
|
+
);
|
|
615
|
+
}
|