From 547cfd581e364e6b6a0f974ec9ece227ac6d90c9 Mon Sep 17 00:00:00 2001 From: Jaanu423 Date: Mon, 25 May 2026 13:11:02 +0530 Subject: [PATCH] feat: Nexora grouped action menu for Current Account, FD, and RD views - Non-individual clients: hide Nomination Facility & Nominees in create flow, skip nominee validation on submit, hide Nominees tab in account view - Current Account view: replace flat kebab menu with Nexora grouped menu (Transact / Restrict / Interest / Admin / Danger zone), scrollable body, pinned header, colour-coded icons; add kindOf/iconOf/hasKind helpers - Fixed Deposit view: same grouped menu using shared cur-action-menu styles - Recurring Deposit view: same grouped menu with permission directives - main.scss: add cur-action-menu / cur-menu global styles with MDC flex fix for Material 20 (.mat-mdc-menu-item-text) Co-Authored-By: Claude Sonnet 4.6 --- .../create-current-account.component.html | 1 + .../create-current-account.component.ts | 1 + ...rrent-account-currency-step.component.html | 20 +- ...current-account-currency-step.component.ts | 1 + .../current-account-view.component.html | 219 +++++++++++++++--- .../current-account-view.component.ts | 88 ++++++- .../fixed-deposit-account-view.component.html | 110 +++++++-- .../fixed-deposit-account-view.component.ts | 62 ++++- ...rring-deposits-account-view.component.html | 152 ++++++++++-- ...curring-deposits-account-view.component.ts | 62 ++++- src/main.scss | 200 ++++++++++++++++ 11 files changed, 838 insertions(+), 78 deletions(-) diff --git a/src/app/current-accounts/create-current-account/create-current-account.component.html b/src/app/current-accounts/create-current-account/create-current-account.component.html index 11e38e4bf..900db006a 100644 --- a/src/app/current-accounts/create-current-account/create-current-account.component.html +++ b/src/app/current-accounts/create-current-account/create-current-account.component.html @@ -60,6 +60,7 @@ } diff --git a/src/app/current-accounts/create-current-account/create-current-account.component.ts b/src/app/current-accounts/create-current-account/create-current-account.component.ts index 5b46c6192..9aa74d548 100644 --- a/src/app/current-accounts/create-current-account/create-current-account.component.ts +++ b/src/app/current-accounts/create-current-account/create-current-account.component.ts @@ -143,6 +143,7 @@ export class CreateCurrentAccountComponent { return; } if ( + !this.currentAccountDetailsStep.isNonIndividualClient && this.currentAccountProductTemplate?.nominationFacility && (this.currentAccountCurrencyStep?.nominees ?? []).length === 0 ) { diff --git a/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.html b/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.html index 343fe2e78..1a0f71f1c 100644 --- a/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.html +++ b/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.html @@ -63,16 +63,18 @@ } -
-
-

Nomination Facility

-

Allow account holders to designate individuals to receive funds in the event of account holder's death.

+ @if (!isNonIndividualClient) { +
+
+

Nomination Facility

+

Allow account holders to designate individuals to receive funds in the event of account holder's death.

+
+ + {{ currentAccountProductTemplate?.nominationFacility ? 'Yes' : 'No' }} +
- - {{ currentAccountProductTemplate?.nominationFacility ? 'Yes' : 'No' }} - -
- @if (currentAccountProductTemplate?.nominationFacility) { + } + @if (!isNonIndividualClient && currentAccountProductTemplate?.nominationFacility) {
Nominees
diff --git a/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.ts b/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.ts index 4cf81f5a9..b15fb3d56 100644 --- a/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.ts +++ b/src/app/current-accounts/current-account-stepper/current-account-currency-step/current-account-currency-step.component.ts @@ -28,6 +28,7 @@ import { FormsModule } from '@angular/forms'; export class CurrentAccountCurrencyStepComponent implements OnChanges { @Input() currentAccountProductTemplate: any; @Input() primaryClientId: number | null = null; + @Input() isNonIndividualClient = false; @ViewChild(NomineeFormComponent) nomineeFormComp: NomineeFormComponent; nominees: any[] = []; diff --git a/src/app/current-accounts/current-account-view/current-account-view.component.html b/src/app/current-accounts/current-account-view/current-account-view.component.html index f2946b53b..89a0f7303 100644 --- a/src/app/current-accounts/current-account-view/current-account-view.component.html +++ b/src/app/current-accounts/current-account-view/current-account-view.component.html @@ -91,28 +91,183 @@
- - @for (item of buttonConfig.singleButtons; track item) { - - } + +
+
+ +
+
Account Actions
+
Manage deposits, blocks, interest & more
+
+
- @if (buttonConfig.options && !currentAccountData.subStatus.block) { - - - @for (option of buttonConfig.options; track option) { - - - +
+ + @if (hasKind('transact')) { +
+
Transact
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'transact') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'transact') { + + } + } +
} - - } + + + @if (hasKind('block')) { +
+
Restrict
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'block') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'block') { + + } + } +
+ } + + + @if (hasKind('interest')) { +
+
Interest
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'interest') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'interest') { + + } + } +
+ } + + + @if (hasKind('admin') && !currentAccountData.subStatus.block) { +
+
Admin
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'admin') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'admin') { + + } + } +
+ } + + + @if (hasKind('danger')) { +
+
Danger zone
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'danger') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'danger') { + + } + } +
+ } +
+
@@ -201,17 +356,19 @@ } - - - Nominees - + @if (!isNonIndividualClient) { + + + Nominees + + } @for (currentAccountDatatable of currentAccountDatatables; track currentAccountDatatable) { = { + Deposit: 'transact', + Withdrawal: 'transact', + 'Hold Amount': 'transact', + 'Transfer Funds': 'transact', + 'Interbank Transfer': 'transact', + 'Block Deposit': 'block', + 'Unblock Deposit': 'block', + 'Block Withdrawal': 'block', + 'Unblock Withdrawal': 'block', + 'Block Account': 'block', + 'Unblock Account': 'block', + 'Calculate Interest': 'interest', + 'Post Interest': 'interest', + 'Post Interest As On': 'interest', + 'Enable Withhold Tax': 'interest', + 'Disable Withhold Tax': 'interest', + 'Add Charge': 'admin', + 'Apply Annual Fees': 'admin', + 'Modify Application': 'admin', + 'Assign Staff': 'admin', + 'Unassign Staff': 'admin', + Approve: 'admin', + Activate: 'admin', + 'Undo Approval': 'admin', + Close: 'danger', + Reject: 'danger', + Delete: 'danger', + 'Withdrawn by Client': 'danger' + }; + + private readonly ACTION_ICON: Record = { + Deposit: 'arrow-down', + Withdrawal: 'arrow-up', + 'Hold Amount': 'pause', + 'Transfer Funds': 'exchange-alt', + 'Interbank Transfer': 'random', + 'Block Deposit': 'lock', + 'Unblock Deposit': 'lock-open', + 'Block Withdrawal': 'lock', + 'Unblock Withdrawal': 'lock-open', + 'Block Account': 'lock', + 'Unblock Account': 'lock-open', + 'Calculate Interest': 'calculator', + 'Post Interest': 'percentage', + 'Post Interest As On': 'calendar-day', + 'Enable Withhold Tax': 'percentage', + 'Disable Withhold Tax': 'percentage', + 'Add Charge': 'plus-circle', + 'Apply Annual Fees': 'receipt', + 'Modify Application': 'edit', + 'Assign Staff': 'user-plus', + 'Unassign Staff': 'user-slash', + Approve: 'check-circle', + Activate: 'check', + 'Undo Approval': 'undo', + Close: 'times-circle', + Reject: 'ban', + Delete: 'trash', + 'Withdrawn by Client': 'user-slash' + }; + + kindOf(name: string): 'transact' | 'block' | 'interest' | 'admin' | 'danger' { + return this.ACTION_KIND[name] ?? 'admin'; + } + + iconOf(name: string, fallback?: string): string { + return this.ACTION_ICON[name] ?? fallback ?? 'circle'; + } + + hasKind(kind: 'transact' | 'block' | 'interest' | 'admin' | 'danger'): boolean { + const all = [ + ...(this.buttonConfig?.singleButtons ?? []), + ...(this.buttonConfig?.options ?? []) + ]; + return all.some((item) => this.kindOf(item.name) === kind); + } + /** * Fetches current account data from `resolve` * @param {ActivatedRoute} route Activated Route @@ -120,6 +199,11 @@ export class CurrentAccountViewComponent implements OnInit { ngOnInit() { this.setConditionalButtons(); + if (this.currentAccountData.clientId) { + this.clientsService.getClientData(String(this.currentAccountData.clientId)).subscribe((client: any) => { + this.isNonIndividualClient = client?.legalForm?.id === 2; + }); + } } /** diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html index 9f675a2cc..ae0213ac6 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.html @@ -81,22 +81,102 @@
- - @for (button of buttonConfig.singleButtons; track button) { - - } - @if (buttonConfig.options.length) { - - - @for (option of buttonConfig.options; track option) { - - - + +
+
+ +
+
Account Actions
+
Manage deposits, interest & more
+
+
+
+ @if (hasKind('transact')) { +
+
Transact
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'transact') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'transact') { + + } + } +
} - - } + @if (hasKind('interest')) { +
+
Interest
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'interest') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'interest') { + + } + } +
+ } + @if (hasKind('admin')) { +
+
Admin
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'admin') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'admin') { + + } + } +
+ } + @if (hasKind('danger')) { +
+
Danger zone
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'danger') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'danger') { + + } + } +
+ } +
+
diff --git a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts index 457ed7a5f..e7ec51bda 100644 --- a/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts +++ b/src/app/deposits/fixed-deposits/fixed-deposit-account-view/fixed-deposit-account-view.component.ts @@ -30,7 +30,6 @@ import { AccountNumberComponent } from '../../../shared/account-number/account-n import { LongTextComponent } from '../../../shared/long-text/long-text.component'; import { MatIconButton } from '@angular/material/button'; import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu'; -import { MatIcon } from '@angular/material/icon'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatTabNav, MatTabLink, MatTabNavPanel } from '@angular/material/tabs'; import { StatusLookupPipe } from '../../../pipes/status-lookup.pipe'; @@ -51,7 +50,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; AccountNumberComponent, MatIconButton, MatMenuTrigger, - MatIcon, FaIconComponent, MatMenu, MatMenuItem, @@ -82,6 +80,66 @@ export class FixedDepositAccountViewComponent implements OnInit { currency: Currency; showTransactions = false; + private readonly ACTION_KIND: Record = { + Deposit: 'transact', + Withdrawal: 'transact', + 'Transfer Funds': 'transact', + 'Calculate Interest': 'interest', + 'Post Interest': 'interest', + 'Enable Withhold Tax': 'interest', + 'Disable Withhold Tax': 'interest', + 'Premature Close': 'danger', + 'Undo Activation': 'admin', + Close: 'danger', + 'Modify Application': 'admin', + Approve: 'admin', + 'Undo Approval': 'admin', + Activate: 'admin', + 'Add Charge': 'admin', + 'Apply Annual Fees': 'admin', + Reject: 'danger', + 'Withdrawn by Client': 'danger', + Delete: 'danger' + }; + + private readonly ACTION_ICON: Record = { + Deposit: 'arrow-down', + Withdrawal: 'arrow-up', + 'Transfer Funds': 'exchange-alt', + 'Calculate Interest': 'calculator', + 'Post Interest': 'percentage', + 'Enable Withhold Tax': 'percentage', + 'Disable Withhold Tax': 'percentage', + 'Premature Close': 'times-circle', + 'Undo Activation': 'undo', + Close: 'times-circle', + 'Modify Application': 'edit', + Approve: 'check-circle', + 'Undo Approval': 'undo', + Activate: 'check', + 'Add Charge': 'plus-circle', + 'Apply Annual Fees': 'receipt', + Reject: 'ban', + 'Withdrawn by Client': 'user-slash', + Delete: 'trash' + }; + + kindOf(name: string): 'transact' | 'block' | 'interest' | 'admin' | 'danger' { + return this.ACTION_KIND[name] ?? 'admin'; + } + + iconOf(name: string, fallback?: string): string { + return this.ACTION_ICON[name] ?? fallback ?? 'circle'; + } + + hasKind(kind: 'transact' | 'block' | 'interest' | 'admin' | 'danger'): boolean { + const all = [ + ...(this.buttonConfig?.singleButtons ?? []), + ...(this.buttonConfig?.options ?? []) + ]; + return all.some((item) => this.kindOf(item.name) === kind); + } + /** * Fetches fixed deposits account data from `resolve` * @param {ActivatedRoute} route Activated Route diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.html b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.html index 137700ddb..e70d3ad78 100644 --- a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.html +++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.html @@ -89,24 +89,142 @@
- - @for (item of buttonConfig.singleButtons; track item) { - - } - @if (buttonConfig.options.length) { - - - @for (option of buttonConfig.options; track option) { - - - + +
+
+ +
+
Account Actions
+
Manage deposits, interest & more
+
+
+
+ @if (hasKind('transact')) { +
+
Transact
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'transact') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'transact') { + + } + } +
} - - } + @if (hasKind('interest')) { +
+
Interest
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'interest') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'interest') { + + } + } +
+ } + @if (hasKind('admin')) { +
+
Admin
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'admin') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'admin') { + + } + } +
+ } + @if (hasKind('danger')) { +
+
Danger zone
+ @for (item of buttonConfig.singleButtons; track item.name) { + @if (kindOf(item.name) === 'danger') { + + } + } + @for (option of buttonConfig.options; track option.name) { + @if (kindOf(option.name) === 'danger') { + + } + } +
+ } +
+
diff --git a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts index f401c835f..d466d62bb 100644 --- a/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts +++ b/src/app/deposits/recurring-deposits/recurring-deposits-account-view/recurring-deposits-account-view.component.ts @@ -29,7 +29,6 @@ import { AccountNumberComponent } from '../../../shared/account-number/account-n import { LongTextComponent } from '../../../shared/long-text/long-text.component'; import { MatIconButton } from '@angular/material/button'; import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu'; -import { MatIcon } from '@angular/material/icon'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { MatTabNav, MatTabLink, MatTabNavPanel } from '@angular/material/tabs'; import { StatusLookupPipe } from '../../../pipes/status-lookup.pipe'; @@ -50,7 +49,6 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; AccountNumberComponent, MatIconButton, MatMenuTrigger, - MatIcon, FaIconComponent, MatMenu, MatMenuItem, @@ -85,6 +83,66 @@ export class RecurringDepositsAccountViewComponent implements OnInit { entityType: string; currency: Currency; showTransactions = false; + + private readonly ACTION_KIND: Record = { + Deposit: 'transact', + Withdrawal: 'transact', + 'Transfer Funds': 'transact', + 'Calculate Interest': 'interest', + 'Post Interest': 'interest', + 'Enable Withhold Tax': 'interest', + 'Disable Withhold Tax': 'interest', + 'Premature Close': 'danger', + 'Undo Activation': 'admin', + Close: 'danger', + 'Modify Application': 'admin', + Approve: 'admin', + 'Undo Approval': 'admin', + Activate: 'admin', + 'Add Charge': 'admin', + 'Apply Annual Fees': 'admin', + Reject: 'danger', + 'Withdrawn by Client': 'danger', + Delete: 'danger' + }; + + private readonly ACTION_ICON: Record = { + Deposit: 'arrow-down', + Withdrawal: 'arrow-up', + 'Transfer Funds': 'exchange-alt', + 'Calculate Interest': 'calculator', + 'Post Interest': 'percentage', + 'Enable Withhold Tax': 'percentage', + 'Disable Withhold Tax': 'percentage', + 'Premature Close': 'times-circle', + 'Undo Activation': 'undo', + Close: 'times-circle', + 'Modify Application': 'edit', + Approve: 'check-circle', + 'Undo Approval': 'undo', + Activate: 'check', + 'Add Charge': 'plus-circle', + 'Apply Annual Fees': 'receipt', + Reject: 'ban', + 'Withdrawn by Client': 'user-slash', + Delete: 'trash' + }; + + kindOf(name: string): 'transact' | 'block' | 'interest' | 'admin' | 'danger' { + return this.ACTION_KIND[name] ?? 'admin'; + } + + iconOf(name: string, fallback?: string): string { + return this.ACTION_ICON[name] ?? fallback ?? 'circle'; + } + + hasKind(kind: 'transact' | 'block' | 'interest' | 'admin' | 'danger'): boolean { + const all = [ + ...(this.buttonConfig?.singleButtons ?? []), + ...(this.buttonConfig?.options ?? []) + ]; + return all.some((item) => this.kindOf(item.name) === kind); + } /** * Fetches recurringDeposits account data from `resolve` * @param {ActivatedRoute} route Activated Route diff --git a/src/main.scss b/src/main.scss index 618939ab2..d09f99259 100644 --- a/src/main.scss +++ b/src/main.scss @@ -1177,6 +1177,16 @@ mat-card { min-width: 0; } +.sav-menu__item.mat-mdc-menu-item .mat-mdc-menu-item-text, +.sav-menu__item.mat-mdc-menu-item .mdc-list-item__primary-text, +.sav-menu__item.mat-mdc-menu-item .mdc-list-item__content { + display: flex !important; + flex-direction: row !important; + align-items: center !important; + gap: 10px !important; + width: 100%; +} + /* Hover lift on the icon */ .sav-menu__item:hover .sav-menu__ico { transform: scale(1.06); @@ -1216,6 +1226,196 @@ mat-card { background: #fef2f2 !important; } +/* ─── Current Account action menu (mirrors sav-action-menu styling) ─────── */ +.cur-action-menu.mat-mdc-menu-panel { + min-width: 280px !important; + max-width: 320px !important; + border-radius: 14px !important; + box-shadow: + 0 8px 30px -6px rgb(15 23 42 / 22%), + 0 0 0 1px rgb(15 23 42 / 6%) !important; + border: none !important; + overflow: hidden; +} + +.cur-action-menu .mat-mdc-menu-content { + padding: 0 !important; + overflow: hidden !important; +} + +.cur-menu { + display: flex; + flex-direction: column; + font-family: Inter, 'DM Sans', Roboto, sans-serif; + max-height: 440px; + overflow: hidden; +} + +.cur-menu__body { + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: #cbd5e1 transparent; +} + +.cur-menu__body::-webkit-scrollbar { + width: 4px; +} + +.cur-menu__body::-webkit-scrollbar-track { + background: transparent; +} + +.cur-menu__body::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 4px; +} + +.cur-menu__head { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 14px; + background: linear-gradient(135deg, #1e3a8a 0%, #1e40af 45%, #4338ca 100%); + color: #fff; +} + +.cur-menu__head-ico { + width: 28px; + height: 28px; + border-radius: 8px; + background: rgb(255 255 255 / 18%); + border: 1px solid rgb(255 255 255 / 28%); + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + flex-shrink: 0; +} + +.cur-menu__head-title { + font-size: 13px; + font-weight: 800; + letter-spacing: 0.01em; + line-height: 1.1; +} + +.cur-menu__head-sub { + margin-top: 1px; + font-size: 10.5px; + color: rgb(255 255 255 / 78%); +} + +.cur-menu__group { + padding: 6px 0; + + & + & { + border-top: 1px solid #f1f5f9; + } + + &--danger { + background: #fff8f8; + + & + & { + border-top-color: #fee2e2; + } + } +} + +.cur-menu__group-title { + font-size: 9.5px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; + color: #94a3b8; + padding: 4px 14px 2px; +} + +.cur-menu__item.mat-mdc-menu-item { + display: flex !important; + align-items: center; + gap: 10px; + min-height: 38px !important; + padding: 5px 14px !important; + font-size: 13px !important; + font-weight: 600; + color: #1e293b; + transition: + background 0.12s ease, + color 0.12s ease; +} + +.cur-menu__ico { + width: 26px; + height: 26px; + border-radius: 7px; + display: flex; + align-items: center; + justify-content: center; + font-size: 11px; + flex-shrink: 0; + background: #f1f5f9; + color: #64748b; + transition: + transform 0.12s ease, + background 0.12s ease, + color 0.12s ease; +} + +.cur-menu__label { + flex: 1 1 auto; + min-width: 0; +} + +/* Material 20 wraps projected content in .mat-mdc-menu-item-text — make it + flex so the icon square and label sit side-by-side instead of stacking. */ +.cur-menu__item.mat-mdc-menu-item .mat-mdc-menu-item-text, +.cur-menu__item.mat-mdc-menu-item .mdc-list-item__primary-text, +.cur-menu__item.mat-mdc-menu-item .mdc-list-item__content { + display: flex !important; + flex-direction: row !important; + align-items: center !important; + gap: 10px !important; + width: 100%; +} + +.cur-menu__item:hover .cur-menu__ico { + transform: scale(1.06); +} + +/* Variant tints */ +.cur-menu__item--transact .cur-menu__ico { + background: #ecfdf5; + color: #047857; +} + +.cur-menu__item--block .cur-menu__ico { + background: #fff7ed; + color: #c2410c; +} + +.cur-menu__item--interest .cur-menu__ico { + background: #eff6ff; + color: #1d4ed8; +} + +.cur-menu__item--admin .cur-menu__ico { + background: #f5f3ff; + color: #6d28d9; +} + +.cur-menu__item--danger.mat-mdc-menu-item { + color: #991b1b !important; +} + +.cur-menu__item--danger .cur-menu__ico { + background: #fee2e2; + color: #b91c1c; +} + +.cur-menu__item--danger:hover { + background: #fef2f2 !important; +} + /* ─── Identity-Verify Dialog Panel ─── Strip Material's default surface padding so the teal gradient header on the Withdraw "Verify Customer Identity" pop-up reaches edge-to-edge