/** * Copyright since 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // Loan Origination-specific styling layered on top of ../cashier/cashier-shared.scss (pg-*, // cctr-*) and ../npa/npa-shared.scss (npa-timeline-* — reused as-is for the application's stage // history/audit trail, since it's the same generic "date-led event log" primitive already built // for the NPA Recovery Journey popup, not NPA-specific). // EMI Repayment Schedule can run to 240 rows (a 20-year Housing Loan) — scrolls within a fixed // height with the header pinned, rather than pushing the rest of the page far down. .loan-emi-table-scroll { max-height: 420px; overflow-y: auto; thead th { position: sticky; top: 0; z-index: 1; background: #fff; } } .loan-badge { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: 999px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; white-space: nowrap; &--progress { background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; } &--hold { background: #fffbeb; color: #b45309; border: 1px solid #fde68a; } &--rejected { background: #fef2f2; color: #dc2626; border: 1px solid #fecaca; } &--disbursed { background: #f0fdf4; color: #15803d; border: 1px solid #bbf7d0; } &--verified { background: #f0fdf4; color: #15803d; border: 1px solid #bbf7d0; } &--missing { background: #fffbeb; color: #b45309; border: 1px solid #fde68a; } } .pg-btn--success { background: linear-gradient(135deg, #22c55e, #15803d); color: #fff; &:disabled { opacity: 0.45; cursor: not-allowed; } } .pg-btn--danger { background: #fff; border-color: #fecaca; color: #dc2626; &:hover { background: #fef2f2; } &:disabled { opacity: 0.45; cursor: not-allowed; } } .pg-btn--warn { background: #fff; border-color: #fde68a; color: #b45309; &:hover { background: #fffbeb; } } // --------------------------------------------------------------------------- // Stage stepper — the 12-stage sanctioning pipeline, drawn as a connected row of // dots so an application's progress reads at a glance. // --------------------------------------------------------------------------- .loan-stepper { display: flex; align-items: flex-start; overflow-x: auto; padding: 22px 18px 16px; } .loan-step { display: flex; flex-direction: column; align-items: center; flex: 1; min-width: 90px; position: relative; &__connector { position: absolute; top: 15px; left: -50%; width: 100%; height: 2px; background: #e2e8f0; z-index: 0; } &:first-child &__connector { display: none; } &__dot { position: relative; z-index: 1; width: 32px; height: 32px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; background: #f1f5f9; color: #94a3b8; border: 2px solid #e2e8f0; } &__label { margin-top: 8px; font-size: 10.5px; text-align: center; color: #64748b; font-weight: 600; line-height: 1.3; max-width: 92px; } &--done { .loan-step__dot { background: #15803d; border-color: #15803d; color: #fff; } .loan-step__connector { background: #86efac; } .loan-step__label { color: #15803d; } } &--current { .loan-step__dot { background: #4338ca; border-color: #4338ca; color: #fff; box-shadow: 0 0 0 4px rgb(67 56 202 / 15%); } .loan-step__label { color: #4338ca; font-weight: 800; } } &--rejected { .loan-step__dot { background: #dc2626; border-color: #dc2626; color: #fff; } .loan-step__label { color: #dc2626; } } &--hold { .loan-step__dot { background: #d97706; border-color: #d97706; color: #fff; } .loan-step__label { color: #d97706; } } } // --------------------------------------------------------------------------- // Action card — the current stage's checklist/inputs and Approve/Reject buttons. // --------------------------------------------------------------------------- .loan-action-card { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 16px 18px; margin: 0 16px 16px; } .loan-checklist { display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; } .loan-checklist-item { display: flex; align-items: center; gap: 10px; font-size: 13px; color: #1e293b; // stylelint-disable-next-line selector-no-qualifying-type input[type='checkbox'] { width: 16px; height: 16px; accent-color: #4338ca; } } .loan-action-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 12px; } .loan-kv-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px 20px; padding: 18px; &--tight-bottom { padding: 0 0 10px; } &--tight-top { padding: 10px 0 0; } } .loan-kv-field { display: flex; flex-direction: column; gap: 3px; dt { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: #64748b; } dd { margin: 0; font-size: 14px; font-weight: 600; color: #0d1b2a; font-variant-numeric: tabular-nums; } } .loan-approval-summary { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; padding: 4px 18px 18px; } .loan-approval-tile { border: 1px solid #e2e8f0; border-radius: 10px; padding: 12px 14px; display: flex; flex-direction: column; gap: 4px; &__role { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: #64748b; } &__decision { font-size: 13px; font-weight: 700; } &--approved .loan-approval-tile__decision { color: #15803d; } &--rejected .loan-approval-tile__decision { color: #dc2626; } &--pending .loan-approval-tile__decision { color: #94a3b8; } } // New Application intake — existing-customer search (real Fineract client lookup, dropped into // this otherwise fully mock/dummy-data pipeline screen). .loi-selected-client { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 10px; border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; font-weight: 600; font-size: 13.5px; } .loi-search-hint { color: #94a3b8; font-size: 12.5px; margin: -8px 0 12px; } .loi-search-results { border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; max-width: 480px; margin-bottom: 16px; } .loi-search-row { display: flex; justify-content: space-between; align-items: center; width: 100%; padding: 10px 14px; background: #fff; border: none; border-bottom: 1px solid #f1f5f9; text-align: left; cursor: pointer; font: inherit; &:last-child { border-bottom: none; } &:hover { background: #f8fafc; } } .loi-search-name { font-weight: 600; color: #0f172a; } .loi-search-meta { color: #94a3b8; font-size: 12.5px; } // Application Detail — real share-account chips (clickable, opens the details popup) .loi-share-account-list { display: flex; flex-wrap: wrap; gap: 6px; } .loi-share-account-chip { display: inline-block; padding: 4px 12px; border-radius: 999px; background: #dcfce7; color: #166534; font-size: 12.5px; font-weight: 600; border: none; cursor: pointer; &:hover { background: #bbf7d0; } } // Application Detail — KYC & Documents: real verified-status cards (existing client) and the // local-only capture UI (no linked real client) both lay out as a compact card grid instead of // one long stacked column, so a 6-7 item checklist reads as a glanceable board, not a scroll. .loi-kyc-doc-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px; margin-bottom: 10px; } .loi-kyc-card { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; border: 1px solid #e2e8f0; border-radius: 10px; background: #fff; // Cards holding nothing but a single checkbox item (e-KYC fingerprint, secured-loan property // proofs) would otherwise look like empty boxes next to the document cards -- centering the // one line vertically makes the shorter card read as intentional, not unfinished. &--checkbox { justify-content: center; min-height: 46px; } // Compact everything inside a card -- the section-wide .pg-btn/.inv-form-field sizes are tuned // for full-width action rows elsewhere on this page, and read oversized packed into a card. .pg-btn { padding: 4px 10px; font-size: 12px; min-height: 30px; } .inv-form-field { gap: 2px; span { font-size: 11px; } } select { height: 30px; font-size: 12.5px; } // stylelint-disable-next-line selector-no-qualifying-type input[type='date'] { height: 30px; font-size: 12.5px; } } .loi-kyc-card-title { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: #64748b; } .loi-kyc-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .loi-kyc-masked { font-variant-numeric: tabular-nums; font-family: 'Courier New', monospace; color: #475569; font-size: 12.5px; } .loi-kyc-card-files { display: flex; gap: 6px; flex-wrap: wrap; } // Thumbnail(s) of whatever was just uploaded -- clicking one opens the full file in // DocumentPreviewDialogComponent, straight from the in-memory File (nothing is uploaded // anywhere yet in this local-only capture UI). .loi-kyc-thumbs { display: flex; gap: 6px; flex-wrap: wrap; } .loi-kyc-thumb { width: 56px; height: 56px; padding: 0; border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; overflow: hidden; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; &:hover { border-color: #94a3b8; } img { width: 100%; height: 100%; object-fit: cover; } } .loi-kyc-thumb-label { font-size: 9.5px; font-weight: 600; color: #64748b; text-align: center; padding: 2px; } .loi-kyc-card-verify { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; // stylelint-disable-next-line selector-no-qualifying-type input[type='text'] { height: 30px; padding: 0 8px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 12.5px; width: 120px; } } .loi-kyc-note { color: #94a3b8; font-size: 12px; margin: -2px 0 10px; } // CIC / Credit Bureau Check stage -- the Consent and Charge steps each get their own bordered // sub-card (instead of loose elements sharing the page-level .loan-action-card) so the two // distinct steps read as separate units rather than one long unbroken list. .loi-cic-subsection { display: flex; flex-direction: column; gap: 10px; padding: 14px 16px; margin: 0 0 14px; border: 1px solid #e2e8f0; border-radius: 10px; background: #fff; } .loi-cic-subsection-title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: #1e40af; } .loi-kyc-error { color: #dc2626; font-size: 11.5px; font-weight: 600; margin: -2px 0 0; } // Field Investigation -- one card per address (Home/Office/Property/Shop) instead of stacked // full-width sections, since each visit's officer/SLA/GPS/photo capture is a self-contained unit. .loi-fi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); gap: 14px; margin-bottom: 14px; } .loi-fi-card { display: flex; flex-direction: column; gap: 10px; padding: 14px 16px; border: 1px solid #e2e8f0; border-radius: 12px; background: #fff; } .loi-fi-card-title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: #1e40af; } .loi-fi-view-details { display: inline-flex; align-items: center; align-self: flex-start; gap: 6px; height: 30px; padding: 0 12px; border: 1px solid #c7d2fe; border-radius: 999px; background: #eef2ff; color: #4338ca; font-size: 12px; font-weight: 700; cursor: pointer; &:hover { background: #e0e7ff; } } .loi-otp-digits { display: flex; gap: 5px; // stylelint-disable-next-line selector-no-qualifying-type input[type='text'] { width: 28px; height: 30px; text-align: center; padding: 0; } } // KYC & Documents' Monthly Income card -- full basis for the EMI figure, not just the number. .loi-emi-breakdown { margin-top: 4px; padding: 12px 14px; border: 1px solid #e2e8f0; border-radius: 10px; background: #f8fafc; .loan-kv-grid { padding: 0; } } .loi-emi-breakdown-title { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: #64748b; margin-bottom: 8px; } .loi-emi-formula { margin: 10px 0 0; } // CIC check charge -- picking one of the client's real accounts to debit reuses the .loi-kyc-card // grid/card look, just made clickable as a whole (a plain button, not a form control) with a // clear selected state. .loi-charge-account { text-align: left; cursor: pointer; font: inherit; &--selected { border-color: #15803d; background: #f0fdf4; } } // A completed stepper step is a real