Files
cbsnexora/src/app/home/dashboard/crr-slr-dialog/crr-slr-dialog.component.scss
T

872 lines
13 KiB
SCSS

/**
* 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/.
*/
$demand: #1d4ed8;
$demand-bg: #eff6ff;
$demand-b: #bfdbfe;
$time: #0f766e;
$time-bg: #f0fdfa;
$time-b: #99f6e4;
$asset: #7c3aed;
$asset-bg: #f5f3ff;
$asset-b: #ddd6fe;
$ink: #0f172a;
$ink2: #334155;
$ink3: #64748b;
$ink4: #94a3b8;
$border: #e2e8f0;
$border2: #cbd5e1;
$surface: #fff;
$surface2: #f8fafc;
$red: #dc2626;
$green: #16a34a;
$amber: #d97706;
$mono: 'IBM Plex Mono', 'Roboto Mono', monospace;
.crr-dialog {
max-height: 85vh;
overflow-y: auto;
padding: 0;
font-size: 14px;
line-height: 1.6;
color: $ink;
}
// ===== Header =====
.dialog-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
padding: 24px 28px 20px;
border-bottom: 1px solid $border;
gap: 16px;
flex-wrap: wrap;
position: sticky;
top: 0;
background: $surface;
z-index: 10;
}
.header-badge {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 10px;
font-weight: 600;
padding: 3px 10px;
border-radius: 4px;
background: #fff7ed;
color: #c2410c;
border: 1px solid #fed7aa;
letter-spacing: 0.5px;
margin-bottom: 8px;
font-family: $mono;
}
.dialog-title {
font-size: 20px;
font-weight: 600;
color: $ink;
margin: 0 0 4px;
}
.dialog-sub {
font-size: 12px;
color: $ink3;
font-family: $mono;
letter-spacing: 0.5px;
margin: 0;
}
.header-right {
display: flex;
align-items: flex-start;
gap: 12px;
}
.as-of-box {
font-size: 11px;
color: $ink3;
font-family: $mono;
text-align: right;
background: $surface2;
border: 1px solid $border;
padding: 8px 14px;
border-radius: 8px;
strong {
color: $ink2;
display: block;
font-size: 13px;
margin-bottom: 2px;
}
}
.rbi-circular-btn {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 11px;
font-family: $mono;
font-weight: 500;
padding: 7px 14px;
border-radius: 8px;
background: #fff7ed;
color: #c2410c;
border: 1px solid #fed7aa;
text-decoration: none;
transition: all 0.15s;
white-space: nowrap;
&:hover {
background: #ffedd5;
border-color: #fb923c;
color: #9a3412;
}
fa-icon {
font-size: 10px;
}
}
.close-btn {
width: 32px;
height: 32px;
border-radius: 8px;
background: $surface2;
border: 1px solid $border;
cursor: pointer;
font-size: 16px;
color: $ink3;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s;
&:hover {
background: #fef2f2;
color: $red;
border-color: #fecaca;
}
}
// ===== Summary Cards =====
.summary-row {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 14px;
padding: 20px 28px;
}
.summary-card {
background: $surface;
border: 1px solid $border;
border-radius: 12px;
padding: 16px 18px;
position: relative;
overflow: hidden;
transition: box-shadow 0.2s;
&:hover {
box-shadow: 0 4px 16px rgb(0 0 0 / 8%);
}
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
}
}
.sc-demand::before {
background: $demand;
}
.sc-time::before {
background: $time;
}
.sc-asset::before {
background: $asset;
}
.sc-ndtl::before {
background: linear-gradient(90deg, $asset, $time, $demand);
}
.sc-crr::before {
background: $amber;
}
.sc-label {
font-size: 10px;
color: $ink3;
font-family: $mono;
letter-spacing: 1px;
text-transform: uppercase;
margin-bottom: 6px;
}
.sc-value {
font-size: 20px;
font-weight: 600;
color: $ink;
font-family: $mono;
}
.cr {
font-size: 11px;
color: $ink3;
font-weight: 400;
margin-left: 3px;
}
.sc-change {
font-size: 11px;
margin-top: 4px;
}
.sc-sub {
font-size: 11px;
color: $ink3;
margin-top: 4px;
}
.up {
color: $green;
}
.dn {
color: $red;
}
// ===== Tab Navigation =====
.tab-nav {
display: flex;
gap: 8px;
padding: 0 28px 16px;
border-bottom: 1px solid $border;
}
.tab-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
border-radius: 8px;
border: 1px solid $border;
background: $surface;
color: $ink2;
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s;
&:hover {
border-color: $border2;
background: $surface2;
}
&.active {
background: $ink;
color: #fff;
border-color: $ink;
.tab-pill {
background: rgb(255 255 255 / 20%);
color: #fff;
border-color: transparent;
}
}
}
.tab-pill {
font-size: 10px;
font-family: $mono;
font-weight: 600;
padding: 2px 8px;
border-radius: 12px;
letter-spacing: 0.5px;
}
.pill-demand {
background: $demand-bg;
color: $demand;
border: 1px solid $demand-b;
}
.pill-time {
background: $time-bg;
color: $time;
border: 1px solid $time-b;
}
.pill-asset {
background: $asset-bg;
color: $asset;
border: 1px solid $asset-b;
}
.section-desc {
font-size: 12px;
color: $ink3;
font-style: italic;
padding: 12px 28px 8px;
}
// ===== Table =====
.table-wrap {
margin: 0 28px 20px;
background: $surface;
border: 1px solid $border;
border-radius: 12px;
overflow: hidden;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
thead tr {
background: $surface2;
border-bottom: 1px solid $border;
}
thead th {
padding: 10px 14px;
text-align: left;
font-size: 10px;
font-family: $mono;
font-weight: 500;
color: $ink3;
letter-spacing: 1px;
text-transform: uppercase;
white-space: nowrap;
&.right {
text-align: right;
}
}
tbody tr {
border-bottom: 1px solid $border;
transition: background 0.15s;
&:last-child {
border-bottom: none;
}
&:hover {
background: #f8fafc;
}
}
td {
padding: 10px 14px;
color: $ink2;
vertical-align: middle;
&.right {
text-align: right;
font-family: $mono;
}
}
.sl {
color: $ink4;
font-family: $mono;
font-size: 11px;
width: 36px;
}
.mono {
font-family: $mono;
font-size: 12px;
}
.item-name {
font-weight: 500;
color: $ink;
}
.item-sub {
font-size: 11px;
color: $ink3;
margin-top: 2px;
}
.amt {
font-family: $mono;
font-weight: 500;
}
.amt-demand {
color: $demand;
}
.amt-time {
color: $time;
}
.amt-asset {
color: $asset;
}
.status-chip {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 10px;
font-family: $mono;
font-weight: 500;
padding: 2px 8px;
border-radius: 4px;
}
.chip-active {
background: #dcfce7;
color: #15803d;
}
.chip-overdue {
background: #fef2f2;
color: $red;
}
.chip-locked {
background: #fefce8;
color: #92400e;
}
tfoot tr {
background: $surface2;
border-top: 2px solid $border2;
}
tfoot td {
font-weight: 600;
color: $ink;
font-family: $mono;
padding: 12px 14px;
&.right {
text-align: right;
font-size: 14px;
}
}
$slr: #0369a1;
$slr-bg: #f0f9ff;
$slr-b: #bae6fd;
.foot-demand {
color: $demand;
}
.foot-time {
color: $time;
}
.foot-asset {
color: $asset;
}
.foot-slr {
color: $slr;
}
.deduct-tag {
font-size: 10px;
color: $asset;
font-family: $mono;
margin-left: 8px;
}
.amt-slr {
color: $slr;
}
.chip-slr {
background: $slr-bg;
color: $slr;
border: 1px solid $slr-b;
}
.pill-slr {
background: $slr-bg;
color: $slr;
border: 1px solid $slr-b;
}
.ft-slr {
border-color: $slr-b;
background: $slr-bg;
.formula-term-label,
.formula-term-val {
color: $slr;
}
}
.ft-slr-result {
border-color: #bbf7d0;
background: linear-gradient(135deg, #f0fdf4, #ecfdf5);
.formula-term-label {
color: #15803d;
}
.formula-term-val {
color: $green;
font-size: 20px;
}
}
.slr-formula::before {
background: linear-gradient(90deg, $slr, $green) !important;
}
// ===== SLR Status Bar =====
.slr-status-bar {
margin: 0 28px 20px;
background: linear-gradient(135deg, #ecfdf5, #f0fdf4);
border: 1px solid #bbf7d0;
border-radius: 10px;
padding: 16px 24px;
display: flex;
align-items: center;
gap: 20px;
flex-wrap: wrap;
}
.slr-status-left {
flex: 1;
}
.slr-status-title {
font-size: 13px;
font-weight: 600;
color: #14532d;
margin-bottom: 3px;
}
.slr-status-desc {
font-size: 12px;
color: #166534;
}
.slr-status-calcs {
display: flex;
gap: 24px;
}
.slr-calc {
text-align: right;
}
.slr-calc-label {
font-size: 10px;
color: #166534;
font-family: $mono;
letter-spacing: 1px;
}
.slr-calc-val {
font-size: 15px;
font-weight: 600;
color: #14532d;
font-family: $mono;
&.surplus {
color: $green;
}
}
// ===== Formula Block =====
.formula-block {
margin: 20px 28px;
background: $surface;
border: 1px solid $border;
border-radius: 14px;
padding: 20px 24px;
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg, $demand, $time, $asset);
}
}
.formula-title {
font-size: 11px;
font-family: $mono;
color: $ink3;
letter-spacing: 2px;
text-transform: uppercase;
margin-bottom: 16px;
}
.formula-row {
display: flex;
align-items: center;
gap: 0;
flex-wrap: wrap;
}
.formula-term {
display: flex;
flex-direction: column;
align-items: center;
padding: 12px 16px;
border-radius: 10px;
border: 1px solid $border;
background: $surface2;
min-width: 130px;
flex: 1;
}
.formula-term-label {
font-size: 9.5px;
font-family: $mono;
letter-spacing: 1.5px;
text-transform: uppercase;
margin-bottom: 4px;
}
.formula-term-val {
font-size: 16px;
font-weight: 600;
font-family: $mono;
}
.formula-term-sub {
font-size: 9px;
color: $ink4;
font-family: $mono;
margin-top: 2px;
}
.formula-op {
font-size: 20px;
font-weight: 300;
color: $ink3;
padding: 0 8px;
flex-shrink: 0;
&.minus {
color: $red;
}
&.equals {
color: $ink2;
font-weight: 500;
}
}
.ft-demand {
border-color: $demand-b;
background: $demand-bg;
.formula-term-label,
.formula-term-val {
color: $demand;
}
}
.ft-time {
border-color: $time-b;
background: $time-bg;
.formula-term-label,
.formula-term-val {
color: $time;
}
}
.ft-asset {
border-color: $asset-b;
background: $asset-bg;
.formula-term-label,
.formula-term-val {
color: $asset;
}
}
.ft-ndtl {
border-color: #a78bfa;
background: linear-gradient(135deg, #f5f3ff, #f0fdfa);
.formula-term-label {
color: #6d28d9;
}
.formula-term-val {
color: $ink;
font-size: 18px;
}
}
// ===== CRR Bar =====
.crr-bar {
margin: 0 28px 20px;
background: linear-gradient(135deg, #fefce8, #fff7ed);
border: 1px solid #fed7aa;
border-radius: 10px;
padding: 16px 24px;
display: flex;
align-items: center;
gap: 20px;
flex-wrap: wrap;
}
.crr-title {
font-size: 13px;
font-weight: 600;
color: #92400e;
margin-bottom: 3px;
}
.crr-desc {
font-size: 12px;
color: #a16207;
}
.crr-text {
flex: 1;
}
.crr-calcs {
display: flex;
gap: 24px;
}
.crr-calc {
text-align: right;
}
.crr-calc-label {
font-size: 10px;
color: #92400e;
font-family: $mono;
letter-spacing: 1px;
}
.crr-calc-val {
font-size: 15px;
font-weight: 600;
color: #78350f;
font-family: $mono;
}
// ===== Footer =====
.dialog-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 28px;
border-top: 1px solid $border;
font-size: 11px;
color: $ink4;
font-family: $mono;
background: $surface2;
flex-wrap: wrap;
gap: 8px;
position: sticky;
bottom: 0;
}
// ===== Responsive =====
/* stylelint-disable-next-line media-feature-range-notation -- Safari compatibility */
@media (max-width: 900px) {
.summary-row {
grid-template-columns: repeat(2, 1fr);
}
.formula-row {
gap: 8px;
}
.formula-term {
min-width: 100px;
}
.crr-calcs,
.slr-status-calcs {
flex-direction: column;
gap: 8px;
}
}
/* stylelint-disable-next-line media-feature-range-notation -- Safari compatibility */
@media (max-width: 600px) {
.summary-row {
grid-template-columns: 1fr;
}
.dialog-header {
padding: 16px 20px;
}
.summary-row,
.table-wrap,
.formula-block,
.crr-bar,
.slr-status-bar {
margin-left: 16px;
margin-right: 16px;
}
.tab-nav {
padding: 0 16px 12px;
flex-wrap: wrap;
}
.section-desc {
padding: 8px 16px;
}
}
/* Why the figures are missing, in the return's own words — an administrator reading only dashes
goes looking for a fault in this screen rather than in the configuration that actually caused it. */
.unavailable-note {
margin: 0 0 16px;
padding: 10px 14px;
background: #fffbeb;
color: #92400e;
border-radius: 8px;
font-size: 12.5px;
line-height: 1.6;
fa-icon {
margin-right: 8px;
}
}
/* A head with nothing mapped. Said in the table rather than left as an empty body, and it names the
screen where the mapping is made — an empty table otherwise reads as a fault in this one. */
.empty-row td {
padding: 22px 16px;
text-align: center;
color: #6b7280;
font-size: 12.5px;
line-height: 1.6;
background: #fafafa;
}