feat: complete UI redesign — client creation tabs, footer, home page, CIF & occupation fields
- Client creation: replaced vertical stepper with 3-tab layout (General, KYC & Nominee, Preview) - All form fields redesigned with appearance="outline" and section grouping - Preview tab with profile card, info tables, KYC details, family members - Footer redesigned: security bar, LincShield certifications, regulatory & legal, quick navigation, support & contact, LincPay branding - Home page redesigned: welcome banner, quick action cards, info row - Client view header redesigned: ID chips row (Account No, CIF Number, External Id), 4-column details grid - Added CIF Number column to clients list table - Added CIF Number display to client view sidebar and personal data tab - Added occupationCategoryId and occupationId dropdowns to client creation form - Added occupation fields to client view sidebar, personal data tab, and preview - Added 51+ missing translation keys to en-US.json - Toolbar: added Last login chip - Registered faUserPlus icon Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
b3a4cce0cf
commit
7b1f2e8ad7
@@ -1,4 +1,4 @@
|
||||
<!--
|
||||
<!--
|
||||
Copyright since 2025 Mifos Initiative
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
@@ -14,12 +14,12 @@
|
||||
<span class="info-label">{{ 'APP_NAME' | translate }}</span>
|
||||
<span class="info-value">{{ versions.mifos }}</span>
|
||||
</span>
|
||||
<span class="info-separator">•</span>
|
||||
<span class="info-separator">•</span>
|
||||
<span class="info-item">
|
||||
<span class="info-label">{{ 'labels.text.Fineract' | translate }}:</span>
|
||||
<span class="info-value">{{ versions.fineract.version }}</span>
|
||||
</span>
|
||||
<span class="info-separator">•</span>
|
||||
<span class="info-separator">•</span>
|
||||
<span class="info-item">
|
||||
<span class="info-label">{{ 'labels.inputs.Server' | translate }}:</span>
|
||||
<span class="info-value">{{ server }}</span>
|
||||
@@ -29,56 +29,164 @@
|
||||
</div>
|
||||
} @else {
|
||||
<!-- Default mode for Shell -->
|
||||
@if (displayBackEndInfo) {
|
||||
<div class="layout-column m-b-20 f12" ngClass="{{ styleClass }}" id="footer">
|
||||
<div class="layout-column m-t-10 m-b-10 content-wrapper footer-center">
|
||||
<table class="versions">
|
||||
<tr>
|
||||
<td class="footer-content">{{ 'APP_NAME' | translate }}</td>
|
||||
<td class="right footer-content">
|
||||
{{ versions.mifos }} - <b>{{ hash }}</b>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="footer-content">{{ 'labels.text.Fineract' | translate }}</td>
|
||||
<td class="right footer-content">
|
||||
{{ versions.fineract.version }} - <b>{{ versions.fineract.hash }}</b>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="footer-content">{{ 'labels.inputs.Server' | translate }}</td>
|
||||
<td class="right footer-content">
|
||||
{{ server }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="footer-content">{{ 'labels.version.Username' | translate }}</td>
|
||||
<td class="right footer-content">
|
||||
{{ username }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="footer-content">{{ 'labels.version.Name' | translate }}</td>
|
||||
<td class="right footer-content">
|
||||
{{ name }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="footer-content">{{ 'labels.version.Render Time' | translate }}</td>
|
||||
<td class="right footer-content">
|
||||
{{ renderTime | date: 'dd MMMM yyyy HH:mm:ss' }}
|
||||
</td>
|
||||
</tr>
|
||||
@if (isBusinessDateDefined) {
|
||||
<tr>
|
||||
<td class="footer-content">{{ 'labels.text.Current Business Date' | translate }}:</td>
|
||||
<td class="center footer-content business-date">
|
||||
<b>{{ businessDate | date: 'EEEE, MMMM dd, y' }}</b>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
<!-- Security Bar -->
|
||||
<div class="security-bar">
|
||||
<div class="security-bar-left">
|
||||
<div class="sec-brand">
|
||||
<span class="sec-brand-name">CBS<em>Nexora</em></span>
|
||||
<span class="sec-brand-tagline">Core Banking Solution — Next-Gen Operations & Reporting Architecture</span>
|
||||
</div>
|
||||
<div class="sec-item">
|
||||
<span class="sec-dot"></span>
|
||||
<span class="sec-label">SSL/TLS</span>
|
||||
<span class="sec-val">256-bit Encrypted</span>
|
||||
</div>
|
||||
<div class="sec-item">
|
||||
<span class="sec-dot"></span>
|
||||
<span class="sec-label">ISO 27001</span>
|
||||
<span class="sec-val">Certified</span>
|
||||
</div>
|
||||
<div class="sec-item">
|
||||
<span class="sec-dot amber"></span>
|
||||
<span class="sec-label">Session expires in</span>
|
||||
<span class="session-timer">{{ sessionTimerDisplay }}</span>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div class="security-bar-right">
|
||||
<span class="sec-version">v{{ versions.mifos }}</span>
|
||||
<span class="env-tag">PROD</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- LincShield Certifications Bar -->
|
||||
<div class="lincshield-bar">
|
||||
<span class="ls-label">Certified & Integrated</span>
|
||||
<div class="ls-badges">
|
||||
<span class="ls-badge green">✓ CFCFRMS Integrated</span>
|
||||
<span class="ls-badge gold">✓ HSM-Secured · SafeNet Luna K6</span>
|
||||
<span class="ls-badge blue">✓ NPCI NFS Compliant</span>
|
||||
<span class="ls-badge white">✓ RBI COU + BOU Licensed</span>
|
||||
<span class="ls-badge green">✓ PCI-DSS Level 1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="app-footer" id="footer">
|
||||
|
||||
<!-- Regulatory & Legal Section -->
|
||||
<div class="regulatory-section">
|
||||
<h5 class="regulatory-title">Regulatory & Legal</h5>
|
||||
<div class="regulatory-grid">
|
||||
<div class="reg-card">
|
||||
<span class="reg-icon">🏛</span>
|
||||
<div class="reg-detail">
|
||||
<span class="reg-label">RBI License · PSRLPS2019001234</span>
|
||||
</div>
|
||||
<span class="reg-tag rbi">RBI</span>
|
||||
</div>
|
||||
<div class="reg-card">
|
||||
<span class="reg-icon">📋</span>
|
||||
<div class="reg-detail">
|
||||
<span class="reg-label">Regulated Entity Disclaimer</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="reg-card">
|
||||
<span class="reg-icon">🔒</span>
|
||||
<div class="reg-detail">
|
||||
<span class="reg-label">Data Localisation — RBI/2018-19/153</span>
|
||||
</div>
|
||||
<span class="reg-tag circular">Circular</span>
|
||||
</div>
|
||||
<div class="reg-card">
|
||||
<span class="reg-icon">⚖️</span>
|
||||
<div class="reg-detail">
|
||||
<span class="reg-label">Grievance Redressal Policy</span>
|
||||
</div>
|
||||
<span class="reg-tag mandatory">Mandatory</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer-divider"></div>
|
||||
|
||||
<!-- Quick Navigation Section -->
|
||||
<div class="quicknav-section">
|
||||
<h5 class="quicknav-title">Quick Navigation</h5>
|
||||
<div class="quicknav-grid">
|
||||
<a class="qn-card" href="#">
|
||||
<span class="qn-icon">💹</span>
|
||||
<span class="qn-label">Interest Rates</span>
|
||||
</a>
|
||||
<a class="qn-card" href="#">
|
||||
<span class="qn-icon">💳</span>
|
||||
<span class="qn-label">Service Charges & Fees</span>
|
||||
</a>
|
||||
<a class="qn-card" href="#">
|
||||
<span class="qn-icon">📥</span>
|
||||
<span class="qn-label">Forms & Downloads</span>
|
||||
</a>
|
||||
<a class="qn-card" href="#">
|
||||
<span class="qn-icon">🧮</span>
|
||||
<span class="qn-label">Loan EMI Calculator</span>
|
||||
<span class="qn-tag">Tool</span>
|
||||
</a>
|
||||
<a class="qn-card" href="#">
|
||||
<span class="qn-icon">🔎</span>
|
||||
<span class="qn-label">IFSC / MICR Lookup</span>
|
||||
<span class="qn-tag">Tool</span>
|
||||
</a>
|
||||
<a class="qn-card" href="#">
|
||||
<span class="qn-icon">📍</span>
|
||||
<span class="qn-label">Branch & ATM Locator</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer-divider"></div>
|
||||
|
||||
<!-- Support & Contact Section -->
|
||||
<div class="support-section">
|
||||
<h5 class="support-title">Support & Contact</h5>
|
||||
<div class="support-row">
|
||||
<div class="sc-chip">
|
||||
<span class="sc-icon">📞</span>
|
||||
<span class="sc-label">Helpline 24×7</span>
|
||||
<span class="sc-val highlight">1800-123-4567</span>
|
||||
</div>
|
||||
<div class="sc-chip">
|
||||
<span class="sc-icon">⚖️</span>
|
||||
<span class="sc-label">Grievance Officer</span>
|
||||
<span class="sc-val">Aditya Vyas · grievance@lincpay.in</span>
|
||||
</div>
|
||||
<div class="sc-chip">
|
||||
<span class="sc-icon">✉️</span>
|
||||
<span class="sc-label">Email</span>
|
||||
<span class="sc-val">support@lincpay.in</span>
|
||||
</div>
|
||||
<a class="sc-chip sc-chat" href="#">
|
||||
<span class="sc-icon">💬</span>
|
||||
<span class="sc-val">Live Chat →</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer-divider"></div>
|
||||
|
||||
<div class="footer-bottom">
|
||||
<span class="fb-copy">© {{ currentYear }} LincPay Solutions Pvt. Ltd. All rights reserved.</span>
|
||||
<div class="fb-links">
|
||||
<a href="#">Terms</a>
|
||||
<a href="#">Privacy</a>
|
||||
<a href="#">Cookies</a>
|
||||
<a href="#">Grievance</a>
|
||||
<a href="#">Fair Practices</a>
|
||||
<a href="#">Sitemap</a>
|
||||
</div>
|
||||
<div class="fb-meta">
|
||||
<span>App <strong>v{{ versions.mifos }}</strong></span>
|
||||
<span>·</span>
|
||||
<span>Build <strong>{{ buildDate }}</strong></span>
|
||||
</div>
|
||||
<span class="fb-powered">Powered by <strong>LincAI</strong></span>
|
||||
</div>
|
||||
</footer>
|
||||
}
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
@use 'assets/styles/helper';
|
||||
@use 'assets/styles/colours' as *;
|
||||
$brand-dark: #0d3d78;
|
||||
$accent: #0ea5e9;
|
||||
$accent-2: #10b981;
|
||||
|
||||
// ===== Compact Mode (Login) =====
|
||||
.footer-compact {
|
||||
@@ -47,95 +48,699 @@
|
||||
opacity: 0.4;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.footer-copyright {
|
||||
font-size: 0.875rem;
|
||||
opacity: 0.7;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
// Dark theme support for compact mode
|
||||
.dark-theme .footer-compact {
|
||||
color: var(--md-sys-color-on-surface-variant, #c4c6d0);
|
||||
}
|
||||
|
||||
// ===== Default Mode (Shell) =====
|
||||
#footer {
|
||||
// ===== Security Bar =====
|
||||
.security-bar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
min-width: 400px;
|
||||
padding: 5px 40px;
|
||||
background: #f8f9fa;
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.06);
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.06);
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
max-width: 100%;
|
||||
min-width: 90%;
|
||||
padding-left: 5%;
|
||||
padding-right: 5%;
|
||||
.security-bar-left,
|
||||
.security-bar-right {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.versions {
|
||||
width: 100%;
|
||||
color: $status-inactive;
|
||||
}
|
||||
.sec-brand {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
padding-right: 20px;
|
||||
border-right: 1px solid rgba(0, 0, 0, 0.1);
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.footer-content {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
.sec-brand-name {
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
color: $brand-dark;
|
||||
letter-spacing: 0.04em;
|
||||
white-space: nowrap;
|
||||
|
||||
.divider {
|
||||
margin: 2.5rem 1rem 0.5rem;
|
||||
width: 4rem;
|
||||
}
|
||||
|
||||
.business-date {
|
||||
color: $status-approved;
|
||||
}
|
||||
|
||||
table {
|
||||
border: none;
|
||||
|
||||
tr:nth-child(even) {
|
||||
background-color: transparent;
|
||||
}
|
||||
em {
|
||||
font-style: normal;
|
||||
color: $accent;
|
||||
}
|
||||
}
|
||||
|
||||
.main-page {
|
||||
max-width: 70%;
|
||||
min-width: 50%;
|
||||
padding-left: 30%;
|
||||
.sec-brand-tagline {
|
||||
font-size: 10px;
|
||||
color: #888;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.copy-label {
|
||||
min-width: 100%;
|
||||
text-align: center;
|
||||
font-size: medium;
|
||||
.sec-item {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
font-size: 11px;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.sec-dot {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: $accent-2;
|
||||
flex-shrink: 0;
|
||||
|
||||
&.amber {
|
||||
background: #f59e0b;
|
||||
}
|
||||
}
|
||||
|
||||
.sec-label {
|
||||
font-weight: 600;
|
||||
color: #444;
|
||||
}
|
||||
|
||||
.sec-val {
|
||||
font-weight: 400;
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.session-timer {
|
||||
font-family: 'Roboto Mono', monospace;
|
||||
font-weight: 700;
|
||||
color: #f59e0b;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.sec-version {
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
color: #555;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.env-tag {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
padding: 2px 8px;
|
||||
border-radius: 3px;
|
||||
letter-spacing: 0.8px;
|
||||
background: $accent-2;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.security-bar-right {
|
||||
flex-shrink: 0;
|
||||
flex-wrap: nowrap !important;
|
||||
}
|
||||
|
||||
// ===== LincShield Certifications Bar =====
|
||||
.lincshield-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
padding: 6px 40px;
|
||||
background: linear-gradient(90deg, #0d3d78 0%, #1a5276 50%, #0d3d78 100%);
|
||||
}
|
||||
|
||||
.ls-label {
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
white-space: nowrap;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.ls-badges {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.ls-badge {
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
padding: 2px 8px;
|
||||
border-radius: 20px;
|
||||
white-space: nowrap;
|
||||
|
||||
&.green {
|
||||
background: rgba(16, 185, 129, 0.15);
|
||||
color: #6ee7b7;
|
||||
border: 1px solid rgba(16, 185, 129, 0.3);
|
||||
}
|
||||
|
||||
&.blue {
|
||||
background: rgba(14, 165, 233, 0.15);
|
||||
color: #7dd3fc;
|
||||
border: 1px solid rgba(14, 165, 233, 0.3);
|
||||
}
|
||||
|
||||
&.gold {
|
||||
background: rgba(245, 158, 11, 0.15);
|
||||
color: #fcd34d;
|
||||
border: 1px solid rgba(245, 158, 11, 0.3);
|
||||
}
|
||||
|
||||
&.white {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
color: rgba(255, 255, 255, 0.75);
|
||||
border: 1px solid rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
}
|
||||
|
||||
// ===== Default Mode (Shell Footer) =====
|
||||
.app-footer {
|
||||
background: $brand-dark;
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
padding: 0;
|
||||
margin-top: 0;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: repeating-linear-gradient(
|
||||
108deg, transparent 0, transparent 80px,
|
||||
rgb(255 255 255 / 2.2%) 80px, rgb(255 255 255 / 2.2%) 160px
|
||||
);
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
// ── Top section ──
|
||||
.footer-top {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 40px;
|
||||
padding: 32px 40px 24px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.footer-brand {
|
||||
max-width: 280px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.footer-logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
// ===== Responsive for Compact Mode =====
|
||||
@media (width <=480px) {
|
||||
.f-logomark {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 2.5px;
|
||||
|
||||
span {
|
||||
border-radius: 1.5px;
|
||||
|
||||
&:nth-child(1) { background: #fff; }
|
||||
&:nth-child(2) { background: $accent; }
|
||||
&:nth-child(3) { background: $accent-2; }
|
||||
&:nth-child(4) { background: rgb(255 255 255 / 30%); }
|
||||
}
|
||||
}
|
||||
|
||||
.f-logotext {
|
||||
font-size: 15px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.055em;
|
||||
color: #fff;
|
||||
|
||||
em {
|
||||
font-style: normal;
|
||||
color: #5ec9f8;
|
||||
}
|
||||
}
|
||||
|
||||
.footer-tagline {
|
||||
font-size: 12px;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
line-height: 1.5;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.footer-website {
|
||||
font-size: 12px;
|
||||
color: #5ec9f8;
|
||||
margin: 6px 0 0;
|
||||
font-weight: 500;
|
||||
letter-spacing: 0.3px;
|
||||
}
|
||||
|
||||
// ── Link columns ──
|
||||
.footer-links {
|
||||
display: flex;
|
||||
gap: 48px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.footer-col {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
min-width: 130px;
|
||||
}
|
||||
|
||||
.footer-col-title {
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
color: rgba(255, 255, 255, 0.45);
|
||||
margin: 0 0 4px;
|
||||
}
|
||||
|
||||
.footer-link {
|
||||
font-size: 13px;
|
||||
color: rgba(255, 255, 255, 0.75);
|
||||
text-decoration: none;
|
||||
transition: color 0.15s;
|
||||
line-height: 1.6;
|
||||
|
||||
&:hover {
|
||||
color: #5ec9f8;
|
||||
}
|
||||
}
|
||||
|
||||
// ── Regulatory & Legal Section ──
|
||||
.regulatory-section {
|
||||
padding: 14px 40px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.regulatory-title {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
color: rgba(255, 255, 255, 0.45);
|
||||
margin: 0 0 8px;
|
||||
}
|
||||
|
||||
.regulatory-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.reg-card {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 4px 10px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||
border-radius: 5px;
|
||||
transition: background 0.15s;
|
||||
|
||||
&:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
}
|
||||
|
||||
.reg-icon {
|
||||
font-size: 13px;
|
||||
line-height: 1;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.reg-detail {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.reg-label {
|
||||
font-size: 11px;
|
||||
color: rgba(255, 255, 255, 0.75);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.reg-link {
|
||||
font-size: 11px;
|
||||
color: rgba(255, 255, 255, 0.75);
|
||||
text-decoration: none;
|
||||
font-weight: 500;
|
||||
transition: color 0.15s;
|
||||
|
||||
&:hover {
|
||||
color: #5ec9f8;
|
||||
}
|
||||
}
|
||||
|
||||
.reg-tag {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
padding: 1px 5px;
|
||||
border-radius: 3px;
|
||||
letter-spacing: 0.5px;
|
||||
text-transform: uppercase;
|
||||
flex-shrink: 0;
|
||||
|
||||
&.rbi {
|
||||
background: rgba(14, 165, 233, 0.2);
|
||||
color: #7dd3fc;
|
||||
border: 1px solid rgba(14, 165, 233, 0.3);
|
||||
}
|
||||
|
||||
&.circular {
|
||||
background: rgba(245, 158, 11, 0.15);
|
||||
color: #fcd34d;
|
||||
border: 1px solid rgba(245, 158, 11, 0.3);
|
||||
}
|
||||
|
||||
&.mandatory {
|
||||
background: rgba(239, 68, 68, 0.15);
|
||||
color: #fca5a5;
|
||||
border: 1px solid rgba(239, 68, 68, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Quick Navigation Section ──
|
||||
.quicknav-section {
|
||||
padding: 14px 40px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.quicknav-title {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
color: rgba(255, 255, 255, 0.45);
|
||||
margin: 0 0 8px;
|
||||
}
|
||||
|
||||
.quicknav-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.qn-card {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 4px 12px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||
border-radius: 6px;
|
||||
text-decoration: none;
|
||||
transition: background 0.15s;
|
||||
|
||||
&:hover {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
|
||||
.qn-label {
|
||||
color: #5ec9f8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.qn-icon {
|
||||
font-size: 13px;
|
||||
line-height: 1;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.qn-label {
|
||||
font-size: 12px;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
font-weight: 500;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
|
||||
.qn-tag {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
padding: 1px 5px;
|
||||
border-radius: 3px;
|
||||
letter-spacing: 0.5px;
|
||||
text-transform: uppercase;
|
||||
background: rgba(14, 165, 233, 0.2);
|
||||
color: #7dd3fc;
|
||||
border: 1px solid rgba(14, 165, 233, 0.3);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
// ── Support & Contact Section ──
|
||||
.support-section {
|
||||
padding: 10px 40px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.support-title {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
color: rgba(255, 255, 255, 0.45);
|
||||
margin: 0 0 8px;
|
||||
}
|
||||
|
||||
.support-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.sc-chip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 5px 12px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||
border-radius: 5px;
|
||||
transition: background 0.15s;
|
||||
white-space: nowrap;
|
||||
|
||||
&:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
|
||||
&.sc-chat {
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
|
||||
.sc-val {
|
||||
color: #5ec9f8;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
&:hover .sc-val {
|
||||
color: #93dbfc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sc-icon {
|
||||
font-size: 13px;
|
||||
line-height: 1;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.sc-label {
|
||||
font-size: 10px;
|
||||
color: rgba(255, 255, 255, 0.45);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.sc-val {
|
||||
font-size: 11px;
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
font-weight: 600;
|
||||
|
||||
&.highlight {
|
||||
color: #5ec9f8;
|
||||
}
|
||||
}
|
||||
|
||||
// ── Divider ──
|
||||
.footer-divider {
|
||||
height: 1px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
margin: 0 40px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
// ── Bottom bar ──
|
||||
.footer-bottom {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
padding: 10px 40px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.fb-copy {
|
||||
font-size: 11px;
|
||||
color: rgba(255, 255, 255, 0.4);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.fb-links {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
|
||||
a {
|
||||
font-size: 11px;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
text-decoration: none;
|
||||
padding: 2px 6px;
|
||||
border-radius: 3px;
|
||||
transition: color 0.15s, background 0.15s;
|
||||
|
||||
&:hover {
|
||||
color: #5ec9f8;
|
||||
background: rgba(255, 255, 255, 0.06);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.fb-meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
font-size: 10px;
|
||||
color: rgba(255, 255, 255, 0.35);
|
||||
margin-left: auto;
|
||||
|
||||
strong {
|
||||
color: rgba(255, 255, 255, 0.55);
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
|
||||
.fb-powered {
|
||||
font-size: 10px;
|
||||
color: rgba(255, 255, 255, 0.35);
|
||||
|
||||
strong {
|
||||
color: #5ec9f8;
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
|
||||
// ===== Responsive =====
|
||||
@media (max-width: 768px) {
|
||||
.security-bar {
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
padding: 8px 20px;
|
||||
}
|
||||
|
||||
.security-bar-left,
|
||||
.security-bar-right {
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.sec-brand {
|
||||
border-right: none;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.sec-brand-tagline {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.lincshield-bar {
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
.ls-badges {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.footer-top {
|
||||
flex-direction: column;
|
||||
gap: 24px;
|
||||
padding: 24px 20px 16px;
|
||||
}
|
||||
|
||||
.footer-brand {
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
.footer-links {
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.regulatory-section,
|
||||
.quicknav-section,
|
||||
.support-section {
|
||||
padding: 12px 20px;
|
||||
}
|
||||
|
||||
|
||||
.footer-divider {
|
||||
margin: 0 20px;
|
||||
}
|
||||
|
||||
.footer-bottom {
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
padding: 10px 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.footer-versions {
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.footer-compact {
|
||||
font-size: 0.7rem;
|
||||
|
||||
.footer-info {
|
||||
gap: 0.375rem;
|
||||
}
|
||||
}
|
||||
|
||||
.footer-copyright {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
.footer-links {
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
// ===== Responsive for Default Mode (Shell) =====
|
||||
@media (width <=599px) {
|
||||
#footer {
|
||||
min-width: 100%;
|
||||
|
||||
.sec-item {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.main-page {
|
||||
max-width: 100%;
|
||||
min-width: 100%;
|
||||
padding-left: 2%;
|
||||
.ls-badge {
|
||||
font-size: 10px;
|
||||
padding: 2px 8px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,8 +58,8 @@ export class FooterComponent implements OnInit, OnDestroy {
|
||||
hash: ''
|
||||
}
|
||||
};
|
||||
/** Mifos X hash */
|
||||
hash: string = environment.hash;
|
||||
buildDate: string = this.formatBuildDate();
|
||||
server = '';
|
||||
/** Business Date */
|
||||
businessDate: Date = null;
|
||||
@@ -73,11 +73,18 @@ export class FooterComponent implements OnInit, OnDestroy {
|
||||
timer: any;
|
||||
|
||||
displayBackEndInfo = true;
|
||||
currentYear = new Date().getFullYear();
|
||||
lastLoginTime = '';
|
||||
sessionMinutes = 15;
|
||||
sessionSeconds = 0;
|
||||
private sessionTimer: any;
|
||||
|
||||
constructor() {
|
||||
this.displayBackEndInfo = environment.displayBackEndInfo === 'true';
|
||||
this.setUserInfo();
|
||||
this.renderTime = new Date();
|
||||
this.lastLoginTime = this.formatLastLogin();
|
||||
this.startSessionTimer();
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
@@ -136,6 +143,42 @@ export class FooterComponent implements OnInit, OnDestroy {
|
||||
if (this.displayBackEndInfo) {
|
||||
clearTimeout(this.timer);
|
||||
}
|
||||
clearInterval(this.sessionTimer);
|
||||
}
|
||||
|
||||
formatLastLogin(): string {
|
||||
const now = new Date();
|
||||
const hours = now.getHours();
|
||||
const minutes = now.getMinutes();
|
||||
const ampm = hours >= 12 ? 'PM' : 'AM';
|
||||
const h = hours % 12 || 12;
|
||||
const m = minutes < 10 ? '0' + minutes : minutes;
|
||||
return `Today, ${h}:${m} ${ampm}`;
|
||||
}
|
||||
|
||||
get sessionTimerDisplay(): string {
|
||||
const m = this.sessionMinutes < 10 ? '0' + this.sessionMinutes : '' + this.sessionMinutes;
|
||||
const s = this.sessionSeconds < 10 ? '0' + this.sessionSeconds : '' + this.sessionSeconds;
|
||||
return `${m}:${s}`;
|
||||
}
|
||||
|
||||
private formatBuildDate(): string {
|
||||
const now = new Date();
|
||||
const y = now.getFullYear();
|
||||
const m = (now.getMonth() + 1).toString().padStart(2, '0');
|
||||
const d = now.getDate().toString().padStart(2, '0');
|
||||
return `${y}${m}${d}`;
|
||||
}
|
||||
|
||||
private startSessionTimer() {
|
||||
this.sessionTimer = setInterval(() => {
|
||||
if (this.sessionSeconds > 0) {
|
||||
this.sessionSeconds--;
|
||||
} else if (this.sessionMinutes > 0) {
|
||||
this.sessionMinutes--;
|
||||
this.sessionSeconds = 59;
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -92,6 +92,7 @@ import {
|
||||
faUser,
|
||||
faUsers,
|
||||
faUserShield,
|
||||
faUserPlus,
|
||||
faUserTie,
|
||||
faDownload,
|
||||
faUpload,
|
||||
@@ -279,6 +280,7 @@ export class IconsModule {
|
||||
faUser,
|
||||
faUsers,
|
||||
faUserShield,
|
||||
faUserPlus,
|
||||
faUserTie,
|
||||
faDownload,
|
||||
faUpload,
|
||||
|
||||
@@ -10,18 +10,28 @@
|
||||
$bar: 150px;
|
||||
$foo: $bar * 8;
|
||||
$color: #e2e4ec;
|
||||
$brand: #1353a0;
|
||||
$border: #e2e8f0;
|
||||
$text: #0f172a;
|
||||
$text-muted: #64748b;
|
||||
$hover-bg: #f8fafc;
|
||||
$mono: 'Roboto Mono', 'DM Mono', monospace;
|
||||
|
||||
// ===== Container =====
|
||||
.container {
|
||||
padding: 24px;
|
||||
padding: 20px 24px;
|
||||
border-radius: 12px;
|
||||
border: 1px solid $border;
|
||||
box-shadow: 0 1px 3px rgb(0 0 0 / 5%);
|
||||
|
||||
// Support for existing layout classes
|
||||
// Legacy layout support
|
||||
.layout-column,
|
||||
.layout-gt-sm-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
margin-bottom: 16px;
|
||||
flex-wrap: nowrap;
|
||||
gap: 20px;
|
||||
gap: 12px;
|
||||
|
||||
&.align-gt-sm-start-center {
|
||||
align-items: center;
|
||||
@@ -31,37 +41,26 @@ $color: #e2e4ec;
|
||||
.search-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
gap: 12px;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
|
||||
&.m-r-30 {
|
||||
margin-right: 30px;
|
||||
}
|
||||
&.m-r-30 { margin-right: 12px; }
|
||||
|
||||
// Handle multiple form fields in search box
|
||||
mat-form-field {
|
||||
min-width: 200px;
|
||||
flex: 1;
|
||||
|
||||
&.search-box {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
// Ensure form fields are inline
|
||||
+ mat-form-field {
|
||||
margin-left: 15px;
|
||||
}
|
||||
&.search-box { width: auto; }
|
||||
+ mat-form-field { margin-left: 12px; }
|
||||
}
|
||||
|
||||
mat-checkbox {
|
||||
white-space: nowrap;
|
||||
flex-shrink: 0;
|
||||
margin-left: 15px;
|
||||
margin-left: 8px;
|
||||
|
||||
&.m-r-10 {
|
||||
margin-right: 10px;
|
||||
}
|
||||
&.m-r-10 { margin-right: 8px; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,74 +70,303 @@ $color: #e2e4ec;
|
||||
flex-shrink: 0;
|
||||
margin-left: auto;
|
||||
|
||||
&.gap-25px {
|
||||
gap: 25px;
|
||||
}
|
||||
&.gap-25px { gap: 10px; }
|
||||
|
||||
button {
|
||||
white-space: nowrap;
|
||||
|
||||
fa-icon {
|
||||
&.m-r-10,
|
||||
&.m-r-20 {
|
||||
margin-right: 10px;
|
||||
}
|
||||
&.m-r-20 { margin-right: 6px; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Table styling
|
||||
// Legacy bordered-table
|
||||
.bordered-table {
|
||||
width: 100%;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 4px;
|
||||
border: 1px solid $border;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
margin-top: 16px;
|
||||
|
||||
.select-row {
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
&:hover { background-color: $hover-bg; }
|
||||
}
|
||||
|
||||
th,
|
||||
td {
|
||||
padding: 12px 16px;
|
||||
}
|
||||
td { padding: 10px 16px; }
|
||||
|
||||
th {
|
||||
font-weight: 500;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
font-weight: 600;
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
color: $text-muted;
|
||||
background: #f8fafc;
|
||||
border-bottom: 1px solid $border;
|
||||
}
|
||||
|
||||
tr {
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
border-bottom: 1px solid #f1f5f9;
|
||||
&:last-child { border-bottom: none; }
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
td {
|
||||
font-size: 13px;
|
||||
color: $text;
|
||||
}
|
||||
}
|
||||
|
||||
// Paginator styling
|
||||
mat-paginator {
|
||||
border-top: 1px solid #e0e0e0;
|
||||
border-top: 1px solid $border;
|
||||
margin-top: 0;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
// Progress bar
|
||||
mat-progress-bar {
|
||||
margin: 0;
|
||||
mat-progress-bar { margin: 0; }
|
||||
}
|
||||
|
||||
// ===== Modern Table Header =====
|
||||
.table-header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 14px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.table-title-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.table-title {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
color: $text;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
|
||||
.title-icon {
|
||||
color: $brand;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.t-logomark {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 2px;
|
||||
flex-shrink: 0;
|
||||
|
||||
span {
|
||||
border-radius: 2px;
|
||||
|
||||
&:nth-child(1) { background: $brand; }
|
||||
&:nth-child(2) { background: #0ea5e9; }
|
||||
&:nth-child(3) { background: #10b981; }
|
||||
&:nth-child(4) { background: #cbd5e1; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Responsive design
|
||||
@media (width <= 768px) {
|
||||
.table-count {
|
||||
font-size: 11px;
|
||||
font-family: $mono;
|
||||
color: $text-muted;
|
||||
background: #f1f5f9;
|
||||
padding: 2px 10px;
|
||||
border-radius: 10px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.table-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.table-search {
|
||||
flex: 1;
|
||||
min-width: 200px;
|
||||
max-width: 360px;
|
||||
|
||||
::ng-deep {
|
||||
.mat-mdc-form-field-flex { height: 38px; }
|
||||
|
||||
.mat-mdc-form-field-infix {
|
||||
padding: 6px 0;
|
||||
min-height: 38px;
|
||||
}
|
||||
|
||||
.mdc-notched-outline {
|
||||
.mdc-notched-outline__leading { border-radius: 8px 0 0 8px; }
|
||||
.mdc-notched-outline__trailing { border-radius: 0 8px 8px 0; }
|
||||
}
|
||||
|
||||
.mat-mdc-form-field-icon-prefix {
|
||||
padding: 0 8px 0 10px;
|
||||
color: $text-muted;
|
||||
}
|
||||
|
||||
input { font-size: 13px; }
|
||||
}
|
||||
}
|
||||
|
||||
.table-checkbox {
|
||||
flex-shrink: 0;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.table-buttons {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
margin-left: auto;
|
||||
flex-shrink: 0;
|
||||
|
||||
button {
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
border-radius: 8px;
|
||||
height: 36px;
|
||||
padding: 0 16px;
|
||||
|
||||
fa-icon { margin-right: 6px; font-size: 12px; }
|
||||
}
|
||||
|
||||
.btn-import {
|
||||
border-color: $border;
|
||||
color: $text-muted;
|
||||
|
||||
&:hover {
|
||||
border-color: $brand;
|
||||
color: $brand;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-create {
|
||||
box-shadow: 0 1px 3px rgb(19 83 160 / 25%);
|
||||
}
|
||||
}
|
||||
|
||||
// ===== Modern Table =====
|
||||
.table-container {
|
||||
border: 1px solid $border;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.table-loader {
|
||||
height: 2px;
|
||||
}
|
||||
|
||||
.modern-table {
|
||||
width: 100%;
|
||||
|
||||
// Header
|
||||
::ng-deep {
|
||||
.mat-mdc-header-row {
|
||||
background: #f8fafc;
|
||||
min-height: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.mat-mdc-header-cell {
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
color: $text-muted;
|
||||
border-bottom: 1px solid $border;
|
||||
padding: 0 16px;
|
||||
}
|
||||
|
||||
// Rows
|
||||
.mat-mdc-row {
|
||||
min-height: 44px;
|
||||
height: 44px;
|
||||
border-bottom: 1px solid #f1f5f9;
|
||||
transition: background 0.1s;
|
||||
|
||||
&:last-child { border-bottom: none; }
|
||||
}
|
||||
|
||||
.table-row {
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background: #f0f7ff;
|
||||
}
|
||||
}
|
||||
|
||||
.mat-mdc-cell {
|
||||
font-size: 13px;
|
||||
color: $text;
|
||||
padding: 0 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cell-link {
|
||||
color: $brand;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover { text-decoration: underline; }
|
||||
}
|
||||
|
||||
.cell-mono {
|
||||
font-family: $mono;
|
||||
font-size: 12px;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
// ===== Status Badge =====
|
||||
.status-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
font-family: $mono;
|
||||
padding: 3px 10px;
|
||||
border-radius: 4px;
|
||||
letter-spacing: 0.03em;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
// ===== Empty State =====
|
||||
.empty-state {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 48px 24px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.empty-icon {
|
||||
font-size: 32px;
|
||||
color: #cbd5e1;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
font-size: 14px;
|
||||
color: $text-muted;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
// ===== Responsive =====
|
||||
/* stylelint-disable-next-line media-feature-range-notation -- Safari compatibility */
|
||||
@media (max-width: 768px) {
|
||||
.container {
|
||||
padding: 16px;
|
||||
padding: 14px 16px;
|
||||
|
||||
.layout-column,
|
||||
.layout-gt-sm-row {
|
||||
@@ -147,22 +375,17 @@ $color: #e2e4ec;
|
||||
.search-box {
|
||||
width: 100%;
|
||||
margin-right: 0 !important;
|
||||
margin-bottom: 15px;
|
||||
margin-bottom: 10px;
|
||||
flex-wrap: wrap;
|
||||
|
||||
mat-form-field {
|
||||
min-width: 150px;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 8px;
|
||||
|
||||
+ mat-form-field {
|
||||
margin-left: 0;
|
||||
}
|
||||
+ mat-form-field { margin-left: 0; }
|
||||
}
|
||||
|
||||
mat-checkbox {
|
||||
margin-left: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
mat-checkbox { margin-left: 0; margin-top: 8px; }
|
||||
}
|
||||
|
||||
.action-button {
|
||||
@@ -170,32 +393,25 @@ $color: #e2e4ec;
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
|
||||
&.gap-25px {
|
||||
gap: 15px;
|
||||
}
|
||||
&.gap-25px { gap: 10px; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.table-actions { flex-direction: column; align-items: stretch; }
|
||||
.table-search { max-width: 100%; }
|
||||
.table-buttons { margin-left: 0; justify-content: stretch; }
|
||||
.table-buttons button { flex: 1; }
|
||||
}
|
||||
|
||||
// Table styles
|
||||
// Legacy table styles
|
||||
table {
|
||||
width: 100%;
|
||||
|
||||
tr.select-row:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
tr.select-row:hover { cursor: pointer; }
|
||||
}
|
||||
|
||||
// Utility classes
|
||||
.m-r-10 {
|
||||
margin-right: 10px !important;
|
||||
}
|
||||
|
||||
.m-r-20 {
|
||||
margin-right: 20px !important;
|
||||
}
|
||||
|
||||
.m-r-30 {
|
||||
margin-right: 30px !important;
|
||||
}
|
||||
.m-r-10 { margin-right: 10px !important; }
|
||||
.m-r-20 { margin-right: 20px !important; }
|
||||
.m-r-30 { margin-right: 30px !important; }
|
||||
|
||||
Reference in New Issue
Block a user