/* ============================================================
   NetVault shared theme - SOURCE OF RECORD
   Owner: NVT-NXS-01 (THEME-1). LEO and Fax REQUEST changes; do not edit a copy.
   Published: nexus-shared-assets.git

   RECONCILED 2026-08-05 across all three copies.
     normalised md5 fcc03c5c66457f255ce40c9687ce772d  23764 B  266 braces
     The whole divergence was ONE rule: .pager-label, present only on NVT-FAX01
     and used live three times there. It was ADDED here, not removed there.
     There was NO drift inside shared rules - that finding was an artefact of
     subtracting the wrong rule, and is withdrawn.
     .cover-wrap is shared by all three copies and never was the difference.

   ⚠️ Had this been reconciled by DELETION - which the block count and the
      first localisation both pointed at - three labels would have rendered
      unstyled while the count reported convergence.

   ADDED 2026-08-06: .pill.info (requested by LEO-01 for the scheduled/pending
   state). Their proposed light ink was adopted unchanged; the DARK override was
   added here — see the note at the rule. NVT-FAX01 and LEO must pull this.

   ADDED 2026-08-06: .rail-links — the foot-of-rail container for outbound
   product links (Nexus -> LEO / Fax), sibling of .nav and .rail-user. It is
   STANDALONE, so bare use is correct. Available to LEO and Fax for their
   Return-to-Nexus item, which sits in the same position.

   40 of the 137 classes here are CONTEXT-ONLY - styled only inside a parent or
   beside a co-class. Using one bare renders unstyled with NO console error.
   .ok / .bad / .warn / .active / .info look general and are not. Full list:
   theme-context-classes.json in the same repo. The dangerous case is a class
   already working correctly twenty lines away - the reader's evidence is real
   but does not bear on the question.
   .pager-label is STANDALONE, so bare use of it is correct.
   ============================================================ */
/* ============================================================
   NetVault shared design system — theme.css
   COPIED VERBATIM from the Fax2Email portal (/opt/faxportal/theme.css
   on NVT-FAX01) on 2026-08-01. Keep the two in sync: if you change a
   token or component here, mirror it there, and vice versa. Do not
   fork the design system per-app.
   ------------------------------------------------------------
   Originally: NetVault Fax2Email Portal — theme.css
   Design system derived from NetVault Brand Guide v1.0
   Vault Charcoal #1D252D · Sky Blue #009CDE · Kanit + Public Sans
   Single source of truth for colour + type across the SPA.
   ============================================================ */

/* ---- self-hosted fonts (TTF; swap to WOFF2 later if desired) ---- */
@font-face{font-family:'Kanit'; font-style:normal; font-weight:500; font-display:swap;
  src:url('/assets/fonts/Kanit-Medium.ttf') format('truetype')}
@font-face{font-family:'Kanit'; font-style:normal; font-weight:600; font-display:swap;
  src:url('/assets/fonts/Kanit-SemiBold.ttf') format('truetype')}
@font-face{font-family:'Kanit'; font-style:normal; font-weight:700; font-display:swap;
  src:url('/assets/fonts/Kanit-Bold.ttf') format('truetype')}
@font-face{font-family:'Public Sans'; font-style:normal; font-weight:400; font-display:swap;
  src:url('/assets/fonts/PublicSans-Regular.ttf') format('truetype')}
@font-face{font-family:'Public Sans'; font-style:normal; font-weight:500; font-display:swap;
  src:url('/assets/fonts/PublicSans-Medium.ttf') format('truetype')}
@font-face{font-family:'Public Sans'; font-style:normal; font-weight:600; font-display:swap;
  src:url('/assets/fonts/PublicSans-SemiBold.ttf') format('truetype')}
@font-face{font-family:'Public Sans'; font-style:normal; font-weight:700; font-display:swap;
  src:url('/assets/fonts/PublicSans-Bold.ttf') format('truetype')}
@font-face{font-family:'Public Sans'; font-style:italic; font-weight:400; font-display:swap;
  src:url('/assets/fonts/PublicSans-Italic.ttf') format('truetype')}

/* ---- LIGHT (default) ---- */
:root{
  --nv-blue:#009CDE; --nv-blue-600:#0089c4; --nv-blue-700:#0076ab; --nv-blue-tint:#e7f5fc;
  --charcoal:#1D252D;
  --canvas:#eef3f6; --paper:#ffffff; --input-bg:#ffffff; --input-alt:#fafcfd;
  --line:#dce4e9; --line-strong:#c6d1d8;
  --ink:#1D252D; --muted:#5e6e79; --muted-2:#8a97a0;
  --ok:#1E9E6A; --ok-tint:#DDF3EA; --warn:#E0A100; --warn-tint:#FBF0D2; --bad:#D0342C; --bad-tint:#FBE3E1;
  --rail-top:#28323b; --rail-bot:#1D252D; --topbar-bg:rgba(255,255,255,.85);
  --shadow:0 1px 2px rgba(29,37,45,.06), 0 8px 26px -12px rgba(29,37,45,.22);
  --shadow-lg:0 1px 2px rgba(29,37,45,.06), 0 24px 60px -20px rgba(29,37,45,.35);
  --r:6px; --r-sm:4px; --rail-w:248px;
  --font-display:'Kanit',system-ui,-apple-system,sans-serif;
  --font-body:'Public Sans',system-ui,-apple-system,sans-serif;
}
/* ---- DARK ---- */
[data-theme="dark"]{
  --nv-blue-tint:rgba(0,156,222,.16);
  --canvas:#12171c; --paper:#1b232a; --input-bg:#232d35; --input-alt:#202932;
  --line:#2a343d; --line-strong:#3a4650;
  --ink:#e9eef2; --muted:#9aa8b2; --muted-2:#6f7d87;
  --ok-tint:rgba(30,158,106,.18); --warn-tint:rgba(224,161,0,.20); --bad-tint:rgba(208,52,44,.20);
  --rail-top:#141b21; --rail-bot:#0d1216; --topbar-bg:rgba(18,23,28,.85);
  --shadow:0 1px 2px rgba(29,37,45,.4), 0 8px 26px -14px rgba(29,37,45,.7);
  --shadow-lg:0 24px 60px -20px rgba(29,37,45,.75);
}

*{box-sizing:border-box}
html,body{margin:0; height:100%}
body{font-family:var(--font-body); color:var(--ink); background:var(--canvas);
  font-size:14px; line-height:1.5; -webkit-font-smoothing:antialiased;
  font-variant-numeric:tabular-nums; transition:background .2s, color .2s}
h1,h2,h3,h4{font-family:var(--font-display); font-weight:600; margin:0; letter-spacing:-.01em}
button{font-family:var(--font-body); cursor:pointer}
a{color:var(--nv-blue)}
:focus-visible{outline:2px solid var(--nv-blue); outline-offset:2px; border-radius:4px}
.mono{font-variant-numeric:tabular-nums; letter-spacing:.01em}
.hide{display:none !important}

/* logo: two provided colourways. .logo-white forces white file; .logo-auto swaps by theme */
img.logo{display:block; width:100%; height:auto}

/* ---------- controls ---------- */
.label{display:block; font-size:11.5px; font-weight:600; letter-spacing:.04em; text-transform:uppercase; color:var(--muted); margin:0 0 7px}
.field{width:100%; height:44px; padding:0 14px; border:1px solid var(--line-strong); border-radius:var(--r-sm);
  background:var(--input-bg); font-size:14.5px; color:var(--ink); font-family:var(--font-body); transition:border-color .15s, box-shadow .15s}
.field::placeholder{color:var(--muted-2)}
.field:focus{outline:none; border-color:var(--nv-blue); box-shadow:0 0 0 3px var(--nv-blue-tint)}
textarea.field{height:auto; padding:12px 14px; resize:vertical; min-height:110px; line-height:1.55}
select.field{appearance:none; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%235e6e79' d='M6 8 0 0h12z'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 14px center; padding-right:34px}

.btn{height:44px; padding:0 20px; border:1px solid transparent; border-radius:var(--r-sm); font-size:14px; font-weight:600;
  display:inline-flex; align-items:center; gap:9px; justify-content:center; transition:background .15s, box-shadow .15s, transform .05s}
.btn:active{transform:translateY(1px)}
.btn svg{width:17px; height:17px}
.btn-primary{background:var(--nv-blue); color:#fff; box-shadow:0 6px 16px -8px rgba(0,156,222,.8)}
.btn-primary:hover{background:var(--nv-blue-600)}
.btn-danger{background:var(--bad); color:#fff; box-shadow:0 6px 16px -8px rgba(208,52,44,.8)}
.btn-danger:hover{background:#b8302b}

.health-pill{display:inline-flex; align-items:center; gap:8px; background:none; border:none; cursor:pointer; padding:6px 10px; border-radius:20px; font-size:13px; font-weight:600; color:var(--muted); font-family:inherit}
button.health-pill{cursor:pointer}
.health-pill:not(button){cursor:default}
.health-dot{width:8px; height:8px; border-radius:50%; background:var(--muted); flex-shrink:0}
.health-dot.ok{background:var(--ok)}
.health-dot.bad{background:var(--bad)}
.health-label{white-space:nowrap}
.health-pill-wrap{position:relative}
.health-detail{position:absolute; top:100%; right:0; margin-top:8px; background:var(--paper); border:1px solid var(--line); border-radius:var(--r); box-shadow:var(--shadow); padding:12px 16px; z-index:50; min-width:240px}
.health-row{display:flex; align-items:center; gap:8px; padding:5px 0; font-size:13px}
.health-sub{color:var(--muted); font-size:11px; margin-left:auto; white-space:nowrap}
.btn-ghost{background:var(--input-bg); color:var(--ink); border-color:var(--line-strong)}
.btn-ghost:hover{border-color:var(--muted-2)}
.btn:disabled{opacity:.55; cursor:not-allowed}
.btn-sm{height:34px; padding:0 13px; font-size:13px; border-radius:7px}

.pill{display:inline-flex; align-items:center; gap:6px; height:24px; padding:0 10px 0 8px; border-radius:999px; font-size:12px; font-weight:600}
.pill .dot{width:7px; height:7px; border-radius:50%}
.pill.ok{background:var(--ok-tint); color:#1c7742} .pill.ok .dot{background:var(--ok)}
.pill.warn{background:var(--warn-tint); color:#975E09} .pill.warn .dot{background:var(--warn)}
.pill.bad{background:var(--bad-tint); color:#ab3733} .pill.bad .dot{background:var(--bad)}
.pill.info{background:var(--nv-blue-tint); color:#0a6a92} .pill.info .dot{background:var(--nv-blue)}
[data-theme="dark"] .pill.ok{color:#6fd79a}
[data-theme="dark"] .pill.warn{color:#f0b45a}
[data-theme="dark"] .pill.bad{color:#f08a85}
/* ⚠️ REQUIRED, not decorative. --nv-blue-tint is TRANSLUCENT in dark mode
   (rgba(0,156,222,.16)), so it composites to #173647 over --paper. The light
   ink #0a6a92 on that is 2.11:1 — below even the 3:1 large-text floor, while
   the other three tiers sit at 5.46-7.03. #80c7ea gives 6.81:1.
   Derived by applying the mean toward-white fraction of the ok/warn/bad dark
   inks to --nv-blue, not chosen by eye. A new tier added WITHOUT its dark
   override looks correct in light mode and is unreadable in dark. */
[data-theme="dark"] .pill.info{color:#80c7ea}

.err{background:var(--bad-tint); color:#ab3733; border:1px solid rgba(208,52,44,.3); border-radius:var(--r-sm);
  padding:11px 13px; font-size:13px; font-weight:500; margin:0 0 16px}
[data-theme="dark"] .err{color:#f08a85}
.notice-ok{background:var(--ok-tint); color:#1c7742; border:1px solid rgba(30,158,106,.3); border-radius:var(--r-sm);
  padding:11px 13px; font-size:13px; font-weight:500; margin:0 0 16px}
[data-theme="dark"] .notice-ok{color:#6fd79a}
.notice-warn{background:var(--warn-tint); color:#975E09; border:1px solid rgba(224,161,0,.3); border-radius:var(--r-sm);
  padding:11px 13px; font-size:13px; font-weight:500; margin:0 0 16px}
[data-theme="dark"] .notice-warn{color:#f0b45a}
.spinner{width:18px; height:18px; border:2.5px solid rgba(255,255,255,.35); border-top-color:#fff; border-radius:50%; animation:spin .7s linear infinite; display:inline-block}
@keyframes spin{to{transform:rotate(360deg)}}
.center-load{min-height:100vh; display:grid; place-items:center; color:var(--muted)}

/* ---------- AUTH ---------- */
.auth{position:fixed; inset:0; display:grid; place-items:center; padding:24px; overflow:hidden;
  background:radial-gradient(1100px 700px at 82% -12%, color-mix(in srgb, var(--nv-blue) 8%, var(--canvas)) 0%, rgba(0,0,0,0) 60%), var(--canvas)}
.auth::before{content:""; position:absolute; width:780px; height:780px; right:-260px; bottom:-320px; border-radius:50%;
  border:1.5px solid rgba(0,156,222,.16); box-shadow:inset 0 0 0 34px rgba(0,156,222,.05); pointer-events:none}
.auth::after{content:""; position:absolute; width:440px; height:440px; left:-180px; top:-200px; border-radius:50%;
  border:1.5px dashed rgba(120,140,155,.14); pointer-events:none}
.auth-card{position:relative; width:100%; max-width:404px; background:var(--paper); border:1px solid var(--line);
  border-radius:16px; box-shadow:var(--shadow-lg); padding:36px 34px 30px}
.auth-logo{margin:0 auto 26px; display:flex; justify-content:center}
.auth-logo img.logo{width:88%}
.auth-eyebrow{font-size:11.5px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:var(--nv-blue); margin:0 0 6px}
.auth-title{font-size:23px; color:var(--ink); margin:0 0 4px}
.auth-sub{color:var(--muted); font-size:13.5px; margin:0 0 24px}
.auth-card .field + .label{margin-top:16px}
.auth-actions{margin-top:22px} .auth-actions .btn{width:100%}
.auth-foot{margin-top:20px; padding-top:16px; border-top:1px solid var(--line); display:flex; justify-content:space-between; align-items:center; font-size:12.5px; color:var(--muted-2)}
.auth-foot a{color:var(--muted); text-decoration:none} .auth-foot a:hover{color:var(--nv-blue)}
.tagline{color:var(--muted-2); font-size:11px; letter-spacing:.16em; text-transform:uppercase}
.totp-row{display:flex; gap:9px}
.totp-row input{flex:1; width:100%; height:54px; text-align:center; font-size:22px; font-weight:600; font-family:var(--font-display);
  border:1px solid var(--line-strong); border-radius:var(--r-sm); background:var(--input-bg); color:var(--ink)}
.totp-row input:focus{outline:none; border-color:var(--nv-blue); box-shadow:0 0 0 3px var(--nv-blue-tint)}
.back-link{background:none; border:none; color:var(--muted); font-size:13px; font-weight:600; padding:0; margin-top:16px; display:inline-flex; align-items:center; gap:6px}
.back-link:hover{color:var(--nv-blue)}
.enroll-secret{font-family:var(--font-body); font-size:15px; font-weight:600; letter-spacing:.08em; background:var(--input-alt);
  border:1px solid var(--line); border-radius:var(--r-sm); padding:11px 13px; word-break:break-all; margin:4px 0 8px}
.enroll-secret-small{font-family:var(--font-body); font-size:11px; font-weight:600; letter-spacing:.06em; color:var(--muted);
  text-align:center; word-break:break-all; margin:10px 0 4px}
.qr-code{display:flex; justify-content:center; margin:10px 0}
.qr-code svg{width:180px; height:180px; background:#fff; border-radius:var(--r-sm); padding:10px; border:1px solid var(--line)}
.codes{display:grid; grid-template-columns:1fr 1fr; gap:8px; margin:8px 0 4px}
.codes span{font-family:var(--font-body); font-size:13.5px; font-weight:600; background:var(--input-alt); border:1px solid var(--line); border-radius:6px; padding:8px 10px; text-align:center}

/* ---------- SHELL ---------- */
.app{display:grid; grid-template-columns:var(--rail-w) 1fr; min-height:100vh}
.rail{background:linear-gradient(180deg, var(--rail-top) 0%, var(--rail-bot) 62%); color:#cfd8de; display:flex; flex-direction:column; position:sticky; top:0; height:100vh}
.rail-logo{padding:22px 0 18px; display:flex; justify-content:center}
.rail-logo img.logo{width:86%}
.nav{padding:6px 12px; flex:1; overflow:auto}
.nav-item{display:flex; align-items:center; gap:12px; padding:10px 12px; border-radius:9px; color:#c2ccd3; font-size:14px; font-weight:500;
  text-decoration:none; margin:2px 0; border:1px solid transparent; cursor:pointer; transition:background .13s, color .13s; width:100%; background:none; text-align:left}
.nav-item svg{width:18px; height:18px; flex:none; opacity:.85}
.nav-item:hover{background:rgba(255,255,255,.06); color:#fff}
.nav-item.active{background:rgba(0,156,222,.16); color:#fff; border-color:rgba(0,156,222,.4)}
.nav-item.active svg{opacity:1; color:var(--nv-blue)}
.nav-section{padding:16px 12px 6px; font-size:11px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:#5f6b74}
.nav-section:first-child{padding-top:6px}
/* Outbound product links, pinned at the foot of the rail above the account
   block. Its children are .nav-item, which is styled by CLASS and not scoped
   to .nav — so only .nav's horizontal padding needed restoring here.
   These must sit OUTSIDE <nav>: .nav is flex:1 and fills the rail, so anything
   inside it renders at the TOP of that space, not the bottom. */
.rail-links{padding:8px 12px; border-top:1px solid rgba(255,255,255,.08)}
.rail-user{border-top:1px solid rgba(255,255,255,.08); padding:14px 16px; display:flex; flex-direction:column; align-items:flex-start; gap:11px}
.rail-user-profile{display:flex; align-items:center; gap:11px; min-width:0; flex:1; border-radius:9px; padding:4px 6px; margin:-4px -6px}
.rail-user-profile:hover{background:rgba(255,255,255,.06)}
.avatar{width:36px; height:36px; border-radius:9px; background:var(--nv-blue); color:#fff; font-family:var(--font-display); font-weight:600; display:grid; place-items:center; font-size:15px; flex:none}
.rail-user .who{min-width:0} .rail-user .who b{display:block; color:#fff; font-size:13.5px; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
/* ⚠️ TRUNCATES LIKE THE NAME ABOVE IT. Line two now carries a CATEGORY plus an
   ORGANISATION NAME, and organisation names are unbounded. Without this a long
   one wraps and pushes the rail's account block out of shape.
   The category is written FIRST so the ellipsis eats the org name, never the
   category: the category is short, fixed and always meaningful, while the user
   already knows which organisation they are in. A title attribute carries the
   untruncated text. */
.rail-user .who span{font-size:12px; color:#8695a0; display:block;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.rail-actions{margin-left:0; display:flex; align-items:center; gap:2px}
.icon-btn{background:none; border:none; color:#8695a0; padding:6px; border-radius:7px}
.icon-btn svg{width:18px; height:18px; display:block}
.icon-btn:hover{color:#fff; background:rgba(255,255,255,.08)}

.main{min-width:0; display:flex; flex-direction:column}
.topbar{height:66px; background:var(--topbar-bg); backdrop-filter:blur(8px); border-bottom:1px solid var(--line); display:flex; align-items:center; gap:16px; padding:0 30px; position:sticky; top:0; z-index:5}
.topbar h1{font-size:20px}
.topbar .crumb{font-size:12px; color:var(--muted-2); font-weight:600; letter-spacing:.04em; text-transform:uppercase; margin-bottom:1px}
.top-right{margin-left:auto; display:flex; align-items:center; gap:12px}
.content{padding:30px; max-width:1240px; width:100%}
.view{animation:rise .3s ease both}
@keyframes rise{from{opacity:0; transform:translateY(8px)} to{opacity:1; transform:none}}

.card{background:var(--paper); border:1px solid var(--line); border-radius:var(--r); box-shadow:var(--shadow)}
.card-h{padding:18px 22px; border-bottom:1px solid var(--line); display:flex; align-items:center; gap:12px}
/* ⚠️ ADDED 2026-08-05 on LEO-01's report, and it is a bug fix rather than a
   preference. The icons in the shared `I` map carry no width/height attributes:
   EVERY size in this file comes from a rule scoped to a parent (.nav-item svg,
   .icon-btn svg, .stat .si svg, .act .ai svg, .btn svg, .drop .di svg,
   .toast .ti svg). .card-h had none, so an icon dropped into a card header has
   nothing bounding it and expands to fill the flex row — LEO-01 rendered a pin
   and a bell several hundred pixels tall and it reached lclarke.
   ⚠️ The failure mode is ENORMOUS, not unstyled, which is worse: unstyled looks
   like a missing class, enormous looks like a broken component.
   18px + flex:none matches the .nav-item / .icon-btn precedent exactly. */
.card-h svg{width:18px; height:18px; flex:none}
.card-h .chevron{font-size:18px; color:var(--muted); line-height:1}
.card-h h3{font-size:16px}
.card-h .sub{font-size:12.5px; color:var(--muted); font-weight:400; font-family:var(--font-body)}
.card-h .more{margin-left:auto; font-size:13px; font-weight:600; color:var(--nv-blue); background:none; border:none}
.card-b{padding:22px}

/* dashboard */
.hero{display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-bottom:24px}
.hero h2{font-size:26px; font-weight:600} .hero p{color:var(--muted); margin:5px 0 0; font-size:14px}
.stats{display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin-bottom:22px}
.stat{background:var(--paper); border:1px solid var(--line); border-radius:var(--r); padding:17px 19px; box-shadow:var(--shadow); position:relative}
.stat .sl{font-size:11.5px; font-weight:600; letter-spacing:.03em; text-transform:uppercase; color:var(--muted)}
.stat .sv{font-family:var(--font-display); font-size:30px; font-weight:600; margin-top:7px; line-height:1}
.stat .sh{font-size:12.5px; color:var(--muted); margin-top:6px}
.stat .si{position:absolute; top:16px; right:16px; width:32px; height:32px; border-radius:9px; display:grid; place-items:center; background:var(--nv-blue-tint); color:var(--nv-blue)}
.stat .si svg{width:17px; height:17px}
.stat.alert .sv{color:var(--bad)} .stat.alert .si{background:var(--bad-tint); color:var(--bad)}
/* Amber tier for stat cards, matching the .alert shape exactly. .stat had ONE
   variant and it was red, while .pill has all three - so a stat card could be
   red or nothing. LEO-01 was setting --warn inline on .sv and .si, duplicating
   a pattern the file already expresses one selector away. */
.stat.warn .sv{color:var(--warn)} .stat.warn .si{background:var(--warn-tint); color:var(--warn)}
.dash-grid{display:grid; grid-template-columns:1.5fr 1fr; gap:22px; align-items:start}
.act{display:flex; align-items:center; gap:13px; padding:13px 22px; border-bottom:1px solid var(--line)}
.act:last-child{border-bottom:none}
.act .ai{width:34px; height:34px; border-radius:9px; display:grid; place-items:center; flex:none}
.act .ai.out{background:var(--nv-blue-tint); color:var(--nv-blue)} .act .ai.in{background:var(--ok-tint); color:var(--ok)}
/* ⚠️ STATUS tiers for .act .ai, added because their absence caused a real
   defect rather than an inconvenience. The set was `out` (blue) and `in`
   (green) with no red and no amber, so LEO-01 used `out` for a fault and
   every offline row showed a BLUE triangle. The class was defined, so the
   CSS gate passed and nothing errored - the .card-h svg failure again.

   ⚠️ AND THE NAMES ARE THE CAUSE, but only HERE. On .dir, `in`/`out` are
   genuinely directional - inbound versus outbound fax - where blue and green
   are CATEGORY colours and the names are correct. On .act .ai the same two
   names carry STATUS, so "out" reads as a category and renders as a decision.
   The defect is .act .ai reusing direction names for status, not the names
   being bad everywhere. Renaming .dir would break a correct thing.

   NOT renaming .ai.in/.ai.out: Nexus uses neither, LEO-01 offered to take the
   churn, but NVT-FAX01's usage is unestablished and its session is
   intermittent. A rename is a removal plus an addition, and the removal
   silently unstyles any host still on the old name - which is the exact
   failure mode this whole class of bug belongs to. Extending is additive and
   safe; the rename wants fax's usage measured first. */
.act .ai.bad{background:var(--bad-tint); color:var(--bad)} .act .ai.warn{background:var(--warn-tint); color:var(--warn)}
.act .ai svg{width:16px; height:16px}
.act .am{min-width:0; flex:1} .act .am b{font-size:13.5px; font-weight:600; display:block} .act .am span{font-size:12.5px; color:var(--muted)}
.act .aw{font-size:12.5px; color:var(--muted-2); white-space:nowrap}
.svc{padding:16px 22px; border-bottom:1px solid var(--line)} .svc:last-child{border-bottom:none}
.svc .sn{font-size:14px; font-weight:600; display:flex; align-items:center; justify-content:space-between; gap:10px}
.svc .sd{font-size:13px; color:var(--muted); margin-top:4px}
.svc .meta{display:flex; gap:16px; margin-top:11px; font-size:12.5px; color:var(--muted); flex-wrap:wrap}
.svc .meta b{color:var(--ink); font-weight:600}

/* send fax */
.compose{display:grid; grid-template-columns:1.35fr 1fr; gap:22px; align-items:start}
.row2{display:grid; grid-template-columns:1fr 1fr; gap:16px}
.field-note{font-size:12px; color:var(--muted); margin:7px 0 0}
.drop{border:1.5px dashed var(--line-strong); border-radius:var(--r-sm); background:var(--input-alt); padding:26px 20px; text-align:center; transition:border-color .15s, background .15s; cursor:pointer}
.drop:hover,.drop.over{border-color:var(--nv-blue); background:var(--nv-blue-tint)}
.drop .di{width:44px; height:44px; border-radius:11px; background:var(--nv-blue-tint); color:var(--nv-blue); display:grid; place-items:center; margin:0 auto 12px}
.drop .di svg{width:22px; height:22px}
.drop b{font-weight:600; font-size:14px} .drop span{display:block; color:var(--muted); font-size:12.5px; margin-top:3px}
.file-chip{display:flex; align-items:center; gap:11px; padding:11px 13px; border:1px solid var(--line); border-radius:var(--r-sm); margin-top:11px; background:var(--input-bg)}
.file-chip .fi{width:34px; height:34px; border-radius:7px; background:var(--bad-tint); color:var(--bad); display:grid; place-items:center; font-size:11px; font-weight:700; flex:none}
.file-chip .fn{font-size:13.5px; font-weight:600} .file-chip .fm{font-size:12px; color:var(--muted)}
.file-chip .rm{margin-left:auto; color:var(--muted-2); background:none; border:none; padding:6px; border-radius:6px}
.file-chip .rm svg{width:16px; height:16px; display:block}
.file-chip .rm:hover{color:var(--bad); background:var(--bad-tint)}
.toggle-row{display:flex; align-items:center; gap:13px; padding:15px 0 0}
.switch{position:relative; width:44px; height:26px; flex:none}
.switch input{opacity:0; width:0; height:0; position:absolute}
.slider{position:absolute; inset:0; background:var(--line-strong); border-radius:999px; transition:background .18s; cursor:pointer}
.slider::before{content:""; position:absolute; width:20px; height:20px; border-radius:50%; background:#fff; top:3px; left:3px; transition:transform .18s; box-shadow:0 1px 3px rgba(29,37,45,.25)}
.switch input:checked + .slider{background:var(--nv-blue)}
.switch input:checked + .slider::before{transform:translateX(18px)}
.toggle-row .tt b{font-size:14px; font-weight:600} .toggle-row .tt span{display:block; font-size:12.5px; color:var(--muted)}
.cover-wrap{margin-top:16px}
.rte{border:1px solid var(--line-strong); border-radius:var(--r-sm); overflow:hidden}
.rte-bar{display:flex; gap:2px; padding:6px; border-bottom:1px solid var(--line); background:var(--input-alt)}
.rte-bar button{width:32px; height:30px; border:none; background:none; border-radius:6px; color:var(--muted); font-size:14px; font-weight:700}
.rte-bar button:hover{background:var(--nv-blue-tint); color:var(--nv-blue)}
.rte-area{padding:13px 14px; min-height:96px; font-size:14px; outline:none; background:var(--input-bg)}
.rte-area:empty::before{content:attr(data-ph); color:var(--muted-2)}
.send-aside .card-b{display:flex; flex-direction:column; gap:14px}
.summ{display:flex; justify-content:space-between; gap:12px; font-size:13.5px; padding:9px 0; border-bottom:1px solid var(--line)}
.summ:last-of-type{border-bottom:none}
.summ .k{color:var(--muted)} .summ .v{font-weight:600; text-align:right; word-break:break-word}

/* table */
.table-wrap{overflow-x:auto}
table{width:100%; border-collapse:collapse}
thead th{text-align:left; font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--muted); padding:12px 22px; border-bottom:1px solid var(--line); white-space:nowrap}
tbody td{padding:14px 22px; border-bottom:1px solid var(--line); font-size:13.5px; vertical-align:middle}
tbody tr:last-child td{border-bottom:none}
tbody tr:hover{background:var(--input-alt)}
.dir{display:inline-flex; align-items:center; gap:7px; font-weight:600; font-size:13px}
.dir svg{width:15px; height:15px}
.dir.in{color:var(--ok)} .dir.out{color:var(--nv-blue)}
.num{font-weight:600}
.dl{color:var(--nv-blue); background:none; border:1px solid var(--line); border-radius:7px; height:32px; padding:0 11px; font-size:12.5px; font-weight:600; display:inline-flex; align-items:center; gap:6px; text-decoration:none}
.dl:hover{background:var(--nv-blue-tint); border-color:var(--nv-blue)}
.dl:disabled{color:var(--muted-2); border-color:var(--line); cursor:not-allowed}
.dl svg{width:14px; height:14px}
.dl.danger{color:var(--bad); border-color:rgba(208,52,44,.35)}
.dl.danger:hover{background:var(--bad-tint); border-color:var(--bad)}
.dl.danger:disabled{color:var(--muted-2); border-color:var(--line)}
.filters{display:flex; gap:9px; margin-left:auto}
.seg{display:flex; border:1px solid var(--line); border-radius:8px; overflow:hidden; background:var(--paper)}
.seg button{height:32px; padding:0 13px; border:none; background:none; font-size:13px; font-weight:600; color:var(--muted)}
.seg button.on{background:var(--charcoal); color:#fff}
[data-theme="dark"] .seg button.on{background:var(--nv-blue)}
.empty{padding:44px 22px; text-align:center; color:var(--muted)}
.empty b{display:block; font-size:15px; color:var(--ink); font-weight:600; margin-bottom:4px}

/* ---------- pagination ---------- */
.pager{display:flex; align-items:center; gap:18px; padding:14px 22px; border-top:1px solid var(--line); flex-wrap:wrap}
.pager-info{font-size:12.5px; color:var(--muted); margin-right:auto}
.pager-size{display:flex; align-items:center; gap:8px; font-size:12.5px; color:var(--muted)}
.pager-select{height:32px; padding:0 26px 0 10px; border:1px solid var(--line-strong); border-radius:7px;
  background:var(--input-bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%235e6e79' d='M6 8 0 0h12z'/%3E%3C/svg%3E") no-repeat right 10px center;
  appearance:none; font-size:13px; color:var(--ink); font-family:var(--font-body)}
.pager-nav{display:flex; align-items:center; gap:10px}
.pager-page{font-size:12.5px; color:var(--muted); white-space:nowrap}
/* Added 2026-08-03 on NVT-FAX01, adopted into the shared file 2026-08-05.
   Used 3x in the fax portal (Show / Tenant / Viewing labels) where it had no
   rule, so those labels rendered with default browser styling beside
   correctly-styled siblings. Matches the .pager-* family.
   ⚠️ THIS COMMENT IS THE REASON THE RULE EXISTS. The header above records that
   it is used three times, which is the reconciliation fact; this records why —
   which is the evidence against deleting it as purposeless. Body is currently
   byte-identical to .pager-page; they are kept SEPARATE deliberately, because
   merging would encode "these are the same thing" and the next divergence
   would have to un-encode it. (FAX01's text, carried by its request.) */
.pager-label{font-size:12.5px; color:var(--muted); white-space:nowrap}

/* ---------- modal (rejection headers) ---------- */
.modal-overlay{position:fixed; inset:0; background:rgba(10,14,18,.55); backdrop-filter:blur(2px); z-index:60; display:flex; align-items:center; justify-content:center; padding:24px}
.modal{background:var(--paper); border:1px solid var(--line); border-radius:var(--r); box-shadow:var(--shadow-lg); width:100%; max-width:560px; max-height:80vh; display:flex; flex-direction:column}
.modal-h{padding:16px 20px; border-bottom:1px solid var(--line); display:flex; align-items:center; gap:12px}
.modal-h h3{font-size:15px}
.modal-h button{margin-left:auto; background:none; border:none; color:var(--muted); padding:6px; border-radius:7px}
.modal-h button:hover{color:var(--ink); background:var(--input-alt)}
.modal-b{padding:18px 20px; overflow:auto}
.hdrs{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:12.5px; line-height:1.6; white-space:pre-wrap; word-break:break-word; background:var(--input-alt); border:1px solid var(--line); border-radius:var(--r-sm); padding:14px; color:var(--ink)}

/* ---------- received / rejections ---------- */
.act .aw.col{display:flex; flex-direction:column; align-items:flex-end; gap:6px}
/* toast */
.toast{position:fixed; right:26px; bottom:26px; background:var(--charcoal); color:#fff; z-index:50; border-radius:var(--r);
  padding:14px 16px 14px 15px; display:flex; align-items:center; gap:13px; box-shadow:var(--shadow-lg);
  transform:translateY(140%); transition:transform .35s cubic-bezier(.2,.9,.3,1); max-width:360px}
.toast.show{transform:none}
[data-theme="dark"] .toast{background:#000; border:1px solid var(--line)}
.toast .ti{width:34px; height:34px; border-radius:9px; background:rgba(0,156,222,.2); color:var(--nv-blue); display:grid; place-items:center; flex:none}
.toast .ti svg{width:18px; height:18px}
.toast.bad .ti{background:var(--bad-tint); color:var(--bad)}
.toast b{font-size:14px; display:block} .toast span{font-size:12.5px; color:#aeb9c1}

/* responsive */
.burger{display:none; width:38px; height:38px; border:1px solid var(--line); border-radius:8px; background:var(--paper); color:var(--ink); align-items:center; justify-content:center}
.burger svg{width:20px; height:20px}
@media (max-width:960px){ .stats{grid-template-columns:repeat(2,1fr)} .dash-grid{grid-template-columns:1fr} }
@media (max-width:900px){
  .app{grid-template-columns:1fr}
  .rail{position:fixed; left:0; top:0; z-index:40; transform:translateX(-100%); transition:transform .25s; box-shadow:var(--shadow-lg)}
  .rail.open{transform:none}
  .burger{display:inline-flex}
  .compose{grid-template-columns:1fr} .content{padding:20px}
}
@media (max-width:560px){ .row2{grid-template-columns:1fr} .stats{grid-template-columns:1fr} .hero{flex-direction:column; align-items:flex-start} }
@media (prefers-reduced-motion:reduce){ *{animation:none !important; transition:none !important} }
