/* ─── Brand fonts, self-hosted ───────────────────────────────────────────────
   Was a <link> to fonts.googleapis.com. Self-hosted so the app contacts exactly one
   third party — Supabase, for its data — which is the answer a customer's IT security
   review asks for, and one fewer origin carrying a visitor's IP to somebody else.
   The often-repeated reason ("a plant network might block Google") is the weaker one and
   is recorded as such: the app already needs app.assetnerve.ai and supabase.co reachable.

   Variable fonts — one file per family per subset covers the whole weight range, instead
   of ten static files. The weight RANGE in font-weight is what makes that work; a plain
   `font-weight:400` here would make every heading render at 400.

   The unicode-range values are copied verbatim from Google's own stylesheet, not typed by
   hand, and they are load-bearing: with them a normal session fetches only the three latin
   files (~100KB) and never touches latin-ext unless a name needs a diacritic. Delete them
   and every load pulls all 212KB.

   Subsets deliberately not shipped: cyrillic, cyrillic-ext, greek, greek-ext, vietnamese.
   Also note — none of these three families contain Arabic glyphs, so Arabic text falls back
   to a system font. That was already true with Google Fonts; bilingual reports will need a
   fourth family chosen on purpose, not an assumption that the brand set covers it.
   ─────────────────────────────────────────────────────────────────────────── */
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:400 700;font-display:swap;src:url('fonts/space-grotesk-latin.06408904.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:400 700;font-display:swap;src:url('fonts/space-grotesk-latin-ext.952dddb4.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Inter';font-style:normal;font-weight:400 600;font-display:swap;src:url('fonts/inter-latin.3100e775.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:400 600;font-display:swap;src:url('fonts/inter-latin-ext.34b9c504.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 600;font-display:swap;src:url('fonts/jetbrains-mono-latin.83c005d4.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 600;font-display:swap;src:url('fonts/jetbrains-mono-latin-ext.db5ff4db.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}

*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Inter',-apple-system,sans-serif;background:var(--rca-page-bg);color:var(--rca-text-primary);-webkit-font-smoothing:antialiased;height:100vh;overflow:hidden;font-size:13px}
::selection{background:var(--nerve-yellow);color:var(--signal-black)}

:root {
    /* ─────────────────────────────────────────────────────────────
       AssetNerve.ai — Brand Tokens v1.0
       Copied verbatim from Brand Guidelines §9.1. Do not re-derive.
       New brand colors require a brand review, not a design decision.
       ───────────────────────────────────────────────────────────── */
    /* Core palette */
    --nerve-yellow:   #FFD400;
    --signal-black:   #0A0A0A;
    --panel-white:    #FFFFFF;
    /* Supporting */
    --surface:        #141414;
    --border:         #242424;
    --steel:          #9C9C9C;
    --deep-amber:     #B89600;  /* yellow substitute on light bg */
    /* Type */
    --font-display:   'Space Grotesk', sans-serif;
    --font-mono:      'JetBrains Mono', monospace;
    --font-body:      'Inter', sans-serif;
    /* Signatures */
    --glow-nerve:     0 0 24px rgba(255,212,0,.35), 0 0 64px rgba(255,212,0,.12);
    --radius:         6px;
    --grid-size:      48px;
    --grid-line:      rgba(255,212,0,.04);

    /* ─────────────────────────────────────────────────────────────
       AssetNerve: RCA (MOD-001) — application mapping onto the brand tokens
       ───────────────────────────────────────────────────────────── */
    /* Surfaces: Signal Black is the field, Surface #141414 is raised */
    --rca-page-bg: var(--signal-black);
    --rca-panel-bg: var(--signal-black);      /* recessed wells inside raised panels */
    --rca-tile-bg: var(--surface);
    --rca-border: var(--border);
    --rca-border-strong: #333333;             /* derived UI shade — one hairline step above --border */

    /* Text */
    --rca-text-primary: var(--panel-white);
    --rca-text-secondary: var(--steel);
    /* Derived UI shade — tertiary text on Signal Black. NOT a Brand Guidelines §9.1 value,
       which is what makes it changeable; see the note in CLAUDE.md about the two derived
       shades. Was #5E5E5E, which measured 2.84:1 on a card and 3.05:1 on the page — under
       the 4.5:1 WCAG AA floor for normal text, in ~155 places, all of them text. It was
       colouring the study reference number, which is the string people read aloud.
       #858585 measures 4.99:1 on a card and 5.37:1 on the page, and stays clearly quieter
       than Steel (6.71:1) so the third tier of the hierarchy survives. The print block
       keeps its own #6E6E6E, which is ~5.1:1 on white and already passed. */
    --rca-text-muted: #858585;

    /* Signal — CTAs, live status, the one thing that matters (§3.3, 5% budget) */
    --rca-accent: var(--nerve-yellow);
    --rca-accent-hi: #FFDF3D;                 /* derived hover state of --nerve-yellow */
    --rca-accent-tint: rgba(255,212,0,.15);   /* module chip fill, §6.2 */

    /* Root cause category accents — gray/steel context series against the
       yellow primary (§8.1). Systemic carries Nerve Yellow: every branch in
       the method must terminate there, so it is the signal, not a category. */
    --rca-cat-physical: #6E8FA6;
    --rca-cat-human: #8C7FA6;
    --rca-cat-systemic: var(--nerve-yellow);
    --rca-cat-contributing: #A6836E;
    --rca-cat-why: #7E8A93;

    /* Functional status semantics — traffic-light meaning, not brand palette.
       Never used decoratively; only to report the state of an action or node. */
    --rca-status-open: var(--steel);
    --rca-status-warn: #E8A23C;
    --rca-status-critical: #D14B45;
    --rca-status-done: #5DCAA5;
    --rca-tint-warn: rgba(232,162,60,.15);
    --rca-tint-critical: rgba(209,75,69,.15);
    --rca-tint-done: rgba(93,202,165,.15);
    --rca-tint-steel: rgba(156,156,156,.15);

    /* Typography */
    --rca-font-display: var(--font-display);
    /* Was missing while @media print already referenced it, so the print host silently fell
       back to inheriting body's Inter. Same value, now actually declared. */
    --rca-font-body: var(--font-body);
    --rca-font-mono: 'JetBrains Mono', 'SF Mono', monospace;
    --rca-track: .15em;                       /* uppercase mono tracking, §9.2 — non-negotiable */

    /* Layout */
    --rca-radius: var(--radius);
    --rca-node-width: 240px;
}

/* Header */
.hdr{height:44px;background:var(--rca-tile-bg);border-bottom:1px solid var(--rca-border);display:flex;align-items:center;padding:0 16px;justify-content:space-between;user-select:none;z-index:100;position:relative}
.hdr-l{display:flex;align-items:center;gap:10px}
.hdr-l h1{font-size:15px;font-weight:700;color:var(--rca-text-primary);font-family:var(--rca-font-display);cursor:pointer;letter-spacing:-.01em;line-height:1.1;display:flex;align-items:center;gap:8px}
.nerve-mark{display:block;flex-shrink:0}
/* Product : module lockup — "AssetNerve" carries the brand, the suffix names the module */
.brand-mod{font-weight:500;color:var(--rca-text-secondary)}
/* Module identity code — Brand Guidelines §6.2 */
.mod-code{font-family:var(--rca-font-mono);font-size:10px;font-weight:500;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-muted);flex-shrink:0}
.hdr-r{display:flex;align-items:center;gap:6px}
.hdr-btn{background:none;border:none;color:var(--rca-text-secondary);cursor:pointer;font-size:12px;padding:4px 10px;border-radius:var(--rca-radius);font-weight:500;transition:.1s;font-family:var(--rca-font-mono)}
.hdr-btn:hover{background:var(--rca-border);color:var(--rca-text-primary)}
/* Layout */
.main{display:flex;height:calc(100vh - 76px)}
.sidebar{width:240px;background:var(--rca-panel-bg);border-right:1px solid var(--rca-border);display:flex;flex-direction:column;overflow-y:auto;flex-shrink:0}
.sidebar-section{padding:12px;border-bottom:1px solid var(--rca-border)}
.sidebar-section h3{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);margin-bottom:8px;font-family:var(--rca-font-mono)}
.study-row{padding:5px 8px;border-radius:var(--rca-radius);font-size:12px;color:var(--rca-text-secondary);cursor:pointer;display:flex;align-items:center;gap:6px;margin-bottom:1px}
.study-row:hover{background:var(--rca-tile-bg);color:var(--rca-text-primary)}
.study-row.active{background:var(--rca-tile-bg);color:var(--rca-text-primary);font-weight:500;box-shadow:inset 2px 0 0 var(--rca-accent)}
.palette-item{padding:5px 8px;border-radius:var(--rca-radius);font-size:12px;color:var(--rca-text-secondary);cursor:pointer;display:flex;align-items:center;gap:6px;margin-bottom:1px}
.palette-item:hover{background:var(--rca-tile-bg);color:var(--rca-text-primary)}
/* Same rule the More menu uses: the icon marks the row under the pointer. This is the
   ~5% yellow budget spent the way it is meant to be — one element, saying "here". */
.palette-item svg.ico{opacity:.6;transition:opacity .12s,stroke .12s}
/* :hover only. `.active` was in this list and should never have been: on this palette
   `active` means "allowed as a child of the selected node", which is an *enabled* state,
   not a chosen one — so every usable row went permanently yellow and hovering then changed
   nothing. Yellow marks where the pointer is; it cannot also mark what is available. */
.palette-item:not(.disabled):hover svg.ico{stroke:var(--rca-accent);opacity:1}
.palette-item .kbd{margin-left:auto;font-family:var(--rca-font-mono);font-size:10px;color:var(--rca-text-muted)}
.palette-item.disabled{opacity:.25;cursor:default}
.palette-item.disabled:hover{background:none}
.palette-item.active{color:var(--rca-text-primary);background:var(--rca-border)}
/* Canvas — the Blueprint Grid (§5.1): 4% yellow lines on Signal Black, 48px */
.canvas{flex:1;position:relative;background:var(--rca-page-bg);background-image:linear-gradient(var(--grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--grid-line) 1px,transparent 1px);background-size:var(--grid-size) var(--grid-size);overflow:hidden}
.canvas .wc{position:absolute;transform-origin:0 0;transition:transform .15s ease;overflow:visible}
/* Node cards — Surface on Signal Black, 1px borders, no shadows except the brand glow */
/* 250, was 200. Titles were truncating at roughly 17 characters, which turned
   "Replace seal and filter cartridge" into "Replace seal and filt…" on a card whose
   whole job is to say what the node is. NODE_W in data-model.js is the same number and
   drives the auto-layout spacing; the two must move together or wider cards overlap. */
.nc{position:absolute;min-width:230px;max-width:300px;width:250px;background:var(--rca-tile-bg);border-radius:var(--rca-radius);border:1px solid var(--rca-border);border-left:3px solid var(--rca-border-strong);cursor:pointer;user-select:none;z-index:2;transition:border-color .15s,box-shadow .15s}
.nc:hover{border-color:var(--rca-border-strong)}
/* The Glow (§5.4) — reserved for the single most important element on screen */
.nc.selected{border-color:var(--rca-accent);box-shadow:var(--glow-nerve)}
.nc .ch{padding:5px 10px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);font-family:var(--rca-font-mono);display:flex;align-items:center;gap:5px;border-bottom:1px solid var(--rca-border)}
/* ─── Icons ─────────────────────────────────────────────────────────────────────────────
   One class for every icon in the app, fed by ICO[] in data-model.js. `currentColor` means
   an icon can never disagree with its own label in any state, and `fill:none` with a single
   stroke width is what keeps 48 replaced emoji from becoming 48 different weights again.
   Size is overridable per context; nothing else here should be. */
svg.ico{width:14px;height:14px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;vertical-align:-2px}
.nc .ch svg.ico{width:14px;height:14px}
/* Smaller contexts. The stroke *weight* is deliberately not scaled with them: a 10px icon
   at 2/24 is already sub-pixel, and thinning it further is how an icon set stops looking
   like one set. Badges and meta chips sit inline with 10–11px type, so they take the
   baseline shift rather than the flex box. */
.bd svg.ico,.cm-item svg.ico,.ev-mark svg.ico,.nc .ci svg.ico{width:11px;height:11px;vertical-align:-1.5px}
.nc .ci svg.ico{vertical-align:-2px;margin-right:1px}
.nc .tb button svg.ico{width:13px;height:13px;vertical-align:-2px}
.nc .cb .cd{font-size:9px;font-weight:600;color:var(--rca-text-muted);font-family:var(--rca-font-mono);background:var(--rca-panel-bg);padding:1px 5px;border-radius:var(--rca-radius);flex-shrink:0;margin-left:auto}
.nc .cb{padding:6px 10px;font-size:13px;font-weight:500;color:var(--rca-text-primary);font-family:var(--rca-font-mono);display:flex;align-items:center;gap:6px;min-height:30px}
.nc .cb .lt{line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}
.nc .cb .bd{margin-left:auto;font-size:9px;padding:1px 6px;border-radius:var(--rca-radius);font-weight:600;font-family:var(--rca-font-mono);white-space:nowrap;flex-shrink:0}
/* Status dot — injected via JS in cc() */
.nc .sd{width:7px;height:7px;border-radius:50%;flex-shrink:0;background:var(--rca-status-open);display:inline-block;box-shadow:0 0 0 1.5px var(--rca-tile-bg)}
/* Hypothesis True/Not True badges */
.bd-t{background:var(--rca-tint-done);color:var(--rca-status-done)}
.bd-nt{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.bd-ext{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.tag-method{font-size:9px;font-weight:600;padding:1px 6px;border-radius:var(--rca-radius);background:var(--rca-panel-bg);color:var(--rca-text-secondary);font-family:var(--rca-font-mono);white-space:nowrap;letter-spacing:var(--rca-track);text-transform:uppercase}
.sc-method{font-size:9px;font-weight:600;background:var(--rca-panel-bg);padding:1px 6px;border-radius:var(--rca-radius);color:var(--rca-text-secondary);white-space:nowrap;font-family:var(--rca-font-mono);letter-spacing:var(--rca-track);text-transform:uppercase}
/* Card meta line (actionee/date) */
.nc .cm{padding:3px 10px 5px;font-size:10px;color:var(--rca-text-muted);display:flex;align-items:center;gap:8px;border-top:1px solid var(--rca-border);font-family:var(--rca-font-mono)}
.nc .cm .cm-item{display:flex;align-items:center;gap:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Child indicator */
.nc .ci{position:absolute;bottom:-7px;left:50%;transform:translateX(-50%);background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:8px;padding:0 5px;font-size:9px;font-weight:600;color:var(--rca-text-secondary);font-family:var(--rca-font-mono);z-index:3;pointer-events:none}
/* Type borders — category accent colors */
.nc.t-ev{border-left-color:var(--panel-white)}
.nc.t-fm{border-left-color:var(--rca-border-strong)}
.nc.t-hy{border-left-color:var(--rca-text-muted);border-style:dashed}
.nc.t-ht{border-left-color:var(--rca-status-done)}
.nc.t-hn{border-left-color:var(--rca-text-muted)}
.nc.t-pr{border-left-color:var(--rca-cat-physical)}
.nc.t-hr{border-left-color:var(--rca-cat-human)}
.nc.t-sr{border-left-color:var(--rca-cat-systemic)}
.nc.t-ca{border-left-color:var(--rca-status-done)}
.nc.t-cf{border-left-color:var(--rca-cat-contributing)}
.nc.t-wy{border-left-color:var(--rca-cat-why)}
/* Critical border override */
.nc.critical{border-color:var(--rca-status-critical);border-left-color:var(--rca-status-critical)}
/* Toolbar */
/* Floats ABOVE the card's top edge rather than sitting inside it. At top:3px it was laid
   over the header, so hovering a node with a long type label covered the label with the
   buttons — "CORRECTIVE ACTI🗑✏". Reserving header space instead would have cost the same
   pixels permanently and truncated the label on every card, hovered or not. Out here it
   costs nothing, and the solid background makes it read as a control strip rather than as
   something floating over the text. */
.tb{display:none;position:absolute;top:-12px;right:4px;gap:1px;z-index:6;
  background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:1px 2px}
.nc:hover .tb,.nc:focus-within .tb{display:flex}
.tb button{background:none;border:none;cursor:pointer;font-size:11px;padding:1px 4px;border-radius:var(--rca-radius);color:var(--rca-text-secondary)}
.tb button:hover{background:var(--rca-border);color:var(--rca-text-primary)}
/* Connectors */
svg.con{position:absolute;top:0;left:0;pointer-events:none;z-index:1}
/* Status bar */
.sb{display:flex;height:32px;background:var(--rca-tile-bg);border-bottom:1px solid var(--rca-border);align-items:center;padding:0 16px;gap:12px;font-size:11px;color:var(--rca-text-secondary);font-family:var(--rca-font-mono)}
.sb .tag{padding:1px 7px;border-radius:var(--rca-radius);font-size:10px;font-weight:600;font-family:var(--rca-font-mono);text-transform:uppercase;letter-spacing:.08em}
.tag-ca{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
/* Class not yet assigned — neutral, so it does not imitate a real class pill */
.tag-none{background:var(--rca-page-bg);color:var(--rca-text-muted);border:1px solid var(--rca-border)}
.tag-ia{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.tag-rf{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.tag-ap{background:var(--rca-accent-tint);color:var(--rca-accent)}
.tag-co{background:var(--rca-tint-done);color:var(--rca-status-done)}
.tag-ov{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.sb .sv{padding:1px 7px;border-radius:var(--rca-radius);font-size:10px;font-weight:600;font-family:var(--rca-font-mono);text-transform:uppercase;letter-spacing:.08em}
.sv-cr{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.sv-hi{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.sv-md{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.sv-lw{background:var(--rca-tint-done);color:var(--rca-status-done)}
/* Class chips (tag-c{a..e}) and the long-form status/severity class names
   emitted by r() / rd(). Kept alongside the short aliases above. */
.tag-cb{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.tag-cc{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.tag-cd{background:var(--rca-tint-done);color:var(--rca-status-done)}
.tag-ce{background:var(--rca-border);color:var(--rca-text-secondary)}
.tag-draft{background:var(--rca-panel-bg);color:var(--rca-text-secondary)}
.tag-in-analysis{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.tag-roots-found{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.tag-actions-planned{background:var(--rca-accent-tint);color:var(--rca-accent)}
/* Actions executed but not yet proven — deliberately not the 'complete' green */
.tag-awaiting-effectiveness{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.tag-complete{background:var(--rca-tint-done);color:var(--rca-status-done)}
/* The work is finished; the analysis behind it is not defensible. Amber rather than green,
   with a border so it reads as a flag and not as another shade of done. */
.tag-complete-unverified{background:var(--rca-tint-warn);color:var(--rca-status-warn);border:1px solid rgba(232,162,60,.45)}
.tag-overdue{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.sv-critical{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.sv-high{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.sv-medium{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.sv-low{background:var(--rca-tint-done);color:var(--rca-status-done)}
/* Class or type not yet chosen — derived severity is unknown, not Medium */
.sv-none{background:var(--rca-page-bg);color:var(--rca-text-muted);border:1px solid var(--rca-border)}
.sb .sp{width:1px;height:14px;background:var(--rca-border)}
/* Welcome / Empty */
.welc{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:14px;color:var(--rca-text-muted)}
.welc .wi{opacity:.85;line-height:0}
.welc h2{font-size:24px;font-weight:700;color:var(--rca-text-primary);font-family:var(--rca-font-display);letter-spacing:-.01em;line-height:1.1}
.welc p{max-width:380px;text-align:center;line-height:1.6;font-size:14px;color:var(--rca-text-secondary)}
/* Dashboard */
.dash{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding:24px;width:100%;scrollbar-width:none;background:var(--rca-page-bg)}
.dash::-webkit-scrollbar{display:none}
/* 800px used 42% of a 1920 screen — two columns of cards with 880px of empty margin either
   side, worst exactly where it matters most, on a meeting-room screen or a projector.
   Raised with the card minimum below, and the two have to move together: the grid is
   auto-fill, so widening this alone would have added columns and made every card *narrower*,
   wrapping the titles harder than before. Widening the container also gives the filter row
   enough space to stop orphaning the Location label from its select. */
.dash-inner{max-width:1600px;margin:0 auto;width:100%}
.dash-h{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}
.dash-h h2{font-size:28px;font-weight:700;color:var(--rca-text-primary);font-family:var(--rca-font-display);letter-spacing:-.015em;line-height:1.1}
/* Holds the heading row's actions. One today (+ New); kept as a cluster because a second
   header action is a live proposal (the executive summary, one click from the grid). */
.dash-c{display:flex;gap:8px;align-items:center}
/* 340, not 280, and it is paired with .dash-inner's max-width. At 1600 that yields four
   columns of ~391px — the same card width the old two-column 800px layout gave, so titles
   wrap no more than they did while twice as many studies are visible. Dropping to 280 here
   would trade the whole gain away for skinnier cards. */
.dash-g{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:12px}
/* The grid's render cap. Empty and invisible until there is something to say, so an ordinary
   register of a few dozen studies never sees it. :empty rather than a JS class toggle, so the
   markup and the style cannot disagree about whether the row exists. */
.dg-foot{display:flex;align-items:center;justify-content:center;gap:12px;padding:18px 0 4px}
.dg-foot:empty{display:none}
.dg-foot-n{color:var(--rca-text-muted);font-size:12px;font-family:var(--rca-font-mono);letter-spacing:.08em;text-transform:uppercase}
/* The tracker's equivalent, inside the table's own tfoot. NOT display:flex — a <td> that is
   flexed loses its table-cell display and drops out of the row-height algorithm, which is the
   defect that once split every row separator into two staggered pieces. The inner wrapper flexes;
   the cell stays a cell. */
.at-more{text-align:center;padding:16px 0 8px}
.at-more .dg-foot-n{margin-right:12px}
/* Three type sizes, not four clustered ones: 11px mono for every technical label, 14px for
   the one piece of prose, 18px for the title. Steps of 1.27 and 1.29 — the old 10/11/12/18
   put four near-identical sizes in one card and left the hierarchy to colour alone. */
.sc{background:var(--rca-tile-bg);border-radius:var(--rca-radius);border:1px solid var(--rca-border);padding:14px;cursor:pointer;position:relative;min-height:120px}
.sc:hover{border-color:var(--rca-border-strong)}
/* The grid had no keyboard path at all — no tabindex, no role, no focus style — so every
   study on the home page was mouse-only. Nerve Yellow is a signal here, which is exactly
   what the ~5% budget reserves it for. */
.sc:focus-visible{outline:2px solid var(--rca-accent);outline-offset:2px;border-color:var(--rca-border-strong)}
/* Its own line above the title. Inside the heading it consumed the first line's width and
   broke the title mid-tag. Padding keeps it clear of the action buttons. */
/* Steel, not the muted shade. --rca-text-muted is #5E5E5E, which measures 2.84:1 on the
   card surface — below the 4.5:1 floor, and this is the number people quote out loud.
   Hierarchy here comes from size and family (11px mono against an 18px display title),
   which is the honest way to make something recede; dropping it below legibility is not. */
.sc .sc-ref{font-family:var(--rca-font-mono);font-size:11px;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);margin-bottom:5px;padding-right:104px;line-height:1.3}
.sc .sct{font-size:18px;font-weight:600;color:var(--rca-text-primary);margin:0 0 8px;font-family:var(--rca-font-display);letter-spacing:-.01em;line-height:1.25;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* Clamped to two lines. Unclamped, one long description made every card in its grid row as
   tall as the worst one — rows stretch, so a single verbose study set the height for four. */
.sc .sce{font-size:14px;line-height:1.45;color:var(--rca-text-secondary);margin-bottom:8px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* Always present, not display:none-until-hover. Hover-only controls do not exist on a
   tablet, and cannot be reached by keyboard at all. */
.sc .sc-actions{position:absolute;top:12px;right:12px;display:flex;gap:4px;opacity:.35;transition:opacity .12s}
.sc:hover .sc-actions,.sc:focus-within .sc-actions{opacity:1}
.sc .sc-actions button{background:none;border:1px solid transparent;cursor:pointer;font-size:10px;padding:2px 6px;border-radius:var(--rca-radius);
  color:var(--rca-text-muted);line-height:1.4;font-family:var(--rca-font-mono);letter-spacing:var(--rca-track)}
.sc .sc-actions button:hover{background:var(--rca-border);color:var(--rca-text-primary)}
.sc .sc-actions button:focus-visible{outline:2px solid var(--rca-accent);outline-offset:1px}
.sc .sc-actions button.del:hover{color:var(--rca-status-critical);background:var(--rca-tint-critical)}
/* Event date, and the response gap only when it has been missed. */
/* Tracking sits on the labels, not on the row. 0.15em is the brand's spec for *uppercase
   technical labels*; applied to numerals it added ~45px to a line of dates and pushed
   `EVENT 2025-10-07  RCA 2025-10-10 – 2026-04-08` two pixels past the card, wrapping it to
   two lines. Digits are not what tracking is for. */
.sc .sc-meta{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:6px;font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-secondary)}
/* The label recedes from its value by weight, not by falling under the contrast floor. */
/* .85, not .75: at .75 the composited label measured 4.29:1, just under the AA floor. */
/* nowrap keeps a date range whole: `RCA 2026-06-07 – 2026-08-01` must never break across
   lines at the dash, which would read as two unrelated dates. The row wraps between items. */
.sc .sc-m{white-space:nowrap}
.sc .sc-m i{font-style:normal;font-weight:400;opacity:.85;margin-right:4px;letter-spacing:var(--rca-track)}
.sc .sc-m-late{color:var(--rca-status-critical);font-weight:600}
.sc .scs{font-size:11px;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);display:flex;gap:14px;flex-wrap:wrap;font-family:var(--rca-font-mono);opacity:.85}
.sc .sc-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.sc .sc-class{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:var(--rca-radius);font-size:10px;font-weight:600;font-family:var(--rca-font-mono);flex-shrink:0}
.sc .sc-class.cls-a{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.sc .sc-class.cls-b{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.sc .sc-class.cls-c{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.sc .sc-class.cls-d{background:var(--rca-tint-done);color:var(--rca-status-done)}
.sc .sc-class.cls-e{background:var(--rca-border);color:var(--rca-text-secondary)}
.sc .sc-class.cls-none{background:var(--rca-page-bg);color:var(--rca-text-muted);border:1px solid var(--rca-border)}
.sc .sc-divider{width:1px;height:14px;background:var(--rca-border);flex-shrink:0}
.sc .sc-status{font-size:10px;font-weight:600;font-family:var(--rca-font-mono);padding:2px 7px;border-radius:var(--rca-radius);flex-shrink:0;text-transform:uppercase;letter-spacing:.08em}
.sc .sc-overdue{display:inline-flex;align-items:center;font-size:10px;font-weight:600;color:var(--rca-status-critical);background:var(--rca-tint-critical);padding:2px 7px;border-radius:var(--rca-radius);font-family:var(--rca-font-mono);letter-spacing:.08em;flex-shrink:0}
.sc .sc-overdue.ok{color:var(--rca-status-done);background:var(--rca-tint-done)}
/* The open end of an unfinished RCA range. Lower case against the tracked uppercase labels,
   so it reads as a state rather than as a date. */
.sc .sc-m-open{text-transform:none;letter-spacing:0;opacity:.85}
/* Filter controls */
.dash-filters{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:16px}
.dash-filters select,.dash-filters input{padding:5px 10px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);font-size:12px;color:var(--rca-text-primary);outline:none;font-family:var(--rca-font-mono)}
.dash-filters select:focus,.dash-filters input:focus{border-color:var(--rca-accent)}
.dash-filters label{font-size:10px;font-weight:600;color:var(--rca-text-secondary);text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono)}
/* Search leads the filter row, matching the Tracker. Given its own width because the shared
   .dash-filters rule sets none, and an unconstrained text input in a flex row collapses to
   its content. No flex-grow: it should not eat the row when the selects are narrow. */
.dash-filters #ss{min-width:200px;margin-right:4px}
.dash-date-group{display:flex;flex-direction:column;gap:2px}
.dash-dates{display:flex;gap:8px;align-items:center;margin-bottom:16px;margin-top:6px}
.dash-dates input{padding:5px 10px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);font-size:12px;color:var(--rca-text-primary);outline:none;font-family:var(--rca-font-mono)}
.dash-dates input:focus{border-color:var(--rca-accent)}
.dash-dates label{font-size:10px;font-weight:600;color:var(--rca-text-secondary);text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono)}
/* Pareto cumulative line overlay */
.ta-pareto{position:relative;margin-bottom:16px}
.ta-pareto-line{position:absolute;top:0;left:228px;right:38px;height:100%;pointer-events:none;z-index:2}
.ta-cum-pct{font-size:9px;color:var(--rca-accent);font-family:var(--rca-font-mono);position:absolute;right:0;top:-12px;white-space:nowrap}
/* Clickable bar */
.ta-bar{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:12px;position:relative}
.ta-bar .ta-lbl{width:220px;color:var(--rca-text-secondary);flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--rca-font-mono)}
.ta-bar .ta-track{flex:1;height:20px;background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);overflow:hidden;position:relative}
.ta-bar .ta-fill{height:100%;border-radius:var(--rca-radius);transition:width .3s ease}
.ta-bar .ta-cnt{font-size:11px;color:var(--rca-text-muted);font-family:var(--rca-font-mono);min-width:30px;text-align:right;flex-shrink:0}
.ta-section{margin-bottom:16px}
.ta-section h3{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);margin-bottom:8px;font-family:var(--rca-font-mono)}
.ta-empty{color:var(--rca-text-muted);font-size:13px;text-align:center;padding:20px}
/* Modal */
.modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:1000;justify-content:center;align-items:center;backdrop-filter:blur(4px)}
.modal.on{display:flex}
.modal-inner{background:var(--rca-tile-bg);border-radius:var(--rca-radius);width:90%;max-width:480px;max-height:85vh;overflow-y:auto;border:1px solid var(--rca-border)}
.modal-h{padding:14px 18px;border-bottom:1px solid var(--rca-border);display:flex;justify-content:space-between;align-items:center}
.modal-h h2{font-size:20px;font-weight:700;color:var(--rca-text-primary);font-family:var(--rca-font-display);letter-spacing:-.01em;line-height:1.15}
.modal-x{background:none;border:none;font-size:18px;cursor:pointer;color:var(--rca-text-muted);width:28px;height:28px;border-radius:var(--rca-radius);display:flex;align-items:center;justify-content:center}
.modal-x:hover{background:var(--rca-border);color:var(--rca-text-primary)}
.modal-b{padding:16px 18px}
.modal-f{padding:12px 18px;border-top:1px solid var(--rca-border);display:flex;justify-content:flex-end;gap:8px}
.fg{margin-bottom:12px}
.fg label{display:block;font-size:10px;font-weight:600;color:var(--rca-text-secondary);margin-bottom:5px;text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono)}
.fg input,.fg select,.fg textarea{width:100%;padding:7px 10px;background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);font-size:13px;font-family:var(--rca-font-mono);color:var(--rca-text-primary);outline:none}
.fg input:focus,.fg select:focus,.fg textarea:focus{border-color:var(--rca-accent)}
.fr{display:flex;gap:10px}
.fr .fg{flex:1}
.btn{padding:7px 16px;border-radius:var(--rca-radius);font-size:12px;font-weight:600;cursor:pointer;border:none;font-family:var(--rca-font-mono)}
/* Secondary: transparent, hairline border, white label → yellow on hover (§8.1) */
.btn-s{background:transparent;color:var(--rca-text-primary);border:1px solid var(--rca-border)}
.btn-s:hover{border-color:var(--rca-accent);color:var(--rca-accent)}
.btn-d{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.btn-d:hover{background:rgba(209,75,69,.25)}
/* Primary: Nerve Yellow fill, black mono uppercase label (§8.1) */
.btn-p{background:var(--rca-accent);color:var(--signal-black);text-transform:uppercase;letter-spacing:.08em}
.btn-p:hover{background:var(--rca-accent-hi)}
/* Toast */
/* Storage health banner. Bottom-left so it cannot be mistaken for a toast (bottom-right) and
   does not sit under one. The failure tier is deliberately loud and has no auto-dismiss: the
   whole point is that a silent save failure is the worst thing this app can do. */
.save-warn{display:none}
.save-warn.on{display:block;position:fixed;bottom:20px;left:20px;max-width:420px;z-index:2100;
  background:var(--rca-tile-bg);border:1px solid var(--rca-status-warn);border-left:3px solid var(--rca-status-warn);
  border-radius:var(--rca-radius);padding:12px 14px;font-family:var(--rca-font-mono)}
.save-warn.on.bad{border-color:var(--rca-status-critical);border-left-color:var(--rca-status-critical)}
.save-warn .sw-t{font-family:var(--rca-font-display);font-size:14px;font-weight:600;color:var(--rca-status-warn);margin-bottom:4px}
.save-warn.bad .sw-t{color:var(--rca-status-critical)}
.save-warn .sw-b{font-size:11px;line-height:1.5;color:var(--rca-text-secondary);margin-bottom:4px}
.save-warn .sw-b strong{color:var(--rca-text-primary)}
.save-warn .sw-a{display:flex;gap:6px;margin-top:8px}
.toast{position:fixed;bottom:20px;right:20px;background:var(--rca-tile-bg);color:var(--rca-text-primary);padding:8px 16px;border-radius:var(--rca-radius);font-size:13px;border:1px solid var(--rca-border);z-index:2000;display:none;font-family:var(--rca-font-mono)}
/* Validation toast stack */
.vt-stack{position:fixed;bottom:20px;left:20px;display:flex;flex-direction:column;gap:6px;z-index:2000;max-width:380px}
.vt-item{background:var(--rca-tile-bg);border:1px solid var(--rca-status-warn);border-radius:var(--rca-radius);padding:8px 12px;font-size:12px;color:var(--rca-status-warn);display:flex;align-items:flex-start;gap:6px;animation:vtSlide .2s ease;font-family:var(--rca-font-mono)}
.vt-item .vt-ico{flex-shrink:0;margin-top:1px}
.vt-item .vt-txt{flex:1;line-height:1.4}
.vt-item .vt-close{cursor:pointer;color:var(--rca-status-warn);opacity:.5;font-size:14px;flex-shrink:0;padding:0 2px}
.vt-item .vt-close:hover{opacity:1}
@keyframes vtSlide{from{transform:translateX(-20px);opacity:0}to{transform:translateX(0);opacity:1}}
/* Advisory tier — collapsed so it cannot bury the blocking warnings */
.vt-adv{background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);font-family:var(--rca-font-mono);animation:vtSlide .2s ease}
.vt-adv-toggle{background:none;border:none;color:var(--rca-text-secondary);cursor:pointer;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);padding:7px 12px;width:100%;text-align:left;font-family:var(--rca-font-mono)}
.vt-adv-toggle:hover{color:var(--rca-text-primary)}
.vt-adv-list{border-top:1px solid var(--rca-border);padding:6px 12px 8px}
.vt-adv-row{font-size:12px;color:var(--rca-text-secondary);line-height:1.4;padding:3px 0}

/* Corrective action types — interim is deliberately the loud one */
.at-desc{font-size:10px;color:var(--rca-text-muted);font-family:var(--rca-font-mono);margin-top:4px;line-height:1.4;min-height:14px}
.at-type{font-size:9px;font-weight:600;font-family:var(--rca-font-mono);padding:1px 6px;border-radius:var(--rca-radius);text-transform:uppercase;letter-spacing:.06em;white-space:nowrap}
.at-interim,.at-type.at-interim{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.at-corrective,.at-type.at-corrective{background:var(--rca-tint-done);color:var(--rca-status-done)}
.at-preventive,.at-type.at-preventive{background:var(--rca-accent-tint);color:var(--rca-accent)}
.at-type.at-unset{color:var(--rca-text-muted)}
.nc .cm .cm-item.at-interim,.nc .cm .cm-item.at-corrective,.nc .cm .cm-item.at-preventive{padding:0 5px;border-radius:var(--rca-radius);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.06em}

/* Sequence of events */
.tl-list{max-height:260px;overflow-y:auto;scrollbar-width:none;margin-bottom:12px}
.tl-list::-webkit-scrollbar{display:none}
.tl-row{padding:6px 8px;border-radius:var(--rca-radius);font-size:12px;font-family:var(--rca-font-mono);border-left:2px solid var(--rca-border);margin-bottom:2px}
.tl-row:hover{background:var(--rca-page-bg);border-left-color:var(--rca-accent)}
.tl-row .tl-main{display:flex;align-items:baseline;gap:10px}
.tl-row .tl-clip{background:none;border:none;color:var(--rca-text-muted);cursor:pointer;font-size:11px;padding:0 3px;border-radius:var(--rca-radius);flex-shrink:0}
.tl-row .tl-clip:hover{color:var(--rca-accent)}
.tl-row .tl-clip b{font-size:9px;font-weight:600;margin-left:1px}
.tl-atts{display:flex;flex-wrap:wrap;gap:5px;margin:5px 0 1px 0;padding-left:2px}
.tl-att{display:inline-flex;align-items:center;gap:4px;background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:1px 4px 1px 6px;font-size:10px;max-width:230px}
.tl-att a{color:var(--rca-text-secondary);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tl-att a:hover{color:var(--rca-accent);text-decoration:underline}
.tl-att button{background:none;border:none;color:var(--rca-text-muted);cursor:pointer;font-size:9px;padding:0 2px}
.tl-att button:hover{color:var(--rca-status-critical)}

/* Visual timeline — the Pulse Trace read vertically. Gap heights scale with real
   elapsed time (clamped), so lost hours are visible rather than inferred. */
.tlv{padding:4px 2px}
.tlv-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px;padding-bottom:8px;border-bottom:1px solid var(--rca-border);flex-wrap:wrap}
.tlv-kicker{font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-accent)}
.tlv-right{display:flex;align-items:center;gap:12px}
.tlv-span{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-muted)}
.tlv-toggle{display:inline-flex;background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);overflow:hidden}
.tlv-toggle button{background:none;border:none;color:var(--rca-text-secondary);cursor:pointer;font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);padding:4px 10px;transition:.1s}
.tlv-toggle button:hover{color:var(--rca-text-primary)}
.tlv-toggle button.active{background:var(--rca-accent);color:var(--signal-black)}

/* Horizontal orientation — same trace, laid along a time axis. Cards alternate
   above and below so their labels never collide. */
.tlv-h{overflow-x:auto;overflow-y:hidden;padding:4px 0 8px;scrollbar-width:thin}
.tlv-h::-webkit-scrollbar{height:6px}
.tlv-h::-webkit-scrollbar-track{background:transparent}
.tlv-h::-webkit-scrollbar-thumb{background:var(--rca-border);border-radius:3px}
.tlv-h-track{position:relative;height:420px}
.tlv-h-line{position:absolute;left:0;right:0;top:50%;height:2px;background:linear-gradient(90deg,rgba(255,212,0,.25),var(--rca-accent),rgba(255,212,0,.25))}
.tlv-h-item{position:absolute;top:50%;width:0}
.tlv-h-item .tlv-dot{position:absolute;left:-5px;top:-5px;margin:0}
.tlv-h-stem{position:absolute;left:-1px;width:2px;background:rgba(255,212,0,.35)}
.tlv-h-item.tlv-up .tlv-h-stem{bottom:6px;height:26px}
.tlv-h-item.tlv-down .tlv-h-stem{top:6px;height:26px}
.tlv-h-card{position:absolute;left:-100px;width:200px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:8px 10px}
.tlv-h-item.tlv-up .tlv-h-card{bottom:32px}
.tlv-h-item.tlv-down .tlv-h-card{top:32px}
.tlv-h-item.tlv-event .tlv-h-card{border-color:var(--rca-status-critical)}
.tlv-h-card .tlv-txt{font-size:13px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.tlv-h-card .tlv-meta{margin-top:4px}
.tlv-h-card .tlv-att{max-width:178px}
.tlv-h-gap{position:absolute;top:calc(50% + 8px);font-family:var(--rca-font-mono);font-size:10px;color:var(--rca-text-muted);text-align:center;text-transform:uppercase;letter-spacing:.06em;pointer-events:none}
.tlv-item{display:flex;gap:12px;align-items:flex-start}
.tlv-rail{width:14px;flex-shrink:0;display:flex;justify-content:center;padding-top:3px}
.tlv-dot{width:9px;height:9px;border-radius:50%;background:var(--rca-accent);box-shadow:0 0 0 3px rgba(255,212,0,.15)}
.tlv-item.tlv-event .tlv-dot{background:var(--rca-status-critical);box-shadow:0 0 0 3px var(--rca-tint-critical)}
.tlv-body{flex:1;min-width:0;padding-bottom:2px}
.tlv-at{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-muted);display:flex;align-items:center;gap:8px}
.tlv-tag{font-family:var(--rca-font-mono);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--rca-status-critical);background:var(--rca-tint-critical);padding:1px 6px;border-radius:var(--rca-radius)}
.tlv-txt{font-size:14px;color:var(--rca-text-primary);line-height:1.4;margin-top:2px}
.tlv-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:4px;font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-secondary)}
.tlv-att{display:inline-flex;align-items:center;gap:4px;color:var(--rca-text-secondary);text-decoration:none;border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:1px 6px;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tlv-att:hover{color:var(--rca-accent);border-color:var(--rca-accent)}
.tlv-gap{position:relative;margin-left:6px;display:flex;align-items:center}
.tlv-gap-line{position:absolute;left:0;top:0;bottom:0;width:2px;background:linear-gradient(var(--rca-accent),rgba(255,212,0,.25))}
.tlv-gap-lbl{font-family:var(--rca-font-mono);font-size:10px;color:var(--rca-text-muted);margin-left:16px;text-transform:uppercase;letter-spacing:.06em}
.tl-row .tl-at{color:var(--rca-text-muted);white-space:nowrap;flex-shrink:0;font-size:11px}
.tl-row .tl-txt{color:var(--rca-text-primary);flex:1;min-width:0;line-height:1.4}
.tl-row .tl-src{color:var(--rca-text-secondary);font-size:11px;white-space:nowrap}
.tl-row .tl-del{background:none;border:none;color:var(--rca-text-muted);cursor:pointer;font-size:11px;padding:0 4px;border-radius:var(--rca-radius);flex-shrink:0}
.tl-row .tl-del:hover{color:var(--rca-status-critical);background:var(--rca-tint-critical)}
.tl-empty{color:var(--rca-text-muted);font-size:12px;text-align:center;padding:16px 8px;font-family:var(--rca-font-mono)}

/* Evidence record (verification of a hypothesis) */
.ev-section{margin-top:10px;padding-top:10px;border-top:1px solid var(--rca-border)}
.ev-label{display:block;font-size:10px;font-weight:600;color:var(--rca-accent);text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono);margin-bottom:8px}
/* The negative margin assumes the hint follows a .fg, whose 12px bottom margin it pulls back.
   Nested *inside* a .fg it instead rides up under the control above and the form element
   paints over the top of the text. Restore a normal gap there. */
.ev-hint{font-size:10px;color:var(--rca-text-muted);font-family:var(--rca-font-mono);margin-top:-4px}
.fg .ev-hint{margin-top:4px;line-height:1.4}
.nc .ev-mark{font-size:10px;flex-shrink:0;cursor:default}
.nc .ev-mark.ev-missing{color:var(--rca-status-warn)}

/* Header dropdown */
.hdr-more{position:relative}
.hdr-drop{display:none;position:absolute;top:100%;right:0;margin-top:4px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);min-width:160px;padding:4px;z-index:200}
.hdr-drop.on{display:block}
.hdr-drop button{display:flex;align-items:center;gap:8px;width:100%;background:none;border:none;color:var(--rca-text-secondary);cursor:pointer;font-size:12px;padding:6px 10px;border-radius:var(--rca-radius);font-family:var(--rca-font-mono);text-align:left}
.hdr-drop button:hover{background:var(--rca-border);color:var(--rca-text-primary)}
/* Menu-specific behaviour only; the sizing and stroke come from svg.ico below. Held slightly
   back at rest, because in a menu the words are what you read and the icon is what you
   recognise on the second visit. */
.hdr-drop .mi{opacity:.6;transition:opacity .12s,stroke .12s}
/* Nerve Yellow, on the one row the pointer is on. This is what the ~5% budget is *for* — a
   signal that says "here", spent on one element at a time. Painting all thirteen yellow at
   rest would put more yellow in this menu than in the entire rest of the app, and would
   compete with the accents that mark the primary action. */
.hdr-drop button:hover .mi,.hdr-drop button:focus-visible .mi{stroke:var(--rca-accent);opacity:1}
.hdr-drop-sep{height:1px;background:var(--rca-border);margin:4px 6px}
/* This annotates the backup button above it, and had 0px clearance on *both* sides — wedged
   between two 29px rows, so it read as part of the button rather than as a note about it.
   Tight above, generous below: proximity is what says which control it belongs to, and an
   equal gap on both sides says nothing. line-height was `normal`, which at 10px left the
   text sitting hard against its own box. */
.hdr-drop-note{font-family:var(--rca-font-mono);font-size:10.5px;line-height:1.5;color:var(--rca-text-muted);padding:0 10px;margin:3px 0 9px}
/* #sbWho is the only note left, and it is a section heading for Sign out below it — so it
   takes more space above than below, and sits at the container edge as a heading should. */
.hdr-drop-note#sbWho{margin:7px 0 3px}
/* Signed out, #sbWho renders empty — without this its margins leave a dead gap in the menu. */
.hdr-drop-note:empty{display:none}
/* Backup reminder on the home view. Calm by default; the never-backed-up case is the one that
   actually loses people their work, so only that one takes the warning colour. */
.bk-nudge{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px;padding:10px 14px;
  border:1px solid var(--rca-border);border-left:3px solid var(--rca-status-open);
  border-radius:var(--rca-radius);background:var(--rca-tile-bg)}
.bk-nudge.bk-never{border-color:var(--rca-status-warn);border-left-color:var(--rca-status-warn)}
/* Capped, unlike everything else in .dash-inner. The banner is one sentence of 12px mono, and
   at the full 1600px it sets as a single ~200-character line — far past the width anyone reads
   comfortably. The cap holds the measure and .bk-a keeps the buttons on the right. */
.bk-nudge .bk-t{flex:1;min-width:220px;max-width:900px;font-size:12px;line-height:1.5;color:var(--rca-text-secondary);font-family:var(--rca-font-mono)}
.bk-nudge .bk-t strong{color:var(--rca-text-primary)}
.bk-nudge.bk-never .bk-t strong{color:var(--rca-status-warn)}
.bk-nudge .bk-a{display:flex;gap:6px;flex-shrink:0;margin-left:auto}
/* The strips' actions are secondary, not primary: the coloured border is already the signal,
   and a yellow fill inside a warning strip is the same alarm sounding twice. Hierarchy inside
   the strip is carried by the dismissal instead — bordered means do it, bare text means put it
   off — which costs no yellow at all. */
.bk-nudge .bk-later{background:none;border:none;color:var(--rca-text-muted);padding:7px 8px}
.bk-nudge .bk-later:hover{color:var(--rca-text-primary)}
/* Breadcrumb */
.bcrumb{display:flex;align-items:center;gap:4px;font-size:12px;font-family:var(--rca-font-mono)}
.bcrumb .bc-sep{color:var(--rca-text-muted);font-size:10px}
.bcrumb .bc-study{color:var(--rca-text-primary);font-weight:500}
/* Status bar split */
.sb-l{display:flex;align-items:center;gap:10px;flex:1;min-width:0;overflow:hidden}
.sb-r{display:flex;align-items:center;gap:6px;flex-shrink:0}
.sb-r .tag,.sb-r .sv{flex-shrink:0}
/* Palette hint */
.palette-hint{padding:8px 10px;border-radius:var(--rca-radius);font-size:11px;color:var(--rca-text-muted);text-align:center;background:var(--rca-page-bg);border:1px dashed var(--rca-border);margin-top:2px;font-family:var(--rca-font-mono)}
/* Selectable node cursor */
.nc{cursor:grab}
.nc:active{cursor:grabbing}
/* Canvas pan cursor */
.canvas{cursor:grab}
.canvas:active{cursor:grabbing}
/* Zoom controls — top-right of canvas */
/* Docked directly above the minimap rather than stranded at top:200px. Zoom, fit and the
   minimap are one group — they all answer "where am I in this tree" — and they were at
   opposite ends of the canvas. 148px clears the minimap (bottom:40px + 100px tall) with an
   8px gap; both share right:10px so their right edges line up. */
.zc{position:absolute;bottom:148px;right:10px;display:flex;align-items:center;gap:2px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:3px;z-index:90}
.zc button{background:none;border:none;color:var(--rca-text-secondary);cursor:pointer;font-size:15px;width:26px;height:26px;border-radius:var(--rca-radius);display:flex;align-items:center;justify-content:center;font-family:var(--rca-font-mono);transition:.1s}
.zc button:hover{background:var(--rca-border);color:var(--rca-text-primary)}
.zc .zl{font-size:11px;color:var(--rca-text-muted);min-width:36px;text-align:center;font-family:var(--rca-font-mono);user-select:none}
/* Sidebar scrollbar */
.sidebar::-webkit-scrollbar{width:6px}
.sidebar::-webkit-scrollbar-track{background:transparent}
.sidebar::-webkit-scrollbar-thumb{background:var(--rca-border);border-radius:3px}
.sidebar::-webkit-scrollbar-thumb:hover{background:var(--rca-border-strong)}
/* Study row delete button */
.study-row .sr-del{display:none;background:none;border:none;color:var(--rca-text-muted);font-size:11px;cursor:pointer;padding:0 2px;line-height:1;border-radius:var(--rca-radius);flex-shrink:0;margin-left:4px}
.study-row:hover .sr-del{display:inline-block}
.study-row .sr-del:hover{color:var(--rca-status-critical);background:var(--rca-tint-critical)}
/* First-visit hint overlay */
.hint-overlay{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:16px 24px;font-size:12px;color:var(--rca-text-secondary);text-align:center;pointer-events:none;z-index:50;animation:hintFade .5s ease;font-family:var(--rca-font-mono)}
.hint-overlay .hi-title{font-size:16px;font-weight:700;color:var(--rca-text-primary);margin-bottom:8px;font-family:var(--rca-font-display);letter-spacing:-.01em}
.hint-overlay .hi-row{display:flex;align-items:center;gap:8px;justify-content:center;margin-top:4px}
.hint-overlay .hi-kbd{font-family:var(--rca-font-mono);font-size:10px;background:var(--rca-panel-bg);border:1px solid var(--rca-border);padding:2px 6px;border-radius:var(--rca-radius);color:var(--rca-text-secondary)}
@keyframes hintFade{from{opacity:0;transform:translate(-50%,-45%)}to{opacity:1;transform:translate(-50%,-50%)}}
/* Mini-map */
.minimap{position:absolute;bottom:40px;right:10px;width:160px;height:100px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);z-index:90;overflow:hidden}
.minimap-canvas{width:100%;height:100%;display:block}
.minimap-viewport{position:absolute;border:1px solid var(--rca-accent);background:rgba(255,212,0,.08);pointer-events:none;border-radius:var(--rca-radius)}
/* Demo Pareto (theme analysis empty state) */
.ta-demo{opacity:.4;pointer-events:none}
.ta-demo .ta-bar{opacity:.6}

/* Action Tracker */
.at-view{display:none;flex:1;flex-direction:column;height:calc(100vh - 76px);overflow:hidden;background:var(--rca-page-bg)}
.at-view.on{display:flex}
.at-summary{display:flex;padding:10px 16px;background:var(--rca-tile-bg);border-bottom:1px solid var(--rca-border);font-family:var(--rca-font-mono);font-size:12px;align-items:center;gap:8px;flex-wrap:wrap}
.at-summary .at-shown{color:var(--rca-text-primary);font-weight:600}
.at-summary .at-sp{width:1px;height:14px;background:var(--rca-border);flex-shrink:0}
/* The counts double as the filters — "18 overdue" is the thing you want to click, not read
   and then go hunting for in a dropdown. */
.at-chip{display:flex;align-items:center;gap:5px;background:none;border:1px solid transparent;border-radius:var(--rca-radius);color:var(--rca-text-secondary);font-family:var(--rca-font-mono);font-size:12px;padding:3px 8px;cursor:pointer;white-space:nowrap}
.at-chip:hover{border-color:var(--rca-border-strong);color:var(--rca-text-primary)}
.at-chip.on{background:var(--rca-panel-bg);border-color:var(--rca-border-strong);color:var(--rca-text-primary)}
.at-chip .at-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.at-chip-gap{color:var(--rca-status-warn)}
.at-chip-gap.on{background:var(--rca-tint-warn);border-color:transparent;color:var(--rca-status-warn)}
.at-search{position:relative;flex:0 1 300px;min-width:180px}
.at-search input{width:100%;padding-left:26px !important}
.at-search-i{position:absolute;left:9px;top:50%;transform:translateY(-50%);color:var(--rca-text-muted);font-size:13px;pointer-events:none}
#atClear{opacity:.4;pointer-events:none}
#atClear.on{opacity:1;pointer-events:auto;border-color:var(--rca-accent);color:var(--rca-accent)}
.at-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 16px;background:var(--rca-panel-bg);border-bottom:1px solid var(--rca-border)}
.at-controls select,.at-controls input{padding:5px 10px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);font-size:12px;color:var(--rca-text-primary);outline:none;font-family:var(--rca-font-mono)}
.at-controls select:focus,.at-controls input:focus{border-color:var(--rca-accent)}
.at-controls label{font-size:10px;font-weight:600;color:var(--rca-text-secondary);text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono)}
/* Twelve columns will not fit every screen, so the table scrolls sideways inside its own
   wrapper rather than squeezing the action text to nothing. */
.at-table-wrap{flex:1;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--rca-border-strong) transparent}
.at-table-wrap::-webkit-scrollbar{width:8px;height:8px}
.at-table-wrap::-webkit-scrollbar-thumb{background:var(--rca-border-strong);border-radius:4px}
.at-table{width:100%;min-width:1180px;border-collapse:collapse;font-family:var(--rca-font-mono);font-size:12px}
.at-table thead{position:sticky;top:0;z-index:5}
.at-table th{background:var(--rca-tile-bg);border-bottom:1px solid var(--rca-border);padding:8px 10px;text-align:left;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);cursor:pointer;white-space:nowrap;user-select:none}
.at-table th:hover{color:var(--rca-text-primary)}
.at-table th .sort-arr{font-size:9px;color:var(--rca-accent);margin-left:3px}
.at-table td{padding:8px 10px;border-bottom:1px solid var(--rca-border);color:var(--rca-text-secondary);vertical-align:top}
.at-table tr:hover td{background:var(--rca-tile-bg)}
.at-table tr.at-row:focus-visible{outline:2px solid var(--rca-accent);outline-offset:-2px}
/* Done recedes without becoming unreadable. opacity:.45 on every cell failed contrast on
   text you still have to be able to read. */
.at-table tr.at-row-done .at-action-t{text-decoration:line-through;color:var(--rca-text-muted);font-weight:400}
.at-table tr.at-row-done td{color:var(--rca-text-muted)}
/* Overdue is the reason this page exists, so it gets a row-level mark rather than relying
   on an 8px dot and one red number in the fifth column. */
.at-table tr.at-row-overdue td:first-child{box-shadow:inset 2px 0 0 var(--rca-status-critical)}
.at-table .at-dot-cell{width:20px;text-align:center}
.at-table .at-dot{width:8px;height:8px;border-radius:50%;display:inline-block}
/* Column priority. The action text is the unique, descriptive field and gets the room; the
   study title repeats down the page and can ellipsize. Previously they were 300px and
   288px, which had it backwards. */
.at-table .at-c-dot{width:20px}
.at-table .at-c-action{width:auto;min-width:260px}
/* nowrap is what actually holds these columns. Under table-layout:auto a `width` is only a
   suggestion, and the wide action column was squeezing the date down to 36px — enough to
   wrap "2026-07-12" onto two lines and make every row 49px tall. */
.at-table .at-c-asset{width:100px;white-space:nowrap}
.at-table .at-c-lead{width:110px;max-width:110px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.at-table .at-c-who{width:120px;white-space:nowrap}
.at-table .at-c-due{width:96px;white-space:nowrap}
.at-table .at-c-days{width:62px;text-align:right;white-space:nowrap}
.at-table .at-c-type{width:92px;white-space:nowrap}
.at-table .at-c-eff{white-space:nowrap}
.at-table .at-c-study{width:190px;max-width:190px;overflow:hidden}
.at-table .at-c-loc{width:110px;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.at-table .at-c-eff{width:104px}
.at-table .at-c-do{width:116px;white-space:nowrap}
/* `display:flex` used to sit on this <td>. That replaces its `table-cell` display, so the cell
   drops out of the table's row-height algorithm: it sized to its own content while every other
   cell stretched to the row, and its border-bottom painted ~15px high. The row separator
   arrived in two staggered pieces, split exactly at this column's edge. The cell stays a
   table-cell; the flex row is an inner wrapper. */
.at-table .at-action{color:var(--rca-text-primary);font-weight:500}
.at-table .at-action-i{display:flex;gap:6px;align-items:flex-start}
/* The row expands on click; nothing used to say so. */
.at-table .at-caret{color:var(--rca-text-muted);font-size:9px;line-height:1.6;flex-shrink:0;transition:transform .12s}
.at-table tr.at-row.on .at-caret{transform:rotate(90deg)}
.at-table .at-action-w{min-width:0;flex:1;display:flex;flex-direction:column;gap:1px}
.at-table .at-action-t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* The quotable reference. Mono, muted, and never the loudest thing in the cell. */
.at-table .at-ref{font-size:10px;color:var(--rca-text-muted);letter-spacing:var(--rca-track)}
.at-table .at-ref-s{color:var(--rca-text-secondary)}
.at-table .at-desc{display:block;font-size:10px;color:var(--rca-text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:1px}
/* A missing owner or date is a governance gap, not a blank cell. */
.at-table .at-gap{color:var(--rca-status-warn);font-size:11px}
.at-table .at-study-cell{color:var(--rca-text-secondary);cursor:pointer}
.at-table .at-study-cell:hover{color:var(--rca-accent);text-decoration:underline}
.at-table .at-days-overdue{color:var(--rca-status-critical);font-weight:600}
.at-table .at-days-soon{color:var(--rca-status-warn)}
.at-table .at-days-normal{color:var(--rca-text-muted)}
.at-table .at-days-done{color:var(--rca-status-done)}
.at-row-expand{display:none}
.at-row-expand.on{display:table-row}
.at-row-expand td{background:var(--rca-panel-bg);padding:12px 16px}
.at-expand-inner{display:flex;gap:16px;align-items:flex-end;flex-wrap:wrap}
.at-expand-inner label{font-size:10px;font-weight:600;color:var(--rca-text-secondary);text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono);display:block;margin-bottom:4px}
.at-expand-inner select,.at-expand-inner input{padding:5px 10px;background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);font-size:12px;color:var(--rca-text-primary);outline:none;font-family:var(--rca-font-mono)}
.at-expand-inner select:focus,.at-expand-inner input:focus{border-color:var(--rca-accent)}
.at-btn-sm{padding:5px 12px;border-radius:var(--rca-radius);font-size:12px;font-weight:500;cursor:pointer;border:none;font-family:var(--rca-font-mono);white-space:nowrap}
.at-btn-sm.done{background:var(--rca-tint-done);color:var(--rca-status-done)}
.at-btn-sm.done:hover{background:rgba(93,202,165,.25)}
.at-btn-sm.open{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.at-btn-sm.open:hover{background:rgba(232,162,60,.25)}
.at-btn-sm.assess{background:transparent;border:1px solid var(--rca-border);color:var(--rca-text-secondary)}
.at-btn-sm.assess:hover{border-color:var(--rca-accent);color:var(--rca-accent)}
.at-btn-sm.jump{background:transparent;border:1px solid var(--rca-border);color:var(--rca-text-secondary)}
.at-btn-sm.jump:hover{border-color:var(--rca-accent);color:var(--rca-accent)}
.at-empty{color:var(--rca-text-muted);font-size:13px;text-align:center;padding:40px}
/* View toggle */
.view-toggle{display:flex;gap:0;background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);overflow:hidden;margin-right:6px}
.view-toggle button{background:none;border:none;color:var(--rca-text-secondary);cursor:pointer;font-size:10px;padding:4px 12px;font-family:var(--rca-font-mono);font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);transition:.1s}
.view-toggle button:hover{color:var(--rca-text-primary)}
/* Active view: a yellow label over a 2px underline, not a filled yellow block. Marking
   "where you are" needs a signal, not a swatch — the filled pill was the largest single
   area of Nerve Yellow in the app's chrome and competed with each page's one primary
   action for it. inset box-shadow rather than a border, so the button's box does not move
   and the sibling labels stay on the same baseline. */
.view-toggle button.active{background:var(--rca-tile-bg);color:var(--rca-accent);box-shadow:inset 0 -2px 0 var(--rca-accent)}
/* People modal */
.ppl-list{max-height:200px;overflow-y:auto;scrollbar-width:none;margin-bottom:12px}
.ppl-list::-webkit-scrollbar{display:none}
.ppl-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--rca-radius);font-size:12px;font-family:var(--rca-font-mono);margin-bottom:2px}
.ppl-row:hover{background:var(--rca-panel-bg)}
.ppl-row .ppl-name{color:var(--rca-text-primary);font-weight:500;flex:1}
.ppl-row .ppl-email{color:var(--rca-text-muted);font-size:11px}
.ppl-row .ppl-role{color:var(--rca-text-secondary);font-size:11px}
.ppl-row .ppl-del{background:none;border:none;color:var(--rca-text-muted);cursor:pointer;font-size:11px;padding:0 4px;border-radius:var(--rca-radius)}
.ppl-row .ppl-del:hover{color:var(--rca-status-critical);background:var(--rca-tint-critical)}
/* Location list */
.loc-list{max-height:240px;overflow-y:auto;scrollbar-width:none;margin-bottom:12px}
.loc-list::-webkit-scrollbar{display:none}
.loc-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--rca-radius);font-size:12px;font-family:var(--rca-font-mono);margin-bottom:2px}
.loc-row:hover{background:var(--rca-panel-bg)}
.loc-row .loc-name{color:var(--rca-text-primary);font-weight:500;flex:1;white-space:pre}
.loc-row .loc-meta{color:var(--rca-text-secondary);font-size:11px}
/* RCA team role pills — steel for the standing team, dashed for ad-hoc so a specialist
   pulled in for one question does not read like a full-time member */
.tm-role{font-family:var(--rca-font-mono);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);padding:1px 6px;border-radius:var(--rca-radius);background:var(--rca-tint-steel);color:var(--rca-status-open);flex-shrink:0}
.tm-role-adhoc{background:transparent;color:var(--rca-text-muted);border:1px dashed var(--rca-border-strong)}
/* Effectiveness verdicts. A shortfall reads in the critical colour because it reopens the
   problem; 'Required' is steel, not red — it is an outstanding task, not a failure. */
.ef-v{display:inline-block;font-family:var(--rca-font-mono);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);padding:1px 6px;border-radius:var(--rca-radius);white-space:nowrap}
.ef-effective{background:var(--rca-tint-done);color:var(--rca-status-done)}
.ef-partial{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.ef-not-effective{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.ef-pending{background:var(--rca-page-bg);color:var(--rca-text-muted);border:1px solid var(--rca-border)}
/* The action under assessment, shown at the top of the assessment modal */
.eff-action{background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:10px 12px;margin-bottom:12px}
.eff-a-label{font-size:13px;font-weight:600;color:var(--rca-text-primary);line-height:1.3}
.eff-a-meta{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-muted);margin-top:3px;text-transform:uppercase;letter-spacing:var(--rca-track)}

/* ─── Reference IDs ─── */
/* Quotable, mono, and quieter than the title it sits beside — a reference is for finding
   the record, not for being the first thing read. */
.bc-ref{font-family:var(--rca-font-mono);font-size:10px;letter-spacing:var(--rca-track);color:var(--rca-text-muted);margin-right:6px}
.nd-ref{font-family:var(--rca-font-mono);font-size:10px;letter-spacing:var(--rca-track);color:var(--rca-text-muted)}

/* ─── RCA dates ─── */
/* Sidebar panel under Quick Add. */
.rca-d{display:flex;align-items:center;gap:8px;padding:3px 0;font-family:var(--rca-font-mono);font-size:11px}
.rca-d-l{color:var(--rca-text-muted);text-transform:uppercase;letter-spacing:var(--rca-track);font-size:9px;flex:1}
.rca-d-v{color:var(--rca-text-primary);white-space:nowrap}
.rca-d-none{color:var(--rca-text-muted)}
/* The response gap is the one number here that is a judgement, so it is the only one that
   takes a colour. Critical red, because past the limit the evidence has gone cold. */
.rca-late{color:var(--rca-status-critical);font-weight:600}
.rca-ok{font-family:var(--rca-font-mono);font-size:10px;color:var(--rca-status-done);margin-top:6px}
.rca-bl-h{font-family:var(--rca-font-mono);font-size:9px;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-status-warn);margin-top:8px;margin-bottom:4px}
.rca-bl{font-size:11px;color:var(--rca-text-secondary);line-height:1.4;padding:3px 0 3px 8px;border-left:2px solid var(--rca-border-strong);margin-bottom:2px}
.rca-btn-blocked{opacity:.5}
/* Study card */
/* Action tracker: the study's own dates, under the study title */
.at-table .at-study-t{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.at-table .at-rca{display:block;font-size:10px;color:var(--rca-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px}
.at-table .at-rca-late{color:var(--rca-status-critical)}

/* ─── Insights View ─── */
.ins-view{display:none;position:absolute;top:76px;left:0;right:0;bottom:0;flex-direction:column;background:var(--rca-page-bg)}
.ins-bar{display:flex;align-items:center;gap:8px;padding:0 16px;background:var(--rca-tile-bg);border-bottom:1px solid var(--rca-border);flex-shrink:0}
.ins-tabs{display:flex;gap:4px}
/* Underline, not a filled pill — the nav pill above is already carrying the yellow. */
.ins-tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--rca-text-secondary);font-family:var(--rca-font-mono);font-size:11px;letter-spacing:var(--rca-track);text-transform:uppercase;padding:12px 14px;margin-bottom:-1px;cursor:pointer;white-space:nowrap}
.ins-tab:hover{color:var(--rca-text-primary)}
.ins-tab.on{color:var(--rca-accent);border-bottom-color:var(--rca-accent)}
.ins-filters{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 16px;background:var(--rca-panel-bg);border-bottom:1px solid var(--rca-border);flex-shrink:0}
.ins-filters label{font-size:10px;font-weight:600;color:var(--rca-text-secondary);text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono)}
.ins-filters select,.ins-filters input{padding:5px 10px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);font-size:12px;color:var(--rca-text-primary);outline:none;font-family:var(--rca-font-mono)}
.ins-filters select:focus,.ins-filters input:focus{border-color:var(--rca-accent)}
.ins-filters .ins-sp{width:1px;height:16px;background:var(--rca-border)}
.ins-filters .hdr-btn.on{border-color:var(--rca-accent);color:var(--rca-accent)}
.ins-scroll{flex:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--rca-border-strong) transparent}
.ins-scroll::-webkit-scrollbar{width:8px}
.ins-scroll::-webkit-scrollbar-thumb{background:var(--rca-border-strong);border-radius:4px}
.ins-inner{max-width:1200px;margin:0 auto;padding:20px 24px}
.ins-panel{background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:16px;margin-bottom:16px}
.ins-panel h3{font-size:14px;font-weight:600;color:var(--rca-text-primary);font-family:var(--rca-font-display);margin:0 0 10px}
.ins-empty{color:var(--rca-text-muted);font-size:13px;text-align:center;padding:40px 16px;font-family:var(--rca-font-mono)}
.ins-note{font-size:12px;color:var(--rca-text-secondary);line-height:1.5;margin-bottom:10px}
.ins-note strong{color:var(--rca-text-primary)}
.ins-note-warn{color:var(--rca-status-warn)}
.ins-note-warn strong{color:var(--rca-status-warn)}
/* Bars. Clicking one lists the studies behind it — a number you cannot audit is decoration. */
.ins-row{display:flex;align-items:center;gap:10px;padding:4px 0;cursor:pointer;font-family:var(--rca-font-mono);font-size:12px}
.ins-row:hover .ins-lbl{color:var(--rca-text-primary)}
.ins-lbl{flex:0 0 300px;max-width:300px;color:var(--rca-text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ins-track{flex:1;height:14px;background:var(--rca-page-bg);border-radius:var(--rca-radius);overflow:hidden;min-width:60px}
.ins-fill{height:100%;border-radius:var(--rca-radius)}
.ins-val{flex:0 0 auto;min-width:120px;text-align:right;color:var(--rca-text-muted);font-size:11px;white-space:nowrap}
.ins-drill{display:none;padding:4px 0 8px 310px;flex-wrap:wrap;gap:6px}
.ins-drill.on{display:flex}
.ins-drill-s{background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);color:var(--rca-text-secondary);font-family:var(--rca-font-mono);font-size:11px;padding:3px 8px;cursor:pointer;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ins-drill-s:hover{border-color:var(--rca-accent);color:var(--rca-accent)}
.ins-seg{display:flex;gap:4px;margin-bottom:14px}
.ins-seg-b{background:none;border:1px solid var(--rca-border);border-radius:var(--rca-radius);color:var(--rca-text-secondary);font-family:var(--rca-font-mono);font-size:11px;text-transform:uppercase;letter-spacing:var(--rca-track);padding:5px 12px;cursor:pointer}
.ins-seg-b.on{background:var(--rca-panel-bg);border-color:var(--rca-border-strong);color:var(--rca-text-primary)}
.ins-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin-bottom:16px}
.ins-stat{background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:14px 16px;display:flex;flex-direction:column;gap:2px}
.ins-stat-v{font-family:var(--rca-font-display);font-size:26px;font-weight:600;color:var(--rca-text-primary);line-height:1.1}
.ins-stat-l{font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary)}
.ins-stat-n{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-muted)}
.ins-stat-good .ins-stat-v{color:var(--rca-status-done)}
.ins-stat-bad .ins-stat-v{color:var(--rca-status-critical)}
.ins-stat-warn .ins-stat-v{color:var(--rca-status-warn)}
/* Governance */
.gov-h4{font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);margin:14px 0 6px;font-weight:600}
.gov-of{font-size:14px;color:var(--rca-text-muted);font-weight:400}
.gov-list{margin-top:8px;border-top:1px solid var(--rca-border)}
.gov-item{display:flex;align-items:center;gap:10px;padding:6px 8px;border-bottom:1px solid var(--rca-border);cursor:pointer;font-family:var(--rca-font-mono);font-size:12px}
.gov-item:hover{background:var(--rca-page-bg)}
.gov-d{flex:0 0 44px;text-align:right;color:var(--rca-text-secondary);font-weight:600}
.gov-d-late{color:var(--rca-status-critical)}
.gov-t{flex:1;min-width:0;color:var(--rca-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gov-s{color:var(--rca-text-muted);font-size:11px;white-space:nowrap}
.ins-fail{display:flex;align-items:center;gap:10px;padding:7px 8px;border-bottom:1px solid var(--rca-border);cursor:pointer;font-family:var(--rca-font-mono);font-size:12px}
.ins-fail:hover{background:var(--rca-page-bg)}
.ins-fail-l{flex:1;min-width:0;color:var(--rca-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ins-fail-s{color:var(--rca-text-muted);font-size:11px;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Recurrence — a block per (asset, cause) pair. The occurrences are laid out rather than
   hidden behind a drill-down: the dates between them are the finding. */
.ins-rec{border-left:3px solid var(--rca-status-warn);background:var(--rca-page-bg);border-radius:var(--rca-radius);padding:10px 12px;margin-bottom:8px}
.ins-rec-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.ins-rec-a{font-family:var(--rca-font-display);font-size:14px;font-weight:600;color:var(--rca-text-primary)}
.ins-rec-c{font-family:var(--rca-font-mono);font-size:11px;text-transform:uppercase;letter-spacing:var(--rca-track)}
.ins-rec-n{margin-left:auto;font-family:var(--rca-font-display);font-size:16px;font-weight:600;color:var(--rca-status-warn)}
.ins-rec-m{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-muted);margin-top:2px}
.ins-rec-s{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
/* An occurrence that recorded a permanent fix assessed Effective. Green here is not praise —
   it is what makes the next occurrence in the same row damning. */
.ins-drill-fix{border-color:color-mix(in srgb,var(--rca-status-done) 45%,transparent);color:var(--rca-status-done)}
/* Trend — column charts. Columns rather than the horizontal bars used elsewhere: a two-year
   series read sideways is unreadable, and months belong left-to-right. */
.tr-chart{display:flex;align-items:flex-end;gap:3px;height:150px;margin:6px 0 0;padding-top:14px}
.tr-col{flex:1;min-width:0;display:flex;flex-direction:column;height:100%}
.tr-stack{flex:1;display:flex;align-items:flex-end;justify-content:center;gap:2px}
.tr-bar{flex:1;min-width:2px;border-radius:2px 2px 0 0;position:relative;transition:height .15s}
/* A measured zero is not the same as no data, so it keeps a baseline tick. */
.tr-bar.tr-zero{opacity:.35}
.tr-v{position:absolute;top:-13px;left:0;right:0;text-align:center;font-family:var(--rca-font-mono);
  font-size:9px;color:var(--rca-text-muted)}
.tr-x{height:14px;margin-top:4px;text-align:center;font-family:var(--rca-font-mono);font-size:9px;
  color:var(--rca-text-muted);white-space:nowrap;overflow:visible}
.tr-legend{display:flex;gap:14px;margin-bottom:4px}
.tr-key{display:flex;align-items:center;gap:5px;font-family:var(--rca-font-mono);font-size:10px;
  text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary)}
.tr-key i{width:9px;height:9px;border-radius:2px;display:inline-block}
.tr-backlog{display:flex;align-items:flex-end;gap:3px;height:38px;margin-top:10px;
  border-top:1px solid var(--rca-border);padding-top:6px;position:relative}
.tr-bl-l{position:absolute;top:-9px;left:0;background:var(--rca-tile-bg);padding-right:6px;
  font-family:var(--rca-font-mono);font-size:9px;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-muted)}
.tr-bl-c{flex:1;min-width:0;display:flex;align-items:flex-end;justify-content:center;height:100%}
.tr-bl-b{width:100%;background:var(--rca-border-strong);border-radius:2px 2px 0 0}

/* ─── Manage View ─── */
.mg-view{display:none;position:absolute;top:76px;left:0;right:0;bottom:0;overflow-y:auto;scrollbar-width:none}
.mg-view::-webkit-scrollbar{display:none}
/* Width the list reserves for its scrollbar. Measured at render time rather than assumed,
   because it differs by engine — the column headers subtract it so they stay aligned with
   the rows inside the scroll container. */
.mg-view{--mg-gutter:10px}
.mg-inner{max-width:1200px;margin:0 auto;padding:20px 24px}
.mg-section{background:var(--rca-tile-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:16px;display:none}
.mg-section.on{display:block}
.mg-count{font-size:10px;color:var(--rca-text-muted);background:var(--rca-panel-bg);border:1px solid var(--rca-border);padding:2px 7px;border-radius:10px;font-family:var(--rca-font-mono)}
/* Register tabs. The Manage nav pill above is already filled yellow, so the active tab is
   marked with an underline instead — two stacked yellow fills would spend the whole signal
   budget on chrome. */
.mg-tabs{display:flex;gap:4px;margin-bottom:14px;border-bottom:1px solid var(--rca-border)}
.mg-tab{display:flex;align-items:center;gap:7px;background:none;border:none;border-bottom:2px solid transparent;color:var(--rca-text-secondary);font-family:var(--rca-font-mono);font-size:11px;letter-spacing:var(--rca-track);text-transform:uppercase;padding:8px 14px;margin-bottom:-1px;cursor:pointer;transition:color .15s,border-color .15s}
.mg-tab:hover{color:var(--rca-text-primary)}
.mg-tab.on{color:var(--rca-accent);border-bottom-color:var(--rca-accent)}
.mg-tab.on .mg-count{color:var(--rca-text-primary);border-color:var(--rca-border-strong)}
/* Search + IO bar */
.mg-bar{display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:wrap}
.mg-search{position:relative;flex:1;min-width:200px;max-width:380px}
.mg-search .mg-input{width:100%;padding-left:26px}
.mg-search-i{position:absolute;left:9px;top:50%;transform:translateY(-50%);color:var(--rca-text-muted);font-size:13px;pointer-events:none}
.mg-io-add{color:var(--rca-text-primary);border-color:var(--rca-border-strong)}
.mg-io-add.on{border-color:var(--rca-accent);color:var(--rca-accent)}
/* The add form is collapsed by default: adding one record by hand is rare next to
   browsing, and CSV import is the bulk path. */
.mg-add-wrap{display:none;margin-bottom:10px;padding:10px;background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius)}
.mg-add-wrap.on{display:block}
.mg-add-wrap .mg-add-row{margin-bottom:0}
.mg-filters{display:flex;align-items:center;gap:6px;margin-bottom:10px;flex-wrap:wrap}
.mg-chip{font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;letter-spacing:var(--rca-track);padding:3px 9px;border:1px solid var(--rca-border);border-radius:var(--rca-radius);color:var(--rca-text-secondary);cursor:pointer;user-select:none}
.mg-chip:hover{border-color:var(--rca-border-strong);color:var(--rca-text-primary)}
.mg-chip.on{background:var(--rca-panel-bg);border-color:var(--rca-border-strong);color:var(--rca-text-primary)}
.mg-chip-warn.on{background:var(--rca-tint-critical);border-color:transparent;color:var(--rca-status-critical)}
.mg-sort{flex:0 0 auto;margin-left:auto;min-width:150px;font-size:11px}
/* Column headers, and the grids the rows align to. Fixed tracks are what stop the asset
   name being the field that loses when a row runs out of room. */
.mg-head{display:grid;gap:8px;padding:0 8px 6px;padding-right:calc(8px + var(--mg-gutter));font-family:var(--rca-font-mono);font-size:9px;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-muted);border-bottom:1px solid var(--rca-border)}
.mg-row-ppl{grid-template-columns:minmax(0,2fr) minmax(0,1.4fr) minmax(0,2fr) 32px}
.mg-row-loc{grid-template-columns:minmax(0,1fr) 78px 74px 82px 32px}
.mg-row-ast{grid-template-columns:minmax(0,2fr) 116px minmax(0,1fr) 104px minmax(0,1.6fr) 56px}
.mg-foot{padding:8px;font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-muted);border-top:1px solid var(--rca-border)}
.mg-foot em{font-style:normal;color:var(--rca-status-warn)}
/* CSV template / export / import controls in each register header */
.mg-io{display:flex;gap:4px;margin-left:auto;flex-shrink:0}
.mg-io-btn{background:none;border:1px solid var(--rca-border);color:var(--rca-text-secondary);font-family:var(--rca-font-mono);font-size:10px;letter-spacing:var(--rca-track);text-transform:uppercase;padding:3px 7px;border-radius:var(--rca-radius);cursor:pointer;white-space:nowrap}
.mg-io-btn:hover{border-color:var(--rca-accent);color:var(--rca-accent)}
/* Import result */
.imp-counts{display:flex;gap:8px;flex-wrap:wrap}
.imp-c{font-family:var(--rca-font-mono);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);padding:3px 9px;border-radius:var(--rca-radius);background:var(--rca-page-bg);border:1px solid var(--rca-border);color:var(--rca-text-muted)}
.imp-c-add{background:var(--rca-tint-done);border-color:transparent;color:var(--rca-status-done)}
.imp-c-upd{background:var(--rca-tint-steel);border-color:transparent;color:var(--rca-status-open)}
.imp-c-skip{background:var(--rca-tint-critical);border-color:transparent;color:var(--rca-status-critical)}
.imp-skips{max-height:220px;overflow-y:auto;border:1px solid var(--rca-border);border-radius:var(--rca-radius);background:var(--rca-page-bg)}
.imp-skip{display:flex;gap:8px;padding:5px 8px;font-size:12px;font-family:var(--rca-font-mono);border-bottom:1px solid var(--rca-border);color:var(--rca-text-secondary)}
.imp-skip:last-child{border-bottom:none}
.imp-skip .imp-row{color:var(--rca-status-critical);font-weight:600;flex-shrink:0;min-width:56px}
.mg-add-row{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap}
.mg-input{flex:1;min-width:80px;background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);color:var(--rca-text-primary);font-size:12px;padding:5px 10px;font-family:var(--rca-font-mono);outline:none;transition:border-color .15s}
.mg-input:focus{border-color:var(--rca-accent)}
.mg-input::placeholder{color:var(--rca-text-muted)}
.mg-input option{background:var(--rca-tile-bg);color:var(--rca-text-primary)}
.mg-add-btn{flex-shrink:0;padding:5px 14px !important;font-size:11px !important}
/* Height follows the viewport rather than a fixed 400px, and the scrollbar is visible —
   these lists run to thousands of rows, so hiding the affordance hides the data. */
/* The gutter is reserved whether or not the list is currently scrolling, so the column
   headers below can line up with the rows without measuring the scrollbar at runtime. */
.mg-list{max-height:calc(100vh - 330px);min-height:180px;overflow-y:auto;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--rca-border-strong) transparent}
.mg-list::-webkit-scrollbar{width:8px}
.mg-list::-webkit-scrollbar-thumb{background:var(--rca-border-strong);border-radius:4px}
.mg-item{display:grid;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--rca-radius);font-size:12px;font-family:var(--rca-font-mono);border-bottom:1px solid var(--rca-border)}
.mg-item:hover{background:var(--rca-page-bg)}
.mg-item .mg-item-name{color:var(--rca-text-primary);font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mg-item .mg-item-meta{color:var(--rca-text-secondary);font-size:11px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mg-item .mg-item-badge{font-size:9px;font-weight:600;background:var(--rca-panel-bg);border:1px solid var(--rca-border);padding:1px 6px;border-radius:var(--rca-radius);color:var(--rca-text-secondary);white-space:nowrap;justify-self:start}
.mg-item .mg-item-loc{color:var(--rca-text-muted);font-size:11px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Cells that hold a badge or nothing at all still occupy their track, so the columns stay
   aligned down the whole list. */
.mg-cell{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mg-acts{display:flex;gap:2px;justify-content:flex-end}
/* Tree depth is layout, not text. It used to be non-breaking spaces inside the name, which
   meant a deep node ellipsized away its own name and rendered as bare "└ …". */
.mg-loc-name{display:flex;align-items:center;gap:6px;min-width:0}
.mg-loc-tick{color:var(--rca-text-muted);flex-shrink:0}
.mg-loc-context .mg-item-name{color:var(--rca-text-muted);font-weight:400}
.mg-orphan{color:var(--rca-status-warn);flex-shrink:0;font-size:10px}
.mg-item .mg-loc-missing{color:var(--rca-status-warn)}
/* Asset tag — the identifier, so it reads as technical data rather than a label */
.mg-item .mg-item-tag{font-size:10px;font-weight:600;font-family:var(--rca-font-mono);letter-spacing:var(--rca-track);color:var(--rca-text-primary);background:var(--rca-page-bg);border:1px solid var(--rca-border-strong);padding:1px 6px;border-radius:var(--rca-radius);white-space:nowrap}
/* Asset criticality. Critical carries the warn tint, not the critical red — red is
   reserved for something being wrong, and a critical asset is a fact, not a fault. */
.mg-crit{font-size:9px;font-weight:600;font-family:var(--rca-font-mono);text-transform:uppercase;letter-spacing:var(--rca-track);padding:1px 6px;border-radius:var(--rca-radius);white-space:nowrap}
.mg-crit-critical{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.mg-crit-essential{background:var(--rca-tint-steel);color:var(--rca-status-open)}
.mg-crit-non-critical{background:var(--rca-panel-bg);color:var(--rca-text-muted);border:1px solid var(--rca-border)}
.mg-incomplete{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
/* Inline asset editing */
.mg-item-editing{display:flex;flex-direction:column;align-items:stretch;gap:6px;background:var(--rca-panel-bg);border:1px solid var(--rca-accent);padding:8px}
.mg-edit-grid{display:flex;gap:6px;flex-wrap:wrap}
.mg-edit-grid .mg-input{flex:1;min-width:120px}
.mg-edit-actions{display:flex;gap:6px;justify-content:flex-end}
.mg-item .mg-del{background:none;border:none;color:var(--rca-text-muted);cursor:pointer;font-size:11px;padding:0 4px;border-radius:var(--rca-radius);flex-shrink:0}
.mg-item .mg-del:hover{color:var(--rca-status-critical);background:var(--rca-tint-critical)}
.mg-empty{color:var(--rca-text-muted);font-size:12px;text-align:center;padding:12px 8px;font-family:var(--rca-font-mono)}

/* ─── Attachments ─── */
.att-section{margin-top:12px;border-top:1px solid var(--rca-border);padding-top:12px}
.att-label{font-size:10px;font-weight:600;color:var(--rca-text-secondary);text-transform:uppercase;letter-spacing:var(--rca-track);font-family:var(--rca-font-mono);display:block;margin-bottom:8px}
.att-list{margin-bottom:10px;max-height:200px;overflow-y:auto;scrollbar-width:none}
.att-list::-webkit-scrollbar{display:none}
.att-item{display:flex;align-items:center;gap:6px;padding:5px 8px;border-radius:var(--rca-radius);font-size:12px;font-family:var(--rca-font-mono);margin-bottom:2px;background:var(--rca-page-bg);border:1px solid var(--rca-border)}
.att-item:hover{border-color:var(--rca-border-strong)}
.att-ico{flex-shrink:0;font-size:13px}
.att-name{color:var(--rca-text-primary);font-weight:500;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none}
.att-name:hover{text-decoration:underline;color:var(--rca-accent)}
.att-size{color:var(--rca-text-muted);font-size:10px;white-space:nowrap;flex-shrink:0;max-width:200px;overflow:hidden;text-overflow:ellipsis}
.att-del{background:none;border:none;color:var(--rca-text-muted);cursor:pointer;font-size:11px;padding:0 4px;border-radius:var(--rca-radius);flex-shrink:0}
.att-del:hover{color:var(--rca-status-critical);background:var(--rca-tint-critical)}
.att-empty{color:var(--rca-text-muted);font-size:11px;text-align:center;padding:8px;font-family:var(--rca-font-mono)}
.att-add-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.att-btn{font-size:11px !important;padding:4px 10px !important;flex-shrink:0}
.att-or{font-size:10px;color:var(--rca-text-muted);font-family:var(--rca-font-mono)}
.att-url-input{flex:1;min-width:120px;background:var(--rca-page-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);color:var(--rca-text-primary);font-size:11px;padding:4px 8px;font-family:var(--rca-font-mono);outline:none;transition:border-color .15s}
.att-url-input:focus{border-color:var(--rca-accent)}
.att-url-input::placeholder{color:var(--rca-text-muted)}
.att-hint{font-size:10px;color:var(--rca-text-muted);margin-top:6px;font-family:var(--rca-font-mono)}

/* ─── Print ───
   The app is a fixed, full-viewport, scroll-locked layout — there is no set of print rules
   that reflows it onto A4. prPrint() therefore copies the content being printed into
   #printHost, a plain block outside that layout, and these rules hide everything else.

   The colour overrides below are print-only and are the one place values are NOT taken from
   Brand Guidelines §9.1: the brand palette is built for Signal Black, and printing it would
   put light grey text on white paper and flood the page with ink. They are an ink-on-paper
   equivalent of the same hierarchy, not a second palette — nothing on screen may use them.
   Nerve Yellow in particular fails on white at any size, so the accent prints as a dark
   ochre that keeps the emphasis without the illegibility. */
#printHost{display:none}
/* ─── Active user + audit trail ───
   The identity control is quiet by default and quieter still when unset — it is a statement of
   fact, not a call to action, and it must never compete with the one primary per view. */
.hdr-user{background:var(--rca-tile-bg);color:var(--rca-text-secondary);border:1px solid var(--rca-border);
  border-radius:var(--rca-radius);font-family:var(--rca-font-mono);font-size:11px;padding:5px 8px;
  max-width:170px;cursor:pointer}
.hdr-user:hover{border-color:var(--rca-border-strong);color:var(--rca-text-primary)}
.hdr-user-none{color:var(--rca-text-muted);font-style:italic}
.au-banner{background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);
  padding:9px 11px;font-size:11.5px;line-height:1.5;color:var(--rca-text-secondary);margin-bottom:10px}
.au-stats{display:flex;flex-wrap:wrap;gap:14px;font-family:var(--rca-font-mono);font-size:11px;
  color:var(--rca-text-secondary);margin-bottom:10px}
.au-stats .au-warn{color:var(--rca-status-warn)}
.au-stats .au-dim{color:var(--rca-text-muted)}
.au-trim{background:var(--rca-tint-warn);border:1px solid var(--rca-status-warn);border-radius:var(--rca-radius);
  padding:8px 11px;font-size:11.5px;color:var(--rca-status-warn);line-height:1.5;margin-bottom:10px}
.au-filters{display:flex;gap:8px;margin-bottom:10px;flex-wrap:wrap}
.au-filters .mg-search{flex:1;min-width:180px}
.au-filters select{max-width:220px}
.au-empty{font-size:12.5px;color:var(--rca-text-muted);line-height:1.6}
.au-list{border-top:1px solid var(--rca-border)}
.au-row{display:grid;grid-template-columns:auto auto auto 1fr;gap:10px;align-items:baseline;
  padding:6px 0;border-bottom:1px solid var(--rca-border);font-size:12px}
.au-when{font-family:var(--rca-font-mono);font-size:10.5px;color:var(--rca-text-muted);white-space:nowrap}
.au-who{font-weight:600;white-space:nowrap}
.au-who.au-anon{font-weight:400;font-style:italic;color:var(--rca-text-muted)}
.au-act{color:var(--rca-text-secondary);white-space:nowrap}
.au-tgt{font-family:var(--rca-font-mono);font-size:10.5px;color:var(--rca-text-muted);white-space:nowrap}
.au-det{grid-column:1/-1;font-size:11.5px;color:var(--rca-text-secondary)}
@media (max-width:700px){.au-row{grid-template-columns:1fr}.au-tgt{grid-column:auto}}

/* ─── RCA initiation policy ─── */
.mg-policy-lead{font-size:12px;color:var(--rca-text-secondary);line-height:1.5;max-width:60ch}
.trg-empty{padding:26px 20px;max-width:62ch}
.trg-empty-h{font-family:var(--rca-font-display);font-size:16px;font-weight:700;margin-bottom:8px}
.trg-empty p{font-size:12.5px;color:var(--rca-text-secondary);line-height:1.6;margin-bottom:10px}
.trg-empty-n{color:var(--rca-text-muted) !important}
.trg-empty-s{display:block;font-size:11.5px;color:var(--rca-text-muted);margin-top:8px}
.trg-row{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;
  padding:12px 14px;border-bottom:1px solid var(--rca-border)}
.trg-off{opacity:.55}
.trg-main{min-width:0}
.trg-name{font-size:13.5px;font-weight:600;margin-bottom:4px}
.trg-tag{font-family:var(--rca-font-mono);font-size:9px;font-weight:600;text-transform:uppercase;
  letter-spacing:.08em;background:var(--rca-panel-bg);color:var(--rca-text-muted);
  border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:1px 6px;margin-left:8px}
.trg-crit{font-size:12px;color:var(--rca-text-secondary);line-height:1.6}
.trg-k{display:inline-block;min-width:74px;font-family:var(--rca-font-mono);font-size:9px;
  font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-muted)}
.trg-note{font-size:11.5px;color:var(--rca-text-muted);margin-top:4px;font-style:italic}
.trg-acts{display:flex;gap:4px;flex-shrink:0}
.trg-edit{display:block;background:var(--rca-panel-bg)}
.trg-f2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.trg-f3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.trg-chks{display:flex;flex-wrap:wrap;gap:10px;padding-top:4px}
.trg-chk{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--rca-text-primary);cursor:pointer}
.trg-h{font-size:11px;color:var(--rca-text-muted);margin-top:4px}
.trg-f-acts{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}
.trg-print{font-family:var(--rca-font-mono);font-size:12px;white-space:pre-wrap;line-height:1.6}
.gov-pol-n{color:var(--rca-text-muted)}
.gov-pol-rules{margin-top:10px;border-top:1px solid var(--rca-border)}
.gov-pol-r{display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:baseline;
  padding:6px 0;border-bottom:1px solid var(--rca-border);font-size:12px}
.gov-pol-nm{min-width:0}
.gov-pol-c{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-muted);white-space:nowrap}
.gov-pol-s{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-status-done);white-space:nowrap}
.gov-pol-s.gov-pol-bad{color:var(--rca-status-warn)}
@media (max-width:760px){.trg-f2,.trg-f3{grid-template-columns:minmax(0,1fr)}}

/* ─── Chase list ───
   Overdue is the critical colour, due-soon the warn colour — the same traffic-light series the
   tracker and the node dots use, so a row means the same thing wherever it appears. */
.ch-nudge{border-left:3px solid var(--rca-status-critical)}
.ch-head{font-family:var(--rca-font-mono);font-size:11.5px;color:var(--rca-text-secondary);margin-bottom:6px}
.ch-note{font-size:11.5px;color:var(--rca-text-muted);line-height:1.5;margin-bottom:14px}
.ch-clear{font-size:13px;color:var(--rca-status-done)}
.ch-grp{border:1px solid var(--rca-border);border-radius:var(--rca-radius);margin-bottom:12px;overflow:hidden}
.ch-grp-h{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--rca-panel-bg);padding:8px 11px;border-bottom:1px solid var(--rca-border)}
.ch-who{font-weight:600;font-size:13.5px}
.ch-mail{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-muted);margin-left:8px}
.ch-grp-c{display:flex;align-items:center;gap:8px}
.ch-pill{padding:2px 8px;border-radius:var(--rca-radius);font-family:var(--rca-font-mono);
  font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;white-space:nowrap}
.ch-pill.ch-bad{background:var(--rca-tint-critical);color:var(--rca-status-critical)}
.ch-pill.ch-warn{background:var(--rca-tint-warn);color:var(--rca-status-warn)}
.ch-row{display:grid;grid-template-columns:auto 1fr auto auto;gap:10px;align-items:baseline;
  padding:7px 11px;border-bottom:1px solid var(--rca-border);font-size:12.5px}
.ch-row:last-child{border-bottom:none}
.ch-over{border-left:2px solid var(--rca-status-critical)}
.ch-soon{border-left:2px solid var(--rca-status-warn)}
.ch-ref{font-family:var(--rca-font-mono);font-size:10.5px;color:var(--rca-text-muted);white-space:nowrap}
.ch-lab{min-width:0}
.ch-sub{display:block;font-size:11px;color:var(--rca-text-muted);margin-top:1px}
.ch-due{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-secondary);white-space:nowrap}
.ch-when{font-size:11.5px;white-space:nowrap}
.ch-when.ch-bad{color:var(--rca-status-critical)}
.ch-when.ch-warn{color:var(--rca-status-warn)}
.ch-none{color:var(--rca-text-muted)}
.ch-gap .ch-grp-h{background:var(--rca-page-bg)}
.ch-gap-n{font-size:11.5px;color:var(--rca-text-muted);padding:7px 11px 0}
@media (max-width:640px){.ch-row{grid-template-columns:1fr auto}.ch-ref{grid-column:1/-1}}

/* ─── Sign-off ───
   Status colour here is the functional traffic-light series, never brand: approved is done,
   stale is warn, returned is critical. Stale gets the amber rather than the red because the
   approval was real — it just no longer covers the current analysis. */
.so-banner{background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);
  padding:9px 11px;font-size:11.5px;line-height:1.5;color:var(--rca-text-secondary);margin-bottom:10px}
.so-req{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-accent);margin-bottom:12px}
.so-req-off{color:var(--rca-text-muted)}
.so-seats{display:grid;gap:8px;margin-bottom:6px}
.so-seat{border-left:2px solid var(--rca-border);padding:4px 0 4px 10px}
.so-seat.ok{border-left-color:var(--rca-status-done)}
.so-seat.stale{border-left-color:var(--rca-status-warn)}
.so-seat.bad{border-left-color:var(--rca-status-critical)}
.so-seat-r{font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-muted)}
.so-seat-l{font-size:12.5px;margin-top:2px}
.so-seat.none .so-seat-l{color:var(--rca-text-muted)}
.so-seat-w{font-size:11.5px;color:var(--rca-status-warn);margin-top:2px}
.so-seat-n{font-size:11.5px;color:var(--rca-text-secondary);margin-top:2px}
.so-hist-h{font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-secondary);border-bottom:1px solid var(--rca-border);
  padding-bottom:5px;margin:14px 0 8px}
.so-hrow{display:grid;grid-template-columns:auto 1fr auto auto;gap:8px;align-items:center;
  font-size:11.5px;padding:5px 0;border-bottom:1px solid var(--rca-border)}
.so-hrow.so-hstale{opacity:.6}
.so-hd{font-family:var(--rca-font-mono);font-size:10.5px;color:var(--rca-text-muted);white-space:nowrap}
.so-hw{color:var(--rca-text-secondary);white-space:nowrap}
.so-hn{grid-column:1/-1;color:var(--rca-text-secondary);font-size:11px}
.so-x{background:none;border:none;color:var(--rca-text-muted);cursor:pointer;font-size:12px;padding:0 2px}
.so-x:hover{color:var(--rca-status-critical)}

/* ─── Executive summary ───
   The one-page read. Deliberately quieter than the app: no yellow fills, one accent hairline
   under the title band and one on the systemic root, because the systemic cause is where the
   fix has to land. Status colour is the functional traffic-light series, never decoration. */
.ex{font-family:var(--rca-font-body);color:var(--rca-text-primary);font-size:13px;line-height:1.55}
.ex-head{border-bottom:2px solid var(--rca-accent);padding-bottom:12px;margin-bottom:14px}
.ex-eyebrow{font-family:var(--rca-font-mono);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-accent)}
.ex-title{font-family:var(--rca-font-display);font-size:21px;font-weight:700;letter-spacing:-.01em;line-height:1.15;margin:6px 0 3px}
.ex-sub{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-secondary)}
.ex-pills{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
.ex-pill{padding:2px 8px;border-radius:var(--rca-radius);font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;white-space:nowrap}
.ex-pill-plain{background:var(--rca-panel-bg);color:var(--rca-text-secondary);border:1px solid var(--rca-border)}
.ex-pill-systemic-root{background:var(--rca-accent-tint);color:var(--rca-accent)}
.ex-pill-human-root{background:var(--rca-tint-steel);color:var(--rca-cat-human)}
.ex-pill-physical-root{background:var(--rca-tint-steel);color:var(--rca-cat-physical)}
.ex-lead{font-size:15px;line-height:1.5;margin-bottom:14px;color:var(--rca-text-primary)}
.ex-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;background:var(--rca-border);border:1px solid var(--rca-border);border-radius:var(--rca-radius);overflow:hidden;margin-bottom:18px}
.ex-fact{background:var(--rca-tile-bg);padding:8px 11px;min-width:0}
.ex-k{display:block;font-family:var(--rca-font-mono);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-muted);margin-bottom:3px}
.ex-v{display:block;font-size:12.5px;word-break:break-word}
.ex-none{color:var(--rca-text-muted)}
.ex-sec{margin-bottom:18px}
.ex-h{font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-secondary);border-bottom:1px solid var(--rca-border);padding-bottom:5px;margin-bottom:9px}
.ex-note{font-size:11px;color:var(--rca-text-muted);margin-bottom:8px}
.ex-empty{font-size:12.5px;color:var(--rca-text-muted);font-style:italic}
.ex-root{border-left:2px solid var(--rca-border);padding:2px 0 2px 10px;margin-bottom:11px;break-inside:avoid;page-break-inside:avoid}
.ex-root-systemic-root{border-left-color:var(--rca-cat-systemic)}
.ex-root-human-root{border-left-color:var(--rca-cat-human)}
.ex-root-physical-root{border-left-color:var(--rca-cat-physical)}
.ex-root-h{display:flex;align-items:center;gap:8px;margin-bottom:3px}
.ex-ref-s{font-family:var(--rca-font-mono);font-size:10px;color:var(--rca-text-muted)}
.ex-root-l{font-size:13.5px;font-weight:600}
.ex-root-m{font-size:11.5px;color:var(--rca-text-secondary);margin-top:2px}
.ex-root-w{font-size:11.5px;color:var(--rca-status-warn);margin-top:2px}
.ex-acount{font-family:var(--rca-font-mono);font-size:11px;color:var(--rca-text-secondary);margin-bottom:8px}
/* The action table is the one wide thing on the page; it scrolls inside itself rather than
   pushing the whole summary sideways. */
.ex-tbl-wrap{overflow-x:auto}
.ex-tbl{width:100%;border-collapse:collapse;font-size:11.5px;min-width:560px}
.ex-tbl th{text-align:left;font-family:var(--rca-font-mono);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:var(--rca-track);color:var(--rca-text-muted);padding:0 8px 5px 0;border-bottom:1px solid var(--rca-border);white-space:nowrap}
.ex-tbl td{padding:6px 8px 6px 0;border-bottom:1px solid var(--rca-border);vertical-align:top}
.ex-mono{font-family:var(--rca-font-mono);font-size:10.5px;white-space:nowrap}
.ex-ok{color:var(--rca-status-done)}
.ex-bad{color:var(--rca-status-critical)}
.ex-warn{color:var(--rca-status-warn)}
.ex-dim{color:var(--rca-text-muted)}
.ex-list{margin:0;padding-left:18px;font-size:12px;line-height:1.6}
.ex-list li{margin-bottom:3px}
.ex-caveats{color:var(--rca-text-secondary)}
.ex-blk{background:var(--rca-tint-critical);border:1px solid var(--rca-status-critical);border-radius:var(--rca-radius);padding:9px 11px;margin-bottom:10px}
.ex-blk-h{font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--rca-status-critical);margin-bottom:6px}
.ex-blk .ex-list{color:var(--rca-text-primary)}
.ex-clear{font-size:12.5px;color:var(--rca-status-done)}
.ex-sign{display:grid;gap:9px}
.ex-sign-row{display:grid;grid-template-columns:1fr auto auto auto;gap:10px;align-items:baseline;
  padding-bottom:4px;border-bottom:1px solid var(--rca-border)}
.ex-sign-r{font-family:var(--rca-font-mono);font-size:10px;font-weight:600;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-muted)}
.ex-sign-v{font-size:12.5px;font-weight:600}
.ex-sign-w{font-size:12.5px}
.ex-sign-d{color:var(--rca-text-muted)}
.ex-sign-n{font-size:11.5px;margin-top:-4px}
.ex-sign-foot{font-size:11px;color:var(--rca-text-muted);margin-top:10px;line-height:1.5}
.ex-app-opt{margin-right:auto;display:flex;align-items:center;gap:6px;font-size:11px;color:var(--rca-text-secondary);font-family:var(--rca-font-mono);cursor:pointer}
.ex-app-h{font-family:var(--rca-font-display);font-size:16px;font-weight:700;margin:0 0 12px}
@media (max-width:640px){.ex-facts{grid-template-columns:minmax(0,1fr)}}

/* ─── Sign in ───────────────────────────────────────────────────────────────
   Covers the whole viewport until there is a session. The one glow in this view
   is on the primary button — the "one glowed element per view" rule holds here
   because the tree, which normally spends it on the selected node, is not on
   screen. */
.auth-gate{position:fixed;inset:0;z-index:9000;display:flex;align-items:center;justify-content:center;
  background:var(--rca-page-bg);padding:24px}
.auth-card{width:100%;max-width:360px;background:var(--rca-tile-bg);border:1px solid var(--rca-border);
  border-radius:var(--rca-radius);padding:28px 26px}
.auth-brand{font-family:var(--rca-font-display);font-size:22px;font-weight:700;
  color:var(--rca-text-primary);display:flex;flex-direction:column;gap:6px;margin-bottom:20px}
.auth-mod{font-family:var(--rca-font-mono);font-size:10.5px;font-weight:400;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-muted)}
.auth-status{font-size:13px;color:var(--rca-text-secondary);line-height:1.6}
.auth-form{display:flex;flex-direction:column;gap:6px}
.auth-lbl{font-family:var(--rca-font-mono);font-size:10.5px;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-muted);margin-top:10px}
.auth-form input{background:var(--rca-panel-bg);border:1px solid var(--rca-border);
  border-radius:var(--rca-radius);padding:9px 11px;color:var(--rca-text-primary);
  font-family:var(--rca-font-body);font-size:13.5px}
.auth-form input:focus{outline:none;border-color:var(--rca-accent)}
.auth-err{color:var(--rca-status-critical);font-size:12.5px;line-height:1.5;min-height:0}
.auth-err:not(:empty){margin-top:10px}
.auth-btn{margin-top:18px;width:100%;justify-content:center;box-shadow:var(--glow-nerve)}
.auth-btn[disabled]{opacity:.6;cursor:default;box-shadow:none}
/* Identity step. The card can grow past the viewport on a long register, so it
   scrolls rather than pushing its own buttons off screen. */
.auth-ident{margin-top:18px;max-height:60vh;overflow-y:auto}
.auth-pick{display:flex;flex-direction:column;gap:2px;width:100%;text-align:left;
  background:var(--rca-panel-bg);border:1px solid var(--rca-border);border-radius:var(--rca-radius);
  padding:9px 11px;margin-bottom:6px;cursor:pointer;color:var(--rca-text-primary);font-family:var(--rca-font-body)}
.auth-pick:hover{border-color:var(--rca-accent)}
.auth-pick-n{font-size:13.5px;font-weight:600}
.auth-pick-r{font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-muted)}
.auth-pick-empty{font-size:12.5px;color:var(--rca-text-secondary);line-height:1.6}
.auth-new-h{font-family:var(--rca-font-display);font-size:13px;font-weight:600;
  color:var(--rca-text-primary);margin-top:16px;padding-top:14px;border-top:1px solid var(--rca-border)}
.auth-opt{font-family:var(--rca-font-body);text-transform:none;letter-spacing:0;color:var(--rca-text-muted)}
/* Recovery. Deliberately quiet: the card already carries one primary button with
   the glow on it, and a second competing for attention would break the
   one-primary-per-view rule on the first screen anybody sees. */
.auth-link{display:block;width:100%;margin-top:12px;padding:0;background:none;border:0;
  cursor:pointer;font-family:var(--rca-font-body);font-size:12.5px;
  color:var(--rca-text-secondary);text-decoration:underline;text-underline-offset:2px}
.auth-link:hover{color:var(--rca-text-primary)}
.auth-note{font-size:12.5px;line-height:1.6;color:var(--rca-text-secondary)}
.so-noseat{font-size:12.5px;line-height:1.6;color:var(--rca-text-secondary)}
/* Invites */
.mg-inv{background:none;border:1px solid var(--rca-border);border-radius:var(--rca-radius);
  color:var(--rca-text-secondary);font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;
  letter-spacing:var(--rca-track);padding:3px 7px;cursor:pointer;margin-right:6px}
.mg-inv:hover{border-color:var(--rca-accent);color:var(--rca-text-primary)}
.mg-login{font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-status-done);margin-right:10px;white-space:nowrap}
.inv-note{font-size:12.5px;line-height:1.6;color:var(--rca-text-secondary);margin:10px 0}
/* The link must be selectable and fully visible — it is the only copy. */
.inv-link{font-family:var(--rca-font-mono);font-size:11.5px;background:var(--rca-panel-bg);
  border:1px solid var(--rca-border);border-radius:var(--rca-radius);padding:10px 11px;
  word-break:break-all;user-select:all;color:var(--rca-text-primary)}
.inv-err{font-size:12.5px;line-height:1.6;color:var(--rca-status-critical)}
.inv-h{font-family:var(--rca-font-mono);font-size:10px;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-muted);margin-bottom:6px}
.inv-row{display:flex;align-items:center;gap:10px;padding:6px 0;border-top:1px solid var(--rca-border);font-size:12.5px}
.inv-who{flex:1;color:var(--rca-text-primary)}
.inv-exp{font-family:var(--rca-font-mono);font-size:10.5px;color:var(--rca-text-muted)}
/* Was a <select>; now a readout, so it needs the type styling the control gave it for free. */
.hdr-user{font-family:var(--rca-font-mono);font-size:10.5px;text-transform:uppercase;
  letter-spacing:var(--rca-track);color:var(--rca-text-secondary);padding:0 4px}
.hdr-user-none{color:var(--rca-status-warn)}

@media print{
  @page{margin:16mm}
  html,body{height:auto !important;overflow:visible !important;background:#FFF !important}
  /* Everything the app draws is hidden; only the copy prints. */
  body.printing > *{display:none !important}
  body.printing #printHost{display:block !important}
  #printHost{
    --rca-page-bg:#FFFFFF;
    --rca-tile-bg:#FFFFFF;
    --rca-panel-bg:#F2F2F2;
    --rca-border:#CFCFCF;
    --rca-border-strong:#8A8A8A;
    --rca-text-primary:#0A0A0A;
    --rca-text-secondary:#3A3A3A;
    --rca-text-muted:#6E6E6E;
    --rca-accent:#7A6400;
    --rca-accent-tint:#F5EFD0;
    --rca-status-open:#5F5F5F;
    --rca-status-warn:#8A5A00;
    --rca-status-critical:#A32A24;
    --rca-status-done:#1F6B52;
    --rca-tint-warn:#F6ECDA;
    --rca-tint-critical:#F8E3E1;
    --rca-tint-done:#DDF0E8;
    --rca-tint-steel:#EEEEEE;
    --glow-nerve:none;
    background:#FFF;color:#0A0A0A;
    font-family:var(--rca-font-body);
  }
  #printHost *{box-shadow:none !important;text-shadow:none !important}
  .pr-head{border-bottom:2px solid #0A0A0A;padding-bottom:10px;margin-bottom:16px}
  .pr-brand{font-family:var(--rca-font-mono);font-size:9px;text-transform:uppercase;letter-spacing:var(--rca-track);color:#6E6E6E}
  .pr-head h1{font-family:var(--rca-font-display);font-size:19px;font-weight:700;margin:4px 0 2px;color:#0A0A0A}
  .pr-sub{font-family:var(--rca-font-mono);font-size:11px;color:#3A3A3A}
  /* Controls copied along with the content are not part of the document. */
  #printHost button,#printHost .tlv-toggle,#printHost input,#printHost select,#printHost textarea{display:none !important}
  /* Scroll containers become their full height, or the print stops at the fold. */
  #printHost .modal-b,#printHost [style*="max-height"],#printHost [style*="overflow"]{
    max-height:none !important;overflow:visible !important;height:auto !important}
  /* A cause or a timeline entry split across a page break is hard to read back. */
  #printHost .tlv-item,#printHost .ins-rec,#printHost .gov-item{break-inside:avoid;page-break-inside:avoid}
  #printHost h1,#printHost h2,#printHost h3{break-after:avoid;page-break-after:avoid}
  /* The executive summary prints with the full tree behind it, and the two are separate
     documents on paper — the appendix starts on its own sheet. */
  #printHost .pr-break{break-before:page;page-break-before:always;height:0}
  #printHost .ex-app-h{border-bottom:1px solid #CFCFCF;padding-bottom:6px}
  /* The facts grid and the action table are the two things that must not straddle a fold. */
  #printHost .ex-fact,#printHost .ex-root,#printHost .ex-blk,#printHost .ex-tbl tr{break-inside:avoid;page-break-inside:avoid}
  #printHost .ex-tbl thead{display:table-header-group}
  /* On paper there is no scrolling — the table takes the page width it is given. */
  #printHost .ex-tbl-wrap{overflow:visible !important}
  #printHost .ex-tbl{min-width:0}
  #printHost .ex-facts{border-color:#CFCFCF;background:#CFCFCF}
  /* A yellow hairline is invisible on white; the title band keeps its rule in ink. */
  #printHost .ex-head{border-bottom-color:#0A0A0A}
  #printHost .ex-root-systemic-root{border-left-color:#0A0A0A}
  #printHost .ex-app-opt{display:none !important}
}
