Files
cbsnexora/src/app/cashier/transaction-entry/transaction-entry.component.scss
T
niteshandClaude Opus 5 b71619c402 feat(cashier, sponsor-dd): GL settlement and DD funding entry points, DD registry redesign
Transaction Entry (clerk):
- Route a two-row Fund Transfer of Dr SHR / Cr GL to the share-withdrawal
  request with settlementMode GL, so a clerk can settle a share withdrawal
  into any GL account instead of the member's linked savings account.
- Offer GL as an account type for Demand Draft funding, and submit it as a
  GL debit (no client or savings/current account is involved).

My Work:
- Add a voucher detail dialog so a clerk can open a raised voucher from the
  request list and see its GL lines.

Closing Cash Report:
- Fix the total row so it reflects the corrected opening balance.

DD Leaflet Registry and DD Inventory:
- Redesign both pages onto the shared usr-* visual language: gradient header
  badge, status filter chips with counts, card-wrapped sticky-header table,
  and one primary action per row with the rest behind an overflow menu.
  Filtering, pagination and every action condition are unchanged.
- Register faHandPaper, needed by the new Stop Payment menu item.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:17:22 +05:30

3465 lines
63 KiB
SCSS

/**
* Copyright since 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
:host {
display: block;
background: #f0f2f5;
font-family: Inter, Roboto, sans-serif;
font-size: 12px;
}
// ── Root wrapper ──────────────────────────────────────────────────────────────
.te-root {
display: flex;
flex-direction: column;
gap: 6px;
padding: 6px 10px;
}
// ── Day-status blocking banners ───────────────────────────────────────────────
.te-day-block {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 16px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
border-left: 4px solid;
svg {
flex-shrink: 0;
}
&--danger {
background: #fef2f2;
border-color: #dc2626;
color: #991b1b;
svg {
stroke: #dc2626;
}
}
&--warning {
background: #fffbeb;
border-color: #d97706;
color: #92400e;
svg {
stroke: #d97706;
}
}
}
// ── Cashier compact account info strip ───────────────────────────────────────
.te-acs {
display: flex;
align-items: center;
background: #fff;
border: 1px solid #dce4ef;
border-radius: 8px;
overflow: hidden;
min-height: 44px;
}
.te-acs-id {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
flex-shrink: 0;
}
.te-acs-photo {
width: 30px;
height: 30px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
border: 2px solid #dce4ef;
&--ph {
background: #f0f4f9;
display: flex;
align-items: center;
justify-content: center;
}
&--clickable {
cursor: zoom-in;
transition:
border-color 0.15s,
box-shadow 0.15s;
&:hover {
border-color: #2563eb;
box-shadow: 0 0 0 3px rgb(37 99 235 / 18%);
}
}
}
.te-acs-nameblock {
display: flex;
flex-direction: column;
gap: 1px;
}
.te-acs-name {
font-size: 12px;
font-weight: 700;
color: #0d1b2e;
white-space: nowrap;
}
.te-acs-acno {
font-size: 10px;
font-family: 'Roboto Mono', monospace;
color: #5a7089;
letter-spacing: 0.4px;
}
.te-acs-sep {
width: 1px;
align-self: stretch;
background: #dce4ef;
flex-shrink: 0;
}
.te-acs-meta {
display: flex;
align-items: center;
gap: 6px;
padding: 0 10px;
flex-shrink: 0;
}
.te-acs-tag {
display: inline-flex;
align-items: center;
height: 20px;
padding: 0 7px;
border-radius: 10px;
font-size: 10px;
font-weight: 700;
background: #f0fdf4;
color: #16a34a;
border: 1px solid #bbf7d0;
&--blocked {
background: #fef2f2;
color: #dc2626;
border-color: #fecaca;
}
&--dormant {
background: #fffbeb;
color: #d97706;
border-color: #fde68a;
}
}
.te-acs-kv {
font-size: 11px;
color: #4a607a;
white-space: nowrap;
b {
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.4px;
color: #8aa0b8;
margin-right: 2px;
}
}
.te-acs-bals {
display: flex;
align-items: stretch;
flex: 1;
}
.te-acs-b {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
padding: 5px 10px;
border-right: 1px solid #f0f4f9;
gap: 1px;
&:last-child {
border-right: none;
}
&--main {
background: #f8fbff;
}
&--after {
background: #f0fdf6;
}
}
.te-acs-b-l {
font-size: 9px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: #8aa0b8;
white-space: nowrap;
}
.te-acs-b-v {
font-size: 11.5px;
font-weight: 700;
color: #1a2a3e;
font-variant-numeric: tabular-nums;
white-space: nowrap;
&--cr {
color: #059669;
}
}
.te-acs-alerts {
display: flex;
align-items: center;
gap: 4px;
padding: 0 10px;
flex-shrink: 0;
}
.te-acs-alert {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 10px;
font-weight: 600;
border-radius: 4px;
padding: 3px 7px;
&--danger {
background: #fef2f2;
color: #991b1b;
svg {
stroke: #dc2626;
}
}
&--warning {
background: #fffbeb;
color: #92400e;
svg {
stroke: #d97706;
}
}
&--info {
background: #eff6ff;
color: #1e40af;
svg {
stroke: #3b82f6;
}
}
}
// ── CBS Blue Transaction Entry ────────────────────────────────────────────────
$ws-ink: #0d1b2e; // nav bar dark navy
$ws-ink2: #162542; // slightly lighter navy (menu bar)
$ws-canvas: #f0f4f9; // page bg — light blue-grey
$ws-card: #fff;
$ws-border: #dce4ef;
$ws-accent: #e87722; // CBS orange — buttons only
$ws-focus: #2563eb; // CBS blue — field focus ring
$ws-text: #1a2a3e;
$ws-muted: #5a7089;
$ws-micro: #7a95b0;
$ws-dr: #c0392b;
$ws-cr: #1a7a4a;
$ws-divider: #dde6f0;
$ws-fld-bg: #f4f7fc;
$ws-fld-bd: #c8d8eb;
.ws-wrap {
background: $ws-canvas;
border-radius: 10px;
overflow: hidden;
box-shadow:
0 1px 3px rgb(13 27 46 / 6%),
0 4px 14px -8px rgb(13 27 46 / 14%);
border: 1px solid $ws-border;
font-family: 'Hanken Grotesk', Inter, sans-serif;
}
// ── Header ──────────────────────────────────────────────────────────────────
.ws-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 12px;
height: 32px;
background: linear-gradient(90deg, #0d1b2e 0%, #162542 100%);
border-bottom: 2px solid $ws-accent;
&__left {
display: flex;
align-items: center;
gap: 8px;
}
&__right {
display: flex;
align-items: center;
gap: 10px;
}
&__icon {
width: 22px;
height: 22px;
border-radius: 6px;
background: $ws-accent;
display: flex;
align-items: center;
justify-content: center;
svg {
stroke: #fff;
width: 12px;
height: 12px;
}
}
&__title {
font-family: Newsreader, Georgia, serif;
font-size: 14px;
font-weight: 500;
color: #e8f0fb;
letter-spacing: 0.01em;
}
&__effdt {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
color: #7a95b0;
svg {
stroke: #5a7589;
}
}
&__date {
height: 24px;
padding: 0 8px;
border: 1px solid #2a4060;
border-radius: 5px;
background: #0a1628;
color: #e8f0fb;
font-family: 'Hanken Grotesk', monospace;
font-size: 11px;
font-weight: 600;
outline: none;
&:focus {
border-color: $ws-focus;
}
}
}
.ws-btn {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 12px;
border-radius: 7px;
border: none;
font-family: 'Hanken Grotesk', sans-serif;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition:
filter 0.15s,
transform 0.1s;
&:active {
transform: scale(0.97);
}
&--add {
background: $ws-accent;
color: #fff;
box-shadow: 0 2px 8px rgb(180 83 9 / 30%);
svg {
stroke: #fff;
}
&:hover {
filter: brightness(1.08);
}
}
&--draft {
background: $ws-divider;
color: $ws-text;
border: 1px solid $ws-border;
&:hover {
background: #ddd6c6;
}
}
&--ghost {
background: #fff;
color: $ws-text;
border: 1px solid $ws-border;
font-size: 12px;
&:hover {
background: $ws-canvas;
border-color: #a8bdd4;
}
}
&--exit {
color: $ws-dr;
border-color: rgb(192 57 43 / 30%);
&:hover {
background: #fef2f0;
border-color: $ws-dr;
}
}
&--mode {
background: $ws-ink;
color: #c8daf0;
border: 1px solid #2a4060;
font-size: 12px;
&:hover {
background: $ws-ink2;
}
}
&--action {
background: linear-gradient(135deg, #6366f1, #4f46e5);
color: #fff;
font-weight: 700;
box-shadow: 0 2px 8px rgb(79 70 229 / 30%);
svg {
stroke: #fff;
}
&:hover {
filter: brightness(1.08);
}
}
&--post {
background: $ws-accent;
color: #fff;
font-weight: 700;
padding: 6px 16px;
box-shadow: 0 2px 8px rgb(232 119 34 / 30%);
&:hover:not(:disabled) {
filter: brightness(1.08);
}
&:disabled {
opacity: 0.4;
cursor: not-allowed;
}
}
&--reject {
background: #fff;
color: #dc2626;
font-weight: 700;
padding: 6px 16px;
border: 1.5px solid #fca5a5;
&:hover:not(:disabled) {
background: #fef2f2;
border-color: #dc2626;
}
&:disabled {
opacity: 0.4;
cursor: not-allowed;
}
}
}
// ── Clerk edit: rejection banner ──────────────────────────────────────────────
.te-reject-banner {
display: flex;
align-items: flex-start;
gap: 10px;
margin: 10px 12px 0;
padding: 12px 16px;
background: #fef2f2;
border: 1px solid #fca5a5;
border-left: 4px solid #dc2626;
border-radius: 8px;
color: #991b1b;
svg {
flex-shrink: 0;
margin-top: 1px;
color: #dc2626;
}
div {
display: flex;
flex-direction: column;
gap: 2px;
}
strong {
font-size: 13px;
font-weight: 700;
}
span {
font-size: 12.5px;
}
small {
font-size: 11.5px;
color: #b45309;
margin-top: 2px;
}
}
// ── Manager review extras ─────────────────────────────────────────────────────
// Fieldset wrapper around the row form — disabled in review mode to make it read-only,
// while staying layout-neutral so the cards render exactly like the clerk view.
.ws-rows-fieldset {
display: contents;
border: 0;
margin: 0;
padding: 0;
min-width: 0;
&[disabled] {
.ws-card {
cursor: default;
}
// Keep values fully legible (browsers fade disabled controls by default)
.ws-f__ctl,
.ws-amt-input,
input,
select,
textarea {
opacity: 1;
color: #1e293b;
-webkit-text-fill-color: #1e293b;
background: #f8fafc;
cursor: default;
}
.ws-seg__btn {
opacity: 1;
}
}
}
.ws-review-status {
display: inline-flex;
align-items: center;
padding: 4px 12px;
border-radius: 999px;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.05em;
margin-left: 10px;
&[data-status='PENDING'] {
background: #fef9c3;
color: #a16207;
}
&[data-status='APPROVED'] {
background: #dcfce7;
color: #15803d;
}
&[data-status='REJECTED'] {
background: #fee2e2;
color: #b91c1c;
}
}
.ws-reject-hint {
margin: 0 0 10px;
font-size: 12.5px;
color: #64748b;
}
.ws-reject-textarea {
width: 100%;
border: 1.5px solid #e2e8f0;
border-radius: 10px;
padding: 10px 12px;
font-family: inherit;
font-size: 13px;
resize: vertical;
&:focus {
outline: none;
border-color: #dc2626;
}
}
.te-btn--danger {
background: #dc2626;
color: #fff;
border-color: #dc2626;
&:hover:not(:disabled) {
background: #b91c1c;
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
// ── Row cards ────────────────────────────────────────────────────────────────
.ws-rows {
padding: 8px 10px;
display: flex;
flex-direction: column;
gap: 6px;
}
.ws-card {
display: flex;
align-items: flex-start;
gap: 6px;
background: $ws-card;
border: 1px solid $ws-border;
border-radius: 10px;
padding: 6px 8px;
cursor: pointer;
transition:
border-color 0.15s,
box-shadow 0.15s;
position: relative;
&:hover {
border-color: #a8bdd4;
box-shadow: 0 2px 10px rgb(13 27 46 / 8%);
}
&--active {
border-color: $ws-accent;
box-shadow:
0 0 0 3px rgb(232 119 34 / 14%),
0 2px 10px rgb(13 27 46 / 10%);
}
&__badge {
flex-shrink: 0;
width: 22px;
height: 22px;
border-radius: 50%;
background: $ws-ink;
color: #c8daf0;
font-size: 10px;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
margin-top: 16px;
}
&__body {
flex: 1;
min-width: 0;
}
&__del {
position: absolute;
top: 8px;
right: 8px;
width: 22px;
height: 22px;
border-radius: 50%;
border: none;
background: transparent;
color: #9ab0c8;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition:
opacity 0.15s,
background 0.15s;
&:hover {
background: #fde8e8;
color: $ws-dr;
}
&:disabled {
cursor: not-allowed;
opacity: 0.2 !important;
}
}
&:hover &__del {
opacity: 1;
}
}
// ── Group captions ────────────────────────────────────────────────────────────
// ── Group row (Classification+Account / Payment+Narration) ───────────────────
.ws-group-row {
display: flex;
align-items: stretch;
gap: 0;
&--mt {
margin-top: 6px;
}
}
.ws-group {
display: flex;
flex-direction: column;
gap: 4px;
flex-shrink: 0;
&--flex {
flex: 1;
min-width: 0;
}
&__fields {
display: flex;
align-items: flex-end;
gap: 6px;
flex-wrap: nowrap;
height: 100%;
align-content: flex-end;
}
}
.ws-caption {
font-family: Newsreader, Georgia, serif;
font-style: italic;
font-size: 11px;
color: #7a95b0;
padding-bottom: 1px;
}
.ws-vdivider {
width: 1px;
background: $ws-divider;
margin: 12px 8px 0;
flex-shrink: 0;
}
// ── Field ─────────────────────────────────────────────────────────────────────
.ws-f {
display: flex;
flex-direction: column;
gap: 3px;
flex-shrink: 0;
&--type {
width: 160px;
}
&--branch {
width: 130px;
}
&--trtp {
width: 66px;
}
&--actyp {
width: 66px;
}
&--acno {
flex: 1;
min-width: 110px;
}
&--ecsno {
flex: 1.6;
min-width: 150px;
}
&--dbcr {
width: 84px;
flex-shrink: 0;
}
&--paytype {
width: 160px;
}
&--amt {
width: 120px;
}
&--cheqno {
width: 165px;
}
&--cheqdt {
width: 108px;
}
&--tok {
width: 120px;
}
&--desc {
flex: 1;
min-width: 0;
}
&__lbl {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: $ws-micro;
white-space: nowrap;
&--accent {
color: $ws-focus;
}
}
&__ctl {
height: 26px;
padding: 0 7px;
border: 1px solid $ws-fld-bd;
border-radius: 6px;
background: $ws-fld-bg;
color: $ws-text;
font-family: 'Hanken Grotesk', sans-serif;
font-size: 11.5px;
outline: none;
width: 100%;
transition:
border-color 0.15s,
box-shadow 0.15s;
box-sizing: border-box;
&:hover {
border-color: #9ab5d0;
}
&:focus {
border-color: $ws-focus;
box-shadow: 0 0 0 3px rgb(37 99 235 / 12%);
background: #fff;
}
&--mono {
font-family: 'Roboto Mono', monospace;
font-size: 12px;
letter-spacing: 0.03em;
}
&--accent {
color: $ws-text;
font-weight: 600;
}
&--req {
border-color: #f97316;
background: #fff7ed;
}
}
}
select.ws-f__ctl {
cursor: pointer;
}
input.ws-f__ctl--readonly {
background: #f1f5f9;
color: #475569;
cursor: default;
user-select: none;
letter-spacing: 0.04em;
font-family: 'Courier New', monospace;
font-size: 11px;
}
/* AC.TP shown as a locked label instead of the normal editable select, while the row is filled
from a token-driven request whose real account type row.acTyp cannot show (see
acTypLockedByToken in the component). */
span.ws-f__ctl--locked {
display: inline-flex;
align-items: center;
background: #f1f5f9;
color: #475569;
cursor: not-allowed;
user-select: none;
font-size: 11px;
font-weight: 600;
}
input.ws-amt-input--locked {
background: #fef9c3;
color: #713f12;
cursor: not-allowed;
font-weight: 700;
}
.ws-amt-wrap--locked {
border-color: #fde047 !important;
background: #fefce8;
}
.ws-amt-locked-badge {
font-size: 10px;
margin-left: 3px;
vertical-align: middle;
cursor: help;
}
// ── Amount field ──────────────────────────────────────────────────────────────
.ws-amt-wrap {
display: flex;
align-items: center;
border: 1px solid $ws-fld-bd;
border-radius: 7px;
background: $ws-fld-bg;
height: 30px;
transition:
border-color 0.15s,
box-shadow 0.15s;
&:focus-within {
border-color: $ws-focus;
box-shadow: 0 0 0 3px rgb(37 99 235 / 12%);
background: #fff;
}
&--cash {
border-color: #86efac;
background: #f0fdf4;
.ws-amt-prefix {
color: #15803d;
}
.ws-amt-input {
color: #15803d;
font-weight: 700;
}
}
}
.ws-amt-prefix {
padding: 0 5px 0 8px;
font-size: 12px;
color: $ws-muted;
font-weight: 600;
flex-shrink: 0;
}
.ws-f__hint {
display: block;
margin-top: 2px;
font-size: 10px;
color: $ws-muted;
font-weight: 500;
}
.ws-amt-input {
flex: 1;
height: 100%;
border: none;
background: transparent;
font-family: 'Hanken Grotesk', monospace;
font-size: 12px;
font-weight: 600;
text-align: right;
padding-right: 8px;
color: $ws-text;
outline: none;
font-variant-numeric: tabular-nums;
}
// ── Segmented DR/CR toggle ───────────────────────────────────────────────────
.ws-seg {
display: flex;
height: 30px;
border-radius: 7px;
overflow: hidden;
border: 1px solid $ws-fld-bd;
&__btn {
flex: 1;
border: none;
background: $ws-fld-bg;
font-family: 'Hanken Grotesk', sans-serif;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.06em;
cursor: pointer;
color: $ws-muted;
transition:
background 0.15s,
color 0.15s;
&--dr:hover {
background: #fce9e6;
color: $ws-dr;
}
&--cr:hover {
background: #e8f4e2;
color: $ws-cr;
}
&--active-dr {
background: #fce9e6 !important;
color: $ws-dr !important;
}
&--active-cr {
background: #e8f4e2 !important;
color: $ws-cr !important;
}
}
}
// ── Footer totals ─────────────────────────────────────────────────────────────
.ws-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding: 7px 14px;
background: linear-gradient(180deg, #f4f7fc, #edf2f9);
border-top: 1px solid $ws-divider;
&__stats {
display: flex;
align-items: center;
gap: 24px;
}
&__actions {
display: flex;
align-items: center;
gap: 8px;
}
}
.ws-stat {
display: flex;
flex-direction: column;
gap: 1px;
&__label {
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: $ws-micro;
}
&__val {
font-size: 13px;
font-weight: 700;
color: $ws-text;
font-variant-numeric: tabular-nums;
font-family: 'Hanken Grotesk', monospace;
&--dr {
color: $ws-dr;
}
&--cr {
color: $ws-cr;
}
&--ok {
color: $ws-cr;
}
}
}
.ws-balance-pill {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 5px 12px;
border-radius: 999px;
font-size: 11px;
font-weight: 700;
&--ok {
background: #e8f4e2;
color: $ws-cr;
svg {
stroke: $ws-cr;
}
}
&--bad {
background: #fce9e6;
color: $ws-dr;
svg {
stroke: $ws-dr;
}
}
}
// ── Transaction Entry Grid (legacy — keep for bottom grid inside accountDetails) ──────────────────────
.te-grid-wrap {
background: #fff;
border-radius: 12px;
overflow: hidden;
box-shadow:
0 2px 12px rgb(0 0 0 / 8%),
0 0 0 1px rgb(0 0 0 / 6%);
}
// Grid header title bar
.te-grid-wrap::before {
content: '';
display: block;
height: 3px;
background: linear-gradient(90deg, #1e40af, #0ea5e9, #1e40af);
background-size: 200% 100%;
animation: te-shimmer 3s linear infinite;
}
@keyframes te-shimmer {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
.te-grid {
width: 100%;
table-layout: fixed;
border-collapse: collapse;
font-size: 11.5px;
th {
background: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
color: #7dd3fc;
padding: 9px 6px;
text-align: left;
font-size: 10px;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
border-right: 1px solid #1e3a5f;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
&:last-child {
border-right: none;
}
}
td {
border-right: 1px solid #f1f5f9;
border-bottom: 1px solid #f1f5f9;
padding: 3px;
background: #fff;
vertical-align: middle;
overflow: hidden;
&:last-child {
border-right: none;
}
}
tr.te-row--selected td {
background: linear-gradient(90deg, #eff6ff, #f0f9ff);
border-bottom-color: #bae6fd;
}
tr:hover:not(.te-row--selected) td {
background: #fafbff;
cursor: pointer;
}
&--mini th {
font-size: 9px;
padding: 6px;
background: linear-gradient(180deg, #334155, #1e293b);
color: #94a3b8;
}
}
.te-cell {
border: 1px solid #e2e8f0;
border-radius: 6px;
background: #f8fafc;
font-family: 'Roboto Mono', monospace;
font-size: 11.5px;
padding: 5px 7px;
color: #1e293b;
outline: none;
width: 100%;
transition:
border-color 0.15s,
background 0.15s,
box-shadow 0.15s;
&:focus {
border-color: #3b82f6;
background: #fff;
box-shadow: 0 0 0 3px rgb(59 130 246 / 12%);
}
// With table-layout:fixed, colgroup controls column width.
// These size classes only apply to inputs INSIDE cells.
&--xs {
width: 100%;
}
&--sm {
width: 100%;
}
&--md {
width: 100%;
}
&--lg {
width: 100%;
}
&--acno {
width: 100%;
letter-spacing: 0.03em;
}
}
select.te-cell {
cursor: pointer;
appearance: auto;
}
.te-grid-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 14px;
background: linear-gradient(180deg, #f8fafc, #f1f5f9);
border-top: 1px solid #e2e8f0;
}
.te-eff-date {
display: flex;
align-items: center;
gap: 6px;
font-size: 11.5px;
color: #64748b;
font-weight: 600;
&::before {
content: '📅';
font-size: 12px;
}
strong {
font-family: 'Roboto Mono', monospace;
font-weight: 800;
background: #e0f2fe;
padding: 2px 7px;
border-radius: 5px;
border: 1px solid #bae6fd;
color: #0369a1;
}
}
.te-add-btn {
width: 30px;
height: 30px;
border-radius: 50%;
background: linear-gradient(135deg, #0ea5e9, #2563eb);
color: #fff;
border: none;
font-size: 20px;
font-weight: 300;
line-height: 1;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition:
transform 0.15s,
box-shadow 0.15s;
transition: background 0.15s;
box-shadow: 0 2px 6px rgb(14 165 233 / 35%);
&:hover {
transform: scale(1.1);
box-shadow: 0 4px 14px rgb(14 165 233 / 50%);
background: #0284c7;
}
}
// ── Status messages ──────────────────────────────────────────────────────────
.te-loading {
position: fixed;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 14px;
background: rgb(241 245 249 / 88%);
backdrop-filter: blur(6px);
z-index: 999;
&__spinner {
position: relative;
width: 56px;
height: 56px;
svg {
animation: te-spin 1s linear infinite;
}
}
&__arc {
transform-origin: 28px 28px;
}
&__pulse {
position: absolute;
inset: 6px;
border-radius: 50%;
background: radial-gradient(circle, rgb(37 99 235 / 12%), transparent 70%);
animation: te-pulse 1.4s ease-in-out infinite;
}
&__title {
font-size: 15px;
font-weight: 700;
color: #1e293b;
letter-spacing: -0.01em;
}
&__sub {
font-size: 12.5px;
color: #94a3b8;
margin-top: -6px;
}
}
@keyframes te-spin {
to {
transform: rotate(360deg);
}
}
@keyframes te-pulse {
0%,
100% {
opacity: 0.4;
transform: scale(0.9);
}
50% {
opacity: 1;
transform: scale(1.1);
}
}
.te-error {
padding: 10px 16px;
background: #fef2f2;
border: 1px solid #fecaca;
border-radius: 8px;
color: #dc2626;
font-size: 13px;
font-weight: 500;
}
// ── Main Detail Panel ─────────────────────────────────────────────────────────
.te-detail {
display: flex;
flex-direction: column;
gap: 5px;
}
.te-detail-top {
display: grid;
grid-template-columns: 1.1fr 0.9fr 1.1fr;
gap: 7px;
@media (width <= 1100px) {
grid-template-columns: 1fr 1fr;
}
@media (width <= 700px) {
grid-template-columns: 1fr;
}
}
// ── Panel Card ────────────────────────────────────────────────────────────────
.te-panel {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 1px 4px rgb(0 0 0 / 5%);
&__header {
display: flex;
align-items: center;
gap: 5px;
padding: 4px 8px;
background: linear-gradient(135deg, #1e293b, #334155);
color: #e2e8f0;
font-size: 9.5px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
&--mt {
margin-top: 0;
border-top: 1px solid #e2e8f0;
background: linear-gradient(135deg, #334155, #475569);
}
}
&__body {
padding: 4px 8px;
&--center {
display: flex;
align-items: center;
justify-content: center;
min-height: 32px;
}
}
}
// ── Field rows ────────────────────────────────────────────────────────────────
.te-field {
display: flex;
align-items: flex-start;
gap: 5px;
margin-bottom: 3px;
font-size: 11px;
border-bottom: 1px dotted #f1f5f9;
padding-bottom: 3px;
&:last-child {
border-bottom: none;
margin-bottom: 0;
}
}
.te-field-row {
display: flex;
gap: 8px;
.te-field {
flex: 1;
}
}
.te-label {
min-width: 76px;
color: #64748b;
font-size: 10.5px;
font-weight: 600;
white-space: nowrap;
padding-top: 1px;
}
.te-value {
color: #1e293b;
font-size: 11px;
font-weight: 500;
flex: 1;
&-name {
font-weight: 700;
color: #0f172a;
font-size: 12px;
}
&-wrap {
white-space: normal;
word-break: break-word;
}
}
.te-mono {
font-family: 'Roboto Mono', 'Courier New', monospace;
}
.te-dim {
color: #94a3b8;
font-size: 11px;
}
// ── Joint holders / Nominees ──────────────────────────────────────────────────
.te-joint-row {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 6px;
border-bottom: 1px solid #f1f5f9;
font-size: 11px;
border-radius: 6px;
margin-bottom: 2px;
&:last-of-type {
border-bottom: none;
}
&--clickable {
cursor: pointer;
transition: background 0.12s;
&:hover {
background: #f1f5f9;
}
}
&--expanded {
background: #eff6ff;
border-bottom-color: #bfdbfe;
}
}
.te-expand-icon {
font-size: 9px;
color: #94a3b8;
flex-shrink: 0;
}
// ── Holder expanded detail card ───────────────────────────────────────────────
.te-holder-detail {
background: #f8fafc;
border: 1px solid #bfdbfe;
border-radius: 8px;
padding: 10px 12px;
margin-bottom: 6px;
animation: te-slide-down 0.15s ease;
}
@keyframes te-slide-down {
from {
opacity: 0;
transform: translateY(-6px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.te-holder-card {
display: grid;
grid-template-columns: 90px 150px 1fr;
gap: 12px;
align-items: flex-start;
@media (width <= 900px) {
grid-template-columns: 90px 1fr;
}
}
.te-holder-media {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.te-holder-media-label {
font-size: 10px;
font-weight: 700;
color: #94a3b8;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.te-holder-info {
display: flex;
flex-direction: column;
gap: 3px;
}
.te-joint-name {
flex: 1;
font-weight: 600;
color: #1e293b;
}
.te-badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 999px;
font-size: 10px;
font-weight: 700;
background: #f1f5f9;
color: #475569;
border: 1px solid #e2e8f0;
white-space: nowrap;
&--primary {
background: #dbeafe;
color: #1d4ed8;
border-color: #bfdbfe;
}
}
.te-mandate-badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 999px;
font-size: 10px;
font-weight: 700;
background: #fef3c7;
color: #92400e;
border: 1px solid #fde68a;
margin-left: 8px;
text-transform: none;
letter-spacing: 0;
}
.te-sign-badge {
display: inline-flex;
align-items: center;
padding: 2px 7px;
border-radius: 999px;
font-size: 10px;
font-weight: 700;
background: #f1f5f9;
color: #475569;
&--mandatory {
background: #fff7ed;
color: #c2410c;
border: 1px solid #fdba74;
}
&--optional {
background: #f0fdf4;
color: #15803d;
border: 1px solid #86efac;
}
}
// ── Balance rows ──────────────────────────────────────────────────────────────
.te-balance-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 3px 0;
border-bottom: 1px dotted #f1f5f9;
font-size: 11px;
&:last-child {
border-bottom: none;
}
&--total {
border-top: 1px solid #e2e8f0;
border-bottom: none;
font-weight: 700;
padding-top: 6px;
margin-top: 4px;
}
}
.te-bal-num {
width: 18px;
color: #94a3b8;
font-size: 11px;
flex-shrink: 0;
}
.te-bal-label {
flex: 1;
color: #475569;
font-size: 11px;
}
.te-bal-value {
font-weight: 700;
font-variant-numeric: tabular-nums;
text-align: right;
min-width: 100px;
color: #1e293b;
&--cr {
color: #059669;
}
&--dr {
color: #dc2626;
}
}
// ── Net Balance Bar ───────────────────────────────────────────────────────────
.te-balance-bar {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0;
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 1px 4px rgb(0 0 0 / 5%);
}
.te-bal-item {
display: flex;
align-items: center;
gap: 5px;
padding: 7px 14px;
border-right: 1px solid #e2e8f0;
&:last-child {
border-right: none;
}
&__label {
display: inline-block;
padding: 2px 7px;
border-radius: 4px;
background: #f1f5f9;
color: #64748b;
font-weight: 700;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.06em;
white-space: nowrap;
border: 1px solid #e2e8f0;
}
&__val {
font-weight: 800;
font-size: 12px;
color: #1e293b;
font-variant-numeric: tabular-nums;
letter-spacing: 0.01em;
&--cr {
color: #059669;
}
&--big {
font-size: 14px;
}
}
}
// ── Required field highlight ──────────────────────────────────────────────────
.te-cell--required {
border-color: #f97316 !important;
background: #fff7ed !important;
}
// Cash payment: amount highlighted style
.te-cell--cash-auto {
background: #f0fdf4 !important;
border-color: #86efac !important;
color: #15803d !important;
font-weight: 700 !important;
}
// Denomination stock overdraft badge (closing position header)
.te-denom-overdraft-badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 999px;
font-size: 10px;
font-weight: 700;
background: #fef2f2;
color: #dc2626;
border: 1px solid #fecaca;
margin-left: 8px;
animation: te-pulse 1s ease-in-out infinite;
}
// ── Non-Individual Partners Table ─────────────────────────────────────────────
.te-nonperson-partners-header {
display: flex;
align-items: center;
gap: 5px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #64748b;
margin: 10px 0 6px;
svg {
stroke: #64748b;
}
}
.te-nonperson-table {
width: 100%;
border-collapse: collapse;
font-size: 11px;
margin-bottom: 4px;
th {
background: #f1f5f9;
color: #475569;
font-weight: 700;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 5px 8px;
text-align: left;
border-bottom: 1px solid #e2e8f0;
&.num {
text-align: center;
}
}
td {
padding: 5px 8px;
border-bottom: 1px dotted #f1f5f9;
&.num {
text-align: center;
}
}
tr:last-child td {
border-bottom: none;
}
tr:hover td {
background: #f8fafc;
}
}
// Denomination overdraft inline alert block
.te-denom-overdraft-alert {
background: #fef2f2;
border: 1px solid #fecaca;
border-left: 4px solid #dc2626;
border-radius: 6px;
padding: 10px 12px;
margin-bottom: 10px;
&__title {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
font-weight: 700;
color: #dc2626;
margin-bottom: 8px;
svg {
stroke: #dc2626;
flex-shrink: 0;
}
}
&__table {
width: 100%;
border-collapse: collapse;
font-size: 11px;
margin-bottom: 6px;
th {
background: #fee2e2;
color: #7f1d1d;
font-weight: 700;
padding: 3px 6px;
text-align: left;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.04em;
}
td {
padding: 3px 6px;
border-bottom: 1px solid #fecaca;
color: #1e293b;
}
tr:last-child td {
border-bottom: none;
}
}
&__hint {
font-size: 10px;
color: #991b1b;
font-style: italic;
}
}
// Denomination required badge
.te-denom-required-badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 999px;
font-size: 10px;
font-weight: 700;
background: #fef3c7;
color: #d97706;
border: 1px solid #fde68a;
margin-left: 8px;
animation: te-pulse 1.5s ease-in-out infinite;
}
// Denomination matches DD target badge
.te-denom-match-badge {
display: inline-flex;
align-items: center;
padding: 2px 8px;
border-radius: 999px;
font-size: 10px;
font-weight: 700;
background: #dcfce7;
color: #15803d;
border: 1px solid #86efac;
}
@keyframes te-pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
// ── Confirmation Dialog ───────────────────────────────────────────────────────
// ── Custom Alert Modal ────────────────────────────────────────────────────────
@keyframes te-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes te-pop-in {
0% {
opacity: 0;
transform: scale(0.92) translateY(12px);
}
70% {
transform: scale(1.02) translateY(-2px);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
}
}
.te-alert-overlay {
position: fixed;
inset: 0;
background: rgb(2 6 23 / 70%);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
backdrop-filter: blur(8px);
animation: te-fade-in 0.18s ease;
}
.te-alert-box {
display: flex;
width: 400px;
max-width: 94vw;
border-radius: 14px;
overflow: hidden;
box-shadow:
0 24px 60px rgb(0 0 0 / 32%),
0 0 0 1px rgb(255 255 255 / 8%);
animation: te-pop-in 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
// ── Left sidebar ─────────────────────────────────────────────────────────
&__sidebar {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
width: 56px;
flex-shrink: 0;
padding: 16px 0;
}
&__sidebar-icon {
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: rgb(255 255 255 / 20%);
box-shadow:
0 0 0 1px rgb(255 255 255 / 15%),
inset 0 1px 2px rgb(255 255 255 / 25%);
svg {
width: 17px;
height: 17px;
stroke: #fff;
}
}
&__sidebar-type {
font-size: 7px;
font-weight: 900;
letter-spacing: 0.1em;
color: rgb(255 255 255 / 70%);
text-transform: uppercase;
writing-mode: vertical-lr;
transform: rotate(180deg);
}
// ── Right content ─────────────────────────────────────────────────────────
&__content {
flex: 1;
min-width: 0;
background: #fff;
display: flex;
flex-direction: column;
}
&__content-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
padding: 14px 16px 8px;
border-bottom: 1px solid #f1f5f9;
h3 {
margin: 0;
font-size: 13.5px;
font-weight: 800;
color: #0f172a;
letter-spacing: -0.02em;
line-height: 1.3;
}
}
&__close {
background: none;
border: none;
cursor: pointer;
padding: 2px;
color: #94a3b8;
border-radius: 4px;
&:hover {
background: #f1f5f9;
color: #475569;
}
}
&__lines {
flex: 1;
max-height: 60vh;
overflow-y: auto;
padding: 10px 16px;
}
&__desc {
margin: 0 0 8px;
font-size: 11.5px;
color: #64748b;
line-height: 1.5;
}
&__kv {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 5px 10px;
margin: 3px 0;
background: #f8fafc;
border-radius: 7px;
border-left: 3px solid #e2e8f0;
transition: background-color 0.15s;
&:hover {
background: #f1f5f9;
}
}
&__kv-k {
font-size: 11px;
font-weight: 700;
color: #334155;
}
&__kv-v {
font-size: 11px;
font-weight: 600;
color: #475569;
font-variant-numeric: tabular-nums;
text-align: right;
}
&__foot {
margin: 8px 0 0;
font-size: 10px;
color: #94a3b8;
font-style: italic;
line-height: 1.4;
}
&__callout {
display: flex;
align-items: flex-start;
gap: 8px;
margin: 8px 0;
padding: 8px 10px;
background: #fffbeb;
border: 1px solid #fde68a;
border-left: 3px solid #d97706;
border-radius: 9px;
font-size: 11px;
font-weight: 600;
color: #92400e;
line-height: 1.45;
animation: te-pop-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
svg {
width: 14px;
height: 14px;
flex-shrink: 0;
margin-top: 1px;
color: #d97706;
}
}
&__actions {
display: flex;
justify-content: flex-end;
gap: 8px;
padding: 10px 16px;
border-top: 1px solid #f1f5f9;
background: #fafafa;
}
// ── Error sidebar ─────────────────────────────────────────────────────────
&--error &__sidebar {
background: linear-gradient(160deg, #dc2626, #b91c1c);
}
&--error &__kv {
border-left-color: #fca5a5;
background: #fef2f2;
}
&--error &__kv-k {
color: #991b1b;
}
// ── Warning sidebar ───────────────────────────────────────────────────────
&--warning &__sidebar {
background: linear-gradient(160deg, #d97706, #b45309);
}
&--warning &__kv {
border-left-color: #fcd34d;
background: #fffbeb;
}
&--warning &__kv-k {
color: #92400e;
}
// ── Info sidebar ──────────────────────────────────────────────────────────
&--info &__sidebar {
background: linear-gradient(160deg, #2563eb, #1d4ed8);
}
&--info &__kv {
border-left-color: #93c5fd;
background: #eff6ff;
}
&--info &__kv-k {
color: #1e40af;
}
// ── Success sidebar ───────────────────────────────────────────────────────
&--success &__sidebar {
background: linear-gradient(160deg, #059669, #047857);
}
&--success &__kv {
border-left-color: #6ee7b7;
background: #f0fdf4;
}
&--success &__kv-k {
color: #065f46;
font-weight: 800;
}
}
// ── Alert buttons ─────────────────────────────────────────────────────────────
.te-alert-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 7px 16px;
min-width: 76px;
border-radius: 7px;
border: none;
font-size: 12px;
font-weight: 700;
cursor: pointer;
transition:
filter 0.15s,
transform 0.1s;
&:active {
transform: scale(0.96);
}
&--ghost {
background: #f1f5f9;
color: #64748b;
border: 1px solid #e2e8f0;
&:hover {
background: #e2e8f0;
}
}
&--solid {
color: #fff;
&:hover {
filter: brightness(1.1);
}
&.te-alert-btn--error {
background: #dc2626;
}
&.te-alert-btn--success {
background: #059669;
}
&.te-alert-btn--warning {
background: #d97706;
}
&.te-alert-btn--info {
background: #2563eb;
}
}
}
.te-confirm-overlay {
position: fixed;
inset: 0;
background: rgb(0 0 0 / 50%);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
}
.te-confirm-box {
background: #fff;
border-radius: 14px;
overflow: hidden;
width: 400px;
max-width: 95vw;
box-shadow: 0 20px 60px rgb(0 0 0 / 25%);
animation: te-slide-down 0.2s ease;
}
.te-confirm-header {
display: flex;
align-items: center;
gap: 10px;
padding: 14px 20px;
color: #fff;
font-size: 14px;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
&--deposit {
background: linear-gradient(135deg, #059669, #047857);
}
&--withdrawal {
background: linear-gradient(135deg, #dc2626, #b91c1c);
}
&--disbursement {
background: linear-gradient(135deg, #0284c7, #0369a1);
}
&--action {
background: linear-gradient(135deg, #6366f1, #4f46e5);
}
}
.te-confirm-icon {
font-size: 20px;
}
// ── Account Actions popup ─────────────────────────────────────────────────────
.te-aa-box {
width: 460px;
}
.te-aa-account {
display: flex;
flex-direction: column;
gap: 2px;
padding: 10px 12px;
background: #f8fafc;
border: 1px solid #e2e8f0;
border-radius: 8px;
margin-bottom: 4px;
&__no {
font-family: 'Courier New', monospace;
font-size: 13px;
font-weight: 700;
color: #1e40af;
letter-spacing: 0.03em;
}
&__name {
font-size: 13px;
font-weight: 600;
color: #0d1b2a;
}
}
.te-aa-check {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 12px;
border: 1.5px solid #fecaca;
background: #fef2f2;
border-radius: 8px;
cursor: pointer;
transition: border-color 0.15s;
&:hover {
border-color: #f87171;
}
input {
margin-top: 2px;
width: 16px;
height: 16px;
accent-color: #dc2626;
cursor: pointer;
flex-shrink: 0;
}
span {
display: flex;
flex-direction: column;
gap: 2px;
}
strong {
font-size: 13px;
font-weight: 700;
color: #991b1b;
}
small {
font-size: 11.5px;
color: #b91c1c;
line-height: 1.4;
}
}
.te-aa-calc {
display: flex;
flex-direction: column;
gap: 6px;
padding: 12px;
background: #f0fdf4;
border: 1px solid #bbf7d0;
border-radius: 8px;
font-size: 13px;
&--loading,
&--error {
display: block;
font-size: 12.5px;
font-weight: 600;
text-align: center;
padding: 14px 12px;
}
&--loading {
background: #f8fafc;
border-color: #e2e8f0;
color: #64748b;
}
&--error {
background: #fef2f2;
border-color: #fecaca;
color: #b91c1c;
}
&__row {
display: flex;
justify-content: space-between;
align-items: center;
color: #166534;
&--total {
margin-top: 4px;
padding-top: 8px;
border-top: 1.5px dashed #bbf7d0;
font-weight: 800;
font-size: 15px;
color: #15803d;
}
}
&__note {
margin-top: 4px;
font-size: 11px;
line-height: 1.45;
color: #4d7c56;
}
&__warn {
margin-top: 4px;
padding: 7px 9px;
background: #fffbeb;
border: 1px solid #fde68a;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
line-height: 1.45;
color: #92400e;
}
}
.te-aa-next {
margin-top: 4px;
padding: 9px 11px;
background: #eef2ff;
border: 1px solid #c7d2fe;
border-radius: 7px;
font-size: 12px;
line-height: 1.5;
color: #3730a3;
strong {
font-weight: 700;
}
}
.te-confirm-body {
padding: 16px 20px;
display: flex;
flex-direction: column;
gap: 6px;
}
.te-confirm-row {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 13px;
padding: 4px 0;
border-bottom: 1px dotted #f1f5f9;
&:last-child {
border-bottom: none;
}
&--amount .te-confirm-val {
font-size: 16px;
font-weight: 700;
}
&--after .te-confirm-val {
font-size: 17px;
}
}
.te-confirm-label {
color: #64748b;
font-size: 12px;
font-weight: 600;
}
.te-confirm-val {
color: #1e293b;
font-weight: 500;
}
.te-confirm-divider {
border-top: 2px solid #e2e8f0;
margin: 6px 0;
}
.te-confirm-disbursed-note {
justify-content: center;
border-bottom: none;
margin-top: 4px;
}
.te-confirm-disbursed-badge {
display: inline-block;
background: #dcfce7;
color: #166534;
border: 1px solid #86efac;
border-radius: 6px;
padding: 6px 12px;
font-size: 11.5px;
font-weight: 600;
text-align: center;
width: 100%;
}
.te-confirm-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
padding: 12px 20px;
background: #f8fafc;
border-top: 1px solid #e2e8f0;
}
// ── Alerts ────────────────────────────────────────────────────────────────────
.te-alerts-wrap {
display: flex;
flex-direction: column;
gap: 6px;
}
.te-alert {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
border: 1px solid;
svg {
flex-shrink: 0;
}
&--danger {
background: #fef2f2;
color: #dc2626;
border-color: #fecaca;
}
&--warning {
background: #fffbeb;
color: #d97706;
border-color: #fde68a;
}
&--info {
background: #eff6ff;
color: #2563eb;
border-color: #bfdbfe;
}
}
// ── Extended rows ─────────────────────────────────────────────────────────────
.te-ext-row {
display: grid;
grid-template-columns: 140px 200px 1fr 1fr;
gap: 10px;
&--2 {
grid-template-columns: 1fr 1fr;
}
@media (width <= 1100px) {
grid-template-columns: repeat(2, 1fr);
}
@media (width <= 700px) {
grid-template-columns: 1fr;
}
}
.te-photo-img {
max-width: 100px;
max-height: 120px;
border-radius: 8px;
border: 1px solid #e2e8f0;
object-fit: cover;
}
.te-photo-img--clickable {
cursor: zoom-in;
transition:
transform 0.15s,
box-shadow 0.15s;
&:hover {
transform: scale(1.04);
box-shadow: 0 4px 16px rgb(0 0 0 / 20%);
}
}
.te-sig-img {
max-width: 160px;
max-height: 70px;
object-fit: contain;
border: 1px solid #e2e8f0;
border-radius: 4px;
background: #fff;
}
.te-photo-placeholder {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
padding: 8px 0;
}
.te-facilities-grid {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 8px;
}
.te-facility {
display: inline-flex;
align-items: center;
padding: 3px 8px;
border-radius: 999px;
font-size: 11px;
font-weight: 700;
border: 1px solid;
&--on {
background: #f0fdf4;
color: #15803d;
border-color: #bbf7d0;
}
&--off {
background: #f8fafc;
color: #94a3b8;
border-color: #e2e8f0;
text-decoration: line-through;
}
}
.te-tds-badge {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 3px 8px;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
background: #eff6ff;
color: #1d4ed8;
border: 1px solid #bfdbfe;
margin-top: 6px;
&--warn {
background: #fffbeb;
color: #d97706;
border-color: #fde68a;
}
}
// ── Compliance cards (NEFT/RTGS + Cheque Clearing) ───────────────────────────
.te-compliance-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #f1f5f9;
}
.te-compliance-card {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
border-radius: 8px;
background: #f8fafc;
border: 1px solid #e2e8f0;
svg {
color: #64748b;
flex-shrink: 0;
}
&--alert {
background: #fff7ed;
border-color: #fed7aa;
svg {
color: #ea580c;
}
}
}
.te-compliance-label {
display: block;
font-size: 10px;
color: #64748b;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 2px;
}
.te-compliance-val {
display: block;
font-size: 13px;
font-weight: 800;
color: #1e293b;
font-variant-numeric: tabular-nums;
}
// Today panel — fixed height, transactions scroll, total sticky at bottom
.te-panel__body--today {
display: flex;
flex-direction: column;
padding: 0 !important;
max-height: 110px;
}
.te-today-scroll {
flex: 1;
overflow-y: auto;
padding: 8px 14px 4px;
scrollbar-width: thin;
scrollbar-color: #cbd5e1 transparent;
&::-webkit-scrollbar {
width: 4px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: #cbd5e1;
border-radius: 4px;
}
}
.te-today-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 0;
border-bottom: 1px dotted #f1f5f9;
font-size: 12px;
&:last-child {
border-bottom: none;
}
}
.te-today-type {
color: #475569;
font-size: 11px;
}
.te-today-amt {
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.te-today-total {
display: flex;
justify-content: space-between;
padding: 7px 14px;
border-top: 2px solid #e2e8f0;
background: #f8fafc;
font-size: 12px;
font-weight: 700;
flex-shrink: 0;
}
.te-linked-section {
font-size: 10px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #94a3b8;
margin: 8px 0 4px;
&:first-child {
margin-top: 0;
}
}
.te-linked-row {
display: flex;
align-items: center;
gap: 8px;
padding: 3px 0;
border-bottom: 1px dotted #f1f5f9;
font-size: 11px;
&:last-child {
border-bottom: none;
}
}
.te-si-row {
padding: 6px 0;
border-bottom: 1px solid #f1f5f9;
&:last-child {
border-bottom: none;
}
}
.te-si-name {
font-size: 12px;
font-weight: 600;
color: #1e293b;
margin-bottom: 2px;
}
.te-si-meta {
display: flex;
align-items: center;
gap: 8px;
font-size: 11px;
}
// ── Withdrawal rule alert ─────────────────────────────────────────────────────
.te-withdrawal-rule {
display: flex;
align-items: center;
gap: 8px;
margin-top: 8px;
padding: 8px 10px;
border-radius: 7px;
font-size: 11px;
font-weight: 700;
border: 1px solid;
&--danger {
background: #fef2f2;
color: #dc2626;
border-color: #fecaca;
}
&--warning {
background: #fffbeb;
color: #d97706;
border-color: #fde68a;
}
}
.te-wr-icon {
font-size: 14px;
flex-shrink: 0;
}
.te-wr-msg {
flex: 1;
line-height: 1.4;
}
// ── Denomination Section ──────────────────────────────────────────────────────
.te-denom-wrap {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 6px;
@media (width <= 1100px) {
grid-template-columns: 1fr 1fr;
}
@media (width <= 700px) {
grid-template-columns: 1fr;
}
}
.te-denom-table {
width: 100%;
border-collapse: collapse;
font-size: 11px;
th {
background: #f1f5f9;
color: #64748b;
font-size: 9.5px;
font-weight: 700;
letter-spacing: 0.05em;
text-transform: uppercase;
padding: 3px 8px;
border-bottom: 1px solid #e2e8f0;
text-align: left;
&.num {
text-align: right;
}
}
td {
padding: 2px 8px;
border-bottom: 1px solid #f8fafc;
color: #1e293b;
font-size: 11px;
&.num {
text-align: right;
font-variant-numeric: tabular-nums;
}
}
tr:last-child td {
border-bottom: none;
}
tr:hover td {
background: #f8fafc;
}
tfoot td {
background: #f1f5f9;
border-top: 2px solid #e2e8f0;
font-size: 11px;
padding: 4px 8px;
}
}
// ── Section header row inside denomination table ──────────────────────────────
.te-denom-section-row td {
padding: 4px 10px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
border-top: 1px solid #e2e8f0;
&.te-denom-section-row__label {
color: #1d4ed8;
background: #eff6ff;
}
}
.te-denom-section-row--coin td.te-denom-section-row__label {
color: #92400e;
background: #fffbeb;
}
.te-denom-section-label {
font-size: 10px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #1d4ed8;
background: #eff6ff;
border-bottom: 1px solid #dbeafe;
border-top: 1px solid #e2e8f0;
padding: 4px 10px;
&--coin {
color: #92400e;
background: #fffbeb;
border-color: #fde68a;
}
}
.te-denom-chip {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 36px;
height: 20px;
padding: 0 6px;
border-radius: 5px;
font-size: 11px;
font-weight: 700;
background: linear-gradient(135deg, #ecfeff, #cffafe);
color: #155e75;
border: 1px solid #a5f3fc;
&--coin {
border-radius: 50%;
width: 24px;
height: 24px;
min-width: 24px;
padding: 0;
font-size: 10px;
background: linear-gradient(135deg, #fef9c3, #fde68a);
color: #854d0e;
border-color: #fcd34d;
}
}
.te-denom-stepper {
display: inline-flex;
align-items: center;
gap: 4px;
margin-left: auto;
button {
width: 22px;
height: 22px;
border-radius: 50%;
border: 1.5px solid #e2e8f0;
background: #f8fafc;
font-size: 14px;
font-weight: 600;
color: #475569;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.15s;
padding: 0;
line-height: 1;
&:hover:not(:disabled) {
background: #0ea5e9;
border-color: #0ea5e9;
color: #fff;
}
&:disabled {
opacity: 0.3;
cursor: not-allowed;
}
}
input {
width: 50px;
height: 24px;
border: 1.5px solid #e2e8f0;
border-radius: 6px;
text-align: center;
font-size: 11px;
font-weight: 700;
color: #1e293b;
background: #fff;
outline: none;
appearance: textfield;
transition:
border-color 0.15s,
box-shadow 0.15s;
&:focus {
border-color: #0ea5e9;
box-shadow: 0 0 0 2px rgb(14 165 233 / 15%);
}
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
appearance: none;
}
&::placeholder {
color: #cbd5e1;
}
}
}
.te-denom-actions {
display: flex;
gap: 6px;
margin-top: 6px;
padding-top: 6px;
border-top: 1px solid #e2e8f0;
}
.te-cr {
color: #059669 !important;
}
.te-dr {
color: #dc2626 !important;
}
.te-closing-row--neg td {
background: #fef2f2;
}
// ── Basic Info horizontal layout ─────────────────────────────────────────────
.te-basic-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
.te-balance-row {
flex-direction: column;
align-items: flex-start;
border-right: 1px solid #f1f5f9;
border-bottom: none;
padding: 6px 12px;
&:last-child {
border-right: none;
}
&--total {
border-top: none;
padding-top: 6px;
margin-top: 0;
}
.te-bal-label {
font-size: 10px;
color: #94a3b8;
margin-bottom: 2px;
}
.te-bal-value {
font-size: 13px;
min-width: unset;
}
}
@media (width <= 900px) {
grid-template-columns: repeat(3, 1fr);
}
}
// ── Action Buttons ────────────────────────────────────────────────────────────
.te-actions {
display: flex;
gap: 8px;
padding: 12px 16px;
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 10px;
justify-content: flex-end;
flex-wrap: wrap;
box-shadow: 0 1px 4px rgb(0 0 0 / 5%);
}
.te-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 7px 18px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
font-family: inherit;
cursor: pointer;
border: 1.5px solid #e2e8f0;
background: #fff;
color: #475569;
transition: all 0.15s;
&:hover {
background: #f8fafc;
border-color: #cbd5e1;
color: #1e293b;
}
&:active {
transform: scale(0.98);
}
&--primary {
background: linear-gradient(135deg, #0ea5e9, #0284c7);
color: #fff;
border-color: transparent;
box-shadow: 0 2px 8px rgb(14 165 233 / 30%);
&:hover {
background: linear-gradient(135deg, #0284c7, #0369a1);
}
}
&--exit {
background: #fff;
color: #ef4444;
border-color: #fecaca;
&:hover {
background: #fef2f2;
}
}
&--mode {
background: linear-gradient(135deg, #8b5cf6, #7c3aed);
color: #fff;
border-color: transparent;
box-shadow: 0 2px 8px rgb(139 92 246 / 30%);
min-width: 130px;
&:hover {
background: linear-gradient(135deg, #7c3aed, #6d28d9);
}
}
}
// ── Approved Withdrawal Banner ────────────────────────────────────────────────
.ws-withdrawal-banner {
display: flex;
align-items: flex-start;
gap: 12px;
margin: 10px 16px;
padding: 12px 14px;
background: linear-gradient(135deg, #ecfdf5, #f0fdf4);
border: 1.5px solid #6ee7b7;
border-radius: 10px;
box-shadow: 0 1px 4px rgb(16 185 129 / 12%);
/* A closure is destructive, so it must not read like the ordinary green "all good" banner. */
&--closure {
background: linear-gradient(135deg, #eef2ff, #f5f3ff);
border-color: #a5b4fc;
box-shadow: 0 1px 4px rgb(79 70 229 / 14%);
.ws-withdrawal-banner__icon {
color: #4f46e5;
}
.ws-withdrawal-banner__title {
color: #3730a3;
}
}
&--loading {
background: #f8fafc;
border-color: #cbd5e1;
align-items: center;
gap: 10px;
color: #475569;
font-size: 13px;
}
&__spinner {
width: 18px;
height: 18px;
border: 2px solid #e2e8f0;
border-top-color: #3b82f6;
border-radius: 50%;
animation: ws-spin 0.7s linear infinite;
flex-shrink: 0;
}
&__icon {
color: #10b981;
font-size: 22px;
width: 22px;
height: 22px;
flex-shrink: 0;
margin-top: 2px;
}
&__content {
flex: 1;
min-width: 0;
}
&__title {
font-size: 13px;
font-weight: 700;
color: #065f46;
margin-bottom: 4px;
}
&__details {
display: flex;
flex-wrap: wrap;
gap: 4px 6px;
font-size: 12px;
color: #374151;
}
&__note {
margin-top: 6px;
font-size: 11px;
color: #6b7280;
}
&__clear {
background: none;
border: none;
cursor: pointer;
color: #9ca3af;
padding: 2px;
line-height: 1;
display: flex;
align-items: center;
border-radius: 4px;
flex-shrink: 0;
&:hover {
color: #6b7280;
background: #f1f5f9;
}
mat-icon {
font-size: 18px;
width: 18px;
height: 18px;
}
}
}
.ws-wb-sep {
color: #9ca3af;
}
@keyframes ws-spin {
to {
transform: rotate(360deg);
}
}
.ws-dd-unconfigured-banner {
display: flex;
align-items: center;
gap: 12px;
margin: 10px 16px;
padding: 12px 16px;
background: #fffbeb;
border: 1.5px solid #fcd34d;
border-radius: 8px;
color: #92400e;
font-size: 13px;
mat-icon {
color: #d97706;
font-size: 24px;
width: 24px;
height: 24px;
flex-shrink: 0;
}
&__text {
flex: 1;
line-height: 1.4;
strong {
color: #78350f;
}
}
}
.te-dd-issue-btn {
display: inline-flex;
align-items: center;
gap: 8px;
background: linear-gradient(135deg, #0284c7, #0ea5e9);
color: #fff;
border: none;
border-radius: 6px;
padding: 7px 16px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
box-shadow: 0 2px 4px rgb(2 132 199 / 35%);
transition: all 0.15s ease-in-out;
letter-spacing: 0.2px;
&:hover:not(:disabled) {
background: linear-gradient(135deg, #0369a1, #0284c7);
box-shadow: 0 3px 8px rgb(2 132 199 / 50%);
transform: translateY(-1px);
}
&:active:not(:disabled) {
transform: translateY(0);
}
&:disabled {
background: #cbd5e1;
color: #64748b;
cursor: not-allowed;
box-shadow: none;
}
}