/* =====================================================================
   REFUND MODULE - shared UI theme  (Fees Refund screens ONLY)
   ---------------------------------------------------------------------
   CANONICAL DESIGN for every Refund screen (Request / Approval /
   Refund Receipt Setup / Fees Refund). Reuse this file on all new
   Refund pages - do NOT restyle per page.

   SCOPING RULE: every selector is namespaced under `.refund-theme`, so it
   CANNOT affect any existing page / global CSS. Only a page whose root
   element has class="refund-theme" is styled.

   CENTRALIZED THEMING (single source of truth):
   Every colour lives in the token block below. Change ONE token and it
   cascades to all Refund components (buttons, headers, tables, badges,
   modals, grid...). No rule uses a hardcoded colour - all are var().

   FUTURE "user selects a theme": override these same variable names for
   the user's choice - e.g. inject <style>.refund-theme{--brand:#7b2ff7;...}
   (or move the token block to :root to theme the whole project) and the
   entire UI recolours automatically. Only --brand / --brand-dark / --ok /
   --no / --warn need changing for a new accent; the rest derive the look.
   ===================================================================== */

/* ---------------------------------------------------------------------
   TOKENS ARE DECLARED ON :root, APPLIED ONLY UNDER .refund-theme.
   A custom-property declaration styles NOTHING by itself, so :root cannot
   affect any existing page - it only makes var(--brand) RESOLVABLE.

   They used to live on .refund-theme, which silently broke every widget that
   renders OUTSIDE the page root: $ngConfirm, select2 and the datepickers all
   append to <body>, so var(--brand) resolved to nothing there and they came
   out unstyled. That is why the Approve button was a grey block, and why the
   select2 rules further down this file never matched anything.

   ACCENT: presets are keyed on a bare `.theme-*` so <body class="theme-navy">
   reaches body-appended widgets too. A legacy theme-blue left on a page div
   still works, so the migration can go one page at a time.
   --------------------------------------------------------------------- */
:root{
  /* ===== THEME TOKENS - edit here only ===== */
  /* ---- UNIFIED THEME PALETTE - canonical blue/red/green/yellow (single source of truth, 17-07-2026).
       The semantic tokens below (--brand/--edit blue, --ok green, --no red, --warn yellow) reference
       these, so the previous near-duplicate shades are gone. ---- */
  --unifiedtheme-blue:#408dfb;
  --unifiedtheme-red:#f7525a;
  --unifiedtheme-green:#22b378;
  --unifiedtheme-yellow:#fd9134;
  /* brand / primary */
  --brand:var(--unifiedtheme-blue); /* primary  (default accent; presets override per school) */
  --brand-dark:#2a72d8;       /* primary hover / emphasis */
  --brand-2:#559bfc;          /* gradient top (table head) */
  --brand-edge:#2360bf;       /* dark brand border */
  --brand-light:#eaf3ff;      /* tint background */
  --brand-ice:#d5e7ff;        /* icon on dark header */
  --brand-hover-border:#bcd8fb;
  /* status */
  --ok:var(--unifiedtheme-green);   --ok-bg:#e4f6ef;
  --no:var(--unifiedtheme-red);   --no-bg:#fdeaea;   --no-border:#f6c1c4;
  --warn:var(--unifiedtheme-yellow);
  --pend:#8a6300; --pend-bg:#fff4dd;   /* pending approval */
  --appr-bg:#e7eefb;                 /* approved bg (fg = brand-dark) */
  --canc-bg:#eceff3;                 /* cancelled bg (fg = muted) */
  --accent:#e8720c;           /* filtered-column arrow */
  /* neutrals / surfaces */
  --ink:#1c2a3a;
  --muted:#6b7a90;
  --line:#d9e2ec;
  --grip:#b6c0cc;
  --on-brand:#fff;            /* text/icons on a brand-coloured surface */
  --surface:#fff;
  --surface-2:#fbfdff;        /* soft panel bg */
  --head-tint:#f6f9fd;        /* card header gradient end */
  --line-soft:#f0f2f5;        /* divider inside dense read-only lists - lighter than --line, which is
                                 too strong once every row of a label/value grid carries one */
  --row-alt:#f7fafd;          /* zebra */
  --row-hover:#eef5fc;
  --row-hover-soft:#f8fbff;
  --locked-bg:#f6f8fb;
  /* ---- DISABLED INPUTS - COMMON (added 05-08-2026, bug sheet 105) ----------------------
     A dedicated, deliberately DARKER set, because every existing candidate was too pale to
     read as disabled: --surface-2 is #fbfdff and --locked-bg #f6f8fb, i.e. 4 and 9 units off
     white. Measured on Student Registration: the disabled Admission Year box came out
     rgb(251,253,255) against a white card - the cue was technically present and perceptually
     absent, which is exactly the report ("disable reh che, but disable jeva dekhata nathi").
     #e4eaf1 is far enough from both white and the #f7fafd zebra to be unmistakable while
     still looking like a form control rather than an error.
     --disabled-ink is darker than --muted so the VALUE stays readable: a disabled field is
     usually disabled because its value matters and must not be edited. Greying it into
     illegibility hides the very thing the user needs to see. */
  --disabled-bg:#e4eaf1;
  --disabled-ink:#6b7889;
  --disabled-line:#c9d4e0;
  --crit-border:#d3e2f4;
  --err-bg:#fff5f5;
  /* effects */
  --shadow:0 1px 3px rgba(16,42,74,.12);
  --shadow-lg:0 12px 44px rgba(0,0,0,.32);
  --shadow-menu:0 4px 14px rgba(16,42,74,.16);
  --overlay-white:rgba(255,255,255,.2);
  /* ---- action-button tints (added 17-07-2026) ----
     These are SEMANTIC and deliberately NOT in the accent preset block: a green
     "activate" must stay green when a school picks the red accent, or it renders
     identically to Delete sitting next to it. Only --brand-* follows the accent. */
  --ok-border:#aee2cd;        /* activate button border */
  --warn-bg:#fff0e0;          /* deactivate tint (amber = reversible, not destructive) */
  --warn-border:#fad1a6;
  --btn-disabled-bg:#f4f6f9;
  --btn-disabled-ink:#a7b1bf;
  --ok-bg-hover:#d3efe1;
  --warn-bg-hover:#ffe5cc;
  --no-bg-hover:#fbdadb;
  /* ---- "stop" red: a DEEPER red for confirm dialogs (added 26-08-2026) ----
     --no (#f7525a, the unified-theme red) is tuned for small surfaces: an icon
     button, a pill, a 13px label. Stretched across a full dialog header it turns
     bright coral - loud rather than serious, and it clashes with the maroon brand
     sitting behind it. This is the same red taken darker so it still says STOP at
     header size. It is a separate token, NOT a change to --no, because --no is
     shared by every delete button, pill and validation message in the app and
     those all read correctly at their own size. */
  --stop:#b3252e;
  --stop-border:#8e1d24;
  /* EDIT is a FIXED blue - it is NOT --brand and NOT in the accent presets.
     Blue-for-edit is the convention, and fixing it is what stops the collision:
     a school on the GREEN accent would otherwise get a green Edit sitting beside
     the green Activate. Same value as the blue accent, so the default looks
     identical - it just stops moving when the accent does. */
  --edit:var(--unifiedtheme-blue);
  --edit-bg:#eaf3ff;
  --edit-border:#bcd8fb;
  --edit-bg-hover:#d5e7ff;
  /* form field states (points 5 + 7, 17-07-2026) */
  --placeholder:#98a4b0;      /* one colour for EVERY placeholder: input, textarea, select, date */
  --readonly-bg:#f6f8fb;      /* readonly = still readable, just not yours to change */
  /* ---- neutrals pulled out of hardcoded rules (task 2, 17-07-2026) ----
     EXACT values, deliberately not snapped to near-matching tokens. #f6f9fc vs --head-tint
     #f6f9fd is one unit apart and it was tempting to merge them; silent drift across 12
     pages is not worth the tidier list. Consolidate later, on purpose, looking at a screen.
     These are NEUTRALS: they do NOT follow the accent, and should not - the accent moves
     --brand-* only. What they buy is point 3: change one token, every page follows. */
  --tip-bg:#243244;           /* tooltip body + its arrow */
  --tip-ink:#fff;             /* text on the tooltip - NOT --on-brand: the tooltip is not
                                 a brand surface, borrowing it would couple them by accident */
  --ico:#98a4b0;              /* info icon rest  (same value as --placeholder, own name:
                                 an icon and a placeholder drift apart the day one changes) */
  --ico-hover:#5b6b7b;
  --muted-2:#8a93a2;          /* second-tier muted - lighter than --muted */
  --subhead-bg:#eef2f6;       /* detail-popup grid head: deliberately NOT the brand gradient,
                                 a sub-header must not compete with the real one */
  --subhead-ink:#3a4756;
  --subhead-line:#dbe2e9;
  --subhead-td:#33414f;
  --dash:#cfd6df;             /* dashed "empty" borders */
  --token-hl:#fff3bf;         /* ###Token### highlight in the editor */
  --token-hl-line:#f0d97a;
  --panel:#f6f9fc;

  /* ---------------------------------------------------------------------
     FESTIVAL GREETING PALETTES  (dashboard banner, .dg-a-* below)
     ---------------------------------------------------------------------
     These are the ONE set of colours in this file that are deliberately NOT
     derived from --brand. A Diwali banner has to look like Diwali whether the
     school runs the blue, green, plum or orange accent - recolouring the
     greeting with the app accent would produce a green Holi and a blue
     Diwali, which reads as a bug rather than a theme.

     They are still tokens, not inline values, so the set can be retuned in
     one place - and so nothing in the stylesheet hardcodes a colour.

     Each palette is a two-stop gradient + the ink that stays readable on it.
     Every pair was checked to clear 4.5:1 for the sub-line and well past it
     for the title.
     ------------------------------------------------------------------ */
  --dg-ink:#fff;                 /* title on any festival gradient */
  --dg-ink-soft:rgba(255,255,255,.88);   /* sub-line: quieter, still >4.5:1 */
  --dg-ink-meta:rgba(255,255,255,.72);
  --dg-badge:rgba(255,255,255,.16);
  /*  There is deliberately NO --dg-glyph token. The drifting icons are emoji, and
      emoji are colour glyphs that ignore `color` entirely - a token here would look
      like it controlled them while doing nothing. They are faded with opacity in
      the dgDrift keyframes instead. */

  --dg-gold-a:#b5580c;  --dg-gold-b:#e8920c;    /* Diwali, Labh Pancham */
  --dg-plum-a:#6a1f6d;  --dg-plum-b:#a8388d;    /* Navratri */
  --dg-rose-a:#a81b52;  --dg-rose-b:#e0447a;    /* Holi, Raksha Bandhan */
  --dg-indigo-a:#22307a; --dg-indigo-b:#4757b8;  /* Guru Purnima, New Year */
  --dg-sky-a:#0b5c86;   --dg-sky-b:#1c8fbf;     /* Uttarayan, Gandhi Jayanti */
  --dg-pine-a:#14522f;  --dg-pine-b:#1f7d47;    /* Christmas */
  --dg-tri-a:#c1571a;   --dg-tri-b:#1a6b3c;     /* Republic / Independence Day:
                                                   saffron -> green, with the
                                                   white in the middle stop */
  --dg-tri-mid:#f3f4f2;

  /* the plain, non-festival day - the ~350 days that are NOT a festival, so
     this one DOES follow the brand: it is ordinary app chrome, not a theme */
  --dg-plain-a:var(--brand);
  --dg-plain-b:var(--brand-dark);
}

/* =====================================================================
   TYPEFACE - POPPINS, WHOLE ERP, EXCEPT TABLE DATA
   ---------------------------------------------------------------------
   Loaded once in _Layout.cshtml (no per-view <link> copies) and applied
   here at `body` level, deliberately NOT scoped to .refund-theme, because
   this was asked for across the whole ERP - the theme class only exists on
   the migrated pages.

   `inherit` on form controls is needed because browsers do NOT inherit the
   page font into <input>/<select>/<textarea>/<button> by default - without
   it every field would still render in the UA font.

   TABLE DATA IS EXCLUDED (see the rule below): grids are dense, number-
   heavy and often wide, and Poppins is a geometric display face - wider
   per character, with a single-storey 'a' and near-circular 0/o that make
   long columns of codes and amounts harder to scan. Keeping the grid on
   the system UI stack also keeps figures better aligned. Only `td`/`th`
   inside real tables are excluded, so table TOOLBARS, headers above the
   grid, pagination and modals all still use Poppins.
   ===================================================================== */
body,
body input, body select, body textarea, body button,
body .form-control, body .btn{
  font-family:'Poppins',"Segoe UI",Roboto,Arial,sans-serif;
}
/* table data keeps the system stack - see reasoning above */
body table th,
body table td{
  font-family:"Segoe UI",Roboto,Arial,sans-serif;
}

/* The only page-wide APPLICATION of the tokens. Scoped: an old page has no
   .refund-theme root, so none of this reaches it. */
.refund-theme{
  color:var(--ink);
  font-family:'Poppins',"Segoe UI",Roboto,Arial,sans-serif;
  font-size:13px;
}


/* =====================================================================
   CHECKBOXES / RADIOS  (17-07-2026)
   ---------------------------------------------------------------------
   ONE rule for every tick on every themed page. accent-color was already in use - but
   only in FOUR hand-picked places (#ExportCurrentView checkbox + radio, the search
   multi-select, one select). So the Export popup tracked the theme while Customize
   Column stayed browser-blue. That is what Devang spotted, and it is the same shape as
   the three action-button systems and the four confirm-dialog mechanisms: the pattern
   existed, it was just never made common.

   Low specificity ON PURPOSE - it sets the default; anything that must differ overrides.

   accent-color is Chrome 93+ / Firefox 92+ / Safari 15.4+. Older browsers ignore it and
   render the stock blue tick: the control still works, it is just not themed. That beats
   replacing every checkbox with a styled pseudo-element, which quietly breaks keyboard
   and screen-reader behaviour unless done very carefully.
   ===================================================================== */
.refund-theme input[type=checkbox],
.refund-theme input[type=radio]{ accent-color:var(--brand); }

/* =====================================================================
   ACCENT PRESETS - the 10 colours a user may choose (Devang, 17-07-2026).
   ---------------------------------------------------------------------
   Only the BRAND/primary family recolours. --ok / --no / --warn / --edit never move.
   Keyed on a bare .theme-* so <body class="theme-navy"> reaches modals and dropdowns,
   which render outside the page root.

   *** GREEN, RED AND ORANGE ARE NOT HERE, AND THAT IS THE POINT. ***
   In the action column green means ACTIVATE, red means DELETE, amber means SET INACTIVE.
   A user on a green accent gets a green Save beside a green Activate icon and the column
   stops meaning anything; on red, Save looks like Delete. Those three presets existed and
   were removed - do not add them back without moving the semantics first, which you cannot.

   FIXED VALUES, NOT COMPUTED. Every shade is hand-checked so white --on-brand text stays
   readable. Deriving shades from a base at runtime is how a pale pick ends up as white
   text on a white button.

   The palette also lives in dbo.SspUserThemePreference (edusis) as a server-side
   whitelist. Adding a colour = BOTH places, or the picker offers something the server
   rejects, or the server accepts a key with no CSS rule behind it.
   ===================================================================== */
.theme-blue{   /* DEFAULT */
  --brand:#408DFB; --brand-dark:#2a72d8; --brand-2:#559bfc; --brand-edge:#2360bf;
  --brand-light:#eaf3ff; --brand-ice:#d5e7ff; --brand-hover-border:#bcd8fb; --appr-bg:#e9f2ff;
}
.theme-navy{   /* the original locked mockup brand */
  --brand:#1f5fa8; --brand-dark:#164a83; --brand-2:#2f76c4; --brand-edge:#0f3765;
  --brand-light:#eaf1fa; --brand-ice:#cfe0f3; --brand-hover-border:#b3cde9; --appr-bg:#eaf1fa;
}
.theme-sky{
  --brand:#0284c7; --brand-dark:#0269a0; --brand-2:#199fe0; --brand-edge:#015b89;
  --brand-light:#e8f5fd; --brand-ice:#c9e8f8; --brand-hover-border:#a7d8f2; --appr-bg:#e8f5fd;
}
.theme-teal{   /* closest to --ok green; ~30 deg apart */
  --brand:#0f766e; --brand-dark:#0b5a54; --brand-2:#149289; --brand-edge:#094a45;
  --brand-light:#e6f5f4; --brand-ice:#c7e9e6; --brand-hover-border:#a5dbd6; --appr-bg:#e6f5f4;
}
.theme-indigo{
  --brand:#4353c4; --brand-dark:#33409e; --brand-2:#5b6ad6; --brand-edge:#2a3689;
  --brand-light:#eceffc; --brand-ice:#d7dbf7; --brand-hover-border:#bcc3f0; --appr-bg:#eceffc;
}
.theme-violet{
  --brand:#7b2ff7; --brand-dark:#5a1fb0; --brand-2:#8b45f8; --brand-edge:#4a1a94;
  --brand-light:#f0e9fe; --brand-ice:#e2d5fc; --brand-hover-border:#cdb8f5; --appr-bg:#f0e9fe;
}
.theme-purple{
  --brand:#9333ea; --brand-dark:#7526bd; --brand-2:#a453ee; --brand-edge:#5b1e93;
  --brand-light:#f5edfe; --brand-ice:#e9d8fb; --brand-hover-border:#d9bdf7; --appr-bg:#f5edfe;
}
.theme-fuchsia{
  --brand:#a21caf; --brand-dark:#81168b; --brand-2:#bd28cb; --brand-edge:#64116b;
  --brand-light:#fbecfc; --brand-ice:#f3d4f6; --brand-hover-border:#eab8ef; --appr-bg:#fbecfc;
}
.theme-plum{
  --brand:#7e1f4b; --brand-dark:#62183a; --brand-2:#9c2a5f; --brand-edge:#4e1330;
  --brand-light:#faebf2; --brand-ice:#f0d3e0; --brand-hover-border:#e3b3ca; --appr-bg:#faebf2;
}
.theme-slate{
  --brand:#475569; --brand-dark:#374151; --brand-2:#5b6b82; --brand-edge:#2b3543;
  --brand-light:#eef1f5; --brand-ice:#d6dbe3; --brand-hover-border:#bcc4d0; --appr-bg:#eef1f5;
}
/* --- unified palette accents (added 17-07-2026, on request) - green/red/yellow carry action-column
   meaning; offered here anyway. yellow gets a dark --on-brand so text stays legible on the light base. --- */
.theme-green{
  --brand:#22b378; --brand-dark:#1b9364; --brand-2:#2ec489; --brand-edge:#177a53;
  --brand-light:#e4f6ef; --brand-ice:#c3ead9; --brand-hover-border:#a9e0c8; --appr-bg:#e4f6ef;
}
.theme-red{
  --brand:#f7525a; --brand-dark:#e13842; --brand-2:#f96b72; --brand-edge:#c9313a;
  --brand-light:#feecec; --brand-ice:#fbd2d4; --brand-hover-border:#f8bcbf; --appr-bg:#feecec;
}
.theme-yellow{
  --brand:#fd9134; --brand-dark:#e8781a; --brand-2:#ffa050; --brand-edge:#c9640f;
  --brand-light:#fff0e0; --brand-ice:#fcdcbd; --brand-hover-border:#f9cfa2; --appr-bg:#fff0e0;
  --on-brand:#3a2a00;
}


/* ---------- cards (AdminLTE .box) ---------- */
.refund-theme .box,
.refund-theme .box.box-primary{
  background:var(--surface) !important;
  border:1px solid var(--line) !important;
  border-top:1px solid var(--line) !important;
  border-radius:8px !important;
  box-shadow:var(--shadow) !important;
  margin-bottom:16px;
}
.refund-theme .box-header{
  background:linear-gradient(180deg,var(--surface),var(--head-tint)) !important;
  border-bottom:1px solid var(--line) !important;
  border-radius:8px 8px 0 0;
  padding:12px 0 !important;
  color:var(--brand-dark);
}
.refund-theme .box-body{ padding:16px !important; }
/* ---- GRID .box-body PADDING - COMMON ----
   The reference page, FeesRefundRequest, has NO separate .box-body: its table sits directly in a
   .row/.col-lg-12 inside .box-header, so .box-header's own 12px is the only inset and the table spans
   the full width of the box.
   Every other grid view does have a .box-body, in one of two shapes:
     a) NESTED inside .box-header  (AdmissionInquiry, RegistrationInquiry, ManageRegistration,
        RegistrationDetails) - the `<!-- /.box-header -->` comment sits below .box-body's opening tag
     b) a SIBLING of .box-header  (FollowUpInquiry, CampusVisited)
   Either way its 16px stacks on/next to the header's own padding, which is what made the table look
   narrower than the box it sits in, with a dead white strip under the pagination row.
   Both shapes are handled here: (a) by descent, (b) by "this .box-body directly holds the grid wrapper".
   A .box-body holding a FORM, or a table that is not a paginated grid, is untouched and keeps its 16px -
   deliberately narrow, because `.table-responsive` alone appears inside plenty of form cards where the
   inset is wanted.
   The two get DIFFERENT bottom padding on purpose. In shape (a) the enclosing .box-header already
   contributes its own 12px below the grid, so the body must be a flat 0 or the strip comes back. In
   shape (b) nothing sits below the grid, so the body supplies that same 12px itself - which is why the
   nested rule is listed SECOND and carries the `:has()` qualifier: both selectors would otherwise weigh
   (0,3,0) and the sibling rule would win on order, double-padding the nested pages. */
.refund-theme .box-body:has(> .dataTables_wrapper){ padding:0 0 12px !important; }
.refund-theme .box-header .box-body:has(> .dataTables_wrapper),
.refund-theme .box-header .box-body{ padding:0 !important; }
.refund-theme .box-footer{ background:var(--surface-2) !important; border-top:1px solid var(--line) !important; }
/* THE label size for the whole theme. 11px, uppercase, muted - deliberately one step below the 12.5px
   value text inside the field, so the caption reads as a caption and the data stays dominant.
   Legacy `.placeholder-label` captions are pinned to the same 11px further down (they need extra depth +
   !important to beat NewFormCSS); change both together or the two kinds of page drift apart. */
.refund-theme label{ font-size:11px; color:var(--muted); font-weight:600; text-transform:uppercase; letter-spacing:.3px; }
.refund-theme .box-header b{ color:var(--ink); font-weight:600; }

/* ---------- form controls ---------- */
/* ===================== COMMON FIELD SIZE - ONE DEFINITION FOR THE WHOLE THEME =====================
   Every field on every refund-theme page is sized here and NOWHERE else: text boxes, dropdowns
   (select2), the multi-select, .ms-choice and datepicker inputs all render at the same 36px / 12.5px.
   The numbers are FeesRefundRequest's Filter-modal recipe, which is the agreed reference:
       font-size:12.5px; height:36px; border:1px solid var(--line);
       border-radius:5px; box-shadow:none; color:var(--ink);

   DO NOT re-declare any of this per page. Page-scoped copies are what let AdmissionInquiry drift out
   of sync with the reference in the first place - every tweak had to be repeated, and whichever copy
   was more specific silently won. If a size looks wrong on one page, fix it HERE so all pages move
   together.
   =============================================================================================== */
.refund-theme .form-control{
  border:1px solid var(--line); border-radius:5px; font-size:12.5px;
  box-shadow:none; height:36px; padding:0 12px; color:var(--ink);
}
/* textarea must stay multi-line, so it opts out of the fixed height only.
   NOTE: `height` deliberately carries NO !important. An author !important beats an element's inline
   style, so `height:auto !important` would override the `element.style.height = scrollHeight + 'px'`
   that the controllers' autoGrow handlers set - silently disabling auto-grow. Specificity is enough. */
.refund-theme textarea.form-control{ height:auto; min-height:36px; padding:8px 12px; }
/* ---- AUTO-GROW TEXTAREAS, COMMON ----
   `.auto-grow` is only a CSS class in NewFormCSS (overflow/resize/min-height); the growing itself comes
   from a per-controller `$scope.autoGrow` wired per field, so a textarea can carry the class and never
   grow because nothing is bound to it. `field-sizing:content` makes the box track its content natively
   (Chrome 123+), which gives auto-grow everywhere with no JS and does not fight the handler on pages
   where one IS wired. Applied theme-wide so every page gets it. */
.refund-theme textarea.auto-grow,
.refund-theme textarea.form-control,
/* `textarea.text` is the LEGACY class (NewFormCSS pages) - it has no .form-control, so it was missed by
   the two selectors above and those textareas never grew. */
.refund-theme textarea.text,
.refund-theme .input-container textarea{
  field-sizing:content;
  overflow:hidden; resize:none;
}
/* legacy textareas also need the height freed: NewFormCSS's `.common{height:var(--field-height)}` pins
   them to one line. No !important on height - an author !important would beat the inline height that
   any autoGrow handler sets. */
.refund-theme textarea.text,
.refund-theme .input-container textarea{ height:auto; min-height:36px; }
.refund-theme .form-control:focus{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme .input-group-addon{ background:var(--brand-light); border:1px solid var(--line); color:var(--brand-dark); }

/* ---- select2 single: same box as .form-control above ----
   height needs !important because SISCustom.css ships a bare
   `.select2-selection--single{height:100% !important}` that applies app-wide. */
.refund-theme .select2-container{ width:100% !important; }
/* `padding:3px 0` is the resting state for EVERY dropdown, not just the focused one - applying it here
   as well as on :focus/open means the value never shifts when the control is focused or opened.
   The box is border-box at a fixed 36px, so the padding adds no height. */
.refund-theme .select2-container--default .select2-selection--single{
  height:36px !important; padding:3px 0; border:1px solid var(--line); border-radius:5px;
  box-shadow:none; background:var(--surface);
}
/* Selected value: 12px in from the left (Bootstrap's own .form-control inset, what the reference lines
   up to), clear of the icons on the right. height+line-height pinned to the box's inner height so the
   text is centred by construction instead of depending on an inherited line-height that other sheets
   keep redefining; overflow rules ellipsise a long value on one line rather than letting it wrap or
   slide under the icons. colour/size forced because NewFormCSS, SISCustom and select2's own stylesheet
   all target this span. */
.refund-theme .select2-container--default .select2-selection--single .select2-selection__rendered{
  /* Height/line-height fill the box's inner height exactly (36 - 2px borders - 6px padding = 28px);
     the -2px margin-top is the final optical nudge that centres the value (verified in the browser).
     Both are !important because select2's own sheet, NewFormCSS and SISCustom all set line-height on
     this span and would otherwise pull it back off-centre.
     No right padding / overflow / ellipsis here: they clipped short values in narrow boxes such as the
     pagination "Show entries" select. Any field that needs to reserve room on the right sets its own
     padding-right (see the .PaginationSec rule). */
  display:block; height:28px; line-height:28px !important; margin-top:-2px !important;
  padding-left:12px;
  color:var(--ink) !important; font-size:12.5px !important; font-weight:400 !important;
}
.refund-theme .select2-container--default .select2-selection--single .select2-selection__placeholder{ color:var(--muted); }
/* Caret 10px in from the right, muted - matches the reference's .frr-ms-caret. Anchored with
   top:50%/translateY(-50%) rather than a fixed height, so it stays centred at any box height.
   The inner b needs margin:0 !important to undo NewFormCSS's `margin-top:-3px !important`. */
.refund-theme .select2-container--default .select2-selection--single .select2-selection__arrow{
  height:auto; top:50%; transform:translateY(-50%); right:10px; width:12px;
  display:flex; align-items:center; justify-content:center;
}
.refund-theme .select2-container--default .select2-selection--single .select2-selection__arrow b{
  position:static; margin:0 !important; border-top-color:var(--muted);
}
/* Clear-x sits left of the caret; its border-right is the wanted separator (originally NewFormCSS's
   hardcoded #ccc), recoloured to the theme token. Fixed height + flex so that border renders as a
   proper full-length bar rather than only as tall as the x glyph. */
.refund-theme .select2-container--default .select2-selection--single .select2-selection__clear{
  position:absolute; top:50%; transform:translateY(-50%); right:28px;
  display:flex; align-items:center; height:18px;
  margin:0; padding:0 8px 0 0; font-size:14px; font-weight:700; color:var(--muted);
  border-right:1px solid var(--line); background:none;
}
.refund-theme .select2-container--default .select2-selection--single .select2-selection__clear:hover{ color:var(--no); }
/* padding:3px 0 verified in the browser by Devang - keeps the value from shifting when the box takes
   focus / opens. */
/* padding is inherited from the base rule above (all dropdowns carry it), so focus/open only needs to
   change the border and glow - no padding here, otherwise it would have to be kept in sync twice. */
.refund-theme .select2-container--default.select2-container--focus .select2-selection--single,
.refund-theme .select2-container--open .select2-selection--single{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
/* ---- select2 multiple: same 36px box as every other field ----
   `height:auto !important` beats SISCustom.css's `.select2-selection--multiple{height:100% !important}`,
   which was stretching this box taller than its neighbours. min-height then holds it at exactly 36px
   for the usual single row of chips, while still allowing it to grow if the chips wrap to a 2nd line.
   Padding/chip/search metrics below are tuned so one row of chips totals exactly 36px. */
.refund-theme .select2-container--default .select2-selection--multiple{
  height:auto !important; min-height:36px; box-sizing:border-box;
  border:1px solid var(--line) !important; border-radius:5px;
  background:var(--surface); padding:3px 6px; line-height:normal;
}
.refund-theme .select2-container--default .select2-selection--multiple .select2-selection__rendered{
  display:block; padding:0; margin:0; line-height:normal; text-align:left;
}
/* inline type-to-search caret: keep it on the chips' line instead of adding a row of its own */
.refund-theme .select2-container--default .select2-selection--multiple .select2-search--inline .select2-search__field{
  height:26px; line-height:26px; margin:0; padding:0 4px; font-size:12.5px;
}

/* ---- (REMOVED) "<n> selected" COMPACT SUMMARY ----
   There used to be a CSS-counter summary here: every chip was hidden with position:absolute +
   visibility:hidden while doing counter-increment:rt-chip, and the container printed
   `counter(rt-chip) " selected"` from a ::after.

   IT WAS DELETED BECAUSE IT COULD LIE, and a filter that misreports what it is filtering by is worse
   than a cluttered one. The count came from the number of CHIPS IN THE DOM, which is not the source of
   truth - the model is. select2 renders its chips once and only re-renders them on `change.select2`,
   which Angular never fires; so any path that leaves the chips out of step with `ng-model` (this page
   reassigns the whole option collection from the server on every single tick - see
   AdmisssionInquiryView.js:138, fired by ng-change="GetGridList(false)") produced a number that
   disagreed with the tick boxes. Seen in the field as "4 selected" over a panel with nothing ticked.

   A CSS counter can only ever count DOM nodes, so this cannot be fixed in CSS - the count has to be
   read from the model, which means Angular/JS. Until that is done deliberately, select2's own chips
   stand: they are plain, but each one names a real value and can be removed individually, so there is
   no number left to be wrong. Do not reintroduce a counter-based summary. */

.refund-theme .select2-container--focus .select2-selection--multiple,
.refund-theme .select2-container--open .select2-selection--multiple{ border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light); }
/* ---- DISABLED CONTROLS, ONE TREATMENT FOR ALL OF THEM - COMMON ----
   bug sheet 105: "when Is New Admission = Yes the Admission Year and Admission Class stay
   disabled, but they do not LOOK disabled." Nothing was broken underneath - measured live,
   select2 had already added `select2-container--disabled`, cursor was not-allowed and
   pointer-events none. The ONLY problem was the colour: var(--surface-2) is #fbfdff on a white
   card, a 4-unit difference nobody can see.
   Everything below points at --disabled-bg / --disabled-ink / --disabled-line so there is one
   place to tune how "disabled" reads across the whole ERP.

   WHY THIS COVERS MORE THAN select2: only `select.form-control:disabled` was styled further
   down, so a disabled TEXT box or textarea got no treatment at all - and this page has one
   (the read-only Approval Mode echo on Workflow Authority is exactly that shape). Handling the
   family together is what stops the next screen re-reporting this. */
/* THE `select:disabled + ...` SELECTORS ARE NOT BELT-AND-BRACES - THEY ARE THE FIX.
   Reported: on Student Registration (edit) the locked Admission Year / Admission Class /
   Current Class look correctly grey, then you clear Section and press Save, and they come
   back looking white and editable.

   Cause: page code repaints the container by ASSIGNING its whole className, e.g.

       ...parentNode.parentNode.className = "select2 select2-container select2-container--default"

   which deletes `select2-container--disabled` along with everything else select2 keeps
   there. StudentRegistration.js alone does this on 76 lines (the same copy-pasted shape
   that used to live in common.js's ClearValidationColorSelect2, now fixed there). Measured
   on a real student, before -> after a failed validation:

       native <select>.disabled       true -> true    (still genuinely locked)
       select2-container--disabled    true -> FALSE   (so it stops LOOKING locked)

   Keying the look off the class means any of those 76 assignments silently undoes it.
   Keying it off `select:disabled` instead cannot be undone by a class rewrite, because it
   reads the same attribute ng-disabled sets. select2 renders its container as the
   IMMEDIATE NEXT SIBLING of the original <select>, which is what makes `+` reliable here.
   Both selectors are kept: the class covers multi-selects and any control select2 disables
   on its own, the sibling covers everything ng-disabled locks. */
.refund-theme .select2-container--disabled .select2-selection--single,
.refund-theme .select2-container--disabled .select2-selection--multiple,
.refund-theme select:disabled + .select2-container .select2-selection--single,
.refund-theme select:disabled + .select2-container .select2-selection--multiple{
  background:var(--disabled-bg) !important;
  border-color:var(--disabled-line) !important;
  cursor:not-allowed;
}
.refund-theme .select2-container--disabled .select2-selection__rendered,
.refund-theme .select2-container--disabled .select2-selection__placeholder,
.refund-theme select:disabled + .select2-container .select2-selection__rendered,
.refund-theme select:disabled + .select2-container .select2-selection__placeholder{
  color:var(--disabled-ink) !important;
}
/* the caret loses its affordance too - a bright chevron on a dead box invites the click */
.refund-theme .select2-container--disabled .select2-selection__arrow b,
.refund-theme select:disabled + .select2-container .select2-selection__arrow b{ opacity:.45; }

/* THE CLEAR "x" MUST NOT BE OFFERED ON A LOCKED CONTROL.
   `allowClear:true` keeps rendering it while the field is disabled, so a locked Admission
   Class still showed "xPG" - a control that looks like it can be emptied. (It cannot:
   clicking it was measured as a no-op, value unchanged. It is the invitation that is wrong.) */
.refund-theme .select2-container--disabled .select2-selection__clear,
.refund-theme select:disabled + .select2-container .select2-selection__clear{ display:none !important; }

/* text inputs, textareas and native selects - the half that had no rule.
   NOTE there are TWO input families in this app: `.form-control` (theme/Bootstrap) and the legacy
   `input.text.common` used by the older screens, e.g. #txtDateOfbirth on Student Registration.
   This block covers `.form-control`; the legacy family has its own block further down
   (search "input.text[disabled]") because NewFormCSS sizes it with !important and it needs the
   extra class in the selector to win. BOTH now read from the same tokens - that is the point.
   `textarea` is included here so a disabled remark box matches its neighbours. */
.refund-theme input.form-control:disabled,
.refund-theme input.form-control[disabled],
.refund-theme textarea.form-control:disabled,
.refund-theme textarea.form-control[disabled]{
  background-color:var(--disabled-bg) !important;
  border-color:var(--disabled-line) !important;
  color:var(--disabled-ink) !important;
  cursor:not-allowed;
  opacity:1;                 /* Bootstrap/browser opacity would fade the value into mush */
}
/* ---- NATIVE <select> THAT CANNOT BE UPGRADED - COMMON ----
   `.rt-select` is the right answer for a dropdown, but `_Layout` initialises it ONCE on document-ready. A
   select built later by `ng-repeat` over an AJAX response is not in the DOM yet, so the class attaches to
   nothing and the control stays native - and re-initialising it would be a JS change.
   So native selects have to look right too. The theme already gives them the 36px box via `.form-control`;
   what gave them away was the OS-drawn caret, which is a different size, colour and position on every
   platform. `appearance:none` plus an inline-SVG chevron makes them match the select2 boxes beside them.
   Excluded: the hidden originals behind select2 (`.select2` / `.rt-select` / `.rt-multi`) and the
   pagination control, which get their own treatment; and `[multiple]`/`[size]`, which are list boxes and
   have no caret to replace. */
/* ---- NOT-YET-UPGRADED <select multiple> - COMMON ----
   A multi-select driven by the multipleSelect plugin is a plain `<select multiple>` until the plugin
   runs, and on several pages the plugin is initialised from an AJAX success handler (on the enquiry
   list it happens inside GetGridList) - so for the first second or two of every page load the raw
   control is what the user sees. Natively that is an OS list box: it sizes itself to its options, which
   measured 86px against the 36px select2 fields beside it, with the OS grey border and a 2px radius.
   That is the uneven row on refresh.

   The rule above deliberately skips `[multiple]` because a list box has no caret to replace; it still
   needs the field's BOX though. Height is pinned to the same 36px as every other control and the
   overflow is clipped, so the placeholder state reads as one filled field rather than a stack of
   options. Once the plugin initialises it sets this element to display:none and takes over, so all of
   this is only ever visible during that gap.

   THE OPTIONS ARE HIDDEN TOO, and that needs justifying. Clipping the box to 36px is not enough on its
   own: a list box paints its rows from the top, so you get the first option plus a half-cut second one
   and the OS selection highlight bleeding across the field - which looks more broken than the tall box
   did. Hiding the rows leaves a clean empty field for the fraction of a second before the plugin
   swaps in its own box.

   The cost is that with JavaScript dead this control would render empty rather than as a usable native
   list. That is an acceptable trade HERE and only here: the whole screen is an AngularJS view whose
   grid, filters and data all arrive by AJAX, so without JS there is no page to degrade to. Do not copy
   this pattern onto a server-rendered form, where the native control is a real fallback. */
.refund-theme select[multiple]{
  height:36px; min-height:0; box-sizing:border-box; overflow:hidden;
  padding:6px 10px; border:1px solid var(--line); border-radius:5px;
  background:var(--surface); color:var(--ink); font-size:12.5px; line-height:normal;
}
.refund-theme select[multiple] option{ display:none; }
.refund-theme select.form-control:not(.select2):not(.select2WithoutClear):not(.multipleSelect2):not(.rt-select):not(.rt-multi):not(.SP_drop_num):not([multiple]):not([size]){
  -webkit-appearance:none; -moz-appearance:none; appearance:none;
  padding-right:30px;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%235d6b7d' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right 11px center;
  background-size:10px 6px;
}
/* a disabled one reads as disabled, and its caret fades with it */
.refund-theme select.form-control:disabled{
  /* was --locked-bg (#f6f8fb) + --muted: same invisibility as the select2 box, see bug 105.
     Now the shared disabled tokens so a native select and an upgraded one look identical. */
  background-color:var(--disabled-bg) !important; border-color:var(--disabled-line) !important;
  color:var(--disabled-ink) !important; cursor:not-allowed; opacity:1;
}

/* ---- MULTIPLESELECT PLUGIN (.ms-choice closed box + .ms-drop panel) - COMMON ----
   Some pages drive their dropdowns with the jQuery MultipleSelect plugin rather than select2 - CollectFees'
   Fee Component picker, RoleAssigned's two role pickers per row. You cannot swap them for `rt-select`: the
   page JS calls `multipleSelect('enable')` / `('disable')` on those very elements, and a second widget over
   the same <select> would leave those calls talking to the wrong one.
   So the plugin gets the select2 LOOK instead: same 36px box, same border and radius, same brand focus
   ring, same panel and the same brand highlight on hover and selection. Written page-scoped for CollectFees
   first; common now, so any page using the plugin matches without adding CSS. */
.refund-theme .ms-parent{ width:100%; }
/* DOUBLE-BOX GUARD - COMMON.
   multipleSelect copies the <select>'s class attribute onto the .ms-parent wrapper it generates. So a
   `<select class="form-control" multiple>` produces `<div class="ms-parent form-control">`, the wrapper
   takes the theme's field border/radius/height, and the plugin's own .ms-choice draws a SECOND field box
   inside it - the control renders as a box inside a box.
   The right markup is to leave form-control off such a select (see RoleAssigned's .drpRole, and the note
   on AdmissionInquiry's status filter), but that only fixes the pages we know about. This neutralises the
   wrapper wherever it happens, so the mistake cannot show up as a visual bug again: .ms-choice is the
   field box, .ms-parent is only a positioning context. */
.refund-theme .ms-parent.form-control{
  border:0 !important; border-radius:0 !important; padding:0 !important;
  height:auto !important; min-height:0 !important; background:transparent !important;
  box-shadow:none !important;
}
.refund-theme .ms-choice{
  height:36px !important; line-height:34px !important;
  border:1px solid var(--line) !important; border-radius:5px !important;
  background:var(--surface) !important; color:var(--ink) !important;
}
.refund-theme .ms-choice > span{ line-height:34px; color:var(--ink); font-size:12.5px; left:10px; right:26px; }
.refund-theme .ms-choice > span.placeholder{ color:var(--muted); }
.refund-theme .ms-choice:focus,
.refund-theme .ms-parent.open .ms-choice{ border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light); }
/* the plugin draws its caret as a CSS-border triangle; recolour it to the theme's arrow grey */
.refund-theme .ms-choice > div.icon-caret{ border-top-color:var(--muted) !important; }
.refund-theme .ms-parent.open .ms-choice > div.icon-caret{ border-bottom-color:var(--muted) !important; }
/* a locked picker must read as locked */
.refund-theme .ms-choice.disabled{
  background:var(--locked-bg) !important; color:var(--muted) !important; border-color:var(--line) !important;
  cursor:not-allowed; opacity:1;
}
.refund-theme .ms-drop{
  border:1px solid var(--line) !important; border-radius:6px !important;
  box-shadow:var(--shadow-menu) !important; background:var(--surface) !important;
}
.refund-theme .ms-drop ul > li{ color:var(--ink); }
/* text-transform/letter-spacing RESET, not decoration. The theme styles a form field's caption as an
   uppercase tracked-out label, and these option rows are <label> elements too - so they inherited that
   treatment and the list rendered "INTERESTED / PENDING / THINKING" instead of the real option text.
   Same trap as the LCConfiguration mode cards, which are also labels. An option's text is DATA - it has
   to read exactly as it is stored, or a status called "NRI Quota" comes out as "NRI QUOTA". */
.refund-theme .ms-drop ul > li label{
  font-size:12.5px; font-weight:400;
  text-transform:none; letter-spacing:normal; color:inherit;
}
.refund-theme .ms-drop ul > li:hover,
.refund-theme .ms-drop ul > li.hover-highlight{ background:var(--brand-light) !important; color:var(--brand-dark) !important; }
.refund-theme .ms-drop ul > li.selected{ background:var(--brand-light) !important; color:var(--brand-dark) !important; }
.refund-theme .ms-drop input[type=checkbox]{ accent-color:var(--brand); }
/* the panel's own search box, where the plugin is configured with one */
.refund-theme .ms-drop .ms-search input{
  height:30px; border:1px solid var(--line) !important; border-radius:5px; font-size:12.5px; color:var(--ink);
}
/* ---- VALIDATION ERROR STATE, COMMON ----
   jQuery Validate / Unobtrusive marks a bad field with `.input-validation-error`, and some controllers
   add `.redBackColor` or `.redBorderClass` by hand. _Layout.cshtml paints all of those with a red
   border + pink tint, but at the OLD pill radius - so on a themed page the error state stops matching
   the square field it belongs to. Corrected once here for every refund-theme page, using the same
   colours _Layout uses so nothing looks different apart from the corners.
   A select2-decorated <select> needs the extra "paint the visible box" treatment as well - see the
   SELECT2 ERROR BOX block right below, which is COMMON (it used to be copied into every page block). */
.refund-theme input.input-validation-error,
.refund-theme textarea.input-validation-error,
.refund-theme select.input-validation-error,
.refund-theme .form-control.input-validation-error,
.refund-theme input.redBackColor,
.refund-theme textarea.redBackColor,
.refund-theme select.redBackColor,
.refund-theme .redBorderClass,
/* LEGACY `input.text` NEEDS THE EXTRA CLASS IN THE SELECTOR.
   FOUR different class names are used across the app to flag a bad field - `.redBackColor`,
   `.redBorderClass` (what AdmisssionMaster.js puts on #txtComSMSNumber), jQuery Validate's
   `.input-validation-error`, and `.angularValidation` (RoleMaster.js) - and _Layout styles them
   WITHOUT !important.
   `.angularValidation` WAS MISSING FROM THIS LIST, and that is bug sheet 107: Role Master's
   "View Privileges" guard flags an empty Role Name with addClass("angularValidation"), the rule
   exists in _Layout as `background:#FEF1EC; border:1px solid #CD0A0A` with no !important, so on a
   themed page the theme's own field rule won and the box kept its normal grey border. The
   validation was running and refusing to continue, entirely invisibly - "no error message and no
   response at all".
   Meanwhile the theme's own legacy-field rule is `.refund-theme input.text{border:... !important}`,
   which is more specific than a bare `.refund-theme .redBorderClass`, so it silently won and the field
   kept its normal grey border on save. Naming both classes on the element settles it.
   Grep the page's controller for addClass to see which of the three it actually uses. */
.refund-theme input.text.redBorderClass,
.refund-theme input.text.redBackColor,
.refund-theme input.text.input-validation-error,
.refund-theme textarea.text.redBorderClass,
.refund-theme textarea.text.redBackColor,
.refund-theme .input-container input.redBorderClass,
.refund-theme .input-container input.redBackColor,
.refund-theme .input-container input.input-validation-error,
.refund-theme .input-container textarea.redBorderClass,
.refund-theme .input-container textarea.redBackColor,
/* the fourth name - see the note above (bug sheet 107) */
.refund-theme .angularValidation,
.refund-theme .form-control.angularValidation,
.refund-theme input.angularValidation,
.refund-theme select.angularValidation,
.refund-theme textarea.angularValidation,
.refund-theme input.text.angularValidation,
.refund-theme .input-container input.angularValidation{
  border:1px solid #CD0A0A !important; background:#FEF1EC !important; border-radius:5px !important;
}

/* ---- SELECT2 ERROR BOX, COMMON ----
   A select2 field is TWO elements: the original <select> (hidden, 0-height) and the container span that
   is actually visible. Controllers flag errors on either one:
     * `.myErrorClass` written onto the CONTAINER SPAN, e.g. `$(".select2")[1].className += " myErrorClass"`
     * `.redBackColor` / `.input-validation-error` left on the hidden <select> by jQuery Validate
   Painting either one directly is wrong - the container gets a red rectangle AROUND the field, and the
   hidden select leaks a thin red line above it. So: cancel the paint on the wrapper/hidden element and
   re-apply it to `.select2-selection--single/--multiple`, the box the user sees.
   This was previously duplicated in six page blocks; it is common now.

   EVERY FLAG CLASS IS LISTED FOR EVERY DROPDOWN CLASS, ON PURPOSE.
   The combinations below look repetitive and must stay that way. `.rt-select` only had `.redBackColor`
   here, so a controller that flags with `.redBorderClass` (WorkflowAuthority.js does, on SIX selects)
   painted nothing at all the moment its page was converted from `.select2` to `.rt-select` - the field
   simply refused to save with no visible reason. The flag class a page uses is a property of its
   CONTROLLER, not of the widget, so any of the three can turn up on any of the three widgets.
   Before converting a page's dropdowns, grep its controller for `addClass(` and check the combination it
   uses appears below. */
.refund-theme .select2-container.myErrorClass,
.refund-theme select.select2.redBackColor,
.refund-theme select.select2.redBorderClass,
.refund-theme select.select2.input-validation-error,
.refund-theme select.rt-select.redBackColor,
.refund-theme select.rt-select.redBorderClass,
.refund-theme select.rt-select.input-validation-error,
.refund-theme select.rt-multi.redBackColor,
.refund-theme select.rt-multi.redBorderClass,
.refund-theme select.rt-multi.input-validation-error{
  border:0 !important; background:none !important; border-radius:5px !important; box-shadow:none !important;
}
.refund-theme .select2-container.myErrorClass .select2-selection--single,
.refund-theme .select2-container.myErrorClass .select2-selection--multiple,
.refund-theme select.select2.redBackColor + .select2-container .select2-selection--single,
.refund-theme select.select2.redBackColor + .select2-container .select2-selection--multiple,
.refund-theme select.select2.redBorderClass + .select2-container .select2-selection--single,
.refund-theme select.select2.redBorderClass + .select2-container .select2-selection--multiple,
.refund-theme select.select2.input-validation-error + .select2-container .select2-selection--single,
.refund-theme select.rt-select.redBackColor + .select2-container .select2-selection--single,
.refund-theme select.rt-select.redBorderClass + .select2-container .select2-selection--single,
.refund-theme select.rt-select.input-validation-error + .select2-container .select2-selection--single,
.refund-theme select.rt-multi.redBackColor + .select2-container .select2-selection--multiple,
.refund-theme select.rt-multi.redBorderClass + .select2-container .select2-selection--multiple,
.refund-theme select.rt-multi.input-validation-error + .select2-container .select2-selection--multiple{
  border:1px solid #CD0A0A !important; background:#FEF1EC !important; border-radius:5px !important;
}

/* ---- multi-select tag chips: light brand-tinted pill, not select2's heavy solid-blue default ---- */
/* 26px tall + 0 vertical margin = one chip row fits the 36px box exactly (3px padding top/bottom +
   26px chip + 2px borders). */
.refund-theme .select2-selection__choice{ display:inline-flex; align-items:center; height:26px; background:var(--brand-light) !important; border:1px solid var(--brand-hover-border) !important; color:var(--brand-dark) !important; border-radius:13px; padding:0 10px; margin:0 4px 0 0; font-size:12px; line-height:normal; }
.refund-theme .select2-selection__choice__remove{ color:var(--brand-dark) !important; margin-right:5px; font-weight:700; }
.refund-theme .select2-selection__choice__remove:hover{ color:var(--no) !important; }
.refund-theme .select2-selection__placeholder{ color:var(--muted) !important; }

/* Academic-year read-only label pill */
.refund-theme .frr-lbl{
  padding:8px 10px; border:1px dashed var(--brand); border-radius:5px;
  background:var(--brand-light); font-weight:700; color:var(--brand-dark);
  display:flex; align-items:center; justify-content:space-between; gap:8px;
  font-size:13px; text-transform:none; letter-spacing:0;
}
.refund-theme .frr-lbl .fa-lock{ font-size:11px; color:var(--muted); }

/* ---------- buttons ---------- */
.refund-theme .btn{ border-radius:5px; font-weight:600; font-size:13px; }
.refund-theme .btn-addnew,
.refund-theme .btn-custom{
  background:var(--brand) !important; border:1px solid var(--brand) !important;
  color:var(--on-brand) !important; padding:8px 16px; border-radius:5px; font-weight:600;
}
.refund-theme .btn-addnew:hover,
.refund-theme .btn-custom:hover{ background:var(--brand-dark) !important; border-color:var(--brand-dark) !important; }
.refund-theme .btn-success{ background:var(--ok) !important; border-color:var(--ok) !important; color:var(--on-brand) !important; }
.refund-theme .btn-success:hover{ filter:brightness(.94); }
.refund-theme .btn-default{ background:var(--surface) !important; color:var(--brand) !important; border:1px solid var(--line) !important; }
.refund-theme .btn-default:hover{ background:var(--brand-light) !important; border-color:var(--brand) !important; }
/* modal-footer common Cancel = black (not theme); beats the themed .btn-default color above */
.refund-theme .modal-footer .btn.btn-default,
.refund-theme .box-footer .btn.btn-default{ color:var(--ink) !important; background:var(--surface) !important; border-color:var(--line) !important; }
.refund-theme .modal-footer .btn.btn-default:hover,
.refund-theme .box-footer .btn.btn-default:hover{ color:var(--ink) !important; background:var(--row-hover) !important; border-color:var(--grip) !important; }
.refund-theme .btn-danger{ background:var(--no-bg) !important; color:var(--no) !important; border:1px solid var(--no-border) !important; }
.refund-theme .btn-danger:hover{ background:var(--no) !important; color:var(--on-brand) !important; }
.refund-theme td .btn-sm{ width:32px; height:30px; padding:0; border-radius:6px; font-size:14px; margin:0 2px; }

/* ---------- tables (landing grid + form grids) ----------
   *** FINALIZED / LOCKED (do not re-tweak) ***
   Header cell = fixed 36px height, padding:0 12px, 11.5px/600 uppercase,
   Segoe UI, gradient #2462a3->#1f5fa8, 2px #16457a bottom border, white text.
   Body cell   = padding:9px 12px, 12.5px/400 Segoe UI, line-height 1.5.
   Grid is full-bleed (touches card edges). Matches Screen-1 mockup. */
.refund-theme .attendance_table_scroll{ border:none !important; border-radius:0 !important; overflow:auto; margin:0; width:100%; }
.refund-theme table{ width:100%; border-collapse:collapse; font-size:12.5px; background:var(--surface); font-family:"Segoe UI",Roboto,Arial,sans-serif; }
.refund-theme thead th,
.refund-theme .attendance-table thead th,
.refund-theme .theadCombinedTag th{
  background:var(--brand) !important;
  color:var(--on-brand) !important; padding:0 12px !important; height:36px !important; text-align:left;
  font-weight:600 !important; font-size:11.5px !important; text-transform:uppercase !important; letter-spacing:.2px !important;
  font-family:"Segoe UI",Roboto,Arial,sans-serif !important; line-height:normal !important;
  white-space:nowrap; border:none !important; border-bottom:2px solid var(--brand-edge) !important;
  vertical-align:middle; text-overflow:clip !important; overflow:visible !important;
}
.refund-theme thead th.text-right{ text-align:right; }
.refund-theme thead th.text-center{ text-align:center; }
.refund-theme thead th a,
.refund-theme thead th .colorA,
.refund-theme thead th .fa{ color:var(--brand-ice) !important; }
.refund-theme tbody td{ padding:9px 12px !important; border-bottom:1px solid var(--line); vertical-align:middle; color:var(--ink); font-weight:400 !important; font-family:"Segoe UI",Roboto,Arial,sans-serif !important; font-size:12.5px !important; line-height:1.5 !important; }
.refund-theme tbody tr{ transition:background .12s; }
.refund-theme tbody tr:nth-child(even){ background:var(--row-alt); }
.refund-theme tbody tr:hover{ background:var(--row-hover); }
.refund-theme .table-bordered,
.refund-theme .table-bordered td,
.refund-theme .table-bordered th{ border-color:var(--line) !important; }
.refund-theme .text-right{ text-align:right; }
.refund-theme .text-center{ text-align:center; }
/* No underline anywhere in the theme - the brand colour + weight already read as clickable, and an
   underline made whole grid columns look like a wall of links. !important so a stray inline
   `text-decoration:underline` on a page can't reintroduce it. */
.refund-theme .linklike{ color:var(--brand) !important; font-weight:600; cursor:pointer; text-decoration:none !important; }
.refund-theme .linklike:hover{ text-decoration:none !important; }

/* customize-column header icon */
.refund-theme .dynamictoggle .table_box,
.refund-theme .dynamictoggle .fa{ color:var(--on-brand) !important; }

/* YES / NO refundable badges */
.refund-theme .label{ padding:3px 10px; border-radius:11px; font-size:11px; font-weight:700; display:inline-block; }
.refund-theme .label-success{ background:var(--ok-bg) !important; color:var(--ok) !important; }
.refund-theme .label-danger{ background:var(--no-bg) !important; color:var(--no) !important; }

/* refund amount input + admin charge */
.refund-theme .frr-amt{ width:110px; text-align:right; display:inline-block; height:auto; padding:6px 8px; }
.refund-theme .frr-amt.err{ border-color:var(--no); background:var(--err-bg); }
.refund-theme .frr-admin{ color:var(--warn); font-weight:600; }

/* totals cards */
.refund-theme .frr-tot{
  border:1px solid var(--line); border-radius:6px; padding:11px 14px;
  background:var(--surface-2); min-width:150px;
}
.refund-theme .frr-tot > div{ font-size:10.5px; color:var(--muted); text-transform:uppercase; letter-spacing:.3px; }
.refund-theme .frr-tot b{ font-size:19px; font-weight:700; display:block; margin-top:3px; color:var(--ink); }

/* ============================================================
   NEW REQUEST FORM - numbered cards, student strip, legend, tot variants
   (matches Screen-1 mockup form view; all colours = tokens)
   ============================================================ */
/* form card header needs horizontal padding (base .box-header is full-bleed 12px 0 for the grid) */
.refund-theme .box-header.frr-ch{ padding:12px 16px !important; }
.refund-theme .frr-cardhead{ display:flex; align-items:center; gap:9px; }
.refund-theme .frr-cardhead.spread{ justify-content:space-between; }
.refund-theme .frr-cardnum{ flex:0 0 auto; width:20px; height:20px; border-radius:50%; background:var(--brand); color:var(--on-brand);
  display:inline-flex; align-items:center; justify-content:center; font-size:11px; font-weight:600; }
/* SECTION TITLE TEXT IS INK, NOT BRAND. The numbered badge already carries the accent; colouring the words
   as well made every heading compete with it, and on a long form that is a lot of maroon. The badge stays
   brand, the text reads as text. Kept in sync with `.titleCom` / `.section-title` further down - all three
   are the same heading wearing different class names, so they must not diverge. */
.refund-theme .frr-cardtitle{ display:inline-flex; align-items:center; gap:8px; font-weight:600; font-size:13px; color:var(--ink); text-transform:none; letter-spacing:0; }
.refund-theme .frr-cardtitle .frr-pill{ font-weight:400; font-size:11.5px; color:var(--muted); }
.refund-theme .frr-cardsub{ font-size:11.5px; color:var(--muted); font-weight:400; margin-left:2px; }

/* card-1 search: label-over-field columns (mockup .fld / .row) */
.refund-theme .frr-fldrow{ display:flex; flex-wrap:wrap; gap:16px; }
.refund-theme .frr-fld{ display:flex; flex-direction:column; gap:5px; min-width:180px; flex:1; }
.refund-theme .frr-fld > label{ margin:0; }

/* ---------- FIELD SIZING IN A ROW - TWO COMMON SHAPES, NOT A CLASS PER PAGE ----------
   `.frr-fld` ships `min-width:180px; flex:1`, which is right for a form but wrong in a filter
   row, so every page overrode it - and nine pages wrote one of these two shapes under nine
   different names:
       flex:1 1 0; min-width:0                  .wfs-fld  .wfa-fld  .lc-fld  .lc-fld-spacer
       width:Npx; min-width:0; flex:0 0 auto    .sca-empfld  .sca-statusfld  .sm-bucketfld
                                               .sm-yearfld  .cf-fld
   ALWAYS RESTATE `min-width:0`: `.frr-fld`'s 180px min-width BEATS any width you set, so a
   bare `width` is ignored outright. That single fact is why these overrides kept getting
   rewritten per page instead of being reused.

   1. EQUAL SHARE - every field takes the same slice of the row.
        <div class="frr-fld rt-fld-even">
   2. FIXED WIDTH - the shape is common, only the NUMBER is per-page, so the number comes in
      as a custom property and the page sets just that one line:
        <div class="frr-fld rt-fld-fixed" style="--fld-w:460px">
      ...or better, from the page block:  .refund-theme.my-page .my-fld{ --fld-w:460px; }
      This is the honest split - a width of 460px for an employee picker genuinely is page
      knowledge, but `min-width:0; flex:0 0 auto` is not, and that is the part that was being
      copied. */
.refund-theme .rt-fld-even{ flex:1 1 0; min-width:0; }
.refund-theme .rt-fld-fixed{
  width:var(--fld-w, 180px); max-width:100%; min-width:0; flex:0 0 auto;
}
/* both collapse to full width on a narrow screen - the reason every page had its own media
   query for this */
@media (max-width:767px){
  .refund-theme .rt-fld-even{ flex:1 1 100%; }
  .refund-theme .rt-fld-fixed{ width:100%; }
}
/* Common, unscoped - the required-field asterisk must be red everywhere, not just inside .frr-fld.
   This was previously scoped to ".frr-fld .req" only, so it silently stopped applying wherever a form
   used plain Bootstrap .form-group instead (e.g. Add Interaction's modal after its fields were
   converted to row/col-lg-6 for responsiveness) - made generic so that can't happen again. */
.refund-theme .req{ color:var(--no); }
/* Search Student fields: force the mockup font (native inputs/selects don't inherit font-family),
   value slightly heavier for the crisper mockup look. Applies to the student box + both dropdowns. */
.refund-theme .frr-fldrow .form-control,
.refund-theme .frr-fldrow select.form-control,
.refund-theme .frr-fldrow select.form-control option{
  font-family:"Segoe UI",Roboto,Arial,sans-serif !important; font-weight:500; color:var(--ink);
}
.refund-theme .frr-searchgrp{ display:flex; gap:6px; }
.refund-theme .frr-search-field{ position:relative; flex:1; display:flex; }
.refund-theme .frr-search-field .form-control{ flex:1; padding-right:34px; }
/* clear (x) button inside the search box - only shown (via JS) when the box has text */
.refund-theme .frr-search-clear{ position:absolute; top:0; right:0; height:100%; width:32px; padding:0;
  display:flex; align-items:center; justify-content:center; background:transparent; border:none;
  color:var(--muted); font-size:18px; line-height:1; cursor:pointer; }
.refund-theme .frr-search-clear:hover{ color:var(--no); }
/* Search button = mockup .btn-o look (magnifier + "Search"). Present for design parity only;
   the real search runs from the autocomplete as you type, so this button has NO action and is
   styled as non-interactive (no hover change, default cursor). */
.refund-theme .frr-search-btn,
.refund-theme .frr-search-btn:hover,
.refund-theme .frr-search-btn:focus{ flex:0 0 auto; display:inline-flex; align-items:center; justify-content:center; gap:6px;
  white-space:nowrap; cursor:default; pointer-events:none; background:var(--surface) !important; border:1.5px solid var(--brand-dark) !important;
  color:var(--brand-dark) !important; box-shadow:none !important; border-radius:5px; padding:8px 16px; font-size:13px; font-weight:700; line-height:1.4; }
.refund-theme .frr-search-btn .frr-search-ico{ vertical-align:middle; }

/* ---------- student-search autocomplete (jQuery UI) - professional result list ----------
   DELIBERATELY UNSCOPED, for the same reason as the `.datepicker.datepicker-dropdown` block further down:
   jQuery UI appends this menu to the closest `.ui-front` ancestor and, failing that, to <body> - i.e.
   OUTSIDE `.refund-theme`. So while these rules were written as `.refund-theme .ui-autocomplete …` they
   only landed on pages whose own JS passed `appendTo`; everywhere else the list rendered in raw jQuery UI
   grey, which is what StandardRteChange showed. Unscoping is the fix - the popup belongs to a field inside
   the theme even though the DOM puts it elsewhere, exactly like the datepicker.
   (The alternative - adding `class="ui-front"` to each search wrapper - would need touching every view and
   would still miss any page that forgets.) */
.ui-autocomplete.ui-menu{ position:absolute; z-index:10000; list-style:none; margin:3px 0 0; padding:4px;
  background:var(--surface); border:1px solid var(--line); border-radius:6px; box-shadow:var(--shadow-menu);
  max-height:300px; overflow-y:auto; overflow-x:hidden; box-sizing:border-box; min-width:240px; font-family:"Segoe UI",Roboto,Arial,sans-serif; }
.ui-autocomplete .ui-menu-item{ list-style:none; margin:0; padding:0; }
.ui-autocomplete .ui-menu-item + .ui-menu-item{ border-top:1px solid var(--row-alt); }
.ui-autocomplete .ui-menu-item div,
.ui-autocomplete .ui-menu-item a{ display:block; padding:8px 12px; border-radius:5px;
  font-size:12.5px; font-weight:400; line-height:1.5; color:var(--ink); white-space:normal; border:none; cursor:pointer; background:transparent; text-decoration:none; }
.ui-autocomplete .ui-menu-item div.ui-state-active,
.ui-autocomplete .ui-menu-item div.ui-state-focus,
.ui-autocomplete .ui-menu-item div:hover,
.ui-autocomplete .ui-menu-item a.ui-state-active,
.ui-autocomplete .ui-menu-item a.ui-state-focus,
.ui-autocomplete .ui-menu-item a:hover{ background:var(--brand-light) !important; background-image:none !important;
  color:var(--brand-dark) !important; border:none !important; margin:0 !important; }
.ui-autocomplete .frr-ac-hl{ font-weight:700; color:var(--brand-dark); }
/* "No matches found" is pushed in as a plain, non-selectable item on some pages - it must read as a
   message, not as a result you can click */
.ui-autocomplete .ui-menu-item div.frr-ac-empty,
.ui-autocomplete .ui-menu-item div.ui-state-disabled,
.ui-autocomplete .ui-menu-item.ui-state-disabled div{
  color:var(--muted) !important; background:transparent !important; cursor:default; font-style:normal;
}

/* card-2 student-details 5-cell strip (mockup .stu) */
.refund-theme .frr-stu{ display:grid; grid-template-columns:repeat(5,1fr); border:1px solid var(--line); border-radius:6px; overflow:hidden; }
/* Refund Transaction Section 2 = 7 cells in one row (Student..Remaining) */
.refund-theme .frr-stu.frr-stu-7{ grid-template-columns:repeat(7,1fr); }
.refund-theme .frr-stu .c{ padding:10px 12px; border-right:1px solid var(--line); }
.refund-theme .frr-stu .c:last-child{ border-right:none; }
.refund-theme .frr-stu .k{ font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:.3px; font-weight:600; font-family:"Segoe UI",Roboto,Arial,sans-serif; }
.refund-theme .frr-stu .v{ font-size:14px; font-weight:700; margin-top:3px; color:var(--ink); font-family:"Segoe UI",Roboto,Arial,sans-serif; }

/* card-3 colour legend (mockup .legend) */
.refund-theme .frr-legend{ display:flex; gap:16px; flex-wrap:wrap; padding:12px 16px; font-size:11.5px; color:var(--muted); }
.refund-theme .frr-legend > span{ display:flex; align-items:center; gap:5px; }
.refund-theme .frr-dot{ width:10px; height:10px; border-radius:2px; display:inline-block; }

/* compact component table (mockup): tighter rows, smaller checkboxes, TOTAL footer */
.refund-theme .frr-comp-table thead th{ height:32px !important; }
.refund-theme .frr-comp-table tbody td{ padding:6px 12px !important; font-size:12.5px; font-weight:500;
  font-family:"Segoe UI",Roboto,Arial,sans-serif; }
.refund-theme .frr-comp-table input[type=checkbox]{ width:14px; height:14px; margin:0; vertical-align:middle; cursor:pointer; }
.refund-theme .frr-comp-table tfoot td{ padding:8px 12px !important; border-top:2px solid var(--brand); background:var(--surface-2); font-weight:700; color:var(--ink); }

/* paid-amount info icon + refund-info popup (edit case) */
.refund-theme .frr-tot-sub{ display:block; font-size:10px; font-weight:400; color:var(--muted); margin-top:2px; line-height:1.2; }
/* worklist header: tighter bottom so the line sits close to the toolbar (dashboard gets its own gap below the line) */
.refund-theme .frr-wl-head{ padding-bottom:0 !important; border-bottom:none !important; }   /* toolbar flows straight into the grid like FeesRefundRequest (12px gap, no separator) */
.refund-theme .frr-info-ico{ margin-left:6px; color:var(--ico); cursor:pointer; font-size:13px; vertical-align:middle; transition:color .12s; }
.refund-theme .frr-info-ico:hover{ color:var(--ico-hover); }
/* professional hover tooltip for fee-head full name (sections 3 & 4) */
.refund-theme .frr-tipwrap{ position:relative; display:inline-block; }
.refund-theme .frr-tipwrap .frr-tip{ visibility:hidden; opacity:0; position:absolute; left:50%; transform:translateX(-50%); bottom:135%; background:var(--tip-bg); color:var(--tip-ink); padding:5px 9px; border-radius:5px; font-size:11.5px; font-weight:500; white-space:nowrap; z-index:9999; transition:opacity .12s ease; box-shadow:0 3px 9px rgba(0,0,0,.28); pointer-events:none; }
.refund-theme .frr-tipwrap .frr-tip:after{ content:''; position:absolute; top:100%; left:50%; transform:translateX(-50%); border:5px solid transparent; border-top-color:var(--tip-bg); }
.refund-theme .frr-tipwrap:hover .frr-tip{ visibility:visible; opacity:1; }
/* date field with calendar icon (jQuery UI datepicker text input) */
.refund-theme .frr-datewrap{ position:relative; }
.refund-theme .frr-datewrap .form-control{ padding-right:30px; background:var(--surface); cursor:pointer; }
.refund-theme .frr-cal-ico{ position:absolute; right:10px; top:50%; transform:translateY(-50%); color:var(--brand); font-size:14px; pointer-events:none; }
/* generate-confirm popup header: title left, close (x) hard right */
.refund-theme #generateConfirmPopUp .modal-header{ justify-content:space-between; }
.refund-theme #generateConfirmPopUp .modal-title{ flex:1 1 auto; text-align:left; margin:0; }
.refund-theme #generateConfirmPopUp .close_custom{ margin-left:auto; }
/* generate-confirm popup summary */
.refund-theme #generateConfirmPopUp .frr-cf-lead{ font-size:13px; color:var(--ink); margin:0 0 14px; }
.refund-theme #generateConfirmPopUp .frr-cf-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:10px; margin-bottom:12px; }
.refund-theme #generateConfirmPopUp .frr-cf-grid > div{ border:1px solid var(--line); border-radius:6px; padding:10px 8px; text-align:center; background:var(--panel); }
.refund-theme #generateConfirmPopUp .frr-cf-grid span{ display:block; font-size:10.5px; text-transform:uppercase; color:var(--muted); font-weight:600; letter-spacing:.3px; }
.refund-theme #generateConfirmPopUp .frr-cf-grid b{ display:block; font-size:18px; margin-top:5px; color:var(--brand); }
.refund-theme #generateConfirmPopUp .frr-cf-note{ font-size:11.5px; color:var(--muted); margin:0; text-align:center; font-style:italic; }
.refund-theme .frr-info-ico:hover{ color:var(--brand-dark); }
/* Refund History: download this receipt's PDF again (Fees Refund Request s5 / Refund Transaction s6) */
.refund-theme .frr-pdf-ico{ color:var(--no); cursor:pointer; font-size:15px; vertical-align:middle; transition:opacity .12s; }
.refund-theme .frr-pdf-ico:hover{ opacity:.7; }
/* reserve a fixed icon slot on every Paid Amt cell so the numbers stay right-aligned across rows */
.refund-theme .frr-comp-table .frr-paid-cell{ position:relative; padding-right:28px !important; }
.refund-theme .frr-comp-table .frr-paid-cell .frr-info-ico{ position:absolute; right:9px; top:50%; transform:translateY(-50%); margin:0; }
/* Group-by-Component toggle in the Received Payments header */
/* colour is --ink, not --brand-dark. The accent belongs to things that ARE the accent - headings, the
   active tab, a primary button. This is a field caption sitting next to its tick box, so it reads as
   normal body text; in the accent it looked like a link and competed with the card title beside it. */
.refund-theme .frr-groupby{ display:inline-flex; align-items:center; gap:6px; margin:0; font-size:12px; font-weight:500;
  color:var(--ink); text-transform:none; letter-spacing:0; cursor:pointer; white-space:nowrap; }
.refund-theme .frr-groupby input{ width:14px; height:14px; margin:0; cursor:pointer; }
.refund-theme .frr-pi-head{ font-weight:600; color:var(--brand-dark); font-size:13.5px; margin-bottom:10px; }
.refund-theme .frr-pi-head span{ color:var(--muted); font-weight:400; font-size:12px; }
.refund-theme .frr-pi-tot{ display:flex; gap:12px; flex-wrap:wrap; }
.refund-theme .frr-pi-card{ flex:1; min-width:120px; border:1px solid var(--line); border-radius:6px; padding:10px 12px; background:var(--surface-2); }
.refund-theme .frr-pi-card .k{ font-size:10.5px; color:var(--muted); text-transform:uppercase; letter-spacing:.3px; }
.refund-theme .frr-pi-card b{ font-size:17px; font-weight:700; display:block; margin-top:3px; color:var(--ink); }
.refund-theme .frr-pi-card.hl{ background:var(--brand-light); border-color:var(--brand); }
.refund-theme .frr-pi-card.hl b{ color:var(--brand-dark); }
/* popup header = common theme solid colour (no gradient), clean white title + close */
.refund-theme #paidInfoPopup .modal-header{ background:var(--brand) !important; background-image:none !important;
  border-bottom:1px solid var(--brand-edge) !important; padding:11px 18px !important; min-height:0 !important;
  display:flex !important; align-items:center; justify-content:space-between; text-align:left !important; border-radius:8px 8px 0 0; }
.refund-theme #paidInfoPopup .modal-title{ color:var(--on-brand) !important; font-size:15px; font-weight:600; margin:0 auto 0 0 !important;
  flex:1 1 auto; text-align:left !important; display:inline-flex; align-items:center; }
/* popup table: auto-fit columns, no wrapping of the RFR numbers */
.refund-theme #paidInfoPopup .modal-body table{ table-layout:auto; }
.refund-theme #paidInfoPopup .modal-body td,
.refund-theme #paidInfoPopup .modal-body th{ white-space:nowrap; }
.refund-theme #paidInfoPopup .modal-title i{ color:var(--on-brand) !important; }
.refund-theme #paidInfoPopup .modal-header .close{ background:transparent !important; border:none !important; box-shadow:none !important;
  color:var(--on-brand) !important; opacity:.95; text-shadow:none; float:none; font-size:22px; line-height:1; margin:0; padding:0 2px; }
.refund-theme #paidInfoPopup .modal-header .close:hover{ opacity:1; }

/* card-4 summary: total-card variants + footer layout (mockup .tot.hl/.aw + .foot) */
.refund-theme .frr-totbar{ display:flex; gap:14px; flex-wrap:wrap; }
.refund-theme .frr-totbar .frr-tot{ flex:1; }
.refund-theme .frr-tot.hl{ background:var(--brand-light); border-color:var(--brand); }
.refund-theme .frr-tot.hl b{ color:var(--brand-dark); }
.refund-theme .frr-tot.aw b{ color:var(--warn); }
.refund-theme .frr-foot{ display:flex; justify-content:space-between; align-items:flex-end; gap:16px; flex-wrap:wrap; margin-top:14px; }
.refund-theme .frr-foot .frr-fld{ flex:2; }
.refund-theme .frr-hint{ font-size:11.5px; color:var(--muted); margin-top:6px; }
.refund-theme .frr-actions{ display:flex; gap:10px; flex:0 0 auto; }

/* back-to-list bar above the form cards (legacy - now the button lives in card-1 header) */
.refund-theme .frr-backbar{ margin-bottom:12px; }
/* Back to List button inside the card-1 header (compact so it doesn't grow the header) */
.refund-theme .frr-back-btn{ padding:5px 12px !important; font-size:12.5px; font-weight:600; line-height:1.2; }

/* refund history heading */
.refund-theme h4{ color:var(--brand-dark); font-weight:600; font-size:15px; margin:4px 0 12px; }

/* ---------- pagination ---------- */
.refund-theme .PaginationSec{ padding:10px 16px; margin:0 !important; font-size:12px; color:var(--muted); }
.refund-theme .PaginationSec .pagination > li > a,
.refund-theme .PaginationSec .pagination > li > span{
  border:1px solid var(--line); color:var(--brand); border-radius:4px; margin:0 2px; padding:4px 9px;
}
.refund-theme .PaginationSec .pagination > .active > a,
.refund-theme .PaginationSec .pagination > .active > span{
  background:var(--brand) !important; border-color:var(--brand) !important; color:var(--on-brand) !important;
}
.refund-theme .SP_drop_num{ display:inline-block; width:auto; height:32px; padding:2px 8px; border:1px solid var(--line); border-radius:5px; background:var(--surface); color:var(--ink); font-size:12.5px; cursor:pointer; }
.refund-theme .SP_drop_num:hover{ border-color:var(--brand-hover-border, var(--brand)); }
.refund-theme .SP_drop_num:focus{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); outline:none; }
/* SP_drop_num is a NATIVE <select> - its open list is OS-drawn and can never be recolored by CSS.
   _Layout.cshtml upgrades every `.refund-theme .SP_drop_num` to a lean select2 instance (no search
   box, no clear-x) so the open list picks up the brand highlight below. Common to every Refund
   screen's pagination bar - not page-scoped - since every list page shares this same control. */
.refund-theme .PaginationSec .dataTables_length{ display:flex; align-items:center; }
.refund-theme .PaginationSec .dataTables_length .page{ display:flex; align-items:center; gap:6px; }
/* COMPACT OVERRIDE. This one control is deliberately smaller than the app-wide 36px field: it holds a
   2-3 character number and sits inline between the words "Show" and "Entries", so full field height
   would tower over the text either side of it.
   height/padding need !important purely to beat the COMMON field rule, which is itself !important
   (it has to be, to beat SISCustom's `height:100% !important`). */
.refund-theme .PaginationSec .dataTables_length .select2-container{ width:58px !important; flex:0 0 58px; vertical-align:middle; }
.refund-theme .PaginationSec .dataTables_length .select2-container--default .select2-selection--single{ height:26px !important; padding:0 !important; border:1px solid var(--line); border-radius:5px; background:var(--surface); }
.refund-theme .PaginationSec .dataTables_length .select2-container--default .select2-selection--single .select2-selection__rendered{ height:24px; line-height:24px !important; margin-top:0 !important; padding-left:8px; padding-right:14px; overflow:visible; font-size:12px !important; }
.refund-theme .PaginationSec .dataTables_length .select2-container--default .select2-selection--single .select2-selection__arrow{ height:auto; width:10px; right:3px; }
.refund-theme .PaginationSec .dataTables_length .select2-container--default.select2-container--focus .select2-selection--single,
.refund-theme .PaginationSec .dataTables_length .select2-container--open .select2-selection--single{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme .PaginationSec .dataTables_length .select2-selection__clear{ display:none !important; }

/* ---------- search criteria panel ---------- */
.refund-theme .auto-height-div{
  background:linear-gradient(180deg,var(--surface-2),var(--row-hover)); border:1px solid var(--crit-border);
  border-left:3px solid var(--brand); border-radius:9px; padding:10px 14px; margin:0 16px;
}
.refund-theme .search-criteria-title{ font-weight:700; color:var(--brand-dark); font-size:13px; text-transform:none; }
.refund-theme .criteria-details{ color:var(--ink); }
.refund-theme .criteria-details .highlight{ color:var(--brand-dark); font-weight:700; }
.refund-theme .circle-icon{ color:var(--brand); font-size:7px; vertical-align:middle; }
.refund-theme .change-criteria-link{ color:var(--brand); font-weight:600; cursor:pointer; }

/* filtered-column arrow accent */
.refund-theme .red-icon{ color:var(--accent) !important; }

/* ---------- grid menu (Sort By / Export) ---------- */
.refund-theme .toggle_lines{
  background:var(--surface); border:1px solid var(--line); border-radius:6px;
  box-shadow:var(--shadow-menu); padding:8px 0; min-width:214px;
  font-family:"Segoe UI",Roboto,Arial,sans-serif;
}
/* normalise row heights: kill global li vertical padding, control spacing on the item */
.refund-theme .toggle_lines li{ padding-top:0 !important; padding-bottom:0 !important; }
/* one shared left padding (14px) for header, items and export -> all left-align */
.refund-theme .sortby_tag{ display:block; background:transparent !important; border-bottom:none !important; color:var(--muted) !important; font-family:"Segoe UI",Roboto,Arial,sans-serif !important; font-weight:700; font-size:10.5px; text-transform:uppercase; letter-spacing:.5px; line-height:normal; margin-bottom:5px; padding:2px 14px; }
.refund-theme .sortby_tag i{ display:none; }
/* reset nested list indent so header, items and export all left-align */
.refund-theme .toggle_lines ul{ list-style:none; margin:0; padding:0; }
.refund-theme .toggle_lines > li + li{ border-top:1px solid var(--line); margin-top:7px; padding-top:7px; }
.refund-theme .dropdown-item:hover{ background:var(--brand-light); }

/* ---------- BOOTSTRAP DROPDOWN MENU - COMMON ----------
   `<div class="btn-group">` + `data-toggle="dropdown"` + `<ul class="dropdown-menu">` is the OTHER menu
   pattern in this app, used wherever a controller has no ShowMenu flag to drive the `.toggle_lines`
   hamburger (grid Export menus, row action menus). It was styled once, page-scoped, under
   `.studentadvancesearch-page`; every other themed page's Bootstrap dropdown therefore opened in stock
   Bootstrap grey with square corners. Promoted here.
   NOT a risk to the app chrome: the layout's own navbar menus live outside `.refund-theme`. */
.refund-theme .dropdown-menu{
  margin:3px 0 0; min-width:170px; padding:4px;
  border:1px solid var(--line); border-radius:6px; background:var(--surface);
  box-shadow:0 8px 22px rgba(16,42,74,.18);
}
.refund-theme .dropdown-menu > li > a{
  display:flex; align-items:center; gap:7px;
  font-size:12.5px; color:var(--ink); border-radius:4px; padding:6px 9px;
}
/* the leading icon is furniture, so it stays muted until the row is hovered - the LABEL is what the eye
   should land on. This also kills the stock `.text-green` / `.text-red` utility colours these menu items
   are usually given, which put a different colour on every entry. */
.refund-theme .dropdown-menu > li > a .fa{ color:var(--muted); width:13px; text-align:center; }
.refund-theme .dropdown-menu > li > a:hover,
.refund-theme .dropdown-menu > li > a:focus{ background:var(--brand-light); color:var(--brand-dark); }
.refund-theme .dropdown-menu > li > a:hover .fa{ color:var(--brand); }
.refund-theme .dropdown-menu > .divider{ background:var(--line); margin:4px 0; }

/* ---------- modals (Filter / Cancel) ---------- */
.refund-theme .modal-content{ border-radius:8px; border:none; box-shadow:var(--shadow-lg); }
.refund-theme .modal-header{ background:var(--brand); color:var(--on-brand); border-radius:8px 8px 0 0; padding:12px 16px; }
.refund-theme .modal-header .modal-title,
.refund-theme .modal-header .close{ color:var(--on-brand) !important; opacity:1; }
/* The ID-based red override that used to live here is gone: it set the HEADER red and left
   the footer button to fend for itself, which is how FeeSMS ended up with a brand header and a
   red button in the same dialog. Intent is now a modifier on the dialog - see .rt-cf-* below. */

/* ---- Cancel-confirm dialog (matches Screen-1 mockup): warning icon, sentence-case body, solid-red confirm, centered actions ---- */
/* The confirm dialogs carry the legacy `NewSPR` skin class, and CustomTableDesign.css styles
   `.NewSPR .modal-content .modal-header` with a dark navy gradient. That selector is (0,3,0) and beats
   `.refund-theme .modal-header` (0,2,0), so every frr-confirm header rendered slate instead of brand,
   whatever load order. Match its depth (0,4,0) here once, instead of the per-popup `!important` patches
   this fight has collected elsewhere (#paidInfoPopup, #extraFields_popup).
   Deliberately NOT !important, so the intentional overrides still win:
   Both of the overrides this used to list (#cancelRefundPopUp red, .tpl-cf-on green) are GONE -
   replaced by the .rt-cf-* intent modifiers below, which colour the header and the button from
   one variable. */
.refund-theme .frr-confirm .modal-content .modal-header{
    background:var(--cf); border-bottom:1px solid var(--cf-edge); color:var(--on-brand);
}
/* =====================================================================
   CONFIRM DIALOG INTENT  (point 4)  - added 17-07-2026
   ---------------------------------------------------------------------
   ONE class on the dialog decides its colour, and the header and the confirm BUTTON both
   read the same variable - so they cannot disagree. That was the actual bug: FeeSMS's
   deactivate dialog had a BRAND header and a RED button, because the header colour and the
   button colour were set by two unrelated rules in two different files.

     <div class="modal frr-confirm">                 add / edit / generic  -> brand
     <div class="modal frr-confirm rt-cf-danger">    delete, cancel request -> red
     <div class="modal frr-confirm rt-cf-warn">      deactivate             -> amber
     <div class="modal frr-confirm rt-cf-ok">        activate               -> green
   and the confirm button is <button class="rt-cf-go">. It needs NO colour class - it takes
   the dialog's.

   The intents match the action column exactly (green=activate, amber=deactivate, red=delete)
   because a user should not have to re-learn what red means when a dialog opens.

   Replaces THREE separate mechanisms: the default brand header, an ID selector
   (#cancelRefundPopUp) and page-local CSS in FeeSMS with hardcoded green.
   ===================================================================== */
.refund-theme .frr-confirm{ --cf:var(--brand); --cf-edge:var(--brand-dark); }
.refund-theme .frr-confirm.rt-cf-danger{ --cf:var(--no);   --cf-edge:var(--no-border); }
.refund-theme .frr-confirm.rt-cf-warn{   --cf:var(--warn);  --cf-edge:var(--warn-border); }
.refund-theme .frr-confirm.rt-cf-ok{     --cf:var(--ok);    --cf-edge:var(--ok-border); }
/*  rt-cf-stop: STOP something that is currently running - switching a live parent-facing
    email off, and anything like it. Deeper than rt-cf-danger on purpose; see the --stop
    token for why --no goes coral at header size. It is its own intent rather than a
    restyle of rt-cf-danger, because delete dialogs are correct as they are and must not
    move underneath the pages already using them. */
.refund-theme .frr-confirm.rt-cf-stop{   --cf:var(--stop);  --cf-edge:var(--stop-border); }

/* the confirm button. Same var as the header - that IS the feature. */
.refund-theme .frr-confirm .rt-cf-go{
  background:var(--cf) !important; border:1px solid var(--cf-edge) !important; color:var(--on-brand) !important;
  font-size:13px; font-weight:600; padding:8px 16px; border-radius:5px;
}
.refund-theme .frr-confirm .rt-cf-go:hover,
.refund-theme .frr-confirm .rt-cf-go:focus{ filter:brightness(.92); color:var(--on-brand) !important; }

.refund-theme .frr-confirm .modal-dialog{ width:430px; max-width:94%; margin:6vh auto 0; }
.refund-theme .frr-confirm .modal-content{ border:none; border-radius:8px; overflow:hidden; box-shadow:0 12px 44px rgba(0,0,0,.32); }
.refund-theme .frr-confirm .modal-header{ display:flex; align-items:center; padding:9px 16px !important; min-height:0 !important; }
.refund-theme .frr-confirm .modal-title{ text-transform:none !important; letter-spacing:0 !important; color:var(--on-brand) !important;
  font-size:14px !important; font-weight:600 !important; line-height:1.2 !important; display:inline-flex; align-items:center; gap:8px; margin:0 !important; }
.refund-theme .frr-confirm .frr-cf-warn{ font-size:15px; line-height:1; }
.refund-theme .frr-confirm .modal-header .close{ margin:0 0 0 auto; padding:0 2px; background:transparent !important; border:none !important;
  box-shadow:none !important; color:var(--on-brand) !important; opacity:.95; text-shadow:none; font-size:20px; line-height:1; float:none; }
.refund-theme .frr-confirm .modal-header .close:hover{ opacity:1; }
.refund-theme .frr-confirm .modal-body{ padding:14px 16px; }
.refund-theme .frr-confirm .frr-cf-text{ text-transform:none !important; letter-spacing:0 !important; text-align:left;
  color:var(--ink); font-size:13px; font-weight:400; line-height:1.5; margin:6px 0; }
.refund-theme .frr-confirm .frr-cf-text b{ font-weight:700; color:var(--ink); }
.refund-theme .frr-confirm .modal-footer{ border-top:1px solid var(--line); padding:12px 16px; display:flex; gap:10px; justify-content:center; }
.refund-theme .frr-confirm .frr-cf-danger{ background:var(--no) !important; border:none !important; color:var(--on-brand) !important;
  font-size:13px; font-weight:600; padding:8px 16px; border-radius:5px; }
.refund-theme .frr-confirm .frr-cf-danger:hover{ filter:brightness(.92); }
.refund-theme .frr-confirm .frr-cf-plain{ background:var(--surface-2) !important; border:1px solid var(--line) !important; color:var(--ink) !important;
  font-size:13px; font-weight:600; padding:8px 16px; border-radius:5px; }
.refund-theme .frr-confirm .frr-cf-plain:hover{ filter:brightness(.97); }
.refund-theme .modal-body{ padding:14px 16px; }
.refund-theme .modal-footer{ border-top:1px solid var(--line); padding:12px 16px; display:flex; gap:10px; justify-content:center; }
.refund-theme .modal-footer .btn, .refund-theme .modal-footer .btn-custom{ padding:8px 18px; font-size:13px; line-height:1.4; }

/* ---------- Customize Column modal ---------- */
.refund-theme #extraFields_popup .modal-dialog{ width:560px; max-width:94vw; }
.refund-theme #extraFields_popup .modal-header{ background:var(--brand) !important; padding:12px 16px; }
.refund-theme .model_head_sp{ display:flex; align-items:center; justify-content:space-between; width:100%; }
.refund-theme #extraFields_popup .modal-title{ color:var(--on-brand) !important; font-size:15px; font-weight:600; display:flex; align-items:center; gap:7px; margin:0; }
.refund-theme .right_assets{ display:flex; align-items:center; gap:8px; }
.refund-theme .total_Count{ display:inline-flex; align-items:center; background-color:var(--overlay-white) !important; color:var(--on-brand); padding:3px 12px; border-radius:12px; font-size:12px; font-weight:600; }
.refund-theme .Selected_Count{ display:inline; background:transparent !important; color:var(--on-brand); margin:0 2px 0 0; padding:0; width:auto; height:auto; font-size:12px; font-weight:700; }
.refund-theme .close_custom{ font-size:24px; line-height:1; background:transparent !important; border:none; color:var(--on-brand) !important; opacity:.9; padding:0 2px; }
.refund-theme .close_custom:hover{ opacity:1; }
/* rows -> bordered card like the mockup .colitem */
.refund-theme .SP_ul{ max-height:440px; overflow-y:auto; margin:0; padding:2px; list-style:none; }
.refund-theme .SP_ul .list-group-item{
  display:flex !important; align-items:center; gap:10px;
  min-height:0; padding:7px 10px !important; margin:0 0 7px 0 !important;
  border:1px solid var(--line) !important; border-radius:6px !important;
  background:var(--surface) !important; color:var(--ink); box-shadow:none; cursor:default;
  font-size:12.5px; font-weight:400; font-family:"Segoe UI",Roboto,Arial,sans-serif;
}
/* let Angular ng-hide win over the display:flex above (empty row + hidden cols) */
.refund-theme .SP_ul .list-group-item.ng-hide{ display:none !important; }
.refund-theme .SP_ul .list-group-item:hover{ border-color:var(--brand-hover-border) !important; background:var(--row-hover-soft) !important; }
.refund-theme .SP_ul .list-group-item.frr-locked{ background:var(--locked-bg) !important; }
.refund-theme .frr-grip{ display:inline-flex; gap:3px; color:var(--grip); cursor:grab; font-size:13px; }
.refund-theme .frr-grip .fa{ color:var(--grip) !important; }
.refund-theme .frr-colcheck{ width:18px; display:inline-flex; align-items:center; justify-content:center; flex:0 0 18px; }
.refund-theme .frr-colchk{ height:12px; width:12px; margin:0; }
.refund-theme .frr-colchk[disabled]{ cursor:not-allowed; opacity:.7; }
.refund-theme .frr-lockchk{ cursor:not-allowed; opacity:.7; pointer-events:none; }
.refund-theme .frr-colname{ flex:1; font-size:12.5px; font-weight:400; color:var(--ink); font-family:"Segoe UI",Roboto,Arial,sans-serif; }
.refund-theme .frr-collock{ font-size:14px; margin-right:2px; line-height:1; }
.refund-theme .frr-updn{ display:inline-flex; gap:2px; }
.refund-theme .frr-updn button{ border:1px solid var(--line); background:var(--surface); border-radius:4px; cursor:pointer; width:22px; height:18px; padding:0; color:var(--ink); font-size:11px; line-height:1; }
.refund-theme .frr-updn button:hover:not([disabled]){ background:var(--brand-light); border-color:var(--brand); }
.refund-theme .frr-updn button[disabled]{ opacity:.35; cursor:default; }
.refund-theme .SP_ul .frr-empty{ justify-content:center; color:var(--muted) !important; background:var(--locked-bg) !important; }

/* grid body font to match mockup */
.refund-theme table{ font-size:12.5px; }
.refund-theme tbody td{ font-size:12.5px; }

/* ---------- landing grid header: Customize icon + sort arrow (match mockup) ---------- */
/* leftmost Customize-Column control = plain white hamburger lines, no box */
/* plain hamburger lines only - no badge/box */
.refund-theme .dynamictoggle{
  display:inline-flex; align-items:center; justify-content:center;
  background:transparent !important; border:none !important; box-shadow:none !important;
  padding:0; cursor:pointer; text-decoration:none;
}
.refund-theme .dynamictoggle:hover{ background:transparent !important; }
.refund-theme .dynamictoggle .table_box,
.refund-theme .dynamictoggle .fa,
.refund-theme .dynamictoggle .fa-bars{
  background:transparent !important; background-color:transparent !important;
  border:none !important; box-shadow:none !important; border-radius:0 !important;
  padding:0 !important; margin:0 !important; font-size:13px !important; line-height:1 !important;
  color:var(--on-brand) !important; opacity:1 !important; vertical-align:middle;
}
/* ---- FIRST COLUMN: 42px AND CENTRED, BUT ONLY IF IT IS A CONTROL COLUMN ----
   This used to be a bare `.refund-theme thead th:first-child{ width:42px; text-align:center }`, written for
   the landing grids whose first column is the Customize Column hamburger or a tick box. It applied to EVERY
   grid in the theme, so any table whose first column is real data got a heading centred over a wide column
   while every value under it sat at the left edge - the two stopped reading as belonging together - and the
   column was also being asked to be 42px wide. Parent Designation, Workflow Name, Field Name and Stream all
   hit this; it was reported as "first label of grid alignment not proper", and it was ours, not the pages'.

   NOW OPT-IN BY CONTENT, not by position: the rule only fires when that first header actually holds a
   control (the `.dynamictoggle` hamburger, or a checkbox) or is deliberately empty - which is exactly the
   set of cases it was written for. A header with a word in it is left alone and inherits the normal
   `text-align:left` from the `thead th` block above.
   `:has()` is already used elsewhere in this file, so the browser floor is fine.
   To centre any other heading, put `.text-center` on the <th> - the rule right below honours it. */
.refund-theme thead th:first-child:has(.dynamictoggle),
.refund-theme thead th:first-child:has(input[type="checkbox"]),
.refund-theme thead th:first-child:empty{ width:42px; text-align:center; }
/* sort arrow sits inline right after the label with a small gap (not floated to far-right) */
.refund-theme thead th .colorA{ float:none !important; display:inline; margin-left:5px; }
.refund-theme thead th .colorA .glyphicon,
.refund-theme thead th .colorA .pull-right{ float:none !important; margin:0; font-size:10px; color:var(--brand-ice) !important; }
.refund-theme thead th .colorA .red-icon{ color:var(--accent) !important; }

/* ---------- landing toolbar (mockup: title left | quick-search + Filter + New Request | menu) ---------- */
.refund-theme .frr-toolbar{ display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; padding:2px 16px 12px; }
.refund-theme .frr-tb-title{ display:flex; align-items:center; gap:9px; font-weight:600; font-size:13px; color:var(--brand-dark); }
.refund-theme .frr-tb-title .fa{ background:var(--brand); color:var(--on-brand); width:22px; height:22px; border-radius:50%; display:inline-flex; align-items:center; justify-content:center; font-size:11px; }
/* margin-left:auto so the actions stay hard right even when the toolbar has no title to push against
   them (a results view whose only control is Back) */
.refund-theme .frr-tb-actions{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-left:auto; }
.refund-theme .frr-quicksearch{ display:flex; align-items:center; gap:6px; height:36px; padding:0 10px; border:1px solid var(--line); border-radius:5px; background:var(--surface); }
.refund-theme .frr-quicksearch .fa{ color:var(--brand) !important; font-size:13px; }
.refund-theme .frr-quicksearch input{ border:none; outline:none; background:transparent; width:180px; font-size:13px; color:var(--ink); }
.refund-theme .frr-quicksearch:focus-within{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme .frr-tb-btn{ height:36px; display:inline-flex; align-items:center; gap:6px; padding:0 14px !important; font-size:13px; border-radius:5px; }
.refund-theme .frr-tb-iconbtn{ height:36px; width:38px; display:inline-flex; align-items:center; justify-content:center; padding:0; border-radius:5px; }
.refund-theme .frr-menuwrap{ position:relative; display:inline-block; }
.refund-theme .frr-tb-btn.btn-default .fa,
.refund-theme .frr-tb-btn.btn-default:hover .fa{ color:var(--brand) !important; }

/* ---------- .rt-tbfield - COMMON labelled field FOR A TOOLBAR ----------
   `.frr-fld` stacks its label ABOVE the control, which is right in a form or a `.rt-filterrow` and wrong
   in `.frr-toolbar`: a two-line item in a row of 36px buttons makes the whole toolbar taller and leaves
   the label floating above the button line.
   USE THIS when a page has ONE OR TWO controls that would otherwise justify a whole `.rt-filterrow` of
   their own. A filter row that exists to hold a single narrow dropdown spends a band of vertical space on
   one control while the right half of the toolbar sits empty - that is what this replaces (Scrutiny Field
   Configuration was the first). With three or more filters, use `.rt-filterrow` as normal.
   The control is a FIXED width: in a flex row with `margin-left:auto` a percentage-width select would
   fight the toolbar for space. Override the width per page when the values are longer. */
.refund-theme .rt-tbfield{ display:flex; align-items:center; gap:8px; flex:0 0 auto; }
.refund-theme .rt-tbfield > label{ margin:0; white-space:nowrap; }
/* `!important` is required, not decorative: the common select2 rule is
   `.refund-theme .select2-container{ width:100% !important }`, so a plain width here would lose to it
   however specific this selector is. */
.refund-theme .rt-tbfield > .form-control,
.refund-theme .rt-tbfield > .select2-container{ width:170px !important; flex:0 0 auto; }

/* magnifier SVG icon (device-independent; matches mockup: blue lens, purple handle) */
.refund-theme .frr-search-ico{ width:15px; height:15px; display:inline-block; vertical-align:middle; flex:0 0 auto; }

/* ---------- status pills (landing grid) ---------- */
.refund-theme .frr-status{ display:inline-block; padding:2px 9px; border-radius:11px; font-size:10.5px; font-weight:700; line-height:1.6; white-space:nowrap; text-transform:none; letter-spacing:normal; font-family:"Segoe UI",Roboto,Arial,sans-serif; }
.refund-theme .st-pen{ background:var(--pend-bg); color:var(--pend); }
.refund-theme .st-app{ background:var(--appr-bg); color:var(--brand-dark); }
.refund-theme .st-ref{ background:var(--ok-bg); color:var(--ok); }
.refund-theme .st-rej{ background:var(--no-bg); color:var(--no); }
.refund-theme .st-can{ background:var(--canc-bg); color:var(--muted); }
/* Active/Inactive STATE pills (17-07-2026). Not the same thing as the action column:
   there, amber means "click to deactivate". Here Inactive is a STATE, and a state is not
   an error - grey, exactly like Cancelled. Red would say something went wrong, and it
   would spend the one colour that has to keep meaning "delete" everywhere else.
   The TEXT still comes from ResourceDesign.lblActiveText - only the class changed. The
   resx is untouched: 25 views read those keys and CLAUDE.md says do not move them. */
.refund-theme .st-act{ background:var(--ok-bg); color:var(--ok); }
.refund-theme .st-off{ background:var(--canc-bg); color:var(--muted); }

/* ---------- SEMANTIC PILL COLOURS - USE THESE, NOT A NEW PER-PAGE PAIR ----------
   WHY THIS EXISTS. The `.st-*` names above are REFUND-DOMAIN words - pending, approved,
   refunded, rejected, cancelled - so every page outside that domain invented its own pair
   instead of reusing them. The result, counted in this file:
       background:var(--ok-bg); color:var(--ok)   was declared SIX times, as
           .st-ref  .st-act  .st-tct-on  .st-tc-issued  .st-sfc-on  .st-as-on
       background:var(--no-bg); color:var(--no)   was declared FOUR times, as
           .st-rej  .st-tct-off  .st-sfc-off  .st-as-off
       brand-light / brand-dark twice, as .st-wfs-mode and .st-wfa-mode
   Same declarations, ten different class names, six page blocks. Adding a screen meant
   adding another pair - which is exactly the drift this stylesheet is meant to prevent.

   THE FIX IS TO NAME THE MEANING, NOT THE SCREEN. A pill is one of five things:
       .rt-st-ok     yes / enabled / issued / complete / active
       .rt-st-no     no / disabled / rejected / failed
       .rt-st-warn   pending / draft / needs attention (reversible)
       .rt-st-info   a neutral setting, no judgement (Sequence vs Anyone, Student vs Employee)
       .rt-st-mute   inactive / cancelled / not applicable - a state, not an error
   USE: <span class="frr-status rt-st-ok">Yes</span>
   The refund `.st-*` names are KEPT, unchanged, because ~25 refund views read them and
   their resource strings; they are simply not the thing to copy onto a new page. */
.refund-theme .rt-st-ok{   background:var(--ok-bg);      color:var(--ok); }
.refund-theme .rt-st-no{   background:var(--no-bg);      color:var(--no); }
.refund-theme .rt-st-warn{ background:var(--warn-bg);    color:var(--warn); }
.refund-theme .rt-st-info{ background:var(--brand-light); color:var(--brand-dark); }
.refund-theme .rt-st-mute{ background:var(--canc-bg);    color:var(--muted); }

/* ---------- .rt-titlechip - COMMON small chip beside a heading ----------
   Context next to a title: the mode on a workflow dialog, "Field"/"Document" on a scrutiny
   confirm, the level on an approver row. Was written three times as `.sd-cf-kind`,
   `.wfa-chip` and `.wfs-cf-mode` - and the tell that they were the same thing is that two
   of them had already been comma-joined into one rule.
   On a BRAND-FILLED header it flips to a white wash automatically, so the same class works
   in a `.modal-header` and on a light toolbar without the page choosing. */
.refund-theme .rt-titlechip{
  display:inline-block; padding:1px 8px; border-radius:10px;
  background:var(--brand-light); color:var(--brand-dark);
  font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.4px;
}
.refund-theme .modal-header .rt-titlechip,
.refund-theme .rt-cardbar .rt-titlechip{
  background:rgba(255,255,255,.18); color:var(--on-brand);
}

/* ---------- .rt-required - COMMON "this rt-select must always hold a value" ----------
   `_Layout` initialises every `.rt-select` with `allowClear:true`, which is right for an
   optional field and wrong for a mandatory filter: clicking the x sets the model to null and
   the grid reloads with no criteria. There is no per-control way to switch allowClear off
   without editing the shared init, so the x is removed in CSS.
   THIS WAS WRITTEN THREE TIMES - `.sca-statusfld`, `.sfc-forfld`, `.sm-bucketfld` - two rules
   each, six rules for one idea. Now: add `rt-required` to the FIELD WRAPPER.
   USE: <div class="frr-fld rt-required"> <label>…</label> <select class="rt-select">…  */
.refund-theme .rt-required .select2-selection__clear{
  display:none !important; pointer-events:none !important;
}
/* with no x there is nothing between the value and the caret, so the value gets the box back */
.refund-theme .rt-required .select2-selection--single .select2-selection__rendered{
  padding-right:26px;
}

/* grid header sort arrows: neutral up-down on sortable cols, single arrow when active */
.refund-theme .frr-sort{ margin-left:5px; text-decoration:none !important; cursor:pointer; }
.refund-theme .frr-sort-neutral{ color:var(--brand-ice) !important; opacity:.85; font-size:11px; }
.refund-theme .frr-sort-active{ color:var(--on-brand) !important; font-size:11px; }

/* full-bleed grid: kill bootstrap row/col insets inside the card header so the table touches both edges */
.refund-theme .box-header > .row{ margin-left:0 !important; margin-right:0 !important; }
.refund-theme .box-header > .row > [class*="col-"]{ padding-left:0 !important; padding-right:0 !important; }

/* Sort By dropdown items: hover + themed active highlight (like the reference) */
.refund-theme .toggle_lines .dropdown-item{ display:flex; align-items:center; gap:8px; padding:5px 14px; margin:0; border-radius:0; color:var(--ink) !important; font-size:12.5px; font-weight:500; font-family:"Segoe UI",Roboto,Arial,sans-serif !important; line-height:20px; transition:color .12s; }
.refund-theme .toggle_lines .dropdown-item:hover{ background:transparent !important; color:var(--brand) !important; }
.refund-theme .toggle_lines .dropdown-item.frr-sortactive{ background:transparent !important; color:var(--brand-dark) !important; font-weight:600; }
.refund-theme .toggle_lines .dropdown-item.frr-sortactive:hover{ background:transparent !important; color:var(--brand-dark) !important; }
.refund-theme .toggle_lines .dropdown-item .frr-dd-arrow{ margin-left:auto; color:var(--brand); font-size:11px; line-height:1; }
.refund-theme .toggle_lines .frr-export-ico{ color:var(--ink); flex:0 0 auto; font-size:13px; line-height:1; }
.refund-theme .toggle_lines li{ background:transparent !important; }

/* ============================================================
   COMMON EXPORT POPUP  (#ExportCurrentView, shared _ExportView.cshtml)
   Scoped under .refund-theme -> only refund/new pages restyle;
   the same partial on old pages keeps its original look.
   ============================================================ */
.refund-theme #ExportCurrentView .modal-header{
  background:var(--brand) !important; border-bottom:1px solid var(--brand-edge) !important;
  padding:10px 18px !important; min-height:0 !important; }
.refund-theme #ExportCurrentView .model_head{ margin:0 !important; padding:0 !important; }
.refund-theme #ExportCurrentView .modal-title,
.refund-theme #ExportCurrentView .modal-title i,
.refund-theme #ExportCurrentView .close_custom i{ color:var(--on-brand) !important; }
.refund-theme #ExportCurrentView .modal-title{ margin:0 !important; line-height:1.4; font-size:14.5px; font-weight:600; letter-spacing:.2px; }
.refund-theme #ExportCurrentView .close_custom{ font-size:17px !important; line-height:1 !important; margin:0 !important; opacity:.9; }
.refund-theme #ExportCurrentView .close_custom:hover{ opacity:1; }
.refund-theme #ExportCurrentView .modal-body{ padding:15px 18px !important; }

/* ---------- .rt-settingrow - COMMON "setting" row: label left, control right ----------
   A settings screen is a stack of these: what the setting is on the left, the thing you operate on the
   right. AccountSetting built it as `.custom-big-box` + `.left-content` + `.right-section` (with a grey
   panel and hardcoded #f1f1f1 / #777), and LCConfiguration built the same shape again as `.lc-setting`.
   One component instead of two.
   USE:
     <div class="rt-settingrow">
       <div class="rt-settingrow-text">
         <p class="rt-settingrow-title">Password</p>
         <p class="rt-settingrow-desc">Change it whenever you like.</p>
       </div>
       <div class="rt-settingrow-action"> ...button, toggle, pill... </div>
     </div>
   `align-items:flex-start` NOT center: once the left column runs to two or three lines, a vertically
   centred control drifts away from the title it belongs to.
   TODO when LCConfiguration is next touched: point `.lc-setting` at this and delete its copy. */
.refund-theme .rt-settingrow{
  display:flex; align-items:flex-start; justify-content:space-between; gap:20px; flex-wrap:wrap;
  padding:14px 16px; border:1px solid var(--line); border-radius:9px;
  background:var(--surface); margin-bottom:10px;
}
.refund-theme .rt-settingrow:last-child{ margin-bottom:0; }
.refund-theme .rt-settingrow-text{ flex:1 1 320px; min-width:0; }
.refund-theme .rt-settingrow-title{
  display:flex; align-items:center; gap:9px; flex-wrap:wrap;
  margin:0; font-size:13.5px; font-weight:600; color:var(--ink);
}
.refund-theme .rt-settingrow-desc{
  margin:3px 0 0; font-size:12px; line-height:1.6; color:var(--muted);
}
/* the right-hand column. It was a grey panel (#f1f1f1) filling a third of the row - the tint drew the eye to
   the container rather than to the control inside it, so the row now reads left-to-right and only the control
   carries weight. */
.refund-theme .rt-settingrow-action{
  flex:0 0 auto; display:flex; align-items:center; justify-content:flex-end; gap:10px; flex-wrap:wrap;
}
/* a short status sentence standing in for the control (e.g. "2FA is already enabled for admins") */
.refund-theme .rt-settingrow-note{
  max-width:260px; text-align:right; font-size:12px; line-height:1.55; color:var(--ok);
}

/* ---------- .rt-callout - COMMON tinted note with a leading icon ----------
   "A short warning or explanation, icon on the left, text beside it" turns up on most screens, and until
   now every one of them invented it: `.frr-export-info`, `.frr-export-note`, `.imp-hint`, and on
   WorkflowAuthority a bare `<span>` inside a form-field wrapper.
   I first reached for `.rt-sb-notify` here, which was wrong - that is the STICKY BAR's tick-box row, so it
   supplies no flex row of its own and the icon stacked ABOVE the text instead of beside it. Hence this.
   USE: <div class="rt-callout rt-callout-warn"><i class="fa fa-exclamation-triangle"></i><span>…</span></div>
   `align-items:flex-start` so the icon stays on the FIRST line when the text wraps to several - centring it
   vertically against a three-line paragraph leaves it floating in the middle of nowhere. */
.refund-theme .rt-callout{
  display:flex; align-items:flex-start; gap:9px;
  margin:12px 0 0; padding:10px 12px;
  background:var(--surface-2); border:1px solid var(--line); border-left:3px solid var(--brand);
  border-radius:6px; font-size:12px; line-height:1.55; color:var(--ink);
}
.refund-theme .rt-callout > .fa{ flex:0 0 auto; margin-top:2px; font-size:13px; color:var(--brand); }
.refund-theme .rt-callout > span{ flex:1 1 auto; min-width:0; }
/* amber = reversible but worth reading twice; the same token the deactivate button uses, so "amber means
   think about it" holds across the theme */
.refund-theme .rt-callout-warn{
  background:var(--warn-bg); border-color:var(--warn-border); border-left-color:var(--warn);
}
.refund-theme .rt-callout-warn > .fa{ color:var(--warn); }

/* info banner + row-limit note */
.refund-theme .frr-export-info{ display:block; background:var(--brand-light); color:var(--brand-dark);
  border-left:3px solid var(--brand); border-radius:4px; padding:9px 12px; font-size:12.5px; line-height:1.5; }
.refund-theme .frr-export-note{ margin-top:10px; background:var(--surface-2); color:var(--muted);
  border:1px solid var(--line); border-left:3px solid var(--brand); border-radius:4px;
  padding:9px 12px; font-size:12px; line-height:1.5; }
.refund-theme .frr-export-note i{ color:var(--brand); }

/* Export As block */
.refund-theme #ExportCurrentView .com-label{ font-weight:600; color:var(--ink); font-size:13px; }
.refund-theme #ExportCurrentView .rd_con .row{ padding:4px 2px !important; }
.refund-theme #ExportCurrentView .rd_con span{ font-size:12.5px; color:var(--ink); }

/* password field + eye + hint (all colours from tokens) */
.refund-theme #ExportCurrentView .form-control{ font-size:12.5px; }
.refund-theme .frr-pass-eye{ color:var(--muted); }
.refund-theme .frr-pass-eye:hover{ color:var(--brand); }
.refund-theme #ExportCurrentView .frr-pwd-hint{ display:block; margin-top:6px; color:var(--muted) !important; font-size:11.5px; line-height:1.45; }
.refund-theme #ExportCurrentView #errorpass{ color:var(--no) !important; font-size:11.5px; }
/* live password requirement checklist (ticks green as each rule is met) */
.refund-theme #ExportCurrentView .frr-pwd-rules{ list-style:none; margin:8px 0 0; padding:8px 12px; display:grid; grid-template-columns:1fr 1fr; gap:1px 18px; background:var(--surface-2); border:1px solid var(--line); border-radius:5px; }
.refund-theme #ExportCurrentView .frr-pwd-rules li{ position:relative; padding-left:19px; font-size:11.5px; color:var(--muted); line-height:1.8; transition:color .12s; }
.refund-theme #ExportCurrentView .frr-pwd-rules li::before{ content:"\2022"; position:absolute; left:3px; top:0; color:var(--muted); font-size:14px; line-height:inherit; }
.refund-theme #ExportCurrentView .frr-pwd-rules li.ok{ color:var(--ok); }
.refund-theme #ExportCurrentView .frr-pwd-rules li.ok::before{ content:"\2713"; color:var(--ok); font-size:12px; font-weight:700; }

/* footer buttons already themed via .btn-custom / .btn-default */
.refund-theme #ExportCurrentView .modal-footer{ padding:12px 18px !important; border-top:1px solid var(--line); }

/* ============================================================
   FILTER POPUP (#FeesRefundSearch) - same professional themed chrome
   as the export popup; all colours from tokens.
   ============================================================ */
.refund-theme #FeesRefundSearch .modal-header{ display:flex !important; align-items:center !important; justify-content:space-between !important;
  text-align:left !important; background:var(--brand) !important; border-bottom:1px solid var(--brand-edge) !important; padding:10px 18px !important;
  min-height:0 !important; border-radius:7px 7px 0 0; }
.refund-theme #FeesRefundSearch .modal-title,
.refund-theme #FeesRefundSearch .modal-title i,
.refund-theme #FeesRefundSearch .close_custom,
.refund-theme #FeesRefundSearch .close_custom i{ color:var(--on-brand) !important; }
.refund-theme #FeesRefundSearch .modal-title{ margin:0 !important; text-align:left !important; flex:1 1 auto; font-size:14.5px; font-weight:600; letter-spacing:.2px; line-height:1.4; }
.refund-theme #FeesRefundSearch .close_custom{ background:transparent; border:none; font-size:17px; line-height:1; cursor:pointer; padding:0; margin-left:auto; opacity:.9; }
.refund-theme #FeesRefundSearch .close_custom:hover{ opacity:1; }
.refund-theme #FeesRefundSearch .modal-body{ padding:16px 18px 4px !important; }

/* refund detail popups (line receipts / receipt requests) - compact themed header like the filter popup */
.refund-theme .frr-detailpop .modal-header{ display:flex !important; align-items:center !important; justify-content:space-between !important;
  text-align:left !important; background:var(--brand) !important; border-bottom:1px solid var(--brand-edge) !important; padding:10px 18px !important;
  min-height:0 !important; border-radius:7px 7px 0 0; }
.refund-theme .frr-detailpop .modal-title,
.refund-theme .frr-detailpop .modal-title i,
.refund-theme .frr-detailpop .close_custom,
.refund-theme .frr-detailpop .close_custom i{ color:var(--on-brand) !important; }
.refund-theme .frr-detailpop .modal-title{ margin:0 !important; text-align:left !important; flex:1 1 auto; font-size:14.5px; font-weight:600; letter-spacing:.2px; line-height:1.4; }
.refund-theme .frr-detailpop .close_custom{ background:transparent; border:none; font-size:17px; line-height:1; cursor:pointer; padding:0; margin-left:auto; opacity:.9; }
.refund-theme .frr-detailpop .close_custom:hover{ opacity:1; }
.refund-theme .frr-detailpop .modal-body{ padding:14px 18px 6px !important; }
/* popup grid header = light grey (not brand blue) so the popup doesn't look dark/heavy */
.refund-theme .frr-detailpop .attendance-table thead th{ background:var(--subhead-bg) !important; background-image:none !important; color:var(--subhead-ink) !important; border-color:var(--subhead-line) !important; text-shadow:none !important; }
.refund-theme .frr-detailpop .attendance-table tbody td{ color:var(--subhead-td); }
.refund-theme #FeesRefundSearch .form-group{ margin-bottom:14px; }
.refund-theme #FeesRefundSearch .form-group label{ display:block; margin-bottom:5px; font-size:12px; font-weight:600; color:var(--ink); text-transform:none !important; }
.refund-theme #FeesRefundSearch .form-control{ font-size:12.5px; height:36px; border:1px solid var(--line); border-radius:5px; box-shadow:none; color:var(--ink); }
.refund-theme #FeesRefundSearch .form-control:focus{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme #FeesRefundSearch .input-group-addon{ background:var(--brand-light); border:1px solid var(--line); color:var(--brand-dark); }
.refund-theme #FeesRefundSearch .box-footer{ padding:12px 18px !important; border-top:1px solid var(--line); text-align:center; background:var(--surface-2); border-radius:0 0 6px 6px; }
.refund-theme #FeesRefundSearch .box-footer .btn-custom{ margin-right:8px; }
/* footer primary+secondary now both use the rt-btn base -> keep a gap between them */
.refund-theme .box-footer .rt-btn + .rt-btn, .refund-theme .modal-footer .rt-btn + .rt-btn{ margin-left:8px; }
/* side-by-side From - To date range (Zoho style) */
.refund-theme #FeesRefundSearch .frr-daterange{ display:flex; align-items:center; gap:8px; }
.refund-theme #FeesRefundSearch .frr-daterange .form-control{ flex:1 1 0; min-width:0; background:var(--surface); cursor:pointer; }
.refund-theme #FeesRefundSearch .frr-daterange-sep{ flex:0 0 auto; color:var(--muted); font-weight:600; }
/* validation alert banner (Zoho style) - STATIC error colours (not the accent) */
.refund-theme .frr-alert{ display:flex; align-items:center; margin-bottom:14px; padding:10px 12px;
  background:var(--no-bg); color:var(--no); border:1px solid var(--no-border); border-left:3px solid var(--no);
  border-radius:5px; font-size:12.5px; line-height:1.4; }
.refund-theme .frr-alert i.fa-exclamation-circle{ color:var(--no); }
.refund-theme .frr-alert-close{ margin-left:auto; background:transparent; border:none; color:var(--no);
  cursor:pointer; font-size:14px; line-height:1; padding:0 2px; opacity:.75; }
.refund-theme .frr-alert-close:hover{ opacity:1; }
/* status multi-select (checkbox dropdown + Select All) */
.refund-theme #FeesRefundSearch .frr-ms{ position:relative; }
.refund-theme #FeesRefundSearch .frr-ms-box{ display:flex; align-items:center; height:36px; padding:0 10px; border:1px solid var(--line);
  border-radius:5px; background:var(--surface); cursor:pointer; font-size:12.5px; color:var(--ink); }
.refund-theme #FeesRefundSearch .frr-ms.open .frr-ms-box{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme #FeesRefundSearch .frr-ms-text{ flex:1 1 auto; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.refund-theme #FeesRefundSearch .frr-ms-ph{ color:var(--muted); }
.refund-theme #FeesRefundSearch .frr-ms-caret{ color:var(--muted); margin-left:6px; }
.refund-theme #FeesRefundSearch .frr-ms-panel{ position:absolute; z-index:30; top:calc(100% + 4px); left:0; right:0; background:var(--surface);
  border:1px solid var(--line); border-radius:6px; box-shadow:var(--shadow-menu); padding:4px; max-height:230px; overflow:auto; }
.refund-theme #FeesRefundSearch .frr-ms-item{ display:flex !important; align-items:center !important; gap:8px; margin:0 !important; padding:6px 10px;
  border-radius:4px; font-size:12.5px; font-weight:400; line-height:1.4; color:var(--ink); cursor:pointer; }
.refund-theme #FeesRefundSearch .frr-ms-item:hover{ background:var(--brand-light); }
.refund-theme #FeesRefundSearch .frr-ms-item input[type=checkbox]{ -webkit-appearance:checkbox; appearance:auto; accent-color:var(--brand);
  margin:0 !important; padding:0; width:15px; height:15px; min-width:15px; flex:0 0 auto; float:none; position:static; vertical-align:middle; top:auto; }
.refund-theme #FeesRefundSearch .frr-ms-item span{ line-height:1.4; display:inline-block; }
.refund-theme #FeesRefundSearch .frr-ms-all{ border-bottom:1px solid var(--line); border-radius:0; margin-bottom:2px; font-weight:600; }
.refund-theme #FeesRefundSearch .modal-content{ border:none; border-radius:7px; box-shadow:var(--shadow-lg); }
/* STATUS select: theme the box (native open-list highlight is browser/OS-drawn) */
.refund-theme #FeesRefundSearch select.form-control option:checked{ background:var(--brand); color:var(--on-brand); }

/* ============================================================
   DATE-RANGE CALENDAR (daterangepicker) - RESET leaked .refund-theme
   grid/form styles + apply the common theme colours.
   ============================================================ */
.refund-theme .daterangepicker{ border:1px solid var(--line); border-radius:8px; box-shadow:var(--shadow-menu);
  font-family:"Segoe UI",Roboto,Arial,sans-serif; padding:0; }
.refund-theme .daterangepicker:after{ border-bottom-color:var(--surface); }
.refund-theme .daterangepicker:before{ border-bottom-color:var(--line); }
.refund-theme .daterangepicker .calendar-table{ padding:6px; border:0; background:transparent; }
/* undo the inflated cell height / padding / borders leaking from the grid theme */
.refund-theme .daterangepicker table{ width:auto; margin:0; border:0; border-collapse:separate; background:transparent; }
.refund-theme .daterangepicker th,
.refund-theme .daterangepicker td{ box-sizing:border-box; width:30px !important; min-width:30px !important; height:28px !important;
  padding:0 !important; line-height:28px !important; text-align:center; vertical-align:middle; font-size:12px; font-weight:400;
  border:0 !important; white-space:nowrap; background:transparent; color:var(--ink); border-radius:4px; }
/* clean & light (Zoho-like): white bg, grey headers, ONE soft selection colour */
.refund-theme .daterangepicker thead th,
.refund-theme .daterangepicker th{ background:var(--surface) !important; background-image:none !important; border:0 !important;
  box-shadow:none !important; color:var(--muted) !important; font-weight:600; font-size:11px; text-transform:none; height:28px !important; }
.refund-theme .daterangepicker th.month{ color:var(--ink) !important; }
.refund-theme .daterangepicker th.prev, .refund-theme .daterangepicker th.next{ color:var(--brand-dark) !important; }
.refund-theme .daterangepicker td{ background:var(--surface) !important; color:var(--ink) !important; }
.refund-theme .daterangepicker td.available:hover{ background:var(--row-hover) !important; color:var(--ink) !important; }
.refund-theme .daterangepicker td.in-range,
.refund-theme .daterangepicker td.active,
.refund-theme .daterangepicker td.active:hover{ background:var(--brand-light) !important; color:var(--brand-dark) !important; }
.refund-theme .daterangepicker td.active{ box-shadow:inset 0 0 0 1px var(--brand); font-weight:600; border-radius:4px; }
.refund-theme .daterangepicker td.today:not(.active){ box-shadow:inset 0 0 0 1px var(--brand-hover-border); }
.refund-theme .daterangepicker td.off{ background:var(--surface) !important; color:var(--muted) !important; opacity:.45; }
/* top date inputs: make room for the calendar icon (fixes icon/text overlap) */
.refund-theme .daterangepicker .daterangepicker_input{ position:relative; }
.refund-theme .daterangepicker .input-mini{ box-sizing:border-box; width:100%; height:30px; padding:0 8px 0 30px !important;
  font-size:12px; border:1px solid var(--line) !important; border-radius:5px; color:var(--ink); box-shadow:none; }
.refund-theme .daterangepicker .input-mini.active{ border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme .daterangepicker .daterangepicker_input i{ position:absolute; left:9px; top:50%; transform:translateY(-50%); color:var(--muted); font-size:13px; }
/* month / year dropdowns */
.refund-theme .daterangepicker select.monthselect,
.refund-theme .daterangepicker select.yearselect{ height:28px; font-size:12px; color:var(--ink); border:1px solid var(--line);
  border-radius:4px; background:var(--surface); }
.refund-theme .daterangepicker select.monthselect:focus,
.refund-theme .daterangepicker select.yearselect:focus{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); outline:none; }
/* buttons */
.refund-theme .daterangepicker .applyBtn,
.refund-theme .daterangepicker .btn.applyBtn{ background:var(--brand) !important; border:1px solid var(--brand) !important;
  color:var(--on-brand) !important; border-radius:5px !important; font-weight:600; padding:5px 16px; }
.refund-theme .daterangepicker .applyBtn:hover,
.refund-theme .daterangepicker .btn.applyBtn:hover{ background:var(--brand-dark) !important; border-color:var(--brand-dark) !important; }
.refund-theme .daterangepicker .cancelBtn,
.refund-theme .daterangepicker .btn.cancelBtn{ background:var(--surface) !important; border:1px solid var(--line) !important;
  color:var(--brand) !important; border-radius:5px !important; font-weight:600; padding:5px 16px; }
.refund-theme .daterangepicker .cancelBtn:hover,
.refund-theme .daterangepicker .btn.cancelBtn:hover{ background:var(--brand-light) !important; border-color:var(--brand) !important; }

/* ============================================================
   SINGLE-DATE CALENDAR (bootstrap-datepicker .datepicker-dropdown)
   ------------------------------------------------------------
   This is the popup behind the app's COMMON date classes wired up in _Layout.cshtml
   (.datepicker / .datepickerWithoutFutureDate / .disablePastDate / .onlyYearDisplayDatePicker).
   Restyled to match the .daterangepicker calendar above - same border/radius/shadow, same 30x28
   day cells, same brand-tinted selected day, same muted out-of-month days - so a single-date field
   and a date-range field look like the same control family.

   DELIBERATELY UNSCOPED (no .refund-theme prefix), for two reasons:
     1. bootstrap-datepicker appends its popup to <body>, i.e. OUTSIDE the page's .refund-theme root,
        so a scoped selector would never match it. (This is the same reason _Layout.cshtml puts the
        accent class on <body> rather than the page div - see the comment at the top of that file.)
     2. Every page in the app shares these date classes, so theming them here updates all of them at
        once, which is the intent - one common calendar design, no per-page CSS.
   Colours are all tokens, so the .theme-* accent presets recolour this for free.
   ============================================================ */
.datepicker.datepicker-dropdown{ border:1px solid var(--line); border-radius:8px; box-shadow:var(--shadow-menu);
  font-family:"Segoe UI",Roboto,Arial,sans-serif; padding:6px; background:var(--surface); }
.datepicker.datepicker-dropdown:after{ border-bottom-color:var(--surface); }
.datepicker.datepicker-dropdown:before{ border-bottom-color:var(--line); }
.datepicker.datepicker-dropdown{ min-width:252px; }
.datepicker.datepicker-dropdown table{ margin:0; border:0; border-collapse:separate; background:transparent; width:100%; }
/* Cell sizing applies to the DAYS grid only.
   The month / year / decade views are built completely differently: they are a SINGLE <td> containing
   floated <span> items. Forcing a 30px width on every td (as an earlier revision did) squeezed that one
   cell down to 30px, so all ten year labels piled up on top of each other. */
.datepicker.datepicker-dropdown .datepicker-days th,
.datepicker.datepicker-dropdown .datepicker-days td{ box-sizing:border-box; width:30px; min-width:30px; height:28px;
  padding:0; text-align:center; vertical-align:middle; font-size:12px; border:0; border-radius:4px; }
/* shared cell resets that are safe for every view */
.datepicker.datepicker-dropdown th,
.datepicker.datepicker-dropdown td{ padding:0; text-align:center; vertical-align:middle; font-size:12px; border:0; border-radius:4px; }
.datepicker.datepicker-dropdown .datepicker-months td,
.datepicker.datepicker-dropdown .datepicker-years td,
.datepicker.datepicker-dropdown .datepicker-decades td,
.datepicker.datepicker-dropdown .datepicker-centuries td{ width:auto; min-width:0; height:auto; padding:2px; }
/* header row (month/year + prev/next arrows) */
.datepicker.datepicker-dropdown thead th{ background:var(--surface); background-image:none; color:var(--muted);
  font-weight:600; }
.datepicker.datepicker-dropdown thead th.datepicker-switch{ color:var(--ink); font-weight:700; }
.datepicker.datepicker-dropdown thead th.prev,
.datepicker.datepicker-dropdown thead th.next{ color:var(--brand-dark); }
.datepicker.datepicker-dropdown thead th.datepicker-switch:hover,
.datepicker.datepicker-dropdown thead th.prev:hover,
.datepicker.datepicker-dropdown thead th.next:hover{ background:var(--brand-light); }
.datepicker.datepicker-dropdown thead th.dow{ color:var(--muted); font-size:11px; font-weight:700; text-transform:uppercase; }
/* day cells */
.datepicker.datepicker-dropdown td.day{ background:var(--surface); color:var(--ink); }
.datepicker.datepicker-dropdown td.day:hover{ background:var(--row-hover); color:var(--ink); }
.datepicker.datepicker-dropdown td.day.old,
.datepicker.datepicker-dropdown td.day.new{ color:var(--muted); opacity:.45; }
.datepicker.datepicker-dropdown td.day.today:not(.active){ background:var(--surface);
  box-shadow:inset 0 0 0 1px var(--brand-hover-border); }
.datepicker.datepicker-dropdown td.day.active,
.datepicker.datepicker-dropdown td.day.active:hover,
.datepicker.datepicker-dropdown td.day.active.active{ background:var(--brand-light); color:var(--brand-dark);
  background-image:none; text-shadow:none; box-shadow:inset 0 0 0 1px var(--brand); font-weight:600; }
/* a disabled day must read as unavailable, not merely quiet - this is what enforces
   "no past dates" visually for .disablePastDate fields

   STRUCK THROUGH, NOT JUST FADED (01-09-2026). Fading alone was not enough to tell
   the two greyed states apart: a DISABLED day sat at muted/.35 and an OUT-OF-MONTH
   day at muted/.45, so on the Next Follow-Up Date field the blocked past dates
   looked exactly like the harmless trailing days of the previous month. People
   clicked them and read the silence as the calendar being broken rather than as a
   refusal. A line through the number says "not available" at a glance, in a way
   that does not depend on comparing two opacities side by side.

   This is UX only - `startDate: new Date()` is what actually refuses the click,
   and per the note in RtDateRange.js the SERVER must still reject an out-of-range
   date, because anything in the DOM can be typed or devtool'd past. */
.datepicker.datepicker-dropdown td.day.disabled,
.datepicker.datepicker-dropdown td.day.disabled:hover{ background:var(--surface); color:var(--muted);
  opacity:.5; cursor:not-allowed; text-decoration:line-through; }
/* month / year / decade pickers behind the header click-through */
/* month / year / decade items: explicit box so the four-per-row float layout holds (the plugin's own
   width/height are what my earlier cell rule was overriding) */
.datepicker.datepicker-dropdown span.month,
.datepicker.datepicker-dropdown span.year,
.datepicker.datepicker-dropdown span.decade,
.datepicker.datepicker-dropdown span.century{
  display:block; float:left; box-sizing:border-box;
  width:23%; margin:1%; height:32px; line-height:32px;
  border-radius:4px; color:var(--ink); font-size:12px; text-align:center; cursor:pointer;
}
.datepicker.datepicker-dropdown span.month:hover,
.datepicker.datepicker-dropdown span.year:hover,
.datepicker.datepicker-dropdown span.decade:hover,
.datepicker.datepicker-dropdown span.century:hover{ background:var(--row-hover); }
.datepicker.datepicker-dropdown span.month.active,
.datepicker.datepicker-dropdown span.year.active,
.datepicker.datepicker-dropdown span.decade.active,
.datepicker.datepicker-dropdown span.century.active{ background:var(--brand-light); background-image:none;
  color:var(--brand-dark); text-shadow:none; box-shadow:inset 0 0 0 1px var(--brand); font-weight:600; }
.datepicker.datepicker-dropdown span.old,
.datepicker.datepicker-dropdown span.new{ color:var(--muted); opacity:.45; }
/* OUT-OF-RANGE months/years must look unavailable.
   bootstrap-datepicker already works out which ones the configured range allows and marks them
   `.disabled` - the day grid was styling that, but the month/year/decade spans were not, so years the
   picker would refuse to accept still rendered as normal dark, clickable-looking text. Nothing about
   the range itself is changed here; this only shows what the plugin had already decided. */
.datepicker.datepicker-dropdown span.disabled,
.datepicker.datepicker-dropdown span.disabled:hover,
.datepicker.datepicker-dropdown span.month.disabled,
.datepicker.datepicker-dropdown span.year.disabled,
.datepicker.datepicker-dropdown span.decade.disabled,
.datepicker.datepicker-dropdown span.century.disabled{
  background:var(--surface) !important; color:var(--muted) !important;
  opacity:.35; cursor:not-allowed; box-shadow:none !important;
}
/* the year/decade grid is floated, so its row needs to clear itself or the footer overlaps it */
.datepicker.datepicker-dropdown .datepicker-months td:after,
.datepicker.datepicker-dropdown .datepicker-years td:after,
.datepicker.datepicker-dropdown .datepicker-decades td:after,
.datepicker.datepicker-dropdown .datepicker-centuries td:after{ content:""; display:block; clear:both; }
/* footer (Clear / Today buttons, shown via clearBtn:true / todayHighlight) */
.datepicker.datepicker-dropdown tfoot th{ background:var(--surface); color:var(--brand); font-weight:600; font-size:12px; padding:6px 0; cursor:pointer; }
.datepicker.datepicker-dropdown tfoot th:hover{ background:var(--brand-light); }

/* ============================================================
   .rt-filterrow - COMMON second header row for grid-page filters
   ------------------------------------------------------------
   The standard grid header is two rows: row 1 = title + actions
   (.frr-toolbar), row 2 = the filter fields. This is that second
   row. It used to be re-declared per page (.ri-filters,
   .cv-filters, .aiq-filters) with identical values; those names
   are kept as aliases so existing markup keeps working, but NEW
   pages should use `.rt-filterrow` only.
   ============================================================ */
.refund-theme .rt-filterrow,
.refund-theme .ri-filters,
.refund-theme .cv-filters{
  display:flex; align-items:flex-end; gap:14px; flex-wrap:wrap; padding:0 16px 14px;
}
.refund-theme .rt-filterrow .frr-fld,
.refund-theme .ri-filters .frr-fld,
.refund-theme .cv-filters .frr-fld{ min-width:0; flex:0 0 auto; }
/* when the filter row is the last thing in the header it must not double up on .box-header's own
   bottom padding */
.refund-theme .rt-filterrow:last-child,
.refund-theme .cv-filters:last-child{ padding-bottom:0; }

/* ============================================================
   ACTIVE FILTERS BAR (post-search chip row) - all colours = tokens
   ============================================================ */
.refund-theme .critbar{ display:flex; align-items:center; gap:9px; flex-wrap:wrap; margin:12px 16px 12px; padding:9px 14px;
  background:linear-gradient(180deg,var(--surface-2),var(--brand-light)); border:1px solid var(--crit-border);
  border-left:3px solid var(--brand); border-radius:9px; box-shadow:var(--shadow); }
/* Inside .box-header (where every grid page puts it) the toolbar/filter row above has already paid the
   top gap, so the bar only needs the horizontal inset + its own bottom gap. This was re-declared per
   page three times over; it is COMMON. */
.refund-theme .box-header .critbar{ margin:0 16px 12px; }
.refund-theme .critbar > *{ align-self:center !important; margin-top:0 !important; margin-bottom:0 !important; }
.refund-theme .critbar .lead{ display:flex; align-items:center; gap:7px; font-weight:700; color:var(--brand-dark); font-size:12px; line-height:1.2; }
.refund-theme .critbar .lead .ic{ width:22px; height:22px; border-radius:50%; background:var(--brand); color:var(--on-brand);
  display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto; box-shadow:0 1px 2px rgba(16,42,74,.25); }
.refund-theme .critbar .lead .ic svg{ display:block; }
.refund-theme .critbar .chip{ display:inline-flex; align-items:center; gap:7px; background:var(--surface);
  border:1px solid var(--brand-hover-border); border-radius:16px; padding:4px 5px 4px 11px; font-size:12px; color:var(--ink); }
.refund-theme .critbar .chip .k{ color:var(--muted); font-weight:700; font-size:9.5px; text-transform:uppercase; letter-spacing:.4px; }
.refund-theme .critbar .chip b{ color:var(--brand-dark); font-weight:500; }
.refund-theme .critbar .chip .rm{ width:17px; height:17px; border-radius:50%; background:var(--locked-bg); color:var(--muted);
  display:inline-flex; align-items:center; justify-content:center; cursor:pointer; font-size:10px; border:none; line-height:1; padding:0; }
.refund-theme .critbar .chip .rm:hover{ background:var(--no); color:var(--on-brand); }
.refund-theme .critbar .spacer{ flex:1 1 auto; min-width:8px; }
.refund-theme .critbar .cnt{ display:inline-flex; align-items:center; font-size:11px; color:var(--muted); font-weight:700;
  background:var(--surface); border:1px solid var(--line); border-radius:12px; padding:3px 10px; }
.refund-theme .critbar .lnk{ display:inline-flex; align-items:center; gap:4px; font-size:12px; color:var(--brand); font-weight:600;
  cursor:pointer; padding:3px 6px; border-radius:5px; }
.refund-theme .critbar .lnk:hover{ background:var(--surface); }
.refund-theme .critbar .clr{ color:var(--no); }

/* =====================================================================
   APPROVE REQUEST  (Workflow > Approve Request, ../ApproveRequest)
   ---------------------------------------------------------------------
   Components that did not exist yet: the workflow tab strip, the bucket
   filter bar, and the expandable approval-history cell. Everything else on
   that screen reuses what is already here (.frr-toolbar, .attendance-table,
   .frr-status + .st-*, .PaginationSec).

   Prefixed .apv- so a future rename of the refund grid cannot silently
   restyle the inbox, and vice versa. No hardcoded colours - tokens only,
   so the accent presets (.theme-blue/green/red/orange/purple) recolour
   this screen for free.
   ===================================================================== */

/* --- tab strip: one tab per workflow --- */
.refund-theme .apv-tabs{ list-style:none; margin:0 0 0 0; padding:0; display:flex; gap:2px;
  border-bottom:1px solid var(--line); }
.refund-theme .apv-tabs li{ margin:0; }
.refund-theme .apv-tabs li a{ display:inline-flex; align-items:center; gap:7px; padding:9px 16px;
  font-size:12.5px; font-weight:600; color:var(--muted); text-decoration:none;
  border:1px solid transparent; border-bottom:none; border-radius:7px 7px 0 0; position:relative; top:1px; }
.refund-theme .apv-tabs li a:hover{ color:var(--brand-dark); background:var(--row-hover-soft); }
.refund-theme .apv-tabs li.apv-tab-on a{ color:var(--brand-dark); background:var(--surface);
  border-color:var(--line); border-bottom:1px solid var(--surface); }
.refund-theme .apv-tabs li.apv-tab-on a:after{ content:""; position:absolute; left:0; right:0; top:-1px;
  height:2px; background:var(--brand); border-radius:2px 2px 0 0; }
/* the count is the reason the tab exists - never let it look decorative */
.refund-theme .apv-tab-n{ display:inline-block; min-width:18px; padding:1px 6px; border-radius:10px;
  background:var(--pend-bg); color:var(--pend); font-size:10.5px; font-weight:700; line-height:1.6; text-align:center; }

/* --- bucket bar: Pending / Approved / Rejected / All --- */
.refund-theme .apv-bucketbar{ display:flex; gap:8px; flex-wrap:wrap; align-items:center;
  padding:11px 2px 12px; border-bottom:1px solid var(--line); margin-bottom:10px; }
.refund-theme .apv-bucket{ display:inline-flex; align-items:center; gap:7px; padding:5px 13px;
  font-size:12px; font-weight:600; color:var(--muted); background:var(--surface);
  border:1px solid var(--line); border-radius:16px; cursor:pointer; transition:all .12s ease; }
.refund-theme .apv-bucket:hover{ border-color:var(--brand-hover-border); color:var(--brand-dark); }
.refund-theme .apv-bucket-on{ background:var(--brand-light); border-color:var(--brand); color:var(--brand-dark); }
.refund-theme .apv-bucket-n{ display:inline-block; min-width:17px; padding:0 5px; border-radius:9px;
  background:var(--locked-bg); color:var(--ink); font-size:10.5px; font-weight:700; line-height:1.7; text-align:center; }
.refund-theme .apv-bucket-on .apv-bucket-n{ background:var(--surface); color:var(--brand-dark); }

/* --- expand caret + detail cell --- */
.refund-theme .apv-caret{ color:var(--grip); text-decoration:none; }
.refund-theme .apv-caret:hover{ color:var(--brand); }
.refund-theme .apv-detailcell{ background:var(--surface-2) !important; padding:10px 14px !important; }
.refund-theme .apv-detail{ margin-bottom:10px; }
.refund-theme .apv-detail:last-child{ margin-bottom:0; }
.refund-theme .apv-detail-head{ font-size:11px; font-weight:700; letter-spacing:.4px; text-transform:uppercase;
  color:var(--muted); margin-bottom:5px; }
.refund-theme .apv-detail-body{ font-size:12.5px; color:var(--ink); }
/* the approver's own row in the trail - "(you)" is easy to miss in a list of names */
.refund-theme .apv-row-me td{ background:var(--brand-light) !important; }

/* old -> new value cells can be long free text; do not let one blow the grid open */
.refund-theme .apv-val{ max-width:220px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* "View" on a Student Document row - opens the shared #documentModal preview. A link, not a button:
   it sits inside a data cell and must not add a control-sized row height to every document row. */
.refund-theme .apv-doclink{ color:var(--brand-dark); font-weight:600; cursor:pointer; white-space:nowrap; }
.refund-theme .apv-doclink:hover{ text-decoration:underline; }
.refund-theme .apv-doclink .fa{ margin-right:5px; color:var(--brand); }

/* --- notes / required marker --- */
.refund-theme .apv-note{ font-size:11.5px; color:var(--muted); }
.refund-theme .apv-req{ color:var(--no); font-weight:700; }

/* --- nothing to approve --- */
.refund-theme .apv-blank{ text-align:center; color:var(--muted); padding:44px 10px; font-size:13px; }
.refund-theme .apv-blank i{ font-size:34px; opacity:.35; display:block; margin-bottom:12px; }
.refund-theme .apv-blank small{ display:block; margin-top:6px; font-size:11.5px; }

/* --- Approve / Reject / Bulk dialogs ---------------------------------
   These are Bootstrap modals declared INSIDE the .refund-theme root (see the view). $ngConfirm was
   dropped because it appends to <body>, outside this scope, so no token here could ever reach it.
   They reuse .frr-detailpop for the brand header. */

/* the danger header for Reject - semantic, so it does NOT follow the accent preset */
.refund-theme .frr-detailpop .modal-header.apv-head-danger{ background:var(--no) !important;
  border-bottom:1px solid var(--no-border) !important; }

/* fact strip: what am I about to approve? */
.refund-theme .apv-sum{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:1px;
  background:var(--line); border:1px solid var(--line); border-radius:6px; overflow:hidden; margin-bottom:14px; }
.refund-theme .apv-sum-item{ background:var(--surface-2); padding:8px 11px; display:flex; flex-direction:column; gap:2px; min-width:0; }
.refund-theme .apv-sum-k{ font-size:10px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; color:var(--muted); }
.refund-theme .apv-sum-v{ font-size:12.5px; font-weight:600; color:var(--ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* inline advisory line ("this is not the final level", "cannot be undone") */
.refund-theme .apv-modal-note{ display:flex; align-items:flex-start; gap:7px; margin:0 0 12px;
  padding:8px 11px; border-radius:6px; background:var(--brand-light); border:1px solid var(--crit-border);
  font-size:11.5px; line-height:1.5; color:var(--ink); }
.refund-theme .apv-modal-note i{ margin-top:1px; color:var(--brand-dark); }
.refund-theme .apv-modal-warn{ background:var(--no-bg); border-color:var(--no-border); }
.refund-theme .apv-modal-warn i{ color:var(--no); }

.refund-theme .frr-detailpop .modal-body label{ display:block; margin-bottom:5px; font-size:12px;
  font-weight:600; color:var(--ink); text-transform:none !important; }
.refund-theme .frr-detailpop .modal-body textarea.form-control{ font-size:12.5px; border:1px solid var(--line);
  border-radius:5px; box-shadow:none; color:var(--ink); resize:vertical; }
.refund-theme .frr-detailpop .modal-body textarea.form-control:focus{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }

/* footer: primary action on the RIGHT, where the eye finishes */
.refund-theme .frr-detailpop .modal-footer{ display:flex; justify-content:flex-end; gap:8px;
  padding:12px 18px !important; border-top:1px solid var(--line); background:var(--head-tint); border-radius:0 0 7px 7px; }
.refund-theme .frr-detailpop .modal-footer .btn-custom,
.refund-theme .frr-detailpop .modal-footer .btn{ min-width:104px; }
.refund-theme .frr-detailpop .modal-footer .btn-custom[disabled],
.refund-theme .frr-detailpop .modal-footer .btn[disabled]{ opacity:.55; cursor:not-allowed; }

/* --- Upcoming bucket: "assigned to me, not my turn yet" --------------------
   Read-only by construction (no checkbox, no Approve/Reject). The waiting line tells the approver WHO
   holds it, because "Pending Approval" on its own tells them nothing they did not already know. */
.refund-theme .apv-waiting{ display:inline-flex; align-items:center; gap:5px; margin-top:3px;
  font-size:11px; color:var(--muted); white-space:nowrap; }
.refund-theme .apv-waiting i{ color:var(--warn); }

/* --- approval trail rows: three states, visually distinct -------------------
   Reporting "acted", "holding it now" and "not their turn yet" all as one grey PENDING row is what
   made the old trail useless to a level-10 approver. */
.refund-theme .apv-row-now td{ background:var(--pend-bg) !important; }      /* holds it right now */
.refund-theme .apv-row-future td{ opacity:.62; }                            /* still to come */
.refund-theme .apv-row-me td{ box-shadow:inset 3px 0 0 var(--brand); }      /* this row is you */

/* --- "Decided by others" bucket -------------------------------------------
   A CLOSE row: somebody else approved or rejected this request, so nothing is left to do. The line
   names the outcome and the person, because "Closed" on its own answers neither question the
   approver actually has. Semantic colours - approved green, rejected red - not the accent. */
.refund-theme .apv-decided{ display:inline-flex; align-items:center; gap:5px; margin-top:3px;
  font-size:11px; color:var(--muted); white-space:nowrap; }
.refund-theme .apv-decided .fa-check-circle{ color:var(--ok); }
.refund-theme .apv-decided .fa-times-circle{ color:var(--no); }

/* --- Approve Request: match the Fees Refund Request toolbar rhythm -----------
   The inbox stacks toolbar -> tabs -> bucket bar -> grid, where the refund grid goes
   toolbar -> grid. Three stacked blocks each carrying their own padding added up to a visible gap
   under the quick-search row.

   Scoped to .apv-inbox. The generic .box-header / .box-body paddings (lines ~105-112) are shared by
   EVERY Refund screen - retuning them there would silently reflow four other pages. */
.refund-theme .apv-inbox .box-header{ padding-bottom:0 !important; }   /* .frr-toolbar already pads 12px */
.refund-theme .apv-inbox .box-body{ padding:10px 16px 16px !important; }
.refund-theme .apv-inbox .apv-tabs{ margin-top:0; }
.refund-theme .apv-inbox .apv-bucketbar{ padding:9px 2px 10px; margin-bottom:8px; }
/* the advisory notes (Upcoming / Closed / view-only) sit between bucket bar and grid */
.refund-theme .apv-inbox .apv-modal-note{ margin-bottom:10px; }

/* --- money cell in the landing grid ---------------------------------------
   The rupee symbol is a VIEW concern. It never enters the data, the SP alias, or the edusis
   ColumnName - BaseController.StyleExportTable detects money columns by header name and converts the
   cells to real numbers; a symbol in the data would turn them into strings and Excel could no longer
   sum them. Header stays "Refund Requested" (contains "refund", so detection still fires). */
.refund-theme .frr-money{ white-space:nowrap; font-variant-numeric:tabular-nums; }

/* =====================================================================
   EMAIL CREDIT (super admin) — page-scoped under .emailcredit-page.
   Tokens only; cannot leak to other pages. Matches Refund card rhythm.
   ===================================================================== */
/* header double-padding fix: .box-header pads 12px bottom AND .frr-toolbar pads 12px bottom
   -> collapse the header's bottom pad so there isn't a big empty band under the Credit Email button
   (same fix the ApproveRequest .apv-inbox uses). */
.refund-theme.emailcredit-page .box-header{ padding-bottom:0 !important; }

/* School dropdown = select2, themed exactly like the Fee SMS single-select box + panel */
.refund-theme.emailcredit-page .select2-container{ width:100% !important; }
.refund-theme.emailcredit-page .select2-container--default .select2-selection--single{ height:36px; border:1px solid var(--line); border-radius:5px; background:var(--surface); }
.refund-theme.emailcredit-page .select2-container--default .select2-selection--single .select2-selection__rendered{ line-height:34px; padding-left:10px; color:var(--ink); font-size:13px; }
.refund-theme.emailcredit-page .select2-container--default .select2-selection--single .select2-selection__placeholder{ color:var(--muted); }
.refund-theme.emailcredit-page .select2-container--default .select2-selection--single .select2-selection__arrow{ height:34px; }
.refund-theme.emailcredit-page .select2-container--default.select2-container--focus .select2-selection--single,
.refund-theme.emailcredit-page .select2-container--open .select2-selection--single{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
/* the results panel is appended to <body>; theme it globally under .refund-theme like Fee SMS does */
.refund-theme .select2-dropdown{ border:1px solid var(--line); border-radius:6px; box-shadow:var(--shadow); overflow:hidden; }
/* option rows: compact, rounded, inset - the same list treatment CollectFees uses, instead of select2's
   tall full-bleed rows which made the open panel look oversized next to the 36px box. */
.refund-theme .select2-results{ padding:4px; }
.refund-theme .select2-results__option{ font-size:12.5px; color:var(--ink); padding:6px 10px; border-radius:5px; }
.refund-theme .select2-container--default .select2-results__option--highlighted[aria-selected]{ background:var(--brand); color:var(--on-brand); }
.refund-theme .select2-container--default .select2-results__option[aria-selected=true]{ background:var(--brand-light); color:var(--brand-dark); }
.refund-theme .select2-search--dropdown .select2-search__field{ border:1px solid var(--line); border-radius:5px; }
.refund-theme .select2-search--dropdown .select2-search__field:focus{ border-color:var(--brand); outline:0; }

/* ---- MULTI-SELECT PANEL = CHECKBOX LIST (matches the reference Status dropdown) ----
   select2 sets aria-multiselectable="true" on the results <ul> of a multiple select, which is the only
   marker distinguishing a multi panel from a single one (the panel itself is appended to the theme root
   and carries no --multiple class). Everything below is scoped to that attribute, so single-select
   dropdowns keep their normal appearance.

   Already-picked options must stay VISIBLE and ticked here rather than disappearing from the list -
   that is the whole point of a checkbox list - hence `display:block !important`, and the selected row
   keeps a plain background with only its box filled, instead of select2's solid highlight. */
.refund-theme .select2-results__options[aria-multiselectable="true"] .select2-results__option{
  display:block !important; position:relative; padding:7px 10px 7px 32px;
}
.refund-theme .select2-results__options[aria-multiselectable="true"] .select2-results__option::before{
  content:""; position:absolute; left:10px; top:50%; transform:translateY(-50%);
  width:15px; height:15px; box-sizing:border-box;
  border:1px solid var(--line); border-radius:3px; background:var(--surface);
}
.refund-theme .select2-container--default .select2-results__options[aria-multiselectable="true"] .select2-results__option[aria-selected=true]{
  background:transparent !important; color:var(--ink) !important;
}
.refund-theme .select2-results__options[aria-multiselectable="true"] .select2-results__option[aria-selected=true]::before{
  background:var(--brand); border-color:var(--brand);
}
/* the tick itself */
.refund-theme .select2-results__options[aria-multiselectable="true"] .select2-results__option[aria-selected=true]::after{
  content:""; position:absolute; left:15px; top:50%;
  width:4px; height:8px; box-sizing:border-box;
  border:solid var(--on-brand); border-width:0 2px 2px 0;
  transform:translateY(-60%) rotate(45deg);
}
/* hover/keyboard row: a light tint, not the solid brand fill a single-select uses - the filled
   checkbox is what signals "selected" in this list, so a strong row colour would compete with it */
.refund-theme .select2-container--default .select2-results__options[aria-multiselectable="true"] .select2-results__option--highlighted[aria-selected]{
  background:var(--row-hover) !important; color:var(--ink) !important;
}
.refund-theme.emailcredit-page .box-title{ color:var(--brand-dark); font-weight:600; }
.refund-theme.emailcredit-page .box-title .fa{ color:var(--brand); }

/* current-balance stat card */
.refund-theme.emailcredit-page .ec-balance-card{
    display:flex; align-items:baseline; gap:8px;
    min-height:38px; padding:6px 14px; border-radius:6px;
    background:var(--brand); color:var(--on-brand); border:1px solid var(--brand-dark);
}
.refund-theme.emailcredit-page .ec-balance-card.ec-balance-empty{
    background:var(--btn-disabled-bg); color:var(--muted-2); border:1px dashed var(--dash);
}
.refund-theme.emailcredit-page .ec-balance-value{ font-size:24px; font-weight:700; line-height:1; }
.refund-theme.emailcredit-page .ec-balance-unit{ font-size:12px; opacity:.9; }
.refund-theme.emailcredit-page .ec-balance-hint{ font-size:13px; }

/* computed amount box */
.refund-theme.emailcredit-page .ec-amount{ background:var(--btn-disabled-bg); font-weight:700; color:var(--brand-dark); }

/* grids reuse the LOCKED .attendance-table look (gradient header, uppercase, striped body).
   Only the sort-link colour needs forcing white on the gradient header. */
.refund-theme.emailcredit-page .attendance-table thead th .colorA{ color:var(--on-brand); }
.refund-theme.emailcredit-page .attendance-table td{ white-space:nowrap !important; }
.refund-theme.emailcredit-page .ec-nowrap{ white-space:nowrap !important; }
.refund-theme.emailcredit-page .ec-empty{ padding:18px; text-align:center; color:var(--muted-2); }


/* ---- Email Event Configuration: EDITOR PAGE (/EmailEventConfig?id=N) ----
   The editor left the modal because a template is a document: settings on the left, the template given
   the width. On a narrow screen it stacks - the settings are short, the template is the work. */
.refund-theme.emailcredit-page.eec-edit .eec-edit-grid{
    display:flex; align-items:flex-start; gap:18px;
}
.refund-theme.emailcredit-page.eec-edit .eec-edit-side{ flex:0 0 320px; width:320px; }
.refund-theme.emailcredit-page.eec-edit .eec-edit-main{ flex:1 1 auto; min-width:0; }  /* min-width:0 or a wide editor stretches the flex row */
.refund-theme.emailcredit-page.eec-edit .form-group{ margin-bottom:14px; }
.refund-theme.emailcredit-page.eec-edit label{
    display:block; margin-bottom:5px; text-transform:none; letter-spacing:0;
    font-size:12.5px; font-weight:600; color:var(--ink);
}
.refund-theme.emailcredit-page.eec-edit .box-footer{
    position:sticky; bottom:0; background:var(--surface); border-top:1px solid var(--line);
    z-index:2;   /* Save stays reachable without scrolling to the bottom of a long template */
}
.refund-theme.emailcredit-page.eec-edit .frr-back-btn{ margin-right:8px; }

/* ---- FROM (SENDER): THE ADDRESS RAN UNDER THE × AND THE CARET ----
   Reported as the email id overlapping the cross. Measured on this page: the control is 320px,
   the text span inside it is 318px with only 10px of right padding, and BOTH the clear (×,
   absolutely positioned) and the 12px arrow sit at that right edge. So a value like
   "DESA - devang.rana@microwebsolutions.co.in" simply runs underneath them - select2's default
   padding assumes a short label and leaves no room for its own two controls.

   The side column is a fixed 320px (.eec-edit-side above) and a verified sender is
   "PROFILE - full@address", so this is the normal case here, not an edge case.

   THE THEME ALREADY DEFINES THE CONTRACT - this follows it rather than fighting it. The base rule
   (~line 396) deliberately sets no right padding and says so: "Any field that needs to reserve room
   on the right sets its own padding-right", because a global padding clipped short values in narrow
   boxes like the pagination "Show entries" select. The clear is already placed and centred at
   right:28px and the caret at right:10px, so only the padding belongs here.

   50px = caret (10..22) + clear with its 8px pad and separator (28..46) + a little air.

   DO NOT reposition the clear from here. An earlier attempt moved it to right:26px/top:0 and it
   jumped ABOVE the box - the theme centres it with top:50%/translateY(-50%), and overriding top
   without the transform breaks that.

   `white-space` and `text-overflow` need !important. Without it the computed value stayed
   `normal`, the value WRAPPED inside a fixed 28px line box, and the field showed only "DESA -" -
   worse than the overlap it was meant to fix. Three stylesheets target this span (select2's own,
   NewFormCSS and SISCustom), which is why the base rule forces its own properties too. */
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--single .select2-selection__rendered{
  padding-right:50px !important;
  white-space:nowrap !important;
  overflow:hidden !important;
  text-overflow:ellipsis !important;
}

/* ---- THE SENDER IS STACKED: PROFILE NAME ABOVE, ADDRESS BELOW ----
   Reported: with a long profile name only the name showed and the address was gone. The ellipsis
   above cuts the END of the string, and the end is the ADDRESS - the wrong half to lose, since the
   whole point of the field is which address the mail leaves from.

   ONE LINE CANNOT WORK HERE, measured rather than assumed: the column is a fixed 320px, minus 50px
   reserved for the × and caret, leaving 270px - and the address alone renders at 251px. Sharing that
   19px remainder between two parts collapsed the name to 7px, i.e. a bare ellipsis. Shrinking either
   half is choosing which information to destroy.

   So both are shown, on two lines. templateSelection (EmailEventConfigEdit.js) emits the name and
   the address as separate spans and these rules stack them: the name small and muted as a label, the
   address as the value. Nothing is truncated in the normal case, and the control grows to fit rather
   than clipping - which is also what the reporter described as "it goes below".

   The height overrides are needed because the shared rule pins this span to a 28px line box (~line
   404) to centre a single-line value; a two-line value needs it released. The × and caret are
   anchored with top:50%/translateY(-50%), so they re-centre on the taller box by themselves. */
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--single{
  height:auto !important; min-height:34px;
}
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--single .select2-selection__rendered{
  height:auto !important; line-height:1.35 !important; margin-top:0 !important;
  padding-top:5px; padding-bottom:5px;
  white-space:normal !important;   /* the two spans are blocks; nowrap here would fight them */
  text-overflow:clip !important;   /* each span does its own ellipsis */
}
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .eec-from-sel{ display:block; min-width:0; }

/*  Both still ellipsise: a pathological name or address should trail off rather than widen the
    column and drag the layout with it. */
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .eec-from-name{
  display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  font-size:11px; color:var(--muted);
}
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .eec-from-mail{
  display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  font-size:12.5px; color:var(--ink); font-weight:600;
}

/* ---- CC: A LONG PROFILE NAME BROKE THE LAYOUT ----
   CC is a MULTI select (#eecCc), so each choice is a chip inside a 320px column. A chip is
   sized by its content and does not wrap, so one long "Profile Name - long@address" chip pushed
   the control wider than the column and dragged the layout with it.

   Two rules: the chip list wraps onto as many lines as it needs, and any single chip is capped
   at the column width with an ellipsis. Capping alone would not help - without wrap, three short
   chips still overflow sideways. */
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--multiple{
  min-height:34px; height:auto;
}
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--multiple .select2-selection__rendered{
  display:flex; flex-wrap:wrap; gap:4px; padding:4px 6px; margin:0; width:100%; box-sizing:border-box;
}
/*  max-width leaves room for the CLEAR-ALL ×, which in multiple mode select2 renders as the first
    child INSIDE this same rendered box. At 100% the chip filled the row and flex-wrap pushed that
    × onto a line of its own above the chip - a stray floating cross, which is not what a
    "clear all" should look like. Capping the chip keeps both on one line. */
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--multiple .select2-selection__choice{
  max-width:calc(100% - 24px); margin:0;          /* gap above handles spacing */
  display:inline-flex; align-items:center;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/*  the clear-all rides on the chip row rather than stretching the flex line */
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--multiple .select2-selection__clear{
  flex:0 0 auto; align-self:center; margin:0 2px 0 0; padding:0;
  position:static; transform:none; border:0; background:none;
  font-size:14px; font-weight:700; color:var(--muted); line-height:1;
}
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--multiple .select2-selection__clear:hover{
  color:var(--no);
}
/*  The chip's own remove (x) must not be squeezed out by a long label - it is the only way to
    take a recipient off, and flex would otherwise shrink it to nothing. */
.refund-theme.emailcredit-page.eec-edit .eec-edit-side .select2-container--default .select2-selection--multiple .select2-selection__choice__remove{
  flex:0 0 auto; margin-right:4px;
}

/* ---- Subject: token highlight behind a transparent input ----
   An <input> cannot hold markup, so the yellow cannot live inside it. #eecSubjHl paints the tokens
   behind, the input paints the characters on top.
   EVERY metric below is pinned on BOTH layers - font, size, weight, letter-spacing, padding, border
   width, line-height. Inherit any one of them and the two layers measure text differently: the yellow
   blocks drift a pixel per character and end up under the wrong words. That is the whole difficulty of
   this technique, and the reason the values are duplicated rather than left to cascade. */
.refund-theme.emailcredit-page.eec-edit .eec-subj{ position:relative; }

.refund-theme.emailcredit-page.eec-edit .eec-subj-hl,
.refund-theme.emailcredit-page.eec-edit .eec-subj-in{
    font-family:'Segoe UI', Roboto, Arial, sans-serif;
    font-size:13px;
    font-weight:400;
    letter-spacing:normal;
    line-height:34px;
    height:36px;
    padding:0 10px;
    border:1px solid transparent;   /* the input re-declares the visible colour below */
    border-radius:5px;
    box-sizing:border-box;
    white-space:pre;                /* no wrapping: an input never wraps, so the backdrop must not either */
}
.refund-theme.emailcredit-page.eec-edit .eec-subj-hl{
    position:absolute; top:0; left:0; right:0;
    overflow:hidden;
    color:transparent;              /* the backdrop contributes background only; the input shows the text */
    background:var(--surface);
    pointer-events:none;            /* clicks belong to the input underneath */
    z-index:0;
}
.refund-theme.emailcredit-page.eec-edit .eec-subj-in{
    position:relative; z-index:1;
    background:transparent !important;   /* or it would hide the highlight */
    border-color:var(--line);
    width:100%;
}
.refund-theme.emailcredit-page.eec-edit .eec-subj-in:focus{
    border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); outline:0;
}
/* the token block itself: same yellow as the editor (EmailEditorContent.css), transparent text so it
   only ever paints a background - the characters come from the input above */
.refund-theme.emailcredit-page.eec-edit .eec-subj-hl .mw-token{
    background:var(--token-hl); border-radius:3px; color:transparent;
    box-shadow:0 0 0 1px var(--token-hl-line);   /* a border would add width and shift everything after it */
}

/* ---- Available fields: a sidebar panel, not a strip above the editor ----
   In the main column it had ~44px and clipped its own second row, which read as broken. Here it has a
   whole column: every field visible, no clipping, and the editor keeps its full width. */
.refund-theme.emailcredit-page.eec-edit .eec-fields{
    border:1px solid var(--line); border-radius:6px; background:var(--surface-2); padding:10px 12px;
}
.refund-theme.emailcredit-page.eec-edit .eec-fields label{ margin-bottom:8px !important; }
.refund-theme.emailcredit-page.eec-edit .eec-fields .eec-insert{ display:block; margin-bottom:8px; }
.refund-theme.emailcredit-page.eec-edit .eec-fields .eec-insert .select2-container{ width:100% !important; flex:none; }
.refund-theme.emailcredit-page.eec-edit .eec-fields .eec-tokens-chips{
    max-height:none;      /* the sidebar is tall; capping here is what clipped rows in the old spot */
    overflow:visible;
    margin-bottom:6px;
}
.refund-theme.emailcredit-page.eec-edit .eec-fields .eec-token{ margin:0 5px 5px 0; }
@media (max-width: 1200px) {
    .refund-theme.emailcredit-page.eec-edit .eec-edit-grid{ display:block; }
    .refund-theme.emailcredit-page.eec-edit .eec-edit-side{ width:100%; margin-bottom:14px; }
}

/* ---- Email Event Configuration: editor modal (list page only - kept for the toggle confirm) ----
   The modal inherits .box-body{padding:16px} and Bootstrap's .form-group, but the labels here are
   uppercase/bold from the grid styles and the textarea had no width, which is why the Message field
   rendered as a stray 200px box beside its label. Pin the field widths and give the modal room. */
.refund-theme.emailcredit-page #ppEmailEvent .modal-dialog{ width:900px; max-width:96%; margin:24px auto; }
/* NO inner scrollbar. An earlier revision put max-height + overflow-y:auto on .box-body, which gave a
   scrollbar INSIDE a modal that Bootstrap already scrolls with the page - two bars, neither obviously
   in charge, and the Save button stranded below the fold. Let the modal be as tall as its content and
   let the page scroll it: one scrollbar, the one the user already understands. */
.refund-theme.emailcredit-page #ppEmailEvent .box-body{ max-height:none; overflow:visible; }
.refund-theme.emailcredit-page #ppEmailEvent .form-group{ display:block; margin-bottom:14px; }
.refund-theme.emailcredit-page #ppEmailEvent label{
    display:block; width:100%; margin-bottom:5px; text-transform:none; letter-spacing:0;
    font-size:12.5px; font-weight:600; color:var(--ink);
}
.refund-theme.emailcredit-page #ppEmailEvent .form-control{ width:100%; }
.refund-theme.emailcredit-page #ppEmailEvent textarea{ width:100% !important; }
/* CKEditor builds its own chrome; let it fill the field rather than sit at its default width */
.refund-theme.emailcredit-page .eec-editor .cke,
.refund-theme.emailcredit-page .eec-editor .cke_chrome{ width:100% !important; border-radius:5px; }
.refund-theme.emailcredit-page #ppEmailEvent .checkbox label{ font-weight:400; }

/* ---- CC: select2 MULTI ----
   Was multiple-select, which rendered as an oversized empty box. select2 is what this app already uses
   for the same shape of control (the Email Credit school dropdown), so the page-level .select2-* rules
   above already theme it; these only add what MULTI needs - the single-select rules assume one line.
   Each CC shows as a removable tag, and the control grows instead of hiding what is selected. */
.refund-theme.emailcredit-page .select2-container{ width:100% !important; }
.refund-theme.emailcredit-page .select2-container--default .select2-selection--multiple{
    min-height:36px; border:1px solid var(--line) !important; border-radius:5px; background:var(--surface);
    padding:2px 4px;
}
.refund-theme.emailcredit-page .select2-container--focus .select2-selection--multiple,
.refund-theme.emailcredit-page .select2-container--open .select2-selection--multiple{
    border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light);
}
/* the tags */
.refund-theme.emailcredit-page .select2-selection__choice{
    background:var(--brand-light) !important; border:1px solid var(--brand-hover-border) !important;
    color:var(--brand-dark) !important; border-radius:12px; padding:1px 8px; margin:3px 4px 3px 0;
    font-size:12px; line-height:1.6;
}
.refund-theme.emailcredit-page .select2-selection__choice__remove{
    color:var(--brand-dark) !important; margin-right:5px; font-weight:700;
}
.refund-theme.emailcredit-page .select2-selection__choice__remove:hover{ color:var(--no) !important; }
.refund-theme.emailcredit-page .select2-search--inline .select2-search__field{ margin-top:6px; font-size:13px; }
.refund-theme.emailcredit-page .select2-selection__placeholder{ color:var(--muted) !important; line-height:30px; }

/* CC with nothing to offer (verified profiles minus the sender = none): look inert rather than
   look enabled and do nothing when clicked. */
.refund-theme.emailcredit-page .select2-container--disabled .select2-selection--multiple{
    background:var(--surface-2) !important; cursor:not-allowed;
}
.refund-theme.emailcredit-page .select2-container--disabled .select2-selection__placeholder{ color:var(--muted) !important; }

/* ---- Enable switch ----
   ON/OFF is the single most consequential control on this screen: it decides whether the school starts
   emailing parents automatically. A checkbox in a form row does not carry that weight, and gives no
   room to say what OFF actually means (the template is kept). */
.refund-theme.emailcredit-page .eec-enable{
    display:flex; align-items:flex-start; gap:12px; margin-top:6px;
    padding:12px 14px; border:1px solid var(--line); border-radius:6px; background:var(--surface-2);
    transition:background .15s, border-color .15s;
}
.refund-theme.emailcredit-page .eec-enable.on{ background:var(--brand-ice); border-color:var(--brand-hover-border); }
.refund-theme.emailcredit-page .eec-switch{ position:relative; display:inline-block; width:44px; height:24px; margin:0; flex:0 0 44px; }
.refund-theme.emailcredit-page .eec-switch input{ opacity:0; width:0; height:0; position:absolute; }
.refund-theme.emailcredit-page .eec-slider{
    position:absolute; cursor:pointer; inset:0; background:var(--muted);
    border-radius:24px; transition:background .2s;
}
.refund-theme.emailcredit-page .eec-slider:before{
    content:""; position:absolute; height:18px; width:18px; left:3px; top:3px;
    background:var(--surface); border-radius:50%; transition:transform .2s; box-shadow:0 1px 3px rgba(0,0,0,.3);
}
.refund-theme.emailcredit-page .eec-switch input:checked + .eec-slider{ background:var(--ok); }
.refund-theme.emailcredit-page .eec-switch input:checked + .eec-slider:before{ transform:translateX(20px); }
.refund-theme.emailcredit-page .eec-switch input:focus + .eec-slider{ box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme.emailcredit-page .eec-enable-h{ font-weight:700; font-size:13px; color:var(--ink); }
.refund-theme.emailcredit-page .eec-enable.on .eec-enable-h{ color:var(--ok); }
.refund-theme.emailcredit-page .eec-enable-d{ font-size:12px; color:var(--muted); line-height:1.5; }
.refund-theme.emailcredit-page .eec-enable-w{ font-size:12px; color:var(--no); font-weight:600; margin-top:4px; }

/* ---- Preview: an email client, not a form. The header block mimics From/To/Subject so it is obvious
   this is the parent's view, and the frame shows the body exactly as sent. ---- */
.refund-theme.emailcredit-page #ppEecPreview .eec-pv-meta{
    border:1px solid var(--line); border-radius:6px 6px 0 0; border-bottom:none;
    background:var(--surface-2); padding:10px 14px; font-size:12.5px; color:var(--ink); line-height:1.8;
}
.refund-theme.emailcredit-page #ppEecPreview .eec-pv-l{
    display:inline-block; width:58px; color:var(--muted); font-size:11.5px; text-transform:uppercase; letter-spacing:.4px;
}
.refund-theme.emailcredit-page #ppEecPreview .eec-pv-frame{
    width:100%; height:440px; border:1px solid var(--line); border-radius:0 0 6px 6px;
    background:var(--btn-disabled-bg); display:block;
}

/* Category filter in the toolbar - sized to sit level with the quick-search box. */
.refund-theme.emailcredit-page .eec-modfilter{
    height:36px; min-width:180px; padding:0 10px; margin-right:10px;
    border:1px solid var(--line); border-radius:5px; background:var(--surface);
    color:var(--ink); font-size:13px; cursor:pointer; vertical-align:middle;
}
.refund-theme.emailcredit-page .eec-modfilter:focus{ outline:0; border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }

/* ---- Email Event Configuration ---- tokens only, no hardcoded colour. */
/* Module band ("Fees" / "Admission"): 11 events as a flat list is a wall; grouped, it is a menu. */
.refund-theme.emailcredit-page .eec-group td{
    background:var(--brand-ice) !important; color:var(--brand-dark) !important;
    font-weight:700 !important; font-size:12px !important; letter-spacing:.4px; text-transform:uppercase;
    padding:7px 12px !important; border-top:1px solid var(--line) !important;
}
.refund-theme.emailcredit-page .eec-group td .fa{ margin-right:6px; }
.refund-theme.emailcredit-page .eec-ev{ font-weight:600; color:var(--ink); }
.refund-theme.emailcredit-page .eec-ev-d{ font-size:11.5px; color:var(--muted); line-height:1.4; }
.refund-theme.emailcredit-page .eec-sub{ max-width:280px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.refund-theme.emailcredit-page .eec-bad{ color:var(--no); font-weight:600; }
/* ---- merge fields: a FIXED-HEIGHT tray + a dropdown, so the list cannot push the editor around ----
   A flat chip list grows with the token count: 9 fields already wrap to two rows, 20 would be a wall
   and the Message box would start below the fold. The tray scrolls at a fixed height instead, and the
   "Insert field..." dropdown on the label row handles any number in one line. */
/* The insert control lives inside the tray now, left-aligned and in normal flow. It is NOT floated
   right on the label row: flex + justify-content:space-between pushed it past the modal's right edge
   (the modal body is overflow:visible by design, so nothing clipped it) and it rendered outside the
   dialog. In-flow and left-aligned, it has nowhere to escape to. */
.refund-theme.emailcredit-page .eec-insert{ display:flex; align-items:center; gap:10px; margin-bottom:6px; }
.refund-theme.emailcredit-page .eec-insert .select2-container{ width:240px !important; flex:0 0 240px; }
.refund-theme.emailcredit-page .eec-insert .select2-selection__rendered{
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.refund-theme.emailcredit-page .eec-tokens-hint{ font-size:11.5px; color:var(--muted); }
.refund-theme.emailcredit-page .eec-tokens-chips{ max-height:44px; overflow-y:auto; }
/* ---- "Insert field" select2: THE SAME CONTROL AS THE FEE SMS CLASS/TEMPLATE DROPDOWN ----
   That page is the reference (Views/FeeSMS/FeeSMS.cshtml): 36px, white, 1px --line border, 5px radius,
   13px --ink text, and a --brand ring on focus. An earlier revision made this a blue "pill" (30px,
   --brand-light fill, bold --brand-dark text) - which looked like a button, not a dropdown, and matched
   nothing else in the app. Same control, same look, everywhere.
   The raw select is sized identically for the case where select2 fails to load. */
.refund-theme.emailcredit-page .eec-insert-sel{
    width:100%; height:36px; padding:0 10px; font-size:13px;
    border:1px solid var(--line); border-radius:5px; background:var(--surface); color:var(--ink);
    cursor:pointer;
}
.refund-theme.emailcredit-page .eec-insert-sel:focus{ outline:0; border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme.emailcredit-page .eec-insert .select2-container--default .select2-selection--single{
    height:36px; border:1px solid var(--line) !important; border-radius:5px; background:var(--surface) !important;
}
.refund-theme.emailcredit-page .eec-insert .select2-container--default .select2-selection--single .select2-selection__rendered{
    line-height:34px !important; padding-left:10px; color:var(--ink) !important; font-size:13px; font-weight:400;
}
.refund-theme.emailcredit-page .eec-insert .select2-container--default .select2-selection--single .select2-selection__placeholder{
    color:var(--muted) !important;
}
.refund-theme.emailcredit-page .eec-insert .select2-container--default .select2-selection--single .select2-selection__arrow{ height:34px !important; }
.refund-theme.emailcredit-page .eec-insert .select2-container--default.select2-container--focus .select2-selection--single,
.refund-theme.emailcredit-page .eec-insert .select2-container--open .select2-selection--single{
    border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light);
}
/* Monospace ONLY in this dropdown - a merge field is code, and ###ReceiptNo### is easier to scan in a
   fixed-width font. Tagged via select2's dropdownCssClass because the dropdown is appended to
   .refund-theme, NOT inside .eec-insert: a descendant rule could never reach it, and styling
   .select2-results__option unscoped (an earlier revision) would have hit every dropdown on the page. */
.refund-theme .eec-insert-drop .select2-results__option{ font-size:12.5px; font-family:Consolas,'Courier New',monospace; }

/* The tray itself must NOT scroll or clip: the select2 dropdown opens inside it, and an overflow:auto
   ancestor would cut the list off at the tray's edge. The CHIPS scroll instead (.eec-tokens-chips),
   which is what needed capping - the form height stops depending on how many fields an event has. */
.refund-theme.emailcredit-page .eec-tokens{
    padding:6px 8px 2px;
    margin:6px 0 0;
    border:1px solid var(--line); border-top-left-radius:5px; border-top-right-radius:5px;
    border-bottom:none; background:var(--surface-2);
}
/* Token chips: click to insert. Monospace because a merge field is code, not prose. */
.refund-theme.emailcredit-page .eec-token{
    display:inline-block; margin:0 6px 6px 0; padding:3px 9px; border-radius:12px;
    background:var(--brand-light); color:var(--brand-dark); border:1px solid var(--brand-hover-border);
    font-size:11.5px; font-family:Consolas,'Courier New',monospace; cursor:pointer; user-select:none;
    transition:background .15s, color .15s;
}
.refund-theme.emailcredit-page .eec-token:hover{ background:var(--brand); color:var(--on-brand); }
/* tray sits ON the editor: one control, not two stacked boxes */
.refund-theme.emailcredit-page .eec-tokens + .cke,
.refund-theme.emailcredit-page .eec-tokens + textarea{ border-top-left-radius:0 !important; border-top-right-radius:0 !important; }

/* Email Profile — email input is lowercase-only (cosmetic; the JS + server do the real normalising). */
.refund-theme.emailcredit-page .ep-lower{ text-transform:lowercase; }

/* Email Profile — verified tick + the grey "i" that reveals the verification timestamp. */
.refund-theme.emailcredit-page .ep-ok{ color:var(--ok); font-weight:600; vertical-align:middle; }
.refund-theme.emailcredit-page .ep-info{
    display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px; padding:0;
    margin-left:6px; border-radius:50%; border:1px solid var(--muted); background:transparent;
    color:var(--muted); font-size:10px; font-weight:700; font-style:italic; line-height:1;
    cursor:pointer; vertical-align:middle; transition:background .15s, color .15s, border-color .15s;
}
.refund-theme.emailcredit-page .ep-info:hover{ background:var(--muted); color:var(--surface); }

/* Email Profile — "Pending" state + its inline resend button. */
.refund-theme.emailcredit-page .ep-pending{ color:var(--pend); font-weight:600; margin-right:6px; vertical-align:middle; }

/* Resend confirm = non-destructive, so the confirm button is brand (not frr-cf-danger red). The HEADER
   is deliberately NOT styled here: it inherits `.refund-theme .modal-header{background:var(--brand)}`,
   the same shared rule the Fee SMS deactivate popup uses. An earlier version hardcoded a gradient here,
   which made this one popup a different blue from every other confirm in the app. */

/* Email Profile — "what happens when you click Add" note. Tokens only, no fallback hex (see above). */
.refund-theme.emailcredit-page .ep-note{
    background:var(--brand-ice); border:1px solid var(--line);
    border-left:3px solid var(--brand); border-radius:6px; padding:12px 14px; margin-top:4px;
}
.refund-theme.emailcredit-page .ep-note-t{
    font-size:13px; font-weight:600; color:var(--brand-dark); margin-bottom:6px;
}
.refund-theme.emailcredit-page .ep-note-t i{ margin-right:6px; }
.refund-theme.emailcredit-page .ep-note-l{
    margin:0 0 8px 0; padding-left:18px; color:var(--ink); font-size:12.5px; line-height:1.65;
}
.refund-theme.emailcredit-page .ep-note-l li{ margin-bottom:3px; }
.refund-theme.emailcredit-page .ep-note-f{
    color:var(--muted); font-size:12px; line-height:1.6;
}
.refund-theme.emailcredit-page .ep-note-warn{
    background:var(--pend-bg); border-left-color:var(--pend);
}
.refund-theme.emailcredit-page .ep-note-warn .ep-note-t{ color:var(--warn); }

/* All-transactions grid: School (col 1) takes the remaining width; other columns shrink to their
   content so a long school name gets the space and stays on one line without squeezing the numbers. */
.refund-theme.emailcredit-page .ec-alltxn th,
.refund-theme.emailcredit-page .ec-alltxn td{ white-space:nowrap; }
.refund-theme.emailcredit-page .ec-alltxn th:not(:first-child),
.refund-theme.emailcredit-page .ec-alltxn td:not(:first-child){ width:1%; }
.refund-theme.emailcredit-page .ec-alltxn th:first-child,
.refund-theme.emailcredit-page .ec-alltxn td:first-child{ width:auto; min-width:200px; }

/* operation pills */
.refund-theme.emailcredit-page .ec-pill{
    display:inline-block; padding:2px 10px; border-radius:11px; font-size:11px; font-weight:600;
}
.refund-theme.emailcredit-page .ec-pill-credit{ background:var(--ok-bg); color:var(--ok); }
.refund-theme.emailcredit-page .ec-pill-debit{ background:var(--no-bg); color:var(--no); }

/* Deduct toolbar button — warn accent so it reads differently from the blue Credit add-btn */
.refund-theme.emailcredit-page .btn-addnew.ec-deduct-btn{
    background:var(--no); border-color:var(--no);
}
.refund-theme.emailcredit-page .btn-addnew.ec-deduct-btn:hover{ filter:brightness(0.94); }

/* ==========================================================================
   SCHOOL EMAIL BALANCE  (.seb-*)  —  Configuration > Email Configuration
   Page-scoped wrapper class, exactly like .apv-* for Approve Request: this page
   stacks several cards, and their paddings would otherwise fight the shared
   .box-header / .box-body rhythm that every Refund screen inherits. Scoping the
   correction here means the shared rules are never retuned.
   COLOURS: tokens only. No hardcoded values. Verified against the token list
   actually defined at the top of this file — --brand-soft/--warn-soft/--border
   etc. do NOT exist and must not be reintroduced.
   ========================================================================== */
.refund-theme.seb-page .box { margin-bottom: 14px; }

/* ---- SPACING: match the Fees Refund Request rhythm ----
   This page stacks five cards, each with its own .box-header > .frr-toolbar. The shared rules are
   .box-header{padding:12px 0} + .frr-toolbar{padding:2px 16px 12px} + .box-body{padding:16px}, which are
   tuned for ONE header above ONE grid. Stacked, the header's bottom padding and the body's top padding
   add up and every card opens a gap under its title — the "more space below the header" Devang flagged.

   Corrected ONLY under .seb-page. The shared .box-header/.frr-toolbar/.box-body rules are NOT touched:
   every Refund screen inherits them, and retuning them here would move Refund, Approve Request and
   Email Event Config at the same time. (CLAUDE.md says this explicitly.) */
/* THE DOUBLE PADDING, and why the first attempt did nothing:
   the shared rules are `.refund-theme .box-header{ padding:12px 0 !important }` and
   `.box-body{ padding:16px !important }`. v1 of this block overrode them WITHOUT !important and was
   therefore ignored outright — !important beats specificity, so a "more specific" selector loses.
   .apv-inbox (line ~892) and .emailcredit-page (line ~913) already solved this the right way; this
   mirrors them rather than inventing a third approach.

   The gap itself: .box-header pads 12px at the bottom AND .frr-toolbar inside it pads another 12px,
   so every card title floats ~24px above its content. Killing the header's bottom padding lets the
   toolbar's own 12px be the whole gap — which is exactly the Fees Refund Request rhythm. */
.refund-theme.seb-page .box-header { padding-bottom: 0 !important; }
.refund-theme.seb-page .frr-toolbar { padding: 2px 16px 10px; }
.refund-theme.seb-page .box-body { padding: 12px 16px 14px !important; }
.refund-theme.seb-page .box-footer { padding: 10px 16px !important; }

/* ---- LEFT-ALIGN every grid header + cell on this page ----
   Scoped to .seb-page ONLY. .attendance-table is the FINALIZED/LOCKED Screen-1 grid that Fees Refund
   Request and every other Refund screen inherit — CLAUDE.md says do not re-tweak it. So this corrects
   the alignment here without touching a single rule those pages read.
   Numbers included on purpose: Email Qty is a COUNT, not money. Right-aligning it (the old "Operation
   Amount" behaviour) is a currency convention and made 5000 emails read as a rupee figure. */
.refund-theme.seb-page .attendance-table th,
.refund-theme.seb-page .attendance-table td { text-align: left; }
.refund-theme.seb-page .attendance-table th > a { display: inline-block; }
/* the empty-state row keeps its centred message */
.refund-theme.seb-page .attendance-table td.dataTables_empty { text-align: center; }

/* ---- balance strip ---- */
.refund-theme .seb-strip {
    display: flex;
    align-items: stretch;
    gap: 0;
    border: 1px solid var(--line);
    border-radius: 4px;
    overflow: hidden;
    background: var(--surface);
}
.refund-theme .seb-bal {
    padding: 14px 22px;
    min-width: 190px;
    background: var(--brand-ice);
    border-right: 1px solid var(--line);
}
.refund-theme .seb-bal.low { background: var(--pend-bg); }
.refund-theme .seb-bal.out { background: var(--no-bg); }
.refund-theme .seb-bal-n {
    font-size: 34px; font-weight: 700; line-height: 1.1; color: var(--brand-dark);
}
.refund-theme .seb-bal.low .seb-bal-n { color: var(--warn); }
.refund-theme .seb-bal.out .seb-bal-n { color: var(--no); }
.refund-theme .seb-bal-l { font-size: 11.5px; color: var(--muted); text-transform: uppercase; letter-spacing: .3px; }

.refund-theme .seb-cell { padding: 14px 20px; border-right: 1px solid var(--line); flex: 1; }
.refund-theme .seb-cell:last-child { border-right: 0; }
.refund-theme .seb-cell-l { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: .3px; margin-bottom: 4px; }
.refund-theme .seb-cell-v { font-size: 18px; font-weight: 600; color: var(--ink); }
.refund-theme .seb-cell-v.seb-cell-sm { font-size: 13px; font-weight: 500; }
.refund-theme .seb-cell-s { font-size: 11.5px; color: var(--muted); margin-top: 3px; }

/* ---- pills ---- */
.refund-theme .seb-pill {
    display: inline-block; padding: 2px 10px; border-radius: 10px;
    font-size: 11.5px; font-weight: 600;
}
.refund-theme .seb-pill.ok   { background: var(--ok-bg);   color: var(--ok); }
.refund-theme .seb-pill.off  { background: var(--row-alt); color: var(--muted); }
.refund-theme .seb-pill.pend { background: var(--pend-bg); color: var(--pend); }

.refund-theme .seb-warn { margin-top: 12px; }

/* ---- settings ---- */
.refund-theme .seb-grid { display: flex; gap: 26px; flex-wrap: wrap; }
.refund-theme .seb-col { flex: 1; min-width: 280px; }
.refund-theme .seb-num { max-width: 160px; }
.refund-theme .seb-col small { color: var(--muted); display: block; margin-top: 4px; }

.refund-theme .seb-switch-row {
    display: flex; align-items: flex-start; gap: 12px;
    padding: 12px 14px; border: 1px solid var(--line); border-radius: 4px;
    background: var(--surface-2); margin-top: 6px;
}
.refund-theme .seb-switch-row.on { background: var(--brand-ice); border-color: var(--brand-light); }
.refund-theme .seb-switch-h { font-weight: 600; color: var(--ink); font-size: 13px; }
.refund-theme .seb-switch-d { font-size: 11.5px; color: var(--muted); margin-top: 2px; }

/* ---- threshold chips ---- */
.refund-theme .seb-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.refund-theme .seb-chip {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 7px 12px; border: 1px solid var(--line); border-radius: 16px;
    background: var(--surface); color: var(--muted);
    font-size: 12.5px; cursor: pointer; user-select: none;
}
.refund-theme .seb-chip:hover { border-color: var(--brand-hover-border); }
.refund-theme .seb-chip.on {
    background: var(--brand-ice); border-color: var(--brand); color: var(--brand-dark); font-weight: 600;
}
.refund-theme .seb-chip b { font-weight: 700; }

.refund-theme .seb-bad {
    margin-top: 8px; margin-bottom: 10px; font-size: 12px; color: var(--no);
}
/* invalid-input ring — token only, mirrors the error colour used by .seb-bad above it */
.refund-theme .seb-in-bad,
.refund-theme .seb-in-bad:focus { border-color: var(--no) !important; box-shadow: none; }
.refund-theme .seb-dirty { margin-left: 10px; font-size: 12px; color: var(--warn); }

/* ---- recipients ---- */
.refund-theme .seb-add { display: flex; gap: 8px; margin-bottom: 12px; max-width: 460px; }
.refund-theme .seb-add .form-control { flex: 1; }
.refund-theme .seb-count {
    display: inline-block; margin-left: 6px; padding: 1px 8px; border-radius: 9px;
    background: var(--brand-ice); color: var(--brand-dark); font-size: 11.5px; font-weight: 700;
}

/* ---- pager / footer ---- */
.refund-theme .seb-pager { display: flex; align-items: center; justify-content: space-between; margin-top: 10px; flex-wrap: wrap; }
.refund-theme .seb-show { font-weight: 400; font-size: 12.5px; color: var(--muted); margin: 0; }
.refund-theme .seb-show .form-control { display: inline-block; width: auto; margin: 0 4px; }


/* =====================================================================
   COMMON BUTTONS  (.rt-btn / .rt-ico)  - added 17-07-2026
   ---------------------------------------------------------------------
   THE ONE RULE: only ADD NEW / SAVE / UPDATE carry the brand colour, and they
   are the only buttons that follow the accent preset. Everything else is fixed.

   That is not a style preference, it is what keeps the grid readable. If Edit
   were brand-coloured, a school picking the GREEN accent would get a green Edit
   button beside the green Activate button - two different actions, one colour.
   Picking RED would give a red Activate that looks exactly like Delete. So
   colour is spent only where it carries meaning (activate / deactivate / delete)
   and View vs Edit are told apart by their icon, not their hue.

   ONE PRIMARY PER SCREEN. If Back, Cancel and Save are all blue, nothing reads
   as the thing to click.

   ACTIVE/INACTIVE IS ONE BUTTON IN TWO STATES, never two buttons side by side:
   the record is either active or it is not, and showing both makes the user
   guess which one is current. Render .rt-ico-on when the row is INACTIVE
   (click = activate) and .rt-ico-off when it is ACTIVE (click = deactivate).

   RIGHTS: view/edit/toggle/delete must ALSO be gated server-side - see
   CheckUserMenuAccess. The toggle gates on the EDIT right; the menu flag, the
   RoleMenuAllocation row, the view's @if and the controller check must all name
   that same right or nobody can toggle anything and no error explains why.
   Back / Back to list / Cancel are navigation and are never gated.
   ===================================================================== */

.refund-theme .rt-btn,
.refund-theme .modal-footer .btn.btn-default,
.refund-theme .box-footer .btn.btn-default{
  display:inline-flex; align-items:center; gap:6px; height:34px; padding:0 14px;
  border-radius:5px; font-size:12.5px; font-weight:600; cursor:pointer;
  border:1px solid var(--line); background:var(--surface); color:var(--ink);
  transition:background .12s, border-color .12s, color .12s; white-space:nowrap;
}
.refund-theme .rt-btn:hover,
.refund-theme .modal-footer .btn.btn-default:hover,
.refund-theme .box-footer .btn.btn-default:hover{ background:var(--row-hover); border-color:var(--grip); color:var(--ink); }
.refund-theme .rt-btn:focus-visible{ outline:2px solid var(--brand); outline-offset:1px; }

/* ADD NEW / SAVE / UPDATE - the only accent-following buttons */
.refund-theme .rt-btn-primary{
  background:var(--brand); color:var(--on-brand); border-color:var(--brand-edge);
}
.refund-theme .rt-btn-primary:hover{ background:var(--brand-dark); border-color:var(--brand-edge); color:var(--on-brand); }

/* Back / Back to list / Cancel - navigation, deliberately quiet */
.refund-theme .rt-btn-sm{ height:26px; padding:0 10px; font-size:11.5px; }
/* a grid Action cell that mixes icon buttons with a labelled one needs the same 4px rhythm
   `.rt-ico + .rt-ico` already gives icon-only cells - COMMON */
.refund-theme td .rt-ico + .rt-btn,
.refund-theme td .rt-btn + .rt-ico,
.refund-theme td .rt-btn + .rt-btn{ margin-left:4px; vertical-align:middle; }

/* ---- TOGGLE SWITCH (<switch> directive / angular-toggle-switch) - COMMON ----
   The directive renders `div.switch` (+ `.checked` when on) with a `<small>` knob and `.on`/`.off`
   labels. Its stock skin is a harsh red/green pair, which reads as an error/success state rather than
   a setting. Same treatment the theme gives everything else: neutral grey when off, brand when on.
   Was scoped to .collectfees-page's `.cf-inc`; it is common now, so any page using <switch> matches
   without adding CSS. Purely a skin - the directive's own markup, sizing and behaviour are untouched. */
.refund-theme .switch{ background:var(--muted) !important; border:1px solid var(--line) !important; box-shadow:none !important; }
.refund-theme .switch.checked{ background:var(--brand) !important; border-color:var(--brand) !important; }
.refund-theme .switch small{ background:#fff !important; box-shadow:0 1px 2px rgba(16,42,74,.25) !important; }
.refund-theme .switch .on,
.refund-theme .switch .off{ color:#fff !important; font-weight:600; }
/* A labelled destructive button OUTSIDE a .frr-confirm dialog (ApproveRequest's Reject
   modal is a plain bootstrap modal, not the confirm component, so .rt-cf-go does not reach
   it). Solid red because this one IS the confirmation - the point where red is correct. */
.refund-theme .rt-btn-danger{ background:var(--no); color:var(--on-brand); border-color:var(--no-border); }
/* `background` MUST be restated here. `.refund-theme .rt-btn:hover` and `.refund-theme .rt-btn-danger:hover`
   have the SAME specificity (0,3,0), and the base rule sets `background:var(--row-hover)` - so a variant
   hover that only tweaks filter/colour lets the near-white base background win, and a solid coloured button
   turns pale the moment the pointer touches it. Reported on Send; danger had the identical latent bug. */
.refund-theme .rt-btn-danger:hover{ background:var(--no); border-color:var(--no-border); filter:brightness(.92); color:var(--on-brand); }
.refund-theme .rt-btn-ghost{ color:var(--muted); }
.refund-theme .rt-btn-ghost:hover{ color:var(--ink); }
/* ok = green 'go' button (Send / Save). The common set had primary/ghost/danger but no green;
   promoted from FeeSMS .btn.ok. Tokenised border (--ok, was a hardcoded dark green) and a real
   hover (the old .btn.ok inherited .btn:hover -> grey, a latent bug). */
.refund-theme .rt-btn-ok{ background:var(--ok); color:var(--on-brand); border-color:var(--ok); }
/* Restates `background` for the reason given on .rt-btn-danger:hover above - without it the base
   `.rt-btn:hover` (same specificity, later in the cascade than this variant's own base rule) repainted the
   green Send button near-white on hover. The comment above claiming this was "a real hover" was only half
   true: it fixed the colour, not the background. */
.refund-theme .rt-btn-ok:hover{ background:var(--ok); border-color:var(--ok); filter:brightness(1.03); color:var(--on-brand); }

/* ---- CANCEL IS THE PLAIN BUTTON. THERE IS NO `.rt-btn-cancel`. ----
   I briefly added one, first in soft red and then in solid red. Both were wrong and it is deleted: RED IS
   RESERVED FOR DESTRUCTIVE ACTIONS in this theme, and backing out of a dialog is the SAFE choice - colouring
   it red tells the user the harmless option is the dangerous one, and puts two reds in any dialog whose
   confirm button is also red.
   The reference already existed and should have been followed from the start: the theme's own confirm
   component pairs `.rt-cf-go` (intent-coloured) with `.frr-cf-plain` (grey), and the same pairing is on
   every popup across the converted pages. For a `.rt-modal` footer that pair is
       <button class="rt-btn rt-btn-primary rt-steady">Confirm</button>   (or -danger for a delete)
       <button class="rt-btn">Cancel</button>
   The bare `.rt-btn` above IS the grey button - no modifier needed, and its hover sets `color` explicitly,
   so it is not exposed to the vanishing-label problem `.rt-steady` exists to fix. */

/* ---- .rt-steady - A BUTTON WHOSE COLOUR DOES NOT MOVE ON HOVER ----
   TWO REASONS THIS EXISTS, and the second one is a bug fix.
   1) Asked for: a confirm button that does not shift colour under the cursor.
   2) THE LABEL WAS DISAPPEARING ON HOVER. Several older sheets in this app carry hover rules that set a
      background WITHOUT setting a colour (CustomTableDesign's `.NewSPR .modal-footer .btn-*:hover` are
      the pattern - `border-color` and `background`, no `color`). Whenever one of those wins the cascade,
      the button keeps the theme's white ink and gains a pale background: white on near-white, i.e. an
      empty-looking button. Pinning BOTH colour and background per variant with `!important` makes the
      hover state impossible to half-apply.
   Deliberately spelled out per variant rather than done with one clever `filter:none` rule: each variant
   changes a DIFFERENT property on hover (primary swaps background, ok/danger use filter), so a single
   rule would only neutralise some of them. */
.refund-theme .rt-btn.rt-steady:hover,
.refund-theme .rt-btn.rt-steady:focus{ filter:none !important; }
.refund-theme .rt-btn-primary.rt-steady:hover,
.refund-theme .rt-btn-primary.rt-steady:focus{
  background:var(--brand) !important; border-color:var(--brand-edge) !important; color:var(--on-brand) !important;
}
.refund-theme .rt-btn-ok.rt-steady:hover,
.refund-theme .rt-btn-ok.rt-steady:focus{
  background:var(--ok) !important; border-color:var(--ok) !important; color:var(--on-brand) !important;
}
.refund-theme .rt-btn-danger.rt-steady:hover,
.refund-theme .rt-btn-danger.rt-steady:focus{
  background:var(--no) !important; border-color:var(--no-border) !important; color:var(--on-brand) !important;
}

.refund-theme .rt-btn[disabled],
.refund-theme .rt-btn.rt-is-disabled{
  background:var(--btn-disabled-bg); color:var(--btn-disabled-ink);
  border-color:var(--line); cursor:not-allowed; pointer-events:none;
}

/* ---------- grid action column: icon buttons ---------- */
.refund-theme .rt-ico{
  display:inline-flex; align-items:center; justify-content:center;
  width:26px; height:26px; border-radius:6px; cursor:pointer; padding:0; vertical-align:middle;
  border:1px solid var(--line); background:var(--surface); color:var(--muted);
  transition:background .12s, border-color .12s, color .12s;
}
.refund-theme .rt-ico + .rt-ico{ margin-left:4px; }
/* The sprite is defined once in _Layout (<symbol id="rt-*">). Icons inherit currentColor,
   so an icon NEVER needs its own colour rule - it takes the button's. That is what makes
   one icon usable in a red delete button and a grey view button with no variants. */
.refund-theme .rt-i{
  width:14px; height:14px; flex:none; fill:none; stroke:currentColor;
  /* 2.4, not 1.8. These replaced Font Awesome GLYPHS rendered at font-weight 600 - solid and
     heavy. A 1.8 stroke at 14-15px reads noticeably fainter than what it replaced, which is why
     the back arrow looked wrong even though the class was right. */
  stroke-width:2.4; stroke-linecap:round; stroke-linejoin:round;
}
.refund-theme .rt-ico .rt-i{ width:14px; height:14px; }
.refund-theme .rt-btn .rt-i{ width:15px; height:15px; }
.refund-theme .rt-ico:focus-visible{ outline:2px solid var(--brand); outline-offset:1px; }

.refund-theme .rt-ico-view:hover{ color:var(--ink); border-color:var(--grip); background:var(--row-hover); }
.refund-theme .rt-ico-edit{ color:var(--muted); background:var(--surface); border-color:var(--line); }
.refund-theme .rt-ico-edit:hover{ color:var(--ink); border-color:var(--grip); background:var(--row-hover); }

/* row is INACTIVE -> offer activate */
.refund-theme .rt-ico-on{ color:var(--ok); background:var(--ok-bg); border-color:var(--ok-border); }
.refund-theme .rt-ico-on:hover{ background:var(--ok-bg-hover); }
/* row is ACTIVE -> offer deactivate. Amber, not grey (grey reads as disabled)
   and not red (red already means Delete, one column away). */
.refund-theme .rt-ico-off{ color:var(--warn); background:var(--warn-bg); border-color:var(--warn-border); }
.refund-theme .rt-ico-off:hover{ background:var(--warn-bg-hover); }
/* tinted, not solid: a solid red in every row makes the grid look like an error
   state. The CONFIRM dialog is where delete goes properly red. */
.refund-theme .rt-ico-del,
.refund-theme .rt-ico-cancel{ color:var(--no); background:var(--no-bg); border-color:var(--no-border); }
.refund-theme .rt-ico-del:hover,
.refund-theme .rt-ico-cancel:hover{ background:var(--no-bg-hover); }
/* -cancel is NOT an alias for -del out of laziness: on the Refund grid the red X is
   "Cancel Request" (AskCancel), which voids a financial request - it does not delete a row.
   Same red, different verb. The class names the action so the markup does not lie about
   what the button does; they share a rule because both are destructive-and-confirmed. */

/* clone = duplicate a template into a new editable draft (Add right). Neutral hover: duplicating
   is non-destructive and secondary, so it reads like View, not Edit. */
.refund-theme .rt-ico-clone:hover{ color:var(--ink); border-color:var(--grip); background:var(--row-hover); }
/* star = promote this template to the school default (Edit right). Neutral like clone - the star
   glyph + tooltip carry the meaning; brand-blue here would collide with the Edit button beside it. */
.refund-theme .rt-ico-star:hover{ color:var(--ink); border-color:var(--grip); background:var(--row-hover); }
/* lock = NON-interactive "in use, cannot delete" indicator (deactivate instead). A <span>, not a
   button: keeps the hover tooltip but drops the click/pointer affordance. */
.refund-theme .rt-ico.rt-lock-ind{ cursor:default; }

.refund-theme .rt-ico[disabled], .refund-theme .rt-ico.rt-is-disabled{
  background:var(--btn-disabled-bg); color:var(--btn-disabled-ink);
  border-color:var(--line); cursor:not-allowed; pointer-events:none;
}


/* =====================================================================
   PROMOTED COMMON COMPONENTS - added 17-07-2026
   ---------------------------------------------------------------------
   Table, KPI-stat strip and badge/pill promoted verbatim (same tokens) from the
   FeeSMS page so they are shared, not duplicated per page. Identical rendering to
   the originals; FeeSMS now references these .rt-* names.
   ===================================================================== */
/* ---------- table (matches the LOCKED landing grid: 2px brand-edge, gradient head) ---------- */
.refund-theme .rt-tbl{ width:100%; border-collapse:separate; border-spacing:0; border:2px solid var(--brand-edge); border-radius:8px; overflow:hidden; background:#fff; }
.refund-theme .rt-tbl thead th{ background:var(--brand); color:#fff; font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.4px; text-align:left; padding:0 12px; height:36px; white-space:nowrap; border-bottom:2px solid var(--brand-edge); }
.refund-theme .rt-tbl thead th a{ color:#fff; }
.refund-theme .rt-tbl tbody td{ font-size:12.5px; padding:9px 12px; border-bottom:1px solid var(--line); vertical-align:middle; }
.refund-theme .rt-tbl tbody tr:nth-child(even){ background:var(--row-alt); }
.refund-theme .rt-tbl tbody tr:hover{ background:var(--row-hover); }
.refund-theme .rt-tbl .num{ text-align:right; font-variant-numeric:tabular-nums; }
/* ---------- KPI stat strip ---------- */
.refund-theme .rt-stats{ display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-bottom:14px; }
@media(max-width:820px){ .refund-theme .rt-stats{ grid-template-columns:1fr 1fr; } }
.refund-theme .rt-stat{ background:#fff; border:1px solid var(--line); border-radius:10px; padding:13px 15px; box-shadow:var(--shadow); }
.refund-theme .rt-stat .l{ font-size:11px; text-transform:uppercase; letter-spacing:.3px; color:var(--muted); font-weight:600; }
.refund-theme .rt-stat .v{ font-size:23px; font-weight:800; color:var(--brand-dark); margin-top:4px; }
.refund-theme .rt-stat.warn .v{ color:var(--no); }
.refund-theme .rt-stat.ok .v{ color:var(--ok); }
.refund-theme .rt-stat .s{ font-size:11px; color:var(--muted); margin-top:2px; }
/* a leading icon on the caption - furniture, so it takes the caption's own muted colour rather than the
   per-card green/red the pre-theme markup gave it */
.refund-theme .rt-stat .l .fa{ margin-right:5px; }
/* 3-up, for pages with three counts. The base grid is 4 columns; three cards on it left a quarter of the
   strip empty, which is why the pre-theme version of this faked its own grid with `width:22.9%`. */
.refund-theme .rt-stats.rt-stats-3{ grid-template-columns:repeat(3,1fr); }
@media(max-width:820px){ .refund-theme .rt-stats.rt-stats-3{ grid-template-columns:1fr; } }
/* `.on` = "this is the bucket you are looking at". A READ-ONLY highlight: it mirrors whatever the page's
   filter is set to, and carries no pointer cursor, because these cards are counts, not controls. Pages
   whose buckets ARE clickable add their own affordance (see the followupinquiry bucket bar). */
.refund-theme .rt-stat.on{
  border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light), var(--shadow);
}
/* ---------- badge / pill (semantic states) ---------- */
.refund-theme .rt-pill{ display:inline-block; padding:2px 9px; border-radius:20px; font-size:11px; font-weight:600; }
.refund-theme .rt-pill.no{ background:var(--no-bg); color:var(--no); border:1px solid var(--no-border); }
.refund-theme .rt-pill.ok{ background:var(--ok-bg); color:var(--ok); }
.refund-theme .rt-pill.sms{ background:var(--brand-light); color:var(--brand-dark); }
.refund-theme .rt-pill.notif{ background:var(--ok-bg); color:var(--ok); }

/* =====================================================================
   THEME PICKER (Account Setting) - added 17-07-2026
   ---------------------------------------------------------------------
   THE SWATCH IS THE PRESET. Each button carries its own .theme-* class, which sets
   --brand on that element; the swatch just paints var(--brand). So the ten hex values
   exist ONCE, in the preset block, and the picker cannot show a colour the theme does
   not have. Hardcoding the hex in JS or the view would be a fourth copy of the palette
   and the one guaranteed to drift.
   ===================================================================== */
.refund-theme .thm-swatches{ display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
.refund-theme .thm-sw{
  width:30px; height:30px; border-radius:50%; cursor:pointer; padding:0;
  background:var(--brand);              /* resolved by the .theme-* class ON THIS BUTTON */
  border:2px solid var(--surface);
  box-shadow:0 0 0 1px var(--line);
  display:inline-flex; align-items:center; justify-content:center;
  transition:box-shadow .12s, transform .08s;
}
.refund-theme .thm-sw:hover{ transform:scale(1.08); box-shadow:0 0 0 1px var(--grip); }
.refund-theme .thm-sw:focus-visible{ outline:2px solid var(--ink); outline-offset:2px; }
/* selected: ring in the swatch's OWN colour, not the active theme's - the ring has to read
   against the swatch it is on, and --brand here is this swatch's colour. */
.refund-theme .thm-sw.is-on{ box-shadow:0 0 0 2px var(--surface), 0 0 0 4px var(--brand-edge); }
.refund-theme .thm-sw .rt-i{ width:14px; height:14px; color:var(--on-brand); stroke-width:2.4; }
.refund-theme .thm-current{ font-size:12px; color:var(--muted); margin-top:8px; }


/* =====================================================================
   COMMON FORM FIELD STATES  (points 5 + 7)  - added 17-07-2026
   ---------------------------------------------------------------------
   ONE placeholder colour for every kind of field. Change --placeholder, every
   input/textarea/select/date on every themed page follows. opacity:1 is not
   decoration: Firefox applies its own opacity to placeholders, so without it the
   token is silently lightened and no two browsers agree.

   *** POINT 7 IS NOT SECURITY, AND MUST NOT BE TREATED AS ONE. ***
   Devang asked that a disabled dropdown/textarea cannot be opened "for data
   security purpose". These rules make it genuinely non-interactive - that is a real
   UX bug and worth fixing - but `disabled` and pointer-events live in the DOM and
   come off in devtools in three seconds, after which the POST goes through exactly
   as before. This is the SAME mistake as hiding a button and calling it a permission:
   CLAUDE.md already says "hiding alone is not security (anyone can POST the action)".
   If a field must not change, the controller/SP has to reject the changed value.
   These rules stop honest mistakes. They stop nothing else.
   ===================================================================== */
.refund-theme ::-webkit-input-placeholder{ color:var(--placeholder); opacity:1; }
.refund-theme ::-moz-placeholder{ color:var(--placeholder); opacity:1; }
.refund-theme :-ms-input-placeholder{ color:var(--placeholder); opacity:1; }
.refund-theme ::placeholder{ color:var(--placeholder); opacity:1; }

/* a select showing its placeholder option is not "filled in" - it should read like one */
.refund-theme select.rt-unset,
.refund-theme select:invalid{ color:var(--placeholder); }
.refund-theme select.rt-unset option,
.refund-theme select option{ color:var(--ink); }

/* ---------- disabled: looks dead AND is dead to the mouse ---------- */
.refund-theme .form-control[disabled],
.refund-theme input[disabled],
.refund-theme select[disabled],
.refund-theme textarea[disabled],
.refund-theme .rt-disabled{
  background:var(--btn-disabled-bg) !important;
  color:var(--btn-disabled-ink) !important;
  border-color:var(--line) !important;
  cursor:not-allowed;
  /* pointer-events on the CONTROL, not the wrapper: a disabled <select> in some browsers
     still opens on click, and a disabled textarea still takes a caret on some. */
  pointer-events:none;
  -webkit-text-fill-color:var(--btn-disabled-ink);   /* iOS/Safari ignore `color` when disabled */
  opacity:1;                                          /* ...and apply their own opacity on top */
}
/* READONLY IS NOT DISABLED and must not look like it. A readonly field still submits its
   value and can still be selected/copied - which is the point of readonly. Rendering it
   identically to disabled tells the user it is inert when it is not. */
.refund-theme .form-control[readonly],
.refund-theme input[readonly],
.refund-theme textarea[readonly]{
  background:var(--readonly-bg);
  color:var(--ink);
  cursor:default;
}


/* =====================================================================
   GRID: sticky header + height follows the record count + horizontal scroll  (17-07-2026)
   ---------------------------------------------------------------------
   ALL THREE AT ONCE. I claimed CSS could only do two of them and that was WRONG - Devang sent
   a Zoho video doing all three. My error was reading "height follows the record count" as
   "grows unbounded", so I removed the cap; the grid then burst its card and pushed ACTIONS
   off-screen. It actually means: 10 rows -> a short box; 100 rows -> a tall box that scrolls
   once it reaches the viewport. That is exactly max-height.

   HOW THE THREE COEXIST - the wrapper is the scrollport for BOTH axes:
     max-height  -> the box grows with the rows and stops once it reaches the viewport;
     overflow:auto     -> horizontal scroll appears when columns are wider than the card;
     position:sticky   -> the header stays pinned while the body scrolls under it.
   (Comment completed & closed 18-07-2026 - it had been left unterminated.) */

/* =====================================================================
   EMAIL GRID PAGES - same tight 12px toolbar-to-grid gap as the refund pages.
   Scoped to the email page roots ONLY (emailcredit-page / seb-page), so refund
   pages are never affected. These pages put the toolbar in .box-header and the
   grid in .box-body; we drop the header's bottom padding + divider and give the
   body a 12px top padding - the same visual gap the refund pages get from
   frr-wl-head. Higher specificity + !important overrides the base box rules.
   ===================================================================== */
.refund-theme.emailcredit-page .box-header,
.refund-theme.seb-page .box-header{
  padding-bottom:0 !important;
  border-bottom:none !important;
}
.refund-theme.emailcredit-page .box-header + .box-body,
.refund-theme.seb-page .box-header + .box-body{
  padding-top:0 !important;
}

/* =====================================================================
   RECEIPT-TEMPLATE EDITOR (split view) - moved out of the view; scoped .refund-theme .rt-*
   ===================================================================== */
/* receipt-template editor (split) - scoped */
.refund-theme .rt-split{display:flex;min-height:520px}
.refund-theme .rt-left{flex:0 0 47%;overflow:auto;padding-right:14px;border-right:1px solid var(--line)}
/* `min-width:0` IS THE WHOLE FIX FOR THE PREVIEW PANE, and it is not cosmetic.
   A flex item defaults to `min-width:auto`, i.e. it refuses to shrink below its CONTENT's intrinsic
   width. The content here is the preview iframe drawn at the true printed page width (A4 = 794px)
   plus 14px padding either side - so this column ignored its `1 1 53%` share, forced itself to 822px
   and pushed its own right edge to 1680 on a 1524px viewport: the Refresh/Print buttons were cut off
   and the page scrolled sideways. renderPreview() already calls fitPreview(), which zooms the page
   down to the panel width - but it could never help, because the panel was never allowed to be small.
   With min-width:0 the column takes its 53%, fitPreview scales the page into it, and the preview stays
   whole at any width. (Same trap as the WorkflowAuthority fix noted in CLAUDE.md.) */
.refund-theme .rt-right{flex:1 1 53%;min-width:0;background:#e9eef3;border-radius:8px;margin-left:14px;display:flex;flex-direction:column}
.refund-theme .rt-sect{border:1px solid var(--line);border-radius:8px;margin-bottom:12px;background:#fff}
.refund-theme .rt-sect>.h{padding:8px 12px;background:linear-gradient(180deg,#fbfdff,#f2f7fc);border-bottom:1px solid var(--line);border-radius:8px 8px 0 0;font-size:12.5px;color:var(--brand-dark);display:flex;align-items:center;gap:8px;font-weight:600}
.refund-theme .rt-sect>.b{padding:12px}
.refund-theme .rt-num{background:var(--brand);color:#fff;width:19px;height:19px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:11px}
.refund-theme .rt-up{border:2px dashed #c7d4e2;border-radius:8px;padding:11px;text-align:center;color:var(--muted);background:#fbfdff;cursor:pointer;font-size:12px}
.refund-theme .rt-up b{color:var(--brand)}
.refund-theme .rt-thumb{max-height:60px;margin-top:8px;border:1px solid var(--line);border-radius:5px;background:#fff;padding:4px}
.refund-theme .rt-pvbar{display:flex;align-items:center;justify-content:space-between;padding:9px 12px;background:#fff;border-bottom:1px solid var(--line)}
.refund-theme .rt-pvscroll{flex:1 1 auto;min-width:0;overflow:auto;padding:14px;display:flex;flex-direction:column;align-items:center}
.refund-theme .rt-page{width:445px;min-height:300px;background:#fff;box-shadow:0 3px 14px rgba(0,0,0,.16);margin-bottom:16px;border:0;display:block}
.refund-theme .rt-tag{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11px;font-weight:600}
.refund-theme .rt-tag.sys{background:#eef0f3;color:#55606c}.refund-theme .rt-tag.cus{background:#e6f0fb;color:var(--brand)}
.refund-theme .rt-tag.act{background:#e5f5ec;color:var(--ok)}.refund-theme .rt-tag.def{background:#fff4e0;color:var(--warn)}
.refund-theme .rt-a{cursor:pointer;color:var(--brand);margin:0 3px;font-size:14px}.refund-theme .rt-a.del{color:var(--no)}
.refund-theme .rt-secnote{background:#fff8f0;border:1px solid #f0dcc0;border-radius:7px;padding:9px 11px;font-size:11px;color:#6b5b3e}
.refund-theme .rt-secnote code{background:#fbecd8;border-radius:3px;padding:0 3px;font-size:10.5px}
.refund-theme .mref{max-height:320px;overflow:auto;border:1px solid var(--line);border-radius:6px}
.refund-theme .mref table{width:100%;border-collapse:collapse}
.refund-theme .mref th{position:sticky;top:0;background:var(--brand);color:#fff;font-size:10px;text-transform:uppercase;padding:5px 8px;text-align:left}
.refund-theme .mref td{padding:4px 8px;border-bottom:1px solid var(--line);font-size:11.5px;vertical-align:top}
.refund-theme .mref .tk{font-family:Consolas,monospace;color:var(--brand-dark);font-weight:600;white-space:nowrap}
.refund-theme .mref .grp td{background:#dfe9f5;font-weight:700;color:var(--brand-dark);font-size:10px;text-transform:uppercase}
.refund-theme .rt-tools{display:flex;flex-wrap:wrap;align-items:center;gap:5px;margin-bottom:7px}
.refund-theme .rt-tlabel{font-size:11px;color:var(--muted);font-weight:600;margin-right:2px}
.refund-theme .rt-sep{width:1px;height:18px;background:var(--line);margin:0 3px}
.refund-theme .rt-inline{width:auto;display:inline-block;height:26px;padding:2px 6px;font-size:11px}
.refund-theme .rt-color{width:32px;height:26px;padding:0;border:1px solid var(--line);border-radius:4px;background:#fff;cursor:pointer;vertical-align:middle}

/* =====================================================================
   APPROVAL SETTING - moved out of the view; scoped .refund-theme .ras-*
   ===================================================================== */
    .refund-theme .ras-choice { display: flex; gap: 14px; flex-wrap: wrap; margin: 4px 0 0 0; }
    .refund-theme .ras-opt { flex: 1 1 300px; border: 2px solid var(--line); border-radius: 8px; padding: 14px 16px; cursor: pointer; background: #fff; transition: border-color .12s, background .12s; }
    .refund-theme .ras-opt:hover { border-color: var(--brand); }
    .refund-theme .ras-opt.sel { border-color: var(--brand); background: var(--surface-2); }
    .refund-theme .ras-opt.disabled { cursor: not-allowed; opacity: .65; }
    .refund-theme .ras-opt .t { font-size: 13.5px; font-weight: 600; color: var(--brand-dark); display: flex; align-items: center; gap: 8px; }
    .refund-theme .ras-opt .d { font-size: 12px; color: var(--muted); margin-top: 6px; line-height: 1.6; }
    .refund-theme .ras-cur { display: inline-block; padding: 3px 11px; border-radius: 20px; font-size: 11.5px; font-weight: 600; }
    /* tokens only - --ok-border / --warn-bg do not exist; pending amber is --pend / --pend-bg */
    .refund-theme .ras-cur.on { background: var(--ok-bg); color: var(--ok); border: 1px solid var(--ok); }
    .refund-theme .ras-cur.off { background: var(--pend-bg); color: var(--pend); border: 1px solid var(--pend); }
    .refund-theme .ras-note { border: 1px solid var(--line); border-left: 3px solid var(--brand); background: var(--surface-2); border-radius: 6px; padding: 10px 12px; font-size: 12px; color: var(--muted); line-height: 1.65; margin-top: 14px; }
    .refund-theme .ras-note b { color: var(--brand-dark); }
    .refund-theme .ras-warn { border-left-color: var(--pend); background: var(--pend-bg); color: var(--pend); }
    .refund-theme .ras-actions { margin-top: 16px; display: flex; align-items: center; gap: 10px; }
    .refund-theme .ras-ro { font-size: 12px; color: var(--muted); font-style: italic; }

/* =====================================================================
   Common row-action icons - extra members used by the email pages so they
   use the SAME rt-ico system as the refund grids (no page-wise frr-act-ico).
   ===================================================================== */
.refund-theme .rt-ico-send{ color:var(--brand); background:var(--surface); border-color:var(--line); }
.refund-theme .rt-ico-send:hover{ background:var(--brand-light); border-color:var(--brand-hover-border); }
/*  rt-ico-mail = the NOT-YET-SENT half of the same pair (added 26-08-2026).
    The email grids wrote `EmailSent ? 'rt-ico rt-ico-send' : 'rt-ico'`, so an unsent row fell
    back to BARE `.rt-ico` - and bare `.rt-ico` has no :hover rule of its own. Every modifier
    (-view, -edit, -on, -off, -del, -send, -dl) carries one; the base class deliberately does
    not, because it is only ever meant to be a foundation. The result was an envelope that
    showed its tooltip on hover but did not react at all, on the majority of rows: the button
    read as disabled right up until it was clicked.
    Muted at rest so an unsent row stays quieter than a sent one, brand-tinted on hover so the
    two states still differ while the pointer is on them. Same shape as -dl deliberately: both
    are "neutral action, brand on approach". */
.refund-theme .rt-ico-mail{ color:var(--muted); background:var(--surface); border-color:var(--line); }
.refund-theme .rt-ico-mail:hover{ color:var(--brand-dark); background:var(--brand-light); border-color:var(--brand-hover-border); }
/* download / export a single row (replaces the legacy `btn btn-danger btn-xs`, which read as a delete) */
.refund-theme .rt-ico-dl{ color:var(--muted); background:var(--surface); border-color:var(--line); }
.refund-theme .rt-ico-dl:hover{ color:var(--brand-dark); background:var(--brand-light); border-color:var(--brand-hover-border); }
.refund-theme .rt-ico .fa{ font-size:14px; line-height:1; }

/* Footer buttons on one baseline: btn.btn-default (Bootstrap vertical-align:middle) sat 4px below
   the rt-btn Save/Preview (baseline). Force both to middle in a footer so Cancel lines up. */
.refund-theme .box-footer .rt-btn,
.refund-theme .box-footer .btn.btn-default,
.refund-theme .modal-footer .rt-btn,
.refund-theme .modal-footer .btn.btn-default{ vertical-align:middle; }

/* =====================================================================
   CollectFees page - dropdowns (select2) + fee grid, common theme (18-07-2026)
   Scoped to .collectfees-page so only this page picks it up. The open select2
   result panels are themed globally above (.refund-theme .select2-dropdown);
   these rules cover the CLOSED selection boxes + the div-table fee grid.
   ===================================================================== */
/* --- single-select boxes: Class, Fees till Month, Fee Status, Pay Against, Payment Type, Bank, Cancel Reason --- */
.refund-theme.collectfees-page .select2-container{ width:100% !important; }
.refund-theme.collectfees-page .select2-container--default .select2-selection--single{ height:34px !important; padding:0 !important; border:1px solid var(--line); border-radius:5px; background:var(--surface); }
.refund-theme.collectfees-page .select2-container--default .select2-selection--single .select2-selection__rendered{ line-height:34px; padding-left:10px; padding-right:24px; color:var(--ink); font-size:13px; }
.refund-theme.collectfees-page .select2-container--default .select2-selection--single .select2-selection__placeholder{ color:var(--muted); }
.refund-theme.collectfees-page .select2-container--default .select2-selection--single .select2-selection__arrow{ height:32px; }
.refund-theme.collectfees-page .select2-container--default.select2-container--focus .select2-selection--single,
.refund-theme.collectfees-page .select2-container--open .select2-selection--single{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
/* --- multi-select box: Fee Component --- */
.refund-theme.collectfees-page .select2-container--default .select2-selection--multiple{ min-height:34px; border:1px solid var(--line) !important; border-radius:5px; background:var(--surface); padding:2px 4px; }
.refund-theme.collectfees-page .select2-container--focus .select2-selection--multiple,
.refund-theme.collectfees-page .select2-container--open .select2-selection--multiple{ border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme.collectfees-page .select2-selection__choice{ background:var(--brand-light) !important; border:1px solid var(--brand-hover-border) !important; color:var(--brand-dark) !important; border-radius:12px; padding:1px 8px; margin:3px 4px 3px 0; font-size:12px; line-height:1.6; }
.refund-theme.collectfees-page .select2-selection__choice__remove{ color:var(--brand-dark) !important; margin-right:5px; font-weight:700; }
.refund-theme.collectfees-page .select2-selection__choice__remove:hover{ color:var(--no) !important; }
.refund-theme.collectfees-page .select2-selection__placeholder{ color:var(--muted) !important; }
.refund-theme.collectfees-page .select2-container--disabled .select2-selection--single,
.refund-theme.collectfees-page .select2-container--disabled .select2-selection--multiple{ background:var(--surface-2) !important; cursor:not-allowed; }

/* --- after-search fee grid: div-table (.Table/.Heading/.Row/.Cell) in the common palette --- */
.refund-theme.collectfees-page .Heading{ background:var(--brand) !important; color:var(--on-brand) !important; }
.refund-theme.collectfees-page .Heading .Cell{ border:none !important; border-bottom:2px solid var(--brand-edge) !important; color:var(--on-brand) !important; padding:7px 12px !important; }
.refund-theme.collectfees-page .Heading .Cell p{ margin:0; }
.refund-theme.collectfees-page .Heading1{ background:var(--ok-bg) !important; color:var(--brand-dark) !important; }
.refund-theme.collectfees-page .Heading2{ background:var(--no-bg) !important; color:var(--no) !important; }
.refund-theme.collectfees-page .Row{ background:var(--surface) !important; }
.refund-theme.collectfees-page .Row1{ background:var(--surface-2) !important; }
.refund-theme.collectfees-page .Table > .Row:nth-child(even){ background:var(--row-alt) !important; }
.refund-theme.collectfees-page .Row:hover{ background:var(--row-hover) !important; }
.refund-theme.collectfees-page .Cell{ border:none !important; border-bottom:1px solid var(--line) !important; color:var(--ink); vertical-align:middle; padding:6px 12px !important; }
.refund-theme.collectfees-page .Title p{ color:var(--brand-dark) !important; }
.refund-theme.collectfees-page .Title .fa-star{ color:var(--warn) !important; }

/* the MultipleSelect skin is COMMON now - see "MULTIPLESELECT PLUGIN" in the form-controls section */
.refund-theme.collectfees-page .ms-search input{ border:1px solid var(--line) !important; border-radius:5px; }
.refund-theme.collectfees-page .ms-search input:focus{ border-color:var(--brand) !important; outline:0; }

/* =====================================================================
   CollectFees professional layout - filter toolbar + student summary strip (18-07-2026)
   ===================================================================== */
/* ---- filter toolbar card (search + Include toggle + 5 filters) ---- */
.refund-theme.collectfees-page .cf-toolbar{ background:var(--surface); border:1px solid var(--line); border-radius:8px; box-shadow:var(--shadow); padding:10px 18px 12px; margin-bottom:14px; }
.refund-theme.collectfees-page .cf-tb-bar{ display:flex; align-items:center; gap:18px; flex-wrap:wrap; }
.refund-theme.collectfees-page .cf-search-main{ flex:1 1 480px; min-width:280px; }
.refund-theme.collectfees-page .cf-inc{ display:flex; align-items:center; gap:10px; padding-bottom:4px; white-space:nowrap; }
.refund-theme.collectfees-page .cf-toolbar label{ font-size:11px; font-weight:600; letter-spacing:.03em; color:var(--muted); text-transform:uppercase; margin:0 0 5px; display:block; }
.refund-theme.collectfees-page .cf-inc label{ margin:0; }
.refund-theme.collectfees-page .cf-toolbar .req{ color:var(--no); font-weight:700; }
.refund-theme.collectfees-page .cf-filters{ display:grid; grid-template-columns:repeat(5,1fr); gap:12px 14px; margin-top:14px; padding-top:14px; border-top:1px dashed var(--line); }
.refund-theme.collectfees-page .cf-fld{ min-width:0; }
/* ---- student summary strip (was the narrow left card) ---- */
.refund-theme.collectfees-page .cf-student-strip{ display:block; background:var(--surface); border:1px solid var(--line); border-left:4px solid var(--brand); border-radius:8px; box-shadow:var(--shadow); padding:0; margin-bottom:14px; }
.refund-theme.collectfees-page .cf-stu-id{ display:flex; align-items:center; gap:14px; flex:0 0 auto; padding-right:22px; border-right:1px solid var(--line); }
.refund-theme.collectfees-page .cf-stu-photo{ width:60px; height:60px; border-radius:50%; object-fit:cover; background:var(--surface-2); border:3px solid var(--surface); box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme.collectfees-page .cf-stu-name{ font-size:18px; font-weight:700; color:var(--ink); line-height:1.2; }
.refund-theme.collectfees-page .cf-stu-badges{ margin-top:6px; display:flex; gap:6px; flex-wrap:wrap; }
.refund-theme.collectfees-page .cf-badge{ font-size:11px; font-weight:600; padding:2px 10px; border-radius:11px; line-height:1.5; }
.refund-theme.collectfees-page .cf-badge-class{ background:var(--brand-light); color:var(--brand-dark); }
.refund-theme.collectfees-page .cf-badge-ok{ background:var(--ok-bg); color:var(--ok); }
.refund-theme.collectfees-page .cf-badge-no{ background:var(--no-bg); color:var(--no); }
.refund-theme.collectfees-page .cf-badge-rte{ background:var(--warn); color:#fff; }
.refund-theme.collectfees-page .cf-stu-facts{ flex:1 1 auto; display:grid; grid-template-columns:repeat(4,1fr); gap:1px; min-width:0; background:var(--line); border:1px solid var(--line); border-radius:6px; overflow:hidden; }
.refund-theme.collectfees-page .cf-fact{ display:flex; flex-direction:column; min-width:0; background:var(--surface); padding:8px 12px; }
.refund-theme.collectfees-page .cf-fact-k{ font-size:10px; font-weight:600; text-transform:uppercase; letter-spacing:.03em; color:var(--muted); }
.refund-theme.collectfees-page .cf-fact-v{ font-size:13.5px; color:var(--ink); font-weight:700; min-height:16px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* ---- responsive ---- */
@media (max-width:1199px){
  .refund-theme.collectfees-page .cf-filters{ grid-template-columns:repeat(3,1fr); }
  .refund-theme.collectfees-page .cf-stu-facts{ grid-template-columns:repeat(2,1fr); }
}
@media (max-width:767px){
  .refund-theme.collectfees-page .cf-filters{ grid-template-columns:repeat(2,1fr); }
  .refund-theme.collectfees-page .cf-student-strip{ flex-wrap:wrap; }
  .refund-theme.collectfees-page .cf-stu-id{ border-right:none; }
}

/* =====================================================================
   CollectFees - dropdown panels, native selects, Include pill, totals (18-07-2026)
   ===================================================================== */
/* select2 open panels mount on <body>; CollectFees.js mirrors theme vars onto body.cf-page */
body.cf-page .select2-dropdown{ border:1px solid var(--line); border-radius:6px; box-shadow:var(--shadow-menu); overflow:hidden; }
body.cf-page .select2-results{ padding:4px; }
body.cf-page .select2-results__option{ font-size:13px; color:var(--ink); padding:7px 11px; border-radius:5px; }
body.cf-page .select2-container--default .select2-results__option--highlighted[aria-selected]{ background:var(--brand); color:var(--on-brand); }
body.cf-page .select2-container--default .select2-results__option[aria-selected=true]{ background:var(--brand-light); color:var(--brand-dark); }
body.cf-page .select2-search--dropdown .select2-search__field{ border:1px solid var(--line); border-radius:5px; padding:6px 9px; }
body.cf-page .select2-search--dropdown .select2-search__field:focus{ border-color:var(--brand); outline:0; box-shadow:0 0 0 2px var(--brand-light); }
/* native <select> in dynamic rows (Payment Type / Bank) that select2 never initialised */
.refund-theme.collectfees-page select.form-control:not(.select2-hidden-accessible){ height:34px; border:1px solid var(--line); border-radius:5px; background-color:var(--surface); color:var(--ink); font-size:13px; line-height:1.4; padding:4px 30px 4px 11px; -webkit-appearance:none; -moz-appearance:none; appearance:none; background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%236b7a90' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 10px center; background-size:10px 6px; }
.refund-theme.collectfees-page select.form-control.input-sm:not(.select2-hidden-accessible){ height:32px; font-size:12.5px; }
.refund-theme.collectfees-page select.form-control:not(.select2-hidden-accessible):focus{ border-color:var(--brand); outline:0; box-shadow:0 0 0 2px var(--brand-light); }
.refund-theme.collectfees-page select.form-control:not(.select2-hidden-accessible):disabled,
.refund-theme.collectfees-page select.form-control:not(.select2-hidden-accessible)[disabled]{ background-color:var(--surface-2); color:var(--muted); cursor:not-allowed; opacity:1; }
/* Include Left / Cancel -> tidy pill at the end of the search bar */
.refund-theme.collectfees-page .cf-inc{ display:flex; align-items:center; gap:10px; padding:7px 14px; background:var(--surface-2); border:1px solid var(--line); border-radius:8px; white-space:nowrap; align-self:flex-end; }
.refund-theme.collectfees-page .cf-inc label{ margin:0; font-size:11px; font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:.03em; }
/* Transactions + Total Amount: clean readonly display inputs (let the .Cell border show) */
.refund-theme.collectfees-page .Cell input.form-control[disabled],
.refund-theme.collectfees-page .Cell input.form-control:disabled{ background-color:var(--surface-2) !important; border:none; box-shadow:none; color:var(--ink) !important; -webkit-text-fill-color:var(--ink); opacity:1; font-weight:600; }

/* fee-grid row inputs (Fine / Paid) -> compact like RefundTransaction .frr-amt (rows were too tall) */
.refund-theme.collectfees-page .Cell input.form-control.input-sm{ height:30px !important; min-height:30px; padding:3px 8px !important; font-size:12.5px !important; border:1px solid var(--line) !important; border-radius:5px !important; box-shadow:none !important; max-width:150px; }
.refund-theme.collectfees-page .Cell input.form-control.input-sm:focus{ border-color:var(--brand) !important; outline:0; box-shadow:0 0 0 2px var(--brand-light) !important; }

/* Fine Amount + Paid Amount inputs = SAME as FeesRefundTransaction .frr-amt (white, no yellow) */
.refund-theme.collectfees-page .Cell input.form-control.input-sm.text-red:not(:disabled){ background-color:var(--surface) !important; background-image:none !important; color:var(--ink) !important; font-weight:600 !important; border:1px solid var(--line) !important; border-radius:5px !important; text-align:right !important; height:30px !important; padding:5px 8px !important; width:120px; max-width:100%; }
.refund-theme.collectfees-page .Cell input.form-control.input-sm.text-red:not(:disabled):focus{ border-color:var(--brand) !important; outline:0; box-shadow:0 0 0 2px var(--brand-light) !important; }

/* header help (i) icons - subtle grey on the teal header, tooltip on hover (18-07-2026) */
.refund-theme.collectfees-page .attendance-table thead th .cf-help-ico{ color:rgba(255,255,255,.62) !important; font-size:11px; margin-left:4px; cursor:help; vertical-align:baseline; }
.refund-theme.collectfees-page .attendance-table thead th .cf-help-ico:hover{ color:#fff !important; }

/* fee table: single-line headers -> tighten horizontal padding so 12 cols fit without scroll */
.refund-theme.collectfees-page .cf-fee-table thead th, .refund-theme.collectfees-page .cf-fee-table tbody td, .refund-theme.collectfees-page .cf-fee-table tfoot td{ padding-left:8px !important; padding-right:8px !important; }
.refund-theme.collectfees-page .cf-fee-table thead th .cf-help-ico{ margin-left:3px; }

/* Group by Fee Component toolbar (right-aligned above fee grid) */
.refund-theme.collectfees-page .cf-grid-toolbar{ display:flex; justify-content:flex-end; align-items:center; padding:4px 2px 8px; }

/* empty-value dash: centered in the cell */
.refund-theme.collectfees-page .cf-fee-table td .cf-dash, .refund-theme.collectfees-page .cf-txn-table td .cf-dash{ display:block; text-align:center; color:var(--muted); }

/*  PENALTY CELL: the amount box with its undo icon beside it.
    `justify-content:flex-end` because this is a MONEY column - the box has to stay on the same
    right edge as Fee Amount / Outstanding / Paying Now above and below it, or the eye loses the
    column. The undo sits to the LEFT of the box for the same reason: hanging it off the right
    would push the input inwards on the one row being edited and break that alignment exactly
    when the cashier is looking at it.
    `min-width:0` on the input so a flex item does not inherit an <input>'s ~20-character
    intrinsic minimum and widen the narrowest column in an 11-column money grid. */
.refund-theme.collectfees-page .cf-fine-cell{
  display:flex; align-items:center; justify-content:flex-end; gap:5px;
}
.refund-theme.collectfees-page .cf-fine-cell .frr-amt{ flex:0 1 auto; min-width:0; }
/*  Quiet until hovered: it appears on every row whose penalty has been touched, and a coloured
    icon repeated down the column would read as a warning about the amount rather than an undo. */
.refund-theme.collectfees-page .cf-fine-reset{
  flex:0 0 auto; cursor:pointer; font-size:11px; color:var(--muted); padding:2px;
}
.refund-theme.collectfees-page .cf-fine-reset:hover{ color:var(--brand); }

/* (REMOVED) .cf-groupby-tab - the two rules that positioned "Group by Fee Component" inside the tab
   strip. The control moved onto the Fee Details card header, where the COMMON `.frr-cardhead.spread`
   handles the right-alignment, so there is nothing page-specific left to declare. */

/* Collect Fees tabs: theme the active tab (top line + colour) with brand instead of AdminLTE blue */
.refund-theme.collectfees-page .nav-tabs-custom{ box-shadow:none; }
.refund-theme.collectfees-page .nav-tabs-custom > .nav-tabs > li.active{ border-top-color:var(--brand) !important; }
.refund-theme.collectfees-page .nav-tabs-custom > .nav-tabs > li.active > a,
.refund-theme.collectfees-page .nav-tabs-custom > .nav-tabs > li.active > a:hover,
.refund-theme.collectfees-page .nav-tabs-custom > .nav-tabs > li.active > a:focus{ color:var(--brand-dark) !important; font-weight:600; background:var(--surface); }
.refund-theme.collectfees-page .nav-tabs-custom > .nav-tabs > li > a{ color:var(--muted); }
.refund-theme.collectfees-page .nav-tabs-custom > .nav-tabs > li > a:hover{ color:var(--brand-dark) !important; background:var(--head-tint); }
.refund-theme.collectfees-page .nav-tabs-custom > .nav-tabs > li.active > a > i{ color:var(--brand) !important; }

/* the <switch> toggle skin is COMMON now - see "TOGGLE SWITCH" in the buttons section */

/* TOTAL cells under input columns align with the input number (not the input box edge) */
.refund-theme.collectfees-page .cf-fee-table tfoot td.cf-tot-inputcol{ padding-right:17px !important; }

/* Collect Fees badge in search bar (locked-field style like Refund page academic year) */
.refund-theme.collectfees-page .cf-ay{ flex:0 0 auto; }
.refund-theme.collectfees-page .cf-ay .frr-lbl{ white-space:nowrap; }
.refund-theme.collectfees-page .cf-ay .frr-lbl .fa-money{ color:var(--brand); margin-right:2px; }

/* search input: match Fees Refund Request medium weight (500) incl. placeholder */
.refund-theme.collectfees-page .frr-search-field .form-control{ font-weight:500 !important; }

/* Transactions section = same control styling as FeesRefundTransaction Section 4 (form-control, not input-sm/bold) */
.refund-theme.collectfees-page .cf-txn-table td .form-control{ height:34px !important; font-weight:500 !important; box-shadow:none !important; font-size:13px; }
.refund-theme.collectfees-page .cf-txn-table td input.form-control{ padding:6px 10px !important; min-width:120px; }
.refund-theme.collectfees-page .cf-txn-table td select.form-control{ min-width:140px; }

/* --- Transaction Payment Type / Bank: themed select2 (cf-select2 directive) --- */
/* The select2 container height should match the Section-4 controls (34px). */
.refund-theme.collectfees-page .cf-txn-table td .select2-container{ min-width:140px; }
.refund-theme.collectfees-page .cf-txn-table td .select2-container--default .select2-selection--single{ height:34px !important; }
.refund-theme.collectfees-page .cf-txn-table td .select2-container--default .select2-selection--single .select2-selection__rendered{ line-height:34px; font-size:13px; }
.refund-theme.collectfees-page .cf-txn-table td .select2-container--default .select2-selection--single .select2-selection__arrow{ height:32px; }
/* select2 validation bridge: the original <select> is hidden by select2, so
   mirror the .redBackColor invalid state onto the visible select2 box. */
.refund-theme.collectfees-page select.redBackColor + .select2-container .select2-selection--single{ background-color:#FEF1EC !important; border:1px solid #CD0A0A !important; }

/* --- Transactions: Fee Head left-aligned + grey clickable info icon (full name) --- */
.refund-theme.collectfees-page .cf-txn-table th.cf-txn-fh-h,
.refund-theme.collectfees-page .cf-txn-table td.cf-txn-fh{ text-align:left !important; }
.refund-theme.collectfees-page .cf-txn-table td.cf-txn-fh .hd{ font-weight:600; color:var(--ink); }
.refund-theme.collectfees-page .cf-txn-table td.cf-txn-fh .cf-fh-ico{ color:var(--muted); cursor:pointer; margin-left:6px; font-size:12.5px; vertical-align:middle; }
.refund-theme.collectfees-page .cf-txn-table td.cf-txn-fh .cf-fh-ico:hover{ color:var(--brand); }
/* Amount column: plain black bold (match Section 4 Release Amount), never theme colour. */
.refund-theme.collectfees-page .cf-txn-table td b{ color:#000 !important; font-weight:700; }

/* Space between the fee grid and the Transactions section (clean gap, like the
   reference page's inter-section spacing) — the fee grid isn't a .box so there
   was no margin separating it from this card. */
.refund-theme.collectfees-page .cf-txn-box{ margin-top:18px !important; }

/* Section 2 redesigned as a 'Confirm & Generate' card (like FeesRefundTransaction Section 5) */
.refund-theme.collectfees-page .cf-confirm-box{ margin-top:18px !important; }
.refund-theme.collectfees-page .cf-confirm-fields{ margin-top:16px; align-items:flex-start; }
.refund-theme.collectfees-page .cf-confirm-fields .frr-fld textarea.form-control{ resize:vertical; min-height:40px; }
.refund-theme.collectfees-page .cf-rcpt-datefld{ flex:0 0 220px; max-width:220px; }
.refund-theme.collectfees-page .cf-confirm-foot{ justify-content:center !important; margin-top:16px; }

/* Headers: use the theme typeface (Segoe UI) everywhere, matching the Refund page.
   AdminLTE defaults h1-h6 to 'Source Sans Pro', which made some headers (the
   Receipt Modification h3 and the modal titles) render in a different font. */
.refund-theme.collectfees-page h1,
.refund-theme.collectfees-page h2,
.refund-theme.collectfees-page h3,
.refund-theme.collectfees-page h4,
.refund-theme.collectfees-page h5,
.refund-theme.collectfees-page h6,
.refund-theme.collectfees-page .modal-title,
.refund-theme.collectfees-page .box-title{ font-family:"Segoe UI",Roboto,Arial,sans-serif !important; }

/* Bold section-header titles on Collect Fees (Payment Details / Confirm & Generate)
   so they read as strongly as the numbered Refund headers, without the badge. */
.refund-theme.collectfees-page .box-header.frr-ch .frr-cardtitle{ font-weight:700 !important; } /* cf-bold-cardtitle */

/* Fast-collect pinned action bar (sticks to the bottom of the viewport so the cashier can collect
   without scrolling down to the button).

   THE GEOMETRY IS NO LONGER REPEATED HERE. This block used to restate the whole fixed-bar rule -
   position/left/right/bottom/z-index/flex/padding/background/border/shadow - duplicating the common
   `.rt-stickybar` component further down the file, whose own comment already claimed .cf-stickybar as
   an alias. It never was one: .cf-stickybar was missing from both the base rule AND the
   `body.sidebar-collapse ... { left:50px }` rule. So when the side menu was collapsed every other
   sticky bar in the ERP moved to 50px and this one stayed pinned at 230px, and its stale z-index:1000
   let it paint over the hover-expanded menu. Exactly the drift that duplicating a component invites.
   .cf-stickybar is now listed on the common rules and inherits every fix automatically. */
/* leave room so the fixed bar never covers the last content */
.refund-theme.collectfees-page{ padding-bottom:66px; }
.refund-theme.collectfees-page .cf-sb-payonline{ margin-left:2px; }
/* standalone remark (Confirm & Generate box removed) */
.refund-theme.collectfees-page .cf-remark-standalone{ margin-top:14px; padding:0 2px; }
.refund-theme.collectfees-page .cf-sb-info{ display:flex; align-items:baseline; gap:10px; margin-right:auto; }
.refund-theme.collectfees-page .cf-sb-lbl{ font-size:11px; text-transform:uppercase; letter-spacing:.3px; color:var(--muted); font-weight:600; }
.refund-theme.collectfees-page .cf-sb-amt{ font-size:20px; font-weight:800; color:var(--brand-dark); }
.refund-theme.collectfees-page .cf-sb-sub{ font-size:11.5px; color:var(--muted); }
.refund-theme.collectfees-page .cf-sb-actions{ display:flex; align-items:center; gap:10px; }
.refund-theme.collectfees-page .cf-sb-hint{ font-size:10.5px; color:var(--muted); background:var(--row-alt); border:1px solid var(--line); border-radius:5px; padding:2px 7px; letter-spacing:.3px; }

/* Footer bar: compact Receipt Date field */
.refund-theme.collectfees-page .cf-sb-date{ display:flex; flex-direction:row; align-items:center; gap:8px; }
.refund-theme.collectfees-page .cf-sb-date > label{ margin:0; font-size:10.5px; text-transform:uppercase; letter-spacing:.3px; color:var(--muted); font-weight:600; white-space:nowrap; }
.refund-theme.collectfees-page .cf-sb-date .form-control{ height:34px !important; width:150px; padding:6px 10px !important; font-weight:600; }
/* Collapsible remarks toggle (remarks are rarely used, hidden by default) */
.refund-theme.collectfees-page .cf-remark-toggle{ margin-bottom:2px; }
.refund-theme.collectfees-page .cf-remark-toggle a{ font-size:12.5px; font-weight:600; color:var(--brand-dark); text-decoration:none; cursor:pointer; }
.refund-theme.collectfees-page .cf-remark-toggle a:hover{ color:var(--brand); }
.refund-theme.collectfees-page .cf-remark-toggle a i{ margin-right:5px; color:var(--brand); }
.refund-theme.collectfees-page .cf-confirm-fields{ margin-top:10px; }

/* Collapsible student card: slim name row + eye toggle; details expand on click */
.refund-theme.collectfees-page .cf-stu-head{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:9px 16px; }
.refund-theme.collectfees-page .cf-stu-head-id{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; min-width:0; }
.refund-theme.collectfees-page .cf-stu-head .cf-stu-name{ font-size:16px; font-weight:700; color:var(--ink); line-height:1.2; }
.refund-theme.collectfees-page .cf-stu-toggle{ flex:0 0 auto; display:inline-flex; align-items:center; gap:6px; background:var(--brand-light); color:var(--brand-dark); border:1px solid var(--brand); border-radius:6px; padding:5px 12px; font-size:12px; font-weight:600; cursor:pointer; white-space:nowrap; }
.refund-theme.collectfees-page .cf-stu-toggle:hover{ background:var(--brand); color:var(--on-brand); }
.refund-theme.collectfees-page .cf-stu-toggle i{ font-size:12px; }
.refund-theme.collectfees-page .cf-stu-body{ display:flex; align-items:center; gap:22px; padding:12px 16px 14px; border-top:1px solid var(--line); }
.refund-theme.collectfees-page .cf-stu-body .cf-stu-id{ padding-right:22px; border-right:1px solid var(--line); }

/* Filters toggle in the toolbar (collapse the Class/Month/Component/Status/Pay-Against row) */
.refund-theme.collectfees-page .cf-filters-toggle-wrap{ display:flex; flex-direction:column; justify-content:flex-end; }
.refund-theme.collectfees-page .cf-filters-toggle{ display:inline-flex; align-items:center; gap:6px; background:var(--brand-light); color:var(--brand-dark); border:1px solid var(--brand); border-radius:6px; padding:8px 14px; font-size:12.5px; font-weight:600; cursor:pointer; white-space:nowrap; height:38px; }
.refund-theme.collectfees-page .cf-filters-toggle:hover{ background:var(--brand); color:var(--on-brand); }
.refund-theme.collectfees-page .cf-filters{ margin-top:12px; }

/* cf-sb-payonline outline (themed secondary, replaces the red) + Ctrl+Enter info icon */
.refund-theme.collectfees-page .cf-sb-payonline{ background:var(--surface) !important; color:var(--brand-dark) !important; border:1px solid var(--brand) !important; }
.refund-theme.collectfees-page .cf-sb-payonline:hover{ background:var(--brand) !important; color:var(--on-brand) !important; border-color:var(--brand) !important; }
.refund-theme.collectfees-page .cf-sb-info-ico{ color:var(--muted) !important; cursor:help; font-size:15px; margin-left:2px; }
.refund-theme.collectfees-page .cf-sb-info-ico:hover{ color:var(--brand) !important; }

/* Fee Structure tab: professional table (striped rows, hover, emphasized total, money colors) */
.refund-theme.collectfees-page .cf-structure-table tbody td{ padding:10px 14px !important; font-size:13px; }
.refund-theme.collectfees-page .cf-structure-table td.text-right{ font-variant-numeric:tabular-nums; }
.refund-theme.collectfees-page .cf-structure-table tbody tr:nth-child(even){ background:var(--row-alt); }
.refund-theme.collectfees-page .cf-structure-table tbody tr:hover{ background:var(--brand-light); }
/*  Total row (last) emphasised as a summary bar - ONLY on a table that HAS a total.

    `.cf-has-total` is the gate, and it has to be. Two tabs share `.cf-structure-table`:
    Fee Structure, whose last row genuinely is a total (the server appends it as data -
    Class "-", FeeComponentName "<b>Total Fees</b>"), and Credit Details, whose last row
    is just the last credit. Keying on `tr:last-child` alone gave Credit Details a 2px
    brand-coloured rule and a shaded bar across an ordinary row, so the final credit read
    as a total that does not exist - reported 31-08-2026.

    Left as `tr:last-child` rather than a class on the row itself because the total is a
    normal ng-repeat item; there is no per-row hook to hang a class on without changing
    what the SP returns. Gating at the TABLE is the smallest change that tells the two
    apart, and it fails safe: a table that forgets the class simply gets no total bar. */
.refund-theme.collectfees-page .cf-structure-table.cf-has-total tbody tr:last-child{ background:var(--surface-2); border-top:2px solid var(--brand); }
.refund-theme.collectfees-page .cf-structure-table.cf-has-total tbody tr:last-child:hover{ background:var(--surface-2); }
.refund-theme.collectfees-page .cf-structure-table.cf-has-total tbody tr:last-child td{ font-weight:700; padding-top:12px !important; padding-bottom:12px !important; }

/* cf-structure-table black amounts: keep every value in standard black */
.refund-theme.collectfees-page .cf-structure-table tbody td,
.refund-theme.collectfees-page .cf-structure-table tbody td *{ color:var(--ink) !important; }

/* Class column header: left align (override themed centered header) */
.refund-theme.collectfees-page .cf-structure-table thead th:first-child{ text-align:left !important; }

/* Fee grid: bordered rounded card look (matches the Payment Details box) */
.refund-theme.collectfees-page .cf-fee-wrap{ border:1px solid var(--line) !important; border-radius:8px !important; box-shadow:var(--shadow) !important; margin-bottom:4px; }

/* Fee Structure card: inset from tab edges (match box-body padding) + clip so all 4 corners/borders render */
.refund-theme.collectfees-page #feeInfo .cf-fee-box{ overflow:hidden !important; width:auto !important; box-sizing:border-box !important; margin:14px 16px 16px !important; }
.refund-theme.collectfees-page #feeInfo .cf-fee-box .attendance_table_scroll{ border-radius:0 !important; }

/* Transactions Details (receipts) card: inset + scroll-safe rounded corners */
.refund-theme.collectfees-page #receipts .cf-receipts-box{ width:auto !important; box-sizing:border-box !important; margin:14px 16px 16px !important; overflow:visible !important; }
.refund-theme.collectfees-page .cf-receipts-head{ display:flex; align-items:center; justify-content:space-between; gap:12px; }
.refund-theme.collectfees-page .cf-active-filter{ margin:0; font-size:12px; font-weight:600; color:var(--muted); display:inline-flex; align-items:center; gap:6px; cursor:pointer; }
.refund-theme.collectfees-page .cf-receipts-box .box-header{ border-top-left-radius:8px; border-top-right-radius:8px; }
.refund-theme.collectfees-page .cf-receipts-box .attendance_table_scroll{ border-bottom-left-radius:8px; border-bottom-right-radius:8px; }
/* professional receipts table: striped rows + hover (cancelled rows keep their own colour) */
.refund-theme.collectfees-page .cf-receipts-table tbody td{ padding:10px 12px !important; font-size:12.5px; }
.refund-theme.collectfees-page .cf-receipts-table td.text-right{ font-variant-numeric:tabular-nums; }
.refund-theme.collectfees-page .cf-receipts-table tbody tr:nth-child(even):not(.cancelColor){ background:var(--row-alt); }
.refund-theme.collectfees-page .cf-receipts-table tbody tr:not(.cancelColor):hover{ background:var(--brand-light); }

/* Transactions tab: active-records filter bar above the Receipt/Voucher cards */
.refund-theme.collectfees-page .cf-txn-topbar{ display:flex; justify-content:flex-end; padding:4px 16px 0; }

/* Transactions action cell: keep both buttons side-by-side so rows stay compact */
.refund-theme.collectfees-page .cf-receipts-table tbody td:last-child{ white-space:nowrap; }
.refund-theme.collectfees-page .cf-receipts-table tbody td:last-child .rt-ico,
.refund-theme.collectfees-page .cf-receipts-table tbody td:last-child .rt-btn{ display:inline-flex !important; vertical-align:middle; margin:0 2px !important; }

/* Cancel/Delete-payment popups (NewSPR modals) -> common refund brand header (was dark navy) */
.refund-theme.collectfees-page .NewSPR .modal-content .modal-header{ background:var(--brand) !important; background-image:none !important; border-bottom:none !important; border-radius:8px 8px 0 0 !important; }
.refund-theme.collectfees-page .NewSPR .modal-content .modal-header .modal-title,
.refund-theme.collectfees-page .NewSPR .modal-content .modal-header .modal-title b,
.refund-theme.collectfees-page .NewSPR .modal-content .modal-header .modal-title strong,
.refund-theme.collectfees-page .NewSPR .modal-content .modal-header .close{ color:var(--on-brand) !important; opacity:1; text-shadow:none !important; }
.refund-theme.collectfees-page .NewSPR .modal-content .modal-header .close:hover{ opacity:.85; }

/* Common alert styling for Cancel/Delete popups (smaller font, themed choice buttons) */
.refund-theme.collectfees-page .NewSPR .modal-content{ border-radius:10px; overflow:hidden; }
.refund-theme.collectfees-page .NewSPR .modal-body{ padding:18px 20px; }
.refund-theme.collectfees-page .NewSPR .modal-body .custom-message{ font-size:13.5px !important; color:var(--ink) !important; line-height:1.55 !important; margin:0; }
.refund-theme.collectfees-page .NewSPR .custom-amount{ color:var(--brand-dark) !important; font-weight:700 !important; }
.refund-theme.collectfees-page .NewSPR .custom-warning-icon{ font-size:22px !important; color:var(--warn) !important; }
.refund-theme.collectfees-page .NewSPR .modal-footer{ display:flex !important; flex-direction:row !important; gap:10px; border-top:1px solid var(--line); padding:14px 16px; }
.refund-theme.collectfees-page .NewSPR .modal-footer .custom-action-btn{ flex:1; font-size:13px !important; font-weight:600 !important; line-height:1.3 !important; padding:11px 14px !important; border:1px solid var(--line) !important; border-radius:8px !important; background:var(--surface) !important; color:var(--ink) !important; margin:0 !important; box-shadow:none !important; }
.refund-theme.collectfees-page .NewSPR .modal-footer .custom-action-btn strong{ font-size:13px !important; font-weight:600 !important; }
.refund-theme.collectfees-page .NewSPR .modal-footer .custom-action-btn:hover{ background:var(--brand-light) !important; border-color:var(--brand) !important; color:var(--brand-dark) !important; }
.refund-theme.collectfees-page .NewSPR .modal-footer .custom-action-btn .float-right{ color:var(--muted); font-weight:700; }
.refund-theme.collectfees-page .NewSPR .modal-footer .custom-action-btn:hover .float-right{ color:var(--brand); }

/* Cancel/Delete popups: clean white X (no grey box) + drop the orange body icon */
.refund-theme.collectfees-page .NewSPR .modal-header .close{ background:transparent !important; background-color:transparent !important; border:none !important; box-shadow:none !important; opacity:1 !important; color:var(--on-brand) !important; text-shadow:none !important; font-size:24px !important; line-height:1 !important; width:auto !important; height:auto !important; min-width:0 !important; padding:0 4px !important; margin:0 !important; }
.refund-theme.collectfees-page .NewSPR .modal-header .close span,
.refund-theme.collectfees-page .NewSPR .modal-header .close i{ color:var(--on-brand) !important; }
.refund-theme.collectfees-page .NewSPR .modal-header .close:hover{ opacity:.8 !important; background:transparent !important; }
.refund-theme.collectfees-page .NewSPR .custom-icon-container .col-lg-1{ display:none !important; }
.refund-theme.collectfees-page .NewSPR .custom-icon-container .col-lg-10{ width:100% !important; }
.refund-theme.collectfees-page .NewSPR .custom-warning-icon{ display:none !important; }
/* Delete Payment reason modal: tidy buttons */
.refund-theme.collectfees-page #cancelPopUpReason .modal-footer{ display:flex !important; justify-content:flex-end; gap:10px; border-top:1px solid var(--line); }

/* Delete Payment reason modal: compact, clean layout */
.refund-theme.collectfees-page #cancelPopUpReason .cf-del-dialog{ width:440px !important; max-width:calc(100% - 30px) !important; }
.refund-theme.collectfees-page #cancelPopUpReason .modal-body{ padding:18px 20px 6px; }
.refund-theme.collectfees-page #cancelPopUpReason .cf-del-reason{ margin-bottom:6px; }
.refund-theme.collectfees-page #cancelPopUpReason .cf-del-reason label{ display:block; font-size:11.5px; font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:.3px; margin-bottom:6px; }
.refund-theme.collectfees-page #cancelPopUpReason .modal-footer{ display:flex !important; justify-content:flex-end; gap:10px; border-top:1px solid var(--line); padding:12px 16px !important; margin:0 !important; }
.refund-theme.collectfees-page #cancelPopUpReason .modal-footer .rt-btn{ margin:0 !important; }

/* Dissociate/confirm popups: proper message text (was uppercased label) + compact footer */
.refund-theme.collectfees-page .NewSPR .cf-del-dialog{ width:440px !important; max-width:calc(100% - 30px) !important; }
.refund-theme.collectfees-page .NewSPR .cf-del-msg{ font-size:13.5px !important; color:var(--ink) !important; font-weight:400 !important; line-height:1.55 !important; text-transform:none !important; letter-spacing:normal !important; margin:0; }
.refund-theme.collectfees-page #cancelConfirmToPopUp .modal-body{ padding:18px 20px 6px; }
.refund-theme.collectfees-page #cancelConfirmToPopUp .modal-footer{ display:flex !important; justify-content:flex-end; gap:10px; border-top:1px solid var(--line); padding:12px 16px !important; margin:0 !important; }
.refund-theme.collectfees-page #cancelConfirmToPopUp .modal-footer .rt-btn{ margin:0 !important; }

/* Cancel section header dropdown (Receipt/Voucher) */
.refund-theme.collectfees-page .cf-cancel-type{ width:auto !important; min-width:130px !important; height:32px !important; padding:4px 10px !important; font-size:12.5px !important; font-weight:600; }

.refund-theme.collectfees-page .cf-norec{ text-align:center !important; color:var(--muted) !important; padding:16px !important; font-style:italic; font-weight:400 !important; }
/* Empty-state placeholder for tab tables (replaces the old inline lightgray bar). */
.refund-theme.collectfees-page .cf-emptybox{ text-align:center !important; color:var(--muted) !important; background:var(--surface) !important; border:1px dashed var(--line) !important; border-radius:8px !important; padding:22px 16px !important; margin-top:8px !important; font-weight:600 !important; font-size:13.5px !important; letter-spacing:.2px; }

/* Cancel section header: keep title left + Receipt/Voucher dropdown on the right */
.refund-theme.collectfees-page .cf-cancel-box .box-header.frr-ch.cf-receipts-head{ display:flex !important; flex-direction:row !important; align-items:center !important; justify-content:space-between !important; flex-wrap:nowrap !important; gap:0 !important; }
.refund-theme.collectfees-page .cf-cancel-box .cf-receipts-head .frr-cardhead{ flex:0 0 auto !important; width:auto !important; }
.refund-theme.collectfees-page .cf-cancel-box .cf-cancel-type{ margin-left:auto !important; flex:0 0 auto !important; }
/* Cancel dropdown rendered as themed select2 (matches the refund rt-select): compact + right-aligned */
.refund-theme.collectfees-page .cf-cancel-box .cf-receipts-head .select2-container{ width:auto !important; min-width:150px !important; margin-left:auto !important; flex:0 0 auto !important; }
.refund-theme.collectfees-page .cf-cancel-box .cf-receipts-head .select2-container--default .select2-selection--single{ height:32px !important; }
.refund-theme.collectfees-page .cf-cancel-box .cf-receipts-head .select2-container--default .select2-selection--single .select2-selection__rendered{ line-height:30px !important; font-weight:600; }
.refund-theme.collectfees-page .cf-cancel-box .cf-receipts-head .select2-container--default .select2-selection--single .select2-selection__arrow{ height:30px !important; }

/* =====================================================================
   ADMISSION INQUIRY - dropdowns (select2/rt-select) + quick-filter bar
   Scoped to .admissioninquiry-page, same pattern as .collectfees-page.
   Round theme: every dropdown/textbox/textarea on this page shares the
   same 5px radius as the rest of the refund theme (rt-btn, frr-search,
   box, etc.) - no pill / floating-label shapes from NewFormCSS remain.
   ===================================================================== */
/* nested .box-body zeroing is COMMON now - see "NESTED .box-body" near the top of this file */
/* Header layout: row 1 = title + action buttons only (frr-toolbar, one line, nothing else competes
   with the buttons for space). Row 2 = every filter together (Academic Year, Admitted, Enquiry Status),
   left-aligned under the title, all sharing one flex row so they read as one filter bar instead of the
   title row looking cramped. Enquiry Status (variable chip count) flexes to fill the remaining width
   instead of being squeezed into a fixed slot next to the others. */
.refund-theme.admissioninquiry-page .frr-toolbar{ flex-wrap:wrap; row-gap:10px; }
.refund-theme.admissioninquiry-page .aiq-filters-row2{ display:flex; align-items:flex-end; gap:14px; flex-wrap:wrap; padding:0 16px 14px; }
.refund-theme.admissioninquiry-page .aiq-filters-row2 .frr-fld:last-child{ flex:1 1 260px; min-width:220px; max-width:560px; }
.refund-theme.admissioninquiry-page .aiq-filters-row2 .select2-container{ width:100% !important; }
.refund-theme.admissioninquiry-page .aiq-filters .frr-fld{ min-width:0; flex:0 0 auto; }

/* Site-wide modalCustom.css ships a plain `.modal-header{background:#777f96}` rule that, on this
   page's two legacy modals (AdmissionInquirySerach / ppFollowUpMaster), was winning over the generic
   `.refund-theme .modal-header{background:var(--brand)}` - marked `.aiq-modal` in the view, forced
   brand here with !important so it can never lose that fight again. */
/* padding pinned to the same 12px/16px the reference Filter popup uses - these legacy modals carry the
   NewSPR skin, whose own .modal-header padding was making this header taller than #FeesRefundSearch's. */
.refund-theme.admissioninquiry-page .aiq-modal .modal-header{ background:var(--brand) !important; background-image:none !important; color:var(--on-brand) !important; display:flex !important; align-items:center !important; padding:12px 16px !important; min-height:0 !important; }
.refund-theme.admissioninquiry-page .aiq-modal .modal-header .close,
.refund-theme.admissioninquiry-page .aiq-modal .modal-header .close_custom{ color:var(--on-brand) !important; opacity:1 !important; }
/* header is now flex, so title takes the remaining space and the X is pinned to the far right -
   same as #FeesRefundSearch / .frr-detailpop everywhere else in the theme. */
/* Match #FeesRefundSearch's title/close sizing exactly - the generic h4.modal-title default (~18-20px,
   bold) was rendering much bigger than every other themed Filter/Cancel popup in the app. */
.refund-theme.admissioninquiry-page .aiq-modal .modal-header .modal-title{ margin:0 !important; text-align:left !important; flex:1 1 auto; font-size:14.5px; font-weight:600; letter-spacing:.2px; line-height:1.4; }
.refund-theme.admissioninquiry-page .aiq-modal .modal-header .close_custom{ margin-left:auto !important; background:transparent; border:none; font-size:17px; line-height:1; cursor:pointer; padding:0; opacity:.9; }
.refund-theme.admissioninquiry-page .aiq-modal .modal-header .close_custom:hover{ opacity:1; }
/* Add Interaction's header wraps title+close in an extra .model_head div (unlike the Filter modal,
   where they're direct children of .modal-header) - margin-left:auto on the close button only works
   if ITS OWN parent is flex, so .model_head itself needs the same treatment as .modal-header above. */
.refund-theme.admissioninquiry-page .aiq-modal .modal-header .model_head{ display:flex; align-items:center; width:100%; }
.refund-theme.admissioninquiry-page .aiq-modal .modal-header .model_head > span{ flex:1 1 auto; font-size:14.5px; font-weight:600; letter-spacing:.2px; line-height:1.4; }
.refund-theme.admissioninquiry-page .aiq-modal .modal-body{ padding:16px 18px 4px !important; }

/* (select2 sizing for this page now lives in the COMMON block near the top of this file - see
   "COMMON FIELD SIZE". Nothing page-scoped here, so AdmissionInquiry and the reference pages are
   rendered by the exact same rules and cannot drift apart again.) */
/* (multi-select tag chips are also COMMON now - see the chip rules in the COMMON FIELD SIZE block.) */
/* ---------------------------------------------------------------------------
   PLACEHOLDERS FOR MODAL DROPDOWNS - CSS ONLY (no JS, per the standing rule)
   ---------------------------------------------------------------------------
   WHY select2's own placeholder never appears on these: the `.rt-select` upgrade in _Layout.cshtml
   runs once on document-ready, when these selects are inside a hidden modal and the ng-options ones
   have no <option> elements yet (their lists arrive later, per record, over HTTP). select2 decides
   "is there an empty option here worth showing a placeholder for?" at INIT TIME only and never
   revisits it. Angular compounds it by leaving its own `? undefined:undefined ?` unknown-option
   selected, which select2 reads as a real selection that merely has blank text.

   THE CSS HOOK: select2 gives the visible text span a predictable id - `select2-<selectId>-container`
   - so each box can be addressed directly, and `:empty` is true precisely when select2 rendered no
   text at all (i.e. nothing is selected). A chosen value fills the span, `:empty` stops matching, and
   the placeholder disappears on its own. Purely visual: no JS, no effect on value/validation.

   Adding a new field: give the <select> an id and add one line here. Keep the text identical to the
   field's own data-placeholder so the markup stays self-documenting. */
/* TWO empty states have to be covered, which is why each field below is listed twice:
     a) the rendered span is genuinely EMPTY  -> `:empty::after`
     b) select2 DID create a `.select2-selection__placeholder` child but with no text in it (this is
        what happens on these modal fields: select2 initialised while the modal was hidden and the
        ng-options list was still empty, so it built the placeholder element but had no label to put
        in it). The parent is then NOT `:empty`, so rule (a) never fires - the box just looks blank.
        `.select2-selection__placeholder:empty::after` catches that case. */
/* FIRST, UN-HIDE THEM. NewFormCSS.css contains:
       .select2-container .select2-selection__placeholder      { opacity:0 !important }
       .select2-container--open .select2-selection__placeholder { opacity:0 !important }
   i.e. select2 placeholders are NEVER visible on any page that links that stylesheet - which includes
   AdmissionInquiry and AdmissionDetails. select2 was building the placeholder correctly all along; it
   was simply painted at zero opacity, which is why data-placeholder appeared to do nothing.
   This override is COMMON (not page-scoped) so every current and future refund-theme page gets it. */
.refund-theme .select2-container .select2-selection__placeholder,
.refund-theme .select2-container--focus .select2-selection__placeholder,
.refund-theme .select2-container--open .select2-selection__placeholder{
  opacity:1 !important; color:var(--muted) !important;
}
/* input/textarea placeholders are hidden by the same stylesheet (`.input-container .text::placeholder
   {opacity:0}` - shown only on focus). Also un-hidden theme-wide. */
.refund-theme .input-container .text::placeholder,
.refund-theme .input-container input::placeholder,
.refund-theme .input-container textarea::placeholder{ opacity:1 !important; color:var(--muted) !important; }

.refund-theme .select2-selection__rendered:empty::after,
.refund-theme .select2-selection__rendered .select2-selection__placeholder:empty::after{ color:var(--muted); font-weight:400; }
/* Add Interaction modal */
.refund-theme #select2-isIntreaction-container:empty::after,
.refund-theme #select2-isIntreaction-container .select2-selection__placeholder:empty::after{ content:"Select Interaction Medium"; }
.refund-theme #select2-isReachable-container:empty::after,
.refund-theme #select2-isReachable-container .select2-selection__placeholder:empty::after{ content:"Select"; }
.refund-theme #select2-drpFwpInquiryStatusId-container:empty::after,
.refund-theme #select2-drpFwpInquiryStatusId-container .select2-selection__placeholder:empty::after{ content:"Select Enquiry Status"; }
.refund-theme #select2-isinteraction-container:empty::after,
.refund-theme #select2-isinteraction-container .select2-selection__placeholder:empty::after{ content:"Select"; }
/* Filter modal */
.refund-theme #select2-isEmailSent-container:empty::after,
.refund-theme #select2-isEmailSent-container .select2-selection__placeholder:empty::after{ content:"All"; }
.refund-theme #select2-isDirectFormSell-container:empty::after,
.refund-theme #select2-isDirectFormSell-container .select2-selection__placeholder:empty::after{ content:"Select"; }
.refund-theme #select2-isRegistraction-container:empty::after,
.refund-theme #select2-isRegistraction-container .select2-selection__placeholder:empty::after{ content:"Select"; }
.refund-theme #select2-isSourceForm-container:empty::after,
.refund-theme #select2-isSourceForm-container .select2-selection__placeholder:empty::after{ content:"Select"; }
/* Page header filters */
.refund-theme #select2-drpAcademicYearId-container:empty::after,
.refund-theme #select2-drpAcademicYearId-container .select2-selection__placeholder:empty::after,
/* RegistrationInquiry / ManageRegistration spell the same field `drpAcademicYearIds` (trailing s) */
.refund-theme #select2-drpAcademicYearIds-container:empty::after,
.refund-theme #select2-drpAcademicYearIds-container .select2-selection__placeholder:empty::after{ content:"Select Academic Year"; }
.refund-theme #select2-isAdmitted-container:empty::after,
.refund-theme #select2-isAdmitted-container .select2-selection__placeholder:empty::after{ content:"Select"; }

/* Field SIZE is not repeated here - it comes from the COMMON FIELD SIZE block near the top of this
   file, shared with every other refund-theme page. Only the two genuinely local corrections remain:

   1. Inputs inside the legacy #ppFollowUpMaster modal: NewFormCSS.css sets height/line-height with
      !important there from its viewport-scaling --field-height clamp, so the common rule alone loses.
      Values are identical to the common ones - this only re-asserts them at !important strength. */
.refund-theme.admissioninquiry-page #ppFollowUpMaster input.form-control{ height:36px !important; line-height:normal !important; padding:0 12px !important; font-size:12.5px !important; }
/* 2. The date field is readonly (users must pick from the calendar), and the theme's generic
      input[readonly] rule greys readonly fields out to look inert - wrong here, since this one is
      still an active control. Restore the normal white/clickable look and leave room for the icon. */
.refund-theme.admissioninquiry-page .frr-datewrap input.form-control{ padding-right:28px !important; background:var(--surface) !important; cursor:pointer !important; }
.refund-theme.admissioninquiry-page .frr-datewrap input.form-control.redBackColor{ border:1px solid #CD0A0A !important; background:#FEF1EC !important; }
.refund-theme.admissioninquiry-page .frr-datewrap input.form-control:focus{ border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light) !important; }
/* Validation-error red border/pink tint: MOVED TO COMMON - see "SELECT2 ERROR BOX, COMMON" near the top.
   This app marks a bad select2 field in three different ways (.myErrorClass on the container span,
   .redBackColor on the hidden <select>, .input-validation-error from jQuery Unobtrusive) and all three
   are handled there for every refund-theme page, .rt-select/.rt-multi included. Nothing page-specific. */


/* =====================================================================
   ADMISSION DETAILS  (Views/Admission/AdmissionDetails.cshtml)
   ---------------------------------------------------------------------
   This page is a long data-entry form built on the legacy NewFormCSS
   "floating label" component: `.component.input-container` wrapping an
   input plus a `.placeholder-label` that animates over it, with pill
   radii and circular blue icon badges.

   Rather than rewrite ~50 fields of markup (every one carries its own
   id / ng-model / ng-change / validation hook, so editing them all is
   pure risk for zero visual gain), the wrapper is converted HERE to the
   theme's label-above-field look. Markup changes were limited to the
   card boundaries and the action bar.

   FIELD SIZES ARE NOT REDECLARED - they come from the COMMON FIELD SIZE
   block near the top of this file. The only sizing below is for the
   legacy `input.text` elements, which do NOT carry .form-control and so
   are not reached by the common rule.
   ===================================================================== */

/* label above the field instead of floating over it. The label element comes AFTER the input in the
   DOM, so the wrapper is a flex column and the label is pulled to the top with order:-1 - no markup
   reordering needed. */
/* COMMON (not page-scoped): `.component.input-container` only exists on pages built with the legacy
   NewFormCSS floating-label component, and any such page that opts into `.refund-theme` WANTS this
   conversion. Scoping it per page meant re-declaring the whole block for every legacy form converted
   (AdmissionDetails, then RegistrationDetails, ...) - exactly the duplication the theme rules forbid. */
.refund-theme .component.input-container{
  display:flex; flex-direction:column; gap:5px; position:relative;
  /* NewFormCSS's `.component` is a flex ROW with align-items:center. Flipped to a column here, that
     same align-items:center centres every child HORIZONTALLY - which is why all the captions were
     floating in the middle of their column. stretch puts them back on the left edge, full width. */
  align-items:stretch !important;
  /* `.component{margin:6px 15px}` also inset every field from its Bootstrap column; zero the sides so
     fields line up with the card edges like every other themed page. */
  margin:0 0 14px !important;
}
.refund-theme .placeholder-label{
  order:-1;
  position:static !important; transform:none !important;
  left:auto !important; top:auto !important; width:100% !important;
  margin:0 !important; padding:0 !important; background:none !important;
  font-weight:600; color:var(--muted);
  text-transform:uppercase; letter-spacing:.3px; line-height:1.4;
  /* labels are ALWAYS left aligned */
  text-align:left !important; align-self:stretch;
  /* the floating-label rule clipped long captions to one line with an ellipsis (it had to, sitting on
     top of the input); as a static label it can wrap instead - e.g. "Student Full Name as per document
     (Birth Certificate / T.C.)" */
  white-space:normal !important; overflow:visible !important; text-overflow:clip !important;
  pointer-events:auto !important;
}
/* ---- LEGACY LABEL SIZE: needs depth + !important ----
   `font-size` is deliberately NOT set in the rule above, because it could never win there. NewFormCSS
   sizes these captions in four different places, all of which outrank a bare `.refund-theme
   .placeholder-label` (0,2,0) - it is linked FROM THE VIEW, so it loads after this file and takes any tie:
       .input-container .placeholder-label                        font-size:clamp(12px,0.9vw,15px)   (0,2,0) tie -> theirs
       .input-container.has-value .placeholder-label              font-size:clamp(11px,1.2vw,14px)   (0,3,0) beats us
       .input-container .ms-parent.ms-active ~ .placeholder-label same                               (0,3,0) beats us
       .input-container .field-set:has(.left_icon) .placeholder-label                                (0,3,0) beats us
       + @media blocks pinning 12px / 13px
   Net effect: captions rendered up to 15px - noticeably bigger than the 12.5px text in the box below
   them, and bigger than the plain `<label>` on every other themed page. Every one of those selectors is
   matched here at greater depth with !important so ONE size wins everywhere, filled or empty, focused or
   not, with or without a leading icon. Keep this in sync with `.refund-theme label`. */
.refund-theme .input-container .placeholder-label,
.refund-theme .input-container.has-value .placeholder-label,
.refund-theme .input-container .text:focus ~ .placeholder-label,
.refund-theme .input-container .ms-parent.ms-active ~ .placeholder-label,
.refund-theme .input-container .field-set .placeholder-label,
.refund-theme .input-container .field-set:has(.left_icon) .placeholder-label{
  font-size:11px !important; line-height:1.35 !important;
  color:var(--muted) !important; background:none !important; padding:0 !important;
}
.refund-theme .mandatory{ color:var(--no) !important; }

/* ---- PLACEHOLDERS MUST BE VISIBLE ----
   NewFormCSS deliberately HIDES both kinds, because the old design relied on the floating label and a
   placeholder underneath it would have shown through:
       .input-container .text::placeholder{ opacity:0 }                        (visible only on focus)
       .select2-container .select2-selection__placeholder{ opacity:0 !important } (never visible)
   Now that the label sits above the field, the placeholder is the hint INSIDE the box, so both are
   turned back on. The select2 one needs !important to beat theirs. */
/* (the opacity:0 overrides that used to sit here are now COMMON - see the placeholder block further
   down this file - so every refund-theme page benefits, not just this one.)
   Fallback for a dropdown whose placeholder span select2 never built (it initialises on document-ready,
   before ng-options has filled the list) - same `:empty::after` trick used on AdmissionInquiry. */
.refund-theme.admissiondetails-page .select2-selection__rendered:empty::after,
.refund-theme.admissiondetails-page .select2-selection__rendered .select2-selection__placeholder:empty::after{
  color:var(--muted); font-weight:400;
}
.refund-theme #select2-drpAcademicYearId-container:empty::after,
.refund-theme #select2-drpAcademicYearId-container .select2-selection__placeholder:empty::after{ content:"Select Academic Year"; }
.refund-theme #select2-drpStandardId-container:empty::after,
.refund-theme #select2-drpStandardId-container .select2-selection__placeholder:empty::after{ content:"Select Class"; }
.refund-theme #select2-isdrpGender-container:empty::after,
.refund-theme #select2-isdrpGender-container .select2-selection__placeholder:empty::after{ content:"Select Gender"; }
.refund-theme #select2-drCStateId-container:empty::after,
.refund-theme #select2-drCStateId-container .select2-selection__placeholder:empty::after{ content:"Select State"; }
.refund-theme #select2-drpCCity-container:empty::after,
.refund-theme #select2-drpCCity-container .select2-selection__placeholder:empty::after{ content:"Select City"; }
.refund-theme #select2-isReachable-container:empty::after,
.refund-theme #select2-isReachable-container .select2-selection__placeholder:empty::after{ content:"Select"; }
.refund-theme #select2-isinteraction-container:empty::after,
.refund-theme #select2-isinteraction-container .select2-selection__placeholder:empty::after{ content:"Select"; }
.refund-theme #select2-txtFQualificationoption-container:empty::after,
.refund-theme #select2-txtFQualificationoption-container .select2-selection__placeholder:empty::after,
.refund-theme #select2-txtMQualificationoption-container:empty::after,
.refund-theme #select2-txtMQualificationoption-container .select2-selection__placeholder:empty::after{ content:"Select Qualification"; }
.refund-theme #select2-txtFOccupationoption-container:empty::after,
.refund-theme #select2-txtFOccupationoption-container .select2-selection__placeholder:empty::after,
.refund-theme #select2-txtMOccupationoption-container:empty::after,
.refund-theme #select2-txtMOccupationoption-container .select2-selection__placeholder:empty::after{ content:"Select Occupation"; }

/* Some fields put the label INSIDE .field-set (next to the icons) rather than as a sibling of the
   input, so the flex/order treatment has to be applied at that level too - otherwise those labels
   render UNDER their input (e.g. Communication Mobile No., Date of Birth).
   Because the label then occupies the first row of the field-set, the inline icons can no longer be
   centred with top:50% (that would centre them against label+input together) - they are anchored to
   the bottom instead, which lands them in the middle of the 36px input regardless of label height. */
.refund-theme .field-set{ display:flex; flex-direction:column; gap:5px; }
.refund-theme .field-set .placeholder-label{ order:-1; }
.refund-theme .field-set .left_icon,
.refund-theme .field-set .right_icon{
  top:auto !important; bottom:11px !important; transform:none !important;
}

/* Legacy `input.text` / textarea: NewFormCSS sizes these with !important and a pill radius, so the
   theme's numbers have to be re-asserted at the same strength. Values are the COMMON ones (36px /
   12.5px / 5px) - kept in step by hand only because these elements lack .form-control. */
.refund-theme input.text{
  width:100%; height:36px !important; padding:0 12px !important;
  font-size:12.5px !important; line-height:normal !important; color:var(--ink) !important;
  border:1px solid var(--line) !important; border-radius:5px !important;
  background:var(--surface) !important; box-shadow:none !important;
}
/* textarea shares the border/colour/type but NOT the fixed height - see the auto-grow block below */
.refund-theme textarea.text{
  width:100%; font-size:12.5px !important; color:var(--ink) !important;
  border:1px solid var(--line) !important; border-radius:5px !important;
  background:var(--surface) !important; box-shadow:none !important;
}
/* Legacy `textarea.text` (no .form-control) still needs its width/padding here; the auto-grow behaviour
   and the no-!important height rule are COMMON now - see the AUTO-GROW block near the top of this file. */
.refund-theme .input-container textarea.text,
.refund-theme .input-container textarea.auto-grow{
  width:100% !important; height:auto; min-height:36px;
  padding:8px 12px !important; line-height:1.5;
}
/* Safety net: any select on this page that is NOT select2-upgraded still gets the theme's box instead
   of an OS-drawn control. (Each one should ideally carry the `select2` class - this only stops a missed
   field looking foreign.) */
.refund-theme select.form-control:not(.select2),
.refund-theme .input-container > select:not(.select2){
  width:100%; height:36px !important; padding:0 12px !important; font-size:12.5px !important;
  border:1px solid var(--line) !important; border-radius:5px !important;
  background:var(--surface) !important; color:var(--ink) !important; box-shadow:none !important;
}
.refund-theme input.text:focus,
.refund-theme textarea.text:focus{
  border-color:var(--brand) !important; box-shadow:0 0 0 2px var(--brand-light) !important;
}

/* Legacy select2 (`.form-control.select2`, not rt-select) sits inside `.input-container`, where
   NewFormCSS forces `border-radius:var(--field-radius)` = a PILL, and a viewport-scaled height. That is
   why the dropdowns were a different shape to the text boxes beside them. Re-assert the common shape
   and height at the same !important strength. */
.refund-theme .input-container .select2-container--default .select2-selection--single{
  height:36px !important; border-radius:5px !important; padding:3px 0 !important;
}
.refund-theme .input-container .select2-container--default .select2-selection--single .select2-selection__rendered{
  padding-left:12px !important;
}

/* Inline icons: the legacy design drew these as filled circular badges, which read as buttons next to
   a flat field. Flattened to a plain muted glyph inside the box, like .frr-cal-ico. */
.refund-theme .field-set{ position:relative; }
.refund-theme .field-set .left_icon,
.refund-theme .field-set .right_icon{
  position:absolute; top:50%; transform:translateY(-50%);
  width:auto !important; height:auto !important; min-width:0 !important;
  background:none !important; border:0 !important; border-radius:0 !important; box-shadow:none !important;
  color:var(--muted) !important; font-size:13px; line-height:1; padding:0 !important; margin:0 !important;
}
/* POSITION NEEDS !important AND THE .input-container DEPTH.
   NewFormCSS sets `.input-container .field-set .left_icon{left:0}` / `.right_icon{right:0}` - (0,3,0),
   the same weight as a plain `.refund-theme .field-set .left_icon`, and NewFormCSS is linked FROM THE
   VIEW so it loads after RefundTheme.css and wins the tie. The icons therefore stayed at 0 and were
   clipped by the input's rounded border - the "icon is cut" symptom, and the same reason the calendar
   glyph looked wrong on pages that use `.right_icon` instead of `.frr-cal-ico`.
   Matching their depth (0,4,0) + !important settles it for every legacy page at once.
   11px puts the glyph's centre ~16px in, which is where the 32px text inset above expects it. */
.refund-theme .field-set .left_icon,
.refund-theme .input-container .field-set .left_icon{ left:11px !important; right:auto !important; }
.refund-theme .field-set .right_icon,
.refund-theme .input-container .field-set .right_icon{ right:11px !important; left:auto !important; }
/* their width/height also came from --field-height (a full 36px square badge), which is why the glyph
   looked boxed-in; the flatten rules above zero the background but the box itself has to shrink too */
.refund-theme .input-container .field-set .left_icon,
.refund-theme .input-container .field-set .right_icon{
  width:auto !important; height:auto !important; border-radius:0 !important;
  background:none !important; background-color:transparent !important; color:var(--muted) !important;
}
/* the calendar glyph is brand-coloured wherever it appears, whether the page uses .frr-cal-ico or the
   legacy .right_icon wrapper - so a date field looks the same on every page */
.refund-theme .field-set .right_icon .fa-calendar,
.refund-theme .input-container .field-set .right_icon .fa-calendar{ color:var(--brand) !important; font-size:14px; }
.refund-theme .field-set .right_icon.icon-disabled .fa-calendar{ color:var(--btn-disabled-ink) !important; opacity:.6; }
/* Room for the inline icons.
   These used to rely on sibling combinators (`.left_icon + input.text`), which only match when the icon
   is the IMMEDIATELY PRECEDING sibling. Several pages put the icons after the input, or with a label in
   between, so the padding silently never applied and the glyph sat on top of the placeholder text.
   `:has()` tests the wrapper instead, so element order no longer matters. */
.refund-theme .field-set:has(> .left_icon) input.text,
.refund-theme .field-set:has(> .left_icon) input.form-control,
.refund-theme .field-set:has(> .left_icon) textarea{ padding-left:32px !important; }
.refund-theme .field-set:has(> .right_icon) input.text,
.refund-theme .field-set:has(> .right_icon) input.form-control,
.refund-theme .field-set:has(> .right_icon) textarea{ padding-right:32px !important; }
/* verified / not-verified ticks keep their semantic colours */
.refund-theme .field-set .active_Lable{ color:var(--ok) !important; }
.refund-theme .field-set .Inactive_Lable{ color:var(--muted) !important; }
.refund-theme.admissiondetails-page .icon-disabled{ opacity:.45; }

/* ---- Date fields (UI ONLY) ----
   The behaviour classes (.datepickerWithoutFutureDateWithSetup etc.) and the date range those setups
   pass in are deliberately untouched - this block only restyles the box and its icon. The popup itself
   is already themed by the common `.datepicker.datepicker-dropdown` block.

   These inputs are `readonly` so the value can only come from the calendar. The theme's generic
   `input[readonly]` rule tints readonly fields grey to read as inert, which is wrong here because the
   field is still an active control you click to open the picker - so the normal white/clickable look is
   restored, and the calendar glyph is brand-coloured like .frr-cal-ico instead of near-invisible grey. */
/* NewFormCSS has `.input-container .datepicker, .input-container .disablePastDate{border-radius:
   var(--field-radius)}` - and --field-radius is HALF the field height, i.e. a pill. That selector is
   (0,2,0), exactly the same weight as the common `.refund-theme .form-control`, and NewFormCSS.css is
   linked from the view so it loads AFTER RefundTheme.css - on a tie, later wins, which is why the date
   boxes rendered round while everything else was square. Re-stated here at (0,3,0) + !important. */
.refund-theme .input-container .datepicker,
.refund-theme .input-container .datepickerWithoutFutureDate,
.refund-theme .input-container .datepickerWithoutFutureDateWithSetup,
.refund-theme .input-container .disablePastDate,
.refund-theme .input-container .onlyYearDisplayDatePicker{
  width:100%; height:36px !important; padding:0 30px 0 12px !important;
  font-size:12.5px !important; line-height:normal !important;
  border:1px solid var(--line) !important; border-radius:5px !important;
  background:var(--surface) !important; color:var(--ink) !important; box-shadow:none !important;
}
.refund-theme input.text[readonly],
.refund-theme.admissiondetails-page input.datepicker[readonly],
.refund-theme.admissiondetails-page input.datepickerWithoutFutureDate[readonly],
.refund-theme.admissiondetails-page input.datepickerWithoutFutureDateWithSetup[readonly],
.refund-theme.admissiondetails-page input.disablePastDate[readonly]{
  background:var(--surface) !important; color:var(--ink) !important; cursor:pointer !important;
}
.refund-theme .field-set .right_icon .fa-calendar{ color:var(--brand) !important; font-size:14px; }
/* DISABLED must clearly read as unavailable (e.g. DOB before a Class is chosen).
   These selectors have to be at least as specific as the readonly rule above, and are placed after it,
   because the DOB input is BOTH readonly and disabled - the readonly "still clickable" look would
   otherwise win and the field would look perfectly usable while ignoring every click.
   Colours are the theme's shared disabled tokens (--btn-disabled-bg / --btn-disabled-ink), the same
   ones `.refund-theme input[disabled]` uses, so a disabled field looks identical across the app.
   -webkit-text-fill-color is needed as well: WebKit ignores `color` on a disabled input. */
.refund-theme input.text[disabled],
.refund-theme input.text[disabled][readonly],
.refund-theme input.text:disabled,
.refund-theme .field-set input.text[disabled]{
  /* MOVED ONTO THE SHARED DISABLED TOKENS (05-08-2026, bug sheet 105 follow-up).
     Was --btn-disabled-bg (#f4f6f9) / --btn-disabled-ink, which is a BUTTON tint - close enough
     to white that Date of Birth still read as an ordinary empty field, and visibly different
     from the select2 boxes beside it once those were darkened. Reported as "in date of birth not
     same disabled". Buttons and inputs having separate palettes is fine; a disabled INPUT looking
     different from the disabled dropdown next to it is not. */
  background:var(--disabled-bg) !important;
  color:var(--disabled-ink) !important;
  -webkit-text-fill-color:var(--disabled-ink) !important;
  border-color:var(--disabled-line) !important;
  cursor:not-allowed !important;
  opacity:1;   /* keep the tint doing the work, not a wash-out that also fades the border */
}
.refund-theme .field-set .right_icon.icon-disabled,
.refund-theme .field-set .right_icon.icon-disabled .fa-calendar{
  color:var(--disabled-ink) !important; opacity:.6;
}

/* ---- Checkbox fields (Sibling, Send SMS / Mail / WhatsApp) ----
   These rows are NOT floating-label fields: the caption is a plain <label> with no .placeholder-label
   class, so the label-above-field treatment doesn't apply to them - and inside the flex COLUMN set up
   above, a plain label simply stacked underneath its checkbox.
   A checkbox belongs beside its caption, so any .input-container that holds an `input.inputCheck` is
   flipped back to a row. :has() keeps this off every other field. */
.refund-theme .component.input-container:has(input.inputCheck){
  flex-direction:row !important; align-items:center !important; flex-wrap:wrap; gap:8px;
}
.refund-theme .component.input-container:has(input.inputCheck) > label{
  order:0; margin:0 !important; padding:0 !important;
  font-size:11.5px; font-weight:600 !important; color:var(--muted);
  text-transform:uppercase; letter-spacing:.3px; line-height:1.4; cursor:pointer; white-space:nowrap;
}
/* The `&nbsp;&nbsp;` + `<br>` padding these captions used to carry (spacing for the old layout) has
   been removed from the markup, so the label now starts exactly at checkbox-width + gap - which is the
   same 23px the "(Active)" note below is indented by, putting caption and note on one left edge.
   The br rule stays as a guard in case another label still has one. */
.refund-theme .component.input-container:has(input.inputCheck) > label br{ display:none; }
.refund-theme input.inputCheck{
  -webkit-appearance:checkbox; appearance:auto; accent-color:var(--brand);
  width:15px; height:15px; min-width:15px; flex:0 0 auto;
  margin:0 !important; position:static; top:auto; vertical-align:middle; cursor:pointer;
}
.refund-theme input.inputCheck[disabled]{ cursor:not-allowed; opacity:.6; }
/* "(Active)" / "(Not Configured)" notes.
   In the markup these spans are siblings of `.input-container`, NOT children of it, so they can't be
   flexed inline with the caption without editing markup. Instead they are indented by the checkbox's
   own width + gap (15px + 8px), which lines them up under the LABEL text rather than under the
   checkbox - so each note reads as belonging to the caption above it. */
.refund-theme.admissiondetails-page .text-muted{
  display:block; font-size:11px !important; color:var(--muted) !important;
  margin-left:23px !important; margin-top:0 !important; line-height:1.4;
}

/* ---- VALIDATION ERRORS: MOVED TO COMMON ----
   Both the flagged-plain-field rules and the select2 "paint the visible box" rules now live once at the
   top of this file ("VALIDATION ERROR STATE, COMMON" + "SELECT2 ERROR BOX, COMMON"). AdmisssionMaster.js
   flags fields with .myErrorClass (on the container span) and .redBackColor/.redBorderClass (on plain
   inputs); all of those are covered there. Nothing page-specific remains. */
/* the inline "mandatory" message under a field */
.refund-theme.admissiondetails-page .component .mandatory{ font-size:11px; margin-left:0 !important; }

/* card 6's title carries the "Add Interaction" enable checkbox */
/* `.frr-cardchk` - an optional section's enable checkbox riding in its card title. COMMON: AdmissionDetails,
   RegistrationDetails and StudentRegistration all use it for the Sibling / Add Interaction sections. */
.refund-theme .frr-cardchk{
  display:inline-flex; align-items:center; gap:8px; margin:0; font-weight:inherit; font-size:inherit;
  color:inherit; text-transform:none; letter-spacing:normal; cursor:pointer;
}
.refund-theme .frr-cardchk input[type="checkbox"]{
  width:15px; height:15px; margin:0 !important; accent-color:var(--brand); cursor:pointer;
}
/* when the shared `.rt-chk` control is used inside a card title, its caption must take the TITLE's type,
   not the tick-row's - otherwise the one section with a checkbox has a differently sized, differently
   coloured heading from every other section on the page. */
.refund-theme .frr-cardtitle .rt-chk .rt-chk-txt,
.refund-theme .frr-cardchk.rt-chk .rt-chk-txt{
  font-size:inherit; font-weight:inherit; color:inherit;
}
/* An optional section whose tick box is clear has nothing to show, but its card must not collapse to a bare
   heading strip - this line says what the tick box is for. COMMON: the Sibling section uses it on all three
   pages that have one (AdmissionDetails, RegistrationDetails, StudentRegistration). */
.refund-theme .rt-emptyhint{ margin:0 0 10px; font-size:12px; color:var(--muted); }

/* ---- .rt-fieldnote - a one-line note UNDER a field - COMMON ----
   "Last Generated : 989924", "Enrolled Student : 12", the computed age, the masked-number readback. These
   were 15 hand-styled spans (`color:#3a74c7; margin-left:3%; font-size:11px` - or 13px, inconsistently),
   each preceded by a literal `&nbsp;`.
   WHY THEY TOOK SO MUCH SPACE: the theme converts `.component.input-container` into a flex COLUMN, and in a
   flex container a bare text node becomes an anonymous flex item - so that stray `&nbsp;` claimed a full
   line of its own, then the note claimed another, then the 5px flex gap applied to both. Three rows of
   height for one short note. The `&nbsp;` are gone from the markup and the note is pinned tight under the
   field here.
   `:empty` matters as much: most of these are filled by JS and start empty, so without it every field with
   a note carried an invisible extra row and gap. */
.refund-theme .rt-fieldnote{
  order:99;                 /* always last in the column, whatever its position in the source */
  margin:2px 0 0 !important; padding:0 !important;
  font-size:11px; line-height:1.35; color:var(--brand-dark);
  text-align:left; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.refund-theme .rt-fieldnote:empty{ display:none; }
/* a note that reports a problem rather than a fact */
.refund-theme .rt-fieldnote.rt-fieldnote-err{ color:var(--no); }
/*  ...and one that explains why a field is READ-ONLY. Muted, not brand: the base colour is
    `var(--brand-dark)`, which under a maroon or red accent reads as a warning sitting directly
    beneath a required field - the operator's first thought is "what have I done wrong", when the
    answer is "nothing, your school is configured this way".
    The lock glyph carries the meaning at a glance; the sentence behind it belongs in the field's
    own `title`, because this component is a single ellipsised line by design. */
.refund-theme .rt-fieldnote.rt-fieldnote-lock{ color:var(--muted); }
.refund-theme .rt-fieldnote.rt-fieldnote-lock .fa{ font-size:10px; margin-right:3px; opacity:.75; }
/* `.text-green` is used on a few of them (the computed age) - keep that meaning, drop the size clash */
.refund-theme .rt-fieldnote.text-green{ color:var(--ok) !important; }

/* ---------- .rt-pwd / .rt-eye - COMMON show-hide-password eye INSIDE the field ----------
   Every password field in the ERP has the same eye, and every page positioned it by hand with the same
   wrong trick:
       float:right; margin-top:-28px; margin-right:10px
   - a negative margin dragging the icon back up over the input the browser had already laid out BELOW it.
   That breaks the moment the field changes height, and it is why the icon on the 2FA Setup screen sat a
   few pixels off the one on Change Password.
   USE:  <div class="rt-pwd">
             @Html.PasswordFor(... @class="form-control" ...)
             <span toggle="#TheInputId" class="fa fa-fw fa-eye-slash rt-eye toggle-password"></span>
         </div>
   `padding-right` on the input is what stops a 20-character password running underneath the icon.
   The `toggle="#id"` + `.toggle-password` contract is the pages' own jQuery handler - unchanged.
   NOTE: `.changepassword-page .cp-eye` (bottom of this file) is the older, page-scoped copy of exactly
   these declarations. Fold it into this one the next time that screen is touched; it is left alone here
   so a working screen is not restyled as a side effect of another page's fix. */
.refund-theme .rt-pwd{ position:relative; }
.refund-theme .rt-pwd .form-control{ padding-right:34px; }
.refund-theme .rt-eye{
  position:absolute; top:50%; right:10px; transform:translateY(-50%);
  color:var(--muted); cursor:pointer; font-size:13px; line-height:1; z-index:2;
}
.refund-theme .rt-eye:hover{ color:var(--brand); }

/* Sibling add/remove: these were inline-styled circular badges (one hardcoded #dc3545 red). Restyled as
   the theme's small icon buttons - brand for add, danger for remove - and they keep their position
   inside the field via the shared .right_icon anchoring above. */
.refund-theme .field-set .right_icon.rt-ico-add,
.refund-theme .field-set .right_icon.rt-ico-rem{
  display:inline-flex; align-items:center; justify-content:center;
  width:20px !important; height:20px !important; border-radius:4px !important;
  font-size:11px; cursor:pointer; right:8px;
}
.refund-theme .field-set .right_icon.rt-ico-add{
  background:var(--brand-light) !important; color:var(--brand-dark) !important;
  border:1px solid var(--brand-hover-border) !important;
}
.refund-theme .field-set .right_icon.rt-ico-add:hover{
  background:var(--brand) !important; color:var(--on-brand) !important; border-color:var(--brand) !important;
}
.refund-theme .field-set .right_icon.rt-ico-rem{
  background:var(--no-bg) !important; color:var(--no) !important;
  border:1px solid var(--no-border) !important;
}
.refund-theme .field-set .right_icon.rt-ico-rem:hover{
  background:var(--no) !important; color:var(--on-brand) !important; border-color:var(--no) !important;
}

/* Sticky action bar: geometry is now COMMON (.rt-stickybar block near the top of this file) with
   .ad-stickybar kept as an alias, so this page only reserves room for it. */
.refund-theme.admissiondetails-page{ padding-bottom:66px; }
.refund-theme.admissiondetails-page .ad-stickybar{ justify-content:flex-end; }
.refund-theme.admissiondetails-page .ad-sb-actions{ display:flex; align-items:center; gap:10px; }
/* the notify tick boxes are COMMON now - see ".rt-sb-notify" in the sticky-bar component block.
   `.ad-sb-notify` / `.ad-chk` are kept as aliases there, so this page's markup did not change. */

/* the old page style pushed helper text out with a hardcoded left margin meant for the circular icons */
.refund-theme.admissiondetails-page .text-muted{ margin-left:0 !important; margin-top:2px !important; }

/* =====================================================================
   FOLLOW UP INQUIRY  (Views/FollowUpInquiry/FollowUpInquiry.cshtml)
   ---------------------------------------------------------------------
   Grid page with a row of clickable "pending task" buckets above it.
   The buckets reuse the theme's KPI component (frr-totbar / frr-tot), so
   only the click/selected behaviour is added here - the card look itself
   is already common. Field sizes are NOT redeclared.
   ===================================================================== */
/* (the toolbar's inline filter fields are gone - both dropdowns now live in the #FollowUpSearch popup,
   so the header row is just title + Filter + menu.) */
/* buckets sit between the toolbar and the grid */
.refund-theme.followupinquiry-page .fui-buckets{ margin:0 16px 12px; }
/* the active-filters bar follows the buckets, using the common .critbar look */
/* .critbar offset is COMMON (see `.box-header .critbar` in the ACTIVE FILTERS BAR block) */
/* each bucket is a button, so it needs affordance the read-only KPI cards don't have */
.refund-theme.followupinquiry-page .fui-bucket{ cursor:pointer; transition:border-color .12s, background .12s, box-shadow .12s; }
.refund-theme.followupinquiry-page .fui-bucket:hover{ border-color:var(--brand-hover-border); background:var(--row-hover); }
/* `.hl` is the theme's existing "highlighted KPI" state - reused here as the SELECTED bucket, replacing
   the old .active-tab gradient + translateY lift. */
.refund-theme.followupinquiry-page .fui-bucket.hl{ box-shadow:inset 0 0 0 1px var(--brand); }
.refund-theme.followupinquiry-page .fui-bucket.hl b{ color:var(--brand-dark); }

/* Validation-error state: COMMON now (see "SELECT2 ERROR BOX, COMMON" at the top of this file).
   FollowUpInquiryView.js writes `.myErrorClass` on the select2 container span and `.redBackColor` on
   plain inputs; both are handled there, including inside the `.frr-detailpop` popups. */

/* ---------------------------------------------------------------------
   .rt-modal - COMMON marker for a legacy popup restyled to the theme
   ---------------------------------------------------------------------
   Legacy modals carry the `NewSPR` skin, whose CustomTableDesign.css rule
   `.NewSPR .modal-content .modal-header` paints a dark navy gradient at
   (0,3,0) - it beats the generic `.refund-theme .modal-header` (0,2,0)
   whatever the load order. modalCustom.css adds a flat #777f96 on top.
   Marking the popup `rt-modal` and matching that depth here fixes it for
   ANY page, instead of each page inventing its own marker class (that is
   how `.aiq-modal` ended up page-scoped on AdmissionInquiry).
   --------------------------------------------------------------------- */
/* Dialog offset: the NewSPR skin leaves the dialog flush against the viewport top, so the brand header
   ended up half under the fixed navbar and only a sliver of it was visible. Give it the normal gap.
   30px WAS NOT ENOUGH, and Bootstrap's default would not have been either. Measured on
   WorkflowSetting: `.main-header` is `position:fixed`, 66px tall, z-index 1030, and `body` carries
   AdminLTE's `fixed` class on every page - while `.modal` sits at z-index 1050. So the dialog won a
   30px-from-the-top fight it should not have been in and painted its brand header straight over the
   school name in the navbar. It read as a dialog that had opened too high and clipped the chrome.
   76px = the 66px navbar + a 10px gap, so the dialog clears it instead of covering it. Bottom stays
   30px. COMMON on purpose: the navbar is fixed on every page, so every themed popup had this. */
.refund-theme .rt-modal .modal-dialog{ margin:76px auto 30px; }
/* select2 panels open OUTSIDE the modal (they are appended to <body> or to the theme root), and
   Bootstrap puts .modal at z-index 1050 - so an open dropdown list was being painted UNDER the popup,
   which is what made the row behind show through when picking a value. Lift both above it.
   Applied theme-wide, not per page, so every popup with a dropdown behaves. */
.refund-theme .select2-container--open{ z-index:1061 !important; }
.select2-container--open .select2-dropdown{ z-index:1061 !important; }
.refund-theme .rt-modal .modal-content{ border:none; border-radius:8px; box-shadow:var(--shadow-lg); }
/* `.rt-cardbar` is the SAME bar on an inline card instead of a popup - see the block after this one.
   It shares these declarations rather than copying them, so the two can never drift apart. */
.refund-theme .rt-modal .modal-content .modal-header,
.refund-theme .rt-cardbar{
  background:var(--brand) !important; background-image:none !important;
  color:var(--on-brand) !important; border-bottom:none !important;
  border-radius:8px 8px 0 0; padding:12px 16px !important; min-height:0 !important;
  display:flex !important; align-items:center !important;
}
.refund-theme .rt-modal .modal-content .modal-header .modal-title,
.refund-theme .rt-cardbar .rt-cardbar-title{
  margin:0 !important; text-align:left !important; flex:1 1 auto;
  color:var(--on-brand) !important; font-size:14.5px; font-weight:600; letter-spacing:.2px; line-height:1.4;
  display:flex; align-items:center; gap:8px;
}
.refund-theme .rt-modal .modal-content .modal-header .close,
.refund-theme .rt-modal .modal-content .modal-header .close_custom{
  /* CLOSE IS ALWAYS LAST, whatever the source order.
     Plenty of legacy popups author the close button BEFORE the <h4> (Bootstrap floated it right, so
     source order didn't matter there). In a flex header it does: `.modal-title` carries flex:1 1 auto and
     eats the free space, so `margin-left:auto` has nothing left to push with and the x stays on the LEFT.
     `order:2` fixes it for every popup without reordering any markup - and `order:0` on the title keeps
     it in front. */
  order:2;
  margin-left:auto !important; background:transparent !important; border:none;
  color:var(--on-brand) !important; opacity:.9; font-size:17px; line-height:1; padding:0; cursor:pointer;
}
.refund-theme .rt-modal .modal-content .modal-header .modal-title{ order:0; }
.refund-theme .rt-modal .modal-content .modal-header .close_custom:hover{ opacity:1; }
/* ---------------------------------------------------------------------
   .rt-secure / .rt-mask - COMMON "password field with no browser autofill"
   ---------------------------------------------------------------------
   `autocomplete="off"` DOES NOT WORK on a real password field. Chrome
   deliberately ignores it there (it concluded sites were using it to block
   password managers), and `new-password` - the one value it does honour -
   is precisely what switches ON the "Use suggested password" bubble. There
   is no attribute that suppresses the dropdown while an <input type=
   "password"> exists on the page.
   So pages that must not show it render a TEXT input masked here in CSS:
   with no password field, Chrome has nothing to attach a dropdown to.
   `rt-secure` is the permanent marker ("this is a masked field") and
   `rt-mask` is the mask itself - the show/hide eye toggles `rt-mask` and
   must NOT switch the input's type, which would hand Chrome a password
   field again and bring the dropdown straight back.
   `-webkit-text-security` IS NOT IN ANY SPEC. Chrome, Edge, Safari and
   Firefox 118+ support it; anything older IGNORES IT AND SHOWS THE
   PASSWORD IN CLEAR TEXT. Every page using this must feature-detect and
   fall back to real password inputs - see the guard in ResetPassword.cshtml
   and ChangePassword.cshtml. Do not use these classes without it.
   THE TRADE-OFF IS REAL: password managers key off password fields too, so
   they can no longer fill OR offer to save on such a page. Use it only
   where suppressing the browser UI was asked for deliberately.
   --------------------------------------------------------------------- */
.refund-theme .rt-mask{ -webkit-text-security:disc; text-security:disc; }

/* ---------------------------------------------------------------------
   .rt-subgrid - COMMON small table inside a popup / card
   ---------------------------------------------------------------------
   For lists that are NOT the page's main grid: a popup table, or one that
   groups its rows under a section heading. It deliberately uses the light
   `--subhead-*` family instead of the brand gradient the main grid header
   uses - a popup painted with the full dark header reads as heavy, and as
   if the popup were a second page.
   `tr.rt-grouprow` is the section heading INSIDE the body (e.g. the fee
   component name above its periods). It is a brand-tinted band with a solid
   brand rule down its left edge, so it separates groups without shouting -
   the previous flat `background-color: green` + white bold text did shout,
   and still managed to hide the name it was meant to emphasise.
   All colours are tokens: change the accent and this follows it. Any page
   with a grouped popup table should reuse this rather than restyle its own.
   --------------------------------------------------------------------- */
.refund-theme .rt-subgrid{ border:1px solid var(--subhead-line); border-radius:6px; overflow:hidden; margin:0 !important; }
.refund-theme .rt-subgrid > thead > tr > th{
  background:var(--subhead-bg) !important; background-image:none !important;
  color:var(--subhead-ink) !important; border-color:var(--subhead-line) !important;
  text-shadow:none !important; text-align:left;
  font-size:11.5px; font-weight:700; text-transform:uppercase; letter-spacing:.4px;
  padding:9px 12px !important; vertical-align:middle;
}
.refund-theme .rt-subgrid > tbody > tr > td{
  color:var(--subhead-td); font-size:12.5px;
  border-color:var(--subhead-line) !important; padding:8px 12px !important;
}
/* A grouped popup table usually carries a row of checkboxes under each group (the periods under a
   fee component). They are authored as floated <li> with no gap, so the last word of one option ran
   straight into the next option's box - measured touching at the pixel, which reads as one long
   option rather than three. */
.refund-theme .rt-subgrid td ul ul > li{ margin-right:20px; }
.refund-theme .rt-subgrid > tbody > tr.rt-grouprow > td{
  background:var(--brand-light) !important; color:var(--brand-dark) !important;
  font-weight:600; font-size:12.5px; letter-spacing:.2px;
  box-shadow:inset 3px 0 0 var(--brand);
}
/* ---------------------------------------------------------------------
   .rt-filefield - COMMON "choose a document" field
   ---------------------------------------------------------------------
   Markup (StudentRegistration + StudentRegistrationView both use it):

     <div class="field-set rt-filefield">
       <input type="text" class="text common" ng-model="doc.Documents.filename" disabled />
       <label class="rt-filehit" for="docFile{{$index}}" ng-show="!doc.Documents">
         <i class="glyphicon glyphicon-folder-open"></i></label>
       <input type="file" id="docFile{{$index}}" base-sixty-four-input
              ng-model="doc.Documents" style="display:none;" />
       <span class="rt-fileico rt-fileico-rem" ng-show="doc.Documents"
             ng-click="doc.Documents=null"><i class="glyphicon glyphicon-remove"></i></span>
     </div>

   THE WHOLE BOX IS THE CLICK TARGET. The filename input is disabled, so it can neither be clicked nor be
   a label target itself; instead `.rt-filehit` is a <label for> stretched over the entire field with the
   folder glyph pinned right. Clicking anywhere activates the hidden file input - that is simply what a
   <label for> does, so no JS is involved.
   The glyph is a flat muted icon matching the datepicker's `.frr-cal-ico`, and it is exactly as tall as
   the field: `inset:0` means its height IS the box's height, whatever that height happens to be - nothing
   to keep in sync if the common 36px ever changes.
   Do NOT use `rt-ico-add`/`rt-ico-rem` here: those are tinted buttons, and a pale bordered box inside a
   field reads as a highlight or an error rather than an affordance.
   --------------------------------------------------------------------- */
.refund-theme .rt-filefield{ position:relative; }
.refund-theme .rt-filefield .rt-filehit{
  position:absolute; inset:0; z-index:2;
  display:flex; align-items:center; justify-content:flex-end;
  margin:0 !important; padding:0 11px 0 0; font-weight:400;
  color:var(--muted); cursor:pointer; border-radius:5px;
}
/* the affordance is on the whole field, not just the corner, so the hint is that the box is clickable */
.refund-theme .rt-filefield .rt-filehit:hover{
  background:rgba(157,29,72,.045); color:var(--brand-dark);
}
/* clear-file glyph, shown in place of the chooser once a file is picked. NewFormCSS paints `.right_icon`
   as a filled circular badge, so the reset stays explicit - this element sits inside `.field-set`. */
.refund-theme .rt-filefield .rt-fileico{
  position:absolute; right:5px; top:50%; transform:translateY(-50%); z-index:3;
  width:26px; height:26px; border-radius:4px;
  display:inline-flex; align-items:center; justify-content:center;
  background:none !important; border:0 !important; box-shadow:none !important;
  color:var(--muted) !important; cursor:pointer;
}
/* clearing a chosen file is destructive, so it goes red - but only on contact, not at rest */
.refund-theme .rt-filefield .rt-fileico-rem:hover{
  background:var(--no-bg) !important; color:var(--no) !important;
}
.refund-theme .rt-filefield .glyphicon{ font-size:12.5px; top:0; color:inherit !important; }
/* room for the glyph so a long filename never runs under it. A disabled input greys its own text in most
   browsers; this one is disabled only to stop typing - the filename is real data - so keep it readable. */
.refund-theme .rt-filefield input.text,
.refund-theme .rt-filefield input.form-control{ padding-right:38px !important; }
.refund-theme .rt-filefield input.text[disabled],
.refund-theme .rt-filefield input.form-control[disabled]{
  background:var(--surface) !important; color:var(--ink) !important; cursor:pointer;
}
/* the filename must ellipsise, not wrap or overflow */
.refund-theme .rt-filefield .image-preview-filename{
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}

/* ---------------------------------------------------------------------
   .rt-cardbar - COMMON brand header bar for an INLINE card
   ---------------------------------------------------------------------
   The default card header (`.frr-toolbar`) is a light bar with brand-dark
   text - right for a grid page, where the grid itself should dominate.
   `.rt-cardbar` is the alternative: the exact same solid brand bar the
   popups use, for a card that IS the page's subject (a full-page criteria
   form, a single-record workspace) and should announce itself the way a
   dialog does.
   It shares the modal-header declarations above rather than restating
   them, so the two stay identical by construction. Use ONE or the other
   on a card, never both.
   --------------------------------------------------------------------- */
/* the bar has to span the card edge-to-edge, so the .box-header it sits in gives up its own top padding
   and gradient - otherwise a 12px strip of the old header shows above the bar */
.refund-theme .box-header:has(> .rt-cardbar){
  padding:0 0 12px !important; background:var(--surface) !important;
}
/* the gap below the bar belongs to the BAR, not to whatever follows it - so a form, a .critbar and a
   filter row all sit the same distance below it without each needing its own top margin. Declared here
   and not in the shared block above, because a modal header must not carry an outer margin. */
.refund-theme .rt-cardbar{ margin:0 0 12px; }
/* icons in the title inherit the bar's colour instead of the brand blue they'd take from .frr-tb-title */
.refund-theme .rt-cardbar .rt-cardbar-title .fa,
.refund-theme .rt-cardbar .rt-cardbar-title svg{ color:var(--on-brand) !important; }
.refund-theme .rt-cardbar .frr-search-ico circle{ stroke:var(--on-brand); fill:rgba(255,255,255,.28); }
.refund-theme .rt-cardbar .frr-search-ico line{ stroke:var(--on-brand); }
/* right-hand actions, e.g. a Back button. .rt-btn is already a light button, which reads correctly
   against the brand fill. */
.refund-theme .rt-cardbar .rt-cardbar-actions{ display:flex; align-items:center; gap:8px; flex:0 0 auto; margin-left:auto; }

.refund-theme .rt-modal .modal-body{ padding:16px 18px 4px !important; }
.refund-theme .rt-modal .form-group{ margin-bottom:14px; }
.refund-theme .rt-modal .box-footer{ background:var(--surface-2) !important; border-top:1px solid var(--line) !important; padding:12px 16px !important; }

/* ---- Follow-up popup internals (shared by _InsertUpdateFollowUp + _ViewFollowUp) ---- */
/* student / date-of-enquiry summary strip */
.refund-theme .rt-fu-info{
  display:flex; align-items:center; gap:8px;
  background:var(--surface-2); border:1px solid var(--line); border-radius:6px;
  padding:8px 12px; margin-bottom:10px; min-height:36px;
}
.refund-theme .rt-fu-info-lbl{ font-size:10.5px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:.4px; }
.refund-theme .rt-fu-info-val{ font-size:12.5px; font-weight:600; color:var(--ink); }
/* tab strip: the .rt-fu-tab* rules now live with the COMMON tab component ("TABS - ONE COMMON DESIGN"
   further up this file) so the popup strip and the page strips cannot drift apart. Only the panel
   padding is popup-specific. */
.refund-theme .rt-fu-tabs{ background:var(--surface); }
.refund-theme .rt-fu-tabbody{ padding:14px 2px 0; }
.refund-theme .rt-fu-histwrap{ max-height:330px; overflow:auto; border:1px solid var(--line); border-radius:6px; }
/* an inactive history row stays struck through (was a page-local style) */
.refund-theme .inactive-row td{ text-decoration:line-through; color:var(--muted) !important; }

/* =====================================================================
   STICKY ACTION BAR - ONE COMMON COMPONENT  (.rt-stickybar)
   ---------------------------------------------------------------------
   A long form's primary actions must stay reachable instead of sitting at
   the bottom of a 2000px page. This was first written page-scoped for
   CollectFees (.cf-stickybar) and again for AdmissionDetails
   (.ad-stickybar); it is now defined ONCE here, with those two names kept
   as aliases so their markup did not need touching.

   Markup:
     <div class="rt-stickybar">
       <div class="rt-sb-left">   ...optional info / toggles...   </div>
       <div class="rt-sb-actions"> ...rt-btn buttons...          </div>
     </div>

   left:230px clears the fixed side menu. The page root needs
   `padding-bottom` so the bar never covers the last card - add the
   `rt-haspin` class to the page root (or set it per page).
   ===================================================================== */
.refund-theme .rt-stickybar,
.refund-theme .cf-stickybar,
.refund-theme .ad-stickybar,
.refund-theme .rd-wizardbar{
  position:fixed; left:230px; right:0; bottom:0; z-index:800;
  display:flex; align-items:center; gap:16px; min-height:56px;
  padding:10px 22px; background:var(--surface);
  border-top:2px solid var(--brand); box-shadow:0 -6px 22px rgba(16,42,58,.14);
}
/* default: actions to the right; a left-hand group pushes them over */
.refund-theme .rt-stickybar{ justify-content:flex-end; }
.refund-theme .rt-sb-left{ display:flex; align-items:center; gap:16px; margin-right:auto; flex-wrap:wrap; }
.refund-theme .rt-sb-actions{ display:flex; align-items:center; gap:10px; }
/* any page carrying a sticky bar reserves room for it */
.refund-theme.rt-haspin{ padding-bottom:66px; }
/* the bar spans the full width when the side menu is collapsed */
body.sidebar-collapse .refund-theme .rt-stickybar,
body.sidebar-collapse .refund-theme .cf-stickybar,
body.sidebar-collapse .refund-theme .ad-stickybar,
body.sidebar-collapse .refund-theme .rd-wizardbar{ left:50px; }

/* ===== MOBILE: THE BAR MUST START AT THE SCREEN EDGE, NOT AT 230px =====
   `left:230px` above (and `left:50px` collapsed) is a DESKTOP measurement - it
   exists only to clear the fixed side menu. Below 768px AdminLTE takes that menu
   OFF-CANVAS (`.main-sidebar` is translated out of view), so there is no menu to
   clear and the offset becomes pure damage: measured on Student Registration at a
   412px viewport the bar was pinned left:230 right:412, i.e. squeezed into a
   182px sliver against the right edge, and its contents spilled out of that
   sliver with no background behind them. On screen it read as a small white
   panel floating over the form with Previous/Save inside it and the SMS / Email /
   WhatsApp ticks stranded outside - which is what was reported.

   So: full width below 768px, and allowed to wrap, because the notify ticks and
   the buttons share this bar and cannot fit one 412px line. The reserved
   padding-bottom on the pages that carry a bar is raised to match the taller
   wrapped bar - otherwise the bar simply covers the last field instead of the
   button, which is the same bug one step further down.

   `!important` on `left` is deliberate: the `body.sidebar-collapse` rule above is
   (0,3,1) and would otherwise out-specify this block, and a media query adds no
   specificity of its own. Mobile browsers do set sidebar-collapse. */
@media (max-width: 767px) {
    .refund-theme .rt-stickybar,
    .refund-theme .cf-stickybar,
    .refund-theme .ad-stickybar,
    .refund-theme .rd-wizardbar,
    body.sidebar-collapse .refund-theme .rt-stickybar,
    body.sidebar-collapse .refund-theme .cf-stickybar,
    body.sidebar-collapse .refund-theme .ad-stickybar,
    body.sidebar-collapse .refund-theme .rd-wizardbar {
        left: 0 !important;
        right: 0;
        flex-wrap: wrap;
        gap: 6px 12px;
        padding: 8px 12px;
    }

        /* buttons take their own full-width line and stay right-aligned, so Save is
       always in the same place no matter how the ticks above them wrap */
        .refund-theme .rt-stickybar .rt-sb-actions,
        .refund-theme .cf-stickybar .cf-sb-actions,
        .refund-theme .ad-stickybar .ad-sb-actions,
        .refund-theme .rd-wizardbar .rt-sb-actions {
            width: 100%;
            justify-content: flex-end;
        }

        /* the tick group stops reserving all the free space (margin-right:auto) - on one
       narrow line that pushed the buttons off the end */
        .refund-theme .rt-stickybar .rt-sb-notify,
        .refund-theme .rt-stickybar .ad-sb-notify,
        .refund-theme .ad-stickybar .ad-sb-notify,
        .refund-theme .rd-wizardbar .rt-sb-notify {
            margin-right: 0;
            gap: 4px 14px;
            width: 100%;
        }

    /* Room for the taller wrapped bar. Measured: the bar is 81px on a 412px screen
       (one line of ticks + one line of buttons) against a reserved 66px, so without
       this the bar covers the last 15px of the form.

       THE `body` PREFIX IS LOAD-BEARING. Each page sets its own
       `.refund-theme.<page>-page { padding-bottom:66px }` (0,2,0) and those rules
       live LATER in this file than this block, so an identical selector here loses
       the source-order tiebreak - measured: still 66px. `body .refund-theme.<page>`
       is (0,2,1) and wins on specificity alone, independent of order. This is the
       second time that tiebreak has cost a measurement in this codebase (see the
       school-name mobile fix in mycss.css). */
    body .refund-theme.rt-haspin,
    body .refund-theme.collectfees-page,
    body .refund-theme.admissiondetails-page,
    body .refund-theme.registrationdetails-page,
    body .refund-theme.studentregistration-page {
        padding-bottom: 132px;
    }
}

/* Z-INDEX: THE BAR MUST SIT UNDER THE SIDE MENU, NOT OVER IT.
   This bar used to be z-index:1000 while AdminLTE's .main-sidebar is 810 (850 collapsed). The layout is
   `sidebar-mini sidebar-mini-expand-feature`, so a COLLAPSED menu expands back to its full 230px ON TOP
   of the content when the pointer is over it - and at 1000 the bar painted across that expanded menu.
   That is the reported overlap: the Final Amount row covering the bottom of the menu list.
   800 keeps it above page content (which is auto) and below the menu in both states. Bootstrap modals
   (1050) and the toast wrapper (10600) are both still well clear, so nothing else changes. */

/* =====================================================================
   WIDE GRID ON A PHONE: STACKED CARDS   (.rt-stack-sm - COMMON, OPT-IN)
   ---------------------------------------------------------------------
   An 8-column grid cannot be read on a 412px screen. Measured on Employee
   Login Credential at a 412px viewport: the table is 813px wide inside a
   372px `.attendance_table_scroll`, so roughly two and a half columns are
   reachable and everything from Mobile rightwards is off to the side, behind
   a horizontal scroll with no visual hint that it exists. The data is all
   there and effectively hidden - which is what was reported.

   Below 768px each ROW becomes a card and each CELL becomes a
   "LABEL            value" line, the header text coming from the cell's own
   `data-label`. Nothing is cut off and nothing has to be scrolled sideways.

   OPT-IN ON PURPOSE. `.attendance_table_scroll` / `.attendance-table` are the
   app-wide grid wrapper - 30+ views use them - so this must NOT be applied by
   default: it would silently restyle every grid in the ERP on small screens.
   A page opts in by putting `rt-stack-sm` on its table and `data-label` on its
   cells. Add it one page at a time, after checking that page.

   Requires `data-label` on every td. A cell that should not show a caption
   (an action button, a checkbox) just gets `data-label=""`.

   `thead` is hidden rather than removed: the sticky header is inline on the
   markup and screen readers still get the real table semantics on desktop.
   ===================================================================== */
@media (max-width: 767px) {
    /* the fixed/expanded width and any table-layout are released, otherwise the
       cells keep the desktop column geometry they were sized to */
    .refund-theme .rt-stack-sm {
        display: block;
        width: 100% !important;
        min-width: 0 !important;
        table-layout: auto !important;
    }

        .refund-theme .rt-stack-sm thead {
            display: none;
        }

        .refund-theme .rt-stack-sm tbody,
        .refund-theme .rt-stack-sm tr,
        .refund-theme .rt-stack-sm td {
            display: block;
            width: auto !important;
            min-width: 0 !important;
        }

        /* one row = one card */
        .refund-theme .rt-stack-sm tbody tr {
            border: 1px solid var(--line);
            border-radius: 8px;
            background: var(--surface);
            padding: 4px 10px;
            margin-bottom: 10px;
        }

        .refund-theme .rt-stack-sm tbody td {
            display: flex;
            align-items: center;
            justify-content: space-between;
            gap: 12px;
            border: 0 !important;
            padding: 7px 0 !important;
            text-align: left !important;
            white-space: normal !important;
        }

            .refund-theme .rt-stack-sm tbody td + td {
                border-top: 1px solid var(--line) !important;
            }

            .refund-theme .rt-stack-sm tbody td::before {
                content: attr(data-label);
                flex: 0 0 42%;
                font-size: 11px;
                font-weight: 700;
                text-transform: uppercase;
                letter-spacing: .3px;
                color: var(--muted);
            }

            /* cells that carry no caption (checkbox, action button) - and the
               "no records" row, which must stay one plain full-width line */
            .refund-theme .rt-stack-sm tbody td[data-label=""]::before,
            .refund-theme .rt-stack-sm tbody td.dataTables_empty::before {
                content: none;
            }

            .refund-theme .rt-stack-sm tbody td[data-label=""] {
                justify-content: flex-end;
            }

            .refund-theme .rt-stack-sm tbody td.dataTables_empty {
                display: block;
                text-align: center !important;
            }
}

/* ---- NOTIFY TICK BOXES IN THE BAR - COMMON ----
   SMS / Email / WhatsApp decide what Save sends out, so they belong next to Save rather than buried at the
   bottom of a long form - or, worse, behind a confirmation popup that exists only to hold them.
   `.ad-sb-notify` / `.ad-sb-notify-lbl` / `.ad-chk*` are kept as aliases so AdmissionDetails' markup did
   not have to change when this moved out of its page block. */
.refund-theme .rt-sb-notify,
.refund-theme .ad-sb-notify{ display:flex; align-items:center; gap:16px; margin-right:auto; flex-wrap:wrap; }
.refund-theme .rt-sb-notify-lbl,
.refund-theme .ad-sb-notify-lbl{
  font-size:10.5px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.4px;
}
.refund-theme .rt-chk,
.refund-theme .ad-chk{
  display:inline-flex; align-items:center; gap:7px; margin:0; cursor:pointer; white-space:nowrap;
}
.refund-theme .rt-chk input[type="checkbox"],
.refund-theme .ad-chk input[type="checkbox"]{
  width:14px; height:14px; margin:0 !important; accent-color:var(--brand); cursor:pointer;
}
.refund-theme .rt-chk .rt-chk-txt,
.refund-theme .ad-chk .ad-chk-txt{
  font-size:12.5px; font-weight:600; color:var(--ink); text-transform:none; letter-spacing:normal;
}
/* Each channel's status sits inline right after its name. All three states are shown (Active / Not Active
   / Not Configured) - the same ng-if conditions the pages always had; do NOT drop them, they are real
   state the user relies on. "(Active)" is green so a working channel is distinguishable at a glance from a
   muted problem state. */
.refund-theme .rt-chk .rt-chk-note,
.refund-theme .ad-chk .ad-chk-note{ font-size:11px; color:var(--muted); }
.refund-theme .rt-chk .rt-chk-note.rt-chk-ok,
.refund-theme .ad-chk .ad-chk-note.ad-chk-ok{ color:var(--ok); }
/* a channel that is not configured cannot be ticked - say so visually */
.refund-theme .rt-chk input[disabled] ~ .rt-chk-txt,
.refund-theme .ad-chk input.inputCheck[disabled] ~ .ad-chk-txt{ color:var(--muted); }
.refund-theme .rt-chk:has(input[disabled]),
.refund-theme .ad-chk:has(input.inputCheck[disabled]){ cursor:not-allowed; }

/* =====================================================================
   LEGACY FORM CHROME - COMMON
   ---------------------------------------------------------------------
   Two pieces of legacy markup that appear on several converted pages and
   therefore belong here rather than in a page block:
     * `.titleCom` - the section heading used by the AdmissionDetails /
       RegistrationDetails family (13 of them on one page). Restyling it
       here means no page has to rewrite those headings.
     * `.nav-tabs-custom` / `.nav-tabs` - AdminLTE's tab strip, restyled to
       the same treatment as the theme's own `.apv-tabs` / `.rt-fu-tab`.
   ===================================================================== */
/* NUMBERED SECTIONS - the enquiry-page (AdmissionDetails) look, with no markup change.
   AdmissionDetails wraps each section in its own card and hand-writes `<span class="frr-cardnum">1`.
   A legacy form has 13+ `.titleCom` headings per page, so instead of rewriting them all, a CSS counter
   numbers them automatically: the counter resets per tab panel, so every tab starts again at 1 and the
   numbers stay correct if a section is added, removed or ng-hidden...
   ...with one caveat worth knowing: `display:none` (ng-hide) sections do NOT increment a counter, so a
   conditionally hidden section simply drops out of the sequence rather than leaving a gap. */
.refund-theme .tab-pane,
.refund-theme .rt-tabpanel{ counter-reset:rt-sec; }
/* `.section-title` is the READ-ONLY view's name for the same thing (StudentRegistrationView) - same
   concept, same treatment, so it shares the rule instead of getting a page-scoped copy. */
.refund-theme .titleCom,
.refund-theme .section-title{
  display:flex; align-items:center; gap:9px;
  counter-increment:rt-sec;
  margin:4px 0 14px; padding:0 0 8px;
  border-bottom:1px solid var(--line);
  font-size:13px; font-weight:600;
  /* ink, not brand - the numbered badge carries the accent, so the words don't need to as well. Same value
     as `.frr-cardtitle`; these are one heading under three class names, so keep them in step. */
  color:var(--ink);
  text-transform:none; letter-spacing:0;
}
/* the numbered badge - same 20px brand circle as .frr-cardnum on the enquiry page */
.refund-theme .titleCom::before,
.refund-theme .section-title::before{
  content:counter(rt-sec);
  flex:0 0 auto; width:20px; height:20px; border-radius:50%;
  background:var(--brand); color:var(--on-brand);
  display:inline-flex; align-items:center; justify-content:center;
  font-size:11px; font-weight:700; line-height:1;
}
/* the heading doubles as a checkbox row on some sections (e.g. "Permanent Address / Copy as current") */
.refund-theme .titleCom input[type="checkbox"]{
  -webkit-appearance:checkbox; appearance:auto; accent-color:var(--brand);
  width:15px; height:15px; margin:0 !important; vertical-align:middle; cursor:pointer;
}

/* ---- SECTION CARD - the numbered heading and the fields under it are ONE card ----
   This is the look the enquiry pages have, where each section is hand-written as
   `.box.box-primary > .box-header.frr-ch + .box-body`: a tinted header strip carrying the numbered badge,
   then a white body, the two joined as a single bordered card.
   The legacy form family cannot use that markup - its heading and its fields are SIBLINGS, not nested:

       <div class="row"><div class="col-sm-12"><div class="titleCom">Student Details</div></div></div>
       <div class="box-body"> ...fields... </div>

   ...and rewriting ~15 of those per page is exactly the kind of churn the theme avoids. So the pair is
   welded into a card here instead: the heading's row becomes the header strip, and the `.box-body` that
   FOLLOWS it becomes the body, sharing one border and one radius.
   COMMON on purpose. An earlier revision did this page-scoped, and that page's sections immediately stopped
   matching the identical sections elsewhere - the theme drifting one page at a time (R2). Change it here and
   every page moves together.
   Note the `.row` has to give up Bootstrap's negative side margins, and its column its 15px padding, or the
   header strip ends up wider than the body it sits on. */
.refund-theme .tab-pane .row:has(> [class*="col-"] > .titleCom),
.refund-theme .rt-tabpanel .row:has(> [class*="col-"] > .titleCom){
  margin:0; padding:9px 16px;
  background:linear-gradient(180deg,var(--surface),var(--head-tint));
  border:1px solid var(--line); border-bottom:0; border-radius:8px 8px 0 0;
}
.refund-theme .tab-pane .row:has(> [class*="col-"] > .titleCom) > [class*="col-"],
.refund-theme .rt-tabpanel .row:has(> [class*="col-"] > .titleCom) > [class*="col-"]{
  padding-left:0; padding-right:0;
}
/* inside the header strip the heading provides no spacing or rule of its own - the strip does both */
.refund-theme .tab-pane .row:has(> [class*="col-"] > .titleCom) .titleCom,
.refund-theme .rt-tabpanel .row:has(> [class*="col-"] > .titleCom) .titleCom{
  margin:0; padding:0; border-bottom:0;
}
.refund-theme .tab-pane .row:has(> [class*="col-"] > .titleCom) + .box-body,
.refund-theme .rt-tabpanel .row:has(> [class*="col-"] > .titleCom) + .box-body{
  background:var(--surface);
  border:1px solid var(--line); border-top:0; border-radius:0 0 8px 8px;
  margin:0 0 14px; padding:14px 16px 2px !important;
}

/* =====================================================================
   TABS - ONE COMMON DESIGN FOR THE WHOLE THEME  (.rt-tabs)
   ---------------------------------------------------------------------
   Before this block there were three different tab looks in the codebase:
   AdminLTE's `.nav-tabs-custom` (RegistrationDetails), the hand-rolled
   `.tab-item` (the follow-up popups) and the theme's own `.apv-tabs`.
   They are now ONE design, defined once here.

   Two ways to get it:
     a) NEW markup - use the theme classes directly:
          <div class="rt-tabs">
            <div class="rt-tabstrip">
              <a class="rt-tab on">Student Detail</a>
              <a class="rt-tab">Parents Detail</a>
            </div>
            <div class="rt-tabpanel"> ...sections... </div>
          </div>
     b) EXISTING markup - leave Bootstrap/AdminLTE tabs alone. The legacy
        selectors are mapped onto the same rules below, so a converted page
        keeps `data-toggle="tab"` working (no JS change) and still gets the
        new design. This is what RegistrationDetails does.

   The active tab is marked by a 2px brand bar, matching the sort/tab
   treatment used elsewhere in the theme.
   ===================================================================== */
.refund-theme .rt-tabs,
.refund-theme .nav-tabs-custom{
  background:var(--surface); border-radius:8px; box-shadow:var(--shadow); margin-bottom:16px;
}
/* ---- the strip ---- */
.refund-theme .rt-tabstrip,
.refund-theme .nav-tabs-custom > .nav-tabs{
  display:flex; align-items:flex-end; flex-wrap:wrap; gap:2px;
  margin:0; padding:0 8px; border-bottom:1px solid var(--line);
  background:linear-gradient(180deg,var(--surface),var(--head-tint));
  border-radius:8px 8px 0 0;
}
.refund-theme .nav-tabs-custom > .nav-tabs > li{ position:relative; margin-bottom:-1px; border-top:0; float:none; }

/* ===== MOBILE: ONE SWIPEABLE ROW INSTEAD OF A STACK OF TABS =====
   The strip above is `flex-wrap: wrap`, which is right on a desktop and poor on a
   phone. Measured on Student Registration at a 412px viewport: five tabs wrapped
   onto THREE ragged rows and the strip stood 120px tall before any content -
   roughly a third of the screen spent on navigation, with tabs in a different
   place each time one is shown or hidden (Upload/Documents and the Fees tab are
   both conditional, so the rows reflow as you go).

   Below 768px it becomes a single non-wrapping row that scrolls sideways - the
   normal mobile tab pattern, and it keeps every tab in a stable position.
   Nothing above 767px changes.

   The scrollbar is hidden deliberately: this is a short strip the user swipes,
   and a permanent horizontal bar under the tabs reads as a rendering fault.
   -webkit-overflow-scrolling gives iOS its momentum scroll. */
@media (max-width: 767px) {
    .refund-theme .rt-tabstrip,
    .refund-theme .nav-tabs-custom > .nav-tabs {
        flex-wrap: nowrap;
        overflow-x: auto;
        overflow-y: hidden;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
    }

        .refund-theme .rt-tabstrip::-webkit-scrollbar,
        .refund-theme .nav-tabs-custom > .nav-tabs::-webkit-scrollbar {
            display: none;
        }

        .refund-theme .nav-tabs-custom > .nav-tabs > li {
            flex: 0 0 auto;
        }

            /* a tab must not be squeezed to two lines mid-strip */
            .refund-theme .rt-tab,
            .refund-theme .nav-tabs-custom > .nav-tabs > li > a {
                white-space: nowrap;
                padding: 10px 13px;
            }
}
/* ---- a tab ---- */
.refund-theme .rt-tab,
.refund-theme .nav-tabs-custom > .nav-tabs > li > a{
  display:inline-flex; align-items:center; gap:7px;
  padding:10px 16px; border:1px solid transparent; border-bottom:none; border-radius:7px 7px 0 0;
  font-size:12.5px; font-weight:600; color:var(--muted); background:transparent;
  text-decoration:none; cursor:pointer;
}
.refund-theme .rt-tab:hover,
.refund-theme .nav-tabs-custom > .nav-tabs > li > a:hover{ color:var(--brand-dark); background:var(--row-hover-soft); }
/* ---- active tab: `.on` for new markup, `li.active` for legacy ---- */
.refund-theme .rt-tab.on,
.refund-theme .nav-tabs-custom > .nav-tabs > li.active > a,
.refund-theme .nav-tabs-custom > .nav-tabs > li.active > a:hover,
.refund-theme .nav-tabs-custom > .nav-tabs > li.active > a:focus{
  color:var(--brand-dark) !important; background:var(--surface) !important;
  border-color:var(--line) !important; border-bottom:1px solid var(--surface) !important;
}
.refund-theme .rt-tab.on:after,
.refund-theme .nav-tabs-custom > .nav-tabs > li.active > a:after{
  content:""; position:absolute; left:0; right:0; top:-1px; height:2px;
  background:var(--brand); border-radius:2px 2px 0 0;
}
.refund-theme .rt-tab{ position:relative; }
/* AdminLTE colours the active tab's top border; the brand bar above replaces it */
.refund-theme .nav-tabs-custom > .nav-tabs > li.active{ border-top-color:transparent !important; }
/* the tab icons inherit the tab's colour instead of AdminLTE's per-tab brown/red/pink */
.refund-theme .nav-tabs-custom > .nav-tabs > li > a > i{ color:inherit !important; font-size:13px; }
/* ---- the panel ----
   The panel takes the PAGE background, not white: its content is a stack of white `.box` cards (the
   enquiry-page layout), and white-on-white would flatten them into one sheet. On a tinted panel each
   card reads as a separate card exactly as it does on AdmissionDetails. */
.refund-theme .rt-tabpanel,
.refund-theme .nav-tabs-custom > .tab-content{
  padding:14px; background:var(--panel); border-radius:0 0 8px 8px;
}
/* cards inside a tab panel: last one loses its bottom margin so the panel padding is the only gap */
.refund-theme .rt-tabpanel > form > .box:last-child,
.refund-theme .nav-tabs-custom > .tab-content > .tab-pane > form > .box:last-child{ margin-bottom:0; }
/* a button riding in the strip (e.g. Back to List as a pull-right <li>) is not a tab */
/* ---------------------------------------------------------------------
   Action buttons parked in a tab strip: make `pull-right` actually work
   ---------------------------------------------------------------------
   Legacy views drop `<li class="pull-right">` into the tab strip for page
   actions (Collect Fees has four: Optional Fee / Concession / Food /
   Transport). `pull-right` is `float:right`, and THE STRIP ABOVE IS A FLEX
   CONTAINER - float is ignored on a flex item. So those buttons quietly
   rendered immediately after the last tab and stopped mid-strip (measured
   on Collect Fees: the group ended ~440px short of the right edge), which
   read as "the button is in the middle of the tabs" rather than an action
   group. `margin-left:auto` on the first one eats the free space and pushes
   the whole group to the right edge; the ones after it must not, or each
   would push away from the previous and they would spread across the strip.
   `:not(.ng-hide)` matters: these <li> are `ng-show`n independently, so if
   the reset were keyed on position alone, hiding the first button would
   take the auto margin with it and the rest would snap back to the middle.
   A hidden sibling must not cancel the next one's margin.
   Under flex, source order is plain left-to-right - so the PRIMARY action
   is authored LAST to sit right-most, not first as float would have needed.
   --------------------------------------------------------------------- */
.refund-theme .nav-tabs-custom > .nav-tabs > li.pull-right{ float:none !important; margin-left:auto; }
.refund-theme .nav-tabs-custom > .nav-tabs > li.pull-right:not(.ng-hide) ~ li.pull-right{ margin-left:0; }
/* the strip is bottom-aligned for tabs; buttons need a little breathing room off the edge */
.refund-theme .nav-tabs-custom > .nav-tabs > li.pull-right > .rt-btn{ margin:5px 0; }

.refund-theme .nav-tabs-custom > .nav-tabs > li.rd-backli{ margin-left:auto; padding:5px 4px 5px 0; }
.refund-theme .nav-tabs-custom > .nav-tabs > li.rd-backli > a{ padding:0; }
.refund-theme .nav-tabs-custom > .nav-tabs > li.rd-backli.active > a:after{ display:none; }

/* The follow-up popups' hand-rolled strip now points at the same design (kept as aliases so their
   markup did not need touching a second time). */
.refund-theme .rt-fu-tabhead{ display:flex; gap:2px; border-bottom:1px solid var(--line); }
.refund-theme .rt-fu-tab{
  position:relative; padding:10px 16px; font-size:12.5px; font-weight:600; color:var(--muted);
  cursor:pointer; border:1px solid transparent; border-bottom:none; border-radius:7px 7px 0 0;
  margin-bottom:-1px;
}
.refund-theme .rt-fu-tab:hover{ color:var(--brand-dark); background:var(--row-hover-soft); }
.refund-theme .rt-fu-tab.on{
  color:var(--brand-dark); background:var(--surface);
  border-color:var(--line); border-bottom:1px solid var(--surface);
}
.refund-theme .rt-fu-tab.on:after{
  content:""; position:absolute; left:0; right:0; top:-1px; height:2px;
  background:var(--brand); border-radius:2px 2px 0 0;
}

/* =====================================================================
   REGISTRATION DETAILS  (Views/Admission/RegistrationDetails.cshtml)
   ---------------------------------------------------------------------
   Field conversion + tab strip + section headings are all COMMON (above).
   Only this page's own corrections live here.
   ===================================================================== */
/* inputs inside this legacy form are sized by NewFormCSS's viewport-scaling --field-height with
   !important, so the common 36px has to be re-asserted at the same strength (same as AdmissionDetails).
   PADDING IS DELIBERATELY NOT SET HERE. It used to be `padding:0 12px !important`, and that shorthand
   reset padding-left/right - beating the common icon-clearance rule
   (`.field-set:has(> .left_icon) input.text{padding-left:32px}`) on a specificity tie because this block
   sits later in the file. The result: the phone/envelope glyph sat on top of the placeholder text.
   Only the vertical padding is pinned; horizontal padding comes from the common rules, which already
   account for whether the field has an inline icon. */
.refund-theme.registrationdetails-page .input-container input.text,
.refund-theme.registrationdetails-page .input-container input.form-control{
  height:36px !important; line-height:normal !important;
  padding-top:0 !important; padding-bottom:0 !important; font-size:12.5px !important;
}
.refund-theme.registrationdetails-page .input-container textarea.text,
.refund-theme.registrationdetails-page .input-container textarea.form-control{
  height:auto; min-height:36px; padding:8px 12px !important; font-size:12.5px !important;
}
/* wizard footer (Previous / Next / Save): geometry comes from the COMMON .rt-stickybar rules, so it is
   pinned to the bottom of the viewport rather than static at the end of a very long form.
   Buttons sit on the RIGHT; the notify tick boxes occupy the left of the same bar (below). */
.refund-theme.registrationdetails-page .rd-wizardbar{ justify-content:flex-end; }
.refund-theme.registrationdetails-page{ padding-bottom:66px; }

/* ---- Upload tab: document list ----
   The old markup gave the name column no width, so Bootstrap collapsed it to ~90px and every document
   name wrapped over 4-5 lines, making each row ~130px tall. Widths are set in the markup; these rules
   handle the typography and keep each row to a single compact line. */
.refund-theme.registrationdetails-page .rd-doctable td{ vertical-align:middle; }
/* the grid's own `th` rule centres every header; these two columns are left-aligned content, so their
   headers must match. The markup already says .text-left - this makes it stick over the grid default. */
.refund-theme.registrationdetails-page .rd-doctable th.text-left{ text-align:left !important; }
.refund-theme.registrationdetails-page .rd-doctable th.text-center{ text-align:center !important; }
.refund-theme.registrationdetails-page .rd-docname{ font-size:12.5px; font-weight:600; color:var(--ink); }
/* limits/extensions read as a caption under the name, not as loose wrapped words */
.refund-theme.registrationdetails-page .rd-dochint{
  display:block; margin-top:2px; font-size:11px; color:var(--muted); white-space:nowrap;
}
/* the file row is a single field; no extra bottom margin from the legacy field wrapper */
.refund-theme.registrationdetails-page .rd-doctable .component.input-container{ margin:0 !important; }
.refund-theme.registrationdetails-page .rd-doctable .field-set{ max-width:520px; }
/* browse / clear icons: flat glyphs like every other inline icon, not filled badges */
.refund-theme.registrationdetails-page .rd-doctable .right_icon label{ margin:0 !important; cursor:pointer; }
.refund-theme.registrationdetails-page .rd-doctable .right_icon .glyphicon{ font-size:13px; }
.refund-theme.registrationdetails-page .rd-doc-clear .glyphicon{ color:var(--no) !important; }
.refund-theme.registrationdetails-page .rd-doc-clear{ background:none !important; }
/* a picked file's name is shown in a disabled input - keep it readable rather than greyed out */
.refund-theme.registrationdetails-page .rd-doctable input.image-preview-filename[disabled]{
  background:var(--surface) !important; color:var(--ink) !important;
  -webkit-text-fill-color:var(--ink) !important; cursor:default;
}

/* ---- notify tick boxes in the footer ----
   The Send SMS / Email / WhatsApp row decides what Save sends out, so it belongs beside Save. Rather
   than physically moving ~90 lines of markup (and its ng-if status spans) out of the form, the row is
   lifted into the SAME fixed strip as the buttons: it is pinned bottom-left, the buttons stay
   bottom-right, and both sit on the one bar. Bootstrap's row/col layout inside it is flattened to a
   flex line so three `col-sm-*` blocks read as three inline checkboxes.
   Everything about the inputs - ids, ng-model, ng-disabled, ng-change, the ng-if status text - is
   untouched; only where the row is drawn has changed. */
.refund-theme.registrationdetails-page .rd-notify-row{
  position:fixed; left:230px; bottom:0; z-index:1001;
  height:56px; display:flex; align-items:center; gap:18px;
  margin:0 !important; padding:0 22px; pointer-events:auto;
}
body.sidebar-collapse .refund-theme.registrationdetails-page .rd-notify-row{ left:50px; }
/* "NOTIFY" caption in front of the tick boxes, same as the AdmissionDetails footer group. Added with
   ::before rather than markup so the row itself stays exactly as the form defines it. */
.refund-theme.registrationdetails-page .rd-notify-row::before{
  content:"Notify";
  flex:0 0 auto; margin-right:2px;
  font-size:10.5px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.4px; white-space:nowrap;
}
/* flatten the row/col scaffolding */
.refund-theme.registrationdetails-page .rd-notify-row > [class*="col-"]{
  width:auto !important; float:none !important; padding:0 !important;
  display:flex; align-items:center; gap:6px; flex-wrap:nowrap;
}
.refund-theme.registrationdetails-page .rd-notify-row .component.input-container{
  flex-direction:row !important; align-items:center !important; gap:7px; margin:0 !important;
}
.refund-theme.registrationdetails-page .rd-notify-row .component.input-container > label{
  order:0; margin:0 !important; font-size:11.5px; font-weight:600 !important; color:var(--muted);
  text-transform:uppercase; letter-spacing:.3px; white-space:nowrap; cursor:pointer;
}
.refund-theme.registrationdetails-page .rd-notify-row .component.input-container > label br{ display:none; }
/* the "(Active)" / "(Not Configured)" notes sit inline after each name, not stacked under it */
.refund-theme.registrationdetails-page .rd-notify-row .text-muted{
  display:inline !important; margin:0 !important; font-size:11px !important; white-space:nowrap;
}
/* validation-error state: COMMON (see the two ERROR blocks at the top of this file) */

/* =====================================================================
   REGISTRATION INQUIRY  (Views/Admission/RegistrationInquiry.cshtml)
   ---------------------------------------------------------------------
   Grid page: toolbar + one filter row + grid. Everything else is common
   (.rt-modal popup header, field sizes, .critbar if added later), so only
   the filter row lives here. No field sizes redeclared.
   ===================================================================== */
/* .ri-filters is styled by the COMMON .rt-filterrow rule; the .critbar offset is common too.
   Nothing page-specific is left for this page. */

/* =====================================================================
   MANAGE REGISTRATION  (Views/Admission/ManageRegistration.cshtml)
   ---------------------------------------------------------------------
   Same shape as Registration Inquiry: toolbar + one filter row + grid +
   two popups. Everything it needs is COMMON - .frr-toolbar, .rt-filterrow
   (the header's second row), .critbar, .rt-modal, .rt-btn/.rt-ico, field
   sizes, the validation-error blocks. Only the critbar's own offset is
   page-level, because it sits inside .box-header here rather than above it.
   NO field sizes, NO error colours, NO filter-row layout and NO .critbar
   offset are redeclared - all four are common. This page therefore needs
   no CSS of its own at all.
   ===================================================================== */
/* validation-error state: COMMON (see the two ERROR blocks at the top of this file) */

/* =====================================================================
   FINAL REGISTRATION INQUIRY  (Views/Admission/FinalRegistrationInquiry.cshtml)
   ---------------------------------------------------------------------
   Toolbar + critbar + grid, no header filter row (Academic Year lives in
   the Filter popup). Everything it needs is common. No page CSS.
   ===================================================================== */

/* =====================================================================
   CLASS RESTRICTION SETUP  (Views/ClassRestrictionSetUp/ClassRestrictionSetUp.cshtml)
   ---------------------------------------------------------------------
   A settings page: one row per class with a <switch>. No filters, no
   pagination, no popups - so no .critbar, no .rt-filterrow, no .rt-modal.
   The <switch> skin is common (see TOGGLE SWITCH). Only the help line
   under the title and this page's table inset are page-level.
   ===================================================================== */
/* one line of help under the title, explaining what the toggle does */
.refund-theme.classrestrictionsetup-page .crs-note{
  padding:0 16px 12px; font-size:12px; color:var(--muted); line-height:1.5;
}
.refund-theme.classrestrictionsetup-page .crs-note b{ color:var(--ink); font-weight:600; }
/* This .box-body holds a plain .table-responsive rather than a paginated .dataTables_wrapper, so the
   common "grid box-body" rule does not reach it - but the table should still span the full card, like
   every other table in the theme. Scoped here on purpose: `.table-responsive` on its own also appears
   inside form cards elsewhere, where the 16px inset IS wanted. */
.refund-theme.classrestrictionsetup-page .box-body{ padding:0 0 12px !important; }
/* the class-name column is the row's subject, so it reads as a name, not as data filler */
.refund-theme.classrestrictionsetup-page td.lblClass{ font-weight:600; color:var(--ink); }

/* =====================================================================
   STUDENT ADVANCE SEARCH  (Views/StudentAdvanceSearch/StudentAdvanceSearch.cshtml)
   ---------------------------------------------------------------------
   TWO modes in one card, switched by the page's own ng-show pair:
     1. a 13-criteria search form   2. the results grid
   The page used to carry its own <style> block. Three of those five rules
   are now handled by common components and are deleted, not moved:
     .searched-criteria-box / .criteria-title / .criteria-item -> .critbar
     .action-buttons / .icon-btn                               -> .rt-ico
   What is left below is genuinely page-specific: the form's field grid,
   the row photo thumbnail, and the fixed hover preview.
   NO field sizes, NO error colours, NO .critbar styling redeclared.
   ===================================================================== */
/* the criteria form: the legacy `.component.input-container` fields are converted to label-above-field
   by the COMMON block, so all this row needs is the inset + a bottom gap before the action row */
/* no top padding: the gap below the brand bar is the bar's own margin-bottom */
.refund-theme.studentadvancesearch-page .sas-form{ padding:0 16px; }
/* This is a 15-field criteria grid, five rows deep, and it is the whole page - so the row rhythm matters
   more here than on a form where each section is short. The common 14px bottom margin left it looking
   loose and list-like; 10px keeps the five rows reading as one block. Scoped, because the long
   AdmissionDetails / RegistrationDetails forms want the roomier common spacing between their cards. */
.refund-theme.studentadvancesearch-page .sas-form .component.input-container{ margin:0 0 10px !important; gap:4px; }
/* Search / Reset. These were `btn-primary btn-sm` inside a `.component.input-container` wrapped around a
   `.col-md-8` - a form-field component around a grid column, holding no field. Plain action row instead. */
.refund-theme.studentadvancesearch-page .sas-actions{
  display:flex; gap:8px; align-items:center;
  margin:2px 16px 0; padding:12px 0 14px; border-top:1px solid var(--line);
}
/* row action cell: three controls side by side, one of them a dropdown. `nowrap` so the three never
   stack onto a second line and inflate the row height. */
.refund-theme.studentadvancesearch-page .sas-actioncell{
  display:flex; align-items:center; justify-content:center; gap:5px; flex-wrap:nowrap;
}
/* UNEQUAL GAPS: the common `.rt-ico + .rt-ico{margin-left:4px}` exists for inline (non-flex) action
   cells. In this flex cell it STACKS on top of `gap`, so Edit->View got 4px+gap while View->the dropdown
   got only `gap` - the third button is wrapped in a `.dropdown` div, so it is not an adjacent .rt-ico
   sibling and never picked the margin up. Zero the margin here and let `gap` alone space all three. */
.refund-theme.studentadvancesearch-page .sas-actioncell .rt-ico + .rt-ico{ margin-left:0; }
.refund-theme.studentadvancesearch-page .sas-actioncell .dropdown{ display:flex !important; }
/* the "More Actions" caret must not be painted by Bootstrap's .dropdown-toggle rules, and must not draw
   Bootstrap's little triangle after the icon */
.refund-theme.studentadvancesearch-page .sas-actioncell .dropdown-toggle{ box-shadow:none; }
.refund-theme.studentadvancesearch-page .sas-actioncell .dropdown-toggle .caret{ display:none; }
/* The "More Actions" panel, opening DOWNWARD from its button (`dropup` is gone from the markup).
   THE CLIPPING PROBLEM: the grid lives in `.attendance_table_scroll`, which is `max-height:700px;
   overflow-y:auto` - and an `overflow` ancestor clips an absolutely-positioned descendant. So on the last
   visible row the panel was sliced off at the container's bottom edge. (That is why the original markup
   used `dropup`: opening upward dodged the clip, at the cost of opening the wrong way.) Removing the
   overflow is not an option - it is what makes the sticky header work.
   THE FIX: `position:fixed`. A fixed element is positioned against the viewport, so ancestor `overflow`
   does not clip it.
   VERTICAL: `top`/`bottom` left `auto`, so the panel keeps its STATIC vertical position - exactly the row
   it belongs to, no coordinates and no JS. This is why `top:100%` must NOT be set: on a fixed box that is
   100% of the VIEWPORT, which would throw the panel to the bottom of the screen.
   HORIZONTAL: `left`/`right` also left `auto`, so the panel keeps its static horizontal position too -
   directly under the button. Action is the FIRST column on this grid (see the view for why), so there is
   plenty of room to the right and the panel grows into the row rather than off an edge. If Action ever
   moves to the last column, swap this for `right:26px` - a panel growing rightwards from a button at the
   right edge runs off screen.
   Caveat worth knowing: being viewport-fixed, it does not follow the grid if you scroll while it is open.
   Bootstrap closes it on the next outside click, and an unclipped menu that can be read beats a clipped
   one that cannot. If an ancestor ever gains a `transform`, `fixed` degrades to `absolute` against that
   ancestor and the clipping returns - so don't add one to the grid wrappers. */
/* Only the ESCAPE-THE-CLIPPING part is page-specific now. The panel's LOOK and its rows were written
   here first and have been promoted to the COMMON `.dropdown-menu` block (search "BOOTSTRAP DROPDOWN
   MENU - COMMON"), because a Bootstrap dropdown is not a Student Advance Search component - the Export
   menu on the Scrutiny Authority pages is the same control, and it was rendering in stock Bootstrap
   grey until these rules stopped being page-scoped. */
.refund-theme.studentadvancesearch-page .sas-actioncell .dropdown-menu{
  position:fixed !important; z-index:99999 !important;
  top:auto !important; bottom:auto !important; left:auto !important; right:auto !important;
}
/* student / parent photo thumbnail in a grid cell */
.refund-theme.studentadvancesearch-page .table-photo{
  width:40px; height:50px; border-radius:5px; border:1px solid var(--line); object-fit:cover; cursor:pointer;
}
/* Hover preview, anchored NEXT TO the thumbnail being hovered rather than centred on screen.
   The position comes from the inline `ng-style="previewStyle"` the markup now binds - showPreview()
   was already computing it from the hovered image's getBoundingClientRect() and nothing was reading it.
   So NO top/left/transform here: setting them would fight the inline values (and `transform` in
   particular would re-centre the panel and undo the whole point). Only the look is styled.
   Kept out of the scroll container in the markup - a fixed element inside a scrolling ancestor is
   clipped once the grid scrolls.
   The scrollY/scrollX double-count that used to be noted here IS NOW FIXED in showPreview()
   (StudentAdvanceSearch.js): because this panel is position:fixed and getBoundingClientRect() is
   already viewport-relative, adding the scroll offset pushed the panel off-screen as soon as the
   window was scrolled - hovering looked like it did nothing. showPreview() now also opens the panel
   ABOVE the thumbnail, flipping below only when there is no room, and clamps it into the viewport.
   The size assumptions there (164x204) come from the two rules below - change one, change both. */
.refund-theme.studentadvancesearch-page .sas-preview{
  position:fixed; z-index:99999;
  background:var(--surface); padding:6px; border:1px solid var(--line); border-radius:8px;
  box-shadow:0 10px 30px rgba(16,42,74,.28); pointer-events:none;
  /* NEVER WIDER OR TALLER THAN THE SCREEN - bug sheet 189 ("on mobile the photo gets cut").
     A fixed 150x190 panel is comfortable on a desktop and can be most of a phone's screen,
     and once it was positioned relative to a thumbnail near an edge the overflow was simply
     clipped away. These caps let it shrink to fit instead of being cut; showPreview() MEASURES
     the panel after render rather than assuming the desktop size, so the placement follows
     whatever size these rules produce. */
  max-width:calc(100vw - 16px); max-height:calc(100vh - 16px); box-sizing:border-box;
}
.refund-theme.studentadvancesearch-page .sas-preview img{
  display:block; width:150px; height:190px; object-fit:cover; border-radius:5px;
  /* width/height above stay the preferred size; these two let the image shrink on a small
     screen. object-fit switches to contain at that point so a shrunk photo is not cropped -
     the whole complaint was not being able to see the photo properly. */
  max-width:100%; max-height:calc(100vh - 28px);
}
@media (max-width: 480px){
  .refund-theme.studentadvancesearch-page .sas-preview img{ object-fit:contain; height:auto; }
}

/* =====================================================================
   TC TEMPLATE BUILDER - grid  (Views/TcTemplateBuilder/TcTemplateBuilder.cshtml)
   ---------------------------------------------------------------------
   The templates list. Toolbar, grid, pagination and `.rt-ico` actions are
   all common; the two status pills are the only page-level rules, and
   they reuse the theme's `.frr-status` shape.
   The builder itself is below.
   ===================================================================== */
/* (`.st-tct-on` / `.st-tct-off` deleted - they were `.rt-st-ok` / `.rt-st-no` under another
   name. The view uses the common classes now.) */

/* ---------------------------------------------------------------------
   TC TEMPLATE BUILDER - the editor  (_CommonTemplateBuilder.cshtml)
   ---------------------------------------------------------------------
   Replaces a ~705-line page <style> that was a standalone HTML mock-up
   pasted in whole - over half of it styled a sidebar, top bar and
   breadcrumb that do not exist in the file. Three of its rules reached
   the entire page and are gone for good:
     * `* { box-sizing:border-box; margin:0; padding:0 }` - a universal
       reset, from a partial. It stripped margin and padding off every
       element on the page, the layout's chrome included.
     * `:root { --muted: #8a94a3; ... }` - `--muted` is one of THIS
       file's tokens. Redefining it re-coloured muted text page-wide.
     * bare `.btn`, `.card`, `.breadcrumb`.
   Everything below is prefixed `tcb-` so it cannot collide again. The
   tab strip is the theme's common `.rt-tabstrip`; the fields, buttons
   and checkboxes are common too.
   --------------------------------------------------------------------- */
/* the template name sits in the toolbar's title slot, with its label above it */
.refund-theme.tctemplate-page .tcb-namewrap{ flex-direction:column; align-items:flex-start; gap:3px; }
.refund-theme.tctemplate-page .tcb-namelbl{
  margin:0; font-size:11px; font-weight:600; letter-spacing:.3px; text-transform:uppercase; color:var(--muted);
}
.refund-theme.tctemplate-page .tcb-name{ width:320px; max-width:100%; }

/* ---- two-pane split: editor | preview ---- */
.refund-theme.tctemplate-page .tcb-split{ display:flex; gap:16px; align-items:flex-start; }
.refund-theme.tctemplate-page .tcb-pane{
  flex:1 1 0; min-width:0;
  border:1px solid var(--line); border-radius:8px; background:var(--surface); overflow:hidden;
}
@media (max-width:1200px){
  .refund-theme.tctemplate-page .tcb-split{ flex-direction:column; }
  .refund-theme.tctemplate-page .tcb-pane{ width:100%; }
}
.refund-theme.tctemplate-page .tcb-tabs{ padding:0 10px; background:var(--surface-2); }
.refund-theme.tctemplate-page .tcb-editor{ padding:14px; }
.refund-theme.tctemplate-page .tcb-panel{ /* renamed from `.panel`, which is a Bootstrap component */ }

/* ---- merge-field chips ---- */
.refund-theme.tctemplate-page .tcb-mf{ margin-bottom:10px; }
.refund-theme.tctemplate-page .tcb-mf-lbl{
  margin-bottom:6px; font-size:10.5px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; color:var(--muted);
}
.refund-theme.tctemplate-page .tcb-mf-lbl span{ font-weight:400; letter-spacing:0; text-transform:none; }
.refund-theme.tctemplate-page .tcb-mf-chips{ display:flex; flex-wrap:wrap; gap:6px; }
.refund-theme.tctemplate-page .tcb-chip{
  padding:3px 9px; border-radius:4px; cursor:pointer;
  background:var(--brand-light); border:1px solid var(--brand-hover-border); color:var(--brand-dark);
  font-family:Consolas,"Courier New",monospace; font-size:11.5px;
  transition:background .12s, border-color .12s;
}
.refund-theme.tctemplate-page .tcb-chip:hover{ background:var(--brand); border-color:var(--brand); color:var(--on-brand); }

/* ---- the code editor. A dark surface is correct here - it is a code field, and the theme's own
   ".datepicker"-style exception applies: this is not chrome, it is content of a different kind. ---- */
.refund-theme.tctemplate-page .tcb-codewrap{ position:relative; }
.refund-theme.tctemplate-page .tcb-code{
  width:100%; min-height:260px; resize:vertical; display:block;
  padding:14px 44px 14px 16px;
  background:#1e2733; color:#dfe7ef;
  border:1px solid #1e2733; border-radius:7px;
  font-family:Consolas,"Courier New",monospace; font-size:12px; line-height:1.7;
  tab-size:2;
}
.refund-theme.tctemplate-page .tcb-code:focus{ outline:none; border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light); }
/* the Beautify button floats in the editor's top-right corner */
.refund-theme.tctemplate-page .tcb-beautify{
  position:absolute; top:8px; right:8px; z-index:2;
  width:28px; height:28px; border-radius:5px; padding:0;
  display:inline-flex; align-items:center; justify-content:center;
  background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.18); color:#dfe7ef;
  cursor:pointer;
}
.refund-theme.tctemplate-page .tcb-beautify:hover{ background:var(--brand); border-color:var(--brand); color:var(--on-brand); }
.refund-theme.tctemplate-page .tcb-hint{ margin-top:8px; font-size:11.5px; color:var(--muted); line-height:1.55; }
.refund-theme.tctemplate-page .tcb-hint code{
  padding:1px 5px; border-radius:3px; background:var(--surface-2); border:1px solid var(--line);
  color:var(--brand-dark); font-size:11px;
}

/* ---- header / footer options ---- */
.refund-theme.tctemplate-page .tcb-opt{ margin:0 0 12px; }
.refund-theme.tctemplate-page .tcb-optnote{ font-size:11px; color:var(--muted); }
.refund-theme.tctemplate-page .tcb-typefld{ width:200px; margin-bottom:14px; }

/* ---- image drop zone ---- */
.refund-theme.tctemplate-page .tcb-drop{
  padding:26px 20px; text-align:center; cursor:pointer;
  border:2px dashed var(--grip); border-radius:9px; background:var(--surface-2);
  transition:border-color .15s, background .15s;
}
.refund-theme.tctemplate-page .tcb-drop:hover{ border-color:var(--brand); background:var(--brand-light); }
.refund-theme.tctemplate-page .tcb-drop-ico{ display:block; margin-bottom:8px; font-size:28px; color:var(--brand); }
.refund-theme.tctemplate-page .tcb-drop-title{ font-size:12.5px; font-weight:600; color:var(--ink); }
.refund-theme.tctemplate-page .tcb-imgprev{ margin-top:14px; }
.refund-theme.tctemplate-page .tcb-imgprev img{
  display:block; max-width:100%; max-height:300px;
  border:1px solid var(--line); border-radius:6px; background:var(--surface);
}
.refund-theme.tctemplate-page .tcb-imgacts{ margin-top:10px; }

/* ---- preview pane ---- */
.refund-theme.tctemplate-page .tcb-pane-head{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:9px 12px; background:var(--surface-2); border-bottom:1px solid var(--line);
}
.refund-theme.tctemplate-page .tcb-pane-title{
  font-size:11px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; color:var(--muted);
}
.refund-theme.tctemplate-page .tcb-pvbtns{ display:flex; gap:6px; flex-wrap:wrap; margin-left:auto; }
.refund-theme.tctemplate-page .tcb-stage{
  padding:16px; background:var(--row-alt); max-height:74vh; overflow:auto;
}
/* the rendered certificate: paper, not chrome. No brand colour - it is a preview of the printed output. */
.refund-theme.tctemplate-page .tcb-paper{
  background:#fff; border:1px solid var(--line); box-shadow:0 2px 10px rgba(16,42,58,.10);
  padding:24px; margin:0 auto; max-width:800px;
  font-size:13px; color:#222; line-height:1.6;
}
.refund-theme.tctemplate-page .tcb-paper img{ max-width:100%; }
.refund-theme.tctemplate-page .tcb-paper table{ width:100%; border-collapse:collapse; }

/* =====================================================================
   TRANSFER CERTIFICATE  (Views/TCGenerate/TCGenerate.cshtml)
   ---------------------------------------------------------------------
   Records grid + a three-step generate form + a print preview.
   Replaces a ~710-line page <style> block that styled this screen from
   scratch in a sky-blue palette - a second design language inside an app
   that already has one. Everything that had a theme equivalent now uses
   it (toolbar, filter row, grid, fields, buttons, status pills); what is
   left below is this page's own furniture, on tokens.
   NO field sizes, NO label type and NO button design are redeclared.
   ===================================================================== */
/* the record count, sitting at the end of the filter row */
.refund-theme.tcgenerate-page .tc-count{ margin-left:auto; align-self:flex-end; }
.refund-theme.tcgenerate-page .tc-count-pill{
  display:inline-block; padding:3px 11px; border-radius:11px;
  background:var(--brand-light); border:1px solid var(--brand-hover-border); color:var(--brand-dark);
  font-size:11px; font-weight:700; white-space:nowrap;
}

/* ---- the initial-avatar, at three sizes ----
   Was three separate blocks of inline styles with the same sky-blue gradient. One class. */
.refund-theme.tcgenerate-page .tc-avatar{
  flex:0 0 auto; display:inline-flex; align-items:center; justify-content:center;
  width:28px; height:28px; border-radius:6px;
  background:var(--brand-light); border:1px solid var(--brand-hover-border); color:var(--brand-dark);
  font-size:11.5px; font-weight:700; line-height:1;
}
.refund-theme.tcgenerate-page .tc-avatar-lg{ width:36px; height:36px; border-radius:8px; font-size:14px; }
.refund-theme.tcgenerate-page .tc-avatar-xl{
  width:60px; height:60px; border-radius:10px; font-size:24px;
  background:var(--brand); border-color:var(--brand); color:var(--on-brand);
}
.refund-theme.tcgenerate-page .tc-namecell{ display:inline-flex; align-items:center; gap:9px; }

/* ---- grid: reason cell with a per-row expand ---- */
.refund-theme.tcgenerate-page .tc-reason{
  display:block; cursor:pointer;
  max-width:190px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.refund-theme.tcgenerate-page .tc-reason.on{ max-width:none; white-space:normal; }
.refund-theme.tcgenerate-page .tc-more{
  display:inline-block; margin-top:2px; font-size:11.5px; font-weight:600; color:var(--brand-dark);
}
/* status pills: the theme's `.frr-status` shape, with this page's two states */
.refund-theme.tcgenerate-page .st-tc-issued{ background:var(--ok-bg); color:var(--ok); }
.refund-theme.tcgenerate-page .st-tc-draft{ background:var(--warn-bg); color:var(--warn); }

/* ---- empty / prompt state ---- */
.refund-theme.tcgenerate-page .tc-empty{ text-align:center; padding:44px 20px; color:var(--muted); }
.refund-theme.tcgenerate-page .tc-empty-ico{ font-size:34px; opacity:.35; display:block; margin-bottom:10px; }
.refund-theme.tcgenerate-page .tc-empty p{ margin:0 0 4px; font-size:13.5px; font-weight:600; color:var(--ink); }
.refund-theme.tcgenerate-page .tc-empty small{ font-size:12px; }
.refund-theme.tcgenerate-page .tc-empty b{ color:var(--ink); }

/* ---- form sections. Numbered like every other section heading in the theme. ---- */
.refund-theme.tcgenerate-page .tc-section{ margin-bottom:22px; }
.refund-theme.tcgenerate-page .tc-section-title{
  display:flex; align-items:center; gap:9px;
  margin:0 0 14px; padding-bottom:8px; border-bottom:1px solid var(--line);
  font-size:13px; font-weight:600; color:var(--ink);
}
.refund-theme.tcgenerate-page .tc-step-n{
  flex:0 0 auto; width:20px; height:20px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--brand); color:var(--on-brand); font-size:11px; font-weight:700; line-height:1;
}

/* ---- student search panel ---- */
.refund-theme.tcgenerate-page .tc-panel{
  background:var(--surface-2); border:1px solid var(--line); border-radius:8px; padding:14px 16px;
}
.refund-theme.tcgenerate-page .tc-searchrow{ display:flex; gap:14px; align-items:flex-end; flex-wrap:wrap; }
.refund-theme.tcgenerate-page .tc-searchbtns{ display:flex; gap:8px; align-items:center; }
/* results list */
.refund-theme.tcgenerate-page .tc-results{
  margin-top:12px; max-height:250px; overflow-y:auto;
  background:var(--surface); border:1px solid var(--line); border-radius:7px; box-shadow:var(--shadow);
}
.refund-theme.tcgenerate-page .tc-result{
  display:flex; align-items:center; gap:12px; padding:10px 14px; cursor:pointer;
  border-bottom:1px solid var(--line-soft);
}
.refund-theme.tcgenerate-page .tc-result:last-child{ border-bottom:none; }
.refund-theme.tcgenerate-page .tc-result:hover{ background:var(--row-hover); }
.refund-theme.tcgenerate-page .tc-result-main{ display:flex; flex-direction:column; min-width:0; }
.refund-theme.tcgenerate-page .tc-result-name{ font-size:12.5px; font-weight:600; color:var(--ink); }
.refund-theme.tcgenerate-page .tc-result-meta{ font-size:11.5px; color:var(--muted); margin-top:1px; }
.refund-theme.tcgenerate-page .tc-result-pick{ margin-left:auto; font-size:11.5px; font-weight:700; color:var(--brand-dark); white-space:nowrap; }
.refund-theme.tcgenerate-page .tc-noresult{ padding:10px 2px 0; font-size:12px; font-weight:600; color:var(--no); }

/* ---- selected student summary ---- */
.refund-theme.tcgenerate-page .tc-idcard{
  display:flex; align-items:center; gap:18px; flex-wrap:wrap;
  background:linear-gradient(180deg,var(--surface),var(--head-tint));
  border:1px solid var(--line); border-radius:9px; box-shadow:var(--shadow); padding:14px 16px;
}
.refund-theme.tcgenerate-page .tc-idgrid{
  flex:1; display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:10px 20px; min-width:0;
}
.refund-theme.tcgenerate-page .tc-idfield label{
  display:block; margin:0 0 2px;
  font-size:9.5px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; color:var(--muted);
}
.refund-theme.tcgenerate-page .tc-idfield span{ font-size:12.5px; font-weight:600; color:var(--ink); }

/* ---- the TC form's auto-fit rows ---- */
.refund-theme.tcgenerate-page .tc-grid{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:0 16px; margin-bottom:6px;
}
.refund-theme.tcgenerate-page .tc-actions{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  margin-top:10px; padding-top:14px; border-top:1px solid var(--line);
}
.refund-theme.tcgenerate-page .tc-hint{ margin-right:auto; font-size:12px; color:var(--muted); }
.refund-theme.tcgenerate-page .tc-hint .fa{ color:var(--brand); }

/* ---- preview overlay ----
   A hand-rolled overlay, not a Bootstrap modal: `showModal` is an ng-if flag with its own overlay-click
   handler, so it stays hand-rolled (converting it would need JS) but wears the theme's dialog dress. The
   z-index sits just above Bootstrap's 1050 rather than the original 9999. */
.refund-theme.tcgenerate-page .tc-overlay{
  position:fixed; inset:0; z-index:1060;
  display:flex; align-items:flex-start; justify-content:center; padding:24px 16px;
  background:rgba(16,42,58,.55);
}
.refund-theme.tcgenerate-page .tc-dialog{
  width:100%; max-width:760px; max-height:92vh; overflow-y:auto;
  background:var(--surface); border-radius:8px; box-shadow:0 24px 60px rgba(16,42,58,.3);
}
.refund-theme.tcgenerate-page .tc-dialog-head{
  display:flex; align-items:center; gap:12px;
  padding:12px 16px; background:var(--brand); border-radius:8px 8px 0 0;
}
.refund-theme.tcgenerate-page .tc-dialog-head h4{
  margin:0; font-size:14.5px; font-weight:600; letter-spacing:.2px; color:var(--on-brand);
}
.refund-theme.tcgenerate-page .tc-dialog-head small{ display:block; margin-top:2px; font-size:11.5px; color:rgba(255,255,255,.85); }
.refund-theme.tcgenerate-page .tc-dialog-head .close_custom{
  margin-left:auto; background:transparent; border:none; color:var(--on-brand); opacity:.9;
  font-size:17px; line-height:1; padding:0; cursor:pointer;
}
.refund-theme.tcgenerate-page .tc-dialog-head .close_custom:hover{ opacity:1; }
.refund-theme.tcgenerate-page .tc-dialog-body{ padding:16px; }
.refund-theme.tcgenerate-page .tc-dialog-foot{
  display:flex; gap:9px; justify-content:center; flex-wrap:wrap;
  padding:12px 16px; background:var(--surface-2); border-top:1px solid var(--line); border-radius:0 0 8px 8px;
}

/* ---- the certificate itself ----
   Deliberately NOT theme-branded. This is a preview of a document that gets printed on school letterhead,
   so it should read as paper, not as part of the application. Neutral ink, dashed rules, serif-ish spacing. */
.refund-theme.tcgenerate-page .tc-cert{
  border:1px solid var(--line); border-radius:6px; padding:22px; background:var(--surface); font-size:12.5px;
}
.refund-theme.tcgenerate-page .tc-cert-no{ text-align:right; font-size:11.5px; color:var(--muted); margin-bottom:8px; }
.refund-theme.tcgenerate-page .tc-cert-school{ text-align:center; margin-bottom:14px; }
.refund-theme.tcgenerate-page .tc-cert-school h3{ margin:0 0 4px; font-size:17px; font-weight:700; color:var(--ink); }
.refund-theme.tcgenerate-page .tc-cert-school p{ margin:0; font-size:11.5px; color:var(--muted); }
.refund-theme.tcgenerate-page .tc-cert-title{
  text-align:center; margin:14px 0; padding:9px 0;
  border-top:1px solid var(--ink); border-bottom:1px solid var(--ink);
  font-size:14px; font-weight:700; text-transform:uppercase; letter-spacing:2px; color:var(--ink);
}
.refund-theme.tcgenerate-page .tc-cert-grid{ display:grid; grid-template-columns:1fr 1fr; gap:0 24px; }
.refund-theme.tcgenerate-page .tc-cert-row{
  display:flex; flex-direction:column; padding:7px 0; border-bottom:1px dashed var(--line);
}
.refund-theme.tcgenerate-page .tc-cert-row label{
  margin:0; font-size:9.5px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; color:var(--muted);
}
.refund-theme.tcgenerate-page .tc-cert-row span{ margin-top:2px; font-size:12.5px; font-weight:600; color:var(--ink); }
.refund-theme.tcgenerate-page .tc-cert-remark{
  margin-top:14px; padding:12px 14px; background:var(--surface-2); border:1px solid var(--line); border-radius:6px;
}
.refund-theme.tcgenerate-page .tc-cert-remark label{
  margin:0; font-size:9.5px; font-weight:700; text-transform:uppercase; letter-spacing:.4px; color:var(--muted);
}
.refund-theme.tcgenerate-page .tc-cert-remark p{ margin:4px 0 0; font-size:12.5px; color:var(--ink); line-height:1.6; }
.refund-theme.tcgenerate-page .tc-cert-sign{
  display:flex; justify-content:space-between; gap:16px; flex-wrap:wrap;
  margin-top:22px; padding-top:14px; border-top:1px solid var(--line);
}
.refund-theme.tcgenerate-page .tc-sign{ text-align:center; }
.refund-theme.tcgenerate-page .tc-sign-line{ width:130px; height:30px; margin:0 auto 5px; border-bottom:1px solid var(--ink); }
.refund-theme.tcgenerate-page .tc-sign small{ font-size:11.5px; font-weight:600; color:var(--muted); }

/* =====================================================================
   IMPORT FROM EXCEL  (Views/ImportDataFromExcelCommon/ImportDataFromExcelCommon.cshtml)
   ---------------------------------------------------------------------
   A three-step wizard. Replaces TWO page <style> blocks (~240 lines) in
   which the genuinely page-specific parts sat alongside bare `.btn`,
   `.title`, `.placeholder-label`, `.component.input-container` and
   `.table-responsive` rules that applied to the whole page, plus a
   page-level `:root { --primary-blue ... }`. Only the wizard's own pieces
   are below, on theme tokens.
   NO field sizes, NO label type and NO button design are redeclared.
   ===================================================================== */
/* the wizard is a narrow column: it was centred with two empty grid columns as spacers */
.refund-theme.import-page .imp-wrap{ max-width:900px; margin:0 auto; padding:4px 0 8px; }

/* ---- stepper ---- */
.refund-theme.import-page .imp-steps{
  display:flex; gap:0; margin:0 0 22px; padding:0; list-style:none;
}
.refund-theme.import-page .imp-steps li{
  flex:1; display:flex; align-items:center; justify-content:center; gap:8px;
  padding:0 8px 10px; border-bottom:3px solid var(--line);
  font-size:12px; font-weight:600; letter-spacing:.3px; text-transform:uppercase; color:var(--muted);
}
.refund-theme.import-page .imp-steps li.on{ color:var(--brand-dark); border-bottom-color:var(--brand); }
/* the number was part of the label text ("1. SELECT & UPLOAD"); it is a badge now, so the step reads as a
   step and matches the numbered section headings used elsewhere in the theme */
.refund-theme.import-page .imp-step-n{
  flex:0 0 auto; width:20px; height:20px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--surface-2); border:1px solid var(--line); color:var(--muted);
  font-size:11px; font-weight:700; line-height:1;
}
.refund-theme.import-page .imp-steps li.on .imp-step-n{
  background:var(--brand); border-color:var(--brand); color:var(--on-brand);
}

/* ---- a step's panel ---- */
.refund-theme.import-page .imp-card{
  background:var(--surface); border:1px solid var(--line); border-radius:8px; padding:16px;
}
.refund-theme.import-page .imp-cardhead{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  margin:-2px 0 14px; padding-bottom:10px; border-bottom:1px solid var(--line);
}
.refund-theme.import-page .imp-cardtitle{ font-size:13px; font-weight:600; color:var(--ink); }
.refund-theme.import-page .imp-cardtitle-err{ color:var(--no); }
.refund-theme.import-page .imp-cardtitle-err .fa{ margin-right:5px; }
/* the file name and the field count are context, not headings - they were `<small>` elements doing the job
   of the missing title */
.refund-theme.import-page .imp-cardsub{
  padding:2px 9px; border-radius:11px;
  background:var(--surface-2); border:1px solid var(--line);
  font-size:11px; color:var(--muted); white-space:nowrap;
}
.refund-theme.import-page .imp-close{ margin-left:auto; }

.refund-theme.import-page .imp-modes{ display:flex; align-items:center; gap:22px; flex-wrap:wrap; margin:2px 0 14px; }
.refund-theme.import-page .imp-hint{ margin:0 0 16px; font-size:12px; color:var(--muted); line-height:1.55; }

/*  ---- sample-template row: the button, then the reason for it ----
    `.imp-tmpl` is GONE, not kept "just in case": it styled the three words ".xlsx file" that used
    to be the click target inside the hint sentence, and the markup that used it no longer exists.
    A rule left behind for deleted markup is the thing that makes the next person hunt for a
    selector nothing matches.

    align-items:center so the 26px button and the 12px sentence share a baseline-looking centre
    line rather than the text hanging off the button's top edge. flex-wrap so the hint drops under
    the button on a narrow card instead of squeezing it. Only two children, both simple - every
    direct child of a flex container becomes its own column, which is the trap `.rt-callout` and
    `.apv-modal-note` have each been caught by in this file. */
.refund-theme.import-page .imp-tmpl-row{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:2px 0 16px;
}
.refund-theme.import-page .imp-tmpl-btn{ flex:0 0 auto; }
.refund-theme.import-page .imp-tmpl-btn .fa{ margin-right:5px; font-size:11px; }
/*  Same type as .imp-hint - it is the same kind of sentence - but no bottom margin of its own,
    because the row owns the spacing now. Reusing .imp-hint here would have added 16px INSIDE the
    flex row and pushed the text off centre. */
.refund-theme.import-page .imp-tmpl-hint{
  font-size:12px; color:var(--muted); line-height:1.55;
}

/* ---- drop zone ---- */
.refund-theme.import-page .imp-drop{
  position:relative; display:block; box-sizing:border-box;
  padding:32px 20px; text-align:center;
  border:2px dashed var(--grip); border-radius:10px; background:var(--surface-2);
  transition:border-color .15s, background .15s;
}
.refund-theme.import-page .imp-drop:hover{ border-color:var(--brand); background:var(--brand-light); }
.refund-theme.import-page .imp-drop input[type="file"]{
  position:absolute; inset:0; width:100%; height:100%; opacity:0; cursor:pointer;
}
.refund-theme.import-page .imp-drop-ico{ font-size:34px; color:var(--brand); display:block; margin-bottom:8px; }
.refund-theme.import-page .imp-drop-title{ font-size:13.5px; font-weight:600; color:var(--ink); }
.refund-theme.import-page .imp-drop-sub{ font-size:11.5px; color:var(--muted); margin-top:3px; }
.refund-theme.import-page .imp-drop-file{ margin-top:10px; font-size:12.5px; color:var(--ok); }
.refund-theme.import-page .imp-drop-file strong{ color:var(--ok); font-weight:700; }
/* A file the menu does not accept (import allows only .xlsx) is named in RED the moment it is
   picked, instead of looking accepted until Upload is pressed. Both selectors are needed: the
   `strong` above sets its own colour, so inheriting from the parent alone leaves the FILENAME -
   the one word that matters - still green. `--no` is the theme's error token; no literal here. */
.refund-theme.import-page .imp-drop-file.imp-drop-file-bad,
.refund-theme.import-page .imp-drop-file.imp-drop-file-bad strong{ color:var(--no); }

/* ---- actions ---- */
.refund-theme.import-page .imp-actions{
  display:flex; align-items:center; gap:8px; justify-content:space-between;
  margin-top:18px; padding-top:14px; border-top:1px solid var(--line);
}
/* step 1 has only a forward action, so it does not need a spacer <span> to push it right */
.refund-theme.import-page .imp-actions-end{ justify-content:flex-end; }

/* ---- mapping table ---- */
.refund-theme.import-page .mapping-scroll-area{
  border:1px solid var(--line); border-radius:7px; overflow:auto; max-height:52vh;
}
.refund-theme.import-page .mapping-table{ width:100%; margin:0; border:none; }
.refund-theme.import-page .mapping-table thead th{
  position:sticky; top:0; z-index:1;
  background:var(--surface-2) !important; color:var(--muted);
  font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.4px;
  padding:9px 12px !important; border-bottom:1px solid var(--line) !important;
}
.refund-theme.import-page .mapping-table tbody td{
  padding:7px 12px !important; vertical-align:middle;
  border-bottom:1px solid var(--line-soft) !important;
}
.refund-theme.import-page .mapping-table tbody tr:hover td{ background:var(--row-hover-soft) !important; }
.refund-theme.import-page .field-label-cell{ font-size:12.5px; font-weight:500; color:var(--ink); }
/* the mapping selects are select2 now, one per row. `.mapping-scroll-area` has `overflow:auto`, but the
   open panel is parented into the theme root by _Layout's `dropdownParent`, so it is not clipped by it. */
.refund-theme.import-page .mapping-table .select2-container{ width:100% !important; }
/* A ROW WITH NO EXCEL COLUMN BEHIND IT YET.
   The mapping list is ~89 rows and every one of them looked identical whether it had been
   matched or not, so the only way to see what was still outstanding was to read all 89
   dropdowns. The tint marks what is STILL UNMAPPED - the work left to do.

   BLUE, AND DELIBERATELY NOT var(--brand). The brand tokens follow whatever accent the school
   is on - on a plum accent `--brand-light` renders pink (measured: rgb(250,235,242)), which
   reads as a warning rather than as "not done yet". This is a STATE, like ok/warn/no, so it
   needs a fixed colour; the palette has green, amber and red but no blue, so the two values
   are declared here on the page root - one place to tune them.

   Blue, not red, on purpose: an unmapped field is usually FINE. Most of these 89 are optional
   and are meant to be left alone; only the ones carrying a red asterisk have to be filled, and
   that marker already exists. Colouring 80-odd rows as errors would drown it.

   .duplicate-row is defined after this at equal specificity, so a genuine problem still wins
   the row. */
.refund-theme.import-page{
  --map-bg:#e8f1fc;      /* soft blue tint, same family as the grid header #2462a3 */
  --map-edge:#2462a3;
}
.refund-theme.import-page .unmapped-row td{
  background:var(--map-bg) !important; box-shadow:inset 2px 0 0 var(--map-edge);
}

/* a field mapped to the same Excel column as another one */
.refund-theme.import-page .duplicate-row td{
  background:var(--no-bg) !important; box-shadow:inset 2px 0 0 var(--no);
}

/* ---- validation errors ---- */
.refund-theme.import-page .imp-errtable td{ vertical-align:top; padding:8px 10px; }
.refund-theme.import-page .imp-issues{ margin:0; padding-left:18px; }
.refund-theme.import-page .imp-issues li{ margin-bottom:4px; font-size:12.5px; color:var(--ink); line-height:1.5; }
/* the column name was `.table td ul li b { color:#c0392b }` - a bare descendant rule reaching any table on
   the page. Scoped, and on a token. */
.refund-theme.import-page .imp-issues li b{ color:var(--no); font-weight:600; }
.refund-theme.import-page .imp-more{ display:inline-block; margin-top:2px; font-size:12px; color:var(--brand-dark); font-weight:600; }

/* =====================================================================
   SET ACADEMIC YEAR  (Views/AcademicYearSetup/Index.cshtml)
   ---------------------------------------------------------------------
   Settings grid: one row per year, four switch columns and a date-range
   button. Toolbar, grid, `.frr-datewrap` and `.rt-modal` are all common;
   only the row rhythm, the year label and the Default Status pill are
   page-level.
   ===================================================================== */
.refund-theme.academicyear-page .ays-note{
  padding:0 16px 12px; font-size:12px; color:var(--muted); line-height:1.5;
}
.refund-theme.academicyear-page .ays-note b{ color:var(--ink); font-weight:600; }
.refund-theme.academicyear-page .ays-table td{ padding:7px 8px; vertical-align:middle; }
/* the year is the row's subject, so it reads as a name rather than as data */
.refund-theme.academicyear-page .ays-year b{ font-weight:600; color:var(--ink); }
/* every switch column is a checkbox; give them the theme's accent and a real hit area */
.refund-theme.academicyear-page .ays-table input[type="checkbox"]{
  width:15px; height:15px; margin:0; accent-color:var(--brand); cursor:pointer;
}
.refund-theme.academicyear-page .ays-table input[type="checkbox"]:disabled{ cursor:not-allowed; opacity:.4; }
/* the date button carries either a prompt or the range itself, so it must not jump width between the two */
.refund-theme.academicyear-page .ays-datebtn{ width:100%; justify-content:center; }
.refund-theme.academicyear-page .ays-datebtn .fa{ color:var(--brand); }
.refund-theme.academicyear-page .ays-datebtn[disabled] .fa{ color:var(--btn-disabled-ink); }
/* Default Status is a state, so it reads as a pill rather than as a bare word. `.isDefaultStatus` and the
   two `labelActiveInActive` / `labelBedgeActive` classes come from the markup and are kept, since other
   (non-themed) pages use them too - this only restyles them inside this page. */
.refund-theme.academicyear-page .isDefaultStatus{
  display:inline-block; margin:0; padding:2px 10px; border-radius:11px;
  font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.3px;
  background:var(--surface-2); border:1px solid var(--line); color:var(--muted);
}
/* the affirmative state - the server sends the word, so match on content-independent styling only where it
   is the ERP default */
.refund-theme.academicyear-page .isDefaultStatus.labelBedgeActive{
  background:var(--ok-bg); border-color:var(--ok-border); color:var(--ok);
}

/* =====================================================================
   FORM FEE SETUP  (Views/FeeFormFeeSetup/FeeFormFeeSetup.cshtml
                    + Partial/_InsertUpdateFeeFormFeeSetup.cshtml)
   ---------------------------------------------------------------------
   Two modes: the fee list, and the per-class amount table for one fee.
   Toolbar, grid, pagination and the `.rt-modal` dialog are all common -
   only the amount table's cells and the footer row are page-level.
   ===================================================================== */
/* the amount column is all inputs, so its cells give them room without the row growing tall */
.refund-theme.formfee-page .ffs-table td{ padding:6px 8px; vertical-align:middle; }
.refund-theme.formfee-page .ffs-table td .form-control{ margin:0; }
.refund-theme.formfee-page .ffs-table input[type="checkbox"]{
  width:15px; height:15px; margin:0; accent-color:var(--brand); cursor:pointer;
}
/* Save / Reset sat in a `.col-lg-6` inside a `.row` inside `.box-footer` - three wrappers to left-align two
   buttons the footer already left-aligns */
.refund-theme.formfee-page .ffs-actions{ display:flex; gap:8px; align-items:center; }

/* =====================================================================
   ENABLE SECURE FIELD  (Views/EnableSequreField/EnableSequreField.cshtml
                         + Partial/__InsertSequreField.cshtml)
   ---------------------------------------------------------------------
   Grid + an inline add panel. The grid, the toolbar, the pagination, the
   column list (`.SP_ul`) and the count pill (`.total_Count`) are all
   common - the only thing this page needs is the inline panel's frame,
   which used to borrow the MODAL skin (`.NewSPR > .card-*`) and so forced
   the page to redefine `.NewSPR` and `.modal-title` globally.
   ===================================================================== */
/* an inline panel inside a card: a plain nested card, NOT a fake dialog */
.refund-theme.securefield-page .esf-panel{
  border:1px solid var(--line); border-radius:8px; overflow:hidden; margin:0 0 4px;
}
.refund-theme.securefield-page .esf-panel-head{
  padding:9px 14px; background:var(--brand); color:var(--on-brand);
}
.refund-theme.securefield-page .esf-panel-title{
  display:inline-flex; align-items:center; gap:8px;
  font-size:12.5px; font-weight:600; letter-spacing:.2px; color:var(--on-brand);
}
.refund-theme.securefield-page .esf-panel-title .fa{ color:var(--on-brand) !important; }
.refund-theme.securefield-page .esf-panel-body{ padding:10px 12px 4px; background:var(--surface); }
/* the list had a hardcoded 380px height inline; the common `.SP_ul` cap is 440px, and this panel is nested
   inside a card so it wants a little less */
.refund-theme.securefield-page .esf-panel-body .SP_ul{ max-height:360px; }
/* Select All is a control row, not one of the columns it controls */
.refund-theme.securefield-page .esf-selectall{
  background:var(--surface-2) !important; font-weight:600;
}
.refund-theme.securefield-page .esf-selectall .frr-colname{ font-weight:600; color:var(--muted); }

/* "already enabled" - why that row's tick box is locked. The row itself reuses the common
   `.frr-locked` background and `.frr-colchk[disabled]`; this is only the label, kept quiet so it
   reads as a status rather than competing with the field name beside it. */
.refund-theme.securefield-page .frr-colnote{
  flex:0 0 auto; font-size:11px; color:var(--muted); font-style:italic; white-space:nowrap;
}
.refund-theme.securefield-page .esf-panel .box-footer{
  padding:10px 14px !important; background:var(--surface-2) !important; border-top:1px solid var(--line) !important;
}

/* =====================================================================
   DENY USER MENU ACCESS  (Views/Role/DenyUserRoleAccess.cshtml
                           + Partial/DenyUserRoleUpdateRole.cshtml)
   ---------------------------------------------------------------------
   Employee grid, and a detail card that shows the privileges tree for one
   user. Everything is common - toolbar, grid, pagination, `.rt-chk`,
   `.rt-modal`, and the tree itself (`#menuAllocationContainer`).
   ===================================================================== */
.refund-theme.denyuserrole-page .dur-note{
  padding:0 16px 12px; font-size:12px; color:var(--muted); line-height:1.5;
}
.refund-theme.denyuserrole-page .dur-note b{ color:var(--ink); font-weight:600; }
/* the search lives in the toolbar's action group, which otherwise sizes children to their content */
.refund-theme.denyuserrole-page .dur-searchgrp{ width:400px; max-width:100%; }
.refund-theme.denyuserrole-page .dur-choices{ display:flex; align-items:center; gap:18px; flex-wrap:wrap; margin:0; }
.refund-theme.denyuserrole-page .dur-err{ font-size:11.5px; color:var(--no); margin-top:2px; }

/* ---- THE PRIVILEGES TREE'S RIGHTS COLUMNS ----
   Reported: the tick boxes do not line up, and there is an empty column after
   Deny Import.

   ONE CAUSE, BOTH SYMPTOMS. The tree sizes its cells with BOOTSTRAP GRID CLASSES
   - `col-md-1`, `col-md-2`, `col-md-4` written straight onto <th>/<td>. Those are
   percentages for a 12-column float layout (8.333% / 16.66% / 33.33%) and on a
   table row they just become cell widths, so the header comes to
   8.33 + 33.33 + (6 x 8.33) = 91.66%. The missing 8.34% is left over on every
   table and the browser parks it at the right-hand end: that is the "blank column
   after Import". Measured on the page: columns totalling ~1133px inside a 1571px
   table.

   And because each nesting level uses a DIFFERENT leading class (col-md-1 on one
   level, col-md-2 on the next), each level leaves a different amount over and its
   rights columns begin at a different x - so the tick boxes step sideways as the
   tree deepens. That is the alignment complaint.

   FIXED BY TAKING THE WIDTH DECISION OFF THE GRID CLASSES. The six rights columns
   are always the LAST SIX at every level, so they are addressed from the end with
   :nth-last-child instead of by their class. Combined with `table-layout:fixed`
   below - which is what makes 104px mean 104px rather than "at least 104px" - they
   measure identically at every depth and the tick boxes form one straight vertical
   line down the page. The Menu column then takes what is left, so names like
   "School Management" stop wrapping onto two lines.

   `:not(:first-child)` IS LOAD-BEARING. Each level's nested table sits inside a
   single `<td colspan="12" class="hiddenRow">`, and that cell is the only child of
   its row - so it is simultaneously the first and the last child and would match
   :nth-last-child(-n+6). Without the guard it would be squeezed to a rights-column
   width, taking the entire sub-tree with it.

   SCOPED TO .denyuserrole-page ONLY. `#menuAllocationContainer` is shared with the
   role-allocation screens (see the block header above), and they were not part of
   this report - CLAUDE.md: correct with a page-scoped class, never by retuning a
   shared rule. */
/* `table-layout:fixed` + a rights column width that CANNOT be stretched, and the
   Menu column taking everything else. All three parts are needed; two of them I
   got wrong first and measured my way out of, so the reasoning is recorded.

   `auto` LAYOUT IS THE WRONG ANSWER HERE, even though it does fill the table.
   Under `auto` a cell `width` is only a minimum, so the leftover space is shared
   out among all the columns - and every nesting level has a different amount of
   leftover, because each nested table sits inside its parent's Menu cell and is
   therefore narrower than the one above. Measured with `auto`, the six rights
   columns started at:

       level 2   560, 776, 993, 1209, 1425, 1641
       level 3   580, 792, 1005, 1218, 1430, 1643
       level 4   593, 803, 1014, 1224, 1434, 1645

   - the tick boxes stepping ~13px to the right per level, which is the reported
   "box is not alignment". The two rightmost columns happened to agree, which is
   what made it look like only part of the grid was wrong.

   Under `fixed`, the widths in the first row are honoured exactly, so 104px means
   104px at every depth and the columns are anchored to the shared right edge:

       level 2  1233, 1337, 1441, 1545, 1649, 1753
       level 3  1232, 1336, 1440, 1544, 1648, 1752
       level 4  1231, 1335, 1439, 1543, 1647, 1751

   1px per level, which is the nested table's own border and not worth chasing.

   `width:100%` ON THE MENU COLUMN IS WHAT FILLS THE TABLE. Plain `width:auto`
   does not: measured under fixed layout, Chrome gave that column its 183px content
   width and parked the remaining 730px of a 1571px table at the right-hand end -
   which was the original "blank column after Deny Import". A percentage that
   cannot be satisfied gets clamped to what is left, which is exactly the wanted
   behaviour.

   Only the rights tables are touched. `tblFirstInnerMenu` - the accordion - is
   left alone; its two columns are already stable. */
.refund-theme.denyuserrole-page #menuAllocationContainer table{ width:100%; }
.refund-theme.denyuserrole-page #menuAllocationContainer .tblSecondInnerMenu,
.refund-theme.denyuserrole-page #menuAllocationContainer .tblThirdInnerMenu,
.refund-theme.denyuserrole-page #menuAllocationContainer .tblFourthInnerMenu{
  table-layout:auto; width:100%;
}

/* MEASURED, 24-08-2026 - `fixed` was tried here and REVERTED. It aligned level 2
   beautifully (six columns at 1233..1753) but level 3 did not fill at all: its
   Menu column stayed at its `col-md-*` 126px, the rights columns bunched to
   439..1224 and fresh dead space appeared on the right. `auto` fills every level;
   what it cannot do is make the levels agree with each other to the pixel, because
   each nested table is laid out inside its parent's Menu cell and therefore has a
   different width to divide. See the note at the end of this block. */

.refund-theme.denyuserrole-page #menuAllocationContainer tr > th:nth-last-child(-n+6):not(:first-child),
.refund-theme.denyuserrole-page #menuAllocationContainer tr > td:nth-last-child(-n+6):not(:first-child){
  width:104px; text-align:center; vertical-align:middle;
}

/* ---- AND SOMETHING HAS TO ABSORB THE REMAINDER ----
   Narrowing the rights columns alone made the empty strip BIGGER, because the tree
   is `table-layout:fixed` and under that algorithm the column widths come from the
   first row and are honoured as given: with all eight columns carrying an explicit
   width (six from the rule above, two from `col-md-*`) they summed to 1001px inside
   a 1571px table and the leftover 570px simply sat at the end. Measured, not
   guessed - that is why the first attempt looked worse rather than better.

   Fixed layout gives leftover space to a column whose width is `auto`, so the MENU
   column is the one that takes it, and the leading cell - a pure indent, empty at
   every level - is pinned narrow instead of holding 251px hostage. Menu then gets
   the width it needs and names stop wrapping.

   Only the three rights-bearing levels are named. `tblFirstInnerMenu` is the
   accordion header table, whose rows are [menu name][toggle] - its first cell is
   real content, and pinning that to 30px would flatten the section headings. */
.refund-theme.denyuserrole-page #menuAllocationContainer .tblSecondInnerMenu tr > th:first-child,
.refund-theme.denyuserrole-page #menuAllocationContainer .tblSecondInnerMenu tr > td:first-child:not(:only-child),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblThirdInnerMenu tr > th:first-child,
.refund-theme.denyuserrole-page #menuAllocationContainer .tblThirdInnerMenu tr > td:first-child:not(:only-child),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblFourthInnerMenu tr > th:first-child,
.refund-theme.denyuserrole-page #menuAllocationContainer .tblFourthInnerMenu tr > td:first-child:not(:only-child){
  width:34px; padding-left:4px; padding-right:4px;
}
.refund-theme.denyuserrole-page #menuAllocationContainer .tblSecondInnerMenu tr > th:nth-child(2),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblSecondInnerMenu tr > td:nth-child(2),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblThirdInnerMenu tr > th:nth-child(2),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblThirdInnerMenu tr > td:nth-child(2),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblFourthInnerMenu tr > th:nth-child(2),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblFourthInnerMenu tr > td:nth-child(2){
  width:auto; text-align:left;
}

/* ---- ALIGNING THE TICK BOXES ACROSS NESTING LEVELS ----
   Sizing the columns is not enough on its own: the boxes still stepped ~13px to the
   right per level of nesting.

       level 2   560, 776, 993, 1209, 1425, 1641
       level 3   580, 792, 1005, 1218, 1430, 1643
       level 4   593, 803, 1014, 1224, 1434, 1645

   THE INDENT WAS THE CAUSE, NOT THE COLUMNS. Each level's sub-tree sits in a
   `div.accordion-body` carrying `margin-left:18px` + `border-left:2px`. That 20px
   inset is what draws the hierarchy - but it also makes the nested TABLE 20px
   narrower than its parent (measured: 1571 / 1550 / 1529, right edges level). Six
   columns dividing a different width at every level can only start at a different
   x, so the boxes drift. Nothing about the column rules could fix that; two
   attempts confirmed it (see the reverted `fixed` note above).

   So the indent is moved OFF the table and ON TO THE MENU CELL: the wrapper stops
   insetting the sub-tree, every level's table becomes the same width, and depth is
   expressed as padding-left on the Menu column instead - which is a label, not a
   column boundary, so it costs nothing. Result:

       level 2   560, 776, 992, 1208, 1425, 1641
       level 3   562, 778, 993, 1209, 1425, 1640
       level 4   559, 775, 991, 1207, 1423, 1639

   Within 3px, i.e. one straight vertical line per column. The residual is the
   nested table's own 1px border and is not worth chasing.

   `.accordion-body` IS SCOPED TO #menuAllocationContainer INSIDE THIS PAGE CLASS.
   It is a generic class and the container is shared with the role-allocation
   screens - CLAUDE.md: correct with a page-scoped wrapper, never by retuning a
   shared rule. The 2px border goes with the margin, so the depth cue is now the
   label indent alone. */
.refund-theme.denyuserrole-page #menuAllocationContainer .accordion-body{
  margin-left:0 !important; border-left:0 !important;
}
.refund-theme.denyuserrole-page #menuAllocationContainer .tblThirdInnerMenu tr > th:nth-child(2),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblThirdInnerMenu tr > td:nth-child(2){
  padding-left:26px;
}
.refund-theme.denyuserrole-page #menuAllocationContainer .tblFourthInnerMenu tr > th:nth-child(2),
.refund-theme.denyuserrole-page #menuAllocationContainer .tblFourthInnerMenu tr > td:nth-child(2){
  padding-left:52px;
}

/* the box itself, centred in its cell - `col-md-*` also sets 15px side padding,
   which on a 104px column is enough to push a 13px control visibly off centre */
.refund-theme.denyuserrole-page #menuAllocationContainer input[type=checkbox]{
  margin:0 auto; float:none; vertical-align:middle;
}
/* the "-" standing in for a right the menu does not have: same column, same
   centre, so an absent right reads as a gap in a straight line rather than noise */
.refund-theme.denyuserrole-page #menuAllocationContainer tr > td:nth-last-child(-n+6):not(:first-child){
  color:var(--muted);
}

/* =====================================================================
   USER ROLE ALLOCATION  (Views/UserPreviliges/RoleAssigned.cshtml)
   ---------------------------------------------------------------------
   Grid whose two role pickers per row are unlocked by that row's tick box.
   The pickers are the multipleSelect plugin, whose box is already sized
   commonly (`.ms-choice`) - nothing here touches them.
   ===================================================================== */
.refund-theme.roleassigned-page .ra-note{
  padding:0 16px 12px; font-size:12px; color:var(--muted); line-height:1.5;
}
/* the search sits in the toolbar's action group, so it needs a working width there - the toolbar otherwise
   sizes its children to their content */
.refund-theme.roleassigned-page .ra-searchgrp{ width:420px; max-width:100%; }
/* the Select column holds one checkbox - it does not need a data column's width */
.refund-theme.roleassigned-page .ra-chk{ width:64px; text-align:center; }
.refund-theme.roleassigned-page td.ra-chk input[type="checkbox"]{
  width:15px; height:15px; margin:0; accent-color:var(--brand); cursor:pointer;
}
/* the pickers sit in table cells, so the plugin's own block margins would stretch every row.
   Their SKIN is common - see the MULTIPLESELECT block. */
.refund-theme.roleassigned-page .table-responsive .ms-parent{ margin:0; }
/* SAVE / RESET NEED THE CARD'S OWN INSET. This row lives inside the grid's `.dataTables_wrapper`, and the
   common rule zeroes that `.box-body`'s horizontal padding so the table can span the full card - which left
   the buttons flush against the card edge. The inset is theirs to supply, matched to the 16px the header
   and the pagination row use. */
.refund-theme.roleassigned-page .ra-actions{
  display:flex; gap:8px; align-items:center;
  margin:10px 16px 0; padding:12px 0 4px; border-top:1px solid var(--line);
}
/* kept from the page's own <style>, now scoped: hide the native placeholder option from the list, and grey
   the closed box while nothing is chosen. Only reachable if the plugin has not taken the select over. */
.refund-theme.roleassigned-page .drpAppRole option[disabled]{ display:none; }
.refund-theme.roleassigned-page .drpAppRole:invalid{ color:var(--muted); }
/* the note is a sentence under the title, not a filter row, so it keeps the header's own inset */
.refund-theme.roleassigned-page .ra-note{ padding-top:0; }

/* =====================================================================
   ROLE DETAILS  (Views/Role/RoleMaster.cshtml + Partial/InsertUpdateRole.cshtml)
   ---------------------------------------------------------------------
   Grid with one filter, and a detail card shown in its place. Everything
   is common - toolbar, .rt-filterrow, grid, pagination, .rt-chk controls,
   .rt-modal. Only the detail card's row rhythm is page-level.
   ===================================================================== */
/* Role For and Is Default share row 2, on one line */
.refund-theme.rolemaster-page .rol-choices{ display:flex; align-items:center; gap:18px; flex-wrap:wrap; margin:0; }
/* divider between "which platform" and "is this the default" - two different questions on one line */
.refund-theme.rolemaster-page .rol-sep{
  width:1px; height:18px; background:var(--line); flex:0 0 auto; margin:0 2px;
}
.refund-theme.rolemaster-page .rol-err{ font-size:11.5px; color:var(--no); margin-top:2px; }

/* ---- MENU vs SUB-MENU WEIGHT IN THE PRIVILEGES TREE ----
   Reported as "Menu names are unbold and Sub Menu names are bold; it should be the
   other way round". MEASURED FIRST, and the report is half right:

     the only bold text in the whole tree is the top-level Menu (a <b>, 600) and the
     column headers (<th>, 700). Every sub-menu at every depth is 400. Nothing is
     bold that should not be - so there was nothing to swap.

   What IS true is that the Menu did not READ as bold: 600 against 400 at the same
   12.5px, the same colour and the same family is a slight difference, and next to a
   700 header row above it the section title looks lighter than everything around
   it. So the distinction is made unmistakable rather than reversed - 700 for the
   Menu, and 400 pinned on the sub-menu names so no future rule can bolden them.

   The `:not(:first-child)` and cell-count guard are the same trap as on the Deny
   page: each level's sub-tree lives in a single `<td colspan>` whose text content
   is the entire sub-tree, so an unguarded rule would restyle everything beneath it. */
.refund-theme.rolemaster-page #menuAllocationContainer .tblFirstInnerMenu > tbody > tr > td > b{
  font-weight:700;
}
/*  THE MAIN MENU'S OWN ROW IS 700, 26-08-2026.
    Inside each expanded section the FIRST data row is the main menu ITSELF (School
    Management, Role Management, Configuration - repeated from the accordion bar), and
    its sub-menus follow underneath. Both are `td:nth-child(2)` at level 2, so the
    earlier "pin the sub-menus to 400" rule flattened the parent along with them:
    measured on the live page, the main-menu row and every sub-menu row came back 400,
    identical, and the hierarchy was readable only from the indent. The bar above is
    700, so the section's own name dropped from bold to regular the moment it was
    repeated one row down - it read as a different KIND of thing rather than the same
    menu.

    THAT 400 PIN IS GONE, not merely overridden: it never did anything. Two rules above
    it in this file, `.refund-theme tbody td` sets `font-weight:400 !important` for the
    whole theme, so every cell in this tree was already 400 and the page-scoped copy was
    dead code that merely looked like it was in charge.

    Which is also why this one needs `!important` - it is not specificity, it is beating
    a blanket !important. That is the only way to win it, short of removing the blanket,
    which every grid in the theme depends on. `.rma-mm` is set in the markup rather than
    matched positionally, for the reason given there. */
.refund-theme.rolemaster-page #menuAllocationContainer .tblSecondInnerMenu tr > td.rma-mm{
  font-weight:700 !important;
}
.refund-theme.rolemaster-page .rol-actions{
  display:flex; gap:8px; align-items:center;
  margin-top:6px; padding:12px 0 2px; border-top:1px solid var(--line);
}
/* the confirmation question is a sentence, not a label - it was inheriting the modal body's default type.
   Common (not page-scoped): the Role card and the Deny card share this dialog almost verbatim. */
.refund-theme .rol-confirm{ margin:0; font-size:13.5px; color:var(--ink); line-height:1.55; }

/* ---- USER COUNT cell + "Users on this role" popup -------------------------
   COMMON, not page-scoped: a count that opens the list behind it is a pattern
   every master grid wants (roles, departments, fee heads), so the next screen
   reuses these three classes instead of inventing its own badge.
   Every colour is a token - no hardcoded values, per the theme rules. */
.refund-theme .rt-usercount{
  display:inline-block; min-width:30px; padding:1px 8px;
  font-size:12px; font-weight:600; line-height:19px; text-align:center;
  background:var(--brand-light); border:1px solid var(--brand-hover-border);
  border-radius:5px;                 /* theme control radius, same as .form-control */
}
/* the count IS the affordance, so it gets a hover state - .linklike alone gives
   colour and weight but nothing that says "this is a button" on a number */
.refund-theme .rt-usercount.linklike:hover{
  background:var(--brand-ice); border-color:var(--brand);
}
/* the "(n)" active subtotal - present only when it differs from the total, so it
   never draws attention to a role where the two agree */
.refund-theme .rt-usercount-sub{ font-weight:400; color:var(--muted); font-size:11px; }
/* view-only roles see the number without the link colour: it is information, not
   a control they can use */
.refund-theme .rt-usercount-flat{ color:var(--ink); font-weight:600; }
/* zero: keeps the badge SHAPE so the column stays visually aligned row to row,
   but wears the theme's inactive tokens (--canc-bg / --muted, the same pair
   .rt-st-mute uses) and normal weight. That is what separates "nobody holds this
   role" from the brand-coloured, bold, clickable counts above it - it has to be
   legible as a real zero without inviting a click that opens an empty dialog. */
.refund-theme .rt-usercount-zero{
  background:var(--canc-bg); border-color:var(--line);
  color:var(--muted); font-weight:400; cursor:default;
}

/* popup: the search row is a single field, so it must not stretch to the dialog
   width the way a real filter row does */
.refund-theme .ru-searchrow{ padding:0 0 10px; }
.refund-theme .ru-searchrow .frr-fld{ max-width:320px; }
/* cap the list and scroll INSIDE the dialog - a role with 400 staff would
   otherwise push the Close button below the fold. max-height, not height, so a
   three-row list does not leave an empty well (the mistake the Level Sequence
   dialog made with a fixed 380px). */
.refund-theme .ru-tablewrap{ max-height:46vh; overflow-y:auto; border:1px solid var(--line); border-radius:5px; }
/* the header must stay visible while the body scrolls, or a long list loses the
   column meanings; `position:sticky` needs a background or rows show through */
.refund-theme .ru-tablewrap thead th{ position:sticky; top:0; z-index:2; }

/* ---------------------------------------------------------------------
   PRIVILEGES TREE  (Views/Shared/_UserRoleMenuAllocation.cshtml)
   ---------------------------------------------------------------------
   The menu/permission accordion, rendered SERVER-SIDE and injected with
   `$('#divUserRoleMenuData').html(...)`. Three pages use the same partial
   (RoleMaster, UserPrivileges, DenyUserRoleAccess), and it is hundreds of
   generated rows deep with an inline style on nearly every cell.
   So it is converted in CSS, exactly like the legacy floating-label
   component - the markup is not touched. That also means all three pages
   get the same treatment from this one block.
   `!important` appears here more than anywhere else in this file, and for
   a specific reason: the colours it replaces are INLINE `style=` on the
   generated cells (`background-color:#EDE9E3`, `#f5f5f6`, `color:black`),
   and an inline style outranks every author rule except `!important`.
   Scoped to `#menuAllocationContainer`, the partial's own wrapper id, so
   nothing outside the tree is affected.
   --------------------------------------------------------------------- */
/* this .box-body sits inside the detail card's .box-body - one inset is enough */
.refund-theme #menuAllocationContainer > .box-body{ padding:0 !important; }
.refund-theme #menuAllocationContainer .table-responsive{ border:0; }

/* ---- level-1 accordion bar (School Management, Role Management, ...) ----
   Was a flat #EDE9E3 beige strip with a square edge, running full width. Now a card-like bar on theme
   tokens, with rounded ends and a hover state so it reads as the clickable thing it is. */
.refund-theme #menuAllocationContainer .tblFirstInnerMenu > tbody > tr > td.collapse-toggle,
.refund-theme #menuAllocationContainer .tblFirstInnerMenu > tbody > tr > td.align-right{
  background:linear-gradient(180deg,var(--surface),var(--head-tint)) !important;
  border-top:1px solid var(--line) !important;
  border-bottom:1px solid var(--line) !important;
  /* COMPACTED (01-08-2026). Was 10px 14px. A full menu is ~40 level-1 bars, so at the old height
     the list ran well past three screens before a single permission was visible and the whole
     screen was scrolling to find a module. 6px keeps the bar comfortably clickable - the row is
     still ~30px tall, above the 24px minimum for a pointer target - while fitting roughly a third
     more modules per screen. Paired with the tighter border-spacing below. */
  padding:6px 12px !important; cursor:pointer;
  transition:background .12s;
}
.refund-theme #menuAllocationContainer .tblFirstInnerMenu > tbody > tr > td.collapse-toggle{
  border-left:1px solid var(--line) !important; border-radius:7px 0 0 7px;
}
.refund-theme #menuAllocationContainer .tblFirstInnerMenu > tbody > tr > td.align-right{
  border-right:1px solid var(--line) !important; border-radius:0 7px 7px 0;
}
.refund-theme #menuAllocationContainer .tblFirstInnerMenu > tbody > tr:hover > td.collapse-toggle,
.refund-theme #menuAllocationContainer .tblFirstInnerMenu > tbody > tr:hover > td.align-right{
  background:var(--row-hover) !important;
}
.refund-theme #menuAllocationContainer .collapse-toggle b{
  font-size:12.5px; font-weight:600; color:var(--ink);
}
/* the +/- control: was a `.btn` with a glyphicon forced to black. Now the theme's small icon button. */
.refund-theme #menuAllocationContainer .btn-plus,
.refund-theme #menuAllocationContainer .accordion-toggle{
  width:24px; height:24px; padding:0 !important; border-radius:5px;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--surface) !important; border:1px solid var(--line) !important;
  color:var(--brand) !important; box-shadow:none !important;
}
.refund-theme #menuAllocationContainer .btn-plus:hover{
  background:var(--brand-light) !important; border-color:var(--brand-hover-border) !important;
}
.refund-theme #menuAllocationContainer .btn-plus .glyphicon{
  background:none !important; color:var(--brand) !important; font-size:10px; top:0;
}
/* air between the level-1 bars - the generated rows sit flush against each other.
   3px, not 6px: with ~40 bars the gaps alone accounted for over 200px of scroll. Enough to keep
   the bars reading as separate cards, no more. */
.refund-theme #menuAllocationContainer .tblFirstInnerMenu{ border-collapse:separate !important; border-spacing:0 3px !important; width:100%; }
.refund-theme #menuAllocationContainer .hiddenRow{ padding:0 !important; border:0 !important; }

/* ---- EXPAND / COLLAPSE ALL BAR (.rma-bar, markup in _UserRoleMenuAllocation.cshtml) ----
   Sits above the tree on all three pages that inject the partial. Tokens only, no new colours.
   The hint on the left is there because this screen opens with every module collapsed and no
   instruction - a first-time user sees 40 closed bars and nothing telling them what to do. */
.refund-theme #menuAllocationContainer .rma-bar{
  display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;
  padding:0 0 8px;
}
.refund-theme #menuAllocationContainer .rma-bar-hint{
  font-size:12px; color:var(--muted);
}
.refund-theme #menuAllocationContainer .rma-bar-actions{ display:inline-flex; gap:6px; }
/* the two buttons are the COMMON .rt-btn; only the glyph needs sizing down to match the label */
.refund-theme #menuAllocationContainer .rma-bar-actions .glyphicon{
  font-size:9px; top:0; margin-right:3px;
}

/* ---- THE MENU NAME COLUMN ----
   Only the NAME cell is touched here. Every permission column keeps its exact position - the
   checkboxes were already lined up and moving them was explicitly not wanted.

   The name is always the SECOND cell of a permission table, whatever the depth (measured:
   cellIndex 1, 9 cells per row at all three levels). The three table classes are what separate
   the depths, and the `>` child combinators keep each level's rule off the levels nested inside
   it - without them, a rule for level 2 would also hit the level-3 and level-4 tables sitting
   inside its cells.

   TWO THINGS WERE WRONG:
   1. "Select All" carried an INLINE text-align:center, so it sat mid-column while every real menu
      name beside it was left-aligned - the one row that looked out of place. Inline styles beat
      author rules, hence !important; there is no other way to reach it without editing the
      generated markup.
   2. NO DEPTH INDENT. Measured left edges were 537 / 537 / 561 for levels 2 / 3 / 4 - so a
      third-level menu ("Email") sat exactly where its parent did and the tree read flat, while
      level 4 was indented for unrelated reasons (the nested table's own inset). The padding below
      makes the step deliberate and even instead of accidental. */
.refund-theme #menuAllocationContainer .tblSecondInnerMenu > tbody > tr > td:nth-child(2),
.refund-theme #menuAllocationContainer .tblThirdInnerMenu  > tbody > tr > td:nth-child(2),
.refund-theme #menuAllocationContainer .tblFourthInnerMenu > tbody > tr > td:nth-child(2){
  text-align:left !important;
}
.refund-theme #menuAllocationContainer .tblSecondInnerMenu > tbody > tr > td:nth-child(2){ padding-left:10px !important; }
.refund-theme #menuAllocationContainer .tblThirdInnerMenu  > tbody > tr > td:nth-child(2){ padding-left:26px !important; }
.refund-theme #menuAllocationContainer .tblFourthInnerMenu > tbody > tr > td:nth-child(2){ padding-left:20px !important; }

/* ---- inner permission tables ---- */
.refund-theme #menuAllocationContainer .accordion-body{
  background:var(--surface); border:1px solid var(--line); border-radius:7px;
  margin:2px 0 6px; overflow:hidden;
}
/* ONE COLUMN GEOMETRY FOR EVERY LEVEL - the checkboxes line up in a single vertical line at any depth.
   ---------------------------------------------------------------------------------------------------
   THE BUG: every level is its OWN nested <table>, and the permission columns are Bootstrap `col-md-1`,
   i.e. a PERCENTAGE. A nested table is inset ~20px, so 8.33% of it is a few px narrower, and the error
   compounds across seven columns - measured: a level-2 row put its boxes at 1095/1223/1349..., the level-3
   row under it at 1120/1246/1373... Same column, 25px apart, which is exactly what looked broken.
   THE FIRST ATTEMPT AT THIS (29-07-2026) WAS REVERTED because it set a width on EVERY column: under
   `table-layout:fixed` the browser lays the table out from precisely those widths, they summed to less
   than the container, and a band of empty space appeared to the right of Import.
   SO: leave EXACTLY ONE column unsized. Fixed layout hands all the leftover space to it, so the table
   still fills 100% while every other column keeps the width stated here. The unsized column is the menu
   NAME (column 2) - which also means the seven permission columns are pushed against the table's RIGHT
   edge, and every level shares that edge. Column N then lands on the same x whatever the indent.
   Two things that will silently break this if changed:
   - Widths are read from the FIRST ROW only (that is how fixed layout works). Level 2 opens with a <th>
     heading row, levels 3 and 4 have no heading and open with a <td> data row - hence both selectors.
   - `tblFirstInnerMenu` (the outer accordion bars) is deliberately NOT in this list. It is a 2-cell
     table; a first-column width meant for the expander would crush its title. */
.refund-theme #menuAllocationContainer .tblSecondInnerMenu,
.refund-theme #menuAllocationContainer .tblThirdInnerMenu,
.refund-theme #menuAllocationContainer .tblFourthInnerMenu{ width:100%; table-layout:fixed; }
/* expander column: a percentage, so it keeps its share on any screen. It does NOT affect where the
   permission columns land (those are anchored to the right edge) - only where the names start. */
.refund-theme #menuAllocationContainer .tblSecondInnerMenu > tbody > tr > th:first-child,
.refund-theme #menuAllocationContainer .tblThirdInnerMenu  > tbody > tr > th:first-child,
.refund-theme #menuAllocationContainer .tblFourthInnerMenu > tbody > tr > th:first-child,
.refund-theme #menuAllocationContainer .tblSecondInnerMenu > tbody > tr > td:first-child:not(.hiddenRow),
.refund-theme #menuAllocationContainer .tblThirdInnerMenu  > tbody > tr > td:first-child:not(.hiddenRow),
.refund-theme #menuAllocationContainer .tblFourthInnerMenu > tbody > tr > td:first-child:not(.hiddenRow){
  width:16%;
}
/* the seven permission columns = the last seven cells of the row. FIXED px on purpose: a percentage is
   what caused the drift, because each level's table is a different width. */
.refund-theme #menuAllocationContainer .tblSecondInnerMenu > tbody > tr > th:nth-last-child(-n+7),
.refund-theme #menuAllocationContainer .tblThirdInnerMenu  > tbody > tr > th:nth-last-child(-n+7),
.refund-theme #menuAllocationContainer .tblFourthInnerMenu > tbody > tr > th:nth-last-child(-n+7),
.refund-theme #menuAllocationContainer .tblSecondInnerMenu > tbody > tr > td:nth-last-child(-n+7):not(.hiddenRow),
.refund-theme #menuAllocationContainer .tblThirdInnerMenu  > tbody > tr > td:nth-last-child(-n+7):not(.hiddenRow),
.refund-theme #menuAllocationContainer .tblFourthInnerMenu > tbody > tr > td:nth-last-child(-n+7):not(.hiddenRow){
  width:126px;
}
/* A NESTED level reads as a child of the row above it, not as a peer. The generated tables all sit at the
   same left edge, so at three and four levels deep there was nothing to say what belonged to what: the
   only clue was which row happened to have an expander. Each level gets a left inset and a brand rule down
   its edge, so depth is visible without touching the markup. */
.refund-theme #menuAllocationContainer .tblSecondInnerMenu .accordion-body{
  margin-left:18px; border-left:2px solid var(--brand-hover-border); border-radius:0 7px 7px 0;
}
.refund-theme #menuAllocationContainer .tblThirdInnerMenu .accordion-body{
  margin-left:18px; border-left:2px solid var(--brand-light); border-radius:0 7px 7px 0;
}
/* a deeper table repeats no headings, so it must not repeat the top border either - it would read as a
   second, unrelated table */
.refund-theme #menuAllocationContainer .tblThirdInnerMenu > tbody > tr:first-child > td,
.refund-theme #menuAllocationContainer .tblFourthInnerMenu > tbody > tr:first-child > td{ border-top:0 !important; }
/* THE COLUMN-HEADING ROW IS IDENTIFIED BY ITS CELLS, NOT BY ITS POSITION.
   An earlier version keyed this off `tbody > tr:first-child`, which is only the heading row in the
   SECOND-level table. The third- and fourth-level tables have no heading at all, so their first row is a
   DATA row - and it got painted brand, which is what made "Email Credit" look like a header of its own.
   Only a row made of <th> is a heading, at any depth, so the rule lives on the `th` itself. */
.refund-theme #menuAllocationContainer .tableCustom > tbody > tr > th{
  background:var(--brand) !important;
  padding:8px 6px !important;
  color:var(--on-brand) !important;
  font-size:10.5px !important; font-weight:700; text-transform:uppercase; letter-spacing:.3px;
  white-space:nowrap; border-bottom:0 !important;
}
.refund-theme #menuAllocationContainer .tableCustom td{
  padding:6px !important; font-size:12.5px; color:var(--ink); border-bottom:1px solid var(--line-soft) !important;
  vertical-align:middle !important;
}
/* the cell that holds a nested table is structure, not a row - it must add no padding or rule of its own.
   Kept from the reverted change: this one is unrelated to column widths and is right either way. */
.refund-theme #menuAllocationContainer .tableCustom > tbody > tr > td.hiddenRow,
.refund-theme #menuAllocationContainer .tableCustom > tbody > tr > td[colspan]{
  padding:0 !important; border-bottom:0 !important;
}
.refund-theme #menuAllocationContainer .tableCustom tr:last-child > td{ border-bottom:0 !important; }
/* "Select All" is a control row, not data - mark it as such rather than leaving it identical to the rows it
   controls. Identified by its checkboxes: the partial names them `fullAccessHeader` / `viewHeader` /
   `createHeader` ... - i.e. the only inputs on the tree whose name ends in "Header". Positional selectors
   were wrong here for the same reason as the heading row above: the deeper tables have no Select All. */
.refund-theme #menuAllocationContainer .tableCustom > tbody > tr:has(input[name$="Header"]) > td{
  background:var(--surface-2) !important; font-weight:600; color:var(--muted) !important;
}
/* every permission cell is a checkbox; give them the theme's accent and a real hit area */
.refund-theme #menuAllocationContainer input[type="checkbox"]{
  width:15px; height:15px; margin:0; accent-color:var(--brand); cursor:pointer; vertical-align:middle;
}
.refund-theme #menuAllocationContainer input[type="checkbox"]:disabled{ cursor:not-allowed; opacity:.45; }
/* the "-" shown where a permission does not apply */
.refund-theme #menuAllocationContainer .tableCustom td > span{ color:var(--muted); }
/* the partial's own `.tableCustom .form-group{text-align:center}` leaves Bootstrap's 15px bottom margin on
   a table cell, which stretched every permission row */
.refund-theme #menuAllocationContainer .tableCustom .form-group{ margin-bottom:0 !important; }
/* the Save / Cancel footer under the tree. It is injected INLINE, not into a dialog, so it needs the card's
   own edges rather than a modal footer's - and it should not float against the page background. */
.refund-theme #menuAllocationContainer .box-footer{
  margin-top:12px; padding:12px 16px !important;
  background:var(--surface-2) !important; border-top:1px solid var(--line) !important;
  border-radius:0 0 7px 7px;
}
/* a Save that cannot be pressed must look it - the disabled state came from Bootstrap's blue before */
.refund-theme #menuAllocationContainer .box-footer .rt-btn[disabled]{
  background:var(--btn-disabled-bg) !important; color:var(--btn-disabled-ink) !important;
  border-color:var(--line) !important; cursor:not-allowed; pointer-events:none;
}

/* =====================================================================
   STUDENT / EMPLOYEE CUSTOM FIELD  (Views/StudentCustomFieldSetting/StudentCustomFieldSetting.cshtml)
   ---------------------------------------------------------------------
   A settings page: one row per configurable field, edited inline, one
   Save. It had no <style> block of its own and needs almost nothing -
   field sizes, the native-select caret and the table are all common.
   Only the row rhythm and the help line are page-level.
   ===================================================================== */
.refund-theme.studentcustomfield-page .scf-note{
  padding:0 16px 12px; font-size:12px; color:var(--muted); line-height:1.5;
}
/* the whole table is form controls, so the cells give them room without the row growing tall */
.refund-theme.studentcustomfield-page .scf-table td{ padding:7px 8px; vertical-align:middle; }
.refund-theme.studentcustomfield-page .scf-table td .form-control{ margin:0; }
/* the row-number column is a counter, not data - keep it narrow and quiet */
.refund-theme.studentcustomfield-page .scf-table .scf-no{
  width:44px; text-align:center; color:var(--muted); font-weight:600;
}
.refund-theme.studentcustomfield-page .scf-actions{
  display:flex; gap:8px; align-items:center;
  margin-top:12px; padding:12px 0 2px; border-top:1px solid var(--line);
}

/* =====================================================================
   STANDARD / RTE CHANGE  (Views/StandardRteChange/StandardRteChange.cshtml)
   ---------------------------------------------------------------------
   Two modes: a history grid, and a three-step change form (find student ->
   pick change type -> compare current vs new). The grid needs nothing.
   What is below replaces this page's own <style> block, of which two rules
   were app-wide hazards rather than page styling:
     * a BARE `label{font-weight:500;color:#444;font-size:13px}` - every
       label on the page and in the chrome around it.
     * a BARE `.form-control{height:36px;font-size:13px;border-radius:4px}`
       - the theme's field size restated at a different radius.
   Both deleted. The rest (current-vs-new panels, the change-type radios)
   is genuinely page-specific and is re-expressed on tokens here instead of
   the six hardcoded blues and greys it used.
   NO field sizes and NO label type are redeclared.
   ===================================================================== */
/* the form reads as three steps; each gets air and a rule between them */
.refund-theme.standardrtechange-page .src-step{
  padding:0 0 14px; margin-bottom:14px; border-bottom:1px dashed var(--line);
}
.refund-theme.standardrtechange-page .src-steplbl{
  display:block; margin:0 0 8px;
  font-size:11px; font-weight:600; color:var(--muted);
  text-transform:uppercase; letter-spacing:.3px;
}
/* student search: the COMMON `.frr-searchgrp` component (same as CollectFees / FeesRefundRequest /
   FeesRefundTransaction) - nothing to style here. It replaced a Bootstrap `.input-group` with three
   `.input-group-addon` boxes bolted on, one of which was a text "Back" label pretending to be a button.
   The one thing this page needs: those pages hide the clear x until their page JS reveals it; there is no
   such JS here, so it stays visible. */
.refund-theme.standardrtechange-page .frr-search-clear{ display:flex !important; }

/* change type: a segmented pair, not two loose `.radio-inline` labels */
.refund-theme.standardrtechange-page .src-choices{ display:flex; gap:10px; flex-wrap:wrap; }
.refund-theme.standardrtechange-page .src-choice{
  display:inline-flex; align-items:center; gap:8px; margin:0; cursor:pointer;
  padding:8px 14px; border:1px solid var(--line); border-radius:6px;
  background:var(--surface); font-size:12.5px; font-weight:600; color:var(--ink);
  transition:background .12s, border-color .12s, color .12s;
}
.refund-theme.standardrtechange-page .src-choice:hover{ border-color:var(--brand-hover-border); background:var(--row-hover); }
.refund-theme.standardrtechange-page .src-choice.on{
  border-color:var(--brand); background:var(--brand-light); color:var(--brand-dark);
}
.refund-theme.standardrtechange-page .src-choice input[type="radio"]{
  width:14px; height:14px; margin:0; accent-color:var(--brand); cursor:pointer;
}

/* ---- current vs new panels ---- */
.refund-theme.standardrtechange-page .course-box{
  border:1px solid var(--line); border-radius:8px; overflow:hidden; margin-bottom:14px;
}
.refund-theme.standardrtechange-page .course-box-header{
  padding:9px 14px; border-bottom:1px solid var(--line);
  font-size:12px; font-weight:700; letter-spacing:.3px; text-transform:uppercase;
  background:linear-gradient(180deg,var(--surface),var(--head-tint)); color:var(--ink);
}
.refund-theme.standardrtechange-page .course-box-body{ padding:14px 14px 2px; background:var(--surface); }
/* CURRENT is read-only reference: muted, locked-looking. NEW is where the work happens: brand-edged.
   That contrast used to be two arbitrary blues; now it says which side is editable. */
.refund-theme.standardrtechange-page .src-now .course-box-header{ color:var(--muted); }
.refund-theme.standardrtechange-page .src-now .course-box-body{ background:var(--surface-2); }
.refund-theme.standardrtechange-page .src-now input.form-control[readonly],
.refund-theme.standardrtechange-page .src-now select.form-control[disabled]{
  background:var(--locked-bg) !important; color:var(--ink) !important; cursor:default;
}
.refund-theme.standardrtechange-page .src-next{ border-color:var(--brand-hover-border); }
.refund-theme.standardrtechange-page .src-next .course-box-header{
  background:var(--brand-light); border-bottom-color:var(--brand-hover-border); color:var(--brand-dark);
}
/* the two panels sit side by side, so they should be the same height whichever has more fields */
.refund-theme.standardrtechange-page .course-box{ height:calc(100% - 14px); }

.refund-theme.standardrtechange-page .src-actions{
  display:flex; gap:8px; align-items:center;
  padding:12px 0 2px; border-top:1px solid var(--line);
}

/* =====================================================================
   STUDENT REGISTRATION VIEW  (Views/StudentRegistrationView/StudentRegistrationView.cshtml)
   ---------------------------------------------------------------------
   A READ-ONLY profile: photo/identity card, tab strip, then label/value
   cards. Nothing on it is an input, so almost none of the theme's field
   machinery applies - what this block covers is the identity card, the
   label/value grid and the document rows.
   Replaces a 270-line page <style> block. Of that block:
     * `.section-title`  -> now SHARES the common numbered-heading rule
                            (see LEGACY FORM CHROME), so every section gets
                            the same brand-circle number as the enquiry
                            pages, resetting per tab. No page copy.
     * `.modern-tabs` + its 4 nav overrides -> deleted; `.nav-tabs-custom`
                            is already mapped onto the ONE common tab design.
     * `.text-white`, `.icon-btn`, `.cursor-*` -> deleted; those were
                            hacks (a white icon on a white card to mean
                            "disabled") replaced by `.srv-eye` +
                            `.rt-is-disabled`.
   It also had real duplication: `.section-title`, `.info-label`,
   `.info-value` and `.photo-box img` were each declared TWICE with
   different values, so which one applied depended on source order.
   Every colour below is a token - the original hardcoded #3c8dbc,
   #9d9d9d, #f5f7fa, #28a745, #dc3545 and a `color:#f` that was not a
   colour at all.
   NO field sizes and NO tab styling are redeclared.
   ===================================================================== */
/* the global page header is hidden on purpose: this view is a full-screen profile, so the breadcrumb strip
   above it is redundant. Scoped to this page - it used to be a bare `.content-header{display:none}`, which
   applied to whatever else happened to be on screen. */
.refund-theme.studentregistrationview-page ~ .content-header,
.studentregistrationview-page .content-header{ display:none; }

.refund-theme.studentregistrationview-page .srv-profile{ padding:0 0 18px; }

/* ---- identity card: photos + name + class/section ---- */
.refund-theme.studentregistrationview-page .srv-idcard{
  display:flex; align-items:center; gap:22px; flex-wrap:wrap;
  background:linear-gradient(180deg,var(--surface),var(--head-tint));
  border:1px solid var(--line); border-radius:9px; box-shadow:var(--shadow);
  padding:14px 16px; margin-bottom:14px;
}
.refund-theme.studentregistrationview-page .srv-photos{ display:flex; align-items:flex-start; gap:12px; }
.refund-theme.studentregistrationview-page .photo-box{
  display:flex; flex-direction:column; align-items:center; gap:5px; padding:0;
}
.refund-theme.studentregistrationview-page .photo-box img{
  width:82px; height:96px; object-fit:cover; background:var(--surface);
  border:1px solid var(--line); border-radius:6px;
}
/* the status ring on the student photo. 2px, not the original 3px - at 3px the ring dominated the face. */
.refund-theme.studentregistrationview-page .photo-box img.photo-active{ border:2px solid var(--ok); }
.refund-theme.studentregistrationview-page .photo-box img.photo-inactive{ border:2px solid var(--no); }
/* the three photos were unlabelled, so which one was the father and which the mother was a guess */
.refund-theme.studentregistrationview-page .photo-cap{
  font-size:9.5px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; color:var(--muted);
}
.refund-theme.studentregistrationview-page .student-name{ display:flex; flex-direction:column; gap:6px; min-width:0; }
.refund-theme.studentregistrationview-page .name-row{ display:flex; align-items:center; gap:9px; flex-wrap:wrap; }
.refund-theme.studentregistrationview-page .student-fullname{
  font-size:17px; font-weight:600; color:var(--ink); line-height:1.25;
}
.refund-theme.studentregistrationview-page .status-badge{
  font-size:10.5px; font-weight:700; padding:3px 9px; border-radius:11px;
  text-transform:uppercase; letter-spacing:.3px; white-space:nowrap;
}
.refund-theme.studentregistrationview-page .active-status{ background:var(--ok-bg); color:var(--ok); border:1px solid var(--ok-border); }
.refund-theme.studentregistrationview-page .inactive-status{ background:var(--no-bg); color:var(--no); border:1px solid var(--no-border); }
/* class / section / GR as labelled facts rather than a bare "PG - D" */
.refund-theme.studentregistrationview-page .class-row{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; }
.refund-theme.studentregistrationview-page .srv-meta{ font-size:12.5px; color:var(--ink); }
.refund-theme.studentregistrationview-page .srv-meta em{
  font-style:normal; font-size:9.5px; font-weight:700; letter-spacing:.4px;
  text-transform:uppercase; color:var(--muted); margin-right:5px;
}

/* ---- a section card inside a tab ---- */
.refund-theme.studentregistrationview-page .view-card{
  background:var(--surface); border:1px solid var(--line); border-radius:8px;
  padding:14px 16px 16px; margin-bottom:14px;
}
.refund-theme.studentregistrationview-page .view-card:last-child{ margin-bottom:0; }

/* ---- label / value grid ---- */
.refund-theme.studentregistrationview-page .info-grid{
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:2px 30px;
}
.refund-theme.studentregistrationview-page .info-item{
  display:flex; align-items:baseline; gap:10px; min-width:0;
  padding:6px 0; border-bottom:1px solid var(--line-soft);
}
.refund-theme.studentregistrationview-page .full-row{ grid-column:1 / -1; }
/* the caption. `.refund-theme label` does not reach these - they are divs, not <label> - so the same
   treatment is restated for the one element that needs it. */
.refund-theme.studentregistrationview-page .info-label,
.refund-theme.studentregistrationview-page .info-labelfull{
  flex:0 0 auto; width:190px;
  font-size:11px; font-weight:600; color:var(--muted);
  text-transform:uppercase; letter-spacing:.3px; line-height:1.45;
  /* WHITE-SPACE MUST BE RESET HERE.
     NewFormCSS.css carries a GLOBAL, unscoped `.info-label{white-space:nowrap}`. This rule sets
     a fixed 190px width but never touched white-space, so the global won: the three longest
     captions - "Student Name (As Per Bank Records)", "Student Unique ID (School Issued)" and
     "Permanent Education Number (PEN)" - could not wrap, overflowed their 190px box and ran
     straight across the value beside them. Measured: label box ends at 474px, the value starts
     at 484px, but the TEXT carried on past both.
     Note the boxes never overlapped - there is a clean 10px gap between them - which is why this
     is invisible in the markup and only shows up in the rendered text. An earlier change removed
     a hard-coded <br /> from these captions on the assumption that "the label column wraps on its
     own"; with nowrap inherited from the global file, it did not.
     Fixed here rather than in NewFormCSS.css: that file is global and other screens may rely on
     nowrap labels. Scoped to this page, so nothing else can be affected. */
  white-space:normal;
  overflow-wrap:anywhere;   /* last resort for a single unbroken token wider than 190px */
}
.refund-theme.studentregistrationview-page .info-labelfull{ width:auto; margin-right:4px; }
.refund-theme.studentregistrationview-page .info-value{
  flex:1 1 auto; min-width:0;
  font-size:12.5px; color:var(--ink); word-break:break-word; line-height:1.45;
}

/* ===== MOBILE: STOP THE 190px LABEL OVERFLOWING A 141px COLUMN =====
   Reported as "student view page is not responsive".

   Measured on this page at a 412px viewport: `.info-grid` had clientWidth 312
   but scrollWidth 402 - overflowing by 90px - and `.view-card` and the tab pane
   overflowed with it. The cause is the combination of two rules that are both
   fine on a desktop:

     .info-grid  { grid-template-columns: repeat(2, minmax(0,1fr)); }
     .info-label { flex: 0 0 auto; width: 190px; }

   At 412px each grid column is 141px, while every row puts a FIXED 190px label
   beside its value on one flex line: 190 + 10 gap + the value is ~250px+ in a
   141px box, which is the 90px overflow almost exactly. `minmax(0,1fr)` lets the
   COLUMN shrink, but nothing let the LABEL shrink, so the content simply spilled.

   On a phone the two-column layout is not useful anyway, so below 768px:
     * one column, so each field gets the full width;
     * the label stops being a fixed 190px and takes its own line above the
       value (flex-wrap + 100% basis) - which reads better on a narrow screen
       than a squeezed label/value pair;
     * overflow-wrap on the value so one long unbroken token (a PEN, an email)
       still cannot push the card wide.

   Desktop is untouched - everything here is inside the media query. */
@media (max-width: 767px) {
    .refund-theme.studentregistrationview-page .info-grid {
        grid-template-columns: 1fr;
        column-gap: 0;
    }

    .refund-theme.studentregistrationview-page .info-item {
        flex-wrap: wrap;
        gap: 2px;
    }

        .refund-theme.studentregistrationview-page .info-label,
        .refund-theme.studentregistrationview-page .info-labelfull {
            flex: 1 1 100%;
            width: auto;
        }

        .refund-theme.studentregistrationview-page .info-value {
            flex: 1 1 100%;
            min-width: 0;
            overflow-wrap: anywhere;
        }
}
/* masked-field reveal toggle */
.refund-theme.studentregistrationview-page .srv-eye{
  display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:22px; margin-left:4px; border-radius:4px;
  color:var(--muted); cursor:pointer; vertical-align:middle;
}
.refund-theme.studentregistrationview-page .srv-eye:hover{ background:var(--brand-light); color:var(--brand-dark); }
.refund-theme.studentregistrationview-page .srv-eye .fa,
.refund-theme.studentregistrationview-page .srv-eye .glyphicon{ font-size:12.5px; }
/* "no file / nothing to view" - greyed and inert, instead of the old white-on-white icon */
.refund-theme.studentregistrationview-page .srv-eye.rt-is-disabled{
  opacity:.35; cursor:not-allowed; pointer-events:none;
}

/* ---- siblings ---- */
.refund-theme.studentregistrationview-page .sibling-grid{ display:flex; flex-wrap:wrap; gap:7px; }
.refund-theme.studentregistrationview-page .sibling-item{
  padding:5px 11px; background:var(--brand-light); border:1px solid var(--brand-hover-border);
  border-radius:14px; font-size:12px; color:var(--brand-dark);
}

/* ---- documents ---- */
.refund-theme.studentregistrationview-page .doc-row{
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding:8px 0; border-bottom:1px solid var(--line);
}
.refund-theme.studentregistrationview-page .doc-row:last-child{ border-bottom:none; }
/* the name column was pinned at min-width:400px, which pushed the upload controls off a narrow screen.
   It flexes now, with a floor rather than a fixed size. */
.refund-theme.studentregistrationview-page .doc-name{
  flex:1 1 260px; min-width:200px; font-size:12.5px; color:var(--ink); line-height:1.5;
}
.refund-theme.studentregistrationview-page .doc-no{
  display:inline-flex; align-items:center; justify-content:center;
  width:19px; height:19px; margin-right:6px; border-radius:50%;
  background:var(--surface-2); border:1px solid var(--line);
  font-size:10.5px; font-weight:700; color:var(--muted);
}
.refund-theme.studentregistrationview-page .doc-lock{ color:var(--ok); margin-left:5px; font-size:11px; }
.refund-theme.studentregistrationview-page .doc-hint{
  display:block; margin-left:25px; font-size:10px; color:var(--muted);
}
.refund-theme.studentregistrationview-page .doc-action{ flex:0 0 auto; }
.refund-theme.studentregistrationview-page .doc-file{ flex:1 1 240px; min-width:200px; }
.refund-theme.studentregistrationview-page .doc-file .component.input-container{ margin:0 !important; }
/* the file-chooser field is COMMON - see ".rt-filefield" in the components section */

/* =====================================================================
   STUDENT REGISTRATION  (Views/StudentRegistration/Index.cshtml)
   ---------------------------------------------------------------------
   The largest legacy form in the app: 6 tabs, ~15 `.titleCom` sections,
   several hundred `.component.input-container` floating-label fields.
   Almost nothing is needed here, because all three of those are already
   COMMON - the tab strip (`.nav-tabs-custom`), the auto-numbered section
   headings (`.titleCom`) and the floating-label conversion. So is the
   sticky action bar (`.rt-stickybar`) and the file field (`.rt-filefield`).
   What is left below is what the page's own two <style> blocks were
   actually for, on tokens instead of hardcoded colours.
   NO field sizes, NO tab styling, NO error colours redeclared.
   ===================================================================== */
/* room for the fixed action bar, so the last section is never covered by it */
.refund-theme.studentregistration-page{ padding-bottom:66px; }
/* NO section-card styling here: the "numbered heading + fields = one card" treatment that gives this page
   the same look as the enquiry pages is COMMON - see "SECTION CARD" in the LEGACY FORM CHROME block. */

/* the Sibling hint line is COMMON - see `.rt-emptyhint` in the components section (three pages use it) */

/* ---- Upload Documents table (Documents tab) ----
   The File cell holds a full-width `.rt-filefield`, so with `table-layout:auto` it claimed nearly the whole
   table and squeezed the Document column to ~90px - names broke one word per line and the size/type hint ran
   to four. The old markup avoided that with `width:466px` inline on the input; real column widths do the same
   job without freezing the layout on a narrow screen. */
.refund-theme.studentregistration-page .srg-doctable{ table-layout:fixed; width:100%; }
.refund-theme.studentregistration-page .srg-doctable th:first-child,
.refund-theme.studentregistration-page .srg-doctable td:first-child{ width:38%; }
.refund-theme.studentregistration-page .srg-doctable th:nth-child(2),
.refund-theme.studentregistration-page .srg-doctable td:nth-child(2){ width:auto; }
.refund-theme.studentregistration-page .srg-doctable th:last-child,
.refund-theme.studentregistration-page .srg-doctable td:last-child{ width:78px; }
/* the document name: wraps on WORDS, and the hint sits on its own line under it */
.refund-theme.studentregistration-page .srg-doc-name{
  white-space:normal; word-break:normal; overflow-wrap:anywhere;
  font-size:12.5px; color:var(--ink); line-height:1.45; vertical-align:middle;
}
.refund-theme.studentregistration-page .srg-doc-hint{
  display:block; margin-top:2px; font-size:10.5px; color:var(--muted); white-space:nowrap;
}
.refund-theme.studentregistration-page .srg-doc-lock{ color:var(--ok); margin-left:4px; font-size:11px; }
/* the file cell's field carries the component's own margin; zero it so rows stay compact */
.refund-theme.studentregistration-page .srg-doctable .component.input-container{ margin:0 !important; }
.refund-theme.studentregistration-page .srg-doctable td{ vertical-align:middle; }
.refund-theme.studentregistration-page .srg-doc-view{ white-space:nowrap; }

/* ---- photo capture / crop ---- */
/* `.image-preview-input` is a button with a transparent <input type=file> laid over it */
.refund-theme.studentregistration-page .image-preview-input{
  position:relative; overflow:hidden; margin:0; z-index:auto;
  color:var(--ink); background:var(--surface); border-color:var(--line);
}
.refund-theme.studentregistration-page .image-preview-input input[type="file"]{
  position:absolute; top:0; right:0; margin:0; padding:0;
  font-size:20px; cursor:pointer; opacity:0;
}
.refund-theme.studentregistration-page .image-preview-input-title{ margin-left:2px; }
/* the captured photo, with a remove badge in its corner. Was `background-color:lightgrey` + a 22px black
   glyph and `opacity:3` on hover (not a valid opacity - it clamps to 1, so the rule did nothing). */
.refund-theme.studentregistration-page .img-wrap{ position:relative; display:inline-block; font-size:0; }
.refund-theme.studentregistration-page .img-wrap img{ border:1px solid var(--line); border-radius:6px; }
.refund-theme.studentregistration-page .img-wrap .close{
  position:absolute; top:5px; right:5px; z-index:5;
  width:20px; height:20px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:var(--surface); border:1px solid var(--no-border);
  color:var(--no); opacity:.85; font-size:14px; font-weight:700; line-height:1;
  padding:0; cursor:pointer; text-shadow:none;
}
.refund-theme.studentregistration-page .img-wrap .close:hover{
  opacity:1; background:var(--no); color:var(--on-brand); border-color:var(--no);
}

/* ---- checkbox rows ---- */
.refund-theme.studentregistration-page .lblCheck{
  padding-left:15px; text-indent:-15px; font-weight:600;
}
.refund-theme.studentregistration-page .inputCheck{
  width:14px; height:14px; padding:0 !important; margin:0 4px 0 0 !important;
  vertical-align:middle; accent-color:var(--brand); cursor:pointer;
}
/* `.text-muted` under a checkbox is a hint line, not Bootstrap's generic utility. The page redefined
   `.text-muted` GLOBALLY (`margin-top:-13px; margin-left:40px`), which moved every element carrying that
   class anywhere on the page. Scoped to the rows that actually want it. */
.refund-theme.studentregistration-page .component .text-muted{
  display:block; margin:-2px 0 0 22px; font-size:11px; color:var(--muted);
}

/* the student-search box is disabled until a mode is chosen; make that read as disabled, not as an error */
.refund-theme.studentregistration-page .txtStudentSearch:disabled{
  background:var(--locked-bg) !important; color:var(--muted) !important; cursor:not-allowed;
}

/* which tab you are on, shown at the left of the fixed bar - without it the bar has no context for what
   Next does. Pill-shaped so it reads as a status, not as another label in the notify group. */
.refund-theme.studentregistration-page .rt-sb-step{
  flex:0 0 auto; padding:3px 10px; border-radius:11px;
  background:var(--brand-light); border:1px solid var(--brand-hover-border); color:var(--brand-dark);
  font-size:10.5px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; white-space:nowrap;
}
/* the notify group only appears on the last tab (there is nothing to send before Save exists), so on the
   earlier tabs the bar holds just the step pill and the nav buttons */
.refund-theme.studentregistration-page .rt-sb-notify{ gap:14px; }

/* ---- empty state ---- */
.refund-theme.studentregistrationview-page .no-record{ text-align:center; padding:10px 0; }
/* the original centred this with `margin-left:23%`, which is only centred at one particular width */
.refund-theme.studentregistrationview-page .no-record-img{ max-width:220px; height:auto; opacity:.85; }

/* =====================================================================
   CAMPUS VISITED  (Views/CampusVisited/CampusVisited.cshtml)
   ---------------------------------------------------------------------
   Same shape as FollowUpInquiry: toolbar + task buckets + grid, and the
   same two follow-up popups. Everything reusable already lives in the
   common blocks (frr-totbar/frr-tot buckets, .rt-modal headers, .rt-fu-*
   popup internals), so only the page's own layout bits are here.
   No field sizes are redeclared.
   ===================================================================== */
/* .cv-filters (the second header row) is styled by the COMMON .rt-filterrow rule */
.refund-theme.campusvisited-page .cv-buckets{ margin:0 16px 12px; }
/* buckets are clickable, so they need affordance the read-only KPI cards don't have */
.refund-theme.campusvisited-page .cv-bucket{ cursor:pointer; transition:border-color .12s, background .12s, box-shadow .12s; }
.refund-theme.campusvisited-page .cv-bucket:hover{ border-color:var(--brand-hover-border); background:var(--row-hover); }
.refund-theme.campusvisited-page .cv-bucket.hl{ box-shadow:inset 0 0 0 1px var(--brand); }
.refund-theme.campusvisited-page .cv-bucket.hl b{ color:var(--brand-dark); }
/* validation-error state: COMMON (see the two ERROR blocks at the top of this file) */

/* =====================================================================
   FOLLOW UP DAYS  (Views/FollowUpDaysConfig/FollowUpDays.cshtml)
   ---------------------------------------------------------------------
   A small settings page: one card holding a two-column list of
   "Follow-up No." -> "Follow-up Days" inputs, plus Save / Reset.

   The .fud-* list is a genuinely page-specific component (no other screen
   has it), so page-scoped rules are correct here. Field SIZE still comes
   from the COMMON block - the input below only sets width/alignment, never
   height/border/font.
   ===================================================================== */
.refund-theme.followupdays-page .fud-list{
  border:1px solid var(--line); border-radius:8px; background:var(--surface); overflow:hidden;
}
/* header reads like a themed grid head: light tint, small uppercase caption */
.refund-theme.followupdays-page .fud-head{
  display:flex; align-items:center; gap:20px; padding:9px 14px;
  background:var(--surface-2); border-bottom:1px solid var(--line);
  font-size:10.5px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.4px;
}
.refund-theme.followupdays-page .fud-row{
  display:flex; align-items:center; gap:20px; padding:8px 14px;
  border-bottom:1px solid var(--line);
}
.refund-theme.followupdays-page .fud-row:last-child{ border-bottom:none; }
.refund-theme.followupdays-page .fud-row:nth-child(even){ background:var(--row-alt); }
.refund-theme.followupdays-page .fud-row:hover{ background:var(--row-hover); }
.refund-theme.followupdays-page .fud-no{
  flex:1 1 auto; min-width:0; font-size:12.5px; font-weight:500; color:var(--ink);
}
.refund-theme.followupdays-page .fud-days{ flex:0 0 140px; }
/* width/alignment only - height, border, radius and type size come from the common field rule */
.refund-theme.followupdays-page .fud-days .form-control{ width:140px; text-align:center; }
/* footer: buttons left-aligned as before */
.refund-theme.followupdays-page .box-footer{ display:flex; gap:10px; padding:12px 16px !important; }

/* =====================================================================
   $ngConfirm DIALOGS - COMMON, AND DELIBERATELY UNSCOPED
   ---------------------------------------------------------------------
   The "Alert !!! / Yes / No" confirmations raised from controllers with
   `$ngConfirm({...})`. There is no markup for them in any view - the
   library builds the dialog and appends it to <body>, i.e. OUTSIDE the
   `.refund-theme` root - so, exactly like the datepicker popup and the
   jQuery UI autocomplete, these rules cannot be scoped. Same precedent,
   same reason, stated here so nobody "fixes" it by adding a prefix.
   Left unstyled they render the library's own slate header and a pink
   Yes, which is the one dialog on a themed page still wearing the old
   look. Themed here, so EVERY page's confirmations match at once.

   BUTTON INTENT: the confirm button is styled from its POSITION, not
   from its class. Controllers pass `btnClass:'btn-danger'` for every
   affirmative regardless of what it does - "Yes, activate this academic
   year" arrives red - so honouring that class would keep painting benign
   confirmations as destructive. First button = the affirmative = brand
   fill; the rest are quiet. Matches the theme's "primary action first"
   footer convention.
   A dialog that IS destructive can still opt in with `.frr-cf-danger`.

   Note the duplicate-enquiry alert below has its own `:has()` block; it
   is more specific and comes later, so it keeps winning.
   ===================================================================== */
.ng-confirm .ng-confirm-box{
  border-radius:8px !important; padding:0 !important; overflow:hidden !important;
  box-shadow:0 12px 44px rgba(16,42,58,.32) !important;
  border:none !important;
}
/* header: brand bar, white title and white icon */
.ng-confirm .ng-confirm-box div.ng-confirm-title-c{
  background:var(--brand) !important; background-image:none !important;
  margin:0 !important; padding:11px 16px !important; text-align:left !important;
}
.ng-confirm .ng-confirm-box div.ng-confirm-title-c .ng-confirm-title,
.ng-confirm .ng-confirm-box div.ng-confirm-title-c .ng-confirm-title span,
.ng-confirm .ng-confirm-box div.ng-confirm-title-c .ng-confirm-icon-c i{
  color:var(--on-brand) !important;
  font-size:14.5px !important; font-weight:600 !important; letter-spacing:.2px;
}
.ng-confirm .ng-confirm-box div.ng-confirm-closeIcon{ color:var(--on-brand) !important; opacity:.9; }
.ng-confirm .ng-confirm-box div.ng-confirm-closeIcon:hover{ opacity:1; }
/* body: a sentence, so left-aligned and at reading size rather than centred and small */
.ng-confirm .ng-confirm-box div.ng-confirm-content-pane .ng-confirm-content{
  padding:16px 18px !important;
  font-size:13px !important; line-height:1.55 !important; color:var(--ink) !important; text-align:left !important;
}
/* footer: separated, centred, rt-btn geometry */
.ng-confirm .ng-confirm-box .ng-confirm-buttons{
  padding:12px 16px !important; margin:0 !important;
  background:var(--surface-2) !important; border-top:1px solid var(--line) !important;
  display:flex !important; gap:9px !important; justify-content:center !important;
}
.ng-confirm .ng-confirm-box .ng-confirm-buttons button{
  float:none !important; margin:0 !important; min-width:82px;
  height:34px; padding:0 16px !important;
  border-radius:5px !important; border:1px solid var(--line) !important;
  background:var(--surface) !important; color:var(--ink) !important;
  font-size:12.5px !important; font-weight:600 !important; text-transform:none !important; letter-spacing:0 !important;
  box-shadow:none !important; opacity:1 !important;
}
.ng-confirm .ng-confirm-box .ng-confirm-buttons button:hover{
  background:var(--row-hover) !important; border-color:var(--grip) !important;
}
/* the affirmative - first in the row */
.ng-confirm .ng-confirm-box .ng-confirm-buttons button:first-child{
  background:var(--brand) !important; border-color:var(--brand-edge) !important; color:var(--on-brand) !important;
}
.ng-confirm .ng-confirm-box .ng-confirm-buttons button:first-child:hover{
  background:var(--brand-dark) !important; border-color:var(--brand-edge) !important;
}
/* opt-in for a genuinely destructive confirmation: add frr-cf-danger to the dialog's class option */
.ng-confirm .ng-confirm-box.frr-cf-danger div.ng-confirm-title-c{ background:var(--no) !important; }
.ng-confirm .ng-confirm-box.frr-cf-danger .ng-confirm-buttons button:first-child{
  background:var(--no) !important; border-color:var(--no-border) !important;
}

/* =====================================================================
   DUPLICATE ENQUIRY ALERT  ($ngConfirm popup raised by
   AdmisssionMaster.js / RegistrationMaster.js CheckCommunicationNumberExist)
   ---------------------------------------------------------------------
   The dialog is built in JS with `type:'default'` and no custom class, so
   there is no marker on the root element to scope against. It IS however
   the only $ngConfirm whose content contains `.dup-alert-wrapper`, so
   `:has()` gives a CSS-only hook - no JS change needed, and no other
   confirm dialog on any page is touched.

   Colours: NewFormCSS hardcodes #29405c (navy) for the header, the table
   head and both buttons. Everything below re-points those at theme
   tokens so the popup follows the accent like every other dialog.
   ===================================================================== */
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper){ border-radius:10px !important; padding:0 !important; overflow:hidden !important; box-shadow:0 12px 40px rgba(16,42,58,.28) !important; }
/* header: brand bar with white title, matching .frr-detailpop / #FeesRefundSearch */
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) div.ng-confirm-title-c{
  background:var(--brand) !important; background-image:none !important;
  margin:0 !important; padding:12px 18px !important; text-align:left !important;
}
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) div.ng-confirm-title-c .ng-confirm-title,
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) div.ng-confirm-title-c .ng-confirm-title span{
  color:var(--on-brand) !important; font-size:14.5px !important; font-weight:600 !important; letter-spacing:.2px;
}
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) div.ng-confirm-closeIcon{ color:var(--on-brand) !important; opacity:.9; }
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) div.ng-confirm-content-pane .ng-confirm-content{
  padding:16px 18px 4px !important;
}
.dup-alert-wrapper{ font-size:12.5px !important; color:var(--ink) !important; }
.dup-alert-msg{ margin-bottom:12px !important; font-weight:400 !important; color:var(--ink) !important; }
/* the record list reads as a themed popup grid: light grey head (not a heavy dark bar), zebra rows,
   token borders - same treatment as .frr-detailpop's tables */
.dup-alert-table{ border:1px solid var(--line) !important; border-radius:6px; overflow:hidden; margin:0 !important; }
.dup-alert-table thead th{
  background:var(--surface-2) !important; color:var(--muted) !important;
  font-size:10.5px !important; font-weight:700 !important; text-transform:uppercase; letter-spacing:.4px;
  border-color:var(--line) !important; padding:8px 10px !important; white-space:nowrap;
}
.dup-alert-table tbody td{
  font-size:12.5px !important; color:var(--ink) !important;
  border-color:var(--line) !important; padding:7px 10px !important;
}
.dup-alert-table tbody tr:nth-child(even) td{ background:var(--row-alt) !important; }
.dup-alert-table tbody tr:hover td{ background:var(--row-hover) !important; }
/* buttons: rt-btn shapes. `.btn-theme` is the recommended action (Change Number) so it takes the brand
   fill; `.btn-outline-theme` (Continue With Same Number) is the secondary. The stock
   `.btn-outline-theme:hover{background:red}` is dropped - hover is not a destructive state here. */
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) .ng-confirm-buttons{
  padding:12px 18px !important; border-top:1px solid var(--line) !important;
  display:flex !important; justify-content:flex-end !important; gap:10px;
}
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) .ng-confirm-buttons button{
  margin:0 !important; height:34px; padding:0 16px !important; border-radius:5px !important;
  font-size:12.5px !important; font-weight:600 !important; text-transform:none !important;
}
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) .ng-confirm-buttons button.btn-theme{
  background:var(--brand) !important; border:1px solid var(--brand) !important; color:var(--on-brand) !important;
}
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) .ng-confirm-buttons button.btn-theme:hover{
  background:var(--brand-dark) !important; border-color:var(--brand-dark) !important;
}
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) .ng-confirm-buttons button.btn-outline-theme{
  background:var(--surface) !important; border:1px solid var(--line) !important; color:var(--ink) !important;
}
.ng-confirm .ng-confirm-box:has(.dup-alert-wrapper) .ng-confirm-buttons button.btn-outline-theme:hover{
  background:var(--brand-light) !important; border-color:var(--brand) !important; color:var(--brand-dark) !important;
}

/* Cancel-details popup ($ngConfirm / angular-confirm) themed to the common refund brand teal.
   angular-confirm uses .ng-confirm-* (NOT .jconfirm-*); type class lands on the root .ng-confirm.
   Specificity here is deliberately higher than NotificationTheme.css so this dialog reads teal. */
.ng-confirm.cf-cancelinfo .ng-confirm-box{ border-radius:10px !important; padding:0 !important; overflow:hidden !important; box-shadow:0 12px 40px rgba(16,42,58,.28) !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box div.ng-confirm-title-c{ background:linear-gradient(135deg, var(--brand), var(--brand-dark)) !important; color:#fff !important; margin:0 !important; padding:12px 18px !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box div.ng-confirm-title-c .ng-confirm-title{ color:#fff !important; font-size:15px !important; font-weight:700 !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box div.ng-confirm-title-c .ng-confirm-icon-c,
.ng-confirm.cf-cancelinfo .ng-confirm-box div.ng-confirm-title-c .ng-confirm-icon-c i{ color:#fff !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box div.ng-confirm-closeIcon{ color:#fff !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box div.ng-confirm-content-pane .ng-confirm-content{ padding:16px 18px !important; font-size:13.5px !important; color:#1c2a3a !important; line-height:1.7 !important; white-space:pre-line !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box .ng-confirm-buttons{ padding:12px 18px !important; border-top:1px solid #e6ebf0 !important; justify-content:flex-end !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box .ng-confirm-buttons > button{ background:var(--brand) !important; color:#fff !important; border:none !important; min-width:92px !important; padding:8px 22px !important; border-radius:6px !important; font-weight:600 !important; text-transform:none !important; box-shadow:none !important; }
.ng-confirm.cf-cancelinfo .ng-confirm-box .ng-confirm-buttons > button:hover{ background:var(--brand-dark) !important; filter:none !important; }

.refund-theme.collectfees-page .cf-cancel-box .box-header.frr-ch.cf-receipts-head::before{ display:none !important; content:none !important; }

/* =====================================================================
   SCRUTINY AUTHORITY  (Views/ScrutinyAuthorityMaster/
                        StudentScrutinyAuthority.cshtml
                        + EmployeeScrutinyAuthority.cshtml)
   ---------------------------------------------------------------------
   ONE block for BOTH pages - they are twins (same controller name, same
   markup, only `FeildFor` and the script bundle differ), so they share
   `.scrutinyauth-page` rather than getting a page class each. Keep them
   in step: a rule added for one is a rule for the other.

   ALMOST NOTHING IS PAGE-LEVEL. The toolbar, the .rt-filterrow add row,
   the .critbar, the grid, .PaginationSec, the .rt-ico delete button, the
   frr-confirm dialog and the Export dropdown are all COMMON. What is left
   below is two field widths, a divider, a count and one clear-x override -
   the things that are genuinely about this screen's content.
   Field sizes, label type and button designs are NOT redeclared here.
   ===================================================================== */
/* THE EMPLOYEE PICKER.
   It searches every employee in the school, and the option text is "Name [UserId]", so it is the widest
   thing on the row by a distance. It was `col-md-8` before - eight of twelve columns - which left the Add
   button stranded in the middle of the row.

   WHY THE SELECTOR IS THIS DEEP, and it matters. `.rt-filterrow .frr-fld` sets `min-width:0; flex:0 0
   auto`, at (0,3,0). A `.refund-theme.scrutinyauth-page .sca-empfld` rule is ALSO (0,3,0), so the two tie
   and the winner is decided by file order alone - which is exactly the kind of rule that works today and
   silently loses the next time something is inserted below it. Matching on the parent as well makes this
   (0,4,0) and settles it on specificity. `min-width` is restated for the same reason: `.frr-fld` ships
   `min-width:180px`, and min-width overrides width, so a bare `width` would have been ignored outright. */
/* the shape is the COMMON `.rt-fld-fixed`; only the number is page knowledge */
.refund-theme.scrutinyauth-page .sca-empfld{ --fld-w:460px; }
/* THE STATUS FILTER - first in the row. Sized to its two words rather than stretching. Same (0,4,0)
   selector depth and the same `min-width:0` reason as the picker above.
   Box, panel, height and radius all come from the COMMON select2 rules - nothing about the control's
   appearance is redeclared here. */
.refund-theme.scrutinyauth-page .sca-statusfld{ --fld-w:150px; }
/* NO CLEAR-X ON A MANDATORY FILTER.
   `_Layout` initialises every `.rt-select` with `allowClear:true`. That is right for an optional field
   and wrong here: this filter always has to hold a value, and clicking the x sets IsActiveUser to null,
   at which point ng-change reloads the grid with no status at all - a state the controller has no answer
   for. There is no per-control way to switch allowClear off without editing the shared init, so the x is
   removed in CSS instead. `pointer-events:none` as well as `display:none` so it cannot be reached by
   keyboard either.
   This is the general fix for any REQUIRED rt-select - copy it rather than reinventing it. */
.refund-theme.scrutinyauth-page .sca-statusfld .select2-selection__clear{
  display:none !important; pointer-events:none !important;
}
/* with no x there is nothing between the value and the caret, so the value gets the full box back */
.refund-theme.scrutinyauth-page .sca-statusfld .select2-selection--single .select2-selection__rendered{
  padding-right:26px;
}
/* THE DIVIDER, and it is not decoration. This row carries two unrelated jobs: Status FILTERS the grid
   below, while Employee + Add INSERTS a record. Read as one row they look like one form, so "Active"
   reads as a field you are filling in on the way to pressing Add. The hairline says otherwise.
   `align-self:stretch` would also stretch it over the label line above the fields, so it is given the
   field's own height and pushed down past the label instead. */
.refund-theme.scrutinyauth-page .rt-filterrow .sca-div{
  flex:0 0 auto; align-self:flex-end;
  width:1px; height:26px; margin:0 4px 5px;
  background:var(--line);
}
/* the record count, moved out of the removed .critbar. Quiet - it is a readout, not a control. */
.refund-theme.scrutinyauth-page .rt-filterrow .sca-count{
  flex:0 0 auto; align-self:flex-end; margin-bottom:9px;
  padding:3px 10px; border-radius:12px;
  background:var(--surface); border:1px solid var(--line);
  font-size:11px; font-weight:700; color:var(--muted); white-space:nowrap;
}
/* `.rt-filterrow` has no spacer of its own (`.critbar` did), so the count is pushed right by this one */
.refund-theme.scrutinyauth-page .rt-filterrow .spacer{ flex:1 1 auto; min-width:8px; }
/* (a `.sca-limit` note used to sit under the row, stating the 10-authority cap. Removed at request, and
   its rule with it - a page block should not accumulate styles for elements that no longer exist.) */

/* =====================================================================
   SCRUTINY FIELD CONFIGURATION
   (Views/ScrutinyFieldConfiguration/ScrutinyFieldConfiguration.cshtml)
   ---------------------------------------------------------------------
   Two tabs of settings rows, a Student/Employee filter, a toggle per row
   that opens a year dialog, and a log popup.
   The tab strip is the COMMON `.nav-tabs-custom` mapping onto `.rt-tabs`;
   the toolbar, .rt-filterrow, grid, `<switch>` skin, `.rt-ico` buttons and
   `.rt-modal` dialogs are all common. What is below is the two tweaks the
   common tab panel needs when its panes hold GRIDS instead of cards, one
   field width, the status pills and one icon colour.
   ===================================================================== */
/* THE TAB BLOCK IS INSIDE A `.box`, so it must not look like a second card.
   The common rule gives `.nav-tabs-custom` a white surface, a radius, a shadow and a 16px bottom margin -
   correct when the strip IS the page's container, wrong when it sits inside one: you get a card in a card
   with a double border and a gap under it. */
.refund-theme.scrutinyfield-page .sfc-tabs{
  background:transparent; border-radius:0; box-shadow:none; margin-bottom:0;
}
/* THE PANEL TAKES NO PADDING AND NO TINT HERE.
   The common `.nav-tabs-custom > .tab-content` is tinted with `var(--panel)` and padded 14px, because on
   the pages it was written for each pane holds white `.box` cards and a white-on-white panel would
   flatten them into one sheet. This page's panes hold a GRID, which is already full-bleed and expects a
   white surface - on a tinted panel the header strip floats on a grey border. */
.refund-theme.scrutinyfield-page .sfc-tabs > .tab-content{
  padding:0; background:transparent; border-radius:0;
}
/* the grid is already inset by `.box-body`, so the pane adds nothing of its own */
.refund-theme.scrutinyfield-page .sfc-tabs .tab-pane > .box-body{ padding:0 0 12px !important; }

/* Field For lives in the TOOLBAR on `.rt-tbfield`, not in a `.rt-filterrow` - see the view for why. Its
   width comes from that common component; "Student" / "Employee" both fit the default comfortably, so
   there is no page width rule here to keep in sync. */
/* NO CLEAR-X ON A MANDATORY FILTER - same reasoning as the Scrutiny Authority status filter. _Layout
   gives every `.rt-select` `allowClear:true`; clearing this one posts `FieldFor: null` to the API. */
/* (the clear-x rules that were here are now the COMMON `.rt-required` - see that block) */

/* Scrutiny Require: the theme's `.frr-status` pill shape, this page's two states. Was `.text-success` /
   `.text-danger` words on the cell. */
/* (`.st-sfc-on` / `.st-sfc-off` deleted - duplicates of `.rt-st-ok` / `.rt-st-no`) */

/* the log button is a neutral action - not a create, not a destroy - so it stays muted and only picks up
   the brand on hover, unlike the edit/delete icons which are coloured at rest */
.refund-theme.scrutinyfield-page .rt-ico-log{ color:var(--muted); }
.refund-theme.scrutinyfield-page .rt-ico-log:hover{ color:var(--brand); border-color:var(--brand); background:var(--brand-light); }

/* =====================================================================
   SCRUTINY  (Views/ScrutinyMaster/ScrutinyMaster.cshtml
              + Partial/ScrutinyDetail.cshtml)
   ---------------------------------------------------------------------
   The worklist: three count cards, a bucket filter, a dynamic-column
   grid. The count strip is the COMMON `.rt-stats`, the filter sits on the
   COMMON `.rt-tbfield`, and the toolbar, grid, sort indicator, pagination
   and Customize Column dialog are all common too.

   THE SECOND HALF OF THIS BLOCK IS THE DETAIL PARTIAL'S. Those rules used
   to live in a `<style>` in ScrutinyMaster.cshtml even though every one of
   them styles ScrutinyDetail.cshtml - so the parent page carried its
   child's CSS, and deleting that block would have silently unstyled the
   detail screen. They are moved here VERBATIM IN EFFECT, only re-scoped
   and re-pointed at tokens, so the detail screen looks the same today.
   Converting that partial's MARKUP is a separate pass; when it happens,
   expect most of these to disappear into common components.
   ===================================================================== */
/* the bucket filter holds "Pending Scrutiny" / "Completed Scrutiny" / "All Scrutiny", so it needs more than
   the 170px `.rt-tbfield` default */
.refund-theme.scrutinymaster-page .rt-tbfield .sm-bucket,
.refund-theme.scrutinymaster-page .sm-bucketfld > .select2-container{ width:200px !important; }
/* NO CLEAR-X: _Layout gives every rt-select `allowClear:true`, and this filter must always hold one of the
   three bucket values - clearing it would post an empty bucket. Same fix as the other Scrutiny screens. */
.refund-theme.scrutinymaster-page .sm-bucketfld .select2-selection__clear{
  display:none !important; pointer-events:none !important;
}
.refund-theme.scrutinymaster-page .sm-bucketfld .select2-selection--single .select2-selection__rendered{
  padding-right:26px;
}
/* the academic year is a read-only readout, so it is sized to a year and reads as disabled, not as an
   empty field someone forgot to fill in */
.refund-theme.scrutinymaster-page .sm-yearfld > .form-control{ width:120px !important; text-align:center; }

/* ---- DETAIL PARTIAL (ScrutinyDetail.cshtml) - moved out of the parent page's <style> ---- */
/* the student summary panel. Was `background:#e1ecf1` with its own shadow and radius; on tokens now so it
   matches every other summary strip in the theme. */
.refund-theme.scrutinymaster-page .scrutiny-wrapper{ padding:14px 0 4px; }
.refund-theme.scrutinymaster-page .scrutiny-card{
  background:linear-gradient(180deg,var(--surface),var(--head-tint));
  border:1px solid var(--line); border-radius:9px; box-shadow:var(--shadow); padding:14px 16px;
}
/* Two columns of label/value pairs. The markup repeats `.scrutiny-grid` once PER ROW rather than putting
   all the items in one grid, so each is its own 2-column grid - kept as-is (that is markup, and this pass
   is not touching the partial), hence the row gap below is on the container. */
.refund-theme.scrutinymaster-page .scrutiny-grid{
  display:grid; grid-template-columns:repeat(2,1fr); gap:4px 30px;
}
.refund-theme.scrutinymaster-page .scrutiny-grid + .scrutiny-grid{ margin-top:8px; }
.refund-theme.scrutinymaster-page .scrutiny-grid .item{ display:flex; gap:6px; align-items:baseline; min-width:0; }
/* the caption keeps the theme's label treatment instead of a hand-set #555 bold */
.refund-theme.scrutinymaster-page .scrutiny-grid .item label{
  margin:0; white-space:nowrap; font-size:11px; color:var(--muted);
  font-weight:600; text-transform:uppercase; letter-spacing:.3px;
}
.refund-theme.scrutinymaster-page .scrutiny-grid .item span{
  flex:1; min-width:0; font-size:12.5px; font-weight:600; color:var(--ink);
}
.refund-theme.scrutinymaster-page .scrutiny-grid .item.full{ grid-column:span 2; }
/* "Display only Pending Records" tick box in the tab strip */
.refund-theme.scrutinymaster-page .pending-checkbox{
  width:15px; height:15px; margin:0; accent-color:var(--brand); cursor:pointer;
}
.refund-theme.scrutinymaster-page .pending-label{
  margin:0; font-size:12px; color:var(--ink); font-weight:500;
  text-transform:none; letter-spacing:normal; cursor:pointer;
}
/* the pending-count bubble on each tab (defined in the partial's own <style>; re-pointed at tokens here so
   it stops being a hardcoded #e1ecf1 circle) */
.refund-theme.scrutinymaster-page .count-circle{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:20px; height:20px; padding:0 6px; margin-left:6px; border-radius:10px;
  background:var(--brand); color:var(--on-brand);
  font-size:11px; font-weight:700; line-height:1;
}
/* an ACTIVE tab's bubble inverts, so the count you are looking at is not the one shouting loudest */
.refund-theme.scrutinymaster-page .nav-tabs > li.active > a .count-circle{
  background:var(--brand-light); color:var(--brand-dark);
}

/* ---- FULL-WIDTH FIELD GRID ----
   THE BUG THIS FIXES: the field grid was inset from the card edges by FOUR separate paddings - the outer
   card's `.box-header` (a title strip, padded for text), a `.row > .col-md-12` (Bootstrap gutters), a
   SECOND `.box box-primary` nested inside the first card's header, and the tab panel's own 14px. So it
   could never line up with the grid on the list page. The markup dropped the row/col and the nested card;
   these two rules remove the last two paddings.
   Same shape as the ScrutinyFieldConfiguration tabs - see that block for why the common tinted, padded
   panel is right for panes holding CARDS and wrong for panes holding a GRID. */
.refund-theme.scrutinymaster-page .sd-tabs{
  background:transparent; border-radius:0; box-shadow:none; margin-bottom:0;
}
.refund-theme.scrutinymaster-page .sd-tabcontent{
  padding:0; background:transparent; border-radius:0;
}
/* the scroll container: the table fills it, and `attendance_table_scroll` supplies the max-height */
.refund-theme.scrutinymaster-page .sd-grid > table{ width:100%; }
/* Field Name is the row's subject and the longest text in it ("Student Name/First Name",
   "Birth Certificate"). Without a width it collapsed to the narrowest column and wrapped onto three lines,
   making every row tall. The date and person columns are fixed so the free space goes to the name. */
.refund-theme.scrutinymaster-page .sd-grid th:first-child,
.refund-theme.scrutinymaster-page .sd-grid td:first-child{ min-width:190px; }
.refund-theme.scrutinymaster-page .sd-grid th:nth-child(4),
.refund-theme.scrutinymaster-page .sd-grid td:nth-child(4){ min-width:210px; white-space:nowrap; }
/* "Display only Pending Records" - a normal item at the right end of the tab strip. It used to be
   `position:absolute; right:15px; top:50%` (set by the PARENT page's <style>), which floated it over the
   strip and collided with the tabs on a narrow window.
   `margin-left:auto` ALONE IS NOT ENOUGH, and that is the trap: this element is a SIBLING of the `<ul>`,
   and it is `.nav-tabs-custom > .nav-tabs` (the ul) that the common rules make a flex row - not
   `.nav-tabs-custom` itself. So the tool had no flex parent to be pushed within and simply stacked
   underneath the tabs. Making the STRIP the flex row is the fix; the ul then grows and the tool sits at
   the end of the same line. The border-bottom moves onto the strip so the underline still runs the full
   width of the card. */
.refund-theme.scrutinymaster-page .sd-tabs{
  display:flex; align-items:stretch; flex-wrap:wrap;
  border-bottom:1px solid var(--line);
}
.refund-theme.scrutinymaster-page .sd-tabs > .nav-tabs{
  flex:1 1 auto; border-bottom:none;
}
.refund-theme.scrutinymaster-page .sd-striptool{
  display:flex; align-items:center; gap:7px;
  margin-left:auto; padding:0 16px 8px; align-self:flex-end;
}
/* the complete button's row - was a `.row > .col-md-4`, which also capped the button at a third of the card */
.refund-theme.scrutinymaster-page .sd-actions{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  margin:0 16px; padding:14px 0 4px; border-top:1px solid var(--line);
}
/* "Field" / "Document" in a confirm dialog's title - context for the name beside it, so it reads as a
   quiet chip rather than competing with the name itself. On the brand header, so it borrows the header's
   own ink at reduced strength instead of the muted grey a label would have taken. */
/* (`.sd-cf-kind` and `.wfs-cf-mode` deleted. These two were the giveaway for this whole
   exercise: two page-scoped classes doing the same job, already comma-joined into one rule
   because I could see they were identical - and still not promoted. Both are
   `.rt-titlechip` now.) */

/* =====================================================================
   WORKFLOW SETTING  (Views/WorkFlowSetting/WorkflowSetting.cshtml
                      + Partial/_UpdateWorkFlow.cshtml)
   ---------------------------------------------------------------------
   One row per workflow, and a dialog to change how its approvals route.
   Toolbar, grid, .PaginationSec, .rt-modal, .frr-fld, .rt-select and the
   button pair are ALL COMMON - the four rules below are the only things
   specific to this screen.
   ===================================================================== */
/* (a `.wfs-note` hint line used to sit under the title. Removed at request, and its rule with it - a page
   block should not accumulate styles for elements that no longer exist.) */
/* Approval Mode reads as a state. Neutral rather than green/red on purpose: Sequence and Anyone are two
   valid settings, not a good one and a bad one, so colouring them would imply a judgement. */
/* (`.st-wfs-mode` deleted - it was `.rt-st-info` under another name, and identical to
   `.st-wfa-mode` on the sibling screen) */
/* THE DIALOG'S TWO FIELDS - now a Bootstrap `.row` of two `col-lg-6`, not `.rt-filterrow`.
   `.rt-filterrow` was the wrong component: it is the FILTER bar row, and it overrides
   `.frr-fld` to `flex:0 0 auto`, which shrink-wrapped both dropdowns to about 90px inside
   a 900px dialog. Grid columns give each one half the width instead.
   Nothing is needed to align them - the row's -15px margin cancels the columns' +15px
   padding, so they land on `.modal-body`'s own padding. The only rule left is the gap for
   when the two columns wrap onto separate lines on a narrow window. */
.refund-theme.workflowsetting-page .wfs-fields [class^="col-"]{ margin-bottom:6px; }
/* (`.wfs-fields{padding:0}` deleted with the `.rt-filterrow` it was cancelling, and the two
   `.wfs-fld` rules before it were folded into the COMMON `.rt-fld-even`, which the columns
   now make unnecessary here.) */

/* =====================================================================
   WORKFLOW AUTHORITY  (Views/WorkflowAuthority/WorkflowAuthority.cshtml
                        + Partial/_ConfigureAuthority.cshtml
                        + Partial/_CustomizeLevelSequence.cshtml)
   ---------------------------------------------------------------------
   Workflow list -> configure who approves it -> drag the levels into order.
   Toolbar, grids, .PaginationSec, .rt-modal, .frr-fld, .rt-select, .rt-ico,
   .frr-grip, .rt-sb-notify and the button pair are ALL COMMON. Everything
   below is either a width, a chip, or one of the two things the level
   dialog genuinely needs.

   THREE STYLE BLOCKS WERE DELETED to get here: the parent page's (which
   held `.table-card`, used only by the CHILD partial, plus the validation
   rule now covered commonly) and the level dialog's ~65 lines, which
   re-declared seven components the theme already owns in the pre-theme
   navy palette AND carried a bare `.modal-title{color:#fff}` that reached
   every other modal on the page.
   ===================================================================== */
/* Approval Mode reads as a state. Neutral, not green/red: Sequence and Anyone are two valid settings, not a
   good one and a bad one, so colouring them would imply a judgement that isn't there. */
/* (`.st-wfa-mode` and `.wfa-chip` deleted - the first was `.rt-st-info`, the second was
   `.rt-titlechip`, including the brand-header white-wash variant. Both common now.) */
/* THE ADD-APPROVER ROW: a Bootstrap `.row` of `col-lg-*` fields, PLUS the Add Approver button
   which is deliberately NOT in a column.
   It used to be `.rt-filterrow`, and that is why the dropdowns were tiny. Every field carried
   `.rt-fld-even` ("share the row evenly", flex:1 1 0) and none of them obeyed it, because
   `.refund-theme .rt-fld-even` is (0,2,0) and loses to
   `.refund-theme .rt-filterrow .frr-fld{ min-width:0; flex:0 0 auto; }` at (0,3,0). The
   filter-row rule shrink-wrapped every control to its content: the Authority picker came out
   about 120px wide with half the card empty next to it.

   FLEXED, not left as Bootstrap's floated block row, for two reasons:
     * the button is a bare `.frr-fld` sibling with no column - in a floated row it would drop
       onto its own line; as a flex item it sits on the row and `.wfa-btnfld`'s `flex:0 0 auto`
       keeps it at its own label's width.
     * `align-items:flex-end` puts the button's baseline level with the bottom of the controls,
       so it needs no spacer label and no hardcoded top offset.
   The `col-lg-*` percentage widths still apply - Bootstrap sets them with `width`, and only its
   `float` is ignored in a flex container, which is what we want anyway. */
.refund-theme.workflowauthority-page .wfa-fields{
  display:flex; flex-wrap:wrap; align-items:flex-end; padding:0;
}
.refund-theme.workflowauthority-page .wfa-fields .wfa-btnfld{ flex:0 0 auto; min-width:0; }
/* APPROVAL MODE AND EMPLOYEE APPEARED MERGED INTO ONE CONTROL - they were literally OVERLAPPING.
   `.frr-fld` ships `min-width:180px` (see "FIELD SIZING IN A ROW" further up this file, which warns in
   as many words that this floor beats any width you set). Here each `.frr-fld` sits inside a Bootstrap
   column that is narrower than that floor, and since this row is `display:flex` the field simply refuses
   to shrink and spills out of its own column. Measured at a 1280px viewport:

       col-lg-2 content box  270 -> 408   (138px available)
       Approval Mode input   270 -> 450   (forced to 180px - 42px past its column)
       Employee select2      438 -> 912
       gap                   438 - 450  =  -12px   <- overlapping, hence "merged"

   The column is what decides the width on this row, so the field must be allowed to fill it and no more.
   `.wfa-btnfld` above already restates min-width:0 for the same reason - it was only the FIELD columns
   that were missed. Scoped to this row, so the common 180px floor is untouched for every other page.
   After: input 138px, gap 30px (the two 15px column paddings). */
.refund-theme.workflowauthority-page .wfa-fields > [class^="col-"] > .frr-fld{ min-width:0; }
/* this page has up to FOUR controls on the row, so it wraps earlier than the common 767px
   breakpoint - a genuine page difference, not a copy of the shape */
@media (max-width:991px){
  .refund-theme.workflowauthority-page .wfa-fields > [class^="col-"]{ flex:1 1 240px; }
}
/* a level number: a position in an order, so it reads as a badge rather than as data */
.refund-theme.workflowauthority-page .wfa-level{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:22px; height:22px; padding:0 6px; border-radius:11px;
  background:var(--brand); color:var(--on-brand);
  font-size:11px; font-weight:700; line-height:1;
}
/* (the page-scoped heading-alignment fix that was here is GONE - it was treating a symptom. The cause was
   the theme's own `thead th:first-child{ text-align:center }`, which applied to every grid regardless of
   what its first column held; that rule is now opt-in by content. See "FIRST COLUMN: 42px AND CENTRED"
   near the landing-grid header block.) */

/* ---- LEVEL SEQUENCE DIALOG ---- */
.refund-theme.workflowauthority-page .wfa-seq-hint{ margin:0 0 10px !important; }
/* was inline `height:380px; overflow-y:auto` - a FIXED height, so a two-approver workflow opened on a 380px
   empty well. max-height scrolls only once the list is actually long. */
.refund-theme.workflowauthority-page .wfa-seq{
  display:block; max-height:380px; overflow-y:auto; margin:0; padding:0;
}
/* the row: a grab target, so the whole thing shows the move cursor and lifts on hover */
.refund-theme.workflowauthority-page .wfa-seq .list-group-item{
  display:flex; align-items:center; gap:9px; cursor:move;
  background:var(--surface); border:1px solid var(--line); border-radius:6px;
  margin:0 0 6px; padding:7px 10px;
}
.refund-theme.workflowauthority-page .wfa-seq .list-group-item:hover{
  border-color:var(--brand); background:var(--row-hover-soft);
}
.refund-theme.workflowauthority-page .wfa-seq-name{ font-size:12.5px; font-weight:600; color:var(--ink); }
/* the approver-kind pill sits at the RIGHT end of the row, away from the name, so a long
   authority name never collides with it. `margin-left:auto` in the flex row does it. */
.refund-theme.workflowauthority-page .wfa-seq-type{ margin-left:auto; flex:0 0 auto; }
/* the empty row is not draggable, so it must not pretend to be */
.refund-theme.workflowauthority-page .wfa-seq .wfa-seq-empty{
  display:block; cursor:default; text-align:center;
  color:var(--muted); font-size:12px; background:var(--surface-2);
}
.refund-theme.workflowauthority-page .wfa-seq .wfa-seq-empty:hover{
  border-color:var(--line); background:var(--surface-2);
}

/* =====================================================================
   LC CONFIGURATION  (Views/LCConfiguration/LCConfiguration.cshtml
                      + Partial/_ConfigureLC.cshtml)
   ---------------------------------------------------------------------
   Builds the LC number for a stream: Auto vs Manual, the parts of the
   number, and a live preview.
   Toolbar, grid, .PaginationSec, .rt-filterrow, .frr-fld and .rt-select
   are ALL COMMON. What is below replaces a ~155-line page <style> in
   which FOUR rules were declared TWICE with conflicting values, so which
   one won depended on source order alone:
     .lc-mode-card.lc-mode-active  1px #337ab7 -> 2px #2d7ff9
     .lc-section-title             11px/1px    -> 12px/.04em
     .lc-preview-number            28px/700    -> 24px/600/monospace
     .lc-mode-desc                 standalone  -> nested
   Each is declared once here, on tokens.
   ===================================================================== */
/* the Auto / Manual choice: two cards on one row */
.refund-theme.lcconfig-page .lc-modes{
  display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-bottom:16px;
}
@media (max-width:767px){ .refund-theme.lcconfig-page .lc-modes{ grid-template-columns:1fr; } }
/* THE WHOLE CARD IS THE CLICK TARGET - it is a <label> wrapping its radio, which is what makes that work
   without any JS. The inline `cursor:pointer; display:flex; gap:10px; align-items:flex-start` that used to be
   on each one lives here instead. */
/* THE CARD IS A <label>, SO IT HAS TO OPT OUT OF THE LABEL TREATMENT.
   The theme sets `label{ font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.3px;
   color:var(--muted) }` for FIELD CAPTIONS, which is right for a caption and wrong for a label being used as
   a container: it rendered both cards entirely in small uppercase grey - "SYSTEM BUILDS THE NUMBER FROM
   PREFIX + YEAR + RUNNING COUNT" - which is unreadable as a sentence.
   Resetting on the card alone is not enough, because the children inherit `text-transform` and
   `letter-spacing`; the values below are re-stated on `.lc-mode-name` and `.lc-mode-desc` too.
   WORTH REMEMBERING: any time a <label> wraps content rather than captioning a field, expect this. */
.refund-theme.lcconfig-page .lc-mode-card{
  display:flex; align-items:flex-start; gap:10px; margin:0; cursor:pointer;
  padding:11px 13px; border:1px solid var(--line); border-radius:9px;
  background:var(--surface); transition:border-color .15s, background-color .15s;
  text-transform:none; letter-spacing:normal; font-weight:400; color:var(--ink);
}
.refund-theme.lcconfig-page .lc-mode-card:hover{ border-color:var(--brand); }
/* SELECTED: a 1px border plus an inset ring, NOT the 2px border the old rule used. A border that changes
   thickness on selection re-flows the card's content by a pixel, so the text visibly shifts when you pick it -
   which is why the second of the two duplicate rules also had to re-state `padding` to "compensate for
   thicker border". An inset shadow costs no layout. */
.refund-theme.lcconfig-page .lc-mode-card.lc-mode-active{
  border-color:var(--brand); background:var(--brand-light);
  box-shadow:inset 0 0 0 1px var(--brand);
}
.refund-theme.lcconfig-page .lc-mode-card input[type="radio"]{
  margin:3px 0 0; accent-color:var(--brand); cursor:pointer; flex:0 0 auto;
}
.refund-theme.lcconfig-page .lc-mode-body{ display:block; min-width:0; }
.refund-theme.lcconfig-page .lc-mode-name{
  display:flex; align-items:center; gap:7px;
  font-size:13px; font-weight:600; color:var(--ink);
  text-transform:none; letter-spacing:normal;
}
.refund-theme.lcconfig-page .lc-mode-card.lc-mode-active .lc-mode-name{ color:var(--brand-dark); }
.refund-theme.lcconfig-page .lc-mode-name .fa{ font-size:14px; color:var(--brand); }
.refund-theme.lcconfig-page .lc-mode-desc{
  display:block; margin-top:3px; font-size:11.5px; font-weight:400; line-height:1.5; color:var(--muted);
  text-transform:none; letter-spacing:normal;
}

/* ---- live preview ----
   Caption ABOVE the value. The old `.lc-preview-box` was a `justify-content:space-between` row, which put
   the caption and the number it labels at opposite ends of the card - as far apart as the box allowed. */
.refund-theme.lcconfig-page .lc-preview-box{
  margin:0 0 16px; padding:12px 16px; border-radius:9px;
  background:linear-gradient(180deg,var(--surface),var(--head-tint));
  border:1px solid var(--line); border-left:3px solid var(--brand);
}
.refund-theme.lcconfig-page .lc-section-title{
  font-size:10.5px; font-weight:700; letter-spacing:.5px; text-transform:uppercase; color:var(--muted);
}
/* monospace is deliberate: this is a generated code, and a fixed-width face keeps the digits from shuffling
   sideways every time the preview re-renders */
.refund-theme.lcconfig-page .lc-preview-number{
  display:block; margin-top:3px;
  font-family:Consolas,'Courier New',monospace; font-size:22px; font-weight:700;
  letter-spacing:1px; color:var(--brand-dark); word-break:break-all;
}

/* ---- the number's parts ---- */
.refund-theme.lcconfig-page .lc-fields{ padding:0; }
/* thirds, so the two rows line up with each other. `min-width:0` because `.frr-fld` ships
   `min-width:180px` and MIN-WIDTH BEATS WIDTH. */
/* (`.lc-fld` and `.lc-fld-spacer` both used the COMMON `.rt-fld-even` shape - the spacer is
   just an empty div carrying it, to hold the third slot open on the row that has only two
   fields so both rows line up. Only its disappearing act is page-specific.) */
@media (max-width:767px){
  .refund-theme.lcconfig-page .lc-fld-spacer{ display:none; }
}

/* ---- the two on/off settings ---- */
.refund-theme.lcconfig-page .lc-settings{
  margin-top:16px; padding-top:14px; border-top:1px solid var(--line);
  display:flex; flex-direction:column; gap:12px;
}
/* a setting row: description on the left, switch hard right. Was a `.component.input-container` (a FIELD
   wrapper) nudged into place with `margin-left:21px` inline. */
.refund-theme.lcconfig-page .lc-setting{
  display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:10px 13px; border:1px solid var(--line); border-radius:8px; background:var(--surface-2);
}
.refund-theme.lcconfig-page .lc-setting-text{ min-width:0; }
.refund-theme.lcconfig-page .lc-setting-title{
  margin:0; font-size:12.5px; font-weight:600; color:var(--ink);
}
.refund-theme.lcconfig-page .lc-setting-desc{
  margin:2px 0 0; font-size:11.5px; line-height:1.5; color:var(--muted);
}
/* the academic-year format dropdown belongs to the switch above it, so it is indented under it and sized to
   its content rather than stretching the full width of the panel */
.refund-theme.lcconfig-page .lc-yearfld{
  width:260px; max-width:100%; min-width:0; margin-left:13px;
}

/* ---- the hand-rolled toggle ----
   The MARKUP is kept exactly as found (a checkbox with a sibling `.lc-slider` span) so nothing about the
   binding changes; only the colours move onto tokens. It was #ccc off / #2d7ff9 on - a blue that appears
   nowhere else in the theme and would have collided head-on with the green accent preset. */
.refund-theme.lcconfig-page .lc-switch{
  position:relative; display:inline-block; width:38px; height:22px; margin:0; flex:0 0 auto;
}
.refund-theme.lcconfig-page .lc-switch input{
  position:absolute; opacity:0; width:100%; height:100%; margin:0; cursor:pointer; z-index:1;
}
.refund-theme.lcconfig-page .lc-slider{
  position:absolute; inset:0; cursor:pointer;
  background:var(--grip); border-radius:22px; transition:background .2s;
}
.refund-theme.lcconfig-page .lc-slider:before{
  content:""; position:absolute; left:3px; bottom:3px; width:16px; height:16px;
  background:#fff; border-radius:50%; transition:transform .2s;
}
.refund-theme.lcconfig-page .lc-switch input:checked + .lc-slider{ background:var(--brand); }
.refund-theme.lcconfig-page .lc-switch input:checked + .lc-slider:before{ transform:translateX(16px); }
.refund-theme.lcconfig-page .lc-switch input:focus-visible + .lc-slider{
  box-shadow:0 0 0 2px var(--brand-light);
}
/* a disabled year dropdown reads as disabled; the switch that controls it stays live */
.refund-theme.lcconfig-page .lc-yearfld .select2-container--disabled .select2-selection--single{
  background:var(--locked-bg) !important; cursor:not-allowed;
}

/* =====================================================================
   TC TEMPLATE MAPPING  (Views/TCTemplateMapping/TCTemplateMapping.cshtml)
   ---------------------------------------------------------------------
   Tick a class, pick its TC template, Save. The toolbar, grid, dropdown
   and buttons are ALL COMMON - the three rules below are the whole page
   block, because there was no page <style> to unpick in the first place.
   ===================================================================== */
/* the class name is the row's subject, so it reads as a name rather than as data. Was
   `style="font-weight:600"` inline on every cell. */
.refund-theme.tctemplatemap-page .tcm-class{ font-weight:600; color:var(--ink); }
/* the tick box: the theme accent and a real hit area, instead of the browser default */
.refund-theme.tctemplatemap-page .tcm-table input[type="checkbox"]{
  width:15px; height:15px; margin:0; accent-color:var(--brand); cursor:pointer;
}
/* the dropdown fills its cell - the cell's width is set on the <th>, so the control should not also try to
   size itself. `.select2-container` is already `width:100% !important` commonly; this keeps the cell from
   collapsing around a long template name. */
.refund-theme.tctemplatemap-page .tcm-table td .select2-container{ min-width:220px; }

/* =====================================================================
   CHANGE PASSWORD  (Views/Common/ChangePassword.cshtml)
   ---------------------------------------------------------------------
   Moved out of a page <style> block. The rules already used tokens, so
   nothing about them changed - but they belong here, because two sibling
   screens need the same password checklist:
     Views/Security/ResetPassword.cshtml
     Views/StudentRegistration/StudentLoginCredential.cshtml
   Both currently hand-roll it. Point them at these classes when they are
   converted and the checklist exists once.

   THE `glyphicon-ok` / `glyphicon-remove` SELECTORS ARE A CONTRACT, not a
   styling choice: changepassword.js toggles those two Bootstrap classes on
   each rule's <span> as the user types. Colour has to be keyed off them.
   ===================================================================== */
/* two columns: the fields, then the checklist beside them. `auto-fit` with a
   360px floor means it collapses to one column on a narrow window without a
   media query. */
/* `min(360px, 100%)` rather than a bare 360px floor. minmax(360px,1fr) makes each
   column AT LEAST 360px even when the viewport is narrower - on a 360px phone the
   column then exceeds the padded container and the whole page scrolls sideways.
   Wrapping the floor in min() lets it shrink to the container on small screens while
   behaving exactly as before on anything wider. */
.refund-theme.changepassword-page .cp-grid{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(min(360px, 100%), 1fr)); gap:0 24px;
}
.refund-theme.changepassword-page .cp-col{ min-width:0; }

/* ---- the requirements checklist ---- */
.refund-theme.changepassword-page .cp-rules{
  border:1px solid var(--line); border-radius:8px; background:var(--surface-2); padding:12px 14px;
}
.refund-theme.changepassword-page .cp-rules-title{
  font-size:11.5px; font-weight:600; text-transform:uppercase; letter-spacing:.3px;
  color:var(--muted); margin-bottom:8px;
}
.refund-theme.changepassword-page .cp-rule{
  display:flex; align-items:center; gap:8px; font-size:12.5px; color:var(--ink); padding:3px 0;
}
.refund-theme.changepassword-page .cp-rule .glyphicon{ font-size:12px; flex:0 0 auto; }
/* met / not met. The tick is green and the cross is red because these are pass and
   fail, not two neutral states - this is one of the few places colour carries the
   whole meaning. */
.refund-theme.changepassword-page .cp-rule .glyphicon-ok{ color:var(--ok); }
.refund-theme.changepassword-page .cp-rule .glyphicon-remove{ color:var(--no); }

/* ---- the show/hide eye, INSIDE the field ----
   The old rule was `float:right; margin-top:-28px; margin-right:10px` - a negative
   margin dragging the icon back up over the input it had already been laid out
   below. Absolute inside `.field-set` puts it where it belongs and keeps it there
   at any field height.
   `padding-right` on the input is what stops a 20-character password running
   underneath the icon. */
.refund-theme.changepassword-page .field-set{ position:relative; }
.refund-theme.changepassword-page .field-set .form-control{ padding-right:34px; }
.refund-theme.changepassword-page .cp-eye{
  position:absolute; top:50%; right:10px; transform:translateY(-50%);
  color:var(--muted); cursor:pointer; font-size:13px; line-height:1; z-index:2;
}
.refund-theme.changepassword-page .cp-eye:hover{ color:var(--brand); }

/* the validation message moved out of the <label> and under the field; hide the
   wrapper when the server rendered nothing, or every field carries a blank line */
.refund-theme.changepassword-page .rt-fieldnote-err:empty{ display:none; }
.refund-theme.changepassword-page .rt-fieldnote-err{ color:var(--no); }
/* MVC emits its own span inside ours, so the colour has to reach the child too */
.refund-theme.changepassword-page .rt-fieldnote-err .field-validation-error,
.refund-theme.changepassword-page .rt-fieldnote-err span{ color:var(--no); }

/* =====================================================================
   CHANGE PASSWORD - MOBILE
   Every rule is scoped to `.changepassword-page`, so nothing here can reach
   the other Refund screens that share .box-header / .frr-toolbar / .rt-btn.
   The page-scoped-wrapper rule from CLAUDE.md, applied to a breakpoint.
   ===================================================================== */
@media (max-width: 767px){

  /* Reclaim horizontal space. The desktop rhythm (16px box-body + the theme's
     row/col padding) costs ~60px of a 360px screen, which is a sixth of the
     width of every input on the page. */
  .refund-theme.changepassword-page .box-body{ padding:14px 12px; }
  .refund-theme.changepassword-page .box-header{ padding:10px 0; }
  .refund-theme.changepassword-page .frr-toolbar{ padding:2px 12px 10px; }

  /* Title and Back stack instead of being squeezed onto one line; Back moves
     left so it is under the thumb rather than in the far corner. */
  .refund-theme.changepassword-page .frr-toolbar{
    flex-direction:column; align-items:flex-start; gap:8px;
  }
  .refund-theme.changepassword-page .frr-tb-actions{ width:100%; }
  .refund-theme.changepassword-page .frr-tb-actions .rt-btn{ width:auto; }

  /* Single column, and the checklist gets air above it now that it sits BELOW
     the fields rather than beside them. */
  .refund-theme.changepassword-page .cp-grid{ grid-template-columns:1fr; gap:0; }
  .refund-theme.changepassword-page .cp-rules{ margin-top:4px; }

  /* 16px is not a cosmetic choice: iOS Safari ZOOMS THE PAGE IN when a focused
     input's font-size is below 16px, and it does not zoom back out on blur. The
     user is left on a magnified, sideways-scrolling form mid-password-entry.
     Also taller touch targets - 34px is comfortable with a mouse, not a thumb. */
  .refund-theme.changepassword-page .field-set .form-control{
    font-size:16px; height:44px; padding-right:40px;
  }
  .refund-theme.changepassword-page .cp-eye{ right:12px; font-size:15px; }

  /* Full-width primary action - the standard mobile form pattern, and it stops
     the button sitting alone against one edge. */
  .refund-theme.changepassword-page .rt-btn-primary{ width:100%; justify-content:center; }

  /* Long rule text ("One special character (!@#$%^&*,._)") wraps rather than
     forcing the panel wider than the screen. */
  .refund-theme.changepassword-page .cp-rule{
    align-items:flex-start; font-size:13px; line-height:1.45;
  }
  .refund-theme.changepassword-page .cp-rule .glyphicon{ margin-top:2px; }

  /* Belt and braces against sideways scroll: nothing on this page may exceed
     the viewport, whatever a shared rule elsewhere tries to set. */
  .refund-theme.changepassword-page{ overflow-x:hidden; }
  .refund-theme.changepassword-page .row{ margin-left:0; margin-right:0; }
  .refund-theme.changepassword-page .col-lg-12{ padding-left:0; padding-right:0; }
}

/* =====================================================================
   ACCOUNT CONFIGURATION  (Views/Security/AccountSetting.cshtml)
   ---------------------------------------------------------------------
   Three setting rows. The rows themselves are the COMMON `.rt-settingrow`
   (promoted from this page's `.custom-big-box` - see that block), and the
   toolbar, buttons and status pill are common too. What is left here is
   the two status colours and the theme-swatch column.
   Replaces a 100-line page <style> in which `.custom-big-box` was declared
   THREE times with conflicting values and three of its rules
   (`.status-badge`, `.status-badge.active`, `.status-badge.inactive`)
   styled elements that do not exist on the page.
   ===================================================================== */
/* the 2FA state. Green/red is right here, unlike the neutral Sequence/Anyone pills
   elsewhere: enabled is genuinely better than disabled for a security setting. */
/* (`.st-as-on` / `.st-as-off` deleted - duplicates of `.rt-st-ok` / `.rt-st-no`) */

/* the current theme name, echoed back. `capitalize` because the server sends the
   palette keys lower-case ("plum", "teal") and they read as labels here. */
.refund-theme.accountsetting-page .as-current{ text-transform:capitalize; color:var(--ink); }
.refund-theme.accountsetting-page .as-err{ color:var(--no); }

/* the swatch column stacks: the row of colours, then Reset under it, both right-aligned
   to match the buttons in the two rows above. Was `style="display:block;text-align:right"`
   plus an inline `margin-top:10px` on the button. */
.refund-theme.accountsetting-page .as-themeaction{
  flex-direction:column; align-items:flex-end; gap:10px;
}
.refund-theme.accountsetting-page .as-themeaction .thm-swatches{ justify-content:flex-end; }
.refund-theme.accountsetting-page .as-reset{ margin:0; }

/* ---------------------------------------------------------------------
   ACCOUNT SETTING - MOBILE  (added 10-08-2026)

   Every rule is scoped to `.accountsetting-page`. `.rt-settingrow` is a SHARED
   component - the Two-Factor Setup screen uses the same markup - so retuning it
   directly would silently restyle that page too. This is the page-scoped-wrapper
   rule from CLAUDE.md applied to a breakpoint.

   The desktop row is "label left, control right". Below 768px there is not enough
   width for two columns, so it becomes "label above, control below, both full
   width and left-aligned" - right-aligned controls on a narrow screen sit under
   the thumb's blind spot and read as detached from the label they belong to.
   --------------------------------------------------------------------- */
@media (max-width: 767px){

  /* reclaim the horizontal space the desktop padding costs on a 360px screen */
  .refund-theme.accountsetting-page .box-body{ padding:12px; }
  .refund-theme.accountsetting-page .box-header{ padding:10px 12px; }

  .refund-theme.accountsetting-page .rt-settingrow{
    flex-direction:column; align-items:stretch; gap:12px; padding:14px 12px;
  }
  /* `flex:1 1 320px` demands 320px before it will shrink, which overflows a 360px
     screen once padding is counted. auto lets it use whatever is actually there. */
  .refund-theme.accountsetting-page .rt-settingrow-text{ flex:1 1 auto; }

  .refund-theme.accountsetting-page .rt-settingrow-action{
    width:100%; justify-content:flex-start;
  }
  /* full-width primary action - the standard mobile form pattern, and it stops the
     button sitting alone against one edge */
  .refund-theme.accountsetting-page .rt-settingrow-action .rt-btn{
    width:100%; justify-content:center;
  }

  /* the status sentence was right-aligned and capped at 260px to sit beside the
     label; stacked, it reads as ordinary left-aligned text */
  .refund-theme.accountsetting-page .rt-settingrow-note{
    max-width:none; text-align:left;
  }

  /* swatches + Reset stack left rather than right, matching everything else */
  .refund-theme.accountsetting-page .as-themeaction{
    flex-direction:column; align-items:stretch; gap:12px;
  }
  .refund-theme.accountsetting-page .as-themeaction .thm-swatches{
    justify-content:flex-start; flex-wrap:wrap;
  }

  /* nothing on this page may exceed the viewport */
  .refund-theme.accountsetting-page .row{ margin-left:0; margin-right:0; }
  .refund-theme.accountsetting-page .col-lg-12{ padding-left:0; padding-right:0; }
}

/* =====================================================================
   TWO-FACTOR AUTHENTICATION SETUP  (Views/Security/Setup.cshtml)
   ---------------------------------------------------------------------
   Reached from the Account Setting row above, so it uses the SAME
   components: `.rt-settingrow` for the toggle row and the same
   `.frr-status` + `.rt-st-ok`/`.rt-st-no` pill the outer page shows, so
   the state reads identically on both screens.
   Replaces a 125-line page <style> block in which EVERY SINGLE RULE was
   dead: `.columns`, `.columns > .editor`, `.columns > .Tagss`,
   `#TagsList`, `.Tags`, `.Tags .u-photo`, `#editor1`, `#editor1 .h-card`,
   `.select2-container--disabled`, `.redBackColor .cke_contents`,
   `.note-title`, `.action-buttons` - not one of those classes or ids
   appears anywhere in the markup. It was a CKEditor/tag-picker/grid
   stylesheet pasted onto a screen that has one switch and one password
   box.
   ===================================================================== */
/* password on the left, the "what Save will do" callout on the right; the 360px
   floor collapses it to one column on a narrow window with no media query
   (same grid as `.cp-grid` on Change Password) */
.refund-theme.setup2fa-page .s2f-grid{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(360px, 1fr)); gap:0 24px;
  margin-top:16px;
}
.refund-theme.setup2fa-page .s2f-col{ min-width:0; }

/* the switch is the row's only control, so let it sit on its own without the
   inline `margin-left:13px` the old markup used to nudge it */
.refund-theme.setup2fa-page .rt-settingrow-action .switch{ margin:0; }

/* (`.s2f-pending` removed - the "Not saved yet, your account is currently X" line it
   styled is gone. The flag reports the DATABASE field again, so it already says what
   the account's state is and that line only repeated it.) */


/* =====================================================================
   EDGE'S BUILT-IN PASSWORD REVEAL BUTTON  (added 10-08-2026)
   ---------------------------------------------------------------------
   Edge (and IE) inject their own eye control into every <input type="password">
   via the ::-ms-reveal pseudo-element. Chrome and Firefox do not, which is why
   this only ever appeared in Edge: the user sees TWO eyes side by side - ours
   and the browser's - and they toggle independently, so the field can end up
   visibly out of step with the icon the user just clicked.

   Every password field in this app already ships its own show/hide control
   (.cp-eye / .field-icon / .fp-eye / .toggle-password), so the browser's copy is
   pure duplication.

   *** THIS RULE IS DELIBERATELY NOT SCOPED UNDER .refund-theme. ***
   That breaks this file's own rule, and it is the one place it is justified:
     - the Set-a-New-Password screen (RequirePasswordChange) is NOT inside a
       .refund-theme element, so a scoped rule would miss the very screen in the
       report;
     - the alternative is copying the same three lines into five pages, which
       drifts the moment a sixth password screen is added;
     - it can only ever hide a browser-injected control on type="password", so
       it cannot affect the layout, colour or behaviour of any existing page.

   ::-ms-clear is included for the same reason: Edge adds an X to text inputs
   inside forms, and it collides with our own trailing icons.
   ===================================================================== */
input[type="password"]::-ms-reveal,
input[type="password"]::-ms-clear {
    display: none;
    width: 0;
    height: 0;
}

/* =====================================================================
   BULK FINAL GR ALLOCATION  (Views/BulkFinalGRAllocation/Index.cshtml)
   ---------------------------------------------------------------------
   Student Section > GR Management. Spec:
   SCL_Campus_Bulk_Final_GR_Allocation_Developer_Specification_2026-08-21.pdf

   Tokens only, no literal colours, and no `theme-*` class on the page root -
   so the screen follows whatever accent _Layout puts on <body>. The supplied
   mock-up is blue; this renders in the school's own accent instead, which is
   the point of the token system.

   The layout is CSS grid with auto-fit tracks throughout, so the four summary
   cards and the four step cards reflow from 4-up to 2-up to 1-up on their own.
   The mock-up's fixed 4-across strips would have overflowed a laptop at the
   sidebar widths this app actually runs at.
   ===================================================================== */

/* ---- preview banner. Loud on purpose: it means "not connected to the DB". ---- */
.refund-theme.bulkgr-page .bg-preview{
  display:flex; align-items:center; gap:8px; margin:0 0 12px;
  border:1px solid var(--warn, #e0a800); border-left:3px solid var(--warn, #e0a800);
  border-radius:6px; background:var(--warn-bg, #fff8e6);
  padding:9px 12px; font-size:12.5px; font-weight:600; color:var(--ink);
}

/* ---- criteria row ---- */
.refund-theme.bulkgr-page .bg-criteria{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(min(210px, 100%), 1fr));
  gap:12px 16px; align-items:end;
}
.refund-theme.bulkgr-page .bg-label{
  display:block; font-size:11.5px; font-weight:600; text-transform:none; letter-spacing:0;
  color:var(--muted); margin:0 0 5px;
}
.refund-theme.bulkgr-page .bg-req{ color:var(--no, #d64545); }
.refund-theme.bulkgr-page .bg-field-actions{ display:flex; gap:8px; align-items:center; }

.refund-theme.bulkgr-page .bg-note{
  margin:14px 0 0; padding:8px 12px; font-size:12px; color:var(--ink);
  border:1px solid var(--line); border-left:3px solid var(--brand);
  border-radius:6px; background:var(--surface-2);
}
/*  `.bg-note` inside a card, sitting under the figures rather than under the toolbar: tighter type
    and no top margin fighting the <dl>'s own bottom spacing.
    NOTE THIS IS NOT display:flex - the icon and text are ordinary inline content here, so the icon
    just needs a right margin. Making it a flex row is what turned .rt-callout and .apv-modal-note
    into ragged columns elsewhere today; there is no reason to repeat it for two inline elements. */
.refund-theme.bulkgr-page .bg-card-note{
  margin:10px 0 0; padding:8px 10px; font-size:11.5px; line-height:1.5;
}
.refund-theme.bulkgr-page .bg-card-note i{ color:var(--brand); margin-right:5px; }

/* ---- the four summary cards ---- */
.refund-theme.bulkgr-page .bg-summary{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(min(240px, 100%), 1fr));
  gap:14px; margin:14px 0;
}
.refund-theme.bulkgr-page .bg-card{
  border:1px solid var(--line); border-radius:8px; background:var(--surface); overflow:hidden;
}
.refund-theme.bulkgr-page .bg-card-head{
  display:flex; align-items:center; gap:7px;
  padding:9px 14px; border-bottom:1px solid var(--line); background:var(--surface-2);
  font-size:11.5px; font-weight:600; text-transform:uppercase; letter-spacing:.3px; color:var(--brand);
}
.refund-theme.bulkgr-page .bg-card-body{ padding:12px 14px; }
.refund-theme.bulkgr-page .bg-card-foot{
  margin-top:8px; font-size:11px; color:var(--muted); line-height:1.5;
}

/* label/value pairs - a 2-column grid so every value shares one left edge */
.refund-theme.bulkgr-page .bg-dl{
  display:grid; grid-template-columns:auto 1fr; gap:6px 12px; margin:0;
}
.refund-theme.bulkgr-page .bg-dl dt{
  font-size:12px; font-weight:400; color:var(--muted); white-space:nowrap;
}
.refund-theme.bulkgr-page .bg-dl dd{
  margin:0; font-size:12.5px; font-weight:600; color:var(--ink); word-break:break-all;
}

/* the Expected Students count - the one number the user is looking for */
.refund-theme.bulkgr-page .bg-card-count .bg-card-body{ text-align:center; }
.refund-theme.bulkgr-page .bg-bignum{
  font-size:34px; font-weight:700; line-height:1.1; color:var(--brand); letter-spacing:-.5px;
}
.refund-theme.bulkgr-page .bg-card-info .bg-ul{
  margin:0; padding-left:16px; font-size:11.5px; color:var(--ink); line-height:1.7;
}

/* ---- the four steps ---- */
.refund-theme.bulkgr-page .bg-steps{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(min(250px, 100%), 1fr));
  gap:14px; margin:14px 0;
}
.refund-theme.bulkgr-page .bg-step{
  border:1px solid var(--line); border-radius:8px; background:var(--surface);
  display:flex; flex-direction:column;
}
.refund-theme.bulkgr-page .bg-step-head{
  display:flex; align-items:center; gap:8px; padding:10px 14px;
  border-bottom:1px solid var(--line);
  font-size:12.5px; font-weight:600; color:var(--ink);
}
.refund-theme.bulkgr-page .bg-step-no{
  flex:0 0 auto; display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:22px; border-radius:50%;
  background:var(--brand); color:#fff; font-size:11.5px; font-weight:700;
}
.refund-theme.bulkgr-page .bg-step-body{ padding:12px 14px; }
.refund-theme.bulkgr-page .bg-step-help{
  margin:0 0 10px; font-size:11.5px; color:var(--muted); line-height:1.6;
}
/*  A step that is not available yet reads as disabled rather than broken - dimmed, with a muted
    number instead of the brand one, so the eye skips it. It still occupies its place in the sequence
    because the four steps are the instructions; hiding one would leave a gap in the numbering. */
.refund-theme.bulkgr-page .bg-step-pending{ background:var(--surface-2); border-style:dashed; }
.refund-theme.bulkgr-page .bg-step-pending .bg-step-head{ color:var(--muted); }
.refund-theme.bulkgr-page .bg-step-pending .bg-step-no{ background:var(--muted); }

/*  The optional date-check tick box. Sits under the file picker, so it reads as an option ON the
    upload rather than as another field of the search. */
.refund-theme.bulkgr-page .bg-check{
  display:flex; align-items:flex-start; gap:7px; margin:10px 0 0;
  font-size:11.5px; font-weight:400; color:var(--muted); line-height:1.5;
  text-transform:none; letter-spacing:0; cursor:pointer;
}
.refund-theme.bulkgr-page .bg-check input{ margin:2px 0 0; flex:0 0 auto; }

/* ---- THE FILE PICKER / DROP ZONE ----
   A native <input type=file> is drawn by the browser: the button cannot be styled, its label is
   whatever the OS calls it, and the chosen filename renders in the browser's own font at its own
   width. Next to themed controls it reads as an unfinished screen. So the input is kept in the DOM
   (form, keyboard and assistive tech all still work) but made invisible, and a <label> wrapping the
   zone becomes the visible control - clicking a label natively opens the picker.

   NOT display:none / visibility:hidden on the input: hidden that way it leaves the tab order in some
   browsers, and Upload becomes unreachable by keyboard. Positioned off with opacity:0 instead, which
   keeps it focusable, and `:focus-within` below paints the ring on the zone so the focus is visible.

   All colours are tokens - the whole component follows the school's accent with no extra work. */
.refund-theme.bulkgr-page .bg-drop{
  position:relative; border:1.5px dashed var(--line); border-radius:8px;
  background:#fff; transition:border-color .15s, background-color .15s;
}
.refund-theme.bulkgr-page .bg-drop:hover{ border-color:var(--brand); background:var(--brand-light); }
.refund-theme.bulkgr-page .bg-drop:focus-within{
  border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-light);
}
/* dragging a file over the zone - solid border says "let go here" */
.refund-theme.bulkgr-page .bg-drop.is-drag{
  border-style:solid; border-color:var(--brand); background:var(--brand-light);
}
/* the two result states, so the card itself carries the outcome and not only the message below it */
.refund-theme.bulkgr-page .bg-drop.is-bad{ border-style:solid; border-color:var(--no, #d64545); background:var(--no-bg, #fdeaea); }
.refund-theme.bulkgr-page .bg-drop.is-ok{ border-style:solid; border-color:var(--ok, #2e7d32); background:var(--ok-bg, #e4f6ef); }

.refund-theme.bulkgr-page .bg-drop-input{
  position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;
}

/* empty state: icon, invitation, constraint */
/* `text-transform:none; letter-spacing:normal` ARE REQUIRED, not tidying. Both of these are <label>
   elements, and the theme uppercases and letter-spaces form labels - so the invitation rendered as
   "DRAG THE FILLED SHEET HERE, OR BROWSE", which reads as a heading rather than an instruction.
   `.bg-check` above carries the same reset for the same reason. */
.refund-theme.bulkgr-page .bg-drop-inner{
  display:flex; flex-direction:column; align-items:center; gap:3px;
  padding:16px 12px; margin:0; cursor:pointer; font-weight:400; text-align:center;
  text-transform:none; letter-spacing:normal;
}
.refund-theme.bulkgr-page .bg-drop-ico{ font-size:22px; color:var(--brand); line-height:1; margin-bottom:2px; }
.refund-theme.bulkgr-page .bg-drop-main{ font-size:12px; color:var(--ink); }
.refund-theme.bulkgr-page .bg-browse{
  color:var(--brand); font-weight:600; text-decoration:underline;
}
.refund-theme.bulkgr-page .bg-drop-sub{ font-size:11px; color:var(--muted); }

/* chosen state: the file chip */
.refund-theme.bulkgr-page .bg-fileinfo{
  display:flex; align-items:center; gap:9px; padding:10px 11px;
}
.refund-theme.bulkgr-page .bg-fileinfo-ico{ font-size:17px; color:var(--brand); flex:0 0 auto; }
.refund-theme.bulkgr-page .bg-drop.is-bad .bg-fileinfo-ico{ color:var(--no, #d64545); }
.refund-theme.bulkgr-page .bg-drop.is-ok  .bg-fileinfo-ico{ color:var(--ok, #2e7d32); }

/* min-width:0 is what lets the ellipsis work: a flex item defaults to min-width:auto and refuses to
   shrink below its content, so a long filename would push Change and Remove out of the card. */
.refund-theme.bulkgr-page .bg-fileinfo-text{ flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:1px; }
.refund-theme.bulkgr-page .bg-fileinfo-name{
  font-size:12px; font-weight:600; color:var(--ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.refund-theme.bulkgr-page .bg-fileinfo-meta{ font-size:11px; color:var(--muted); }

.refund-theme.bulkgr-page .bg-filechange{
  flex:0 0 auto; margin:0; padding:3px 9px; font-size:11px; font-weight:600; cursor:pointer;
  color:var(--brand); background:#fff; border:1px solid var(--line); border-radius:5px;
  text-transform:none; letter-spacing:normal;   /* a <label> too - see the note above */
}
.refund-theme.bulkgr-page .bg-filechange:hover{ border-color:var(--brand); background:var(--brand-light); }
.refund-theme.bulkgr-page .bg-fileclear{
  flex:0 0 auto; width:24px; height:24px; padding:0; line-height:1;
  color:var(--muted); background:transparent; border:1px solid var(--line); border-radius:5px; cursor:pointer;
}
.refund-theme.bulkgr-page .bg-fileclear:hover{ color:var(--no, #d64545); border-color:var(--no, #d64545); }

/* ---- inline states ---- */
.refund-theme.bulkgr-page .bg-warn{
  margin:6px 0 0; padding:7px 10px; border-radius:6px; font-size:11.5px; line-height:1.5;
  border:1px solid var(--no, #d64545); background:var(--no-bg, #fdeaea); color:var(--ink);
}
.refund-theme.bulkgr-page .bg-ok{
  margin:6px 0 0; padding:7px 10px; border-radius:6px; font-size:11.5px;
  border:1px solid var(--ok, #2e7d32); background:var(--ok-bg, #e4f6ef); color:var(--ink);
}
/* a view-only user must be told WHY the button is absent, not just shown a gap */
.refund-theme.bulkgr-page .bg-noright{
  font-size:11.5px; color:var(--muted); font-style:italic;
}

/* ---- error grid ---- */
.refund-theme.bulkgr-page .bg-err-title{ color:var(--no, #d64545); }
.refund-theme.bulkgr-page .bg-errtable td.bg-errmsg{
  color:var(--no, #d64545); font-weight:600; white-space:normal; min-width:200px;
}
/*  Several problems on one row: a numbered list, not a paragraph.
    padding-left carries the numbers - a browser's default `padding-left:40px` on <ol> would indent the
    whole cell and shove the text off the column; 16px is enough for "1." at this size.
    The bottom margin is zeroed because the <ol> is the last thing in a table cell and its default
    margin makes bad rows measurably taller than clean ones, which reads as a layout fault. */
.refund-theme.bulkgr-page .bg-errtable td.bg-errmsg .bg-errlist{
  margin:0; padding-left:16px; list-style:decimal;
}
.refund-theme.bulkgr-page .bg-errtable td.bg-errmsg .bg-errlist li{
  margin:0 0 2px; line-height:1.45;
}
.refund-theme.bulkgr-page .bg-errtable td.bg-errmsg .bg-errlist li:last-child{ margin-bottom:0; }
.refund-theme.bulkgr-page .bg-badval{ color:var(--muted); font-style:italic; }

/*  A failing row in the review grid. Tinted rather than red-texted: the whole line is the thing that
    needs attention, and the message is already coloured. Left border because a tint alone is easy to
    miss on a striped table, and a tick in the last column so a good row reads as checked rather than
    merely unremarkable - the grid shows all rows, so "no message" has to mean something. */
.refund-theme.bulkgr-page .bg-rowbad > td{ background:var(--no-bg, #fdeaea); }
.refund-theme.bulkgr-page .bg-rowbad > td:first-child{ box-shadow:inset 3px 0 0 var(--no, #d64545); }
.refund-theme.bulkgr-page .bg-rowok{ color:var(--ok, #2e7d32); }
.refund-theme.bulkgr-page .bg-errfoot{
  margin-top:10px; font-size:12px; color:var(--ink);
}
.refund-theme.bulkgr-page .bg-fmttable td{ font-size:12px; }

@media (max-width:767px){
  .refund-theme.bulkgr-page .bg-criteria{ grid-template-columns:1fr; }
  .refund-theme.bulkgr-page .bg-field-actions{ justify-content:flex-start; }
}

/* =====================================================================
   UNIQUE ID SETUP  (Views/Uniqueidsetupdetails/Uniqueidsetupdetails.cshtml)
   ---------------------------------------------------------------------
   Themed 21-08-2026. The page keeps NewFormCSS's floating-label inputs -
   RefundTheme has no equivalent component and stripping it would remove
   the label from every box - so this only restyles what sits AROUND
   them: the section headings, the drag chips and the preview line.

   ACCENT-AGNOSTIC ON PURPOSE. No colour is written here; everything is
   var(--brand)/var(--ink)/var(--line), which _Layout resolves on <body>.
   Change the school's accent and this page follows, with no edit here.
   That is the whole point of the tokens - and why the page root carries
   `refund-theme` but NOT a `theme-*` class, which would override the
   layout's choice (the defect that left ChangePassword blue in a plum app).
   ===================================================================== */

/* ---------------------------------------------------------------------
   A LABEL-LEFT / CONTROL-RIGHT SETTINGS FORM, which is what this screen
   always was underneath. The old markup was a stack of Bootstrap `.row`s
   with hand-picked `col-sm-*` offsets, so nothing lined up: Start From
   floated under an empty column, each preview button landed on its own
   line below its field, and the two academic-year chips sat in dead space
   on the right of the page with no label saying what they were for.

   A grid instead of offsets means one column edge for every label and one
   for every control, at any width, with no media query for the desktop
   case and a single-column stack below 768px.
   --------------------------------------------------------------------- */
/*  BREATHING ROOM INSIDE THE CARD - added to the FORM, not to .box-body.
    The shared 16px is tuned for grids, which sit full-bleed against the card
    edge on purpose; a form reads badly that tight, with the step badge and the
    first heading almost touching the border.

    A page-scoped `.refund-theme.uniqueid-page .box-body{padding:...}` was tried
    first and LOST, which is worth recording: `.refund-theme .box-body` carries
    padding:16px **!important**, and !important beats specificity. The options
    were another !important - escalating a fight inside the shared theme over one
    form - or putting the space where it belongs, on this page's own form
    element. Total left inset is now 16px from the card plus 8px here. */
.refund-theme.uniqueid-page #GRSetupForm{ padding:6px 8px 2px; }

.refund-theme.uniqueid-page .uid-section{ padding:0 0 6px; }
.refund-theme.uniqueid-page .uid-section + .uid-section{
  border-top:1px solid var(--line); margin-top:6px; padding-top:16px;
}
.refund-theme.uniqueid-page .uid-sectionhead{
  display:flex; align-items:center; gap:8px;
  font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:.4px;
  color:var(--muted); margin:0 0 8px;
}
/* the step number. NewFormCSS rendered this from a CSS counter that never
   incremented, so BOTH sections were numbered "1". Written in the markup
   instead - two sections do not justify a counter, and a wrong number is
   worse than none. */
.refund-theme.uniqueid-page .uid-step{
  display:inline-flex; align-items:center; justify-content:center;
  width:20px; height:20px; border-radius:50%;
  background:var(--brand); color:#fff; font-size:11px; font-weight:700;
}

/*  ONE LEFT EDGE FOR THE WHOLE SECTION.
    The step badge is 20px + an 8px gap, so it pushed the heading TEXT 28px right
    of every field label underneath it - two competing left edges, which is what
    read as "not aligned". The badge now sits in a 28px gutter and the rows are
    indented to match, so the heading text and every label below share one edge
    and the numbers line up down the side of the card. */
.refund-theme.uniqueid-page .uid-row{
  display:grid; grid-template-columns:minmax(180px, 250px) 1fr;
  gap:6px 20px; align-items:start; padding:9px 0 9px 28px;
}
/*  padding-top centres the label's FIRST LINE against the control. Measured, not
    guessed: the pills come out 32px tall and the label's line-height is 18.57px,
    so (32 - 18.57) / 2 = 7px. `align-items:center` would have centred the whole
    label BLOCK instead, which drops the control halfway down a three-line help
    text - wrong for every row that has help, i.e. all of them. */
.refund-theme.uniqueid-page .uid-label{ font-size:13px; font-weight:600; color:var(--ink); padding-top:7px; }
/* Every control gets one line of plain-language help. This screen decides the
   format of every student number the school will ever issue, and it did not
   explain a single field - including two dragging targets. */
.refund-theme.uniqueid-page .uid-help{
  display:block; font-weight:400; font-size:11.5px; color:var(--muted);
  margin-top:2px; line-height:1.5;
}
/*  ---- the two states of the "Restart each year" note ----
    `flex-basis:100%` is what puts them on their own line. `.uid-control` is a
    `display:flex; flex-wrap:wrap` row, so a plain `display:block` child does NOT
    break the line - it becomes another column beside the checkbox and squeezes it.
    Full basis forces the wrap. Same trap as `.rt-callout`, one more time.
    `margin-top:6px` clears the checkbox rather than the 2px used when this class
    sits under a label. */
.refund-theme.uniqueid-page .uid-control .uid-note-ok,
.refund-theme.uniqueid-page .uid-control .uid-note-warn{
  flex:0 0 100%; margin-top:6px; max-width:640px;
}
/*  The warning is a WARNING - it is on screen only while the setting is actively
    doing harm - so it gets the tinted box that makes it unskippable. The ok state
    is a confirmation and stays muted body text: it must not compete with it. */
.refund-theme.uniqueid-page .uid-control .uid-note-warn{
  display:flex; gap:7px; align-items:flex-start;
  padding:8px 10px; border-radius:5px;
  background:var(--warn-bg); border:1px solid var(--warn-border); color:var(--ink);
}
.refund-theme.uniqueid-page .uid-control .uid-note-warn .fa{
  color:var(--warn); font-size:12px; margin-top:1px; flex:0 0 auto;
}
.refund-theme.uniqueid-page .uid-control .uid-note-warn b{ color:var(--ink); font-weight:600; }
.refund-theme.uniqueid-page .uid-control{
  display:flex; flex-wrap:wrap; align-items:center; gap:8px; min-width:0;
}

/* ---- choice pills (Auto/Manual, Prefix/Postfix) ----
   The inputs stay real radios and checkboxes with their original ids: the
   page's inline jQuery binds on `input[type="radio"]` / `input[type="checkbox"]`
   and reads #rdAuto / #rdManual / #rdPreFix / #rdPostFix by id, so swapping the
   element type would silently break the enable/disable logic. Only the wrapper
   is styled. */
.refund-theme.uniqueid-page .uid-opt{
  display:inline-flex; align-items:center; gap:7px; margin:0;
  border:1px solid var(--line); border-radius:6px; background:var(--surface);
  padding:6px 12px; font-size:12.5px; font-weight:600; color:var(--ink);
  cursor:pointer; transition:border-color .12s, background .12s;
  /* a global rule uppercases <label>, which turned these into AUTO / MANUAL /
     RESTART EACH YEAR - shouting, and it made the longest one hard to read.
     Overridden here only, so nothing else on the page changes case. */
  text-transform:none; letter-spacing:0;
}
.refund-theme.uniqueid-page .uid-opt:hover{ border-color:var(--brand); }
.refund-theme.uniqueid-page .uid-opt input{ margin:0; }

/* THE PILLS STAY PLAIN - no fill on the selected one.
   A filled pill was tried and removed: with the tick, the fill, the field border
   and the IN USE label all saying the same thing, the row had four competing
   emphases and the two pills became the loudest thing on the page. The tick is
   what says which box is ticked; WHICH FIELD IS LIVE is answered once, on the
   field itself (`.uid-field.is-on` below) and its IN USE label. */

/* ---- a text box with the "UniqueId No." tag attached ----
   The tag sits on the side the number will actually appear on: to the RIGHT of
   the Prefix box (prefix, then number) and to the LEFT of the Postfix box
   (number, then postfix). Both were the wrong way round before, which read as
   the opposite of what the preview produced. */
.refund-theme.uniqueid-page .uid-field{
  display:inline-flex; align-items:stretch; max-width:100%; width:380px;
  border:1px solid var(--line); border-radius:6px; overflow:hidden; background:var(--surface);
}
.refund-theme.uniqueid-page .uid-field:focus-within{ border-color:var(--brand); }
.refund-theme.uniqueid-page .uid-field input{
  flex:1 1 auto; min-width:0; height:34px; padding:0 10px;
  border:0; background:transparent; box-shadow:none;
  font-size:13px; color:var(--ink);
}
.refund-theme.uniqueid-page .uid-field input:focus{ outline:none; }
.refund-theme.uniqueid-page .uid-field input[disabled]{ background:transparent; color:var(--muted); cursor:not-allowed; }
.refund-theme.uniqueid-page .uid-tag{
  display:inline-flex; align-items:center; white-space:nowrap;
  padding:0 10px; background:var(--brand); color:#fff;
  font-size:11.5px; font-weight:600;
}

/* ACTIVE vs INACTIVE, stated three ways so it cannot be missed: the accent
   border, the accent tag, and a muted body for the one that is off. Only ONE of
   these two boxes can ever be live - the page's jQuery unticks the other - so
   the screen should say which, and it did not. */
.refund-theme.uniqueid-page .uid-field.is-on{
  border-color:var(--brand); background:var(--surface);
}
.refund-theme.uniqueid-page .uid-field.is-off{ background:var(--surface-2); border-color:var(--line); }
.refund-theme.uniqueid-page .uid-field.is-off .uid-tag{ background:var(--muted); }

/* the state in words, for anyone who cannot rely on colour alone */
.refund-theme.uniqueid-page .uid-state{
  font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.3px;
}
.refund-theme.uniqueid-page .uid-state.on{ color:var(--brand); }
.refund-theme.uniqueid-page .uid-state.off{ color:var(--muted); }

/*  NO PREVIEW BUTTON ON A FIELD THAT IS NOT IN USE.
    It offered to preview a box that cannot be typed into, and produced a preview
    of nothing - a control that is visibly available and does nothing useful is
    worse than no control. Done in CSS rather than in uidSyncFieldState() because
    the button is a following SIBLING of the field, so `~` already knows: DOM
    order in .uid-control is field, then state, then button.
    The NOT IN USE label stays, so the row still explains ITSELF - the button is
    absent for a stated reason rather than mysteriously missing. */
.refund-theme.uniqueid-page .uid-field.is-off ~ .rt-btn{ display:none; }

/* jQuery UI's droppable adds .active while a chip hovers the box */
.refund-theme.uniqueid-page #txtPreFix.active,
.refund-theme.uniqueid-page #txtPostFix.active{ background:var(--ok-bg); }

/* ---- the [[[AY1]]] / [[[AY2]]] chips ----
   Bare <label>s before, with nothing to suggest they could be dragged and no
   caption saying where to. */
.refund-theme.uniqueid-page .draggable{
  display:inline-flex; align-items:center; justify-content:center; margin:0;
  border:1px dashed var(--brand); border-radius:6px; background:var(--surface-2);
  color:var(--brand); font-size:11.5px; font-weight:600;
  padding:5px 10px; cursor:grab; user-select:none; line-height:1.2;
}
.refund-theme.uniqueid-page .draggable:hover{ background:var(--surface); }
.refund-theme.uniqueid-page .draggable:active{ cursor:grabbing; }
/* jQuery UI clones the chip into <body>, i.e. OUTSIDE .refund-theme, so the
   drag helper would render unstyled. This is the one rule here that cannot be
   scoped to the page root. */
.ui-draggable-dragging{
  display:inline-flex; align-items:center; border:1px dashed #7e1f4b; border-radius:6px;
  background:#fff; color:#7e1f4b; font-size:11.5px; font-weight:600; padding:5px 10px; z-index:1200;
}

/* ---- live preview ---- */
.refund-theme.uniqueid-page .uid-preview{
  display:inline-flex; align-items:center; gap:8px;
  border:1px solid var(--line); border-left:3px solid var(--brand); border-radius:6px;
  background:var(--surface-2); padding:8px 12px;
  font-size:13px; color:var(--ink);
}
.refund-theme.uniqueid-page .uid-preview b{ font-size:14px; letter-spacing:.3px; }
.refund-theme.uniqueid-page .uid-preview-empty{ font-size:11.5px; color:var(--muted); }

/* ---- footer ---- */
.refund-theme.uniqueid-page .uid-actions{
  display:flex; gap:8px; align-items:center;
  border-top:1px solid var(--line); margin-top:10px; padding-top:14px;
}

@media (max-width:767px){
  /* the 28px gutter goes too - on a phone the badge can keep its own line */
  .refund-theme.uniqueid-page .uid-row{ grid-template-columns:1fr; gap:4px; padding-left:0; }
  .refund-theme.uniqueid-page .uid-label{ padding-top:0; }
  .refund-theme.uniqueid-page .uid-field{ width:100%; }
}


/* =====================================================================
   DASHBOARD FESTIVAL GREETING  -  .dg-*
   ---------------------------------------------------------------------
   Rendered by SiteJs/Common/FestivalGreeting.js into an empty container on
   the dashboard (route "", i.e. the site root - the page every user lands
   on after login, whose body was previously blank).

   TWO STATES, ONE COMPONENT:
     .dg-greet            plain day  - brand gradient, "Good morning, <name>"
     .dg-greet.dg-fest    festival   - festival gradient + drifting glyphs

   The festival palette comes from .dg-a-<accent> (gold/plum/rose/indigo/
   sky/pine/tricolour), set by the JS from the greeting table. Palettes are
   tokens declared at the top of this file - see the note there on why these
   specifically do NOT follow the app accent.

   WHY IT IS A BANNER AND NOT A FULL-SCREEN EFFECT LIKE THE LOGIN PAGE:
   the dashboard is a work surface. Falling diyas over the whole viewport is
   charming for the three seconds before someone needs to find a menu. So
   the celebration is boxed, the animation is slow and low-contrast, and the
   whole thing collapses to a single quiet bar on an ordinary day.
   ===================================================================== */
.refund-theme .dg-greet{
  position:relative;
  overflow:hidden;                     /* clips the drifting glyphs to the box */
  border-radius:10px;
  margin:0 0 18px;
  padding:18px 22px;
  background:linear-gradient(135deg,var(--dg-plain-a) 0%,var(--dg-plain-b) 100%);
  box-shadow:var(--shadow);
  color:var(--dg-ink);
}

/* ---- palettes ------------------------------------------------------- */
.refund-theme .dg-greet.dg-a-gold  { background:linear-gradient(135deg,var(--dg-gold-a) 0%,var(--dg-gold-b) 100%); }
.refund-theme .dg-greet.dg-a-plum  { background:linear-gradient(135deg,var(--dg-plum-a) 0%,var(--dg-plum-b) 100%); }
.refund-theme .dg-greet.dg-a-rose  { background:linear-gradient(135deg,var(--dg-rose-a) 0%,var(--dg-rose-b) 100%); }
.refund-theme .dg-greet.dg-a-indigo{ background:linear-gradient(135deg,var(--dg-indigo-a) 0%,var(--dg-indigo-b) 100%); }
.refund-theme .dg-greet.dg-a-sky   { background:linear-gradient(135deg,var(--dg-sky-a) 0%,var(--dg-sky-b) 100%); }
.refund-theme .dg-greet.dg-a-pine  { background:linear-gradient(135deg,var(--dg-pine-a) 0%,var(--dg-pine-b) 100%); }

/*  Republic / Independence Day. The white band is a HARD three-stop gradient,
    not a blend: saffron fading through pink into green is not the flag. The
    band is narrow (46-54%) so the text still sits on colour and stays
    readable - a title crossing the white would drop to ~1.2:1. */
.refund-theme .dg-greet.dg-a-tricolour{
  background:linear-gradient(100deg,
              var(--dg-tri-a) 0%,   var(--dg-tri-a) 44%,
              var(--dg-tri-mid) 47%,var(--dg-tri-mid) 53%,
              var(--dg-tri-b) 56%,  var(--dg-tri-b) 100%);
}

/* ---- content -------------------------------------------------------- */
/*  FLEX CONTAINER: every direct child becomes a column. .dg-body has exactly
    three children (badge / text / meta) and that is on purpose - adding a
    fourth here will silently become a fourth column. */
.refund-theme .dg-greet .dg-body{
  position:relative; z-index:2;        /* above .dg-fx */
  display:flex; align-items:center; gap:16px;
}

.refund-theme .dg-greet .dg-badge{
  flex:0 0 auto;
  width:52px; height:52px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:var(--dg-badge);
  font-size:26px; line-height:1;
}

/*  min-width:0 so a long school name can wrap instead of forcing the meta
    column off the right edge - the usual flex-child overflow. */
.refund-theme .dg-greet .dg-txt{ flex:1 1 auto; min-width:0; }

.refund-theme .dg-greet .dg-title{
  margin:0; padding:0; border:0;
  font-size:21px; font-weight:600; line-height:1.25;
  color:var(--dg-ink);
}
.refund-theme .dg-greet .dg-sub{
  margin:3px 0 0; padding:0;
  font-size:13px; font-weight:400; line-height:1.4;
  color:var(--dg-ink-soft);
}

.refund-theme .dg-greet .dg-meta{
  flex:0 0 auto;
  display:flex; flex-direction:column; align-items:flex-end; gap:2px;
  text-align:right;
}
.refund-theme .dg-greet .dg-date{ font-size:12.5px; font-weight:600; color:var(--dg-ink-soft); white-space:nowrap; }
.refund-theme .dg-greet .dg-school{ font-size:11.5px; color:var(--dg-ink-meta); }

/* ---- the drifting glyph layer --------------------------------------- */
/*  pointer-events:none matters: this layer covers the whole banner, and
    without it a future button in the greeting would be unclickable for
    reasons nobody would find quickly. (See the .preloaderCenter note in
    CLAUDE.md for what an invisible full-cover layer costs to debug.) */
.refund-theme .dg-greet .dg-fx{
  position:absolute; inset:0; z-index:1;
  pointer-events:none; overflow:hidden;
}
/*  FADED WITH `opacity`, NOT `color`.
    The glyphs are emoji, and an emoji is a COLOUR glyph - `color` does not tint
    it, so the first version set --dg-glyph on them and changed nothing at all;
    they came out at full strength and competed with the title. Opacity is the
    only lever that works on them, and it is what keeps this a background layer. */
.refund-theme .dg-greet .dg-fx-i{
  position:absolute; top:-28px;
  font-size:19px; line-height:1;
  opacity:0;
  animation-name:dgDrift;
  animation-timing-function:linear;
  animation-iteration-count:infinite;
}
@keyframes dgDrift{
  0%   { transform:translateY(0) rotate(0deg);      opacity:0; }
  20%  { opacity:.45; }
  80%  { opacity:.45; }
  100% { transform:translateY(150px) rotate(24deg); opacity:0; }
}

/* ---- responsive ----------------------------------------------------- */
@media (max-width:767px){
  .refund-theme .dg-greet{ padding:14px 16px; }
  /*  The three columns stack. The date drops to the left edge with the rest -
      right-aligned text under a left-aligned title looks like a mistake at
      phone width. */
  .refund-theme .dg-greet .dg-body{ flex-wrap:wrap; gap:12px; }
  .refund-theme .dg-greet .dg-badge{ width:42px; height:42px; font-size:21px; }
  .refund-theme .dg-greet .dg-txt{ flex:1 1 100%; order:2; }
  .refund-theme .dg-greet .dg-meta{ flex:1 1 100%; order:3; align-items:flex-start; text-align:left; }
  .refund-theme .dg-greet .dg-title{ font-size:18px; }
  /*  The glyphs go. On a 360px banner ten of them is clutter, not confetti. */
  .refund-theme .dg-greet .dg-fx{ display:none; }
}

/*  Someone who has asked their OS to reduce motion gets the colour and the
    words and none of the movement. The glyphs are removed rather than frozen:
    ten static emoji sitting in a row read as a rendering fault. */
@media (prefers-reduced-motion:reduce){
  .refund-theme .dg-greet .dg-fx{ display:none; }
}


/*  NO SECOND DATEPICKER BLOCK HERE - ON PURPOSE.
    One was written (a `.rt-datepicker` marker class added by JS on open) before
    noticing that this file ALREADY has a full bootstrap-datepicker theme, at the
    "SINGLE-DATE CALENDAR" block around line 1760, deliberately unscoped for
    exactly the same reason. Two blocks styling one popup is how a control ends up
    half-following each: the duplicate lost on specificity anyway, because the
    plugin's own selectors (`.datepicker table tr td.day`) carry more elements
    than `.rt-datepicker td.day` and quietly won.

    Anything the calendar needs belongs in that block, not in a new one. */
