fixed current, rd, fd account preview page styling

This commit is contained in:
Nitesh Yadav
2026-05-19 14:21:52 +05:30
parent c70a11f30c
commit 37ac15f42c
14 changed files with 3329 additions and 1803 deletions
+2 -2
View File
@@ -69,8 +69,8 @@
"budgets": [
{
"type": "initial",
"maximumWarning": "12mb",
"maximumError": "12mb"
"maximumWarning": "13mb",
"maximumError": "14mb"
},
{
"type": "anyComponentStyle",
@@ -702,17 +702,16 @@
[class.gl-data-row--cr]="row.entryType?.value === 'CREDIT'"
class="gl-data-row"
></mat-row>
<tr class="mat-row" *matNoDataRow>
<td class="mat-cell" [attr.colspan]="displayedColumns.length">
<div class="gl-empty">
<div class="gl-empty__icon"><fa-icon icon="search"></fa-icon></div>
<div class="gl-empty__title">No entries found</div>
<div class="gl-empty__sub">Try adjusting your filters or date range</div>
</div>
</td>
</tr>
</mat-table>
@if (totalEntries === 0) {
<div class="gl-empty">
<div class="gl-empty__icon"><fa-icon icon="search"></fa-icon></div>
<div class="gl-empty__title">No entries found</div>
<div class="gl-empty__sub">Try adjusting your filters or date range</div>
</div>
}
<div class="gl-pager-wrap">
<mat-paginator [pageSizeOptions]="[10, 25, 50, 100]" showFirstLastButtons></mat-paginator>
</div>
@@ -1444,9 +1444,11 @@
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 300px;
min-height: 340px;
width: 100%;
text-align: center;
padding: 0 16px;
box-sizing: border-box;
&__icon {
font-size: 2.5rem;
+1
View File
@@ -98,6 +98,7 @@ $color: #e2e4ec;
max-width: 100%;
overflow-x: hidden;
box-sizing: border-box;
padding: 16px 28px;
}
}
@@ -6,48 +6,429 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
@use 'assets/styles/helper';
@use 'assets/styles/colours' as *;
@use 'assets/styles/product-view' as pv;
@include pv.product-view-styles;
/* Current-account-specific green accent */
:host {
--pv-accent: #15803d;
--pv-accent-l: #dcfce7;
--vsp-navy: #0b1e3d;
--vsp-blue: #1d4ed8;
--vsp-blue-l: #eff6ff;
--vsp-teal: #0e7e6b;
--vsp-teal-l: #ccfbf1;
--vsp-purple: #6d28d9;
--vsp-purple-l: #ede9fe;
--vsp-indigo: #3730a3;
--vsp-indigo-l: #e0e7ff;
--vsp-amber: #b45309;
--vsp-amber-l: #fef3c7;
--vsp-green: #15803d;
--vsp-green-l: #dcfce7;
--vsp-red: #c0392b;
--vsp-red-l: #fee2e2;
--vsp-pink: #be185d;
--vsp-pink-l: #fce7f3;
--vsp-g50: #f8fafc;
--vsp-g100: #f1f5f9;
--vsp-g200: #e2e8f0;
--vsp-g500: #64748b;
--vsp-g700: #334155;
--vsp-g900: #0f172a;
display: block;
font-family:
'DM Sans',
system-ui,
-apple-system,
sans-serif;
color: var(--vsp-g900);
font-size: 13.5px;
}
.tab-container {
padding: 1%;
margin: 1%;
.vsp-root {
padding: 4px 4px 24px;
display: flex;
flex-direction: column;
gap: 14px;
}
.mat-h3 {
margin-top: 10px !important;
font-weight: 300;
color: $status-approved;
/* ───────── HERO ───────── */
.vsp-hero {
background: linear-gradient(135deg, var(--vsp-navy) 0%, var(--vsp-blue) 100%);
border-radius: 14px;
padding: 22px 22px 22px 18px;
display: flex;
align-items: flex-start;
gap: 18px;
box-shadow:
0 10px 24px rgb(11 30 61 / 18%),
0 4px 10px rgb(11 30 61 / 12%);
color: #fff;
position: relative;
overflow: hidden;
}
h2,
h3,
h4 {
margin: 0;
.vsp-hero::before {
content: '';
position: absolute;
top: -60px;
right: -60px;
width: 240px;
height: 240px;
border-radius: 50%;
background: radial-gradient(circle, rgb(255 255 255 / 8%) 0%, transparent 70%);
pointer-events: none;
}
.vsp-hero-left {
display: flex;
align-items: flex-start;
gap: 16px;
flex: 1;
min-width: 0;
}
.vsp-hero-icon {
width: 56px;
height: 56px;
border-radius: 14px;
background: rgb(255 255 255 / 16%);
border: 1px solid rgb(255 255 255 / 22%);
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 24px;
flex-shrink: 0;
}
.vsp-hero-text {
flex: 1;
min-width: 0;
}
.vsp-hero-eyebrow {
font-size: 10.5px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
color: rgb(255 255 255 / 70%);
margin-bottom: 4px;
}
.vsp-hero-title {
margin: 0 0 10px;
font-size: 22px;
font-weight: 700;
letter-spacing: 0.01em;
color: #fff;
line-height: 1.2;
}
.vsp-hero-meta {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.vsp-hero-desc {
margin: 12px 0 0;
font-size: 13px;
color: rgb(255 255 255 / 82%);
line-height: 1.5;
max-width: 720px;
}
.vsp-edit-btn {
display: inline-flex;
align-items: center;
gap: 8px;
height: 38px;
padding: 0 16px;
border-radius: 10px;
background: rgb(255 255 255 / 14%);
color: #fff;
border: 1px solid rgb(255 255 255 / 28%);
font-size: 13px;
font-weight: 700;
letter-spacing: 0.02em;
cursor: pointer;
text-decoration: none;
white-space: nowrap;
font-family: inherit;
flex-shrink: 0;
transition: all 0.16s ease;
fa-icon {
font-size: 12px;
}
&:hover {
background: rgb(255 255 255 / 24%);
border-color: rgb(255 255 255 / 50%);
}
}
/* ───────── PILLS ───────── */
.vsp-pill {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 4px 10px;
border-radius: 999px;
font-family: inherit;
fa-icon {
font-size: 9.5px;
}
&--code {
background: rgb(255 255 255 / 18%);
color: #fff;
border: 1px solid rgb(255 255 255 / 24%);
font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
}
&--teal {
background: var(--vsp-teal-l);
color: var(--vsp-teal);
border: 1px solid #99f6e4;
}
&--blue {
background: var(--vsp-blue-l);
color: var(--vsp-blue);
border: 1px solid #dbeafe;
}
&--green {
background: var(--vsp-green-l);
color: var(--vsp-green);
border: 1px solid #bbf7d0;
}
&--amber {
background: var(--vsp-amber-l);
color: var(--vsp-amber);
border: 1px solid #fde68a;
}
&--red {
background: var(--vsp-red-l);
color: var(--vsp-red);
border: 1px solid #fecaca;
}
&--gray {
background: var(--vsp-g100);
color: var(--vsp-g700);
border: 1px solid var(--vsp-g200);
}
}
/* ───────── SECTION ───────── */
.vsp-section {
background: #fff;
border: 1px solid var(--vsp-g200);
border-radius: 12px;
padding: 16px 20px;
box-shadow: 0 1px 2px rgb(15 23 42 / 4%);
}
.vsp-section-h {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 14px;
padding-bottom: 12px;
border-bottom: 1px dashed var(--vsp-g200);
h3 {
margin: 0;
font-size: 14px;
font-weight: 700;
color: var(--vsp-g900);
letter-spacing: 0.02em;
}
}
.vsp-section-ic {
width: 36px;
height: 36px;
border-radius: 10px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 14px;
flex-shrink: 0;
&--blue {
background: var(--vsp-blue-l);
color: var(--vsp-blue);
}
&--teal {
background: var(--vsp-teal-l);
color: var(--vsp-teal);
}
&--purple {
background: var(--vsp-purple-l);
color: var(--vsp-purple);
}
&--indigo {
background: var(--vsp-indigo-l);
color: var(--vsp-indigo);
}
&--amber {
background: var(--vsp-amber-l);
color: var(--vsp-amber);
}
&--green {
background: var(--vsp-green-l);
color: var(--vsp-green);
}
&--red {
background: var(--vsp-red-l);
color: var(--vsp-red);
}
&--pink {
background: var(--vsp-pink-l);
color: var(--vsp-pink);
}
}
.vsp-sub-h {
margin: 16px 0 10px;
font-size: 12px;
font-weight: 700;
color: var(--vsp-g700);
text-transform: uppercase;
letter-spacing: 0.06em;
}
/* ───────── KEY/VALUE GRID ───────── */
.vsp-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px 24px;
}
.vsp-grid--3 {
grid-template-columns: repeat(3, 1fr);
}
@media (width <= 900px) {
.vsp-grid,
.vsp-grid--3 {
grid-template-columns: 1fr 1fr;
}
}
@media (width <= 600px) {
.vsp-grid,
.vsp-grid--3 {
grid-template-columns: 1fr;
}
}
.vsp-kv {
display: flex;
flex-direction: column;
gap: 3px;
padding: 8px 0;
border-bottom: 1px dashed var(--vsp-g100);
&--span {
grid-column: 1 / -1;
}
}
.vsp-k {
font-size: 10.5px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--vsp-g500);
}
.vsp-v {
font-size: 13.5px;
color: var(--vsp-g900);
font-weight: 500;
word-break: break-word;
strong {
font-weight: 700;
}
}
table {
/* ───────── FEATURE GRID (account facilities) ───────── */
.vsp-feature {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 8px;
background: var(--vsp-g50);
border: 1px solid var(--vsp-g200);
font-size: 12.5px;
font-weight: 600;
color: var(--vsp-g700);
fa-icon {
font-size: 12px;
color: var(--vsp-g500);
}
&.is-on {
background: var(--vsp-green-l);
border-color: #bbf7d0;
color: var(--vsp-green);
fa-icon {
color: var(--vsp-green);
}
}
}
/* ───────── TABLES ───────── */
.vsp-table-wrap {
overflow-x: auto;
border: 1px solid var(--vsp-g200);
border-radius: 10px;
margin-top: 4px;
}
.vsp-table {
width: 100%;
}
background: #fff;
.mat-elevation-z1 {
margin: 1em 0 1.5em;
}
th.mat-mdc-header-cell {
background: var(--vsp-g50);
color: var(--vsp-g700);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
padding: 11px 14px;
border-bottom: 1px solid var(--vsp-g200);
white-space: nowrap;
}
span {
margin: 0.5em 0;
}
td.mat-mdc-cell {
padding: 10px 14px;
border-bottom: 1px solid var(--vsp-g100);
font-size: 12.5px;
color: var(--vsp-g900);
}
mat-divider {
margin: 0 0 0.5em;
tbody tr:last-child td.mat-mdc-cell {
border-bottom: 0;
}
}
@@ -34,6 +34,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
styleUrls: ['./current-product-general-tab.component.scss'],
imports: [
...STANDALONE_SHARED_IMPORTS,
RouterLink,
FaIconComponent,
MatDivider,
MatTable,
@@ -6,77 +6,397 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
@use 'assets/styles/helper';
@use 'assets/styles/colours' as *;
@use 'assets/styles/product-view' as pv;
@include pv.product-view-styles;
/* FD-specific teal accent */
:host {
--pv-accent: #0e7e6b;
--pv-accent-l: #ccfbf1;
--vsp-navy: #0b1e3d;
--vsp-blue: #1d4ed8;
--vsp-blue-l: #eff6ff;
--vsp-teal: #0e7e6b;
--vsp-teal-l: #ccfbf1;
--vsp-purple: #6d28d9;
--vsp-purple-l: #ede9fe;
--vsp-indigo: #3730a3;
--vsp-indigo-l: #e0e7ff;
--vsp-amber: #b45309;
--vsp-amber-l: #fef3c7;
--vsp-green: #15803d;
--vsp-green-l: #dcfce7;
--vsp-red: #c0392b;
--vsp-red-l: #fee2e2;
--vsp-pink: #be185d;
--vsp-pink-l: #fce7f3;
--vsp-g50: #f8fafc;
--vsp-g100: #f1f5f9;
--vsp-g200: #e2e8f0;
--vsp-g500: #64748b;
--vsp-g700: #334155;
--vsp-g900: #0f172a;
display: block;
font-family:
'DM Sans',
system-ui,
-apple-system,
sans-serif;
color: var(--vsp-g900);
font-size: 13.5px;
}
.container {
width: 100%;
.vsp-root {
padding: 4px 4px 24px;
display: flex;
flex-direction: column;
gap: 14px;
}
.tab-container {
padding: 1%;
margin: 1%;
.vsp-hero {
background: linear-gradient(135deg, var(--vsp-navy) 0%, var(--vsp-blue) 100%);
border-radius: 14px;
padding: 22px 22px 22px 18px;
display: flex;
align-items: flex-start;
gap: 18px;
box-shadow:
0 10px 24px rgb(11 30 61 / 18%),
0 4px 10px rgb(11 30 61 / 12%);
color: #fff;
position: relative;
overflow: hidden;
}
.mat-h3 {
margin-top: 10px !important;
font-weight: 300;
color: $status-approved;
.vsp-hero::before {
content: '';
position: absolute;
top: -60px;
right: -60px;
width: 240px;
height: 240px;
border-radius: 50%;
background: radial-gradient(circle, rgb(255 255 255 / 8%) 0%, transparent 70%);
pointer-events: none;
}
.mat-elevation-z1 {
margin: 1em 0 1.5em;
.vsp-hero-left {
display: flex;
align-items: flex-start;
gap: 16px;
flex: 1;
min-width: 0;
}
h2,
h3,
h4 {
margin: 0;
font-weight: 500;
.vsp-hero-icon {
width: 56px;
height: 56px;
border-radius: 14px;
background: rgb(255 255 255 / 16%);
border: 1px solid rgb(255 255 255 / 22%);
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 24px;
flex-shrink: 0;
}
span {
margin: 0.5em 0;
.vsp-hero-text {
flex: 1;
min-width: 0;
}
mat-divider {
margin: 0 0 0.5em;
.vsp-hero-eyebrow {
font-size: 10.5px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
color: rgb(255 255 255 / 70%);
margin-bottom: 4px;
}
.margin-t {
margin-top: 1em;
.vsp-hero-title {
margin: 0 0 10px;
font-size: 22px;
font-weight: 700;
letter-spacing: 0.01em;
color: #fff;
line-height: 1.2;
}
table {
width: 100%;
.vsp-hero-meta {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
tr.incentives-row {
height: 0;
.vsp-hero-desc {
margin: 12px 0 0;
font-size: 13px;
color: rgb(255 255 255 / 82%);
line-height: 1.5;
max-width: 720px;
}
> td {
padding: 0;
}
.vsp-edit-btn {
display: inline-flex;
align-items: center;
gap: 8px;
height: 38px;
padding: 0 16px;
border-radius: 10px;
background: rgb(255 255 255 / 14%);
color: #fff;
border: 1px solid rgb(255 255 255 / 28%);
font-size: 13px;
font-weight: 700;
letter-spacing: 0.02em;
cursor: pointer;
text-decoration: none;
white-space: nowrap;
font-family: inherit;
flex-shrink: 0;
transition: all 0.16s ease;
.incentives {
overflow: hidden;
}
fa-icon {
font-size: 12px;
}
.mat-card {
border-radius: 0;
> h4 {
font-weight: 500;
margin: 0.5em 0 0;
}
}
&:hover {
background: rgb(255 255 255 / 24%);
border-color: rgb(255 255 255 / 50%);
}
}
.vsp-pill {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 4px 10px;
border-radius: 999px;
font-family: inherit;
fa-icon {
font-size: 9.5px;
}
&--code {
background: rgb(255 255 255 / 18%);
color: #fff;
border: 1px solid rgb(255 255 255 / 24%);
font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
}
&--teal {
background: var(--vsp-teal-l);
color: var(--vsp-teal);
border: 1px solid #99f6e4;
}
&--blue {
background: var(--vsp-blue-l);
color: var(--vsp-blue);
border: 1px solid #dbeafe;
}
&--green {
background: var(--vsp-green-l);
color: var(--vsp-green);
border: 1px solid #bbf7d0;
}
&--amber {
background: var(--vsp-amber-l);
color: var(--vsp-amber);
border: 1px solid #fde68a;
}
&--red {
background: var(--vsp-red-l);
color: var(--vsp-red);
border: 1px solid #fecaca;
}
&--gray {
background: var(--vsp-g100);
color: var(--vsp-g700);
border: 1px solid var(--vsp-g200);
}
}
.vsp-section {
background: #fff;
border: 1px solid var(--vsp-g200);
border-radius: 12px;
padding: 16px 20px;
box-shadow: 0 1px 2px rgb(15 23 42 / 4%);
}
.vsp-section-h {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 14px;
padding-bottom: 12px;
border-bottom: 1px dashed var(--vsp-g200);
h3 {
margin: 0;
font-size: 14px;
font-weight: 700;
color: var(--vsp-g900);
letter-spacing: 0.02em;
}
}
.vsp-section-ic {
width: 36px;
height: 36px;
border-radius: 10px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 14px;
flex-shrink: 0;
&--blue {
background: var(--vsp-blue-l);
color: var(--vsp-blue);
}
&--teal {
background: var(--vsp-teal-l);
color: var(--vsp-teal);
}
&--purple {
background: var(--vsp-purple-l);
color: var(--vsp-purple);
}
&--indigo {
background: var(--vsp-indigo-l);
color: var(--vsp-indigo);
}
&--amber {
background: var(--vsp-amber-l);
color: var(--vsp-amber);
}
&--green {
background: var(--vsp-green-l);
color: var(--vsp-green);
}
&--red {
background: var(--vsp-red-l);
color: var(--vsp-red);
}
&--pink {
background: var(--vsp-pink-l);
color: var(--vsp-pink);
}
}
.vsp-sub-h {
margin: 16px 0 10px;
font-size: 12px;
font-weight: 700;
color: var(--vsp-g700);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.vsp-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px 24px;
}
@media (width <= 600px) {
.vsp-grid {
grid-template-columns: 1fr;
}
}
.vsp-kv {
display: flex;
flex-direction: column;
gap: 3px;
padding: 8px 0;
border-bottom: 1px dashed var(--vsp-g100);
&--span {
grid-column: 1 / -1;
}
}
.vsp-k {
font-size: 10.5px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--vsp-g500);
}
.vsp-v {
font-size: 13.5px;
color: var(--vsp-g900);
font-weight: 500;
word-break: break-word;
strong {
font-weight: 700;
}
}
.vsp-v--accent {
font-size: 18px;
font-weight: 700;
color: var(--vsp-blue);
letter-spacing: 0.01em;
}
.vsp-suffix {
font-size: 12px;
font-weight: 600;
color: var(--vsp-g500);
margin-left: 4px;
}
.vsp-table-wrap {
overflow-x: auto;
border: 1px solid var(--vsp-g200);
border-radius: 10px;
margin-top: 4px;
}
.vsp-table {
width: 100%;
background: #fff;
th.mat-mdc-header-cell {
background: var(--vsp-g50);
color: var(--vsp-g700);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
padding: 11px 14px;
border-bottom: 1px solid var(--vsp-g200);
white-space: nowrap;
}
td.mat-mdc-cell {
padding: 10px 14px;
border-bottom: 1px solid var(--vsp-g100);
font-size: 12.5px;
color: var(--vsp-g900);
}
tbody tr:last-child td.mat-mdc-cell {
border-bottom: 0;
}
}
@@ -8,6 +8,7 @@
import { Component, OnInit, inject } from '@angular/core';
import { ActivatedRoute, RouterLink } from '@angular/router';
import { trigger, state, style, animate, transition } from '@angular/animations';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
import { MatDivider } from '@angular/material/divider';
import {
@@ -36,6 +37,13 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
selector: 'mifosx-fixed-deposit-general-tab',
templateUrl: './fixed-deposit-general-tab.component.html',
styleUrls: ['./fixed-deposit-general-tab.component.scss'],
animations: [
trigger('expandChartSlab', [
state('collapsed', style({ height: '0px', overflow: 'hidden', opacity: 0 })),
state('expanded', style({ height: '*', overflow: 'visible', opacity: 1 })),
transition('collapsed <=> expanded', animate('200ms ease'))
])
],
imports: [
...STANDALONE_SHARED_IMPORTS,
RouterLink,
@@ -80,6 +88,24 @@ export class FixedDepositGeneralTabComponent implements OnInit {
'periodTypeLabel',
'annualInterestRate'
];
readonly chartSlabsDisplayedColumns = [
'period',
'amountRange',
'annualInterestRate',
'description',
'actions'
];
readonly chartSlabsIncentivesDisplayedColumns = ['incentives'];
readonly incentivesDisplayedColumns = [
'entityType',
'attributeName',
'conditionType',
'attributeValue',
'incentiveType',
'amount'
];
expandChartSlabIndex: number | null = null;
readonly chargesDisplayedColumns = [
'name',
'type',
@@ -53,7 +53,6 @@
<mifosx-loan-product-summary
[action]="'view'"
[loanProduct]="loanProduct"
[useDueForRepaymentsConfigurations]="useDueForRepaymentsConfigurations"
[paymentAllocations]="loanProduct.paymentAllocation"
[creditAllocations]="loanProduct.creditAllocation"
[supportedInterestRefundTypes]="loanProduct.supportedInterestRefundTypes"
@@ -6,50 +6,513 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
@use 'assets/styles/helper';
@use 'assets/styles/colours' as *;
@use 'assets/styles/product-view' as pv;
@include pv.product-view-styles;
/* RD-specific purple accent */
:host {
--pv-accent: #6d28d9;
--pv-accent-l: #ede9fe;
--vsp-navy: #0b1e3d;
--vsp-blue: #1d4ed8;
--vsp-blue-l: #eff6ff;
--vsp-teal: #0e7e6b;
--vsp-teal-l: #ccfbf1;
--vsp-purple: #6d28d9;
--vsp-purple-l: #ede9fe;
--vsp-indigo: #3730a3;
--vsp-indigo-l: #e0e7ff;
--vsp-amber: #b45309;
--vsp-amber-l: #fef3c7;
--vsp-green: #15803d;
--vsp-green-l: #dcfce7;
--vsp-red: #c0392b;
--vsp-red-l: #fee2e2;
--vsp-pink: #be185d;
--vsp-pink-l: #fce7f3;
--vsp-g50: #f8fafc;
--vsp-g100: #f1f5f9;
--vsp-g200: #e2e8f0;
--vsp-g500: #64748b;
--vsp-g700: #334155;
--vsp-g900: #0f172a;
display: block;
font-family:
'DM Sans',
system-ui,
-apple-system,
sans-serif;
color: var(--vsp-g900);
font-size: 13.5px;
}
.container {
width: 100%;
.vsp-root {
padding: 4px 4px 24px;
display: flex;
flex-direction: column;
gap: 14px;
}
.tab-container {
padding: 1%;
margin: 1%;
.vsp-hero {
background: linear-gradient(135deg, var(--vsp-navy) 0%, var(--vsp-blue) 100%);
border-radius: 14px;
padding: 22px 22px 22px 18px;
display: flex;
align-items: flex-start;
gap: 18px;
box-shadow:
0 10px 24px rgb(11 30 61 / 18%),
0 4px 10px rgb(11 30 61 / 12%);
color: #fff;
position: relative;
overflow: hidden;
}
.mat-h3 {
margin-top: 10px !important;
font-weight: 300;
color: $status-approved;
.vsp-hero::before {
content: '';
position: absolute;
top: -60px;
right: -60px;
width: 240px;
height: 240px;
border-radius: 50%;
background: radial-gradient(circle, rgb(255 255 255 / 8%) 0%, transparent 70%);
pointer-events: none;
}
.mat-elevation-z1 {
margin: 1em 0 1.5em;
.vsp-hero-left {
display: flex;
align-items: flex-start;
gap: 16px;
flex: 1;
min-width: 0;
}
.interestCarts {
float: right;
.vsp-hero-icon {
width: 56px;
height: 56px;
border-radius: 14px;
background: rgb(255 255 255 / 16%);
border: 1px solid rgb(255 255 255 / 22%);
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 24px;
flex-shrink: 0;
}
h2,
h3,
h4 {
margin: 0;
.vsp-hero-text {
flex: 1;
min-width: 0;
}
.vsp-hero-eyebrow {
font-size: 10.5px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
color: rgb(255 255 255 / 70%);
margin-bottom: 4px;
}
.vsp-hero-title {
margin: 0 0 10px;
font-size: 22px;
font-weight: 700;
letter-spacing: 0.01em;
color: #fff;
line-height: 1.2;
}
.vsp-hero-meta {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.vsp-hero-desc {
margin: 12px 0 0;
font-size: 13px;
color: rgb(255 255 255 / 82%);
line-height: 1.5;
max-width: 720px;
}
.vsp-edit-btn {
display: inline-flex;
align-items: center;
gap: 8px;
height: 38px;
padding: 0 16px;
border-radius: 10px;
background: rgb(255 255 255 / 14%);
color: #fff;
border: 1px solid rgb(255 255 255 / 28%);
font-size: 13px;
font-weight: 700;
letter-spacing: 0.02em;
cursor: pointer;
text-decoration: none;
white-space: nowrap;
font-family: inherit;
flex-shrink: 0;
transition: all 0.16s ease;
fa-icon {
font-size: 12px;
}
&:hover {
background: rgb(255 255 255 / 24%);
border-color: rgb(255 255 255 / 50%);
}
}
.vsp-pill {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 4px 10px;
border-radius: 999px;
font-family: inherit;
fa-icon {
font-size: 9.5px;
}
&--code {
background: rgb(255 255 255 / 18%);
color: #fff;
border: 1px solid rgb(255 255 255 / 24%);
font-family: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
}
&--teal {
background: var(--vsp-teal-l);
color: var(--vsp-teal);
border: 1px solid #99f6e4;
}
&--blue {
background: var(--vsp-blue-l);
color: var(--vsp-blue);
border: 1px solid #dbeafe;
}
&--green {
background: var(--vsp-green-l);
color: var(--vsp-green);
border: 1px solid #bbf7d0;
}
&--amber {
background: var(--vsp-amber-l);
color: var(--vsp-amber);
border: 1px solid #fde68a;
}
&--red {
background: var(--vsp-red-l);
color: var(--vsp-red);
border: 1px solid #fecaca;
}
&--gray {
background: var(--vsp-g100);
color: var(--vsp-g700);
border: 1px solid var(--vsp-g200);
}
}
.vsp-section {
background: #fff;
border: 1px solid var(--vsp-g200);
border-radius: 12px;
padding: 16px 20px;
box-shadow: 0 1px 2px rgb(15 23 42 / 4%);
}
.vsp-section-h {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 14px;
padding-bottom: 12px;
border-bottom: 1px dashed var(--vsp-g200);
h3 {
margin: 0;
font-size: 14px;
font-weight: 700;
color: var(--vsp-g900);
letter-spacing: 0.02em;
}
}
.vsp-section-ic {
width: 36px;
height: 36px;
border-radius: 10px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 14px;
flex-shrink: 0;
&--blue {
background: var(--vsp-blue-l);
color: var(--vsp-blue);
}
&--teal {
background: var(--vsp-teal-l);
color: var(--vsp-teal);
}
&--purple {
background: var(--vsp-purple-l);
color: var(--vsp-purple);
}
&--indigo {
background: var(--vsp-indigo-l);
color: var(--vsp-indigo);
}
&--amber {
background: var(--vsp-amber-l);
color: var(--vsp-amber);
}
&--green {
background: var(--vsp-green-l);
color: var(--vsp-green);
}
&--red {
background: var(--vsp-red-l);
color: var(--vsp-red);
}
&--pink {
background: var(--vsp-pink-l);
color: var(--vsp-pink);
}
}
.vsp-sub-h {
margin: 16px 0 10px;
font-size: 12px;
font-weight: 700;
color: var(--vsp-g700);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.vsp-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px 24px;
}
@media (width <=600px) {
.vsp-grid {
grid-template-columns: 1fr;
}
}
.vsp-kv {
display: flex;
flex-direction: column;
gap: 3px;
padding: 8px 0;
border-bottom: 1px dashed var(--vsp-g100);
&--span {
grid-column: 1 / -1;
}
}
.vsp-k {
font-size: 10.5px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--vsp-g500);
}
.vsp-v {
font-size: 13.5px;
color: var(--vsp-g900);
font-weight: 500;
word-break: break-word;
strong {
font-weight: 700;
}
}
table {
.vsp-v--accent {
font-size: 18px;
font-weight: 700;
color: var(--vsp-blue);
letter-spacing: 0.01em;
}
.vsp-suffix {
font-size: 12px;
font-weight: 600;
color: var(--vsp-g500);
margin-left: 4px;
}
.vsp-table-wrap {
overflow-x: auto;
border: 1px solid var(--vsp-g200);
border-radius: 10px;
margin-top: 4px;
}
/* ───────── CHART META PILLS ───────── */
.vsp-chart-meta {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 14px;
}
.vsp-chart-pill {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 12px;
font-weight: 600;
padding: 5px 12px;
border-radius: 8px;
background: var(--vsp-g100);
border: 1px solid var(--vsp-g200);
color: var(--vsp-g700);
fa-icon {
font-size: 11px;
color: var(--vsp-g500);
}
&--green {
background: var(--vsp-green-l);
border-color: #bbf7d0;
color: var(--vsp-green);
}
&--red {
background: var(--vsp-red-l);
border-color: #fecaca;
color: var(--vsp-red);
}
}
/* ───────── RATE BADGE ───────── */
.vsp-rate-badge {
display: inline-block;
font-size: 13px;
font-weight: 700;
color: var(--vsp-blue);
background: var(--vsp-blue-l);
border: 1px solid #dbeafe;
border-radius: 6px;
padding: 3px 10px;
letter-spacing: 0.02em;
}
/* ───────── CELL SUB TEXT ───────── */
.vsp-cell-sub {
display: block;
font-size: 10.5px;
color: var(--vsp-g500);
margin-top: 2px;
}
/* ───────── INCENTIVE EXPAND ───────── */
.vsp-incentive-btn {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 11.5px;
font-weight: 600;
padding: 5px 12px;
border-radius: 8px;
border: 1px solid var(--vsp-g200);
background: var(--vsp-g50);
color: var(--vsp-blue);
cursor: pointer;
font-family: inherit;
transition: all 0.14s ease;
fa-icon {
font-size: 11px;
}
&:hover {
background: var(--vsp-blue-l);
border-color: #dbeafe;
}
}
.vsp-incentive-cell {
padding: 0 !important;
}
.vsp-incentive-panel {
overflow: hidden;
padding: 0 14px;
background: var(--vsp-g50);
border-top: 1px dashed var(--vsp-g200);
}
.vsp-incentive-title {
margin: 12px 0 8px;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--vsp-g500);
}
.vsp-table {
width: 100%;
background: #fff;
th.mat-mdc-header-cell {
background: var(--vsp-g50);
color: var(--vsp-g700);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
padding: 11px 14px;
border-bottom: 1px solid var(--vsp-g200);
white-space: nowrap;
}
td.mat-mdc-cell {
padding: 10px 14px;
border-bottom: 1px solid var(--vsp-g100);
font-size: 12.5px;
color: var(--vsp-g900);
}
tbody tr:last-child td.mat-mdc-cell {
border-bottom: 0;
}
tbody tr:not(.incentives-row, .vsp-row-even) td.mat-mdc-cell {
background: #fff !important;
}
tbody tr.vsp-row-even td.mat-mdc-cell {
background: var(--vsp-g50) !important;
}
tr.incentives-row {
height: 0;
@@ -61,26 +524,5 @@ table {
.incentives {
overflow: hidden;
}
.mat-card {
border-radius: 0;
> h4 {
font-weight: 500;
margin: 0.5em 0 0;
}
}
}
}
span {
margin: 0.5em 0;
}
mat-divider {
margin: 0 0 0.5em;
}
.margin-t {
margin-top: 1em;
}
@@ -44,6 +44,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
],
imports: [
...STANDALONE_SHARED_IMPORTS,
RouterLink,
FaIconComponent,
MatDivider,
MatTable,
@@ -71,13 +72,23 @@ export class RecurringDepositGeneralTabComponent {
expandChartSlabIndex: number | null = null;
chartSlabsIncentivesDisplayedColumns: string[] = ['incentives'];
chartSlabsDisplayedColumns: string[] = [
'period',
'amountRange',
'annualInterestRate',
readonly chartSlabsBaseColumns = [
'srNo',
'description',
'actions'
'fromPeriod',
'toPeriod',
'periodTypeLabel',
'annualInterestRate'
];
get chartSlabsDisplayedColumns(): string[] {
const slabs = this.recurringDepositProduct?.activeChart?.chartSlabs || [];
const hasIncentives = slabs.some((s: any) => s.incentives?.length);
return hasIncentives ? [
...this.chartSlabsBaseColumns,
'actions'
] : this.chartSlabsBaseColumns;
}
incentivesDisplayedColumns: string[] = [
'entityType',
'attributeName',