/* ============================================================================
 * analyst/css/app.css — pricing console, layered on the shared tokens in
 * ../customer/css/styles.css. Airline-side (Quincus) identity; same shell
 * grammar as the customer portal (64px header, 56px footer, 1100px .shell).
 * ==========================================================================*/
[hidden] { display: none !important; }

/* ---- type scale (the ONLY place font sizes are defined) -------------------
   Every component references these tokens; no rule declares a px font-size. */
:root {
  --fs-h1: 22px;      /* page title */
  --fs-h2: 20px;      /* modal titles */
  --fs-title: 16px;   /* strip titles, section headings */
  --fs-body: 14px;    /* body text, table cells, money, inputs, button labels */
  --fs-small: 12px;   /* chips, column headers, sub-labels, ids */
  --fs-hint: 13px;    /* the intake's quiet lines + field labels (2026-08-18) */
  --fs-fine: 11px;    /* the intake's example rows — the smallest rank */
  --fs-note: 15px;    /* the read-out's detail line (rfq-step1 §5) */
  --fs-x: 26px;       /* modal close glyph */

  /* ---- state tints (the ONLY place these pairs are defined) ---------------
     The same three ink/tint pairs were re-typed in fifteen rules across the
     console. Identical values, one source — so "one palette" is a fact rather
     than a coincidence that survives until someone types a near-miss. */
  --danger-ink: #B42318; --danger-tint: #FEE4E2; --danger-line: #EF4444;
  --danger-wash: #FEF3F2; --danger-edge: #FECDCA; --danger-deep: #912018;
  --warn-ink: #B54708;   --warn-tint: #FEF0C7;   --warn-edge: #FEDF89;
  --ok-ink: #027A48;     --ok-tint: #D1FADF;     --ok-line: #12B76A;
  --ok-fill: #6CE9A6;    --ok-soft: #A6F4C5;
  --paper-scrim: rgba(9, 31, 56, 0.34);

  /* ---- the load-tier ramp (segment bars, capacity cells) -----------------
     Three steps, one direction: open → tight → full. They were typed as six
     raw hexes across four rules, which is how a ramp stops being a ramp. */
  --tier-tight: #F79009; --tier-full: #B54708; --tier-full-ink: #7A2E0E;

  /* ---- ink that sits ON a filled surface ---------------------------------
     22 rules typed #fff for text on a navy or slate fill. --card is the
     paper under content; this is the ink over a fill. Same value, opposite
     job — naming both stops the next filled control guessing. */
  --ink-inverse: #FFFFFF;
  --held-fill: #475467;

  /* ---- corners (the ONLY place radii are defined) -------------------------
     Eight distinct radii were in use — 14px modals beside 12px panels, 10px
     inner blocks beside 7px controls. Three steps and a dot, everywhere. */
  --r-card: 12px;   /* modals, panels, strips — the outermost box */
  --r-box: 8px;     /* buttons, inputs, inner blocks — matches --radius */
  --r-pill: 999px;  /* chips, badges, toggles */
  --r-dot: 3px;     /* the 9px legend squares, and nothing else */

  /* ==========================================================================
     CONSOLE PALETTE — the sibling product's, by direction.
     This overrides the shared tokens from ../customer/css/styles.css for the
     CONSOLE ONLY: app.css loads second, and the customer portal never loads it,
     so the portal keeps its Etihad identity untouched. Every value below is
     read off the reference screenshot; nothing outside this block types a
     colour (VT-8 / ST-7).
     ======================================================================== */
  --navy: #0F1629; --navy-deep: #080D1A; --navy-mid: #1E2749;
  --primary: #4F46E5;          /* filled primary action */
  --accent: #6366F1;           /* the indigo marker — active rail item, badges */
  --navy-tint: #EEF2FF;        /* indigo wash behind info states */
  --paper: #FFFFFF; --paper-alt: #F7F8FA; --card: #FFFFFF;
  --ink: #0F172A; --ink-70: #667085; --ink-55: #98A2B3;
  --rule-dark: #E8EAEF; --rule-dark-strong: #D5D9E0;
  --green: #12B76A; --amber: #F79009; --red: #EF4444;
  --teal: #0E9384; --teal-tint: #CCFBEF;
  --gold-tint: #FEF0C7; --gold-ink: #B54708;
  --error-bg: #FEF3F2;

  /* ---- the rail (the ONE dark surface in the console) ---------------------
     The shape is the sibling product's — identity tile, labelled groups, a
     marked active row, an account block on the floor. The palette is ours:
     these are navy, darkened; the active marker is the Etihad gold the
     co-brand already uses. No indigo enters the build. */
  --rail-bg: #0F1629;      /* the ground */
  --rail-raised: #1E2749;  /* the active row's fill */
  --rail-hover: #182038;
  --rail-ink: #E8EAF0;     /* an item's label, and the product name */
  --rail-ink-dim: #8B93A7; /* group labels, descriptor, resting icons */
  --rail-rule: #1E2740;    /* the zone separators */
}
/* shared strip type: all six strip titles one size; all strip body one size */
/* THE section heading, every surface. Reports' .rp-h and the cost-basis
   .cb-head were the same rank at a different weight; both fold in here. */
.strip-title, h2.strip-title { font-size: var(--fs-title); font-weight: 600; color: var(--ink); margin: 0 0 6px; }
.strip-sub { font-size: var(--fs-body); font-weight: 400; }

/* ── PAGE HEADER (§1) ────────────────────────────────────────────────────────
   Three lines and an action group, one component on every surface. The eyebrow
   is the smallest step, the title the largest, the subtitle body — all three
   already in the --fs-* scale, so this adds hierarchy without adding sizes. */
.pghead { display: flex; align-items: center; justify-content: space-between; gap: 24px;
  margin: 0 0 22px; }
.pghead-txt { min-width: 0; }
.pghead-eyebrow { margin: 0 0 6px; font-size: var(--fs-small); font-weight: 700;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-55); }
.pghead .q-title { margin: 0; }
.pghead-sub { margin: 8px 0 0; }   /* the 70ch cap lives on .q-sub — one rule (FL-5) */
.pghead-act { flex: 0 0 auto; display: flex; align-items: center; gap: 10px; }
/* ── end page header ────────────────────────────────────────────────────── */

/* ── SUMMARY CARDS (§2) ──────────────────────────────────────────────────────
   A row of counts above the tabs. Each card IS a filter — it is a <button>,
   because that is what it does. Every figure is one the surface already shows
   somewhere else (VT-3), and a card with no filter behind it never renders
   (VT-4, enforced in ARender.summaryCards). */
.sumrow { display: grid; grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
  gap: 16px; margin: 0 0 22px; }
.sumcard { display: flex; flex-direction: column; align-items: flex-start; gap: 6px;
  text-align: left; font-family: inherit; padding: 20px 22px; cursor: pointer;
  background: var(--card); border: 1px solid var(--rule-dark); border-radius: var(--r-card); }
.sumcard:hover { border-color: var(--rule-dark-strong); }
.sumcard.active { border-color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.sumcard:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.sumcard-label { display: flex; align-items: center; gap: 7px; font-size: var(--fs-small);
  font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-55); }
.sumdot { flex: 0 0 6px; width: 6px; height: 6px; border-radius: var(--r-pill); background: var(--navy); }
.sumdot-danger { background: var(--danger-line); }
.sumdot-warn   { background: var(--amber); }
.sumdot-ok     { background: var(--green); }
.sumdot-navy   { background: var(--navy); }
.sumcard-fig { font-size: var(--fs-h1); font-weight: 700; color: var(--ink);
  font-variant-numeric: tabular-nums; line-height: 1.1; }
.sumcard-note { font-size: var(--fs-small); color: var(--ink-70); }
/* ── end summary cards ──────────────────────────────────────────────────── */

/* ── RFQ SURFACE ─────────────────────────────────────────────────────────────
   Five screens, one flow. The rules the fixes named: an identifier never
   wraps, every column header fits its own column, and the action row is a row.
   ------------------------------------------------------------------------ */
.rfq-back { margin: 0 0 10px; }                     /* RF-12 — the content's left edge */

/* ── THE STEP SPINE (RFQ-FLOW §2) ────────────────────────────────────────────
   Five steps, one current. The current one is the only step with a live
   action, so it is the only one carrying ink weight; done steps recede and
   steps not yet reached are outlines. */
.rfq-spine { display: flex; flex-wrap: wrap; align-items: center; gap: 0;
  list-style: none; margin: 0 0 12px; padding: 0; }
.rfq-step { display: flex; align-items: center; gap: 7px; padding: 0 16px 0 0; margin: 0 16px 0 0;
  font-size: var(--fs-body); position: relative; }
.rfq-step + .rfq-step::before { content: ""; position: absolute; left: -20px; top: 50%;
  width: 8px; height: 1px; background: var(--rule-dark-strong); }
.rfq-stepmark { font-size: var(--fs-small); line-height: 1; }
.rfq-step-done { color: var(--ink-55); }
.rfq-step-done .rfq-stepmark { color: var(--teal); }
.rfq-step-current { color: var(--ink); font-weight: 700; }
.rfq-step-current .rfq-stepmark { color: var(--accent); }
.rfq-step-todo { color: var(--ink-40, var(--ink-55)); }
.rfq-step-todo .rfq-stepmark { color: var(--rule-dark-strong); }

/* F-2 — one plain sentence, at reading rank, under the spine */
.rfq-say { font-size: var(--fs-title); font-weight: 500; color: var(--ink);
  margin: 0 0 8px; max-width: 70ch; }
.rfq-explain { font-size: var(--fs-body); color: var(--ink-70); margin: 0 0 18px; max-width: 70ch; }
.rfq-held { margin: 0 0 10px; font-size: var(--fs-small); }

/* F-7/G-11 — ONE filled button. Everything else on the step is a quiet link,
   so the analyst never has to choose between equals. */
.rfq-actrow { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end;
  gap: 16px; margin: 0 0 20px; }                    /* RF-5 — a row, not a stack */
.rfq-quietrow { margin-right: auto; display: flex; flex-wrap: wrap; align-items: center; gap: 18px; }
.rfq-quiet { font-size: var(--fs-body); }
.rfq-gate-note { margin-right: auto; font-size: var(--fs-small); color: var(--ink-70); }

/* the panel row grows to hold its sentences (G-5): title above, cause below */
.actnow-rows .actrow-tall { height: auto; min-height: 48px; padding: 11px 12px; align-items: flex-start; }
.actrow-tall .actrow-chip { margin-top: 2px; }
.actrow-tall .actrow-meta { flex-direction: column; gap: 2px; white-space: normal; overflow: visible; }
.actrow-tall .actrow-act, .actrow-tall .actrow-more { margin-top: 2px; }
.actrow-say { color: var(--ink-70); display: block; }
.actrow-say2 { color: var(--ink-55); }
.actnow .triage-bar { margin-top: 12px; }
.rfq-where { font-weight: 600; }

/* ── STEP 1 — THE COMPOSER (spec §2) ─────────────────────────────────────── */
.rfq-composer { max-width: 860px; }          /* a form, not a table — prose width */
/* 2026-08-18 direction — THE INTAKE: one dashed drop target, 460px, centred,
   the whole area clickable (it IS the file input's label); a quiet or-paste
   line and the paste box at the same width beneath. No other instruction
   line renders on the step. Drag-over takes the accent tint. */
.rfq-drop { display: flex; flex-direction: column; align-items: center; gap: 6px;
  padding: 28px; border: 1.5px dashed var(--rule-dark-strong); border-radius: var(--r-card);
  background: var(--card); cursor: pointer; text-align: center; }
.rfq-drop:hover { border-color: var(--ink-55); }
.rfq-drop.rfq-drop-over { border-color: var(--accent); background: var(--navy-tint); }
.rfq-drop-ico { color: var(--ink-55); }
.rfq-drop-say { font-size: var(--fs-title); font-weight: 500; color: var(--ink); }
.rfq-drop-or { font-size: var(--fs-hint); color: var(--ink-70); }
.rfq-drop-choose { color: var(--accent); font-weight: 600; }
.rfq-drop:hover .rfq-drop-choose { text-decoration: underline; }
.rfq-drop-hint { width: 100%; margin-top: 12px; padding-top: 12px;
  border-top: 1px solid var(--rule-dark); text-align: left;
  display: flex; flex-direction: column; gap: 2px; }
.rfq-drop-note { font-size: var(--fs-small); color: var(--ink-55); }
.rfq-drop-eg { font-family: var(--mono); font-size: var(--fs-fine); color: var(--ink-55); }
.rfq-orpaste { margin: 14px 0 6px; font-size: var(--fs-hint); }
.rfq-paste { width: 100%; font-size: var(--fs-body); }
.rfq-paste::placeholder { color: var(--ink-55); }
.rfq-composer .rfq-drop, .rfq-composer .rfq-orpaste, .rfq-composer .rfq-paste,
.rfq-composer .rfq-collapsed, .rfq-composer .rfq-loadednote {
  max-width: 460px; margin-left: auto; margin-right: auto; }
.rfq-loadednote { margin-top: 8px; }
.rfq-collapsed { margin: 10px 0 0; }

/* ── rfq-step1 (2026-08-18) — the read-out, the fields, the styled dates ──
   S1-13: every label is 13px muted, 6px above its control; every control is
   36px. S1-6: the accent focus ring on every input — never amber. */
.rfq-readout { margin: 18px 0 4px; }
.rfq-ro-head { margin: 0 0 6px; font-size: var(--fs-h1); font-weight: 500; color: var(--ink); }
.rfq-ro-detail { margin: 0; font-size: var(--fs-note); color: var(--ink-70); max-width: 560px; }
.rfq-ro-detail .rfq-badline, .rfq-ro-detail .rfq-rep { display: inline; }
.rfq-fieldrow { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 16px; margin: 20px 0 0; }
.rfq-field { display: flex; flex-direction: column; min-width: 0; }
.rfq-flabel { font-size: var(--fs-hint); font-weight: 400; color: var(--ink-55); margin: 0 0 6px; }
.rfq-w220 { width: 220px; } .rfq-w220 .rfq-ctl { width: 100%; }
.rfq-w180 { width: 180px; } .rfq-w180 .rfq-ctl { width: 100%; }
.rfq-ctl { height: 36px; font-family: inherit; font-size: var(--fs-note); color: var(--ink);
  background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  padding: 0 10px; }
.rfq-acct1 { max-width: 320px; }
/* .console select (12px, the compact chrome selects) would out-rank .rfq-ctl —
   the field block's picker keeps the 15px input rank (S1-13) */
.rfq-composer select.rfq-ctl { font-size: var(--fs-note); height: 36px; }
.rfq-newacct select.rfq-ctl { font-size: var(--fs-note); height: 36px; }
.rfq-range { display: flex; align-items: center; gap: 8px; }
.rfq-range-to { font-size: var(--fs-hint); }
.rfq-composer .rfq-ctl:focus, .rfq-composer .rfq-tsv:focus, .rfq-composer input:focus,
.rfq-composer select:focus, .rfq-composer textarea:focus {
  outline: none; border-color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.rfq-discrow { display: flex; align-items: center; gap: 16px; margin: 20px 0 0; }
.rfq-disclose { background: none; border: 0; padding: 0; font-family: inherit;
  font-size: var(--fs-hint); color: var(--ink-70); cursor: pointer; }
.rfq-disclose:hover { color: var(--ink); }
.rfq-chev { font-size: var(--fs-hint); }
.rfq-actside { margin-left: auto; display: flex; align-items: center; gap: 12px; }
.rfq-gate-note { font-size: var(--fs-hint); color: var(--ink-70); white-space: nowrap; }
.rfq-actside .btn { font-size: var(--fs-note); }
.rfq-morefields { margin-top: 20px; }
/* 2026-08-18 PX — rates ending before the tender period (step 4) */
.rfq-pxblock { background: var(--card); border: 1px solid var(--rule-dark);
  border-radius: var(--r-card); padding: 16px 18px; margin: 0 0 18px; }
.rfq-pxrow { display: flex; align-items: center; gap: 14px; padding: 8px 0;
  border-top: 1px solid var(--rule-dark); }
.rfq-pxrow:first-of-type { border-top: 0; }
.rfq-px-say { flex: 1 1 auto; font-size: var(--fs-body); }

/* + New account (rfq-step1 addendum) — the prospect overlay */
.rfq-newacct { margin-top: 16px; }
.rfq-newacct .rfq-fieldrow { margin-top: 12px; }
.rfq-na-note { margin: 12px 0 0; font-size: var(--fs-hint); max-width: 560px; line-height: 1.5; }
.rfq-prior { margin-top: 20px; display: flex; align-items: center;
  justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.rfq-prior .btn, .rfq-pxrow .btn { width: auto; flex: 0 0 auto; }
.rfq-recog-line { margin: 0; font-size: var(--fs-body); max-width: 560px; }

/* THE styled date field (S1-12) — a button and a small month grid */
.dp { position: relative; display: inline-flex; }
.dp-btn { cursor: pointer; text-align: left; min-width: 130px; }
.dp-btn.dp-empty { color: var(--ink-55); }
.dp-pop { position: absolute; left: 0; top: calc(100% + 6px); z-index: 210; width: 252px;
  background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  box-shadow: var(--shadow); padding: 10px; }
.dp-head { display: flex; align-items: center; justify-content: space-between; margin: 0 0 8px; }
.dp-title { font-size: var(--fs-small); font-weight: 700; }
.dp-nav { background: none; border: 0; font-size: var(--fs-title); color: var(--ink-70);
  cursor: pointer; padding: 2px 8px; border-radius: var(--r-box); }
.dp-nav:hover { background: var(--paper-alt); }
.dp-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.dp-day { height: 28px; background: none; border: 0; font-family: inherit;
  font-size: var(--fs-small); font-variant-numeric: tabular-nums; color: var(--ink);
  border-radius: var(--r-box); cursor: pointer; }
.dp-day:hover { background: var(--paper-alt); }
.dp-day.dp-on { background: var(--primary); color: var(--ink-inverse); }
/* ── end rfq-step1 ─────────────────────────────────────────────────────── */
.rfq-mapping { margin: 14px 0; border: 1px solid var(--rule-dark); border-radius: var(--r-box);
  padding: 12px 14px; background: var(--card); }
.rfq-map-head { font-weight: 600; margin-bottom: 8px; }
.rfq-maprow { display: flex; align-items: center; gap: 10px; padding: 4px 0; }
.rfq-maptheir { min-width: 180px; }
.rfq-mapas { flex: 0 0 auto; }
.rfq-map-missing { color: var(--danger-ink); font-weight: 600; margin: 8px 0 0; }
.rfq-newfields { margin: 14px 0 0; flex-wrap: wrap; }
.rfq-sendfacts p { margin: 0 0 8px; font-size: var(--fs-title); }
.rfq-sendfacts p.muted { font-size: var(--fs-body); }
/* ── THE MIRRORED LIST ROW (LC-1..LC-6) ──────────────────────────────────── */
/* 2026-08-18 direction — the tender list's columns: every header fits on
   ONE line inside its own column (a wrapped "ACCOUNT /" beside LANES read
   as one header), fixed widths on the figure columns, and ACCOUNT / RFQ —
   the row's identity — absorbs the freed checkbox width and all surplus.
   Account names never truncate at 1440. */
.rfq-list th { white-space: nowrap; }
.rfq-list .rfq-due { width: 96px; min-width: 96px; }
.rfq-list .rfq-acct { width: auto; }
.rfq-list .rfq-lncount { width: 72px; min-width: 64px; text-align: right; }
.rfq-list .rfq-progcell { width: 190px; min-width: 150px; }
.rfq-list .rfq-nextcell { width: 190px; min-width: 150px; position: relative; white-space: nowrap; }
.rfq-next { max-width: 150px; white-space: normal; line-height: 1.25; height: auto; padding: 5px 10px; text-align: left; }
/* the ONE overflow menu (B-1): FIXED so no sibling row, table edge or
   scroll container can clip or overpaint it; hidden until placeMoreMenus()
   pins it to its trigger (right edges aligned, flipping up at the viewport
   floor) so it never flashes at the wrong spot */
.co-more-menu { position: fixed; left: 0; top: 0; visibility: hidden; z-index: 200;
  background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  box-shadow: var(--shadow); padding: 4px; min-width: 130px; }
.co-more-item { display: block; width: 100%; text-align: left; background: none; border: 0;
  padding: 8px 10px; font-size: var(--fs-body); color: var(--ink); cursor: pointer; border-radius: var(--r-box); }
.co-more-item:hover { background: var(--paper-alt); }
.rfq-donenote { white-space: normal; }

/* ── LC-7/LC-8 — identifiers never truncate; free text gives way ─────────
   The Queue cut lanes mid-code ("AUH → S…") because OFFERS held 260px for
   two currency values. The lane is an identifier: it keeps its width and
   never ellipsizes; OFFERS narrows (the values are ~110px of tabular
   figures); the customer column truncates LAST because it is the one
   free-text column left. */
/* (LC-8's OFFERS narrowing lives on the ORIGINAL .q-offers declarations
   below — a same-specificity rule declared here, earlier in the sheet,
   silently loses. The .q-lane fix learned this; the first .q-offers cut
   did not, and the Queue's customer column paid for it at 1280.) */

/* RF-6 — an RFQ id, a lane and a line id are IDENTIFIERS: they never wrap. */
.rfq-table .rfq-acct b, .rfq-table .rfq-sub,
.rfq-table .rl-id, .rfq-table .rl-lane,
.q-table .rl-id, .q-table .rl-lane { white-space: nowrap; }
.rfq-acct { min-width: 220px; }
.rfq-acct b { display: block; }
.rfq-sub { font-size: var(--fs-small); color: var(--ink-55); }
.rfq-due { width: 120px; }
.rfq-status { width: 130px; }
.rfq-progcell { min-width: 200px; }

/* §1 — progress as a bar PLUS the count. The count is the statement. */
.rfq-prog { display: flex; align-items: center; gap: 10px; }
.rfq-bar { flex: 1 1 auto; max-width: 160px; height: 6px; border-radius: var(--r-pill);
  background: var(--rule-dark); overflow: hidden; }
.rfq-bar-fill { display: block; height: 100%; background: var(--accent); }
.rfq-prog-n { flex: 0 0 auto; font-weight: 700; }
.rfq-prog-note { margin-top: 3px; font-size: var(--fs-small); color: var(--ink-70); }

/* RF-8 — every numeric header gets room for its own word, so none collides */
/* RF-7 + RF-8 — the fixed widths must SUM to less than the content area at
   1280 (976px), or the table overflows to its min-content width. Resolved is
   the text column and carries no width: it takes whatever is left, which is
   also §3's rule about where surplus goes. */
.q-table .rl-id { width: 58px; }
.q-table .rl-lane { width: 104px; }
.q-table .rl-prod { width: 84px; }
/* the plain-word headers are longer than the technical ones they replaced
   ("We suggest" for Rec., "You'd make" for Contrib.), so the numeric columns
   widen to fit their own header — RF-8's rule, applied to the new words. */
.q-table .rl-num { width: 96px; text-align: right; }
.q-table th.rl-num { line-height: 1.25; }
/* the flexible column carries the longest header AND two-line cells. `th`
   is nowrap by default, which clipped "CONTRACT RATE" at 1280 — this one
   header wraps instead, which is the honest answer when the column is the
   one giving up its width. */
.q-table th.rl-res, .q-table th.rl-num { white-space: normal; }
.q-table .rl-res { }                     /* flexible — absorbs the surplus */
.q-table .rl-state { width: 96px; }
/* the lanes-only table (step 2) has four columns and no numbers to align down
   a narrow gutter: the lane takes the surplus, and Volume sits beside its own
   header rather than at the far edge of a 500px column */
.rfq-lanes .rl-id { width: 90px; }
.rfq-lanes .rl-prod { width: 140px; }
.rfq-lanes .rl-vol { width: 120px; }
.rfq-lanes .rl-lane { width: auto; }

/* §2 — the parse preview: every unreadable line listed with its own cause */
.rfq-preview { border: 1px solid var(--warn-edge); background: var(--warn-tint);
  border-radius: var(--r-card); padding: 14px 16px; margin: 12px 0; }
.rfq-preview-head { font-size: var(--fs-title); font-weight: 600; margin-bottom: 8px; }
.rfq-badlines { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.rfq-badline { display: flex; gap: 12px; align-items: baseline; font-size: var(--fs-small); }
.rfq-badline-no { flex: 0 0 60px; color: var(--ink-55); }
.rfq-badline-txt { flex: 0 0 auto; }
.rfq-badline-why { color: var(--warn-ink); font-weight: 600; }
.rfq-preview-note { margin: 10px 0 0; font-size: var(--fs-small); color: var(--ink-70); }

/* §4 §5 — the guided mode: a VIEW, not a modal. Rail left, one line right. */
.rfq-guided { display: grid; grid-template-columns: 232px minmax(0, 1fr); gap: 24px;
  align-items: start; }
.rfq-rail { background: var(--card); border: 1px solid var(--rule-dark);
  border-radius: var(--r-card); padding: 12px; display: flex; flex-direction: column; gap: 2px; }
.rfq-rail-h { font-size: var(--fs-small); font-weight: 700; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--ink-55); padding: 2px 8px 8px; }
.rfq-railitem { display: grid; grid-template-columns: 16px 1fr; gap: 8px; align-items: baseline;
  width: 100%; text-align: left; font-family: inherit; font-size: var(--fs-small);
  padding: 6px 8px; border: none; background: none; border-radius: var(--r-box);
  color: var(--ink-70); cursor: pointer; }
.rfq-railitem:hover { background: var(--paper-alt); }
.rfq-raillane { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rfq-rs-done { color: var(--ok-ink); }
.rfq-rs-current { background: var(--navy-tint); color: var(--primary); font-weight: 700; }
.rfq-rs-exception { color: var(--danger-ink); }
.rfq-railmark { text-align: center; }
.rfq-rail-foot { margin-top: 10px; padding: 10px 8px 2px; border-top: 1px solid var(--rule-dark);
  font-size: var(--fs-small); color: var(--ink-55); }
/* R-4 — the order on offer: two quiet links, the active one weighted */
.rfq-rail-order { display: flex; align-items: center; gap: 6px; padding: 0 8px 8px;
  font-size: var(--fs-small); color: var(--ink-55); }
.rfq-order { font-size: var(--fs-small); }
.rfq-order-on { font-weight: 700; color: var(--primary); text-decoration: none; cursor: default; }
/* R-3 — the line's share of the tender, beside the position; normal weight
   so the position stays the headline */
.rfq-gv-share { font-weight: 400; text-transform: none; letter-spacing: normal; }
/* §4.4 — the concentration block on the check step */
.rfq-conc { display: flex; align-items: center; gap: 12px; margin: 0 0 14px; }
.rfq-conc-say { font-size: var(--fs-body); color: var(--ink-70); }
/* §8.1 — inline input-fact edits on the lanes table; the composer opened
   mid-flow gets breathing room and its own way back */
.rfq-inline { height: 30px; width: 110px; padding: 0 8px; }
.rfq-inline.num { text-align: right; font-variant-numeric: tabular-nums; }
.rfq-addmore { margin: 4px 0 10px; }
.rfq-addmore .rfq-quiet { display: inline-block; margin-top: 6px; }
/* §8.4 — the bulk-adjust modal: mode row, counted preview, exclusions */
.rfq-adj-form { display: flex; gap: 10px; align-items: center; margin: 0 0 12px; }
.rfq-adj-preview { border-top: 1px solid var(--rule-dark); padding-top: 10px; }
.rfq-adj-preview p { margin: 0 0 6px; }
.rfq-adj-head { margin: 0 0 10px; font-size: var(--fs-body); }
.rfq-adj-figs { display: grid; gap: 6px; margin: 0 0 12px; }
.rfq-adj-fig { display: flex; align-items: baseline; gap: 10px; }
.rfq-adj-lbl { width: 110px; flex: 0 0 auto; font-size: var(--fs-small); font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-55); }
.rfq-adj-arrow { color: var(--ink-55); }
.rfq-adj-delta { margin-left: 8px; color: var(--ink-70); }
.rfq-adj-nothing { color: var(--ink-70); font-weight: 600; }
.rfq-adj-excl { margin: 8px 0; font-size: var(--fs-small); }
.rfq-adj-excl ul { margin: 4px 0 0 18px; }
.rfq-adj-excl li { line-height: 1.6; }
/* E-3 — a grouped panel row's expansion: one line per member, its own action */
.rfq-grp-toggle { display: inline-block; margin-top: 4px; font-size: var(--fs-small); }
.rfq-grp-lines { display: grid; gap: 2px; margin-top: 8px; }
.rfq-grp-line { display: grid; grid-template-columns: 56px minmax(0, 1fr) auto;
  gap: 10px; align-items: center; padding: 3px 0; border-top: 1px solid var(--rule-dark); }
.rfq-grp-lane { font-size: var(--fs-small); color: var(--ink-70);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rfq-gv { background: var(--card); border: 1px solid var(--rule-dark);
  border-radius: var(--r-card); padding: 22px 24px; min-width: 0; }
.rfq-gv-head { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-bottom: 14px; }
.rfq-gv-pos { font-size: var(--fs-small); font-weight: 700; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--ink-55); }
.rfq-gv-nav { display: flex; gap: 6px; }
.rfq-gv-lane { margin: 0 0 12px; }
.rfq-cause { margin: 0 0 12px; font-size: var(--fs-body); color: var(--danger-ink); }
.rfq-facts { display: grid; gap: 8px; margin: 0 0 16px; }
.rfq-facts > div { display: grid; grid-template-columns: 130px 1fr; gap: 12px; align-items: baseline; }
.rfq-facts dt { font-size: var(--fs-small); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--ink-55); }
.rfq-facts dd { margin: 0; }
.rfq-rate { display: flex; align-items: center; gap: 10px; margin: 0 0 16px; font-weight: 600; }
.rfq-rate input { width: 110px; height: 34px; padding: 0 10px; font-family: inherit;
  font-size: var(--fs-body); font-variant-numeric: tabular-nums;
  border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); }
/* RF-5 applies here too: a row of actions, each sized to its label — a
   console-wide rule sets .btn { width:100% } inside some containers. */
.rfq-gv-acts { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 14px; }
.rfq-gv-acts .btn, .rfq-actrow .btn { width: auto; flex: 0 0 auto; }
.rfq-keys { font-size: var(--fs-small); }
@media (max-width: 1100px) { .rfq-guided { grid-template-columns: minmax(0, 1fr); } }
/* §5.3 — the exceptions pass: one card per cause group, singletons as lines */
.rfq-expass { max-width: 720px; }
.rfq-expass-title { margin: 10px 0 2px; }
.rfq-expass-sub { margin: 0 0 18px; font-size: var(--fs-body); }
.rfq-excard { background: var(--card); border: 1px solid var(--rule-dark);
  border-radius: var(--r-card); padding: 18px 20px; margin: 0 0 14px; }
.rfq-excard-head { display: flex; align-items: center; gap: 10px; margin: 0 0 10px; }
.rfq-excard-title { font-size: var(--fs-body); }
.rfq-excause { margin: 0 0 6px; font-size: var(--fs-body); color: var(--ink-70); }
.rfq-exdepth { margin: 6px 0 0; font-size: var(--fs-small); color: var(--danger-ink); }
.rfq-exsample { display: inline-block; margin-top: 8px; font-size: var(--fs-small); }
.rfq-exsample-list { margin: 6px 0 0 18px; padding: 0; }
.rfq-exsample-list li { line-height: 1.7; }
.rfq-excard-acts { margin-top: 14px; }
/* EX-6 — the group of one is a LINE: chip, identity, its one action */
.rfq-exline { display: flex; align-items: center; gap: 10px; padding: 10px 4px;
  border-top: 1px solid var(--rule-dark); }
.rfq-exline-title { flex: 1 1 auto; min-width: 0; }
/* §5.3.3 — the per-lane add-rate table; EX-12 — the tail button in the
   concentration block */
.rfq-lr-table input { width: 90px; }
.rfq-lr-floor { margin: 10px 0 0; }
.rfq-tail { margin-left: 4px; flex: 0 0 auto; }
/* ── end RFQ surface ────────────────────────────────────────────────────── */

/* ── SIDEBAR NAVIGATION ─────────────────────────────────────────
   The console's chrome: a fixed left panel, full viewport height, four zones —
   identity, three labelled groups, space, account. Nothing here is new design
   system: every colour is a token, every font-size is one of the six --fs-*
   steps, every corner comes from the corner token set (gate NV-7). The routes
   and their names are untouched (NV-6).

   DARK, and the only dark surface in the build. The shape follows the sibling
   product's rail — identity tile, uppercase group labels, a filled and marked
   active row, an account block on the floor. The colours do not: the ground is
   our navy darkened, the marker is the Etihad gold already in the co-brand.

   EXPANDED IS THE DEFAULT at every supported width (NV-8); collapse is a user
   choice that persists (NV-4).
   ------------------------------------------------------------------------ */
body.app.console {
  display: flex; flex-direction: row; align-items: stretch; justify-content: flex-start;
  /* §6.1 — the cooler neutral the table header zones already use, so white
     cards separate from the ground. One token change, no new colour. */
  min-height: 100vh; background: var(--paper-alt);
  /* the shared stylesheet pads the BODY 24px for the portal's page layout. The
     console is full-bleed chrome: that padding pushed the 100vh rail 24px down
     and clipped the last 24px of the account block (VT-9). Content keeps its
     own inset via .wrap. */
  padding: 0;
}
body.no-scroll { overflow: hidden; }
.app-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; min-height: 100vh; }
/* FLUID (§1) — the content area is everything right of the rail. No centred
   column: one left edge at rail + 32px, running to a 32px right padding. */
.shell { width: 100%; max-width: none; margin: 0; padding: 0 32px; display: flex; align-items: center; gap: 22px; }

/* THREE ROWS, explicitly: identity, nav (the only one that gives), account.
   As a flex column the account block overflowed the 100vh rail by 24px and
   clipped its second line (VT-9); a grid with a minmax(0,1fr) middle row
   cannot, whatever the nav contains. */
.sidebar { flex: 0 0 240px; width: 240px; position: sticky; top: 0; align-self: flex-start;
  height: 100vh; z-index: 40; display: grid; grid-template-rows: auto minmax(0, 1fr) auto;
  overflow: hidden; background: var(--rail-bg); border-right: 1px solid var(--rail-rule); }
.sidebar[data-collapsed="true"] { flex-basis: 64px; width: 64px; }

/* -- zone 1: identity — mark tile, then two lines (NV-11) ------------------ */
.sb-top { position: relative; display: flex; align-items: center; padding: 16px 40px 16px 14px;
  border-bottom: 1px solid var(--rail-rule); }
.sb-brand { min-width: 0; flex: 1 1 auto; overflow: hidden; }
.brand { display: flex; flex-direction: row; align-items: center; gap: 10px; font-weight: 700; color: var(--rail-ink); }
/* the asset is a dark lockup on transparent — unreadable ON the dark ground,
   so it sits IN a paper tile, windowed to the mark. Same move the collapsed
   rail already made, now the resting state too. */
.sb-mark { flex: 0 0 36px; width: 36px; height: 36px; border-radius: var(--r-box);
  background: var(--card); display: inline-flex; align-items: center; justify-content: center; overflow: hidden; }
/* the lockup is 3542x980; its mark occupies x 62..975 — essentially square, so
   the window is square too. A narrower window clips the Q into a C. */
.brand-logo { width: 22px; height: 22px; object-fit: cover; object-position: left center; flex: 0 0 auto; }
.sb-id { min-width: 0; display: flex; flex-direction: column; gap: 1px; overflow: hidden; }
.brand-sep { color: var(--rail-ink-dim); }
.brand-name { font-size: var(--fs-body); font-weight: 700; color: var(--rail-ink);
  letter-spacing: -0.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.brand-sub { font-size: var(--fs-small); font-weight: 500; color: var(--rail-ink-dim);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sb-toggle { position: absolute; top: 16px; right: 8px; width: 26px; height: 26px;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: inherit; font-size: var(--fs-title); line-height: 1; color: var(--rail-ink-dim);
  background: none; border: 1px solid transparent; border-radius: var(--r-box); cursor: pointer; }
.sb-toggle:hover { background: var(--rail-hover); color: var(--rail-ink); }
.sb-chev { display: block; transform: translateY(-1px); }

/* -- zone 2: the groups. Seven items never scroll (§1) ------------------- */
.sb-nav { min-height: 0; overflow-y: auto; overflow-x: hidden; padding: 0 10px; }
.sb-group { display: flex; flex-direction: column; gap: 2px; }
/* the group label is TEXT (NV-9): uppercase, smallest step, letter-spaced,
   the rail's muted ink — 20px above, 6px below */
.sb-group-label { font-size: var(--fs-small); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.08em; color: var(--rail-ink-dim); padding: 0 10px; margin: 20px 0 6px; }

/* -- zone 3: the items — icon and label, always both when expanded ------- */
.nav-item { position: relative; display: flex; align-items: center; gap: 12px; width: 100%;
  height: 40px; text-align: left; font-family: inherit; font-size: var(--fs-body); font-weight: 600;
  color: var(--rail-ink-dim); background: none; border: none; border-radius: var(--r-box);
  padding: 0 10px 0 10px; cursor: pointer; }
.nav-item:hover { background: var(--rail-hover); color: var(--rail-ink); }
/* the active row is FILLED and MARKED — a gold rule down its leading edge, the
   icon in the same gold, the label at full strength */
.nav-item.active { color: var(--rail-ink); background: var(--rail-raised); font-weight: 700; }
.nav-item.active::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px;
  border-top-left-radius: var(--r-box); border-bottom-left-radius: var(--r-box);
  background: var(--accent); }
.nav-item.active .nav-ico { color: var(--accent); }
.nav-item:focus-visible, .sb-toggle:focus-visible, .acct-chip:focus-visible, .acct-item:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 2px; }
.nav-ico { flex: 0 0 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; color: currentColor; }
.nav-label { flex: 1 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* on a dark ground a navy badge disappears; it takes the gold and dark ink */
.nav-badge { flex: 0 0 auto; display: inline-block; min-width: 18px; text-align: center;
  font-size: var(--fs-small); font-weight: 700; color: var(--card); background: var(--accent);
  border-radius: var(--r-pill); padding: 1px 6px; white-space: nowrap; }

/* -- collapsed: icons only; labels to tooltips, group labels to rules ----- */
.sidebar[data-collapsed="true"] .brand-name,
.sidebar[data-collapsed="true"] .brand-sub,
.sidebar[data-collapsed="true"] .nav-label,
.sidebar[data-collapsed="true"] .acct-id,
.sidebar[data-collapsed="true"] .acct-chip .caret { display: none; }
.sidebar[data-collapsed="true"] .sb-top { padding: 14px 8px 12px; justify-content: center; }
.sidebar[data-collapsed="true"] .sb-brand { flex: 0 0 auto; overflow: visible; }
.sidebar[data-collapsed="true"] .brand { justify-content: center; gap: 0; }
.sidebar[data-collapsed="true"] .sb-toggle { position: static; margin: 6px auto 0; }
.sidebar[data-collapsed="true"] .sb-nav { padding: 0 12px; }
/* the group label keeps its position and becomes a short rule */
.sidebar[data-collapsed="true"] .sb-group-label { text-indent: 100%; overflow: hidden;
  height: 1px; padding: 0; margin: 20px auto 10px; background: var(--rail-rule); }
.sidebar[data-collapsed="true"] .nav-item { justify-content: center; padding: 0; gap: 0; }
.sidebar[data-collapsed="true"] .nav-item.active::before { top: 6px; bottom: 6px; }
.sidebar[data-collapsed="true"] .nav-badge { position: absolute; top: 6px; right: 8px;
  min-width: 8px; width: 8px; height: 8px; padding: 0; overflow: hidden; text-indent: 100%; }
.sidebar[data-collapsed="true"] .acct-chip { justify-content: center; padding: 0; height: 40px; }
.sidebar[data-collapsed="true"] .acct-menu { left: 8px; right: auto; }

/* -- zone 4: the account block, bottom-anchored -------------------------- */
.acct { position: relative; }
/* §6.4 — the account block is the rail's floor and never clips (VT-9): it is
   flex-shrink 0 with its own room, and the NAV above it is what scrolls when
   the viewport is short. */
.sb-acct { border-top: 1px solid var(--rail-rule); padding: 10px; }
.acct-chip { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 48px;
  font-family: inherit; font-size: var(--fs-body); font-weight: 600; color: var(--rail-ink);
  background: none; border: 1px solid transparent; border-radius: var(--r-box);
  padding: 0 8px; cursor: pointer; }
.acct-chip:hover { background: var(--rail-hover); }
/* initials in a disc, the sibling rail's account shape */
.acct-avatar { flex: 0 0 32px; width: 32px; height: 32px; border-radius: var(--r-pill);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: var(--fs-small); font-weight: 700; letter-spacing: 0.02em;
  color: var(--navy-deep); background: var(--accent); }
.acct-id { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 1px; text-align: left; overflow: hidden; }
.acct-chip #acctLabel { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.acct-org { font-size: var(--fs-small); font-weight: 500; color: var(--rail-ink-dim);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.acct-chip .caret { flex: 0 0 auto; color: var(--rail-ink-dim); font-size: var(--fs-small); }
.acct-menu { position: absolute; left: 10px; right: 10px; bottom: calc(100% + 2px); z-index: 30; background: var(--card);
  border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); box-shadow: var(--shadow); min-width: 190px; overflow: hidden; }
.acct-menu-head { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-55); padding: 10px 14px 4px; }
.acct-item { display: block; width: 100%; text-align: left; background: none; border: none; font-family: inherit;
  font-size: var(--fs-body); color: var(--ink); padding: 10px 14px; cursor: pointer; }
.acct-item:hover { background: var(--paper-alt); }
.footer { display: flex; align-items: center; min-height: 56px; margin-top: auto; border-top: 1px solid var(--rule-dark);
  color: var(--ink-55); font-size: var(--fs-small); }
.footer .shell { justify-content: center; }
.footer .dot { margin: 0 8px; }
.wrap { flex: 1 0 auto; width: 100%; max-width: none; margin: 0; padding: 24px 32px 56px; }
/* ── end sidebar navigation ─────────────────────────────────────────────── */

/* ── CONSOLE HEADER ──────────────────────────────────────────────────────────
   A 56px bar across the CONTENT area — to the right of the rail, never above
   it. Breadcrumb left at 24px from the content edge; search, bell and help
   right, 16px apart. Same rule as the rail: no new colour, no new type size,
   no new radius (gate HD-13).
   ------------------------------------------------------------------------ */
.hd { position: sticky; top: 0; z-index: 35; flex: 0 0 auto; display: flex; align-items: center;
  gap: 16px; height: 56px; padding: 0 32px; background: var(--paper);
  border-bottom: 1px solid var(--rule-dark); }
.hd-crumb { display: flex; align-items: center; gap: 10px; min-width: 0; font-size: var(--fs-body); }
.hd-crumb-product { color: var(--ink-55); white-space: nowrap; }
.hd-crumb-sep { display: inline-block; width: 1px; height: 14px; background: var(--rule-dark-strong); }
.hd-crumb-surface { color: var(--ink); font-weight: 600; white-space: nowrap; }
.hd-right { display: flex; align-items: center; gap: 16px; margin-left: auto; }

.hd-search { position: relative; display: flex; align-items: center; width: 320px; }
.hd-search-ico { position: absolute; left: 10px; display: inline-flex; color: var(--ink-55); pointer-events: none; }
.hd-search-input { width: 100%; height: 34px; font-family: inherit; font-size: var(--fs-body); color: var(--ink);
  background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  padding: 0 46px 0 32px; }
.hd-search-input::placeholder { color: var(--ink-55); }
.hd-search-input:focus-visible, .hd-icon-btn:focus-visible, .hd-hit:focus-visible, .hd-notif-row:focus-visible {
  outline: 2px solid var(--primary); outline-offset: 2px; }
.hd-kbd { position: absolute; right: 8px; font-size: var(--fs-small); font-weight: 600; color: var(--ink-55);
  background: var(--paper-alt); border: 1px solid var(--rule-dark); border-radius: var(--r-box);
  padding: 1px 6px; pointer-events: none; }

.hd-results { position: absolute; top: calc(100% + 6px); right: 0; width: 420px; max-height: 60vh; overflow-y: auto;
  z-index: 45; background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  box-shadow: var(--shadow); padding: 6px; }
.hd-group + .hd-group { border-top: 1px solid var(--rule-dark); margin-top: 4px; padding-top: 4px; }
.hd-group-label { font-size: var(--fs-small); font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em;
  color: var(--ink-55); padding: 6px 8px 4px; }
.hd-hit { display: flex; flex-direction: column; align-items: flex-start; gap: 1px; width: 100%; text-align: left;
  font-family: inherit; background: none; border: none; border-radius: var(--r-box); padding: 6px 8px; cursor: pointer; }
.hd-hit:hover { background: var(--paper-alt); }
.hd-hit.active { background: var(--navy-tint); }
.hd-hit-id { font-size: var(--fs-body); font-weight: 600; color: var(--ink); }
.hd-hit-ctx { font-size: var(--fs-small); color: var(--ink-70); }
.hd-results-foot { padding: 6px 8px 2px; border-top: 1px solid var(--rule-dark); margin-top: 4px; }
.hd-empty { font-size: var(--fs-body); color: var(--ink-70); padding: 12px 10px; }

.hd-icon-btn { position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; color: var(--ink-70); background: none;
  border: 1px solid transparent; border-radius: var(--r-box); cursor: pointer; }
.hd-icon-btn:hover { background: var(--paper-alt); color: var(--ink); }
.hd-bell-count { position: absolute; top: -3px; right: -4px; min-width: 18px; font-size: var(--fs-small);
  font-weight: 700; color: var(--card); background: var(--navy); border-radius: var(--r-pill); padding: 1px 5px; }
.hd-bellwrap, .hd-helpwrap { position: relative; }
.hd-panel { position: absolute; top: calc(100% + 6px); right: 0; z-index: 45; width: 340px;
  background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  box-shadow: var(--shadow); padding: 6px; }
.hd-panel-head { font-size: var(--fs-small); font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em;
  color: var(--ink-55); padding: 8px 10px 6px; }
.hd-notif-row { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; font-family: inherit;
  font-size: var(--fs-body); color: var(--ink); background: none; border: none; border-radius: var(--r-box);
  padding: 8px 10px; cursor: pointer; }
.hd-notif-row:hover { background: var(--paper-alt); }
.hd-notif-n { flex: 0 0 auto; min-width: 22px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--primary); }
.hd-notif-what { flex: 1 1 auto; }
.hd-notif-go { flex: 0 0 auto; color: var(--ink-55); }
.hd-allclear { font-size: var(--fs-body); color: var(--ink-70); padding: 8px 10px 12px; }
.hd-help { width: 300px; }
.hd-shortcut { display: flex; align-items: baseline; gap: 12px; padding: 6px 10px; font-size: var(--fs-body); }
.hd-key { flex: 0 0 62px; font-family: var(--mono); font-size: var(--fs-small); color: var(--ink);
  background: var(--paper-alt); border: 1px solid var(--rule-dark); border-radius: var(--r-box); padding: 2px 6px; text-align: center; }
.hd-what { color: var(--ink-70); }
/* ── end console header ─────────────────────────────────────────────────── */

/* -- buttons ------------------------------------------------------------- */
.btn { font-family: inherit; cursor: pointer; }
.btn-primary { background: var(--navy); color: var(--ink-inverse); border: none; border-radius: var(--r-box); height: 40px; padding: 0 18px; font-weight: 700; font-size: var(--fs-body); }
.btn-primary:hover { background: var(--navy-mid); }
.btn-primary:disabled { opacity: 0.55; cursor: default; }
.btn-outline { background: var(--card); color: var(--navy); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); height: 40px; padding: 0 16px; font-weight: 600; font-size: var(--fs-body); }
.btn-outline:hover { border-color: var(--primary); background: var(--paper-alt); }
.btn-ghost { background: none; color: var(--ink-70); border: 1px solid transparent; border-radius: var(--r-box); height: 40px; padding: 0 12px; font-weight: 600; font-size: var(--fs-body); }
.btn-ghost:hover { color: var(--navy); background: var(--paper-alt); }
/* THE size ladder, and the only one. Three steps, declared once. It was four
   overlapping declarations: .btn-sm twice (34px here, 30px 400 lines down —
   the second silently won), .btn.sm at 32px under a second name, .btn-xs at
   28px. Any control that needs "smaller" picks a step; none invents one. */
.btn-sm, .btn.sm { height: 30px; padding: 0 10px; font-size: var(--fs-small); border-radius: var(--r-box); }
.btn-xs { height: 28px; padding: 0 10px; font-size: var(--fs-small); border-radius: var(--r-box); }

/* -- queue head + filters ------------------------------------------------ */
.q-head { margin-bottom: 16px; }
.q-title { font-size: var(--fs-x); font-weight: 700; letter-spacing: -0.015em; color: var(--ink); margin: 0 0 6px; }
.q-sub { font-size: var(--fs-body); color: var(--ink-70); margin: 0; max-width: 70ch; line-height: 1.5; }
/* ---- THE tab strip (one implementation, every surface) -------------------
   Queue filters, Capacity sub-tabs and the Reports axis selectors are the
   same affordance — pick one view of one set — and were three separate
   implementations. They are now one: .ui-tabs / .ui-tab / .ui-tab-count.
   .qfilters/.qfilter and .cap-subs/.cap-sub remain as aliases ONLY so older
   selectors keep resolving; no rule of their own survives. */
.ui-tabs, .qfilters, .cap-subs { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 14px;
  border-bottom: 1px solid var(--rule-dark); }
.ui-tab, .qfilter, .cap-sub { font-family: inherit; font-size: var(--fs-body); font-weight: 600;
  color: var(--ink-70); background: none; border: none; border-bottom: 2px solid transparent;
  padding: 8px 10px 10px; cursor: pointer; margin-bottom: -1px; }
.ui-tab:hover, .qfilter:hover, .cap-sub:hover { color: var(--ink); }
.ui-tab.active, .qfilter.active, .cap-sub.active { color: var(--navy); border-bottom-color: var(--navy); }
.ui-tab:focus-visible, .qfilter:focus-visible, .cap-sub:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.ui-tab-count, .qf-count { display: inline-block; min-width: 16px; text-align: center; font-size: var(--fs-small);
  font-weight: 700; color: var(--ink-70); background: var(--paper-alt); border-radius: var(--r-pill); padding: 0 6px; margin-left: 2px; }
.ui-tab.active .ui-tab-count, .qfilter.active .qf-count { color: var(--card); background: var(--navy); }

/* -- queue table --------------------------------------------------------- */
.q-scroll { overflow-x: auto; }
/* SIX columns max, table-layout fixed so the table can never exceed its
   container (no horizontal scroll). Text truncates inside cells; numbers never. */
.q-table { table-layout: fixed; width: 100%; max-width: 100%; border-collapse: collapse; font-size: var(--fs-body); table-layout: fixed; }
.q-table th { text-align: left; font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-55);
  border-bottom: 1px solid var(--rule-dark-strong); padding: 8px 12px; white-space: nowrap; }
.q-table td { padding: 12px; border-bottom: 1px solid var(--rule-dark); vertical-align: top; overflow: hidden; }
.q-row { cursor: pointer; }
.q-row:hover { background: var(--paper-alt); }
.q-row:focus-visible { outline: 2px solid var(--navy); outline-offset: -2px; }
.q-row.q-withdrawn { opacity: 0.5; }
.q-table .lane { font-weight: 600; }

/* fixed column budget (main queue: 5 cols + clickable row) */
/* FLUID (§3) — extra width goes to the TEXT columns, never the numeric ones.
   Customer and Lane carry no width and absorb whatever the viewport gives;
   the deadline chip, the money column and the band/suggestion chips keep a
   fixed width so the figures stay right-aligned and scannable down the column
   at any viewport (FL-4). Truncation stays on the text columns only. */
.q-table .q-decide  { width: 200px; }   /* trimmed with LC-8 so CUSTOMER keeps a readable column at 1280 */
.q-table .q-cust    { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* LC-7/LC-8 — a lane is an IDENTIFIER: fixed width that fits it, no
   ellipsis. The customer column is the free-text one and truncates last. */
.q-table .q-lane    { width: 200px; overflow: hidden; text-overflow: clip; white-space: nowrap; }
.q-table .q-offers  { width: 215px; }   /* LC-8: narrowed so the lane never truncates */
.q-table .q-bandsug { width: 215px; }   /* trimmed with LC-8 — see .q-decide */
/* Needs-action manual selection: a 6th (checkbox) column; others give up a little */
/* -- single triage bar (chips name each pile; the modal explains it) ------ */
.triage-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0 0 16px; }
.tchip { font-family: inherit; font-size: var(--fs-body); font-weight: 600; height: 36px; padding: 0 14px; border-radius: var(--r-pill);
  border: 1px solid transparent; cursor: pointer; display: inline-flex; align-items: center; gap: 3px; }
.tchip-fig { font-weight: 400; font-variant-numeric: tabular-nums; }
.tchip-approve { color: var(--teal); background: var(--teal-tint); border-color: var(--teal); }
.tchip-decline { color: var(--danger-ink); background: var(--danger-tint); border-color: var(--danger-line); }
.tchip-manager { color: var(--gold-ink); background: var(--gold-tint); border-color: var(--gold-ink); }
.tchip-counter { color: var(--ink-70); background: var(--paper-alt); border-color: var(--rule-dark-strong); }
.tchip-lapsed { color: var(--danger-ink); background: var(--paper-alt); border-color: var(--danger-line); }
.tchip:hover { filter: brightness(0.97); }
/* uniform row height — every row two text lines max; breached rows match */
.q-table tbody .q-row { height: 72px; }
.q-table tbody td { vertical-align: middle; padding: 8px 12px; }
.q-bandsug .bs-band { margin-bottom: 3px; }
/* breached rows in the table: red left edge + SLA chip only — no buttons here */
/* A breached row is duplicated in the Act-now panel, which owns "act now"
   salience. In the table it keeps its SLA chip (the fact) but drops the red
   left border — one urgency treatment per request per screen. */
.q-breached td:first-child { box-shadow: none; }
.one-act { height: 32px; padding: 0 12px; width: auto; font-size: var(--fs-body); font-weight: 600; flex: 0 0 auto; }
.dt-reason { font-size: var(--fs-body); margin-top: 4px; }

/* -- ZONE 1: the Act-now panel (bulk chips + urgent action rows) ---------- */
/* §3 — the exception panel is TINTED, one step off the page background, so it
   reads as a container of exceptions rather than another white card. */
.actnow { border: 1px solid var(--danger-edge); border-radius: var(--r-card); padding: 16px 18px; margin: 0 0 22px; background: var(--danger-wash); }
.actnow-head { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-55); font-weight: 700; margin-bottom: 12px; }
.actnow-group + .actnow-group { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--rule-dark-strong); }
/* the heading is a COUNT and a phrase at section-heading rank — not a caps label */
.actnow-grouphead { display: flex; align-items: baseline; gap: 7px;
  font-size: var(--fs-title); font-weight: 600; color: var(--ink); margin-bottom: 10px; }
.actnow-mark { color: var(--danger-line); font-size: var(--fs-body); }
.actnow-past .actnow-grouphead { color: var(--ink); }
.actnow-batches .actnow-grouphead { font-size: var(--fs-small); text-transform: uppercase;
  letter-spacing: 0.06em; font-weight: 700; }
.actnow-batches .actnow-grouphead { color: var(--ink-55); }
.actnow-groupnote { text-transform: none; letter-spacing: 0; font-weight: 500; color: var(--ink-55); }
.actnow .triage-bar { margin: 0; }
/* rows sit ON the tint as white cards, each with a severity bar down its
   leading edge and a chip in the same tone (VT-5) */
.actnow-rows { border-top: 0; display: flex; flex-direction: column; gap: 8px; }
.actnow-rows .actrow { background: var(--card); border: 1px solid var(--rule-dark);
  border-radius: var(--r-box); border-left: 3px solid var(--rule-dark-strong); }
.actrow-sev-past { border-left-color: var(--danger-line) !important; }
.actrow-sev-soon { border-left-color: var(--amber) !important; }
.actrow-sev-info { border-left-color: var(--navy) !important; }
.actrow-chip { flex: 0 0 auto; font-size: var(--fs-small); font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em; padding: 2px 9px;
  border-radius: var(--r-pill); color: var(--danger-ink); background: var(--danger-tint); }
.actrow-sev-soon .actrow-chip { color: var(--warn-ink); background: var(--warn-tint); }
.actrow-sev-info .actrow-chip { color: var(--primary); background: var(--navy-tint); }
.actrow { display: flex; align-items: center; gap: 12px; height: 48px; padding: 0 12px; }
.actrow:last-child { border-bottom: none; }
.actrow-late { flex: 0 0 auto; font-size: var(--fs-small); font-weight: 700; color: var(--danger, var(--danger-deep)); background: var(--danger-bg, var(--error-bg)); border-radius: var(--r-pill); padding: 2px 10px; white-space: nowrap; }
.actrow-meta { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-body); display: flex; gap: 8px; align-items: baseline; }
.actrow-cust { font-weight: 600; color: var(--ink); }
.actrow-lane { }
.actrow-fig { white-space: nowrap; }
.actrow-act { flex: 0 0 auto; }
.actrow-more { flex: 0 0 auto; cursor: pointer; color: var(--ink-55); font-weight: 700; padding: 0 8px; border-radius: var(--r-box); letter-spacing: 1px; }
.actrow-more:hover { color: var(--navy); background: var(--paper-alt); }

.q-check-cell { width: 40px; text-align: center; }
/* the checkbox column is 40px; the fixed columns do not change with it, so
   only the text columns give up the space */
.q-table.q-selectable .q-decide { width: 200px; }   /* LC-8 trim */
.q-table.q-selectable .q-offers { width: 215px; }   /* LC-8 */
.q-table td.q-check-cell { vertical-align: middle; overflow: visible; }
.q-row.co-sel { background: var(--navy-tint); }
.q-selbar { margin: 0 0 12px; }
.cust-v { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* OFFERS cell: numbers never truncate; the % line may wrap */
.q-offers .off-their { white-space: normal; }
.q-offers .off-cur { margin-top: 3px; }
.q-offers .off-k { display: inline-block; width: 46px; color: var(--ink-55); font-size: var(--fs-small); }
.q-offers .mono { white-space: nowrap; }
.q-offers .off-pct { white-space: nowrap; }
/* BAND / SUGGESTION stacked */
.q-bandsug .bs-band { margin-bottom: 5px; }
.q-bandsug .bs-sug .rec { cursor: help; }
/* responsive triage: full prose ≥1280px, short form below */
.tri-short { display: none; }
@media (max-width: 1279px) {
  .tri-long { display: none; }
  .tri-short { display: inline; }
}
.mono { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.muted { color: var(--ink-55); }
.nowrap { white-space: nowrap; }
.sm { font-size: var(--fs-small); }
.neg { color: var(--red); }
.q-empty, .ph { padding: 40px; text-align: center; color: var(--ink-55); background: var(--paper-alt);
  border: 1px dashed var(--rule-dark-strong); border-radius: var(--r-card); }
.ph { margin-top: 8px; }

/* -- chips --------------------------------------------------------------- */
/* THE chip geometry. Two semantic families exist — .chip (request state,
   band, triage) and .cchip (the standing-state enum) — and they were drawn at
   different weights and paddings, so the same idea read as two. One geometry
   now; the families differ only in what they mean. */
.chip, .cchip { display: inline-block; font-size: var(--fs-small); font-weight: 700;
  padding: 2px 9px; border-radius: var(--r-pill); white-space: nowrap; }
.band-analyst { color: var(--primary); background: var(--navy-tint); }
.band-manager { color: var(--gold-ink); background: var(--gold-tint); }
.st-pending { color: var(--navy-mid); background: var(--navy-tint); }
.st-awaiting { color: var(--gold-ink); background: var(--gold-tint); }
.st-approved { color: var(--teal); background: var(--teal-tint); }
.st-declined { color: var(--danger-ink); background: var(--danger-tint); }
.st-withdrawn { color: var(--ink-55); background: var(--paper-alt); }
.st-lapsed { color: var(--danger-ink); background: var(--danger-tint); }
.st-auto { color: var(--teal); background: var(--teal-tint); }

/* intelligent-triage chip */
.q-triage { white-space: nowrap; }
.triage { display: inline-block; font-size: var(--fs-small); font-weight: 600; padding: 3px 10px; border-radius: var(--r-pill); white-space: nowrap; }
.triage-normal { color: var(--ink-70); background: var(--paper-alt); }
.triage-amber { color: var(--gold-ink); background: var(--gold-tint); }
.triage-red { color: var(--danger-ink); background: var(--danger-tint); }

/* recommendation chip */
.rec { display: inline-block; font-size: var(--fs-small); font-weight: 700; padding: 3px 10px; border-radius: var(--r-pill); white-space: nowrap; cursor: help; }
.rec-approve { color: var(--teal); background: var(--teal-tint); }
.rec-counter { color: var(--primary); background: var(--navy-tint); }
.rec-decline { color: var(--danger-ink); background: var(--danger-tint); }
.dt-rec { background: var(--paper-alt); border: 1px solid var(--rule-dark); border-radius: var(--r-box); padding: 12px 14px; margin-bottom: 12px; }
.dt-rec-why { font-size: var(--fs-small); margin-top: 6px; }
.dt-rec-note { margin-top: 6px; }

/* -- detail modal -------------------------------------------------------- */
.modal-scrim { position: fixed; inset: 0; z-index: 60; background: var(--paper-scrim); display: flex; align-items: center; justify-content: center; padding: 24px; }
.modal-scrim[hidden] { display: none; }
.dt-modal { width: 100%; max-width: 560px; max-height: 88vh; background: var(--card); border-radius: var(--r-card); box-shadow: var(--shadow); display: flex; flex-direction: column; overflow: hidden; }
/* #detailBody wraps the detail content between .dt-modal and .dt-scroll — it must
   carry the flex column so the scroll region is bounded (else the body overflows
   the capped modal and clips, with nothing to scroll). */
#detailBody, #simBody, #cohortBody, #capBody { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
.sim-modal { max-width: 960px; }
.dt-head { flex: 0 0 auto; position: relative; padding: 20px 24px 14px; border-bottom: 1px solid var(--rule-dark); }
.dt-x { position: absolute; top: 14px; right: 16px; background: none; border: none; font-size: var(--fs-x); line-height: 1; color: var(--ink-55); cursor: pointer; }
.dt-x:hover { color: var(--ink); }
.dt-chips { display: flex; gap: 6px; margin-bottom: 10px; }
.dt-title { font-size: var(--fs-h2); font-weight: 700; color: var(--ink); margin: 0 0 4px; }
.dt-mono { font-family: var(--mono); font-size: var(--fs-small); }
.dt-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 4px 24px 24px; }
.dt-sec { padding: 16px 0; border-bottom: 1px solid var(--rule-dark); }
.dt-sec:last-child { border-bottom: none; }
/* THE overlay section heading — the same uppercase sub-rank .an-audith uses
   on a surface, so a detail modal reads as the same product as the page
   behind it. Declared once, both selectors on it. */
.dt-sec h3, .an-audith { font-size: var(--fs-small); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--ink-55); margin: 0 0 10px; }
.dt-kv { margin: 0; display: grid; gap: 7px; }
.kv { display: flex; justify-content: space-between; gap: 16px; font-size: var(--fs-body); }
.kv dt { color: var(--ink-70); } .kv dd { margin: 0; color: var(--ink); text-align: right; }
.dt-flights { margin-bottom: 10px; display: grid; gap: 4px; }
.dt-cw { font-size: var(--fs-small); margin-bottom: 8px; }
.dt-leg { font-size: var(--fs-body); } .dt-fno { font-weight: 600; }
.dt-sub { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-55); margin: 12px 0 6px; }
.dt-last { list-style: none; margin: 0; padding: 0; display: grid; gap: 5px; font-size: var(--fs-body); }
.dt-last .dt-out { font-weight: 600; }
.dt-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.dt-await { color: var(--gold-ink); }
.dt-form { margin-top: 14px; display: grid; gap: 6px; background: var(--paper-alt); border: 1px solid var(--rule-dark); border-radius: var(--r-box); padding: 14px; }
.dt-form label { font-size: var(--fs-small); font-weight: 600; color: var(--ink-70); }
.dt-form input { height: 38px; padding: 0 12px; font-family: inherit; font-size: var(--fs-body); color: var(--ink); background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); }
.dt-form input:focus { outline: none; border-color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.dt-form-row { margin-top: 4px; }
.dt-err { color: var(--red); font-size: var(--fs-body); font-weight: 600; }

/* audit trail */
.au-trail { display: grid; gap: 6px; }
.au-row { display: grid; grid-template-columns: 1fr auto; gap: 2px 12px; font-size: var(--fs-body); align-items: baseline; }
.au-ev { font-weight: 600; color: var(--ink); }
.au-by { color: var(--ink-70); font-size: var(--fs-small); }
.au-at { grid-column: 1 / -1; color: var(--ink-55); font-size: var(--fs-small); }

/* -- reused charge table (whyPanel from the customer render) -------------- */
.why-body { font-size: var(--fs-body); }
.why-body > p { margin: 0 0 10px; color: var(--ink-70); }
.why-charges { border: 1px solid var(--rule-dark); border-radius: var(--r-box); overflow: hidden; margin-bottom: 10px; }
.why-row { display: flex; justify-content: space-between; gap: 16px; padding: 8px 12px; border-bottom: 1px solid var(--rule-dark); }
.why-row:last-child { border-bottom: none; }
.why-row span:last-child { font-family: var(--mono); white-space: nowrap; }
.why-row.total { font-weight: 700; background: var(--paper-alt); }
.why-basis { font-family: var(--mono); font-size: var(--fs-small); color: var(--ink-55); margin-left: 4px; }
.why-ref { font-family: var(--mono); font-size: var(--fs-small); color: var(--ink-55); }
.why-cap, .why-conf { font-size: var(--fs-small); color: var(--ink-70); margin: 6px 0 0; }

/* -- monitor (#12) ------------------------------------------------------- */
.mon { margin-top: 26px; background: var(--card); border: 1px solid var(--rule-dark); border-radius: var(--r-card); box-shadow: var(--shadow); padding: 20px 22px; }
.mon-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.mon-head .strip-title { margin: 0; }   /* size/weight from .strip-title */
.mon-bar { display: flex; height: 34px; border-radius: var(--r-box); overflow: hidden; border: 1px solid var(--rule-dark); }
.mon-seg { display: flex; align-items: center; justify-content: center; font-size: var(--fs-small); font-weight: 700; color: var(--ink-inverse); }
.mon-auto { background: var(--teal); } .mon-manual { background: var(--navy); }
.mon-legend { display: flex; gap: 18px; margin-top: 8px; font-size: var(--fs-small); color: var(--ink-70); }
.dot { display: inline-block; width: 9px; height: 9px; border-radius: var(--r-dot); margin-right: 6px; vertical-align: middle; }
.dot-auto { background: var(--teal); } .dot-manual { background: var(--navy); }
.mon-funnel { display: flex; gap: 12px; margin-top: 16px; }
.mstat { flex: 1; background: var(--paper-alt); border-radius: var(--r-box); padding: 12px 14px; }
.mstat-n { font-size: var(--fs-h1); font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }
.mstat-l { font-size: var(--fs-small); font-weight: 600; color: var(--ink-55); text-transform: uppercase; letter-spacing: 0.04em; margin-top: 4px; }
.mon-sug-wrap { margin-top: 18px; border-top: 1px solid var(--rule-dark); padding-top: 14px; }
.mon-sug-wrap .an-audith { margin: 0 0 10px; }   /* the shared sub-heading */
.pos { color: var(--teal); }

/* rule editor */
.mon-rule-row { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.mon-rule-row label { font-size: var(--fs-body); color: var(--ink); font-weight: 600; }
.mon-threshold { width: 74px; height: 38px; padding: 0 10px; font-family: inherit; font-size: var(--fs-body); font-variant-numeric: tabular-nums;
  color: var(--ink); background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); }
.mon-threshold:focus { outline: none; border-color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.mon-unit { font-size: var(--fs-body); color: var(--ink-70); }
.mon-chip { display: inline-flex; align-items: center; gap: 6px; margin-left: 6px; font-size: var(--fs-small); color: var(--ink);
  background: var(--navy-tint); border-radius: var(--r-pill); padding: 4px 6px 4px 12px; }

.mon-rule-actions { display: flex; gap: 8px; margin-top: 12px; }
.mon-floor { margin-top: 8px; }
.mon-msg { min-height: 18px; margin-top: 8px; font-size: var(--fs-body); font-weight: 600; }
.mon-msg.err { color: var(--red); }
.mon-msg.ok { color: var(--teal); }
.mon-last { margin-top: 8px; }

/* simulation modal */
.sim-summary { display: flex; flex-wrap: wrap; gap: 8px 22px; padding: 14px 0 16px; border-bottom: 1px solid var(--rule-dark); font-size: var(--fs-body); color: var(--ink); }
.sim-summary b { font-variant-numeric: tabular-nums; }
.sim-table-wrap { overflow-x: auto; margin-top: 8px; }
.sim-table { width: 100%; border-collapse: collapse; font-size: var(--fs-body); }
.sim-table th { text-align: left; font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-55);
  border-bottom: 1px solid var(--rule-dark-strong); padding: 8px 8px; white-space: nowrap; }
.sim-table td { padding: 9px 8px; border-bottom: 1px solid var(--rule-dark); vertical-align: top; }
.sim-table td.mono { white-space: nowrap; }
.sim-sortable { cursor: pointer; user-select: none; }
.sim-sortable:hover { color: var(--navy); }
.sim-arrow { color: var(--navy); }
.sim-rid { font-size: var(--fs-small); margin-top: 2px; }
.sim-auto { color: var(--teal); background: var(--teal-tint); }
.sim-manual { color: var(--ink-70); background: var(--paper-alt); }
.sim-delta { white-space: nowrap; text-align: right; }

/* -- cohort suggestion (approvable batch) -------------------------------- */
/* fixed vertical rhythm for the stacked strips: 24px between blocks, 32px before
   the table header. The flex gap owns all spacing, so blocks carry no margin. */
.q-pre { display: flex; flex-direction: column; gap: 24px; margin: 0 0 32px; }
.q-pre > * { margin: 0 !important; }
.cohort { display: flex; align-items: center; gap: 16px; margin: 0; padding: 14px 16px;
  background: var(--teal-tint); border: 1px solid var(--teal); border-radius: var(--r-card); }
/* per-kind strip tints (approve teal · decline red · manager gold · counter neutral) */
.cohort-approve { background: var(--teal-tint); border-color: var(--teal); }
.cohort-decline { background: var(--danger-wash); border-color: var(--danger-line); }
.cohort-manager { background: var(--gold-tint); border-color: var(--gold-ink); }
.cohort-counter { background: var(--paper-alt); border-color: var(--rule-dark); }
.cohort-txt { flex: 1 1 auto; }
.cohort-txt b { color: var(--ink); }
.cohort-sub { margin-top: 4px; }
.cohort-review { flex: 0 0 auto; width: auto; }
.cohort-wide { max-width: 1120px; }
.co-table th, .co-table td { vertical-align: middle; }
.co-table .co-pol, .co-table .co-fm { white-space: nowrap; }
.co-rid { font-size: var(--fs-small); margin-top: 2px; }
/* screening-evidence columns */
.co-fm, .co-pol { font-size: var(--fs-small); white-space: nowrap; }
.fm-ok { color: var(--teal); font-weight: 600; }
.fm-below { color: var(--danger-ink); font-weight: 700; }
.pol-auto { color: var(--teal); font-weight: 600; }
.pol-manual { }
.co-below { background: var(--danger-wash); }
.co-reason { margin-top: 4px; }
.co-toggle.disabled { border-color: var(--danger-edge); background: var(--danger-tint); color: var(--danger-ink); cursor: not-allowed; }
/* batch summary strip (recomputes on toggle) + threshold sim */
.co-summary { display: flex; flex-wrap: wrap; gap: 6px 22px; padding: 4px 0 12px; font-size: var(--fs-body); color: var(--ink); }
.co-summary b { font-variant-numeric: tabular-nums; }
/* BF-3/BF-4: the batch RESULT view — partial failure stated, failed rows listed */
.bf-done { font-weight: 600; }
.bf-failhead { padding: 10px 0 6px; font-size: var(--fs-body); font-weight: 600; color: var(--amber); }
.bf-list { border-top: 1px solid var(--line); }
.bf-row { display: flex; gap: 18px; padding: 8px 0; border-bottom: 1px solid var(--line); font-size: var(--fs-body); }
.bf-id { min-width: 220px; font-variant-numeric: tabular-nums; }
.bf-reason { color: var(--muted); }
.bf-ex { padding-top: 8px; }
/* stage D — anomalies + exceptions on the Monitor; lineage table */
.mon-sec { margin-top: 26px; }
.mon-sec .badge { margin-left: 8px; }
.an-row { display: flex; align-items: center; gap: 10px; padding: 9px 4px; border-bottom: 1px solid var(--line); cursor: pointer; font-size: var(--fs-body); }
.an-row:hover { background: var(--paper-alt); }
.an-row.an-open { background: var(--paper-alt); }
.an-det { font-size: var(--fs-small); color: var(--muted); min-width: 150px; font-variant-numeric: tabular-nums; }
.an-title { flex: 1; }
.an-detail { padding: 12px 16px 16px; border-bottom: 1px solid var(--line); background: var(--paper-alt); }
.an-line { display: flex; gap: 14px; padding: 3px 0; font-size: var(--fs-body); }
.an-label { min-width: 130px; color: var(--muted); }
.an-actions { display: flex; align-items: center; gap: 10px; padding-top: 12px; flex-wrap: wrap; }
.an-dismiss { display: inline-flex; gap: 6px; align-items: center; }
.an-dismiss .co-note { width: 260px; }
.an-audith { margin: 14px 0 6px; }   /* type from the shared sub-heading rule */
.ln-table .ln-hop { font-weight: 600; white-space: nowrap; }
.ln-table .ln-ref { font-variant-numeric: tabular-nums; white-space: nowrap; }
.q-anomaly { cursor: pointer; border: 0; }
/* multi-select: checkboxes, selection bar, in-bar rate editor, moved badges */
.co-check, .co-checkall { width: 16px; height: 16px; cursor: pointer; accent-color: var(--navy); }
.co-checkall-h { width: 40px; }
.co-row.co-sel { background: var(--navy-tint); }
.co-selbar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; padding: 10px 12px; margin: 4px 0 8px;
  background: var(--navy-tint); border: 1px solid var(--navy); border-radius: var(--r-box); }
.co-selcount { font-size: var(--fs-body); color: var(--ink); margin-right: 4px; }
.co-selcount b { font-variant-numeric: tabular-nums; }
.co-selall-total { font-family: inherit; font-size: var(--fs-body); font-weight: 600; color: var(--navy);
  background: none; border: none; text-decoration: underline; cursor: pointer; margin-right: 4px; }
.co-editrate { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; width: 100%; margin-top: 4px;
  padding-top: 10px; border-top: 1px dashed var(--rule-dark); }
.co-editrate label { font-size: var(--fs-body); color: var(--ink-70); display: inline-flex; align-items: center; gap: 4px; }
.co-editrate-val { width: 100px; height: 34px; padding: 0 8px; border: 1px solid var(--rule-dark-strong);
  border-radius: var(--r-box); font-family: inherit; font-size: var(--fs-body); font-variant-numeric: tabular-nums; }
.co-moved { display: inline-block; font-size: var(--fs-small); font-weight: 700; padding: 1px 8px; border-radius: var(--r-pill); margin-left: 4px; }
.co-moved-decline { color: var(--danger-ink); background: var(--danger-tint); }
.co-moved-manager { color: var(--gold-ink); background: var(--gold-tint); }
.co-moved-approve { color: var(--teal); background: var(--teal-tint); }
.co-rate-err { margin-top: 3px; }
.co-sim { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; padding: 10px 0 14px; border-top: 1px solid var(--rule-dark);
  border-bottom: 1px solid var(--rule-dark); margin-bottom: 8px; }
.co-sim label { font-size: var(--fs-body); color: var(--ink-70); }
.co-threshold { width: 68px; height: 30px; padding: 0 8px; border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  font-family: inherit; font-size: var(--fs-body); font-variant-numeric: tabular-nums; }
.co-sim .btn { width: auto; flex: 0 0 auto; }
.co-unit { font-size: var(--fs-body); color: var(--ink-55); }
.co-sim-note { margin-left: 4px; }
.co-toggle { font-size: var(--fs-small); font-weight: 600; padding: 4px 12px; border-radius: var(--r-pill); cursor: pointer;
  border: 1px solid var(--rule-dark); background: var(--paper-alt); color: var(--ink-55); }
.co-toggle.on { border-color: var(--teal); background: var(--teal-tint); color: var(--teal); }
.co-row.co-out { opacity: 0.5; }
.cohort-foot { flex: 0 0 auto; display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 16px 24px; border-top: 1px solid var(--rule-dark); background: var(--card); }
.cohort-foot-sum { font-size: var(--fs-body); color: var(--ink); }
.cohort-foot-sum b { font-variant-numeric: tabular-nums; }
.cohort-foot .btn { flex: 0 0 auto; width: auto; }
/* shared note (decline/manager) + per-row proposed rate (manager) */
.co-noterow { padding: 4px 0 12px; }
.co-noterow label { display: block; font-size: var(--fs-body); color: var(--ink-70); margin-bottom: 4px; }
.co-note { width: 100%; box-sizing: border-box; font-family: inherit; font-size: var(--fs-body); padding: 8px 10px;
  border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); resize: vertical; }
.co-rate-cell .co-rate { width: 96px; height: 30px; padding: 0 8px; border: 1px solid var(--rule-dark-strong);
  border-radius: var(--r-box); font-family: inherit; font-size: var(--fs-body); font-variant-numeric: tabular-nums; }
.co-open { font-family: inherit; font-size: var(--fs-small); font-weight: 600; color: var(--navy); background: none;
  border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); padding: 4px 12px; cursor: pointer; }
.co-open:hover { background: var(--paper-alt); }
.co-why { font-size: var(--fs-small); max-width: 260px; }

/* batch review modal (E1 release · E2 date series · E3 recommend) */
.co-chips { margin: 4px 0 12px; }
.tchip-on { box-shadow: inset 0 0 0 2px currentColor; }
.tchip-muted { color: var(--ink-55); background: var(--paper-alt); border-color: var(--rule-dark); cursor: default; }
.co-tablewrap { overflow-x: auto; margin: 0 0 4px; }
.co-row.co-excluded { opacity: 0.55; }
.co-exreason { font-size: var(--fs-small); color: var(--danger-ink); white-space: nowrap; }
.co-act { font-size: var(--fs-small); font-weight: 700; color: var(--ink-70); white-space: nowrap; }
.co-cell { width: 108px; height: 30px; padding: 0 8px; border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box);
  font-family: inherit; font-size: var(--fs-body); font-variant-numeric: tabular-nums; }
/* release cohort chips above the upcoming-releases list (E1 entry) */
.rel-chips { margin: 0 0 12px; }
.co-entry[disabled], .co-entry[aria-disabled="true"] { opacity: 0.5; cursor: default; }

/* Completed inner sub-filter row */
.qsubfilters { display: flex; gap: 4px; flex-wrap: wrap; margin: -4px 0 14px; }
.qsubfilter { font-family: inherit; font-size: var(--fs-small); font-weight: 600; color: var(--ink-70); background: var(--paper-alt);
  border: 1px solid var(--rule-dark); border-radius: var(--r-pill); padding: 4px 12px; cursor: pointer; }
.qsubfilter:hover { color: var(--ink); }
.qsubfilter.active { color: var(--ink-inverse); background: var(--navy); border-color: var(--navy); }
.qsubfilter .qf-count { color: inherit; background: none; }

/* Monitor: lapsed-cost panel */
.lp-total { font-size: var(--fs-body); color: var(--ink); margin: 4px 0 12px; }
.lp-total b { font-variant-numeric: tabular-nums; }
.lp-table { margin-top: 4px; }

/* -- breach handling: Late fast lane + Lapsed -------------------------- */
.late-strip { margin: 12px 0 4px; border: 1.5px solid var(--danger-line); border-radius: var(--r-card);
  background: var(--danger-wash); padding: 12px 14px 6px; }
.late-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; margin-bottom: 4px; }
/* strip title keeps only its accent colour — size/weight come from .strip-title */
.late-title { color: var(--danger-ink); margin: 0; }
/* every strip button is one height (36px) and one label size, primary or outline */
.cohort-review, .late-act, .co-selact { height: 36px; font-size: var(--fs-body); font-weight: 600; width: auto; flex: 0 0 auto; }
.late-sub { flex: 1 1 260px; }
.late-table { margin-top: 2px; }
.late-table thead th { color: var(--danger-ink); }
.late-table .q-decide { width: 16%; }
.late-table .q-cust { width: 12%; }
.late-table .q-lane { width: 15%; }
.late-table .q-offers { width: 19%; }
.late-table .lt-band { width: 12%; }
.late-table .lt-act { width: 26%; }
.late-row { cursor: pointer; }
.late-cell { white-space: normal; }
.late-actions { display: flex; gap: 6px; flex-wrap: wrap; }
.late-act { width: auto; flex: 0 0 auto; }
.late-await { display: inline-block; padding: 4px 0; }

/* the weekly lapsed-unanswered chip (lost revenue, surfaced not buried) */
.lapsed-chip { display: flex; align-items: center; gap: 14px; margin: 12px 0 4px; padding: 10px 14px;
  background: var(--paper-alt); border: 1px solid var(--rule-dark); border-left: 3px solid var(--danger-line); border-radius: var(--r-box); }
.lapsed-chip-txt { flex: 1 1 auto; font-size: var(--fs-body); }
.lapsed-chip .btn { flex: 0 0 auto; width: auto; }

/* a lapsed queue row + its cost line */
.q-lapsed { opacity: 0.72; }
.lapse-cost { color: var(--danger-ink); font-size: var(--fs-small); font-weight: 600; white-space: nowrap; }

/* ===========================================================================
 * Stage 2 — Capacity & Allocation. Uses the shared tokens + the --fs-* scale;
 * no raw px font-size. Tables reuse .q-table (table-layout:fixed, no h-scroll).
 * ======================================================================== */
.cap-view { }
.cap-viewhead { margin: 0 0 16px; }
/* Capacity's sub-tabs render through the ONE tab strip above. */
.q-head-act { margin-top: 10px; display: flex; gap: 8px; flex-wrap: wrap; }
.q-head-act .btn { width: auto; }
.cap-filters { display: flex; gap: 16px; margin: 0 0 14px; }
.cap-fl { font-size: var(--fs-small); color: var(--ink-70); display: inline-flex; flex-direction: column; gap: 4px; }
.cap-lane, .cap-date, .cap-filters select, .cap-filters input { font-family: inherit; font-size: var(--fs-body);
  padding: 6px 8px; border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); background: var(--card); color: var(--ink); }

/* flights table columns (5): flight · departs · load(segments) · available · release */
.cap-table { table-layout: fixed; }
.cap-table .cf-flt { width: 20%; } .cap-table .cf-date { width: 18%; }
.cap-table .cf-load { width: 34%; } .cap-table .cf-avail { width: 14%; } .cap-table .cf-rel { width: 14%; }
.cap-table tbody td { vertical-align: middle; padding: 10px 12px; }
.cap-row { cursor: pointer; }
.cap-partner { opacity: 0.7; cursor: default; }
.cf-daterow td { background: var(--paper-alt); font-size: var(--fs-small); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.05em; color: var(--ink-70); padding: 6px 12px; }

/* segmented capacity bar: sold · allotted · free */
.seg { display: flex; flex-direction: column; gap: 3px; }
.seg-track { display: flex; height: 9px; background: var(--paper-alt); border-radius: var(--r-pill); overflow: hidden; }
.seg-sold { background: var(--navy); } .seg-allot { background: var(--accent); } .seg-free { background: var(--ok-soft); }
.seg-label { font-size: var(--fs-small); font-weight: 600; color: var(--ink); }
.seg-label.nowrap { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* the sold/allot/free breakdown fits at desktop; below ~1200px the bar + LF carry
   it (the segments are the breakdown) so the label never wraps mid-value (A7). */
@media (max-width: 1200px) { .seg-breakdown { display: none; } }
.avail .mono { font-size: var(--fs-body); font-weight: 600; }

.seg-track.seg-over { box-shadow: inset 0 0 0 1px var(--danger-line); }

/* ONE console chip enum (B10/B-7) — standing state only, escalation darker never
   paler; no chip is clickable (the row opens the detail). Shared via ARender.stateChip. */
/* (.cchip's geometry is declared with .chip above — one rule, one look.) */
.cst-scheduled { color: var(--warn-ink); background: var(--warn-tint); }   /* attention */
.cst-expiring  { color: var(--warn-ink); background: var(--warn-tint); }
.cst-held      { color: var(--ink-70); background: var(--paper-alt); }
.cst-released  { color: var(--green); background: var(--ok-tint); }  /* calm */
.cst-active    { color: var(--green); background: var(--ok-tint); }
.cst-excluded  { color: var(--danger-ink); background: var(--danger-tint); }       /* terminal */
.cst-overbooked{ color: var(--danger-ink); background: var(--danger-tint); }
.cst-expired   { color: var(--ink-70); background: var(--paper-alt); }
.cst-partner   { color: var(--ink-70); background: var(--paper-alt); }

/* checkbox column + uniform two-line rows across Capacity (imported Queue grammar,
   B2/B3). Fixed height; content that does not fit truncates (full value in detail). */
.co-check-cell { width: 40px; text-align: center; vertical-align: middle; }
.cap-table.cap-selectable .cf-flt { width: 18%; }
.alloc-table.cap-selectable .al-acct { width: 18%; }
.cap-table tbody tr.co-tworow, .alloc-table tbody tr.co-tworow { height: 66px; }
.cap-table tbody .co-tworow td, .alloc-table tbody .co-tworow td { overflow: hidden; }
.co-sel { background: var(--navy-tint); }
.co-l1 { font-size: var(--fs-body); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.co-l2 { margin-top: 3px; }

/* exception strip (release decisions due before T−48) */
.exc-strip { border: 1px solid var(--warn-edge); background: var(--warn-tint); border-radius: var(--r-card); padding: 12px 16px; margin: 0 0 16px; }
.exc-head { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; font-weight: 700; color: var(--warn-ink); margin-bottom: 8px; }
.exc-row { display: flex; align-items: center; gap: 12px; padding: 6px 0; border-top: 1px solid var(--warn-edge); }
.exc-meta { flex: 1 1 auto; min-width: 0; font-size: var(--fs-body); }
.exc-act { flex: 0 0 auto; display: flex; gap: 6px; }
.exc-btn { height: 30px; padding: 0 12px; width: auto; }

/* adjust overlay: live impact line + review-affected */
/* §5.1 (redesign): the impact line is INFORMATION, not celebration — muted by
   default; only a real blocker earns colour. */
.cap-impact { font-size: var(--fs-body); color: var(--ink-70); border-radius: var(--r-box); padding: 8px 10px; margin: 4px 0; background: var(--paper-alt); }
.cap-impact-bad { color: var(--red); background: var(--danger-tint); }
.cap-review-affected { font-size: var(--fs-small); color: var(--ink-70); margin: 4px 0; }
.cap-reasontext { margin-top: 6px; }
.cap-horizon { align-self: flex-end; color: var(--ink-70); font-size: var(--fs-small); padding-bottom: 6px; }

/* utilisation meter (booked ÷ commitment) + its execution task */
.um { display: flex; flex-direction: column; gap: 3px; }
.um-track { position: relative; height: 8px; background: var(--paper-alt); border-radius: var(--r-pill); }
.um-fill { height: 100%; border-radius: var(--r-pill); }
.um-fill.um-healthy { background: var(--green); } .um-fill.um-amber { background: var(--amber); } .um-fill.um-red { background: var(--red); }
.um-track { overflow: visible; }
.um-target { position: absolute; top: -2px; width: 2px; height: 12px; background: var(--ink); opacity: 0.55; }
.um-target-label { position: absolute; top: 12px; transform: translateX(-50%); white-space: nowrap; font-size: var(--fs-small); }
.um { position: relative; padding-bottom: 14px; }
.um-label { font-size: var(--fs-small); font-weight: 600; color: var(--ink); }
.dt-lead { font-size: var(--fs-body); margin: 2px 0 0; }
.cap-partner-toggle { display: inline-flex; align-items: center; gap: 6px; align-self: flex-end; padding-bottom: 6px;
  font-size: var(--fs-small); color: var(--ink-70); cursor: pointer; }
.cap-partner-toggle input { accent-color: var(--navy); }
.um-task { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 8px; align-items: center;
  background: var(--paper-alt); border-radius: var(--r-box); padding: 8px 10px; }
.um-task-txt { font-size: var(--fs-small); color: var(--ink); font-weight: 600; }
.um-act { height: 30px; padding: 0 12px; }

/* allocation status chip */
.alloc-status { font-size: var(--fs-small); font-weight: 700; border-radius: var(--r-pill); padding: 2px 10px; white-space: nowrap; }
.alloc-status.st-active { color: var(--green); background: var(--ok-tint); }
.alloc-status.st-expiring { color: var(--warn-ink); background: var(--warn-tint); }
.alloc-status.st-expired { color: var(--ink-70); background: var(--paper-alt); }
/* AL-5/AL-6: one fact per column, no cell wraps at 1440. Numbers right,
   tabular; PERIOD carries its current instance as the muted second line. */
.alloc-table { table-layout: fixed; }
.alloc-table .al-acct { width: 13%; } .alloc-table .al-lane { width: 10%; }
.alloc-table .al-commit { width: 10%; text-align: right; } .alloc-table .al-period { width: 8%; }
.alloc-table .al-win { width: 13.5%; } .alloc-table .al-util { width: 12%; }
.alloc-table .al-booked { width: 10%; text-align: right; } .alloc-table .al-of { width: 10%; text-align: right; }
.alloc-table .al-stat { width: 11%; }
.alloc-table tbody td, .alloc-table thead th { padding-left: 8px; padding-right: 8px; }
.alloc-table tbody td { vertical-align: middle; padding-top: 10px; padding-bottom: 10px; white-space: nowrap; }
.al-target { font-weight: 400; text-transform: none; letter-spacing: 0; }
.al-util .um-compact { margin-top: 4px; }
/* AL: New allocation right-aligned in the header row, alone */
.q-head-flex { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
.q-head-right { flex: 0 0 auto; padding-top: 6px; }
/* AL-4: the proposal's arithmetic, under the task row */
.um-arith { margin-top: 6px; }
/* AL-13: current-period history row marked — it IS the header's figure */
.cap-hist .hist-current td { background: var(--paper-alt); }
.alloc-row { cursor: pointer; }

/* upcoming-releases panel */
.rel-panel { border: 1px solid var(--rule-dark-strong); border-radius: var(--r-card); padding: 12px 16px; margin: 0 0 18px; background: var(--card); }
.rel-head { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-70); font-weight: 700; margin-bottom: 10px; }
.rel-row { display: flex; align-items: center; gap: 12px; padding: 9px 0; border-top: 1px solid var(--rule-dark); }
.rel-body { flex: 1 1 auto; min-width: 0; }
.rel-act { flex: 0 0 auto; display: flex; gap: 6px; align-items: center; }
.rel-noact { font-style: italic; }
.rel-row.rel-excluded, .rel-row.rel-released { opacity: 0.72; }
.um-compact { padding-bottom: 0; }
.rel-btn { height: 30px; padding: 0 12px; width: auto; }

/* overlay bits (reuse .dt-modal grammar) */
.cap-pools, .cap-hist { width: 100%; border-collapse: collapse; font-size: var(--fs-body); }
.cap-pools th, .cap-pools td, .cap-hist th, .cap-hist td { text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--rule-dark); }
.cap-pools th, .cap-hist th { font-size: var(--fs-small); color: var(--ink-70); font-weight: 600; }
.cap-derived { margin-top: 6px; }
.cap-refs { list-style: none; margin: 0; padding: 0; font-size: var(--fs-body); }
.cap-refs li { padding: 4px 0; border-bottom: 1px solid var(--rule-dark); }
.cap-kvs { margin: 0; } .cap-kv { display: flex; gap: 10px; padding: 5px 0; border-bottom: 1px solid var(--rule-dark); }
.cap-kv dt { flex: 0 0 40%; color: var(--ink-70); font-size: var(--fs-small); } .cap-kv dd { margin: 0; font-size: var(--fs-body); }
.cap-log { list-style: none; margin: 0; padding: 0; font-size: var(--fs-body); }
.cap-log li { padding: 4px 0; border-bottom: 1px solid var(--rule-dark); }
.cap-step { padding: 12px 0; border-bottom: 1px solid var(--rule-dark); }
.cap-step h3 { display: flex; align-items: center; gap: 8px; font-size: var(--fs-title); }
.cap-stepn { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: var(--r-pill);
  background: var(--navy); color: var(--ink-inverse); font-size: var(--fs-small); font-weight: 700; }
.cap-create select, .cap-create input { font-family: inherit; font-size: var(--fs-body); padding: 7px 9px;
  border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); background: var(--card); color: var(--ink); }
.cap-inline { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-end; }
.cap-stop { background: var(--warn-tint); color: var(--warn-ink); border-radius: var(--r-box); padding: 10px 12px; font-size: var(--fs-body); font-weight: 600; }
.cap-diff { color: var(--ink-70); margin-top: 2px; }
.cap-rolenote { display: inline-block; margin-left: 8px; }
.cap-review { background: var(--paper-alt); border-radius: var(--r-box); padding: 10px 12px; font-size: var(--fs-body); margin-bottom: 10px; }

/* pagination — the one pager component, bottom-right of every record table */
.pager { display: flex; align-items: center; justify-content: flex-end; gap: 18px; padding: 12px 4px 4px; font-size: var(--fs-small); color: var(--ink-70); }
.pager-show { font-weight: 600; color: var(--ink); }
.pager-size { display: inline-flex; align-items: center; gap: 6px; }
.pager-size select { font-family: inherit; font-size: var(--fs-small); padding: 3px 6px; border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); background: var(--card); color: var(--ink); }
.pager-nav { display: inline-flex; align-items: center; gap: 8px; }
/* The pager's two buttons are .btn.btn-outline.btn-xs like every other small
   outline control; only the disabled affordance is the pager's own. */
.pager .btn:disabled { opacity: 0.4; cursor: default; border-color: var(--rule-dark-strong); background: var(--card); }
.pager-idx { color: var(--ink-70); }

@media (max-width: 720px) {
  .cohort { flex-direction: column; align-items: stretch; }
  .mon-funnel { flex-direction: column; }
  .dt-modal { max-width: 100%; }
  .rel-row { flex-wrap: wrap; }
  .pager { flex-wrap: wrap; gap: 10px; }
}

/* -- rates route (Stage 3) --------------------------------------------------- */
.rate-table th, .rate-table td { vertical-align: top; }
.rt-rankrow td { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-55);
  font-weight: 700; background: var(--paper-alt); padding: 6px 12px; }
.rate-row { cursor: pointer; }
.rate-row:hover { background: var(--paper-alt); }
.rt-tasks { white-space: normal; }
.rt-tasks .tchip { height: auto; padding: 2px 8px; font-size: var(--fs-small); margin: 0 4px 4px 0; }
.rate-expiring { color: var(--gold-ink); font-weight: 600; }
.rk { display: inline-block; font-size: var(--fs-small); font-weight: 700; padding: 2px 8px; border-radius: var(--r-pill);
  background: var(--paper-alt); color: var(--ink); border: 1px solid var(--rule-dark-strong); }
/* R1 was the one purple left in a navy-only palette (the brand file
   says so outright) — it now takes the navy family like every other
   rank tag. */
.rk-1 { background: var(--navy-tint); border-color: var(--primary); color: var(--primary); }
.rk-2 { background: var(--teal-tint); border-color: var(--teal); color: var(--teal); }
.rk-3 { background: var(--ok-tint); border-color: var(--ok-line); color: var(--ok-ink); }
.rk-4 { background: var(--gold-tint); border-color: var(--gold-ink); color: var(--gold-ink); }
.rk-5, .rk-6, .rk-7 { background: var(--paper-alt); color: var(--ink-70); }
.rate-status { display: inline-block; font-size: var(--fs-small); font-weight: 700; padding: 2px 9px; border-radius: var(--r-pill); }
.rst-active { color: var(--teal); background: var(--teal-tint); }
.rst-draft { color: var(--ink-70); background: var(--paper-alt); border: 1px dashed var(--rule-dark-strong); }
.rst-superseded { color: var(--ink-55); background: var(--paper-alt); }
.rst-expired { color: var(--danger-ink); background: var(--danger-tint); }
.rate-batch-bar { flex-wrap: wrap; }

/* breaks + calc breakdown in overlays */
.rate-breaks, .rate-lines, .rate-charges { width: 100%; border-collapse: collapse; font-size: var(--fs-body); }
.rate-breaks th, .rate-lines th, .rate-charges th { text-align: left; font-size: var(--fs-small); text-transform: uppercase;
  letter-spacing: 0.05em; color: var(--ink-55); padding: 6px 8px; border-bottom: 1px solid var(--rule-dark); }
.rate-breaks td, .rate-lines td, .rate-charges td { padding: 6px 8px; border-bottom: 1px solid var(--rule-dark); }
.rate-line-total td { border-top: 2px solid var(--rule-dark-strong); border-bottom: none; }
/* stage A §5 — the calculator result block: label | value | note per row */
.rate-calc-lines .rl-label { width: 30%; white-space: nowrap; }
.rate-calc-lines .rl-value { white-space: nowrap; }
.rate-calc-lines .rl-note { width: 45%; }
.rate-break-warn { margin-top: 8px; padding: 8px 10px; background: var(--warn-tint);
  border-left: 3px solid var(--amber); font-size: var(--fs-small); }
/* stage B — the recommended-price contribution panel (B1/B2) */
.rp-panel { border: 1px solid var(--rule-dark); border-radius: var(--r-box); overflow: hidden; }
.rp-row { display: grid; grid-template-columns: 170px 90px 1fr; gap: 12px; padding: 7px 12px;
  border-bottom: 1px solid var(--rule-dark); font-size: var(--fs-body); align-items: baseline; }
.rp-row:last-child { border-bottom: none; }
.rp-value { text-align: right; white-space: nowrap; }
.rp-total { font-weight: 700; background: var(--paper-alt); border-top: 2px solid var(--rule-dark-strong); }
.rp-clamp { color: var(--gold-ink); background: var(--gold-tint); }
.rp-rule .rp-label { font-family: var(--mono); }
.rp-rules { list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 4px; font-size: var(--fs-body); }
/* stage B — pricing rules list + form */
.rl-sec { margin-top: 26px; }
.rl-head-act { margin: 0 0 10px; }
.rl-table { border: 1px solid var(--rule-dark); border-radius: var(--r-box); overflow: hidden; }
.rl-row { display: grid; grid-template-columns: 64px 44px 150px minmax(120px, 1fr) 170px 110px 90px 70px;
  gap: 10px; align-items: center; padding: 9px 12px; border-bottom: 1px solid var(--rule-dark); font-size: var(--fs-body); }
.rl-row:last-child { border-bottom: none; }
.rl-cond, .rl-scope { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rl-condrow { display: flex; gap: 8px; margin-bottom: 8px; align-items: center; }
.rl-condrow select, .rl-condrow input { height: 36px; padding: 0 10px; font-family: inherit; font-size: var(--fs-body);
  border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); background: var(--card); color: var(--ink); }
.rl-sample { margin-top: 10px; padding: 8px 10px; background: var(--navy-tint); border-radius: var(--r-box); font-size: var(--fs-body); }
.rl-sim { margin-top: 10px; }
/* stage B — monitor divergence rows */
.mon-div-row { display: flex; align-items: center; gap: 14px; padding: 8px 0; border-bottom: 1px solid var(--rule-dark); font-size: var(--fs-body); }
.mon-div-row:last-child { border-bottom: none; }
.mon-div-lane { font-weight: 600; min-width: 90px; }
.mon-div-line { flex: 1; }
.rate-trace .tr-out { padding-left: 46px; opacity: 0.85; }
.dt-why-rate .rate-trace { margin-top: 4px; }
.rate-min-flag { font-size: var(--fs-small); color: var(--gold-ink); background: var(--gold-tint); padding: 1px 7px; border-radius: var(--r-pill); margin-left: 6px; }
.rate-surlist { list-style: none; margin: 0; padding: 0; }
.rate-surlist li { padding: 4px 0; border-bottom: 1px solid var(--rule-dark); }

/* resolution trace (why-this-rate) */
.rate-trace { list-style: none; margin: 0; padding: 0; }
.rate-trace li { display: flex; align-items: center; gap: 10px; padding: 6px 8px; border-bottom: 1px solid var(--rule-dark); flex-wrap: wrap; }
.rate-trace .tr-rank { font-weight: 700; min-width: 28px; }
.rate-trace .tr-type { min-width: 130px; }
.rate-trace .tr-tag { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.04em; font-weight: 700; }
.rate-trace .tr-id { font-size: var(--fs-small); color: var(--ink-70); }
.rate-trace .tr-match { background: var(--teal-tint); }
.rate-trace .tr-match .tr-tag { color: var(--teal); }
.rate-trace .tr-skip .tr-tag { color: var(--danger-ink); }
.rate-trace .tr-na .tr-tag, .rate-trace .tr-ne .tr-tag { color: var(--ink-55); }
.rate-winner { margin-top: 10px; font-weight: 600; color: var(--teal); }

/* create/amend form + calculator */
.rate-breaks-edit { display: flex; flex-direction: column; gap: 6px; margin-bottom: 8px; }
.rate-breakrow { display: flex; gap: 8px; align-items: center; }
.rate-breakrow input { flex: 1; }
.rate-break-x { width: 40px; flex: none; }
.rate-surboxes { display: flex; flex-direction: column; gap: 6px; }
.rate-surbox { display: flex; align-items: center; gap: 8px; font-size: var(--fs-body); }
.rate-preview { background: var(--paper-alt); border-radius: var(--r-box); padding: 12px 14px; }
.rate-preview h4 { margin: 0 0 10px; font-size: var(--fs-title); }

/* -- typed absence + coverage (spec: nothing missing silently) ---------------- */
.cst-notloaded { color: var(--ink-inverse); background: var(--danger-deep); }        /* the GAP — escalation, darker never paler */
.cst-pending   { color: var(--warn-ink); background: var(--warn-tint); }     /* a dated fact, not a warning */
.cov-line { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; font-size: var(--fs-body);
  color: var(--ink); background: var(--paper-alt); border-radius: var(--r-box); padding: 10px 14px; margin: 0 0 16px; }
.cov-btn { font-family: inherit; font-size: var(--fs-body); font-weight: 600; background: none; border: none;
  border-bottom: 1px dashed currentColor; padding: 0 1px; cursor: pointer; }
.cov-btn.cov-gap { color: var(--danger-deep); }
.cov-btn.cov-pending { color: var(--gold-ink); }
.cov-btn.cov-on { border-bottom-style: solid; font-weight: 700; }
.cov-btn.cov-clear { color: var(--ink-70); margin-left: 6px; }
.cf-state { font-size: var(--fs-body); }
.cap-gap { cursor: pointer; }
.cap-pending { cursor: pointer; }
.rel-gaps { margin-bottom: 8px; }
.rel-subhead { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--danger-deep); font-weight: 700; margin: 2px 0 4px; }
.rel-body[data-rel-open] { cursor: pointer; }
.rel-body[data-rel-open]:hover .co-l1 b { text-decoration: underline; }
.drops-table td { vertical-align: middle; }
.mon-anom { margin-top: 14px; border-top: 1px solid var(--rule-dark); padding-top: 10px; }
.mon-anom h4 { font-size: var(--fs-small); font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-55); margin: 0 0 8px; }

/* -- fix list 14 Aug: columns, tiers, panel grid ------------------------------ */
/* numeric columns (F7/F8): right-aligned, one line, tabular numerals */
.cap-table .cf-num { text-align: right; font-family: var(--mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
.cap-table th.cf-num { text-align: right; }
.cap-table tbody td { padding-left: 8px; padding-right: 8px; }
.cap-table thead th { padding-left: 8px; padding-right: 8px; }   /* NV-1 §7 remedy 1 */
/* FL-4 on the flights table: the date, the load figure, the binding chip and
   the three numeric columns are FIXED. Flight and Release carry the text and
   take the extra width. */
.cap-table .cf-flt   { min-width: 130px; }
.cap-table .cf-date  { width: 190px; }
.cap-table .cf-load  { width: 96px; }
.cap-table .cf-bound { width: 84px; }
.cap-table .cf-num   { width: 76px; }
.cap-table .cf-avail { width: 128px; }
.cap-table .cf-rel   { min-width: 150px; }
.cap-table .cf-date { font-size: var(--fs-small); }
/* BOUND: word at desktop; only the coloured dot below 1280 (F9 — numbers never drop) */
.bound-dot { display: inline-block; width: 9px; height: 9px; border-radius: var(--r-dot); margin-right: 6px; vertical-align: middle; }
.bd-weight { background: var(--navy); } .bd-volume { background: var(--teal); }
.bound-txt { font-size: var(--fs-small); color: var(--ink-70); }
/* Y3: BOUND renders a word, never a colour alone — the word stays at 1280 */
/* urgency tiers (F10): escalation darker never paler */
.seg-t-ok .seg-sold, .seg-t-open .seg-sold { background: var(--ok-fill); }   /* muted grey-green */
.seg-t-mid .seg-sold, .seg-t-normal .seg-sold { background: var(--navy); }
.seg-t-tight .seg-sold { background: var(--tier-tight); }   /* amber */
/* Y8: FULL is one tier DEEPER than tight — bar and LOAD figure both darken */
.seg-t-full .seg-sold { background: var(--tier-full); }
/* X1: a FULL leg's bar is amber EDGE TO EDGE — sold and allotted both carry
   the tier colour (the pools table keeps the split; the row states the state) */
.seg-t-full .seg-allot { background: var(--tier-tight); }
.seg-t-tight .seg-lf { color: var(--warn-ink); }
.seg-t-full .seg-lf { color: var(--tier-full-ink); }
.cst-full { color: var(--warn-ink); background: var(--warn-tint); border: 1px solid var(--tier-tight); }
/* departed rows (F2): read-only, no affordances */
.cap-departed { opacity: 0.55; cursor: default; }
.cap-departed:hover { background: transparent; }
/* controls (item 11): filters left, Sort right; one explicit range control */
.cap-sort-group { margin-left: auto; }
.cap-range { display: inline-flex; align-items: center; gap: 8px; }
.cap-range-label { font-size: var(--fs-small); color: var(--ink-70); white-space: nowrap; }

/* exception panel grid (14.1): every row identical, ONE line, fixed height.
   STATE | FLIGHT | DATE | ROUTE | ACCOUNT(flex) | UNFILLED | ACTIONS */
/* the STATE column fits an escalated hold whole — "Held · departs in 22h"
   never truncates (H-7: the proximity is STATED, not implied by an ellipsis) */
.rel-grid { display: grid; grid-template-columns: 176px 64px 86px 104px minmax(0, 1fr) 88px 236px;
  align-items: center; gap: 0 12px; height: 48px; padding: 0; border-top: 1px solid var(--rule-dark); }
.rel-grid > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rg-state .cchip { max-width: 100%; }
.rg-flight { font-weight: 700; cursor: pointer; }
.rg-flight:hover { text-decoration: underline; }
.rg-date, .rg-route { font-size: var(--fs-body); }
.rg-acct { font-size: var(--fs-body); }
.rg-unfilled { text-align: right; font-variant-numeric: tabular-nums; }
.rg-act { display: flex; gap: 6px; justify-content: flex-end; }
.rg-act .rel-btn { height: 30px; padding: 0 10px; font-size: var(--fs-small); white-space: nowrap; }
.rel-noact { font-style: normal; }
.rel-collapsed { border-top: 1px dashed var(--rule-dark-strong); }
.rel-collapsed .rel-grid { opacity: 0.72; }
.tchip-muted { color: var(--ink-70); background: var(--paper-alt); border-color: var(--rule-dark-strong); }
.rel-gapspanel .rel-head { color: var(--danger-deep); }

/* == sold-out legs + leg-detail redesign (X1-X9 / L1-L10) ================== */
/* X1: the AVAILABLE cell's bold zero + the stranded remainder beneath */
.avail-zero { font-weight: 800; color: var(--warn-ink); }

/* §7 (redesign): NO native control chrome anywhere in the console — selects
   and date inputs share one styled treatment (custom caret, token borders). */
.console select { appearance: none; -webkit-appearance: none; -moz-appearance: none;
  background: var(--card) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23486581' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat right 10px center;
  padding: 6px 28px 6px 10px; border: 1px solid var(--rule-dark); border-radius: var(--r-box);
  color: var(--ink); font: inherit; font-size: var(--fs-small); cursor: pointer; }
.console input[type="date"] { appearance: none; -webkit-appearance: none;
  border: 1px solid var(--rule-dark); border-radius: var(--r-box); padding: 5px 10px;
  background: var(--card); color: var(--ink); font: inherit; font-size: var(--fs-small); }
.console input[type="date"]::-webkit-calendar-picker-indicator { opacity: 0.55; cursor: pointer; }

/* §2 (redesign): the state block under the identity header */
.cap-stateblock { display: grid; gap: 4px; margin-top: 2px; }
.cap-stateline { font-size: var(--fs-body); font-weight: 700; color: var(--ink); }
.cap-stranded { font-size: var(--fs-body); }
.cap-conseq { justify-self: start; padding: 0; font-size: var(--fs-small); }

/* §3: segment table — the binding dimension's column is bold */
.cap-bindcol { color: var(--ink); font-weight: 700; }

/* §4: bookings collapsed to one reconciling line */
.cap-bktoggle { background: none; border: none; padding: 0; font: inherit; font-size: var(--fs-body); color: var(--ink); cursor: pointer; font-weight: 600; }
.cap-bktoggle .cap-bkcaret { color: var(--ink-55); font-size: var(--fs-small); font-weight: 400; }
.cap-refs-total { display: flex; justify-content: space-between; border-top: 1px solid var(--rule-dark-strong); margin-top: 6px; padding-top: 6px; list-style: none; }

/* §5: adjust — CURRENT beside NEW with a live signed delta */
.cap-adjgrid { display: grid; grid-template-columns: minmax(0, 1fr) auto auto auto; gap: 8px 14px; align-items: center; margin-bottom: 8px; }
.cap-adjhead { font-size: var(--fs-small); text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-55); font-weight: 600; }
.cap-adjlabel { font-size: var(--fs-body); color: var(--ink-70); }
.cap-adjcur { font-size: var(--fs-body); }
.cap-adjnew { display: flex; align-items: center; gap: 6px; }
.cap-adjnew input { width: 110px; }
.cap-unit { font-size: var(--fs-small); color: var(--ink-55); }
.cap-adjdelta { font-size: var(--fs-body); min-width: 84px; text-align: right; }
.cap-min { margin: 2px 0 8px; }

/* §2.1: release rows inside the leg detail — the SAME rel-grid component,
   with the columns the header already states (date · route) hidden */
.dt-modal .cap-relsec .rel-grid { grid-template-columns: 118px 56px minmax(0, 1fr) 78px 216px; height: auto; min-height: 44px; }
.dt-modal .cap-relsec .rg-date, .dt-modal .cap-relsec .rg-route { display: none; }

/* §2.4: same-lane alternatives */
.cap-alt { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 9px 10px; border: 1px solid var(--rule-dark); border-radius: var(--r-box); margin-bottom: 6px; }
.cap-alt[data-cap-alt] { cursor: pointer; }
.cap-alt[data-cap-alt]:hover { border-color: var(--navy); background: var(--paper-alt); }
.cap-alt-state { display: flex; align-items: center; gap: 8px; white-space: nowrap; }

/* §6: date range collapsed behind its toggle */
.cap-seriestoggle { display: flex; align-items: center; gap: 8px; font-size: var(--fs-body); color: var(--ink); cursor: pointer; }
.cap-seriesdates { margin-top: 10px; }

/* §8: the pinned footer — full width, one primary action, blocker stated */
.dt-foot { flex: 0 0 auto; display: flex; align-items: center; gap: 14px; padding: 12px 24px; border-top: 1px solid var(--rule-dark-strong); background: var(--card); }
.dt-foot .cap-footnote { flex: 1 1 auto; min-width: 0; }
.cap-footbtn { white-space: nowrap; }
.cap-footbtn[disabled] { opacity: 0.45; cursor: not-allowed; }

/* §3 (sold-out): Queue filtered from a leg's consequence line */
.q-legfilter { margin: 0 0 12px; padding: 9px 12px; border: 1px solid var(--rule-dark); border-radius: var(--r-box); background: var(--paper-alt); font-size: var(--fs-body); }

/* X6: Monitor — overbooked legs, separate from dropped itineraries */
.mon-overbook { margin-top: 18px; }
.mon-obrow { padding: 9px 0; border-bottom: 1px solid var(--rule-dark); font-size: var(--fs-body); }
.mon-obrow:last-child { border-bottom: none; }
.mon-obnote { margin-top: 3px; }

/* ===== a-fixes-1127: controls row · confirmation · hold escalation ===== */
/* CR-1: Dates is a real from-to range */
.cap-range { display: inline-flex; align-items: center; gap: 8px; }
.cap-range-to { color: var(--ink-70); font-size: var(--fs-small); }
/* CR-5: sort sits directly above the table, right-aligned to the table's right
   edge, wide enough that "Needs attention first" never truncates */
.cap-sortrow { display: flex; justify-content: flex-end; margin: 12px 0 6px; }
.cap-sortrow .cap-fl { flex-direction: row; align-items: center; gap: 8px; }
.cap-sortrow .cap-sort { min-width: 210px; }
/* CR-2: hidden-category clauses live on the coverage line as inline toggles */
.cov-btn.cov-hidden { color: var(--ink-70); }
/* inline action link (Y12: the trailing words of a note ARE the link) */
.link { font-family: inherit; font-size: inherit; background: none; border: none; padding: 0;
  color: var(--navy); text-decoration: underline; cursor: pointer; }
.link:hover { color: var(--ink); }
/* DG: the gap row is a sentence, so it declares its OWN column template —
   the wide flexible column the release grid lacks. min 360px; if the
   viewport cannot give it that, the sentence truncates with an ellipsis —
   it NEVER word-ladders (overflow-wrap stays normal; word breaking is banned). */
.rel-gapgrid { display: grid; grid-template-columns: 140px 80px 120px minmax(360px, 1fr) 220px;
  align-items: center; gap: 12px; min-height: 44px; }
.rel-gapgrid > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rel-gapgrid .rg-explain { white-space: normal; overflow-wrap: normal;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.rel-gapgrid .rg-act { display: flex; justify-content: flex-end; overflow: visible; }
/* H-1/H-2: Hold and Resume are real, visible actions — never borderless ghosts */
.rel-btn.btn-ghost { border-color: var(--rule-dark-strong); color: var(--ink); }
.rel-btn.btn-ghost:hover { border-color: var(--navy); color: var(--navy); }
/* H-7: a held chip near departure DARKENS (never pales); proximity is text beside it */
.cchip-esc.cst-held { color: var(--ink-inverse); background: var(--held-fill); }
.rel-departs { margin-left: 6px; }
/* C-11: the dismissible post-commit confirmation line */
.cap-notice { margin: 0 0 12px; padding: 9px 12px; border: 1px solid var(--rule-dark);
  border-left: 3px solid var(--green); border-radius: var(--r-box); background: var(--ok-tint); font-size: var(--fs-body); }
.cap-notice .cap-notice-x { margin-left: 8px; color: var(--ink-70); }
/* C-1..C-13: the release confirmation overlay — facts, then ONE affirmative */
.rc-portion { font-size: var(--fs-body); margin: 0 0 14px; }
.rc-irrev { font-size: var(--fs-body); font-weight: 600; color: var(--danger-ink); margin: 14px 0; }
/* H-9: Monitor — held blocks past their scheduled release */
.mon-heldlapse { margin-top: 18px; }

/* -- stage C: cost basis (scenario 18) -------------------------------------- */
/* The floor's home surface under the rate table. Own grid template per panel
   (INVARIANTS #52); row actions are link-spans, never buttons (#28). */
.cb-sec { margin-top: 28px; }
.cb-table { border: 1px solid var(--rule-dark); border-radius: var(--r-card); overflow: hidden; background: var(--card); }
.cb-row { display: grid; grid-template-columns: 110px minmax(280px, 1fr) 200px 150px 110px;
  align-items: center; gap: 12px; min-height: 46px; padding: 0 14px; border-bottom: 1px solid var(--rule-dark); }
.cb-row:last-child { border-bottom: none; }
.cb-row[role="button"] { cursor: pointer; }
.cb-row[role="button"]:hover { background: var(--paper-alt); }
.cb-lane { font-weight: 600; }
.cb-row > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cb-task { display: flex; justify-content: flex-end; overflow: visible; }
/* form + preview */
.cb-linerow { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.cb-in { height: 38px; padding: 0 12px; font-family: inherit; font-size: var(--fs-body); color: var(--ink);
  background: var(--card); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); }
.cb-in:focus { outline: none; border-color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.cb-label { flex: 1 1 auto; }
.cb-val { width: 110px; font-variant-numeric: tabular-nums; }
.cb-preview { background: var(--paper-alt); border: 1px solid var(--rule-dark); border-radius: var(--r-box);
  padding: 12px 14px; font-size: var(--fs-body); }
.cb-blast { margin-top: 6px; }
/* decision drawer: cost + floor section (§4.1) */
.dt-nobasis { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: var(--fs-body); }
.dt-atline { font-size: var(--fs-body); margin-top: 6px; }
.dt-costlines { border: 1px solid var(--rule-dark); border-radius: var(--r-box); overflow: hidden; margin: 10px 0; }

/* -- stage E: RFQ response preparation (scenario 19) ------------------------- */
/* One document, one deadline. The summary strip renders the COMPUTED summary
   only (RQ-6); the guided review is one line at a time with n of m always
   visible (RQ-5). */
.rfq-tasks { margin: 0 0 14px; }
.rfq-table td { vertical-align: top; }
.rfq-row { cursor: pointer; }
.rfq-row:hover td { background: var(--paper-alt); }
.rfq-line[data-rfq-line-open] { cursor: pointer; }
.rfq-line:hover td { background: var(--paper-alt); }
.rfq-head { align-items: center; gap: 12px; }
.rfq-meta { margin: -6px 0 14px; font-size: var(--fs-body); }
.rfq-strip { display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 16px; }
.rfq-cell { flex: 1 1 120px; min-width: 120px; background: var(--card); border: 1px solid var(--rule-dark);
  border-radius: var(--r-card); padding: 10px 14px; display: flex; flex-direction: column; gap: 2px; }
.rfq-cell .rfq-v { font-size: var(--fs-title); font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }
.rfq-cell .rfq-l { font-size: var(--fs-small); color: var(--ink-soft); }
.rfq-warn { border-color: var(--amber); }
.rfq-warn .rfq-v { color: var(--amber); }
.rfq-actions { display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 16px; align-items: center; }
.rfq-mgr-acts { display: flex; gap: 6px; margin-top: 6px; }
/* guided review */
.rv-count { font-size: var(--fs-body); }
.rv-count b { font-size: var(--fs-title); }
.rv-detail .an-line { align-items: baseline; }
.rv-bf { color: var(--red); font-weight: 600; }
.rv-rec { margin-top: 12px; }
.rv-recrow .muted { margin-left: 8px; }
.rv-acts { flex-wrap: wrap; align-items: center; }
.rv-edit { display: inline-flex; align-items: center; gap: 6px; }
.rv-rate { width: 110px; font-variant-numeric: tabular-nums; }
.rv-error { margin: 10px 0; padding: 8px 12px; border: 1px solid var(--red); border-radius: var(--r-box);
  color: var(--red); font-size: var(--fs-body); background: var(--card); }
.rv-kbd { margin-top: 8px; }
.rv-radio { display: block; margin-bottom: 8px; font-size: var(--fs-body); }
.rfq-outform { display: flex; flex-direction: column; gap: 6px; }
.rfq-tsv { width: 100%; font-family: 'JetBrains Mono', monospace; font-size: var(--fs-small); color: var(--ink);
  background: var(--paper-alt); border: 1px solid var(--rule-dark-strong); border-radius: var(--r-box); padding: 10px; }
.rfq-paste { display: block; margin-top: 10px; }
.rfq-bedit { display: flex; align-items: center; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
/* stage E fixes: per-line outcome rows */
.rfq-outrow { display: flex; align-items: center; gap: 10px; padding: 4px 0; }
.rfq-outrow .rfq-outlane { flex: 1 1 auto; font-size: var(--fs-body); }
.rfq-outall { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }

/* scenario 9 §notification — channels and their state (read from config) */
.nc-row { display: flex; align-items: baseline; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--rule-dark); }
.nc-row:last-child { border-bottom: none; }
.nc-label { font-weight: 600; min-width: 110px; }
.nc-detail { color: var(--ink-soft); font-size: var(--fs-body); }

/* ── stage F · Reports (scenarios 20 and 22) ─────────────────────────────── */
.rp-refuse { background: var(--card); border: 1px solid var(--rule-dark); border-radius: var(--r-card); padding: 20px 24px; max-width: 640px; }
.rp-refuse p { margin: 6px 0 0; }
.rp-filters { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 12px; margin: 12px 0 16px;
  padding: 12px 14px; background: var(--paper-alt); border: 1px solid var(--rule-dark); border-radius: var(--r-card); }
.rp-f { display: flex; flex-direction: column; gap: 4px; font-size: var(--fs-small); color: var(--ink-soft); }
.rp-f select { height: 32px; min-width: 160px; }
.rp-scope { margin-left: auto; }
.rp-strip .rfq-cell { flex: 1 1 160px; min-width: 160px; }
.rp-sub { line-height: 1.3; }
.rp-open, .rp-costnote { margin: -8px 0 14px; }
.rp-sec { margin: 0 0 26px; }
.rp-sech { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.rp-table td.num, .rp-table th.num { text-align: right; font-variant-numeric: tabular-nums; }
.rp-total td { border-top: 2px solid var(--rule-dark-strong); font-weight: 700; background: var(--paper-alt); }
.rp-list { margin: 8px 0 0; padding-left: 18px; }
.rp-list li { margin-bottom: 4px; font-size: var(--fs-body); }
.rp-finding { margin: 6px 0 10px; padding: 8px 12px; background: var(--paper-alt);
  border-left: 3px solid var(--accent); border-radius: 0 var(--r-box) var(--r-box) 0; font-size: var(--fs-body); }
.rp-covlist .rp-route { margin-left: 4px; }
.rp-excl .rp-list li { color: var(--ink-soft); }
.rp-pop { margin: 2px 0 8px; font-variant-numeric: tabular-nums; }
.rp-second { margin: -4px 0 14px; }
.rp-goto { font-size: var(--fs-small); white-space: nowrap; }
.rp-covlist li { line-height: 1.7; }
