feat: KYC re-verify UX, family/nominee tab gating, savings dialogs, cfcfrms shell

- KYC tab: fix Verify (PAN) and Send OTP (Aadhaar) being disabled in edit mode;
  unmask Aadhaar input and show on-file masked value as hint; resolve kycId
  from id/kycId/resourceId fallbacks.
- Client stepper/view: add familyAllowed / nomineeAllowed predicates +
  CanActivate route guards. Family tab hidden for non-individuals, Nominee
  tab hidden for non-proprietor entities. Family-members step accepts a
  nomineeOnly input for proprietorship clients. Add/Edit/Delete buttons
  inside family-members and nominee tabs gated by canAdd.
- cfcfrms: add cfcfrms-shell wrapper, restyle complaint/fraud/mule/escalate
  pages and dashboard.
- Savings: identity-verify and transaction-confirm dialogs, manage / activate
  / add-charge flows, account preview styling.
- Tasks, core shell, account-nominees, icons: minor style and behaviour
  updates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-05-21 18:49:43 +05:30
co-authored by Claude Opus 4.7
parent bf3e26a0d0
commit b149fef72e
99 changed files with 8575 additions and 2574 deletions
@@ -7,11 +7,6 @@
-->
<div class="escalate-page">
<div class="page-header">
<h2>{{ 'labels.menus.Escalate Complaint' | translate }}</h2>
<p class="subtitle">{{ 'labels.text.Forward complaint to the next bank in the transaction chain' | translate }}</p>
</div>
<div class="escalate-layout">
<!-- Escalation Form -->
<mat-card class="escalate-card">
+69 -137
View File
@@ -6,206 +6,138 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
@use '../cfc-form' as *;
.escalate-page {
padding: 24px;
/* Wrapper hero already handles outer padding. */
padding: 0;
max-width: 1200px;
margin: 0 auto;
}
.page-header {
margin-bottom: 24px;
h2 {
margin: 0;
font-size: 24px;
font-weight: 700;
color: #0d1b2a;
}
.subtitle {
margin: 4px 0 0;
color: #64748b;
font-size: 14px;
}
}
.escalate-layout {
display: grid;
grid-template-columns: 1fr 360px;
gap: 24px;
grid-template-columns: minmax(0, 1fr) 360px;
gap: 16px;
align-items: start;
@media (width <= 1280px) {
grid-template-columns: 1fr;
}
}
.escalate-card,
.instructions-card {
border-radius: 8px !important;
mat-card-header {
padding: 16px 20px 0;
}
mat-card-content {
padding: 16px 20px 20px !important;
}
}
.ticket-lookup-row {
display: flex;
gap: 12px;
align-items: flex-start;
.ticket-field {
flex: 1;
}
.lookup-btn {
margin-top: 4px;
height: 56px;
@media (width <= 1100px) {
grid-template-columns: minmax(0, 1fr);
}
}
.lookup-result {
background: #f0f9ff;
border: 1px solid #bae6fd;
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
background: #eff6ff;
border: 1px solid #bfdbfe;
border-radius: 12px;
padding: 14px 16px;
margin-bottom: 18px;
.lookup-row {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 0;
font-size: 14px;
gap: 10px;
padding: 5px 0;
font-size: 13px;
span {
color: #64748b;
color: #475569;
}
strong {
color: #0d1b2a;
font-weight: 700;
&.mono {
font-family: 'JetBrains Mono', 'Courier New', monospace;
font-size: 12.5px;
color: #1e40af;
}
}
}
}
.full-width {
width: 100%;
}
.submit-btn {
margin-top: 8px;
height: 44px;
}
.inline-spinner {
display: inline-block;
}
.mr-05 {
margin-right: 4px;
}
.mt-16 {
margin-top: 16px;
}
.mono {
font-family: 'Courier New', monospace;
}
// Success result
.success-result {
text-align: center;
padding: 24px 0;
.success-icon {
color: #10b981;
margin-bottom: 12px;
}
h3 {
margin: 0 0 20px;
color: #065f46;
font-size: 20px;
/* ─── Instructions side panel ───────────────────────────────────────── */
.instructions-card {
::ng-deep .mat-mdc-card-content {
padding: 18px !important;
}
}
.result-details {
text-align: left;
background: #f0fdf4;
border: 1px solid #bbf7d0;
border-radius: 8px;
padding: 16px;
.result-row {
display: flex;
justify-content: space-between;
padding: 6px 0;
font-size: 14px;
.result-label {
color: #64748b;
}
.result-value {
font-weight: 600;
color: #1e293b;
}
}
}
// Instructions card
.guidelines {
margin-bottom: 20px;
margin-bottom: 16px;
}
.guideline-item {
display: flex;
gap: 10px;
align-items: flex-start;
padding: 8px 0;
padding: 7px 0;
.guideline-icon {
width: 22px;
height: 22px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 6px;
background: #ecfdf5;
color: #10b981;
margin-top: 2px;
font-size: 11px;
flex-shrink: 0;
margin-top: 1px;
&.warn {
color: #f59e0b;
background: #fffbeb;
color: #d97706;
}
}
p {
margin: 0;
font-size: 13px;
color: #475569;
font-size: 12.5px;
color: #334155;
line-height: 1.5;
}
}
.bank-info {
background: #f8fafc;
border-radius: 8px;
padding: 16px;
border-radius: 10px;
padding: 14px 16px;
border: 1px solid #e2e8f0;
h4 {
margin: 0 0 8px;
font-size: 13px;
font-weight: 700;
margin: 0 0 10px;
font-size: 11.5px;
font-weight: 800;
color: #0d1b2a;
text-transform: uppercase;
letter-spacing: 0.5px;
letter-spacing: 0.08em;
}
.bank-row {
display: flex;
justify-content: space-between;
padding: 4px 0;
font-size: 14px;
align-items: center;
padding: 5px 0;
font-size: 13px;
span {
color: #64748b;
}
strong {
color: #0d1b2a;
font-weight: 700;
&.mono {
font-family: 'JetBrains Mono', 'Courier New', monospace;
font-size: 12.5px;
color: #1e40af;
}
}
}
}
@include cfc-form-skin('blue');