/* =====================================================================
 * PHA PORTAL v2 — portal.css (2026-08-08)
 * Frame: compliance.rentspire.com Shell (240px grouped sidebar, sticky
 * page header, stat cards, one workspace per nav item).
 * Skin: the PHA solutions system — graph-grid canvas, --pha-* tokens,
 * IBM Plex Mono numerals, terminal radii (pha-shared.css).
 * Owner directive 2026-08-07: "FRAME THE APP TO THE MOLD OF THE
 * COMPLIANCE.RENTSPIRE.COM PORTAL, BUT KEEPING THE OVERALL
 * AESTHETICS/FEEL OF THE PHA SOLUTIONS" + grandma-simple, few words.
 * ===================================================================== */

body.portal{
  margin:0;font:400 14px/1.5 var(--pha-font-body,Inter,system-ui);
  color:var(--pha-text,#0a0d11);
  background:
    radial-gradient(1100px 600px at 50% -10%, rgba(16, 64, 127,.07), transparent 60%),
    linear-gradient(rgba(148,163,184,.16) 1px, transparent 1px),
    linear-gradient(90deg, rgba(148,163,184,.16) 1px, transparent 1px);
  background-size:auto,46px 46px,46px 46px;
  background-attachment:fixed;
  background-color:var(--pha-canvas,#f4f3ef);
}

/* ---------- App frame: sidebar + header + scrolling main ------------- */
.pt-app{display:grid;grid-template-columns:240px 1fr;grid-template-rows:auto 1fr;height:100vh;overflow:hidden}

/* ---------- Sidebar --------------------------------------------------- */
.pt-side{grid-row:1/3;display:flex;flex-direction:column;overflow-y:auto;overscroll-behavior:contain;
  background:rgba(249,251,253,.94);border-right:1px solid #cfd6e0}
.pt-brand{display:flex;align-items:center;gap:9px;padding:13px 14px 11px}
.pt-brand svg{width:22px;height:22px;color:var(--pha-blue,#10407f)}
.pt-brand b{display:block;font-size:13.5px;font-weight:700;letter-spacing:-.01em;line-height:1.1}
.pt-brand span{display:block;font:600 11px/1.4 var(--pha-font-mono,monospace);letter-spacing:.13em;color:var(--pha-text-muted,#3b4652)}
.pt-pha{margin:0 10px 8px;padding:9px 11px;background:#fff;border:1px solid #cfd6e0;border-radius:6px;position:relative}
.pt-pha-name{font-size:12.5px;font-weight:700;line-height:1.25}
.pt-pha-code{font:500 11px/1.6 var(--pha-font-mono,monospace);letter-spacing:.04em;color:var(--pha-text-muted,#3b4652)}
.pt-pha-tag{position:absolute;top:8px;right:8px;font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.1em;
  color:var(--pha-green,#106339);background:var(--pha-green-bg,#d3ead9);border:1px solid #bfe0d2;border-radius:3px;padding:3px 5px}

.pt-nav{flex:1;padding:2px 10px 10px}
.pt-nav-sec{margin:13px 2px 4px;font:800 11px/1 Inter,system-ui;letter-spacing:.15em;color:var(--pha-blue,#10407f);text-transform:uppercase}
.pt-nav-sec:first-child{margin-top:4px}
.pt-nav a{display:flex;align-items:center;gap:7px;margin-bottom:1px;padding:6px 9px;border-radius:6px;
  font-size:13px;font-weight:500;color:var(--pha-text-secondary,#1d262f);text-decoration:none;position:relative}
.pt-nav a:hover{background:#eef2f8}
.pt-nav a.on{background:#e1ebf8;color:#0b3268;font-weight:700}
.pt-nav a.on::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:2px;background:var(--pha-blue,#10407f)}
.pt-nav a .grow{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.bd{font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.09em;border-radius:3px;padding:3px 5px;flex:0 0 auto}
.bd-live{color:var(--pha-green,#106339);background:var(--pha-green-bg,#d3ead9);border:1px solid #bfe0d2}
.bd-build{color:var(--pha-amber,#82500a);background:var(--pha-amber-bg,#f3e4c8);border:1px solid #e8d5ae}
.bd-product{color:#fff;background:var(--pha-blue,#10407f);border:1px solid var(--pha-blue,#10407f)}

.pt-side-foot{border-top:1px solid #cfd6e0;padding:10px 12px}
.pt-me{display:flex;align-items:center;gap:9px;margin-bottom:8px}
.pt-avatar{flex:0 0 30px;width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:rgba(16, 64, 127,.14);color:var(--pha-blue,#10407f);font:700 11px/1 Inter,system-ui}
.pt-me-name{font-size:12px;font-weight:600;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pt-me-sub{font:500 11px/1.5 var(--pha-font-mono,monospace);color:var(--pha-text-muted,#3b4652)}
.pt-side-foot .out{display:flex;align-items:center;justify-content:center;gap:6px;padding:6px;border:1px solid #cfd6e0;
  border-radius:6px;font-size:12px;font-weight:500;color:var(--pha-text-muted,#3b4652);text-decoration:none;background:#fff}
.pt-side-foot .out:hover{background:#eef2f8}

/* ---------- Header ---------------------------------------------------- */
.pt-top{grid-column:2;display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:11px 26px;background:rgba(255,255,255,.85);backdrop-filter:blur(8px);border-bottom:1px solid #cfd6e0}
.pt-top h1{margin:0;font-size:16.5px;font-weight:700;letter-spacing:-.01em;line-height:1.2}
.pt-top .sub{margin-top:1px;font-size:12px;color:var(--pha-text-muted,#3b4652)}
.pt-top-badge{display:flex;align-items:center;gap:6px;font:600 11px/1 var(--pha-font-mono,monospace);letter-spacing:.08em;
  color:var(--pha-text-muted,#3b4652);background:#fff;border:1px solid #cfd6e0;border-radius:5px;padding:7px 10px;white-space:nowrap}
.pt-top-badge .dot{width:7px;height:7px;border-radius:50%;background:var(--pha-green,#106339)}

/* ---------- Main ------------------------------------------------------ */
.pt-main{grid-column:2;overflow-y:auto;overscroll-behavior:contain;padding:20px 26px 40px}
.pt-page{max-width:1120px;margin:0 auto}
.pt-page[hidden]{display:none}

.pt-sec{margin:22px 0 10px;display:flex;align-items:baseline;gap:10px}
.pt-sec h2{margin:0;font-size:13px;font-weight:700;letter-spacing:.01em}
.pt-sec .sub{font-size:12px;color:var(--pha-text-muted,#3b4652)}
.pt-sec a{font-size:12px;font-weight:600;color:var(--pha-blue,#10407f);text-decoration:none;margin-left:auto}
.pt-sec a:hover{text-decoration:underline}

/* Hero action — dark blue PHA showcase panel */
.pt-hero{display:flex;align-items:center;gap:18px;justify-content:space-between;border-radius:8px;padding:20px 24px;
  color:var(--pha-on-dark,#fff);border:1px solid #123c73;
  background:linear-gradient(160deg,#163c73 0%,#10407f 100%);box-shadow:0 10px 30px rgba(16,60,115,.25)}
.pt-hero h2{margin:0 0 3px;font-size:18px;font-weight:800;letter-spacing:-.01em}
.pt-hero p{margin:0;font-size:12.5px;color:var(--pha-on-dark-body,#dce8f7)}
.pt-hero .go{flex:0 0 auto;display:inline-block;background:#fff;color:#0b3268;font-size:13.5px;font-weight:700;
  text-decoration:none;border-radius:6px;padding:11px 18px}
.pt-hero .go:hover{background:#e9f0fa}

/* Stat cards */
.pt-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:14px}
.pt-kpi{background:#fff;border:1px solid #cfd6e0;border-radius:6px;padding:12px 14px;box-shadow:var(--pha-shadow-card)}
.pt-kpi .v{font:600 23px/1.15 var(--pha-font-mono,monospace);letter-spacing:-.01em}
.pt-kpi .l{margin-top:3px;font-size:11.5px;font-weight:600;color:var(--pha-text-muted,#3b4652)}
.pt-kpi.k-build .v{color:var(--pha-text-muted,#3b4652)}
.pt-kpi .bd{margin-left:6px;vertical-align:2px}
/* 2026-08-16: honest no-authority state — em-dash KPIs carry a visible reason and a way out */
.pt-kpi.pt-kpi-unset .v{color:var(--pha-text-muted,#3b4652)}
.pt-kpi .pt-kpi-hint{display:block;margin-top:5px;font-size:11px;line-height:1.4;font-weight:600;color:#0e7490;text-decoration:none}
.pt-kpi .pt-kpi-hint:hover{text-decoration:underline}

/* Station tiles (dashboard) */
.pt-stations{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.pt-st{display:flex;align-items:center;gap:9px;background:#fff;border:1px solid #cfd6e0;border-radius:6px;
  padding:9px 11px;text-decoration:none;color:inherit;box-shadow:var(--pha-shadow-card)}
.pt-st:hover{border-color:var(--pha-blue,#10407f)}
.pt-st .num{flex:0 0 auto;font:700 11px/1 var(--pha-font-mono,monospace);color:#fff;background:#5a6b85;border-radius:4px;padding:4px 5px}
.pt-st.product .num{background:var(--pha-blue,#10407f)}
.pt-st .nm{flex:1;font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* One-line rows (pipeline / checklists / tools) */
.pt-rows{display:flex;flex-direction:column;gap:6px}
/* 2026-08-11 owner: quick-tool bars — whole bar clickable, capped width */
.pt-rows-tools{max-width:560px}
.pt-row-link{text-decoration:none;color:inherit;cursor:pointer}
.pt-row-link:hover{border-color:var(--pha-blue,#10407f);box-shadow:0 2px 8px rgba(16, 64, 127,.12)}
.pt-row-link:hover .act{text-decoration:underline}
.pt-row-link .act{color:var(--pha-blue,#10407f);font-weight:700;font-size:12.5px}
.pt-row{display:flex;align-items:center;gap:11px;background:#fff;border:1px solid #cfd6e0;border-radius:6px;
  padding:10px 13px;box-shadow:var(--pha-shadow-card)}
.pt-row .num{flex:0 0 auto;font:700 11px/1 var(--pha-font-mono,monospace);color:#fff;background:#5a6b85;border-radius:4px;padding:4px 6px}
.pt-row.product .num{background:var(--pha-blue,#10407f)}
.pt-row .nm{font-size:13px;font-weight:600}
.pt-row .d{font-size:12px;color:var(--pha-text-muted,#3b4652);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pt-row .sp{flex:1}
.pt-row a.act{font-size:12.5px;font-weight:700;color:var(--pha-blue,#10407f);text-decoration:none;white-space:nowrap}
.pt-row a.act:hover{text-decoration:underline}

/* Forms table */
.pt-table{width:100%;border-collapse:separate;border-spacing:0;background:#fff;border:1px solid #cfd6e0;border-radius:6px;overflow:hidden}
.pt-table th{font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.1em;text-transform:uppercase;text-align:left;
  color:var(--pha-text-muted,#3b4652);background:#f4f3ef;border-bottom:1px solid #cfd6e0;padding:9px 13px}
.pt-table td{font-size:12.5px;border-bottom:1px solid #e4e9f0;padding:9px 13px;vertical-align:middle}
.pt-table tr:last-child td{border-bottom:0}
.pt-table .fno{font:600 11.5px/1 var(--pha-font-mono,monospace);white-space:nowrap}
.pt-table .use{font:600 11px/1 var(--pha-font-mono,monospace);letter-spacing:.07em;color:var(--pha-cyan,#0a5675);
  background:var(--pha-cyan-bg,#d6e9f3);border:1px solid #bcd9e8;border-radius:3px;padding:3px 6px;white-space:nowrap}
.pt-table a{font-weight:700;color:var(--pha-blue,#10407f);text-decoration:none;white-space:nowrap}
.pt-table a:hover{text-decoration:underline}

/* Module cards (plan) */
.pt-mods{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
.pt-mod{background:#fff;border:1px solid #cfd6e0;border-radius:6px;padding:14px 16px;box-shadow:var(--pha-shadow-card)}
.pt-mod .t{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:700}
.pt-mod .d{margin-top:5px;font-size:12.5px;color:var(--pha-text-secondary,#1d262f)}
.pt-mod .q{margin-top:9px}
.pt-mod .q a{font-size:12.5px;font-weight:700;color:var(--pha-blue,#10407f);text-decoration:none}
.pt-mod .q a:hover{text-decoration:underline}

/* Footnote */
.pt-note{margin-top:22px;font-size:11.5px;color:var(--pha-text-muted,#3b4652);border-top:1px solid #cfd6e0;padding-top:10px}

/* ---------- Sign-in gate (compliance login mold, graph-grid skin) ----- */
/* ==== Gate v3 (2026-08-08, owner): live national map behind a translucent
   sign-in card + compact live-grid. The map underneath stays interactive;
   .exploring hides the foreground (Explore toggle / M key; Esc returns). == */
/* Wave 6 (2026-08-31, WCAG 2.1.1/1.4.10 follow-through): the gate is no
   longer a fixed inset:0 overlay with its own inner scroller — it sits in
   normal flow and the DOCUMENT is the scroll container, so Space/PageDown/
   End work without first placing focus inside a div scroller. The signed-in
   .pt-app is hidden+inert+display:none whenever the gate is visible (Wave 2b
   reveal sync), so nothing needs to be overlaid. min-height keeps the gate
   canvas filling the viewport on short content. */
.pt-gate{position:relative;z-index:60;background:var(--pha-canvas,#f4f3ef);min-height:100vh}
.pt-gate[hidden]{display:none}
#gate-map{position:absolute;inset:0}
#gate-map .maplibregl-popup-content{font:12px/1.45 Inter,system-ui;padding:8px 11px;border-radius:6px}
.pt-gate-card{pointer-events:auto}
.pt-gate-card{background:rgba(255,255,255,.78);-webkit-backdrop-filter:blur(14px) saturate(1.15);
  backdrop-filter:blur(14px) saturate(1.15);border:1px solid rgba(207,214,224,.85);border-radius:10px;
  box-shadow:0 20px 60px rgba(10,13,17,.22);width:100%;max-width:390px;padding:24px 26px;
  max-height:calc(100vh - 90px);overflow-y:auto;scrollbar-width:thin}
.pt-gate-explore{position:absolute;top:16px;right:16px;z-index:3;display:flex;align-items:center;gap:7px;
  font:700 12px/1 Inter,system-ui;color:#0a0d11;background:rgba(255,255,255,.9);
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  border:1px solid #c3ccd8;border-radius:20px;padding:9px 15px;cursor:pointer;
  box-shadow:0 6px 20px rgba(10,13,17,.16)}
.pt-gate-explore:hover{background:#fff;border-color:#8fa3c0}
.pt-gate-explore kbd{font:700 11px/1 var(--pha-font-mono,monospace);background:#eef2f8;border:1px solid #c3ccd8;
  border-radius:4px;padding:2px 5px;color:#3b4652}
.pt-gate-card h1,.pt-gate-card .pt-gate-h1{margin:0 0 6px;font-size:21px;font-weight:800;letter-spacing:-.01em}
.pt-gate-card .sub{margin:0 0 16px;font-size:12.5px;color:var(--pha-text-muted,#3b4652)}
.pt-gate-card label{display:block;margin:11px 0 4px;font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.11em;
  text-transform:uppercase;color:var(--pha-text-muted,#3b4652)}
.pt-gate-card select{width:100%;font:500 13.5px/1.3 Inter,system-ui;color:var(--pha-text,#0a0d11);background:#f6f8fb;
  border:1px solid #c3ccd8;border-radius:6px;padding:10px 12px;appearance:auto}
.pt-gate-card select:disabled{color:#8b95a3}
#gate-btn{width:100%;margin-top:16px;font:700 13.5px/1 Inter,system-ui;color:#fff;background:var(--pha-blue,#10407f);
  border:1px solid var(--pha-blue,#10407f);border-radius:6px;padding:12px;cursor:pointer}
#gate-btn:hover{background:var(--pha-blue-hover,#0b3268)}
#gate-btn:disabled{background:#9fb4d1;border-color:#9fb4d1;cursor:default}
.pt-gate-foot{display:flex;gap:7px;margin-top:14px;font-size:11px;line-height:1.45;color:var(--pha-text-muted,#3b4652)}
/* gv13 basemap toggle — Satellite / Dark / Light pills, bottom-left of the map */
.gv13-basemap{position:absolute;left:12px;bottom:12px;z-index:5;display:flex;gap:0;border-radius:8px;overflow:hidden;
  border:1px solid rgba(15,23,42,.28);box-shadow:0 2px 10px rgba(5,12,25,.35);backdrop-filter:blur(6px)}
.gv13-bm-btn{appearance:none;border:none;cursor:pointer;padding:7px 12px;font:600 11px/1 Inter,system-ui;letter-spacing:.02em;
  background:rgba(10,16,26,.72);color:#cfd8e4;border-right:1px solid rgba(255,255,255,.12)}
.gv13-bm-btn:last-child{border-right:none}
.gv13-bm-btn:hover{background:rgba(24,34,50,.85);color:#fff}
.gv13-bm-btn.on{background:#eaf1fa;color:#12314f}
.pt-gate-foot svg{flex:0 0 auto;margin-top:1px;color:var(--pha-green,#106339)}

/* Portal-global PHA SIGNAL ticker: reserve its 34px so it never covers the
   app or the Station-4 iframe dock. Class is set by pha-signal.js only when
   real items rendered — an empty feed leaves the full viewport alone. */
body.ps-on .pt-app{height:calc(100vh - 34px)}
/* v15: the in-gate legal footer must clear the fixed ticker bar */
body.ps-on .pt-gate .pt-legal-footer{padding-bottom:calc(1.5rem + 40px)}

/* ---------- Small screens (portal is a desk tool; keep it usable) ----- */
.pt-menu-btn{display:none}
/* 2026-08-15 hotfix: #pt-scrim has no base rule above the 900px breakpoint,
   so it falls back to the browser default display:block/position:static and
   fully participates in the .pt-app grid's auto-placement (it has no explicit
   grid-row/column). That inserts a phantom implicit row 3, which desyncs
   grid-template-rows:auto 1fr from .pt-side's grid-row:1/3 span and collapses
   the entire sidebar nav to ~12px tall on desktop. Take it out of grid flow
   and normal document flow at every width so it can never be auto-placed. */
.pt-scrim{display:none;position:fixed;inset:0}
@media (max-width:900px){
  .pt-app{grid-template-columns:1fr}
  .pt-side{display:none}
  .pt-top,.pt-main{grid-column:1}
  .pt-kpis{grid-template-columns:repeat(2,1fr)}
  .pt-stations{grid-template-columns:1fr}
  .pt-mods{grid-template-columns:1fr}
  /* v16.5 (round-4 audit): the sidebar must stay reachable on a phone —
     hamburger in the top bar opens it as a left drawer over a scrim. */
  .pt-menu-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex:0 0 auto;
    border:1px solid #cfd6e0;border-radius:8px;background:#fff;color:#0b3268;cursor:pointer;margin-right:10px}
  .pt-menu-btn svg{width:20px;height:20px}
  .pt-top{display:flex;align-items:center}
  .pt-app.side-open .pt-side{display:flex;position:fixed;top:0;left:0;bottom:0;width:min(300px,85vw);z-index:90;
    box-shadow:0 0 40px rgba(10,25,50,.35)}
  .pt-scrim{display:none}
  .pt-app.side-open .pt-scrim{display:block;position:fixed;inset:0;background:rgba(10,20,40,.45);z-index:85}
  /* hero CTA: never overflow the blue card — stack and go full-width */
  .pt-hero{flex-wrap:wrap}
  .pt-hero .go{flex:1 1 100%;text-align:center}
}

/* ===== Station 4: rrpro embedded pixel-for-pixel (2026-08-08) ============ */
.pt-main.rr{padding:0;overflow:hidden}
.pt-page-rr{max-width:none;height:100%;position:relative}
#rr-frame,#compliance-frame{display:block;width:100%;height:100%;border:0;background:#f4f3ef}
/* 2026-08-11 owner ("weird flashing"): neutral veil while the embed boots — the iframe
   stays invisible until its load event, so the marketing landing never paints through. */
#rr-frame{opacity:0;transition:opacity .18s ease}
.pt-page-rr.ready #rr-frame{opacity:1}
#page-rr::before{content:"Loading your Station 4 workspace\2026";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font:600 13px/1 Inter,system-ui;color:#5a6b85;background:#f4f3ef;z-index:1}
#page-rr.ready::before{display:none}

/* ============ 2026-08-08 sidebar IA rebuild (owner directive) ============ */
.pt-nav{overflow-y:auto;scrollbar-width:thin}
.bd-road{color:#5b5f6b;background:#e9ebf0;border:1px solid #d4d8e0}
.pt-nav-toggle{display:flex;align-items:center;gap:7px;width:100%;margin-bottom:1px;padding:6px 9px;
  border:0;border-radius:6px;background:none;cursor:pointer;text-align:left;
  font:700 12.5px/1.35 Inter,system-ui;color:#2b3648}
.pt-nav-toggle:hover{background:#eef2f8}
.pt-nav-toggle .grow{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pt-nav-toggle .chev{font-size:11px;color:#8291a8;transition:transform .15s ease}
.pt-nav-group.closed .pt-nav-toggle .chev{transform:rotate(-90deg)}
.pt-nav-group.closed .pt-nav-sub{display:none}
.pt-nav-sub{margin:0 0 3px 10px;padding-left:7px;border-left:1px solid #dbe3ee}
.pt-nav-sub a .num{flex:0 0 auto;width:17px;font:700 11px/1 "IBM Plex Mono",ui-monospace,monospace;color:#8291a8}

/* 2026-08-08 owner pass: adjustable sidebar. Width is a CSS var driven by the
   drag handle below; persisted per browser in localStorage (pt-side-w). */
.pt-app{grid-template-columns:var(--pt-side-w,288px) 1fr}
.pt-app{position:relative}
.pt-resize{position:absolute;top:0;left:calc(var(--pt-side-w,288px) - 2px);width:7px;height:100%;cursor:col-resize;z-index:60}
.pt-resize:hover,.pt-resize.drag{background:rgba(16, 64, 127,.25)}

/* ---------- Roles & Permissions page ---------- */
.pt-card{background:#fff;border:1px solid #cfd6e0;border-radius:6px;padding:14px 16px;box-shadow:var(--pha-shadow-card);margin-top:14px}
.pt-card-t{font:600 12px/1.3 var(--pha-font-mono,monospace);letter-spacing:.08em;text-transform:uppercase;color:var(--pha-text-muted,#3b4652);margin-bottom:8px}
.pt-roles-intro p{margin:0 0 8px;font-size:13.5px;line-height:1.55}
.pt-roles-sub{font-size:12px;color:var(--pha-text-muted,#3b4652);line-height:1.5;margin:6px 0 0}
.pt-roles-kpis{margin-top:14px}
.pt-sod ul{margin:0;padding-left:18px;font-size:13px;line-height:1.65}
.pt-rollout ol{margin:0;padding-left:20px;font-size:13px;line-height:1.7}
.pt-rollout li{margin-bottom:8px}
.pt-role-picker{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.pt-role-btn{font:600 11.5px/1 var(--pha-font-mono,monospace);letter-spacing:.03em;padding:7px 11px;border:1px solid #cfd6e0;border-radius:99px;background:#fff;color:#243040;cursor:pointer}
.pt-role-btn.on{background:#12315e;border-color:#12315e;color:#fff}
.pt-nav a.role-hidden{opacity:.32;filter:grayscale(1)}
.pt-matrix-legend{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:8px;font-size:11px}
.pm{font:600 11px/1 var(--pha-font-mono,monospace);padding:4px 8px;border-radius:3px;border:1px solid transparent}
.pm-approve,.pm-cell.pm-approve{background:#0f4c2f;color:#eafff3}
.pm-write,.pm-cell.pm-write{background:#d3ead9;color:#106339;border-color:#bfe0d2}
.pm-read,.pm-cell.pm-read{background:#e7eef9;color:#1d4c8f;border-color:#d3e0f2}
.pm-none,.pm-cell.pm-none{background:#f4f5f7;color:#9aa2ad}
.pm-pii{font:600 11px/1 var(--pha-font-mono,monospace);padding:4px 8px;border-radius:3px;background:#f3e4c8;color:#82500a;border:1px solid #e8d5ae}
.pt-matrix-wrap{overflow-x:auto;border:1px solid #e2e7ee;border-radius:4px}
.pt-matrix{border-collapse:collapse;width:100%;font-size:11.5px}
.pt-matrix th{position:sticky;top:0;background:#12315e;color:#fff;font:600 11px/1.2 var(--pha-font-mono,monospace);letter-spacing:.04em;text-transform:uppercase;padding:8px 6px;text-align:center;white-space:nowrap}
.pt-matrix th.pk{text-align:left;padding-left:10px}
.pt-matrix td{border-top:1px solid #edf0f4;padding:6px;text-align:center}
.pt-matrix tr.dom td{background:#eef2f8;font:600 11px/1.2 var(--pha-font-mono,monospace);letter-spacing:.08em;text-transform:uppercase;color:#3b4652;text-align:left;padding:6px 10px}
.pt-matrix td.pk{text-align:left;padding-left:10px;min-width:230px}
.pt-matrix td.pk .key{font:600 11.5px/1.3 var(--pha-font-mono,monospace)}
.pt-matrix td.pk .desc{display:block;font-size:11px;color:#67707c;margin-top:2px}
.pt-matrix td.pk .pii{font:600 11px/1 var(--pha-font-mono,monospace);padding:2px 5px;border-radius:3px;background:#f3e4c8;color:#82500a;border:1px solid #e8d5ae;margin-left:4px;vertical-align:1px}
.pt-matrix .pm-cell{font:600 11px/1 var(--pha-font-mono,monospace)}

/* Phase 2 staff sign-in */
.pt-gate-tabs{display:flex;gap:6px;margin:0 0 12px}
.pt-gtab{flex:1;font:700 11px/1 Inter,system-ui;letter-spacing:.02em;padding:8px 10px;border:1px solid #c3ccd8;border-radius:6px;background:#f6f8fb;color:var(--pha-text-muted,#3b4652);cursor:pointer}
.pt-gtab.on{background:var(--pha-blue,#10407f);border-color:var(--pha-blue,#10407f);color:#fff}
.pt-gate-card input{width:100%;font:500 13.5px/1.3 Inter,system-ui;color:var(--pha-text,#0a0d11);background:#f6f8fb;border:1px solid #c3ccd8;border-radius:6px;padding:10px 12px;box-sizing:border-box}
.pt-gate-cta{width:100%;margin-top:16px;font:700 13.5px/1 Inter,system-ui;color:#fff;background:var(--pha-blue,#10407f);border:1px solid var(--pha-blue,#10407f);border-radius:6px;padding:12px;cursor:pointer}
.pt-gate-cta:hover{background:var(--pha-blue-hover,#0b3268)}
.pt-gate-cta.ghost{background:#fff;color:var(--pha-blue,#10407f);margin-top:8px}
.pt-gate-cta.ghost:hover{background:#f4f3ef}
.pt-gate-cta:disabled{background:#9fb4d1;border-color:#9fb4d1;cursor:default}
.pt-gate-msg{margin-top:12px;font:500 12px/1.55 Inter,system-ui;color:var(--pha-text-muted,#3b4652);background:#f4f3ef;border:1px solid #d5dce6;border-radius:6px;padding:9px 11px}
.pt-gate-msg.err{color:#8c2f22;background:rgba(190,60,40,.06);border-color:#d9a79e}
.pt-gate-msg.okc{color:#106339;background:rgba(16,99,57,.06);border-color:#a9cbb8}
.pt-signed-badge{display:inline-flex;align-items:center;gap:5px;font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.08em;color:#106339;background:rgba(16,99,57,.08);border:1px solid #a9cbb8;border-radius:999px;padding:3px 8px;margin-top:4px;text-transform:uppercase}
.pt-roleless-notice{max-width:640px;margin:0 0 20px;padding:18px 20px;background:#fff8ec;border:1px solid #e8c98d;border-radius:10px;font:500 14px/1.6 Inter,system-ui;color:#4a3a1c}
.pt-roleless-notice h2{margin:0 0 8px;font:700 18px/1.3 Inter,system-ui;color:#5a3f0f}
.pt-roleless-notice p{margin:0 0 10px}
.pt-roleless-notice p.acct{font-size:13px;color:#6b5a34}
.pt-roleless-notice a{color:var(--pha-blue,#10407f);font-weight:700}
.pt-roleless-notice button{font:600 13px/1 Inter,system-ui;padding:8px 14px;border-radius:6px;border:1px solid #c9ab63;background:#fff;color:#4a3a1c;cursor:pointer}
.pt-roleless-notice button:hover{background:#f6ecd7}
/* v18 P2 register #20: neutral variant — a guest browsing restored context */
.pt-guest-badge{color:#5b6b80;background:rgba(91,107,128,.08);border-color:#b9c4d2}

/* ---------- EIV / UAAF attestation gate (Phase 2) ---------------------
 * The database withholds the permission; this card explains why in plain
 * words and offers the attestation. Three states: blocked, renewal-soon,
 * authorized. Text colours are checked against each background.
 * ------------------------------------------------------------------- */
.pt-eiv{margin:0 0 16px;padding:15px 17px;border-radius:8px;border:1px solid #cfd6e0;background:#fff}
.pt-eiv.blocked{border-color:#e2b9b3;background:#fdf4f2}
.pt-eiv.warn{border-color:#e0cfa4;background:#fdf9ee}
.pt-eiv.ok{border-color:#bfe0d2;background:#f3faf6}
.pt-eiv-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:7px}
.pt-eiv-h b{font-size:14.5px;font-weight:700;letter-spacing:-.01em;color:#0a0d11}
.pt-eiv-pill{font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.11em;text-transform:uppercase;
  border-radius:3px;padding:5px 7px;white-space:nowrap}
.pt-eiv-pill.blocked{color:#8c2f22;background:#f7dcd6;border:1px solid #e2b9b3}
.pt-eiv-pill.warn{color:#7a5a10;background:#f8ecca;border:1px solid #e0cfa4}
.pt-eiv-pill.ok{color:#106339;background:#d3ead9;border:1px solid #bfe0d2}
.pt-eiv p{margin:0 0 9px;font-size:13.5px;line-height:1.55;color:#1d2733;max-width:74ch}
.pt-eiv-fine{font-size:12px !important;color:#4a5666 !important}
.pt-eiv-form{display:flex;gap:14px;flex-wrap:wrap;margin:11px 0 4px}
.pt-eiv-form label{display:flex;flex-direction:column;gap:5px;font-size:12.5px;font-weight:600;color:#1d2733}
.pt-eiv-form input[type=date]{font:400 13.5px/1.4 var(--pha-font-body,Inter,system-ui);color:#0a0d11;
  padding:8px 10px;border:1px solid #b9c3d0;border-radius:6px;background:#fff;min-width:200px}
.pt-eiv-form input[type=date]:focus{outline:2px solid var(--pha-blue,#10407f);outline-offset:1px;border-color:transparent}
.pt-eiv-check{display:flex;gap:9px;align-items:flex-start;margin:10px 0 12px;font-size:12.5px;line-height:1.5;
  color:#1d2733;max-width:78ch;cursor:pointer}
.pt-eiv-check input{margin-top:2px;width:16px;height:16px;flex:0 0 auto;accent-color:var(--pha-blue,#10407f)}
.pt-eiv-act{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.pt-eiv-btn{font:600 13.5px/1 var(--pha-font-body,Inter,system-ui);color:#fff;background:var(--pha-blue,#10407f);
  border:1px solid var(--pha-blue,#10407f);border-radius:6px;padding:11px 17px;cursor:pointer}
.pt-eiv-btn:hover:not(:disabled){background:#14458a;border-color:#14458a}
.pt-eiv-btn:disabled{color:#6b7c92;background:#e6eaf0;border-color:#cfd6e0;cursor:not-allowed}
.pt-eiv-msg{font-size:12.5px;color:#4a5666}
.pt-eiv-msg.ok{color:#106339;font-weight:600}
.pt-eiv-msg.err{color:#8c2f22;font-weight:600}

/* ---- Delegated administration: the Team panel (Phase 3, first increment) ---- */
.pt-eiv-btn.ghost{background:#fff;color:var(--pha-blue,#10407f)}
.pt-eiv-btn.ghost:hover:not(:disabled){background:#f4f3ef;color:#14458a}
.pt-team-sec{font:700 11.5px/1 var(--pha-font-body,Inter,system-ui);letter-spacing:.08em;text-transform:uppercase;color:#5a6a7e;margin:16px 0 8px;padding-bottom:5px;border-bottom:1px solid #eeebe4}
.pt-team-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 0;border-bottom:1px dashed #e8ecf2}
.pt-team-row:last-of-type{border-bottom:0}
.pt-team-row .nm{font:600 13.5px/1.35 var(--pha-font-body,Inter,system-ui);color:#1d2733;display:flex;flex-direction:column;min-width:210px}
.pt-team-row .nm .em{font:400 12px/1.3 var(--pha-font-body,Inter,system-ui);color:#5a6a7e}
.pt-team-row .roles{display:flex;gap:6px;flex-wrap:wrap;flex:1;min-width:180px}
.pt-team-chip{display:inline-flex;align-items:center;gap:6px;font:600 12px/1 var(--pha-font-body,Inter,system-ui);color:#14458a;background:#eef3fa;border:1px solid #cdd9ea;border-radius:999px;padding:6px 10px}
.pt-team-chip .exp{font-weight:400;color:#5a6a7e}
.pt-team-revoke{color:#8c2f22;text-decoration:none;font-weight:700;padding:0 2px}
.pt-team-revoke:hover{color:#611e14}
.pt-team-role,.pt-team-exp{font:500 12.5px/1.2 var(--pha-font-body,Inter,system-ui);color:#1d2733;border:1px solid #cfd6e0;border-radius:7px;padding:7px 8px;background:#fff}
.pt-team-row .grantbox{display:inline-flex;gap:6px;align-items:center}

/* ---- 2026-08-08 (owner): gate typeahead + tighter gate rhythm ----------
   The typable search joined the browse gate below the two dropdowns; the
   card must not grow, so the internal rhythm is condensed instead. */
.pt-gate-card label{margin:8px 0 4px}
.pt-gate-card .sub{margin:0 0 12px}
.pt-gate-card select{padding-top:9px;padding-bottom:9px}
#gate-browse .pt-gate-cta,#gate-btn{margin-top:12px}
.pt-gate-search{position:relative}
.pt-gate-search input{width:100%;font:500 13.5px/1.3 Inter,system-ui;color:var(--pha-text,#0a0d11);background:#f6f8fb;border:1px solid #c3ccd8;border-radius:6px;padding:9px 12px;box-sizing:border-box}
.pt-gate-search input::placeholder{color:#8b95a3}
.pt-gate-search input:focus{outline:none;border-color:var(--pha-blue,#10407f);box-shadow:0 0 0 3px rgba(16, 64, 127,.14)}
#gate-search-list{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:90;background:#fff;border:1px solid #c3ccd8;border-radius:6px;box-shadow:0 12px 30px rgba(10,13,17,.18);overflow:hidden}
.pt-sg{padding:9px 12px;font:400 13px/1.35 Inter,system-ui;color:var(--pha-text,#0a0d11);cursor:pointer;border-bottom:1px solid #e8ecf2}
.pt-sg:last-child{border-bottom:0}
.pt-sg b{font-weight:700}
.pt-sg:hover,.pt-sg.hi{background:#eef3fa}

/* ---- Two-factor authentication card ---- */
.pt-mfa-steps{margin:6px 0 10px;padding-left:20px;font-size:13.5px;color:#33404f;line-height:1.55}
.pt-mfa-steps li{margin:3px 0}
.pt-mfa-qr{display:inline-block;background:#fff;border:1px solid #cfd6e0;border-radius:8px;padding:6px;margin:2px 0 8px}
.pt-mfa-qr svg{display:block;width:176px;height:176px}
.pt-mfa-secret{display:inline-block;font:600 13px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a2634;background:#f4f3ef;border:1px solid #d8dee8;border-radius:6px;padding:4px 8px;margin-top:4px;letter-spacing:.06em;word-break:break-all}
.pt-mfa-input{width:104px;font:600 15px/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.18em;text-align:center;color:#1a2634;background:#fff;border:1px solid #cfd6e0;border-radius:7px;padding:9px 8px}
.pt-mfa-input:focus{outline:2px solid var(--pha-blue,#10407f);outline-offset:1px;border-color:var(--pha-blue,#10407f)}
.pt-mfa-on{display:inline-block;font:700 11px/1 var(--pha-font-body,Inter,system-ui);color:#106339;background:#e5f4ec;border:1px solid #bfe3cf;border-radius:20px;padding:4px 9px;letter-spacing:.04em;text-transform:uppercase}
#gate-mfa label{margin:8px 0 4px}

/* ================= CASELOAD — tenancy case-file spine (2026-08-08) =======
   Owner: "WHERE AND HOW ARE THE PHA FILES STORED?" — in the database.
   These styles only dress the queue/detail; all state + access control is
   server-side (tenant_file grants + MFA, enforced by SECURITY DEFINER RPCs). */
.cw-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cw-filters{display:flex;gap:6px;flex-wrap:wrap}
.cw-filters button{font:600 12px/1 var(--pha-font,inherit);padding:7px 12px;border:1px solid #cfd6e0;border-radius:5px;background:#fff;color:#1d262f;cursor:pointer}
.cw-filters button.on{background:var(--pha-blue,#10407f);border-color:var(--pha-blue,#10407f);color:#fff}
.cw-new-btn{margin-left:auto;font:700 12px/1 var(--pha-font,inherit);padding:8px 14px;border:1px solid var(--pha-blue,#10407f);border-radius:5px;background:var(--pha-blue,#10407f);color:#fff;cursor:pointer}
.cw-new-btn:hover{filter:brightness(1.08)}
.cw-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 14px;margin:14px 0 6px;padding:14px;border:1px solid #cfd6e0;border-radius:6px;background:#f7f9fc}
.cw-form label{display:flex;flex-direction:column;gap:4px;font:600 11.5px/1.3 var(--pha-font,inherit);color:#3b4652}
.cw-form label.wide{grid-column:1/-1}
.cw-form input,.cw-form select{font:400 13px/1.3 var(--pha-font,inherit);padding:8px 10px;border:1px solid #cfd6e0;border-radius:5px;background:#fff;color:#0a0d11}
.cw-form-actions{display:flex;align-items:center;gap:10px}
.cw-form-actions button{font:600 12px/1 var(--pha-font,inherit);padding:8px 14px;border:1px solid #cfd6e0;border-radius:5px;background:#fff;cursor:pointer}
.cw-form-actions button.cw-primary{background:var(--pha-blue,#10407f);border-color:var(--pha-blue,#10407f);color:#fff}
.cw-msg{font:600 12px/1.4 var(--pha-font,inherit);color:#3b4652}
.cw-msg.err{color:#b91c1c}
.cw-tbl{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:12px}
.cw-tbl th{text-align:left;font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.08em;text-transform:uppercase;color:#3b4652;padding:6px 10px;border-bottom:2px solid #cfd6e0;white-space:nowrap}
.cw-tbl td{padding:9px 10px;border-top:1px solid #e2e8f0;vertical-align:top}
.cw-tbl tbody tr{cursor:pointer}
.cw-tbl tbody tr:hover{background:rgba(16, 64, 127,.06)}
.cw-ref{font:700 12px/1.3 var(--pha-font-mono,monospace);white-space:nowrap}
.cw-sub{font-size:11px;color:#3b4652;margin-top:2px}
.cw-stepnum{font:700 11px/1 var(--pha-font-mono,monospace);color:var(--pha-blue,#10407f)}
.cw-pill{display:inline-block;font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.06em;padding:4px 7px;border-radius:3px;white-space:nowrap}
.cw-pill.active{background:#e8f1fd;color:#10407f}
.cw-pill.waiting{background:#fdf3e0;color:#92610e}
.cw-pill.ready_for_review{background:#ece9fd;color:#4c3ab5}
.cw-pill.approved{background:#e3f6e8;color:#1c7a38}
.cw-pill.denied{background:#fde8e8;color:#b91c1c}
.cw-pill.withdrawn{background:#eef1f5;color:#3b4652}
.cw-mine{font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.06em;background:#e8f1fd;color:#10407f;border-radius:3px;padding:2px 5px;margin-left:4px}
.cw-hap-warn{color:#92610e;font-weight:700}
.cw-hap-danger{color:#b91c1c;font-weight:700}
.cw-det-head{display:flex;align-items:flex-start;gap:12px}
.cw-det-head>div{flex:1 1 auto}
.cw-x{flex:0 0 auto;font:600 11.5px/1 var(--pha-font,inherit);padding:7px 11px;border:1px solid #cfd6e0;border-radius:5px;background:#fff;cursor:pointer;color:#3b4652}
.cw-waitbar{margin-top:12px;padding:10px 12px;border:1px solid #f0dcae;background:#fdf7e7;border-radius:6px;font-size:12.5px;color:#6b4d0d}
.cw-waitbar .cw-act{margin-left:10px}
.cw-steps{margin-top:14px;border:1px solid #e2e8f0;border-radius:6px;overflow:hidden}
.cw-step{display:flex;align-items:center;gap:12px;padding:9px 12px;border-top:1px solid #e2e8f0;font-size:12.5px;background:#fff}
.cw-step:first-child{border-top:0}
.cw-step .num{font:700 11px/1 var(--pha-font-mono,monospace);color:#3b4652;flex:0 0 22px}
.cw-step .nm{flex:1 1 auto;font-weight:600;color:#0a0d11}
.cw-step .st{flex:0 0 150px;font:600 11px/1.3 var(--pha-font,inherit);color:#3b4652}
.cw-step.st-complete{background:#f4fbf6}
.cw-step.st-complete .st{color:#1c7a38}
.cw-step.st-in_progress{background:#f5f9ff}
.cw-step.st-in_progress .st{color:#10407f}
.cw-step.st-waiting{background:#fdfaf1}
.cw-step.st-waiting .st{color:#92610e}
.cw-step.st-not_applicable .nm,.cw-step.st-not_applicable .st{color:#8a94a1}
.st-btns{display:flex;gap:5px;flex:0 0 auto}
.st-btns button{font:600 11px/1 var(--pha-font,inherit);padding:5px 8px;border:1px solid #cfd6e0;border-radius:4px;background:#fff;color:#3b4652;cursor:pointer}
.st-btns button.ok{border-color:#1c7a38;color:#1c7a38}
.st-btns button:hover{background:#f0f4fa}
.cw-actions{margin-top:14px;display:flex;flex-direction:column;gap:10px}
.cw-actrow{font-size:12px;color:#1d262f}
.cw-actctl{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.cw-actctl input,.cw-actctl select{font:400 12.5px/1.3 var(--pha-font,inherit);padding:7px 10px;border:1px solid #cfd6e0;border-radius:5px;background:#fff;min-width:120px}
.cw-actctl input[type=text],.cw-actctl input[type=email]{flex:1 1 220px}
.cw-act{font:600 11.5px/1 var(--pha-font,inherit);padding:7px 12px;border:1px solid var(--pha-blue,#10407f);border-radius:5px;background:#fff;color:var(--pha-blue,#10407f);cursor:pointer}
.cw-act:hover{background:var(--pha-blue,#10407f);color:#fff}
.cw-act.warn{border-color:#b91c1c;color:#b91c1c}
.cw-act.warn:hover{background:#b91c1c;color:#fff}
.cw-ev{margin-top:16px}
.cw-ev ul{list-style:none;margin:8px 0 0;padding:0;max-height:340px;overflow:auto}
.cw-ev li{display:flex;gap:10px;align-items:baseline;padding:6px 2px;border-top:1px solid #eef1f5;font-size:12px;color:#1d262f}
.cw-ev li:first-child{border-top:0}
.cw-ev .when{flex:0 0 auto;font:600 11px/1.4 var(--pha-font-mono,monospace);color:#3b4652;white-space:nowrap}
.cw-ev .who{margin-left:auto;flex:0 0 auto;font-size:11px;color:#3b4652}
@media (max-width:760px){.cw-form{grid-template-columns:1fr}.cw-step .st{flex-basis:auto}}

/* ================= RFTA Intake (Station 1 two-way cure loop) ========== */
.cw-pill.rf-submitted,.cw-pill.rf-resubmitted{ background:#e8f0fd; color:#1d4fae; }
.cw-pill.rf-needs_cure{ background:#fdf3e4; color:#94570a; }
.cw-pill.rf-accepted{ background:#e5f7ec; color:#116a44; }
.cw-pill.rf-rejected{ background:#fdeaea; color:#9c2b23; }
.cw-pill.rf-withdrawn{ background:#eef1f5; color:#5a6b85; }
.rf-cols{ display:grid; grid-template-columns:1fr 1fr; gap:18px 26px; margin-top:14px; font-size:13.5px; }
.rf-h{ font:700 11px/1 "IBM Plex Mono",ui-monospace,monospace; letter-spacing:.09em; color:#5a6b85; text-transform:uppercase; margin-bottom:5px; }
.rf-item{ padding:3px 0; font-size:13px; }
.rf-item.got{ color:#116a44; }
.rf-item.missing{ color:#9c2b23; }
.rf-act{ margin-top:18px; border-top:1px solid #e3e9f2; padding-top:14px; }
.rf-flags{ display:grid; grid-template-columns:1fr 1fr; gap:6px 18px; margin:10px 0 12px; }
.rf-flags label{ display:flex; gap:8px; align-items:flex-start; font-size:12.5px; line-height:1.4; cursor:pointer; }
.rf-flags input{ margin-top:2px; accent-color:#b3372e; }
#rf-note{ width:100%; box-sizing:border-box; border:1px solid #c3cedd; border-radius:8px; padding:8px 10px; font:400 13px Inter,system-ui; margin-bottom:10px; }
.rf-btns{ display:flex; gap:8px; flex-wrap:wrap; }
.rf-btn{ border:1px solid #c3cedd; background:#fff; color:#243b55; border-radius:8px; padding:8px 14px; font:600 12.5px Inter,system-ui; cursor:pointer; }
.rf-btn:hover{ background:#f2f6fb; }
.rf-btn.ok{ background:#116a44; border-color:#116a44; color:#fff; }
.rf-btn.ok:hover{ background:#0e5c3b; }
.rf-btn.warn{ background:#a8650b; border-color:#a8650b; color:#fff; }
.rf-btn.warn:hover{ background:#94570a; }
.rf-btn.bad{ background:#fff; border-color:#d9a19b; color:#9c2b23; }
.rf-btn.bad:hover{ background:#fdf1f1; }
.rf-letter-box{ width:100%; box-sizing:border-box; margin-top:12px; border:1px dashed #b9c9df; border-radius:8px; padding:12px; font:400 12.5px/1.55 "IBM Plex Mono",ui-monospace,monospace; background:#f8fafd; color:#243b55; }
@media (max-width:820px){ .rf-cols,.rf-flags{ grid-template-columns:1fr; } }


/* =====================================================================
   GATE v6 (2026-08-08 owner directive): the gate mirrors the retired
   index.html landing. Shared RR tab strip on top, sign-in card left with
   a Demo button, CONTAINED map right with the Live Data grid beneath it,
   the PHA-solutions showcase directly below the hero, then methodology
   and disclaimers. Concrete color values are copied from the Foundry
   tokens used on index.html (styles.css) — styles.css itself is NOT
   linked here to avoid selector collisions with the portal app.
   ===================================================================== */
.pt-gate.gv6{
  /* Wave 6: overflow-y:auto + overscroll-behavior removed — the document
     scrolls now (see .pt-gate above). overflow-x:clip (NOT hidden — hidden
     would recreate a scroll container) preserves the old scroller's
     horizontal clipping of edge-bleed content (e.g. the bottom ticker at
     320px) without reintroducing an inner scroller. */
  overflow-x:clip;
  /* v19 (owner directive 2026-08-18): the near-white gate canvas carries NO
     graph lines — graph texture now lives only on the blue bands
     (gv11-band / pha-shared ::before) and the gray matrix (gv11-matrix). */
  background-color:#f4f3ef}
/* v8 landing header: brand left, catalogue + demo + sales right. The
   workspace nav is a portal surface and no longer renders on the gate. */
/* G-113 (2026-09-19), second layer of the same defect: .gv6-hero carries
   z-index 70 for its map overlays, so while the visitor scrolls through the
   hero band (roughly 180-1030px on a phone) the hero painted over the stuck
   shell, hiding Sign In for the whole first screen and a half. Scoped to this
   page's .pt-gate stacking context: above the hero (70), below the
   authority header (75, which no longer overlaps it) and below fullscreen
   map mode (.exploring .gv6-mapbox, 80), which should still cover everything. */
.pt-gate .rsn-shell{z-index:74}
/* G-113 (2026-09-19): this header and the shared .rsn-shell were both sticky at
   top:0, and this one (z 75) covered the shell (z 39) the moment a visitor
   scrolled -- taking Contact Sales and Sign In with it, at every width, on the
   live homepage. Verified against production. It now sticks just beneath the
   shell, offset by the shell's own height variable, so both stay reachable. */
.pt-gate.gv6{--rs-hdr-h:59px} /* = .rs-authority-top height 56px + 3px border; stated once, read by scroll-margin below */
.pt-gate.gv6 .rs-authority-top{position:sticky;top:var(--rsn-h,32px);z-index:75;display:flex;align-items:center;justify-content:space-between;
  gap:14px;height:calc(var(--rs-hdr-h) - 3px);padding:0 18px;background:#0e2440;border-bottom:3px solid #10407f}
.rs-authority-brand{display:flex;align-items:center;gap:11px;min-width:0;flex:1 1 auto}
.rs-authority-brand svg{width:30px;height:30px;color:#9cc2f2;flex:0 0 auto}
.rs-authority-brand b{display:block;font-size:18px;font-weight:800;letter-spacing:-.01em;line-height:1.05;color:#fff}
/* v14 fix (2026-08-11): scope the brand-subtitle rule to the lockup's own
   span — the old ".rs-authority-brand span" also matched the cycling slogan's inner
   #rs-authority-slogan-text (a descendant span), forcing it into 12.5px uppercase
   mono with .14em tracking, which blew past the slogan's width cap and
   hard-clipped the rotating headlines mid-word. */
.rs-authority-brand > div > span{display:block;font:800 12.5px/1.25 var(--pha-font-mono,monospace);letter-spacing:.14em;text-transform:uppercase;color:#9cc2f2}
.rs-authority-brand-div{width:1px;height:30px;background:#2c4a74;margin:0 2px;flex:0 0 auto}
/* 2026-08-16: brand lockup is a live link (gate for anonymous, /app when signed in) */
.rs-authority-brand-link{display:flex;align-items:center;gap:11px;min-width:0;color:inherit;text-decoration:none;border-radius:6px}
.rs-authority-brand-link:hover{opacity:.92}
.rs-authority-brand-link:focus-visible{outline:2px solid #2368ca;outline-offset:3px}
.rs-authority-brand-link > div > span{display:block;font:800 12.5px/1.25 var(--pha-font-mono,monospace);letter-spacing:.14em;text-transform:uppercase;color:#9cc2f2}
.rs-authority-slogan{font:600 15px/1.3 var(--pha-font-body,Inter,system-ui);letter-spacing:0;text-transform:none;color:#c6d4e8;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;min-width:0}
.rs-authority-slogan #rs-authority-slogan-text{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;transition:opacity .5s ease,transform .5s ease}
.rs-authority-slogan #rs-authority-slogan-text.gv13-out{opacity:0;transform:translateY(4px)}
.rs-authority-links{display:flex;align-items:center;gap:9px;flex:0 0 auto}
.rs-authority-links .rsn-drop{margin-left:0}
.rs-authority-portals-lab{font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.12em;color:#7f97b5;text-transform:uppercase;margin-right:2px}
/* 2026-08-16: Portals is a dropdown, not a three-tab strip */
.rs-authority-pdd{position:relative}
/* 2026-08-16 owner: "MODULES AND PORTALS TEXT ARE NOT THE SAME SIZE" — the
   dropdown buttons now carry the exact .rs-authority-link type (700 12.5px) and the
   same 7px radius/text color so every header item reads as one family. */
.rs-authority-pdd-btn{display:inline-flex;align-items:center;gap:6px;font:700 12.5px/1 Inter,system-ui;padding:8px 12px;color:#dbe7f7;background:transparent;border:1px solid #3a577f;border-radius:7px;cursor:pointer}
.rs-authority-pdd-btn:hover{background:#16345c}
.rs-authority-pdd-btn[aria-expanded="true"]{background:#16345c;color:#fff}
.rs-authority-pdd-btn .caret{font-size:11px;color:#7f97b5}
.rs-authority-pdd-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:90;min-width:250px;background:#0e2440;border:1px solid #3a577f;border-radius:10px;box-shadow:0 12px 32px rgba(4,12,26,.55);padding:6px;display:flex;flex-direction:column}
.rs-authority-pdd-menu[hidden]{display:none}
.rs-authority-pdd-menu a{display:block;padding:9px 11px;border-radius:7px;text-decoration:none}
.rs-authority-pdd-menu a b{display:block;font:700 12.5px/1.2 Inter,system-ui;color:#e7eefa}
.rs-authority-pdd-menu a span{display:block;margin-top:2px;font:500 11px/1.35 Inter,system-ui;color:#8fa5c4}
.rs-authority-pdd-menu a:hover{background:#16345c}
.rs-authority-pdd-menu a.on b{color:#7db4f5}
/* Modules dropdown — same menu chrome as Portals, plus status pills that use
   the gate cards' vocabulary (Live/Beta/In build/Roadmap), and a scroll cap
   so 11 modules never push the menu off-screen. */
/* v17 (2026-08-16, owner): Modules menu — three-column grid, shared module
   icons, larger type for legibility, strict alphabetical order (populated in
   portal.html header script). Collapses to 2 / 1 columns on narrow screens. */
/* v20 (2026-08-18 owner directive): no scrollbar — taller cap + slightly
   tighter rows so all 11 modules fit without internal scrolling. */
.gv8-mdd-menu{width:min(760px,calc(100vw - 40px));max-height:min(90vh,720px);overflow:auto;right:0}
.gv8-mdd-all{border-bottom:1px solid #24446e;margin-bottom:6px;padding-bottom:10px !important}
.gv8-mdd-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2px}
.gv8-mdd-grid a{display:flex !important;align-items:flex-start;gap:10px;padding:8px 10px;border-radius:7px;text-decoration:none}
.gv8-mdd-grid a:hover{background:#16345c}
.gv8-mi-ico{flex:0 0 auto;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border:1px solid #2c4a74;border-radius:8px;background:#12294a;color:#7db4f5;margin-top:1px}
/* v20: per-module color arrives from the shared palette below (line ~890) */
.gv8-mi-ico svg{width:17px;height:17px}
.gv8-mi-tx{min-width:0}
.gv8-mdd-menu .gv8-mdd-grid a .gv8-mi-tx b{display:block;font:700 13.5px/1.3 Inter,system-ui;color:#eef4fd}
.gv8-mdd-menu .gv8-mdd-grid a .gv8-mi-tx > span{display:block;margin-top:3px;font:500 11.5px/1.45 Inter,system-ui;color:#a3b7d4}
.gv8-mdd-menu .gv8-mdd-grid a .gv8-mi-ico{display:inline-flex;margin-top:1px}
.gv8-mdd-menu .gv8-mdd-grid .mbd{white-space:nowrap}
@media(max-width:980px){.gv8-mdd-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:640px){.gv8-mdd-grid{grid-template-columns:1fr}}
.gv8-mdd-menu .mbd{display:inline-block;vertical-align:1px;margin-left:6px;font:700 11px/1 ui-monospace,monospace;letter-spacing:.06em;text-transform:uppercase;border-radius:4px;padding:3px 5px}
.gv8-mdd-menu .mbd-live{color:#39d98a;background:rgba(57,217,138,.12)}
.gv8-mdd-menu .mbd-build{color:#f5b451;background:rgba(245,180,81,.12)}
.gv8-mdd-menu .mbd-road{color:#8fa5c4;background:rgba(143,165,196,.14)}
.rs-authority-portals{display:flex;border:1px solid #3a577f;border-radius:8px;overflow:hidden}
.rs-authority-portals a{font:700 11.5px/1 Inter,system-ui;padding:8px 12px;text-decoration:none;color:#c6d4e8;background:transparent;border-right:1px solid #3a577f}
.rs-authority-portals a:last-child{border-right:0}
.rs-authority-portals a:hover{background:#16345c}
/* Wave 4 (2026-08-30, VPAT 1.4.3): CTA blue #2f7de1 gave 4.08:1 with white text —
   darkened to #2368ca (5.38:1); hover #4a8ff0 (3.06:1) → #276fd4 (4.87:1). */
.rs-authority-portals a.on{background:#2368ca;color:#fff}
.rs-authority-link{font:700 12.5px/1 Inter,system-ui;color:#dbe7f7;text-decoration:none;padding:8px 12px;border:1px solid #3a577f;border-radius:7px;background:transparent}
.rs-authority-link:hover{border-color:#2368ca;color:#fff}
.rs-authority-link.rs-authority-cta{background:#2368ca;border-color:#2368ca;color:#fff}
.rs-authority-link.rs-authority-cta:hover{background:#276fd4;color:#fff}
/* v17: Sign In lives in the ONE navy header (white shell suppressed on gate) */
.rs-authority-link.rs-authority-signin{border-color:#4d7fc0;color:#fff;background:#16345c}
.rs-authority-link.rs-authority-signin:hover{background:#1d4272;border-color:#2368ca}
@media(max-width:1180px){.rs-authority-slogan{display:none}.rs-authority-brand-div{display:none}}
@media(max-width:900px){.rs-authority-portals-lab{display:none}}
/* v11: the headline strip is gone — the slogan (page h1) lives in the
   header beside the logo and the hero moves up beneath it. */

/* hero: sign-in card left, contained map + live grid right */
/* v10 (owner): the sign-in card grows ~15% diagonally-right (410→472px
   wide, hero → taller via the map's min-height) — the map gives up the
   width and its ocean slack (cover-fit in the gate script compensates). */
/* 2026-08-11 owner: the authority typeahead bled BEHIND the showcase band below the
   fold. The hero (and everything in it, incl. the dropdown) must always paint above
   later siblings — lift it into its own stacking context above the band. */
.gv6-hero{display:grid;grid-template-columns:472px minmax(0,1fr);gap:16px;align-items:stretch;position:relative;z-index:70;
  max-width:1560px;margin:0 auto;padding:12px 22px 10px;box-sizing:border-box}
.gv6-left{display:flex}
.gv6-left .pt-gate-card{position:relative;max-width:none;width:100%;max-height:none;overflow:visible;padding-top:20px;
  display:flex;flex-direction:column;box-sizing:border-box;
  background:rgba(255,255,255,.96);border-color:rgba(199,208,220,.95);box-shadow:0 10px 30px rgba(30,45,70,.14)}
.gv6-left .pt-gate-card #gate-staff:not([hidden]),.gv6-left .pt-gate-card #gate-browse:not([hidden]){flex:1;display:flex;flex-direction:column}
.gv6-left .pt-gate-card .pt-gate-foot{margin-top:auto}
/* v11: the card's content is spaced to fill the hero height — roomier
   rhythm, no dead band between the CTAs and the audit footnote. */
.gv6-left .pt-gate-card{padding:20px 24px 16px}
.gv6-left .pt-gate-card .pt-gate-h1{font-size:22px;margin-bottom:8px}
.gv6-left .pt-gate-card .pt-gate-tabs{margin:0 0 12px}
.gv6-left .pt-gate-card .pt-gtab{padding:9px}
.gv6-left .pt-gate-card .sub{margin:0 0 12px;font-size:12.5px;line-height:1.5}
.gv6-left .pt-gate-card label{margin:11px 0 5px}
.gv6-left .pt-gate-card input{padding:10px 12px}
.gv6-left .pt-gate-card .pt-gate-cta{margin-top:14px;padding:12px}
.gv6-left .pt-gate-card .pt-gate-cta.ghost{margin-top:8px}
.gv6-left .pt-gate-card .pt-gate-foot{border-top:1px solid #e2e8f0;padding-top:12px;font-size:11px;line-height:1.5}
/* v11: the workspace sidebar drag handle never renders over the signed-out gate */
body:has(#pt-gate:not([hidden])) .pt-resize{display:none}
.gv6-right{align-self:stretch;display:flex;flex-direction:column}
.gv6-mapbox{position:relative;flex:1;min-height:472px;border:1px solid #cfd6e0;border-radius:12px;overflow:hidden;
  background:#e8edf3;box-shadow:0 1px 6px rgba(10,20,40,.06)}
.pt-gate.gv6 #gate-map{position:absolute;inset:0}
.pt-gate.gv6.exploring .gv6-mapbox{position:fixed;inset:0;z-index:80;border-radius:0;border:none;height:auto}
.pt-gate.gv6.exploring .rs-authority-top{z-index:1}
.pt-gate.gv6 .pt-gate-explore{position:absolute;top:12px;right:12px}


/* methodology + disclaimers (index.html mirror, concrete Foundry values) */
.gv6-sections{max-width:1560px;margin:0 auto;padding:6px 22px 46px;box-sizing:border-box}
.gv6-sections .section{margin-top:26px}
.gv6-sections .section-head{display:flex;gap:10px;align-items:center;margin-bottom:12px;padding-bottom:10px;border-bottom:2px solid #cfd6e0}
.gv6-sections .section-icon{flex-shrink:0;width:28px;height:28px;border-radius:4px;background:#e1ebf8;color:var(--pha-blue,#10407f);
  border:1px solid var(--pha-blue,#10407f);display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:700}
.gv6-sections .section-icon.warn{background:#f3e4c8;color:#82500a;border-color:#82500a}
.gv6-sections .section-title{font-size:15px;font-weight:700;letter-spacing:.01em;text-transform:uppercase;color:#0a0d11}
.gv6-sections .section-sub{color:#3b4652;font-size:12.5px;margin-top:2px}
/* v15: four cards — four-across on wide screens (no orphan row), 2×2 mid */
.gv6-sections .method-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
@media (max-width:1200px){.gv6-sections .method-grid{grid-template-columns:repeat(2,1fr)}}
.gv6-sections .method-card{background:rgba(255,255,255,.92);border:1px solid #cfd6e0;border-radius:4px;padding:14px}
.gv6-sections .method-title{font:700 11.5px/1.3 var(--pha-font-mono,monospace);letter-spacing:.1em;text-transform:uppercase;
  color:#0a0d11;margin:-4px -4px 10px;padding:0 0 8px;border-bottom:1px solid #dee5ee}
.gv6-sections .method-body{color:#1d262f;font-size:12.5px;line-height:1.55}
.gv6-sections .method-cite{display:inline-flex;align-items:center;gap:5px;margin-top:12px;
  font:600 11.5px/1 var(--pha-font-mono,monospace);color:#10407f;text-decoration:none}
.gv6-sections .method-cite:hover{color:#0e7490}
.gv6-sections .dp-note{background:#f6f8fb;border:1px solid #cfd6e0;border-left:3px solid var(--pha-blue,#10407f);
  border-radius:4px;padding:10px 12px;font-size:12.5px;line-height:1.55;color:#1d262f}
.gv6-sections .dp-note b{color:#0a0d11}
.gv6-sections .disclaimer-list{list-style:none;display:flex;flex-direction:column;gap:12px;margin:0;padding:0}
.gv6-sections .disclaimer-list li{position:relative;padding-left:26px;color:#1d262f;font-size:12.5px;line-height:1.5}
.gv6-sections .disclaimer-list li::before{content:"";position:absolute;left:6px;top:8px;width:6px;height:6px;border-radius:50%;background:#b45309}

@media (max-width:1080px){
  .gv6-hero{grid-template-columns:1fr}
  .gv6-mapbox{height:380px}
  .gv6-sections .method-grid{grid-template-columns:1fr}
}

/* =====================================================================
   GATE v7 (2026-08-09, owner directive): the Live Data grid moves INTO
   the blue-graph PHA-solutions band as translucent rl-strip metric cards
   with hover (i) explainers; beneath it the Resident Tenancy pipeline
   (steps 01-09) and the exhaustive module catalogue as dense translucent
   tiles, three per row. Everything scoped under .pha-showcase.gv7 /
   gv7-* -- pha-shared.css ships unmodified across apps.
   ===================================================================== */
.pha-showcase.gv7 .pha-showcase-tier-label{max-width:1160px}
.gv7-strip{max-width:1160px;margin:0 auto 28px;position:relative}
.gv7-grid{grid-template-columns:repeat(auto-fill,minmax(168px,1fr))}
.gv7-cell{position:relative;padding-right:28px}
.gv7-cell .rl-strip-val{font-size:16px}
/* (i) explainer buttons -- metric cells anchor top-right, cards inline */
.gv7-i{position:absolute;top:9px;right:8px;width:16px;height:16px;border-radius:50%;flex:none;
  font:700 11px/14px var(--pha-font-mono,monospace);text-align:center;color:var(--pha-on-dark-accent,#a9caff);
  background:rgba(169,202,255,.12);border:1px solid rgba(169,202,255,.4);cursor:help;padding:0}
.gv7-i:hover,.gv7-i:focus-visible{color:#0f2947;background:var(--pha-on-dark-accent,#a9caff);outline:none}
.gv7-tip{position:absolute;top:calc(100% + 8px);right:-8px;z-index:60;width:min(300px,74vw);
  background:#0e1d33;border:1px solid #3f5a82;border-radius:8px;padding:10px 12px;text-align:left;
  font:400 11.5px/1.5 Inter,system-ui;color:#c9d7ea;box-shadow:0 16px 38px rgba(3,6,12,.65);
  opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s ease,transform .15s ease;
  pointer-events:none;white-space:normal;text-transform:none;letter-spacing:0}
.gv7-i:hover .gv7-tip,.gv7-i:focus-visible .gv7-tip{opacity:1;visibility:visible;transform:none}
.gv7-flip .gv7-tip{right:auto;left:-8px}
/* dense tiles: three per row, tighter type, benefit text lives in the (i) */
.gv7-cards{grid-template-columns:repeat(3,1fr);gap:8px;padding:8px;margin:0 auto 30px}
.gv7-cards .pha-card-featured{padding:12px 14px 10px}
.gv7-cards .pha-card-top{margin-bottom:8px;align-items:center}
.gv7-cards .pha-card-icon{width:26px;height:26px;font-size:14px;border-radius:6px;margin:0}
.gv7-cards .pha-card-icon svg{width:14px;height:14px}
.gv7-cards .pha-card-name{font-size:14px;margin:0 0 3px}
.gv7-cards .pha-card-tagline{font-size:11.5px;font-weight:500;margin:0 0 8px;flex:1}
.gv7-cards .pha-card-cta{padding-top:4px;gap:8px}
.gv7-cards .pha-card-link{font-size:12px}

.gv7-cards .gv7-i{position:relative;top:auto;right:auto}
.gv7-cards .gv7-tip{top:auto;bottom:calc(100% + 8px);transform:translateY(-4px)}
.gv7-num{font:700 11px/1 var(--pha-font-mono,monospace);color:var(--pha-on-dark-accent,#a9caff);
  background:rgba(169,202,255,.14);border:1px solid rgba(169,202,255,.4);border-radius:5px;padding:5px 7px}
.gv7-bd{font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.06em;text-transform:uppercase;
  border-radius:4px;padding:3px 6px;border:1px solid}
.gv7-bd-live{color:#7fe0a8;background:rgba(16,99,57,.28);border-color:#2c7a52}
.gv7-bd-build{color:#e8bf76;background:rgba(130,80,10,.22);border-color:#7a5a22}
.gv7-bd-road{color:#9aa5b8;background:rgba(74,86,106,.35);border-color:#4a566a}
.gv7-bd-here{color:var(--pha-on-dark-accent,#a9caff);background:rgba(169,202,255,.14);border-color:rgba(169,202,255,.5)}
.gv7-foot{max-width:1516px;margin:0 auto;position:relative;font:400 11.5px/1.5 Inter,system-ui;color:var(--pha-on-dark-muted,#93a5c0)}
.gv7-foot a{color:var(--pha-on-dark-accent,#a9caff)}
@media (max-width:900px){.gv7-cards{grid-template-columns:1fr 1fr}}
@media (max-width:640px){.gv7-cards{grid-template-columns:1fr}}

/* =====================================================================
   GATE v8 (2026-08-09, owner directive): the gate doubles as the public
   landing page. Brand header + h1 strip up top; the band opens with a
   curated 16-chip live-data strip — exactly two dense rows of eight so
   the fold lands right under row two; modules render before the tenancy
   pipeline, which collapses into an expandable card. pha-shared.css
   still ships unmodified.
   ===================================================================== */
.pha-showcase.gv8{padding:30px 20px 56px}
.gv8 .gv7-tier{margin-top:0}
/* =====================================================================
   GATE v10 (2026-08-09, owner directive): the gv9 chip strip is gone —
   the blue band sits directly beneath the hero, and Live Data becomes a
   vertical cascade on the RIGHT of the module catalogue. A vertical rule
   with buffer divides cards from cascade; the cascade rows distribute so
   the first metric's top and last metric's bottom are flush with the
   card grid. Rows: mono count, dotted leader, blue mono micro-label,
   (i) explainer. pha-shared.css still ships unmodified.
   ===================================================================== */
/* v11 (owner directive): the band uses the full hero width — the tier
   label moves left, the catalogue gets four cards per row, and the
   cascade rows are strict [count · label · (i)] lines: single-line
   ellipsized labels (full text on hover), right-pinned explainers,
   even vertical rhythm. */
.gv10-heads,.gv10-body{max-width:1516px;margin:0 auto;display:grid;
  grid-template-columns:minmax(0,1fr) 306px;column-gap:0;align-items:stretch}
.gv10-heads{align-items:baseline}
.gv10-heads .gv7-tier{max-width:none;margin:0 0 12px}
.gv10-live-head{display:flex;align-items:center;gap:7px;margin:0 0 12px;padding-left:26px;
  /* v12.1: no border-left here — the 10px-tall header made it render as a
     floating vertical dash disconnected from the cascade's rule below
     (owner screenshot 2026-08-09). The cascade keeps the real rule. */
  font:700 11px/1 var(--pha-font-mono,monospace);letter-spacing:.12em;text-transform:uppercase;
  color:var(--pha-on-dark-accent,#a9caff)}
.gv10-live-head .rl-strip-ts{font:400 11px/1.3 var(--pha-font-mono,monospace);letter-spacing:.03em;
  text-transform:none;color:rgba(199,214,236,.6)}
.gv10-body{margin-bottom:26px}
/* v11: kill the shared featured-grid chrome — its translucent panel
   background/border showed through the grid's right padding as a ghost
   strip beside the cards. Cards float directly on the band. */
.gv10-body .gv7-cards{margin:0;padding:0 26px 0 0;align-content:stretch;grid-template-columns:repeat(4,minmax(0,1fr));
  background:none;border:none;box-shadow:none}
.gv10-cascade{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;gap:5px;
  border-left:1px solid rgba(169,202,255,.28);padding-left:26px;min-width:0}
.gv10-row{position:relative;display:flex;align-items:center;gap:10px;padding:3px 0;min-width:0}
.gv10-val{font:700 13.5px/1.2 var(--pha-font-mono,monospace);letter-spacing:0;color:#fff;flex:none;min-width:78px;
  font-variant-numeric:tabular-nums}
.gv10-lab{flex:1;min-width:0;font:700 11px/1.25 var(--pha-font-mono,monospace);letter-spacing:.05em;text-transform:uppercase;
  color:var(--pha-on-dark-accent,#a9caff);text-align:right;
  /* v13 (2026-08-09, owner directive): labels were ellipsis-clipped — allow a
     tight two-line wrap instead; values and (i) stay pinned, metrics untouched */
  white-space:normal;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.gv10-row .gv7-i{position:relative;top:auto;right:auto;flex:none;align-self:center}
.gv10-i-pad{flex:none;width:16px}
.gv10-cascade[hidden]{display:none}
/* =====================================================================
   GATE v12 (2026-08-09, owner directive): tighter gap above the tier
   label; "Live data" head never wraps and sits on the same plane as the
   tier label; module cards get tighter vertical padding and a UNIFORM
   height across every row (tallest card sets the height for all).
   Spacing values are CSS variables so the ?tune=1 design tuner can
   adjust them live; the fallbacks below are the shipped values.
   pha-shared.css still ships unmodified.
   ===================================================================== */
.pha-showcase.gv8{padding:var(--gv12-band-top,12px) 20px 56px}
.gv10-heads{align-items:center}
.gv10-heads .gv7-tier{margin:0 0 var(--gv12-head-gap,10px)}
.gv10-heads .gv10-live-head{margin:0 0 var(--gv12-head-gap,10px);white-space:nowrap}
.gv10-live-head .rl-strip-ts{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
.gv10-body .gv7-cards{grid-auto-rows:1fr;gap:var(--gv12-card-gap,8px)}
.gv10-body .gv7-cards .pha-card-featured{height:100%;box-sizing:border-box;
  padding:var(--gv12-card-pad-y,9px) 13px var(--gv12-card-pad-b,8px)}
.gv10-body .gv7-cards .pha-card-top{margin-bottom:var(--gv12-card-top-gap,6px)}
.gv10-body .gv7-cards .pha-card-tagline{margin:0 0 var(--gv12-tagline-gap,6px)}
/* pipeline collapses into one expandable card below the modules */
.gv8-pipe{max-width:1516px;margin:4px auto 26px;border:1px solid rgba(169,202,255,.22);border-radius:12px;
  background:rgba(255,255,255,.045);position:relative}
.gv8-pipe summary{display:flex;align-items:center;gap:14px;padding:13px 16px;cursor:pointer;list-style:none}
.gv8-pipe summary::-webkit-details-marker{display:none}
.gv8-pipe summary:hover{background:rgba(255,255,255,.03)}
.gv8-pipe-t{font:700 11.5px/1.35 var(--pha-font-mono,monospace);letter-spacing:.09em;text-transform:uppercase;
  color:var(--pha-on-dark-accent,#a9caff);flex:none}
.gv8-pipe-sub{font:400 12px/1.4 Inter,system-ui;color:rgba(199,214,236,.75);flex:1;min-width:0}
.gv8-pipe-x{font:700 17px/1 var(--pha-font-mono,monospace);color:var(--pha-on-dark-accent,#a9caff);
  transition:transform .18s ease;flex:none}
.gv8-pipe[open] .gv8-pipe-x{transform:rotate(45deg)}
.gv8-pipe .gv7-cards{margin:0;padding:2px 10px 12px}
@media (max-width:1400px){
  .gv10-body .gv7-cards{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:1150px){
  .gv10-heads,.gv10-body{grid-template-columns:1fr;row-gap:14px}
  .gv10-body .gv7-cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .gv10-heads .gv10-live-head{display:none}
  .gv10-body .gv7-cards{padding:0}
  .gv10-cascade{border-left:none;border-top:1px solid rgba(169,202,255,.28);padding:14px 0 0;gap:4px}
}
@media (max-width:640px){
  .gv8-pipe summary{flex-wrap:wrap}
}

/* v12 (2026-08-09, owner directive): secondary "Demo →" link on module cards
   whose manifest entry declares a limited public demo */
.gv12-demo{margin-left:12px;padding-left:12px;border-left:1px solid var(--pha-hairline,#d8dfe9)}
.gv12-demo:hover{text-decoration:underline}

/* 2026-08-16 (owner: "Module scope" and "Demo" links pointing to the same
   URL): the module dropdown card is now a <div> with a full-card background
   link (.gv7-mod-hit) plus two independent, non-nested CTA links ("Module
   scope" and, when present, "Demo") layered above it. */
.pha-card-featured.gv7-mod{position:relative}
.gv7-mod-hit{position:absolute;inset:0;z-index:1;border-radius:inherit}
.gv7-mod .pha-card-top,.gv7-mod .pha-card-name,.gv7-mod .pha-card-tagline{position:relative;z-index:0;pointer-events:none}
.gv7-mod .pha-card-cta{position:relative;z-index:2}
.gv7-mod .pha-card-cta a{position:relative}

/* ============ 2026-08-11 dashboard rebuild (owner directive) ============
   "WHERE ARE CHARTS/INSIGHTS/ACTIONABLE ITEMS/'GRANDMA USE CASE' TESTS???"
   Action queue rows, three chart cards, and a plain-language meaning line
   under every number. */
.pt-kpi .m{margin-top:4px;font-size:11px;line-height:1.45;color:#6b7486}
.pt-today{display:flex;flex-direction:column;gap:8px;margin:10px 0 18px}
.pt-act{display:flex;align-items:center;gap:12px;padding:11px 14px;border:1px solid #e2e6ee;border-radius:10px;background:#fff;text-decoration:none;color:#1c2430;font:500 13px/1.4 Inter,system-ui}
.pt-act:hover{border-color:#b9c6dd;box-shadow:0 2px 8px rgba(16,24,40,.06)}
.pt-act-n{min-width:34px;height:34px;border-radius:8px;display:flex;align-items:center;justify-content:center;font:700 15px/1 Inter,system-ui;background:#eef3fb;color:#10407f}
.pt-act-n.warn{background:#fdf3e4;color:#9a5b00}
.pt-act-n.danger{background:#fdeaea;color:#b3261e}
.pt-act .act{margin-left:auto;color:#10407f;font-weight:600;white-space:nowrap}
.pt-today-gate,.pt-today-empty{padding:14px;border:1px dashed #cdd6e4;border-radius:10px;color:#5a6b85;font:500 13px/1.55 Inter,system-ui;background:#f8fafc}
.pt-today-gate a,.pt-ch-locked a{color:var(--pha-blue,#10407f);font-weight:600}
.pt-charts{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px;margin:10px 0 20px}
.pt-chart-card{border:1px solid #e2e6ee;border-radius:12px;background:#fff;padding:14px 16px 12px;min-width:0}
.pt-chart-card h3{margin:0 0 8px;font:600 13px/1.3 Inter,system-ui;color:#1c2430}
.pt-chart-card .mn{margin:8px 0 0;font:500 12px/1.5 Inter,system-ui;color:#5a6b85}
.pt-ch-empty{margin:18px 0;color:#6b7486;font:500 12.5px/1.5 Inter,system-ui}
.pt-ch-locked{display:flex;flex-direction:column;gap:6px;align-items:flex-start;padding:16px 4px;color:#5a6b85;font:500 12.5px/1.5 Inter,system-ui}
.svgch text{font:600 11px Inter,system-ui;fill:#6b7486}
.svgch .lbl{font-weight:700;fill:#1c2430}

/* ============================================================
   v11 module-card definition (owner directive 2026-08-15)
   The shared base card is a neutral white wash at 5.5% over the
   navy band, so the tiles read flat and blend into the
   background. These overrides are SCOPED TO THE SHOWCASE BAND
   ONLY (they must not restyle cards inside the signed-in
   workspace). The cards stay translucent glass: the lift comes
   from a cool blue HUE, a 1px top-edge highlight and a soft
   outer shadow, not from making them opaque.
   ============================================================ */
.pha-showcase .pha-card-featured{
  background:linear-gradient(180deg,rgba(150,192,255,.105) 0%,rgba(116,164,236,.062) 100%);
  border:1px solid rgba(162,201,255,.30);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.11), 0 1px 3px rgba(4,18,44,.34);
  -webkit-backdrop-filter:blur(2px) saturate(118%);
  backdrop-filter:blur(2px) saturate(118%);
  transition:background .16s ease, border-color .16s ease, box-shadow .16s ease, transform .16s ease;
}
.pha-showcase a.pha-card-featured:hover{
  background:linear-gradient(180deg,rgba(168,206,255,.165) 0%,rgba(126,175,245,.10) 100%);
  border-color:var(--pha-on-dark-accent,#9cc2f2);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.16), 0 3px 10px rgba(4,18,44,.42);
  transform:translateY(-1px);
}
/* v20 (2026-08-18 owner directive): the "You are here" current-card
   treatment is retired — the gate is the platform surface, no card is
   "current". Icon tiles get DEPTH + a per-module accent color instead,
   and the SAME palette paints the Modules dropdown icons (.gv8-mi-ico)
   so the cards and the menu visibly read as one catalogue. */
.pha-showcase .pha-card-icon,.gv8-mdd-menu .gv8-mi-ico{
  color:#fff;border:1px solid rgba(255,255,255,.16);
  background:linear-gradient(155deg,#4a6fa5,#31517d);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.30),inset 0 -1px 0 rgba(4,12,26,.30),0 2px 6px rgba(4,12,26,.38);
}
.pha-card-icon[data-mod="rent-reasonableness-pro"],.gv8-mi-ico[data-mod="rent-reasonableness-pro"]{background:linear-gradient(155deg,#3b82f6,#1d4ed8)}
.pha-card-icon[data-mod="payment-standard-studio"],.gv8-mi-ico[data-mod="payment-standard-studio"]{background:linear-gradient(155deg,#14b8a6,#0f766e)}
.pha-card-icon[data-mod="grants-nofa-radar"],.gv8-mi-ico[data-mod="grants-nofa-radar"]{background:linear-gradient(155deg,#f59e0b,#b45309)}
.pha-card-icon[data-mod="hotma-income"],.gv8-mi-ico[data-mod="hotma-income"]{background:linear-gradient(155deg,#22c55e,#15803d)}
.pha-card-icon[data-mod="hud-bi"],.gv8-mi-ico[data-mod="hud-bi"]{background:linear-gradient(155deg,#8b5cf6,#6d28d9)}
.pha-card-icon[data-mod="housing-locator"],.gv8-mi-ico[data-mod="housing-locator"]{background:linear-gradient(155deg,#06b6d4,#0e7490)}
.pha-card-icon[data-mod="inspection-os"],.gv8-mi-ico[data-mod="inspection-os"]{background:linear-gradient(155deg,#f97316,#c2410c)}
.pha-card-icon[data-mod="rentspire-insurance"],.gv8-mi-ico[data-mod="rentspire-insurance"]{background:linear-gradient(155deg,#f43f5e,#be123c)}
.pha-card-icon[data-mod="property-ops"],.gv8-mi-ico[data-mod="property-ops"]{background:linear-gradient(155deg,#6366f1,#4338ca)}
.pha-card-icon[data-mod="cna-pna-platform"],.gv8-mi-ico[data-mod="cna-pna-platform"]{background:linear-gradient(155deg,#a78bfa,#5b21b6)}
.pha-card-icon[data-mod="studies-advisory"],.gv8-mi-ico[data-mod="studies-advisory"]{background:linear-gradient(155deg,#ec4899,#9d174d)}
.pha-card-icon[data-mod="ai-support-agent"],.gv8-mi-ico[data-mod="ai-support-agent"]{background:linear-gradient(155deg,#0ea5e9,#0369a1)}
@media (prefers-reduced-motion:reduce){
  .pha-showcase a.pha-card-featured:hover{ transform:none; }
}

/* =====================================================================
 * gv11 — MANDATE + ASSURANCE BAND and COMPETITOR ASSURANCE MATRIX
 * Added 2026-08-15 per owner directive: a horizontal HUD-mandate /
 * security band separating the gate from "The Full Platform" container,
 * and a vertical competitor comparison directly beneath that container.
 * Palette continues the pha-showcase deep-blue band so the three
 * sections read as one continuous civic surface. Uses only the
 * --pha-on-dark-* foreground set for AA contrast on dark blue.
 * ===================================================================== */

/* v18 P2 register #16 (2026-08-17): every in-page anchor target on the gate
   scrolls clear of the 73px sticky navy header instead of clipping its
   heading behind it. Applies to hash navigation only — no layout change. */
.pt-gate.gv6 section[id], .pt-gate.gv6 div[id^="pha-"], .pt-gate.gv6 [id="rr"],
.pt-gate.gv6 [id="nav-disclaimers"], .pt-gate.gv6 [id="gate-straight-answers"]{
  /* G-113: two stacked sticky bars now sit above anchored headings, so the
     offset is derived from both heights plus breathing room instead of a
     typed 84px that was sized for the single bar it used to clear. */
  scroll-margin-top:calc(var(--rsn-h,32px) + var(--rs-hdr-h,59px) + 22px);
}

/* ---------- shared band chrome ---------- */
.gv11-band,
.gv11-matrix{
  position:relative;
  padding:34px 20px 40px;
  background:linear-gradient(180deg, #0d2340 0%, var(--pha-blue-deep) 100%);
  border-top:1px solid var(--pha-hairline);
  overflow:hidden;
}
/* v13 (owner directive 2026-08-15): the matrix flips to the LIGHT gray/white
   grid language of the upper fold — verdicts become icons, evidence sentences
   move to tooltips, sources stay as tiny links. */
.gv11-matrix{
  background:linear-gradient(180deg, #f4f3ef 0%, #f4f3ef 100%);
  border-top:1px solid #cfd6e0;
  padding-top:36px;
}
.gv11-matrix::before{
  background-image:
    linear-gradient(rgba(18,49,87,.055) 1px, transparent 1px),
    linear-gradient(90deg, rgba(18,49,87,.055) 1px, transparent 1px) !important;
}
.gv11-matrix .gv11-band-title{ color:#0a0d11; }
.gv11-matrix .gv11-band-sub{ color:#3b4652; }
.gv11-matrix .gv11-band-eyebrow{ color:#10407f; }
.gv11-band::before,
.gv11-matrix::before{
  content:""; position:absolute; inset:0; pointer-events:none;
  background-image:
    linear-gradient(rgba(255,255,255,.035) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.035) 1px, transparent 1px);
  background-size:48px 48px;
}

.gv11-band-head{
  position:relative; max-width:1516px; margin:0 auto 20px;
  display:grid; grid-template-columns:minmax(0,1fr) 232px; gap:34px; align-items:start;
}
.gv11-band-eyebrow{
  font-family:var(--pha-font-mono); font-size:11px; font-weight:700;
  letter-spacing:.1em; text-transform:uppercase; color:var(--pha-on-dark-accent);
  display:flex; align-items:center; gap:8px; margin-bottom:10px;
}
.gv11-pulse{
  width:7px; height:7px; border-radius:50%; background:#48dc9b; flex:none;
  box-shadow:0 0 0 0 rgba(72,220,155,.55); animation:gv11pulse 2.4s ease-out infinite;
}
@keyframes gv11pulse{
  0%{ box-shadow:0 0 0 0 rgba(72,220,155,.5); }
  70%{ box-shadow:0 0 0 7px rgba(72,220,155,0); }
  100%{ box-shadow:0 0 0 0 rgba(72,220,155,0); }
}
.gv11-band-title{
  font-size:27px; font-weight:800; letter-spacing:-.018em; line-height:1.2;
  color:var(--pha-on-dark); margin:0 0 10px;
}
.gv11-band-sub{
  font-size:14.5px; line-height:1.62; color:var(--pha-on-dark-body);
  max-width:760px; margin:0;
}
.gv11-band-stat{
  border-left:2px solid rgba(169,202,255,.42); padding:2px 0 2px 16px;
}
.gv11-stat-n{
  font-family:var(--pha-font-mono); font-size:40px; font-weight:800;
  line-height:1; color:var(--pha-on-dark); letter-spacing:-.02em;
}
.gv11-stat-l{
  margin-top:8px; font-size:12.5px; line-height:1.5; color:var(--pha-on-dark-muted);
}

/* ---------- mandate cards ---------- */
.gv11-mandates{
  position:relative; max-width:1516px; margin:0 auto; padding:10px;
  list-style:none;
  display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:10px;
  background:rgba(255,255,255,.035);
  border:1px solid rgba(255,255,255,.13);
  border-radius:var(--pha-radius-lg);
}
/* v16 (owner directive 2026-08-15): the posture cards flip to WHITE
   translucent glass with dark navy text — the dark band stays behind them,
   so the cards finally contrast instead of drowning in the sea of blue. */
.gv11-m{
  display:flex; flex-direction:column;
  background:linear-gradient(180deg, rgba(255,255,255,.93), rgba(243,247,253,.86));
  border:1px solid rgba(255,255,255,.72);
  border-radius:var(--pha-radius-md, 10px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.85), 0 2px 10px rgba(4,18,44,.28);
  -webkit-backdrop-filter:blur(7px) saturate(120%);
  backdrop-filter:blur(7px) saturate(120%);
  padding:16px 16px 15px;
  transition:transform .16s ease, border-color .16s ease, box-shadow .16s ease;
}
.gv11-m:hover{
  transform:translateY(-1px);
  border-color:#fff;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.95), 0 6px 18px rgba(4,18,44,.34);
}
.gv11-m-new{
  background:linear-gradient(180deg, rgba(236,253,244,.95), rgba(222,247,234,.88));
  border-color:rgba(23,168,98,.4);
}
.gv11-m-top{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  margin-bottom:11px; flex-wrap:wrap;
}
.gv11-m-flag{
  font-family:var(--pha-font-mono); font-size:11px; font-weight:700;
  letter-spacing:.06em; text-transform:uppercase;
  color:#0c7a48; background:rgba(23,168,98,.1);
  border:1px solid rgba(23,168,98,.45); border-radius:999px; padding:3px 9px;
}
.gv11-flag-soon{ color:#8f5a09; background:rgba(240,168,50,.12); border-color:rgba(211,144,31,.5); }
.gv11-flag-now{ color:#10407f; background:rgba(16, 64, 127,.08); border-color:rgba(16, 64, 127,.35); }
.gv11-m-cite{ font-size:11px; color:#5b6a80; text-align:right; }
.gv11-m-cite a{ color:#10407f; text-decoration:none; border-bottom:1px dotted rgba(16, 64, 127,.45); }
.gv11-m-cite a:hover{ border-bottom-style:solid; }
.gv11-m-h{
  font-size:16px; font-weight:800; letter-spacing:-.01em; line-height:1.28;
  color:#0e1f3d; margin:0 0 8px;
}
.gv11-m-duty{
  font-size:13px; line-height:1.56; color:#33415c; margin:0 0 12px;
}
.gv11-m-duty a{ color:#10407f; text-decoration:none; border-bottom:1px dotted rgba(16, 64, 127,.45); }
.gv11-m-duty a:hover{ border-bottom-style:solid; }
.gv11-mono{ font-family:var(--pha-font-mono); font-size:12px; }
.gv11-m-ans{
  display:flex; gap:9px; align-items:center; margin:auto 0 0;
  padding-top:12px; border-top:1px solid rgba(13,35,64,.12);
  font-size:12.4px; line-height:1.4; color:#33415c;
}
.gv11-m-ans strong{ color:#0e1f3d; font-weight:700; letter-spacing:.02em; }
/* answer bullets — short, scannable */
.gv11-m-b{ list-style:none; margin:8px 0 0; padding:0; display:flex; flex-direction:column; gap:6px; }
.gv11-m-b li{
  position:relative; padding-left:16px;
  font-size:12.4px; line-height:1.45; color:#33415c;
}
.gv11-m-b li::before{
  content:""; position:absolute; left:2px; top:7px;
  width:5px; height:5px; border-radius:50%; background:#17a862;
}
.gv11-m-b em{ font-style:normal; color:#0e1f3d; font-weight:700; }
.gv11-ck{
  flex:none; width:16px; height:16px; margin-top:1px; border-radius:50%;
  background:rgba(23,168,98,.12); border:1px solid rgba(23,168,98,.55);
  position:relative;
}
.gv11-ck::after{
  content:""; position:absolute; left:4.6px; top:2.4px;
  width:4px; height:8px; border:solid #12925a; border-width:0 2px 2px 0;
  transform:rotate(43deg);
}

/* ---------- band footer → v16 "Straight answers" collapsible rows ----------
   Owner directive 2026-08-15: friendlier heading, singular expandable rows,
   white contrasting background. Copy unchanged — only the container moved. */
.gv11-band-foot{
  position:relative; max-width:1516px; margin:14px auto 0;
  display:flex; flex-direction:column; gap:8px;
}
.gv11-honest-head{
  display:flex; align-items:baseline; gap:12px; flex-wrap:wrap; margin:6px 2px 2px;
}
.gv11-honest-h{
  font-size:17px; font-weight:800; letter-spacing:-.01em; color:var(--pha-on-dark); margin:0;
}
.gv11-honest-sub{ font-size:12.8px; color:var(--pha-on-dark-muted); margin:0; }
.gv11-h-row{
  background:linear-gradient(180deg, rgba(255,255,255,.93), rgba(243,247,253,.86));
  border:1px solid rgba(255,255,255,.72);
  border-radius:var(--pha-radius-md, 10px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.85), 0 2px 10px rgba(4,18,44,.28);
  -webkit-backdrop-filter:blur(7px) saturate(120%);
  backdrop-filter:blur(7px) saturate(120%);
  overflow:hidden;
}
.gv11-h-row summary{
  list-style:none; cursor:pointer; user-select:none;
  display:flex; align-items:center; gap:12px;
  padding:13px 16px; font-size:13.8px; font-weight:700; color:#0e1f3d;
}
.gv11-h-row summary::-webkit-details-marker{ display:none; }
.gv11-h-row summary:hover{ background:rgba(16, 64, 127,.045); }
.gv11-h-x{
  flex:none; margin-left:auto; width:22px; height:22px; border-radius:50%;
  border:1px solid rgba(13,35,64,.22); color:#33415c;
  display:flex; align-items:center; justify-content:center;
  font-size:14px; font-weight:600; line-height:1;
  transition:transform .18s ease;
}
.gv11-h-row[open] .gv11-h-x{ transform:rotate(45deg); }
.gv11-h-body{ padding:0 16px 14px; }
.gv11-h-body p{ margin:0; font-size:13px; line-height:1.62; color:#33415c; }
.gv11-h-body p + p{ margin-top:8px; }
.gv11-h-body a{ color:#10407f; text-decoration:none; border-bottom:1px dotted rgba(16, 64, 127,.45); }
.gv11-h-body a:hover{ border-bottom-style:solid; }

/* ---------- matrix ---------- */
.gv11-mx-head{
  position:relative; max-width:1516px; margin:0 auto 20px;
  display:grid; grid-template-columns:minmax(0,1fr) 262px; gap:34px; align-items:end;
}
.gv11-legend{ list-style:none; margin:0; padding:0; display:grid; gap:7px; }
.gv11-legend li{
  display:flex; align-items:center; gap:9px;
  font-size:12px; color:#3b4652;
}
.gv11-lg{ width:12px; height:12px; border-radius:50%; flex:none; }
.gv11-lg-y{ background:#17a862; border:1px solid #118a50; }
.gv11-lg-p{ background:#f0a832; border:1px solid #d3901f; }
.gv11-lg-n{ background:#fff; border:2px solid #9aa7b8; box-sizing:border-box; }
.gv11-lg-a{ background:#dd4b4b; border:1px solid #c23b3b; }

.gv11-mx-scroll{
  position:relative; max-width:1516px; margin:0 auto;
  overflow-x:auto; overflow-y:visible;
  border:1px solid #cfd6e0;
  border-radius:var(--pha-radius-lg);
  background:#fff;
  box-shadow:0 1px 6px rgba(10,20,40,.06);
  padding:10px;
  scrollbar-color:#b6c2d2 #eef1f6;
}
.gv11-mx-scroll:focus-visible{ outline:2px solid #10407f; outline-offset:2px; }
.gv11-mx-t{
  border-collapse:separate; border-spacing:4px;
  width:100%; min-width:1136px;
}
.gv11-mx-cap{
  caption-side:top; text-align:left; padding:2px 4px 12px;
  font-family:var(--pha-font-mono); font-size:11px; font-weight:700;
  letter-spacing:.06em; text-transform:uppercase; color:#10407f;
}
/* v13: sticky header dropped — the old top:56px sticky rode over the section
   heading while scrolling. A static header inside a white card reads cleaner. */
.gv11-mx-t thead th{
  position:static;
  vertical-align:bottom; text-align:left;
  padding:11px 12px; border-radius:8px;
  background:#f4f3ef;
  border:1px solid #d5dce6;
  font-size:12.5px; font-weight:800; color:#0a0d11; line-height:1.25;
}
.gv11-mx-t thead th span{
  display:block; margin-top:4px; font-family:var(--pha-font-mono);
  font-size:11px; font-weight:600; letter-spacing:.04em;
  color:#5a6675; text-transform:none;
}
.gv11-mx-t thead th.gv11-th-ctl{ width:212px; min-width:212px; }
.gv11-mx-t thead th.gv11-th-us{
  background:linear-gradient(180deg, rgba(23,168,98,.14), rgba(23,168,98,.05));
  border-color:rgba(23,168,98,.5);
}
.gv11-mx-t thead th.gv11-th-us span{ color:#118a50; }
.gv11-mx-t tbody th{
  text-align:left; vertical-align:top; width:212px; min-width:212px;
  padding:11px 12px; border-radius:8px;
  background:#f8fafc;
  border:1px solid #e2e8f0;
  font-size:13px; font-weight:700; line-height:1.4; color:#0a0d11;
}
.gv11-mx-t tbody th em.gv11-rn{
  display:block; margin-top:6px; font-style:normal; font-weight:500;
  font-size:11.5px; line-height:1.5; color:#5a6675;
}
.gv11-c{
  vertical-align:top; padding:12px 11px 11px; border-radius:8px;
  border:1px solid #e2e8f0;
  background:#fff;
  min-width:0; width:calc((100% - 212px) / 7);
}
.gv11-c b{
  display:block; font-size:12px; font-weight:800; line-height:1.35;
  color:#0a0d11; margin-bottom:5px; padding-left:24px; position:relative;
}
/* verdict icon — icon first, 1–4 word label beside it */
.gv11-c b::before{
  content:""; position:absolute; left:0; top:0;
  width:17px; height:17px; border-radius:50%;
  background:#fff; border:2px solid #9aa7b8; box-sizing:border-box;
}
.gv11-c span{
  display:block; font-size:11.2px; line-height:1.5; color:#5a6675;
}
.gv11-c .gv11-src{ font-size:11px; line-height:1.6; color:#8a96a6; }
.gv11-c span a{ color:#10407f; text-decoration:none; border-bottom:1px dotted rgba(16, 64, 127,.4); }
.gv11-c span a:hover{ border-bottom-style:solid; }
.gv11-c em{ font-style:italic; color:#3b4652; }
.gv11-c[title]{ cursor:help; }

/* state colours — the icon is decorative; the <b> text carries meaning */
.gv11-y{ background:#f2fbf6; border-color:#bfe6d1; }
.gv11-y b{ color:#0e7a46; }
.gv11-y b::before{ background:#17a862; border-color:#17a862; }
.gv11-y b::after{
  content:""; position:absolute; left:6.2px; top:3.4px;
  width:4px; height:8px; border:solid #fff; border-width:0 2px 2px 0;
  transform:rotate(43deg);
}
.gv11-p{ background:#fdf8ee; border-color:#f0dcb0; }
.gv11-p b{ color:#9a6c11; }
.gv11-p b::before{ background:#f0a832; border-color:#f0a832; }
.gv11-p b::after{
  content:""; position:absolute; left:4.5px; top:7.5px;
  width:8px; height:2px; background:#fff; border-radius:1px;
}
.gv11-n b{ color:#5a6675; font-weight:700; }
.gv11-a{ background:#fdf1f1; border-color:#f0c4c4; }
.gv11-a b{ color:#b03030; }
.gv11-a b::before{ background:#dd4b4b; border-color:#dd4b4b; }
.gv11-a b::after{
  content:"\00d7"; position:absolute; left:4.7px; top:-.5px;
  font-size:13px; font-weight:800; color:#fff; line-height:17px;
}
.gv11-w{ background:#f1f6fd; border-color:#c6d8ef; }
.gv11-w b{ color:#10407f; }
.gv11-w b::before{ background:#3f77c0; border-color:#3f77c0; }
.gv11-w b::after{
  content:"i"; position:absolute; left:6.8px; top:0;
  font-size:11px; font-weight:800; color:#fff; line-height:17px; font-family:var(--pha-font-mono);
}
/* our own column reads as the reference column at a glance */
.gv11-mx-t tbody td:first-of-type{ box-shadow:inset 0 0 0 1px rgba(23,168,98,.28); }

.gv11-mx-foot{
  position:relative; max-width:1516px; margin:14px auto 0;
  background:#fff;
  border:1px solid #cfd6e0;
  border-radius:var(--pha-radius-lg); padding:16px 18px;
  box-shadow:0 1px 6px rgba(10,20,40,.06);
}
.gv11-mx-foot p{ margin:0; font-size:12.8px; line-height:1.62; color:#3b4652; }
.gv11-mx-foot strong{ color:#0a0d11; }
.gv11-mx-note{ margin-bottom:8px !important; padding:10px 14px; background:#f4f6f8; border-left:3px solid #5a6b85; border-radius:0 4px 4px 0; font-size:12px; color:#3b4652; }
.gv11-mx-ask{ margin-top:10px !important; color:#0a0d11 !important; }
.gv11-mx-ask a{ color:#10407f; font-weight:700; text-decoration:none; }
.gv11-mx-ask a:hover{ text-decoration:underline; }

/* ---------- responsive ---------- */
@media (max-width:1080px){
  .gv11-mandates{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  .gv11-band-head,
  .gv11-mx-head{ grid-template-columns:1fr; gap:20px; }
  .gv11-band-stat{ border-left:0; border-top:2px solid rgba(169,202,255,.42); padding:14px 0 0; }
  .gv11-legend{ grid-template-columns:repeat(2, minmax(0,1fr)); }
}
@media (max-width:720px){
  .gv11-band, .gv11-matrix{ padding:40px 14px 44px; }
  .gv11-mandates{ grid-template-columns:1fr; }
  .gv11-band-foot{ grid-template-columns:1fr; }
  .gv11-band-title{ font-size:22px; }
  .gv11-mx-t thead th{ position:static; }
}
@media (prefers-reduced-motion:reduce){
  .gv11-m, .gv11-m:hover{ transition:none; transform:none; }
  .gv11-pulse{ animation:none; }
}

/* gv11 matrix — give the reference column room; it carries the longest copy */
.gv11-mx-t thead th.gv11-th-us{ width:206px; min-width:206px; }
.gv11-mx-t tbody td:first-of-type{ width:206px; min-width:206px; }
.gv11-c{ width:calc((100% - 418px) / 6); }
/* fixed layout so declared column widths are honoured and no column is pushed
   off-canvas by intrinsic content width at 1280px */
.gv11-mx-t{ table-layout:fixed; }
.gv11-mx-t th, .gv11-mx-t td{ overflow-wrap:break-word; }
.gv11-c b{ hyphens:auto; }
.gv11-c .gv11-src{ overflow-wrap:anywhere; }
@media (max-width:1120px){
  .gv11-mx-t{ table-layout:auto; }
  .gv11-mx-t thead th.gv11-th-ctl,
  .gv11-mx-t tbody th{ width:206px; min-width:206px; }
  .gv11-c{ width:auto; min-width:150px; }
  .gv11-mx-t tbody td:first-of-type{ min-width:176px; }
}
/* inline emphasis inside a matrix row header (must not become a block note) */
.gv11-mx-t tbody th .gv11-em{ display:inline; font-style:italic; text-decoration:none; }
/* never break a vendor name mid-word in the header row */
.gv11-mx-t thead th{ overflow-wrap:normal; word-break:normal; }

/* ---- v14 fold density audit (2026-08-15 owner directive) ----
   The entire hero (card + map) must sit above a 740px fold in EVERY auth
   state. The hero gets a hard height clamp on wide screens so late-growing
   card content (enroll / challenge / workspace) can never push the page
   below the fold; the card scrolls internally as the fail-safe. */
@media (min-width:1081px){
  /* v19: offset 118→133 accounts for the gv17 proof band (59 header + 66 band + 8 pad).
     v20 (2026-08-18 owner directive): the sign-in card must NEVER show a
     vertical scrollbar in the default auth states — the hero floor rises to
     the card's natural height (620px content + 18px hero padding + slack),
     even where that means the hero runs slightly past a short fold. The
     internal card scroll remains only as the fail-safe for the late-growing
     enroll/challenge states. Max 640→700 gives tall screens a bigger map
     and card proportionally. */
  .gv6-hero{height:clamp(656px,calc(100vh - 133px),700px)}
  /* v19: grid items default to min-height:auto and refuse to shrink below
     content — that let the card+map bleed 24px past the hero clamp into the
     mandate band. min-height:0 restores the clamp; the card's internal
     scroll below is the designed fail-safe. */
  .gv6-left,.gv6-right{min-height:0}
  .gv6-left .pt-gate-card{overflow-y:auto;overflow-x:visible}
  .gv6-mapbox{min-height:0}
}
.gv6-hero{padding:10px 22px 8px}
.gv6-left .pt-gate-card{padding:14px 20px 12px}
.gv6-left .pt-gate-card .pt-gate-h1{font-size:19px;margin-bottom:6px}
.gv6-left .pt-gate-card .pt-gate-tabs{margin:0 0 10px}
.gv6-left .pt-gate-card .pt-gtab{padding:8px}
.gv6-left .pt-gate-card .sub{margin:0 0 10px;font-size:12px;line-height:1.45}
.gv6-left .pt-gate-card label{margin:8px 0 4px}
.gv6-left .pt-gate-card input{padding:8px 11px}
.gv6-left .pt-gate-card .pt-gate-cta{margin-top:10px;padding:10px}
.gv6-left .pt-gate-card .pt-gate-cta.ghost{margin-top:6px}
.gv6-left .pt-gate-card .pt-gate-foot{padding-top:9px;font-size:11px;line-height:1.45}

/* ---- v14 showcase marketing type pass (2026-08-15 owner directive) ----
   The platform cards are a MARKETING surface: the type was drowning in the
   card area (14px names / 11.5px taglines in ~140px-tall cards). Bigger,
   more prevalent type; the whitespace goes to work. */
.gv10-body .gv7-cards .pha-card-name{font-size:17px;line-height:1.25;margin:0 0 5px}
.gv10-body .gv7-cards .pha-card-tagline{font-size:13.5px;line-height:1.5;font-weight:500}
.gv10-body .gv7-cards .pha-card-icon{width:32px;height:32px;font-size:17px;border-radius:8px}
.gv10-body .gv7-cards .pha-card-icon svg{width:17px;height:17px}
.gv10-body .gv7-cards .pha-card-link{font-size:13.5px;font-weight:600}
.gv10-body .gv7-cards .gv7-bd{font-size:11px;padding:3px 8px}
.gv10-body .gv7-cards .pha-card-featured{padding:13px 16px 11px}
.gv7-foot{font-size:13px}
/* v14: CTA row must never wrap mid-label */
.gv10-body .gv7-cards .pha-card-link{white-space:nowrap}
.gv10-body .gv7-cards .pha-card-cta{gap:10px;padding-top:6px;flex-wrap:nowrap}

/* gv14 matrix — v15 LIGHT (owner directive 2026-08-15): Civic Modern light per
   docs/RULES.md §7 — white card, thin gray borders, near-black text. The
   simplified circular verdict marks from v14 are KEPT. Densified (34px rows,
   compact columns) so the full 15-control table renders with NO internal
   scrolling at desktop widths: no max-height, no overflow-y, table fits the
   container width at >1080px. Below 1080px horizontal panning returns with a
   frozen control column; vertical scrolling stays off at every width. */
.gv14-matrix .gv11-mx-head{align-items:start}
.gv14-legend li{gap:7px}
.gv14-lg,.gv14-mark{display:inline-grid;place-items:center;border-radius:50%;font-family:inherit;font-weight:800;line-height:1}
.gv14-lg{width:18px;height:18px;font-size:11px;flex:0 0 18px}
.gv14-mark{width:22px;height:22px;padding:0;border:0;cursor:pointer;font-size:13px;transition:transform .15s ease,box-shadow .15s ease}
.gv14-mark:hover,.gv14-mark:focus-visible,.gv14-info:hover,.gv14-info:focus-visible{outline:2px solid #10407f;outline-offset:2px;transform:translateY(-1px)}
.gv14-y{background:#1d805f;color:#edfff7}.gv14-p{background:#966a1e;color:#fff5d7}.gv14-n{background:#516072;color:#f3f7fb}.gv14-a{background:#a33d4a;color:#fff2f3}.gv14-w{background:#2867aa;color:#edf7ff}
.gv14-scroll{border:1px solid #cfd6e0;border-radius:var(--pha-radius-lg,13px);background:#fff;box-shadow:0 1px 6px rgba(10,20,40,.06);padding:8px}
.gv14-table{width:100%;table-layout:fixed;border-collapse:separate;border-spacing:0;color:#17202b;font-size:12px}
.gv14-table caption{caption-side:bottom;padding:10px 4px 2px;text-align:left}
.gv14-table th,.gv14-table td{border-bottom:1px solid #e2e8f0;padding:4px 6px}
/* D-23 (2026-09-11 pha end-user audit): the assurance matrix header row was
   scrolling off-screen before the reader could see which vendor each column
   belonged to. Sticky positioning inside the scroll container pins the header
   at the top of the visible cells (both the outer page scroll and the inner
   horizontal scroll region), with a subtle shadow to preserve the separation. */
.gv14-table thead th{background:#f4f3ef;color:#0a0d11;text-align:center;vertical-align:middle;font-size:11.5px;font-weight:800;line-height:1.2;padding:7px 5px;border-bottom:1px solid #cfd6e0;position:sticky;top:0;z-index:2;box-shadow:0 1px 0 #cfd6e0}
.gv14-table thead th>span{display:block;margin-top:2px;color:#5a6675;font-size:11px;font-weight:600;line-height:1.2}
.gv14-table .gv14-ctl-head,.gv14-table .gv14-control{width:200px;min-width:200px;background:#f8fafc;text-align:left;color:#0a0d11}
.gv14-table .gv14-ctl-head{background:#f4f3ef}
.gv14-table .gv14-control{font-size:11.5px;font-weight:700;line-height:1.3}
.gv14-table .gv14-row{height:34px}
.gv14-table .gv14-row:nth-of-type(even) td{background:#f7f9fc}
.gv14-table .gv14-row:nth-of-type(even) .gv14-control{background:#f3f6fa}
.gv14-table .gv14-c{text-align:center;vertical-align:middle;padding:4px}
.gv14-table .gv14-c .gv14-mark{margin:auto}
.gv14-table .gv14-us-head,.gv14-table .gv14-us-cell{background-color:rgba(23,168,98,.10)!important;box-shadow:inset 2px 0 #17a862,inset -2px 0 #17a862}
.gv14-table .gv14-group th{padding:6px 10px;background:#e9eef5;color:#10407f;border-bottom:1px solid #cfd6e0;font-size:11px;font-weight:800;letter-spacing:.08em;text-align:left;text-transform:uppercase}
.gv14-info{display:inline-grid;place-items:center;width:16px;height:16px;margin-left:5px;padding:0;border:1px solid #9aa7b8;border-radius:50%;background:#fff;color:#3b4652;cursor:pointer;font-size:11px;font-family:Georgia,serif;font-weight:700;vertical-align:middle}
#gv14-tip{position:fixed;z-index:9999;max-width:min(360px,calc(100vw - 16px));padding:11px 12px;border:1px solid #cfd6e0;border-radius:9px;background:#fff;color:#17202b;box-shadow:0 12px 34px rgba(10,20,40,.18);font-size:12px;line-height:1.45;pointer-events:auto}
#gv14-tip[hidden]{display:none}#gv14-tip b{display:block;margin:0 0 4px;color:#0a0d11;font-size:12px}#gv14-tip a{color:#10407f;text-decoration:underline;text-underline-offset:2px}#gv14-tip .gv14-date{display:inline-block;margin-left:4px;color:#5a6675;font-size:11px;font-style:normal;white-space:nowrap}
/* legend stacks vertically in the 262px head sidebar */
.gv14-matrix .gv11-legend{grid-template-columns:1fr;gap:6px}
.gv14-matrix .gv11-legend li{white-space:nowrap;font-size:11.5px;color:#3b4652}
@media (max-width:1080px){.gv14-matrix .gv11-legend{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:720px){.gv14-matrix .gv11-legend{grid-template-columns:1fr}}
/* narrow screens: horizontal pan with frozen control column (no vertical scroll) */
@media (max-width:1080px){
  .gv14-scroll{overflow-x:auto;overscroll-behavior-x:contain}
  /* G-112 (2026-09-19 pre-launch audit): the table is many screens tall and the
     hint pill above it scrolls away, so mid-table a visitor saw a clipped third
     column with no cue that it pans. A continuous right-edge scroll shadow runs
     the full container height and is visible at any vertical position. The
     white cover layers use background-attachment:local so they travel with the
     content and slide over the shadow once the last column is reached -- the
     cue disappears exactly when there is nothing left to reveal. Pure CSS. */
  .gv14-scroll{
    background-color:#fff;
    background-image:
      linear-gradient(to right,#fff 40%,rgba(255,255,255,0)),
      linear-gradient(to left,#fff 40%,rgba(255,255,255,0)),
      radial-gradient(farthest-side at 0 50%,rgba(16,24,40,.3),rgba(16,24,40,0)),
      radial-gradient(farthest-side at 100% 50%,rgba(16,24,40,.3),rgba(16,24,40,0));
    background-position:left center,right center,left center,right center;
    background-size:56px 100%,56px 100%,22px 100%,22px 100%;
    background-repeat:no-repeat;
    background-attachment:local,local,scroll,scroll;
  }
  .gv14-table{width:max-content;min-width:100%;table-layout:auto}
  .gv14-table thead th{min-width:104px}
  .gv14-table .gv14-ctl-head,.gv14-table .gv14-control{position:sticky;left:0;z-index:3;width:170px;min-width:170px}
  .gv14-table .gv14-ctl-head{z-index:5}
  .gv14-group-lab{position:sticky;left:10px;display:inline-block}
}
/* WCAG 2.1 SC 1.4.10 (Reflow) fix — 2026-09-03, v3 (2026-09-03 later same day).
   v1/v2 used an absolutely-positioned ::after pseudo-element, which twice
   rendered with an unexpected computed offset that stretched/overlapped the
   table header (confirmed via live production screenshots both times).
   Rather than keep guessing at ::after's box geometry inside this table's
   layout, this version uses a real DOM element (.gv11-mx-hint span, added
   in portal.html immediately before the <table>) that participates in
   normal document flow above the table — no absolute positioning, no
   inherited offset ambiguity, and it's in the accessibility tree (though
   aria-hidden since the scrollable region already has its own aria-label). */
.gv11-mx-hint{display:none}
@media (max-width:1080px){
  .gv11-mx-hint{
    display:block; margin:0 0 6px; text-align:right;
    font:600 11px/1 ui-monospace,monospace; letter-spacing:.04em;
    color:#51607a; background:rgba(81,96,122,.08);
    border:1px solid #cfd6e0; border-radius:999px; padding:5px 9px;
  }
}
/* gv14 defect-7 fix: one-column showcase cards + wrapping action row on phones */
@media (max-width:560px){
  .gv7-cards,.gv10-body .gv7-cards{grid-template-columns:1fr}
  .gv7-cards .pha-card-name{font-size:16px}
  .gv7-cards .pha-card-tagline{font-size:13px}
  .gv7-cards .pha-card-cta{flex-wrap:wrap;row-gap:6px}
}
/* gv14 defect-6: if the live-data cascade cannot load (fetch failure), the
   card grid takes the full band width instead of leaving a dead right rail. */
.gv10-body:has(.gv10-cascade[hidden]){grid-template-columns:minmax(0,1fr)}
.gv10-body:has(.gv10-cascade[hidden]) .gv7-cards{padding-right:0}
/* gv14 defect-6: the LIVE DATA column header reads as a header, not a caption */
.gv10-live-head{font-size:11px}
.gv10-live-head .rl-strip-ts{font-size:11px}

/* v16.2 (owner directive 2026-08-15): floating section menu REMOVED.
   The only floating element is the standard back-to-top button. */
.gv16-top-fab{position:fixed;right:16px;bottom:18px;z-index:65;width:42px;height:42px;border-radius:50%;
  border:1px solid #c9d7ea;background:rgba(255,255,255,.95);color:#10407f;font:700 16px/1 var(--pha-font-body,Inter,system-ui);
  box-shadow:0 8px 22px rgba(13,35,64,.2);cursor:pointer}
.gv16-top-fab:hover{background:#eef3fa}
.pt-gate.gv6.exploring .gv16-top-fab{display:none}

/* ============ Obligation calendar + module status board (2026-08-16) ==== */
.obl-month{font:800 13px/1.2 Inter,system-ui;color:#101828;margin:20px 0 8px;padding-bottom:5px;border-bottom:1px solid #e2e6ee}
.obl-row{display:flex;align-items:center;gap:10px;padding:10px 13px;border:1px solid #e2e6ee;border-radius:10px;background:#fff;margin:0 0 7px;text-decoration:none;color:#1c2430;font:500 13px/1.45 Inter,system-ui}
a.obl-row:hover{border-color:#b9c6dd;box-shadow:0 2px 8px rgba(16,24,40,.06)}
.obl-date{flex:0 0 auto;min-width:96px;font:700 11.5px/1.2 ui-monospace,monospace;color:#10407f;background:#eef3fb;border-radius:7px;padding:6px 8px;text-align:center}
.obl-date.warn{color:#9a5b00;background:#fdf3e4}
.obl-date.danger{color:#a1160a;background:#fdecea}
.obl-scope{flex:0 0 auto;font:700 11px/1 ui-monospace,monospace;letter-spacing:.06em;border-radius:5px;padding:4px 6px}
.obl-federal{color:#5b21b6;background:#f1eafe}
.obl-state{color:#0e7a5f;background:#e7f5f0}
.obl-local{color:#10407f;background:#eef3fb}
.obl-kind{font:700 11px/1 ui-monospace,monospace;letter-spacing:.05em;color:#5f7086}
.obl-body{min-width:0}
.obl-det{display:block;font:500 11.5px/1.4 Inter,system-ui;color:#5f7086;margin-top:2px}
.pt-modboard{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;margin:10px 0 18px}
.pt-modgrp{border:1px solid #e2e6ee;border-radius:12px;background:#fff;padding:12px 14px}
.pt-modgrp-h{font:700 12px/1.2 Inter,system-ui;color:#101828;display:flex;align-items:center;gap:8px;margin:0 0 9px}
.pt-modrow{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid #eef1f6;border-radius:8px;margin:0 0 6px;text-decoration:none;color:#1c2430;font:500 12.5px/1.35 Inter,system-ui}
a.pt-modrow:hover{border-color:#b9c6dd;background:#f8fafd}
.pt-modrow .nm{flex:1 1 auto;min-width:0}
.pt-modrow .ph{font:700 11px/1 ui-monospace,monospace;letter-spacing:.06em;color:#5f7086;text-transform:uppercase;background:#f1f3f7;border-radius:5px;padding:4px 6px}
.pt-modrow .act{font:600 11px/1 Inter,system-ui;color:#10407f;white-space:nowrap}
@media (max-width:720px){.obl-row{flex-wrap:wrap}.obl-date{min-width:0}}

/* =====================================================================
   v17 OPTION A (2026-08-16, owner-approved gate audit): proof surfaces +
   display type. Space Grotesk (Google Fonts, 500-700) is the display face
   for headline numerals and the two hero-weight lines; Inter stays the
   body face, IBM Plex Mono stays the data-label face. */
.gv17-proof{display:grid;grid-template-columns:repeat(auto-fit,minmax(172px,1fr));background:#0b1f3a;border-bottom:1px solid #1d3a61;padding:0 16px}
.gv17-cell{padding:13px 14px 12px;border-left:1px solid #16304f;min-width:0}
.gv17-cell:first-child{border-left:none}
.gv17-cell b{display:block;font:700 21px/1.1 "Space Grotesk",Inter,system-ui;letter-spacing:.01em;color:#fff;font-variant-numeric:tabular-nums}
.gv17-cell span{display:block;margin-top:4px;font:600 11px/1.35 "IBM Plex Mono",ui-monospace,monospace;letter-spacing:.09em;text-transform:uppercase;color:#8ea7c9}
.gv17-cell i{font-style:normal;color:#39d98a;text-transform:lowercase;letter-spacing:.05em}
/* v19: tightened 13px→8px margin / 10px→8px cell padding so the card's
   content fits the 640px hero without engaging the internal-scroll fail-safe */
.gv17-cardstats{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-top:8px}
.gv17-scell{background:#f2f7fd;border:1px solid #d9e6f6;border-radius:8px;padding:8px 12px;min-width:0}
.gv17-scell b{display:block;font:700 17px/1.15 "Space Grotesk",Inter,system-ui;color:#0e2440;font-variant-numeric:tabular-nums}
.gv17-scell span{display:block;margin-top:4px;font:600 11px/1.35 "IBM Plex Mono",ui-monospace,monospace;letter-spacing:.07em;text-transform:uppercase;color:#5a6c85}
/* rec 8a: disabled primary button reads as an inert outline, not a clickable solid */
/* Wave 4 (2026-08-30, VPAT 1.4.3): disabled-state text was #7e93b1 (3.14:1 on the
   white card) — darkened within the same slate ramp to #566b8e (5.40:1). */
#gate-btn:disabled{background:transparent;border:1.5px dashed #a9bdd9;color:#566b8e;cursor:default}
/* display face on the hero-weight lines (static header value line + card title) */
.rs-authority-slogan{font-family:"Space Grotesk",Inter,system-ui;font-weight:600;letter-spacing:.005em}
.pt-gate-card .pt-gate-h1{font-family:"Space Grotesk",Inter,system-ui;letter-spacing:.005em}
/* rec 8c: on stacked layouts the map shows FIRST as a 240px teaser above the card */
@media (max-width:1080px){
  .gv6-right{order:-1}
  .gv6-mapbox{height:240px;min-height:240px}
  .gv17-cell b{font-size:18px}
}

/* ================================================================
   v18 (2026-08-16) — gate audit pass 3: mandate head one-row (rec 6a),
   matrix collapse expander (rec 6b), Contact Sales modal (rec 7a).
   ================================================================ */
.gv11-band-head.gv18-onerow{grid-template-columns:minmax(0,1fr);gap:0;margin-bottom:16px}
.gv18-onerow .gv11-band-sub{max-width:980px}
.gv18-onerow .gv11-band-sub strong{color:var(--pha-on-dark);font-weight:700}

/* v20 (2026-08-18 owner directive): gv18-mx-toggle styles retired — the
   vendor matrix is always fully expanded, the expander button is gone. */

.gv18-modal{position:fixed;inset:0;z-index:220;display:flex;align-items:center;justify-content:center;padding:20px}
/* the display:flex above would defeat the hidden attribute's UA display:none
   (same specificity, later in cascade) — restate it explicitly */
.gv18-modal[hidden]{display:none}
.gv18-modal-back{position:absolute;inset:0;background:rgba(4,14,34,.62);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}
.gv18-modal-card{
  position:relative;width:min(440px,100%);background:#fff;border-radius:14px;
  border:1px solid #d5e0ee;box-shadow:0 22px 60px rgba(4,14,34,.45);
  padding:22px 22px 20px;
}
.gv18-modal-card h3{margin:0 0 4px;font:700 20px/1.25 'Space Grotesk',var(--pha-font-sans);color:#0e2440}
.gv18-ct-sub{margin:0 0 14px;font-size:12.5px;line-height:1.5;color:#5a6b82}
.gv18-modal-x{
  position:absolute;top:10px;right:12px;border:0;background:none;cursor:pointer;
  font-size:22px;line-height:1;color:#8195ad;padding:4px;
}
.gv18-modal-x:hover{color:#0e2440}
.gv18-ct-lab{display:block;margin:0 0 11px;font:700 11px/1.4 var(--pha-font-mono);letter-spacing:.07em;text-transform:uppercase;color:#42566f}
.gv18-ct-lab input,.gv18-ct-lab textarea{
  display:block;width:100%;box-sizing:border-box;margin-top:4px;
  font:400 14px/1.45 var(--pha-font-sans);color:#122a47;
  border:1px solid #c3d2e4;border-radius:8px;padding:9px 11px;background:#f8fbff;
}
.gv18-ct-lab input:focus,.gv18-ct-lab textarea:focus{outline:2px solid #10407f;outline-offset:0;border-color:#10407f;background:#fff}
.gv18-ct-actions{display:flex;align-items:center;gap:14px;margin-top:16px;flex-wrap:wrap}
.gv18-ct-send{
  font:700 14px/1 var(--pha-font-sans);cursor:pointer;color:#fff;background:#10407f;
  border:1.5px solid #10407f;border-radius:9px;padding:11px 18px;
}
.gv18-ct-send:hover{background:#12447f}
.gv18-ct-direct{font-size:12px;color:#42566f;text-decoration:underline}
@media (max-width:560px){.gv18-modal{padding:10px}.gv18-modal-card{padding:18px 14px 16px}}

/* Wave 4 (2026-08-30, VPAT 2.4.1): the homepage skip link targets the gate's
   #main-content. Once the boot script hides the gate (signed-in), the target is
   gone — hide the link too so it never becomes a dead first tab stop in the app. */
body.portal:has(#pt-gate[hidden]) .skip-link{display:none}
