/* Extracted from index.html. Concatenated in the order the <style>
   blocks appeared, because that order IS the cascade — the 19 blocks
   that lived beside their sections came after the base stylesheet and
   still do. */

:root{
  --bg:#0a0f1a; --bg-2:#0c1422;
  --panel:#111a2b; --panel-2:#16223a; --raised:#1a2840;
  --line:#1e2c44; --line-2:#27395a;
  --ink:#e8eef7; --ink-dim:#8a9bb5; --ink-mute:#566889;
  --brand:#559cde; --brand-deep:#2f6fc4; --brand-hover:#6fb0ec; --navy:#002a86;
  --on-brand:#06101f;                         /* readable text on a --brand fill */
  --amber:#f3a712; --green:#3ddc97; --red:#ff6b6b; --violet:#9b8cff;
  --topbar-bg:rgba(10,15,26,.82);             /* sticky topbar (blurred) */
  --dot:rgba(255,255,255,.022);               /* .main dotted texture */
  --login-dot:rgba(255,255,255,.04);          /* login backdrop texture */
  --card-shadow:0 24px 60px rgba(0,0,0,.5);   /* login card lift */
  --chart-grid:#1e2c44; --chart-ink:#8a9bb5;  /* Chart.js gridlines + tick labels */
  --chart-mute:#566889; --chart-surface:#0c1422; /* donut slice gaps */
  /* CAFM risk board (cr-*) — dark defaults keep its GitHub-dark palette exact */
  --cr-ink:#e6edf3; --cr-ink-hi:#f4f7fb; --cr-dim:#8b949e; --cr-mute:#6e7681; --cr-tagtext:#c9d1d9;
  --cr-panel:#161b22; --cr-panel2:#1c232c; --cr-bg:#0d1117; --cr-bg2:#0f141b;
  --cr-line:#262d36; --cr-line2:#30363d; --cr-accent:#58a6ff; --cr-accent2:#1f6feb;
  /* elevation + motion tokens (one language for depth and transitions) */
  --sh-1:0 1px 2px rgba(0,0,0,.35);
  --sh-2:0 10px 26px -12px rgba(0,0,0,.6);
  --ring:rgba(85,156,222,.4);
  --ease:cubic-bezier(.4,0,.2,1);
  --r:8px; --r-lg:12px;
  --f-disp:'Space Grotesk',system-ui,sans-serif;
  --f-ui:'Inter',system-ui,sans-serif;
  --f-mono:'JetBrains Mono',ui-monospace,monospace;
  --rail:220px;
}
/* ── LIGHT THEME ── set by the topbar toggle (persisted as bgis_theme).
   Dark stays the default: these values apply only when <html data-theme="light">. */
:root[data-theme="light"]{
  --bg:#e5eaf1; --bg-2:#dde3ec;
  --panel:#f5f8fc; --panel-2:#ebeff7; --raised:#e5ebf4;
  --line:#d6deea; --line-2:#c0cbdd;
  --ink:#1a2436; --ink-dim:#4c5a73; --ink-mute:#77859d;
  --brand:#2f6fc4; --brand-deep:#234f8f; --brand-hover:#255fab; --navy:#002a86;
  --on-brand:#ffffff;
  --topbar-bg:rgba(229,234,241,.85);
  --dot:rgba(20,44,88,.045);
  --login-dot:rgba(20,44,88,.05);
  --card-shadow:0 20px 46px rgba(28,50,92,.13);
  --chart-grid:#dbe2ec; --chart-ink:#5a6883; --chart-mute:#8593ab; --chart-surface:#f5f8fc;
  /* CAFM risk board (cr-*) — light values for its GitHub-dark palette */
  --cr-ink:#1a2436; --cr-ink-hi:#0f1826; --cr-dim:#55627a; --cr-mute:#7787a0; --cr-tagtext:#3a4a63;
  --cr-panel:#f5f8fc; --cr-panel2:#eaeff7; --cr-bg:#e9eef5; --cr-bg2:#e2e8f1;
  --cr-line:#d6deea; --cr-line2:#c3cee0; --cr-accent:#2f6fc4; --cr-accent2:#2f6fc4;
  --sh-1:0 1px 2px rgba(28,50,92,.06);
  --sh-2:0 12px 28px -12px rgba(28,50,92,.17);
  --ring:rgba(47,111,196,.3);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
/* one visible keyboard-focus ring across interactive chrome (buttons/nav/links);
   inputs keep their own border+glow focus, so leave those to it */
/* Keyboard focus must always be visible. The rule below covers the interactive
   elements; the catch-all after it covers anything that takes focus and has had
   its outline removed by a more specific rule, so "outline:none" can never
   leave a control with no focus indicator at all. */
button:focus-visible,a:focus-visible,.nav-item:focus-visible,.subtab:focus-visible,[tabindex]:focus-visible,[role="button"]:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--ring);outline-offset:1px}
/* Skip link — the rail is 11 items before the content on every page. */
.skip-link{position:absolute;left:-9999px;top:0;z-index:500;padding:10px 16px;background:var(--brand);color:var(--on-brand);border-radius:0 0 var(--r) 0;font-family:var(--f-ui);font-size:13px;font-weight:600}
.skip-link:focus{left:0}
/* Visible to assistive tech only — used for the route/status announcements
   that have no on-screen equivalent. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
body{background:var(--bg);color:var(--ink);font-family:var(--f-ui);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:6px;border:2px solid var(--bg)}
::-webkit-scrollbar-track{background:transparent}

/* LOGIN */
#login{min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(60% 50% at 20% 10%,rgba(85,156,222,.12),transparent 70%),radial-gradient(50% 50% at 85% 90%,rgba(0,42,134,.25),transparent 70%),var(--bg);position:relative;overflow:hidden}
#login::before{content:"";position:absolute;inset:0;background-image:radial-gradient(var(--login-dot) 1px,transparent 1px);background-size:26px 26px;mask-image:radial-gradient(80% 80% at 50% 40%,#000,transparent)}
.login-card{position:relative;width:400px;background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:38px 40px 34px;box-shadow:var(--card-shadow)}
.brand-badge{display:inline-flex;align-items:center}
.brand-badge img{height:32px;display:block}
.brand-lockup{display:inline-flex;align-items:center;gap:11px}
.brand-prism{font-family:var(--f-disp);font-weight:700;font-size:19px;letter-spacing:.22em;color:var(--ink);line-height:1;padding-left:11px;border-left:1px solid var(--line-2)}
.prism-mark{height:24px;width:auto;display:block;flex:none}
.rail .badge-wrap .brand-lockup{gap:7px}
.rail .badge-wrap .brand-prism{font-size:13px;letter-spacing:.12em;padding-left:7px}
.rail .badge-wrap .prism-mark{height:16px;width:auto}
.login-card .eyebrow{font-family:var(--f-mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--brand);margin:22px 0 4px}
.login-card h1{font-family:var(--f-disp);font-size:23px;font-weight:600;letter-spacing:-.01em}
.login-card p.sub{color:var(--ink-dim);font-size:13px;margin:6px 0 26px}
.field{margin-bottom:15px}
.field label{display:block;font-family:var(--f-mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:7px}
.field input{width:100%;padding:11px 13px;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:14px;font-family:var(--f-ui);transition:.15s}
.field input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(85,156,222,.15)}
.field select{width:100%;padding:11px 13px;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:14px;font-family:var(--f-ui);transition:.15s}
.field select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(85,156,222,.15)}
.u-btn{padding:6px 11px;background:var(--panel-2);border:1px solid var(--line-2);color:var(--ink-dim);border-radius:var(--r);font-size:12px;font-family:var(--f-ui);cursor:pointer;margin-left:6px;transition:.13s}
.u-btn:hover{color:var(--ink);border-color:var(--brand)}
.u-danger:hover{border-color:rgba(255,107,107,.55);color:#ff9b9b}
.role-admin{background:rgba(255,107,107,.14);color:#ff9b9b}
.role-manager{background:rgba(243,167,18,.16);color:#f3c05a}
.role-viewer{background:rgba(85,156,222,.16);color:var(--brand)}
.btn{width:100%;padding:12px;border:none;border-radius:var(--r);cursor:pointer;font-family:var(--f-ui);font-size:14px;font-weight:600;transition:.15s}
.btn-primary{background:var(--brand);color:var(--on-brand)}.btn-primary:hover{background:var(--brand-hover)}
.btn:disabled{opacity:.6;cursor:default}
.cp-msg{display:none;margin-top:13px;font-size:13px;padding:9px 12px;border-radius:var(--r)}
.cp-msg.err{display:block;background:rgba(255,107,107,.12);border:1px solid rgba(255,107,107,.4);color:#ff9b9b}
.cp-msg.ok{display:block;background:rgba(61,220,151,.12);border:1px solid rgba(61,220,151,.4);color:#7ff0c0}
.rail-user{cursor:pointer;border-radius:var(--r);transition:.13s}.rail-user:hover{background:var(--panel)}
.login-err{color:var(--red);font-size:13px;margin-top:14px;display:none}

/* SHELL */
#app{display:none;min-height:100vh}
.shell{display:grid;grid-template-columns:var(--rail) 1fr;min-height:100vh}
.rail{background:linear-gradient(180deg,var(--bg-2),var(--bg));border-right:1px solid var(--line);padding:18px 14px;position:sticky;top:0;height:100vh;display:flex;flex-direction:column;gap:6px;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:var(--line-2) transparent}
.rail::-webkit-scrollbar{width:8px}.rail::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:4px}.rail::-webkit-scrollbar-track{background:transparent}
.rail .badge-wrap{padding:4px 4px 18px;margin-bottom:6px;border-bottom:1px solid var(--line)}
.rail .badge-wrap .brand-badge img{height:18px}
.rail-cap{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.14em;color:var(--ink-mute);text-transform:uppercase;margin:8px 8px 4px}
/* Real <button>s, not divs: the rail was unreachable by keyboard entirely —
   11 div onclicks with no tabindex, and a .nav-item:focus-visible rule that
   could therefore never fire. appearance/font/text-align reset the button
   defaults so the visual result is unchanged. */
.nav-item{display:flex;align-items:center;gap:11px;width:100%;padding:9px 11px;border-radius:var(--r);background:none;color:var(--ink-dim);font-family:var(--f-ui);font-size:13.5px;font-weight:500;text-align:left;cursor:pointer;border:1px solid transparent;transition:.13s;appearance:none}
.nav-item:hover{background:var(--panel);color:var(--ink)}
.nav-item.active{background:var(--panel-2);color:var(--ink);border-color:var(--line-2)}
.nav-item.active .ico{color:var(--brand)}
.nav-item .ico{width:17px;height:17px;flex:0 0 17px;color:var(--ink-mute);transition:.13s}
.rail-foot{margin-top:auto;border-top:1px solid var(--line);padding-top:14px}
.rail-filter{display:flex;flex-direction:column;gap:7px;margin-bottom:14px}
.rail-filter select{width:100%;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:12.5px;font-family:var(--f-ui);padding:8px 9px}
.rail-filter select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.rail-filter .g-reset{width:100%;height:auto;padding:7px}
.rail-filter.on select{border-color:var(--line-2)}
.rail-filter.on{padding:9px;margin:0 -3px 14px;border:1px solid var(--brand);border-radius:var(--r-lg);background:rgba(85,156,222,.06)}
.rail-user{display:flex;align-items:center;gap:9px;padding:4px 6px}
.avatar{width:30px;height:30px;border-radius:7px;background:linear-gradient(135deg,var(--brand),var(--navy));display:flex;align-items:center;justify-content:center;font-family:var(--f-disp);font-weight:700;font-size:13px;color:#fff;flex:0 0 30px}
.rail-user .nm{font-size:12.5px;font-weight:600;line-height:1.1}
.rail-user .rl{font-family:var(--f-mono);font-size:10px;color:var(--ink-mute);text-transform:uppercase;letter-spacing:.08em}
.signout{margin-top:10px;width:100%;padding:8px;background:none;border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink-dim);font-size:12px;cursor:pointer;font-family:var(--f-ui);transition:.13s}
.signout:hover{border-color:var(--red);color:var(--red)}
.main{min-width:0;background-image:radial-gradient(var(--dot) 1px,transparent 1px);background-size:28px 28px}
.topbar{display:flex;align-items:center;gap:16px;padding:16px 26px;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:30;backdrop-filter:blur(10px);background:var(--topbar-bg)}
.topbar h2{font-family:var(--f-disp);font-size:19px;font-weight:600;letter-spacing:-.01em}
.crumb{font-family:var(--f-mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:2px}
.live{display:flex;align-items:center;gap:7px;margin-left:auto;font-family:var(--f-mono);font-size:11px;color:var(--ink-dim)}
.dot{width:7px;height:7px;border-radius:50%;background:var(--green);animation:pulse 2.2s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(61,220,151,.5)}70%{box-shadow:0 0 0 7px rgba(61,220,151,0)}100%{box-shadow:0 0 0 0 rgba(61,220,151,0)}}
.icon-btn{background:var(--panel);border:1px solid var(--line-2);color:var(--ink-dim);width:34px;height:34px;border-radius:var(--r);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.13s}
.icon-btn:hover{color:var(--brand);border-color:var(--brand)}.icon-btn svg{width:16px;height:16px}
.theme-btn .ic-moon{display:none}
:root[data-theme="light"] .theme-btn .ic-sun{display:none}
:root[data-theme="light"] .theme-btn .ic-moon{display:block}
/* wordmark swaps by theme: white on dark surfaces, the navy/two-tone mark on light */
.brand-badge .logo-navy{display:none}
:root[data-theme="light"] .brand-badge .logo-white{display:none}
:root[data-theme="light"] .brand-badge .logo-navy{display:block}
.icon-btn.spin svg{animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}
.canvas{padding:22px 26px 60px;max-width:1640px}
.view{display:none;animation:fade .35s ease both}.view.active{display:block}
@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:14px;margin-bottom:20px}
.kpi{position:relative;background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:16px 18px;overflow:hidden;box-shadow:var(--sh-1)}
.kpi .k-lab{font-family:var(--f-mono);font-size:10px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-mute);display:flex;align-items:center;gap:6px}
.kpi .k-val{font-family:var(--f-disp);font-weight:600;font-size:30px;line-height:1.05;margin-top:9px;letter-spacing:-.02em}
.kpi .k-sub{font-family:var(--f-mono);font-size:11px;color:var(--ink-dim);margin-top:5px}
.kpi .spark{position:absolute;right:0;bottom:0;width:100%;height:38px;opacity:.5;pointer-events:none}
.kpi.b{border-color:rgba(85,156,222,.32)}.kpi.b .k-val{color:var(--brand)}
.kpi.a{border-color:rgba(243,167,18,.3)}.kpi.a .k-val{color:var(--amber)}
.kpi.g{border-color:rgba(61,220,151,.3)}.kpi.g .k-val{color:var(--green)}
.kpi.r{border-color:rgba(255,107,107,.3)}.kpi.r .k-val{color:var(--red)}
.kpi.v{border-color:rgba(155,140,255,.3)}.kpi.v .k-val{color:var(--violet)}
.filters{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:14px 16px;margin-bottom:18px}
.fg{display:flex;flex-direction:column;gap:6px}
.fg label{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
.fg select,.fg input{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:13px;font-family:var(--f-ui);padding:8px 10px;min-width:140px}
.fg input[type=date]{min-width:148px;color-scheme:dark}
.fg select:focus,.fg input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.fg.search input{min-width:210px}
.seg{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--r);overflow:hidden;flex-wrap:wrap}
.seg button{padding:8px 12px;border:none;background:var(--bg);color:var(--ink-dim);font-size:12px;font-weight:500;cursor:pointer;border-right:1px solid var(--line-2);font-family:var(--f-ui);transition:.13s}
.seg button:last-child{border-right:none}
.seg button.active{background:var(--brand);color:var(--on-brand)}
.seg button:hover:not(.active){background:var(--panel-2);color:var(--ink)}
.f-spacer{margin-left:auto;display:flex;gap:10px;align-items:flex-end}
.ghost{padding:8px 13px;background:none;border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink-dim);font-size:12px;cursor:pointer;font-family:var(--f-ui);transition:.13s;height:36px}
.ghost:hover{border-color:var(--brand);color:var(--brand)}
.ghost.tgl-on{border-color:var(--brand);color:var(--brand);background:rgba(85,156,222,.12)}
#ch-canvas.analysing{cursor:crosshair}
.f-note{flex-basis:100%;font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute);line-height:1.5}
.grid{display:grid;gap:16px;margin-bottom:16px}
.g-2{grid-template-columns:1fr 1fr}.g-3{grid-template-columns:repeat(3,1fr)}.g-23{grid-template-columns:2fr 1fr}
.card{background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:14px 16px;box-shadow:var(--sh-1)}
.card.span2{grid-column:span 2}
.card h3{font-family:var(--f-mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-dim);margin-bottom:2px;display:flex;align-items:center;justify-content:space-between;gap:8px}
.card .h-meta{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute);text-transform:none;letter-spacing:0}
.card .chart-h{margin-top:8px;position:relative;height:180px}
.card.tall .chart-h{height:220px}
.tbl-card{background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden}
.tbl-head{display:flex;align-items:center;gap:12px;padding:14px 18px;border-bottom:1px solid var(--line)}
.tbl-head h3{font-family:var(--f-disp);font-size:15px;font-weight:600}
.tbl-head .count{font-family:var(--f-mono);font-size:11px;color:var(--ink-mute)}
.tbl-scroll{overflow-x:auto;max-height:640px;overflow-y:auto}
table{width:100%;border-collapse:collapse}
thead th{position:sticky;top:0;background:var(--panel-2);text-align:left;padding:10px 14px;font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);white-space:nowrap;cursor:pointer;user-select:none;border-bottom:1px solid var(--line)}
thead th:hover{color:var(--brand)}
thead th .ar{opacity:.4;margin-left:4px}
tbody td{padding:10px 14px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:top}
tbody tr:hover td{background:rgba(255,255,255,.018)}
td.mono,.mono{font-family:var(--f-mono);font-size:12px}
.trunc{max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:20px;font-family:var(--f-mono);font-size:10.5px;font-weight:500;white-space:nowrap}
/* read-only accounts (viewers): hide data-modifying controls. Backend also blocks them. */
body.ro .write-only{display:none!important}
/* super-admin-only controls (backend also enforces the gate). */
body:not(.super) .super-only{display:none!important}
.role-super{background:rgba(255,107,107,.14);color:#ff9b9b}
.role-user{background:rgba(120,190,120,.16);color:#8fd28f}
/* section/customer grant pickers in user management */
.grant-block{margin:16px 0 4px}
.grant-head{display:flex;justify-content:space-between;align-items:baseline;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-dim);margin-bottom:9px}
.grant-mini{text-transform:none;letter-spacing:0;font-size:11.5px;color:var(--ink-dim)}
.grant-mini a{color:var(--brand);cursor:pointer}
.grant-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}
/* sub-grants (BMS tabs) sit indented under their parent section */
.grant-sub{margin-left:14px;padding-left:12px;border-left:2px solid var(--line-2)}
.grant-hint{font-size:11.5px;color:var(--ink-mute);line-height:1.5;margin:0 0 8px}
.grant-grid label,.grant-list label{display:flex;align-items:center;gap:9px;margin:0;font-size:13px;font-weight:500;color:var(--ink);cursor:pointer;line-height:1.25;text-align:left;text-transform:none;letter-spacing:0;padding:8px 11px;border:1px solid var(--line-2);border-radius:var(--r);background:var(--bg);transition:.12s}
.grant-grid label:hover,.grant-list label:hover{border-color:var(--brand)}
.grant-grid label:has(input:checked),.grant-list label:has(input:checked){border-color:var(--brand);background:rgba(85,156,222,.10)}
.grant-grid input[type=checkbox],.grant-list input[type=checkbox]{accent-color:var(--brand);width:15px!important;height:15px;flex:none;margin:0;cursor:pointer}
.grant-search{width:100%;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:13px;font-family:var(--f-ui);padding:7px 10px;margin-bottom:8px}
.grant-search:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.grant-list{display:flex;flex-direction:column;gap:6px;max-height:210px;overflow-y:auto;padding:2px}
.grant-list label{width:100%}
.grant-empty{color:var(--ink-dim);font-size:12.5px;padding:4px 2px}
.ai-toggle{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:500;color:var(--ink);cursor:pointer;padding:8px 11px;border:1px solid var(--line-2);border-radius:var(--r);background:var(--bg)}
.ai-toggle:hover{border-color:var(--brand)}
.ai-toggle:has(input:checked){border-color:var(--brand);background:rgba(85,156,222,.10)}
.ai-toggle input[type=checkbox]{accent-color:var(--brand);width:15px!important;height:15px;flex:none;margin:0;cursor:pointer}
#nu-grants.hide,#eu-grants.hide{display:none}
/* in-view tab bar for grouped nav sections (Energy, AMI Data, Settings) */
.subtabs{display:flex;gap:4px;padding:10px 22px 0;border-bottom:1px solid var(--line);background:var(--bg)}
.subtab{appearance:none;background:none;border:none;border-bottom:2px solid transparent;color:var(--ink-dim);font-family:var(--f-ui);font-size:13.5px;font-weight:600;padding:9px 14px;margin-bottom:-1px;cursor:pointer;transition:.12s}
.subtab:hover{color:var(--ink)}
.subtab.active{color:var(--brand);border-bottom-color:var(--brand)}
/* PBOS plant dashboard */
.pbd-innertabs{padding:0;background:none;border-bottom:1px solid var(--line)}
.pbd-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:10px;margin-bottom:18px}
.pbd-kpi{background:var(--bg);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px}
.pbd-kpi .n{font-size:22px;font-weight:700;color:var(--ink);font-family:var(--f-mono)}
.pbd-kpi .l{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-dim);margin-top:3px}
.pbd-kpi.warn{border-color:rgba(255,107,107,.4)}
.pbd-kpi.warn .n{color:#ff9b9b}
.pbd-table{width:100%;border-collapse:collapse;table-layout:fixed}
.pbd-table th,.pbd-table td{text-align:left;padding:8px 15px;font-size:13px;border-bottom:1px solid var(--line);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pbd-table thead th{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-dim);font-weight:600;position:sticky;top:0;background:var(--card,var(--bg))}
.pbd-grp td{background:var(--bg);font-weight:700;font-size:13px;color:var(--ink);border-top:2px solid var(--line)}
.pbd-grp .pbd-badge{margin-left:8px}
.pbd-commonrow td{color:var(--ink-dim);font-style:italic}
.pbd-temp{font-family:var(--f-mono);font-style:normal}
.pbd-badge{display:inline-flex;padding:2px 9px;border-radius:20px;font-size:11px;font-weight:600;white-space:nowrap}
.pbd-on{background:rgba(120,190,120,.16);color:#8fd28f}
.pbd-off{background:rgba(138,155,181,.14);color:var(--ink-dim)}
.pbd-fault{background:rgba(255,107,107,.16);color:#ff9b9b}
.pbd-empty{color:var(--ink-dim);padding:26px;text-align:center}
.pbd-srcbadge{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;padding:2px 9px;border-radius:20px;background:rgba(138,155,181,.14);color:var(--ink-dim)}
.pbd-srcbadge.custom{background:rgba(85,156,222,.16);color:var(--brand)}
.pbd-toolbar{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
.pbd-toolbar select{padding:7px 10px;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:12.5px}
.pbd-editgrp{margin-bottom:12px}
.pbd-editgrp-h{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line);font-weight:600;font-size:13.5px}
.pbd-edit-table{width:100%;border-collapse:collapse}
.pbd-edit-table th,.pbd-edit-table td{padding:6px 10px;border-bottom:1px solid var(--line);font-size:12.5px;text-align:left}
.pbd-edit-table th{font-size:10px;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-dim)}
.pbd-edit-table tbody tr:last-child td{border-bottom:none}
.pbd-edit-table input,.pbd-edit-table select{width:100%;padding:6px 8px;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:12.5px;font-family:var(--f-ui)}
.pbd-edit-table input:focus,.pbd-edit-table select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.pbd-edit-table td:first-child{width:24%}
.pbd-edit-table td:last-child{width:36px;text-align:center}
.pbd-commonedit td input{color:var(--ink-dim);font-style:italic}
.pbd-commonlbl{font-size:9.5px;color:var(--ink-dim);margin-bottom:3px;text-transform:uppercase;letter-spacing:.06em}
.pbd-edit-table select[disabled]{opacity:.5}
#fcu-building{padding:7px 10px;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:12.5px;min-width:220px}
#fcu-building:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.pbd-diag{margin-top:14px;font-size:12px;color:var(--ink-dim)}
.pbd-diag summary{cursor:pointer;padding:6px 0;color:var(--ink-mute);text-transform:uppercase;letter-spacing:.06em;font-size:10.5px}
.pbd-diag-row{padding:5px 0;line-height:1.5;word-break:break-word}
.pbd-diag-row b{color:var(--ink)}
.p-open{background:rgba(85,156,222,.16);color:var(--brand)}
.p-pending{background:rgba(243,167,18,.16);color:var(--amber)}
.p-progress{background:rgba(155,140,255,.16);color:var(--violet)}
.p-closed{background:rgba(61,220,151,.16);color:var(--green)}
.p-critical{background:rgba(255,107,107,.26);color:#ffd0d0}
.p-high{background:rgba(255,107,107,.16);color:var(--red)}
.p-moderate{background:rgba(243,167,18,.16);color:var(--amber)}
.p-low{background:rgba(138,155,181,.14);color:var(--ink-dim)}
.bar-mini{height:6px;border-radius:3px;background:var(--line-2);overflow:hidden;min-width:60px}
.bar-mini i{display:block;height:100%;background:var(--green)}
.empty{padding:46px;text-align:center;color:var(--ink-mute);font-size:13px}
/* expandable detail row */
.row-summary{cursor:pointer}
.row-summary:hover td{background:rgba(85,156,222,.04)}
.row-summary td:first-child::before{content:'▸';color:var(--ink-mute);margin-right:6px;font-size:11px;transition:.15s;display:inline-block}
.row-summary.open td:first-child::before{transform:rotate(90deg);color:var(--brand)}
.row-detail{display:none}
.row-detail.open{display:table-row}
.row-detail td{padding:0;border-bottom:1px solid var(--line)}
.detail-panel{padding:20px 22px;background:var(--bg-2);display:grid;grid-template-columns:1fr 1fr;gap:16px 32px}
.detail-panel .dp-section{display:flex;flex-direction:column;gap:10px}
.dp-label{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
.dp-val{font-size:13px;color:var(--ink);line-height:1.5;white-space:pre-wrap;word-break:break-word}
.dp-edit{display:flex;flex-direction:column;gap:6px}
.dp-edit select,.dp-edit input,.dp-edit textarea{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:13px;font-family:var(--f-ui);padding:8px 10px;width:100%}
.dp-edit textarea{min-height:70px;resize:vertical}
.dp-edit select:focus,.dp-edit input:focus,.dp-edit textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.dp-actions{grid-column:span 2;display:flex;gap:10px;align-items:center;padding-top:6px;border-top:1px solid var(--line)}
/* The primary button. This lived under .dp-actions only, so every btn-save
   outside a detail panel — Run report, Create report, + Add user, + New
   intervention — rendered as a native white browser button. */
.btn-save{padding:9px 20px;background:var(--brand);color:var(--on-brand);border:none;border-radius:var(--r);font-size:13px;font-weight:600;cursor:pointer;font-family:var(--f-ui);transition:.13s}
.btn-save:hover{opacity:.85}
.btn-save:disabled{opacity:.5;cursor:not-allowed}
.dp-actions .btn-save{padding:9px 20px;background:var(--brand);color:var(--on-brand);border:none;border-radius:var(--r);font-size:13px;font-weight:600;cursor:pointer;font-family:var(--f-ui)}
.dp-actions .btn-save:hover{opacity:.85}
.dp-actions .btn-save:disabled{opacity:.5;cursor:not-allowed}
.dp-actions .ghost{height:auto;padding:9px 16px}
.dp-actions .save-status{font-family:var(--f-mono);font-size:11px;color:var(--ink-dim);margin-left:auto}
.save-ok{color:var(--green)!important}
.save-err{color:var(--red)!important}
@media(max-width:860px){.detail-panel{grid-template-columns:1fr}}
.loading{padding:40px 42px;text-align:center;color:var(--ink-dim);font-size:13px}
.loading::before{content:"";display:block;width:20px;height:20px;margin:0 auto 14px;border-radius:50%;border:2.5px solid var(--line-2);border-top-color:var(--brand);animation:spin .75s linear infinite}
.pulse-t{animation:pul 1.5s infinite}@keyframes pul{0%,100%{opacity:1}50%{opacity:.55}}
@media (max-width:1100px){.g-3{grid-template-columns:1fr 1fr}.g-23{grid-template-columns:1fr}.card.span2{grid-column:span 1}}
.menu-btn{display:none}
.rail-scrim{display:none}
/* ── Phone layout (≤860px): rail becomes an off-canvas drawer with a scrim,
   the topbar wraps, and content/modals get tighter spacing. ── */
@media (max-width:860px){
  .shell{grid-template-columns:1fr}
  .rail{position:fixed;left:-260px;top:0;z-index:60;transition:left .2s ease;width:250px;box-shadow:0 0 40px rgba(0,0,0,.5)}
  .rail.open{left:0}
  .rail.open ~ .rail-scrim{display:block;position:fixed;inset:0;z-index:55;background:rgba(0,0,0,.5);-webkit-tap-highlight-color:transparent}
  .menu-btn{display:flex!important}
  .g-2,.g-3,.g-23{grid-template-columns:1fr}
  .topbar{flex-wrap:wrap;gap:10px;padding:12px 14px}
  .topbar h2{font-size:16px}
  .topbar .crumb{font-size:10px}
  .canvas{padding:16px 13px 72px}
  .filters{padding:12px;gap:8px}
  .modal-overlay{padding:14px 10px;align-items:flex-start}
  .modal{border-radius:12px}
  .subtabs{overflow-x:auto;white-space:nowrap;scrollbar-width:none}
  .subtabs::-webkit-scrollbar{display:none}
  /* Dense fixed tables: give them a floor width so .tbl-scroll scrolls them
     sideways instead of crushing every column to an unreadable sliver. */
  #iv-table{min-width:880px}
  #t-ovp-contract,#t-ovp-owner{min-width:520px}
  .pbd-table{min-width:640px}
  /* CAFM board: the header stacked title + a wide control cluster on one row,
     overflowing the viewport (Chrome then zooms the whole page out). Stack it. */
  .cr-head{flex-direction:column;align-items:stretch;gap:12px}
  .cr-head>div:last-child{flex-wrap:wrap;gap:10px}
  .cr-title{font-size:16px}
  .cr-kicker{white-space:normal}
  .cr-card{min-width:0}
  .cr-clock{margin-left:0;flex-wrap:wrap}
  /* Both boards pushed the page wider than the phone, in either shell, and both
     for the same reason: a flex row of controls with nowrap. Measured at 375px
     - .f-spacer held a select and four buttons totalling 455px inside a 353px
     parent, and .cr-clock a clock plus five (CSV, PDF, Present, Options,
     Refresh) totalling 444px. Nothing was too big; nothing was allowed to wrap.
     The page then scrolled sideways and cut the left off every line. */
  .f-spacer{flex-wrap:wrap;width:100%;margin-left:0;gap:8px}
  .f-spacer .fg,.f-spacer select{min-width:0}
  /* Charting's From/To pair is the same shape again: two 193px date fields
     side by side in a 319px column. Three boards, one cause. */
  #ch-main-range{flex-wrap:wrap;gap:8px}
  #ch-main-range .fg{min-width:0;flex:1 1 140px}
  /* A grid item's min-width is `auto`, which resolves to its content's
     min-content size - so a card holding a table with min-width:520px becomes
     554px wide and pushes straight out of its own 353px column. The tables are
     already inside .tbl-scroll and scroll sideways on their own; the card just
     has to stop sizing itself to them. */
  .grid > .card,.grid > .tbl-card{min-width:0}
  .crp-bar{flex-wrap:wrap}
}
@media (max-width:560px){
  .live span:not(.dot){display:none}          /* keep the pulse dot, drop the word */
  .wx-badge .wx-loc{display:none}              /* keep icon + temp, drop 'London' */
  .tb-report .tb-lbl{display:none}             /* Report → icon only */
  .tb-report{padding:8px 11px}
  .topbar{padding:10px 12px}
  .canvas{padding:14px 11px 72px}
  .cr-cards{grid-template-columns:repeat(2,1fr)}   /* CAFM board: 4 stat cells → 2×2 */
}
@media (prefers-reduced-motion:reduce){body:not(.motion-forced) *{animation:none!important;transition:none!important}}

/* modal overlay */
.modal-overlay{position:fixed;inset:0;z-index:200;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);display:none;align-items:flex-start;justify-content:center;padding:40px 20px;overflow-y:auto}
.modal-overlay.open{display:flex}
.modal{width:720px;max-width:100%;background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 24px 60px rgba(0,0,0,.6);animation:fade .2s ease}
.modal.wide{width:880px}
.tb-report{display:inline-flex;align-items:center;gap:7px;padding:8px 15px;background:var(--brand);color:var(--on-brand);border:none;border-radius:var(--r);font-family:var(--f-ui);font-size:13px;font-weight:600;cursor:pointer;transition:.13s}
.tb-report:hover{background:var(--brand-hover)}
.tb-report svg{width:15px;height:15px}
.rep-grp{margin-bottom:10px;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.rep-grp:last-child{margin-bottom:0}
.rep-grp-h{font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--brand);padding:10px 12px;background:var(--panel-2);display:flex;align-items:center;gap:8px;cursor:pointer;user-select:none}
.rep-grp-h::after{content:"\25B8";margin-left:auto;color:var(--ink-mute);transition:transform .15s;font-size:12px}
.rep-grp.rep-open>.rep-grp-h::after{transform:rotate(90deg)}
.rep-grp-n{font-family:var(--f-ui);font-size:10px;color:var(--ink-mute);background:var(--bg);border:1px solid var(--line-2);border-radius:99px;padding:1px 7px;letter-spacing:0}
.rep-grp-body{display:none;padding:8px 12px 10px}
.rep-grp.rep-open>.rep-grp-body{display:block}
.rep-item{display:flex;align-items:center;gap:9px;padding:6px 4px;font-size:13.5px;color:var(--ink);cursor:pointer}
/* ID-scoped so it beats the generic .modal-body input{width:100%} rule */
#report-body input[type=checkbox],#report-body input[type=radio]{width:16px;height:16px;min-width:0;padding:0;margin:0;background:none;border:none;border-radius:0;accent-color:var(--brand);flex:0 0 auto;cursor:pointer}
.rep-item>span{flex:1}
.rep-off{opacity:.5;cursor:default}
.rep-na{font-size:11px;color:var(--ink-mute)}
.rep-basis{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;font-size:12px;color:var(--ink-dim);margin:0 0 10px;padding:9px 12px;background:var(--bg);border:1px solid var(--line);border-radius:var(--r)}
.rep-basis>span{font-family:var(--f-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute)}
.rep-format{display:flex;flex-wrap:wrap;gap:8px 18px;align-items:center;margin:0 0 16px;padding:11px 13px;background:var(--panel-2);border:1px solid var(--line-2);border-radius:var(--r)}
.rep-format>span{font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute)}
.rep-format label{display:inline-flex;align-items:center;gap:6px;cursor:pointer;color:var(--ink);font-size:13px}
.rep-format em{color:var(--ink-mute);font-style:normal;font-size:11px}
.rep-format select{background:var(--bg);border:1px solid var(--line-2);border-radius:6px;padding:5px 8px;color:var(--ink);font-family:var(--f-ui);font-size:12.5px;cursor:pointer}
.rep-basis label{display:inline-flex;align-items:center;gap:6px;cursor:pointer;color:var(--ink)}
.rep-basis input{accent-color:var(--brand);cursor:pointer}
.rep-range{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;margin:0 0 12px;padding:11px 13px;background:var(--panel-2);border:1px solid var(--line-2);border-radius:var(--r);font-size:12.5px;color:var(--ink)}
.rep-range>span{font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute)}
.rep-range label{display:inline-flex;align-items:center;gap:6px}
.rep-range input[type=date]{background:var(--bg);border:1px solid var(--line-2);border-radius:6px;padding:5px 8px;color:var(--ink);font-family:var(--f-ui);font-size:12.5px}
.rep-range button{background:var(--panel);border:1px solid var(--line-2);color:var(--ink-dim);border-radius:6px;padding:5px 10px;font-size:11.5px;cursor:pointer;font-family:var(--f-ui)}
.rep-range button:hover{color:var(--ink);border-color:var(--brand)}
.rep-range em{color:var(--ink-mute);font-style:normal;font-size:11px;margin-left:auto}
.rep-scope{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;margin:0 0 12px;padding:11px 13px;background:var(--panel-2);border:1px solid var(--line-2);border-radius:var(--r);font-size:12.5px;color:var(--ink)}
.rep-scope>span{font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute)}
.rep-scope label{display:inline-flex;align-items:center;gap:6px}
.rep-scope select{background:var(--bg);border:1px solid var(--line-2);border-radius:6px;padding:5px 8px;color:var(--ink);font-family:var(--f-ui);font-size:12.5px;max-width:200px}
.rep-loading{padding:28px 12px;text-align:center;color:var(--ink-dim);font-size:13px}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;border-bottom:1px solid var(--line)}
.modal-head h2{font-family:var(--f-disp);font-size:17px;font-weight:600}
.modal-close{background:none;border:none;color:var(--ink-dim);font-size:22px;cursor:pointer;padding:0 4px;line-height:1}
.modal-close:hover{color:var(--red)}
.modal-body{padding:22px;display:grid;grid-template-columns:1fr 1fr;gap:14px 24px;align-content:start}
.modal-body .dp-edit{display:flex;flex-direction:column;gap:6px}
.modal-body .dp-edit.full{grid-column:span 2}
.modal-body select,.modal-body input,.modal-body textarea{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:13px;font-family:var(--f-ui);padding:8px 10px;width:100%}
.modal-body textarea{min-height:60px;resize:vertical}
.modal-body select:focus,.modal-body input:focus,.modal-body textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.modal-body input[type=date]{color-scheme:dark}
/* read-only account: the value still has to be legible, it just isn't a field */
.modal-body input:disabled,.modal-body select:disabled,.modal-body textarea:disabled{background:var(--bg-2);border-color:var(--line);color:var(--ink-dim);cursor:default;opacity:1}
.modal-foot{display:flex;gap:10px;align-items:center;padding:16px 22px;border-top:1px solid var(--line)}
.modal-foot .save-status{font-family:var(--f-mono);font-size:11px;color:var(--ink-dim);margin-left:auto;max-width:62%;text-align:right;line-height:1.45}

/* ══════════ AMBIENT MOTION — overview screen ══════════ */
#v-overview{position:relative}
#v-overview>.kpis,#v-overview>.ov-ticker,#v-overview>.grid{position:relative;z-index:1}

/* 1 · aurora drift — scoped to the overview section, clipped so it never bleeds into the topbar/rail */
.aurora{position:absolute;inset:0;z-index:0;overflow:hidden;pointer-events:none;border-radius:var(--r-lg)}
.aurora::before,.aurora::after{content:"";position:absolute;border-radius:50%;filter:blur(100px);opacity:.6}
.aurora::before{width:46vw;height:46vw;left:-8vw;top:-16vw;background:radial-gradient(circle,rgba(85,156,222,.34),transparent 62%);animation:aur1 30s ease-in-out infinite}
.aurora::after{width:40vw;height:40vw;right:-10vw;bottom:-18vw;background:radial-gradient(circle,rgba(61,220,151,.20),transparent 62%);animation:aur2 40s ease-in-out infinite}
@keyframes aur1{0%,100%{transform:translate(0,0) scale(1)}33%{transform:translate(16vw,10vh) scale(1.12)}66%{transform:translate(5vw,20vh) scale(.94)}}
@keyframes aur2{0%,100%{transform:translate(0,0) scale(1)}50%{transform:translate(-14vw,-10vh) scale(1.14)}}

/* 2 · live pulse — expanding ripple on the existing status dot */
.live .dot{position:relative}
.live .dot::after{content:"";position:absolute;inset:-3px;border-radius:50%;border:1.5px solid var(--green);animation:liveRipple 2.2s ease-out infinite}
@keyframes liveRipple{0%{transform:scale(.6);opacity:.7}100%{transform:scale(2.6);opacity:0}}

/* 3 · kpi breathing glow — staggered so it rolls across the row */
#ov-kpis .kpi{animation:kpiGlow 6s ease-in-out infinite}
#ov-kpis .kpi:nth-child(2){animation-delay:1s}
#ov-kpis .kpi:nth-child(3){animation-delay:2s}
#ov-kpis .kpi:nth-child(4){animation-delay:3s}
#ov-kpis .kpi:nth-child(5){animation-delay:4s}
@keyframes kpiGlow{0%,100%{box-shadow:0 0 0 1px transparent}50%{box-shadow:0 0 26px -8px rgba(85,156,222,.45)}}
#ov-kpis .kpi .k-lab,#ov-kpis .kpi .k-val,#ov-kpis .kpi .k-sub{position:relative;z-index:2}

/* 4 · shimmer sweep + 6 · rotating ring — featured (first) kpi only */
#ov-kpis .kpi:first-child::before{content:"";position:absolute;top:0;left:-60%;width:46%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.09),transparent);transform:skewX(-18deg);z-index:1;animation:kpiSweep 7s ease-in-out infinite}
@keyframes kpiSweep{0%,12%{left:-60%}28%,100%{left:130%}}
@property --ang{syntax:'<angle>';inherits:false;initial-value:0deg}
#ov-kpis .kpi:first-child::after{content:"";position:absolute;inset:0;border-radius:var(--r-lg);padding:1px;background:conic-gradient(from var(--ang),transparent 0deg,var(--brand) 55deg,transparent 130deg,transparent 360deg);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;animation:kpiRing 9s linear infinite;z-index:1}
@keyframes kpiRing{to{--ang:360deg}}

/* 5 · sparkline draw loop */
.kpi .spark .spk-line{stroke-dasharray:1;stroke-dashoffset:1;animation:spkDraw 5s ease-in-out infinite}
@keyframes spkDraw{0%{stroke-dashoffset:1}45%,72%{stroke-dashoffset:0}100%{stroke-dashoffset:-1}}

/* 7 · activity ticker */
.ov-ticker{position:relative;overflow:hidden;border:1px solid var(--line);border-radius:var(--r-lg);background:linear-gradient(180deg,var(--panel),var(--bg-2));height:46px;display:flex;align-items:center;margin-bottom:20px}
.ov-ticker:empty{display:none}
.ov-ticker::before{content:"● LIVE FEED";position:absolute;left:0;top:0;bottom:0;z-index:2;display:flex;align-items:center;padding:0 16px;font-family:var(--f-mono);font-size:10px;letter-spacing:.14em;color:var(--brand);background:linear-gradient(90deg,var(--panel) 72%,transparent)}
.ov-ticker .tk-track{display:flex;white-space:nowrap;animation:tkScroll 46s linear infinite;will-change:transform}
.ov-ticker:hover .tk-track{animation-play-state:paused}
@keyframes tkScroll{to{transform:translateX(-50%)}}
/* animation toggle (overview) + off-state overrides */
.ov-topctl{position:relative;z-index:2;display:flex;align-items:center;justify-content:flex-end;gap:10px;margin-bottom:8px}
.ov-topctl .sw-lab{font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
.switch{position:relative;display:inline-block;width:38px;height:21px;cursor:pointer;flex:0 0 auto}
.switch input{opacity:0;width:0;height:0;position:absolute;margin:0}
.sw-track{position:absolute;inset:0;background:var(--line-2);border-radius:20px;transition:.18s}
.sw-track::before{content:"";position:absolute;width:15px;height:15px;left:3px;top:3px;background:var(--ink-dim);border-radius:50%;transition:.18s}
.switch input:checked + .sw-track{background:var(--brand)}
.switch input:checked + .sw-track::before{transform:translateX(17px);background:var(--on-brand)}
body.anim-off .aurora{display:none}
body.anim-off #ov-kpis .kpi,
body.anim-off .ov-ticker .tk-track,
body.anim-off .dot,
body.anim-off .kpi .spark .spk-line{animation:none!important}
body.anim-off #ov-kpis .kpi:first-child::before,
body.anim-off #ov-kpis .kpi:first-child::after,
body.anim-off .live .dot::after{animation:none!important;display:none}
/* CAFM's own switch (CAFM options > Display). Separate from anim-off because
   the P1 pulse is not decoration — it encodes how much of a job's SLA window
   has burned — so somebody may well want the rest of the app calm and this
   still moving, or the reverse on a wallboard. Colours and numbers are
   untouched either way; only the movement stops. */
body.cafm-noanim .p1-live,
body.cafm-noanim .cr-job-live,
body.cafm-noanim .cr-dot,
body.cafm-noanim .pulse-t{animation:none!important}
body.anim-off .kpi .spark .spk-line{stroke-dashoffset:0}
/* loading shimmer — a data-loading indicator, so it stays on even with ambient animations off */
.chart-h.skel-on{background:var(--panel-2);border-radius:8px;overflow:hidden}
.chart-h.skel-on>canvas{visibility:hidden}
.chart-h.skel-on::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,rgba(130,165,215,.13),transparent);animation:shimmer 1.25s ease-in-out infinite}
@keyframes shimmer{100%{transform:translateX(100%)}}
.tk-item{display:inline-flex;align-items:center;gap:8px;margin-right:40px;font-family:var(--f-mono);font-size:12px;color:var(--ink-dim)}
.tk-item b{color:var(--brand);font-weight:600}
.tk-item .tk-sys{color:var(--ink-mute)}
.tk-dot{width:7px;height:7px;border-radius:50%;background:var(--amber);flex:none}
.tk-dot.ok{background:var(--green)}
/* ── RCC dashboard ── */
.rcc-tabs{display:flex;gap:4px;margin-bottom:16px;border-bottom:1px solid var(--line);padding-bottom:0}
.rcc-tab{padding:9px 18px;font-family:var(--f-ui);font-size:13px;font-weight:500;color:var(--ink-dim);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:.15s}
.rcc-tab:hover{color:var(--ink)}
.rcc-tab.active{color:var(--brand);border-bottom-color:var(--brand)}
.rcc-grid{display:grid;grid-template-columns:repeat(24,1fr);grid-auto-rows:32px;gap:12px}
.rcc-panel{background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:14px 16px;display:flex;flex-direction:column;overflow:hidden;min-height:0}
.rcc-panel .rp-head{font-family:var(--f-mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:10px;flex:none}
.rcc-panel .rp-body{flex:1;min-height:0;position:relative;display:flex;flex-direction:column;justify-content:center}
.rcc-panel canvas{max-width:100%!important;max-height:100%!important}
.rcc-loading{color:var(--ink-mute);font-family:var(--f-mono);font-size:11px;text-align:center;padding:20px 0}
.rcc-error{color:var(--red);font-family:var(--f-mono);font-size:11px;padding:14px}
/* state-timeline */
.stl-row{display:flex;align-items:center;gap:10px;height:26px;margin-bottom:6px}
.stl-row:last-child{margin-bottom:0}
.stl-label{width:56px;flex:none;font-family:var(--f-mono);font-size:11px;color:var(--ink-dim);text-align:right}
.stl-bar{flex:1;height:22px;position:relative;background:var(--bg-2);border-radius:4px;overflow:hidden}
.stl-seg{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10px;color:#06101f;font-weight:600;overflow:hidden}
.stl-axis{display:flex;justify-content:space-between;margin-top:8px;font-family:var(--f-mono);font-size:9.5px;color:var(--ink-mute);padding-left:66px}
.stl-legend{display:flex;gap:14px;font-family:var(--f-mono);font-size:10px;color:var(--ink-dim);margin-top:10px;flex-wrap:wrap;justify-content:center}
.stl-legend .lg{display:inline-flex;align-items:center;gap:6px}
.stl-legend .lg span{width:12px;height:10px;border-radius:2px;display:inline-block}
/* stat card */
.rst-val{font-family:var(--f-disp);font-weight:600;font-size:44px;line-height:1.05;letter-spacing:-.02em;text-align:center}
.rst-unit{font-family:var(--f-mono);font-size:11px;color:var(--ink-mute);text-align:center;margin-top:6px;letter-spacing:.1em;text-transform:uppercase}
.rst-time{font-family:var(--f-mono);font-size:10px;color:var(--ink-mute);text-align:center;margin-top:8px;opacity:.7}
/* gauge */
.rgauge{display:grid;grid-template-columns:repeat(auto-fit,minmax(90px,1fr));gap:14px;align-items:center;justify-items:center}
.rg-item{display:flex;flex-direction:column;align-items:center;gap:6px}
.rg-ring{width:76px;height:76px;position:relative;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:12px;font-weight:700}
.rg-ring svg{position:absolute;inset:0;transform:rotate(-90deg)}
.rg-name{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute);letter-spacing:.08em}
/* ── RCC Dashboard (multi-tenant alert overview) ── */
.rccd-row{display:grid;grid-template-columns:120px repeat(5,minmax(70px,1fr)) 340px;gap:14px;align-items:center;background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:14px 18px;margin-bottom:14px}
.rccd-tenant{font-family:var(--f-disp);font-size:20px;font-weight:600;letter-spacing:-.01em;color:var(--brand);line-height:1.1}
.rccd-tenant .rccd-sub{display:block;font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;color:var(--ink-mute);text-transform:uppercase;margin-top:3px;font-weight:400}
.rccd-stat{background:var(--bg);border:1px solid var(--line);border-radius:var(--r);padding:8px 10px;text-align:center;min-height:60px;display:flex;flex-direction:column;justify-content:center;transition:.15s;cursor:pointer}
.rccd-stat:hover{border-color:var(--brand);transform:translateY(-1px);box-shadow:0 4px 12px rgba(85,156,222,.15)}
.rccd-stat .rccd-lab{font-family:var(--f-mono);font-size:9px;color:var(--ink-mute);letter-spacing:.1em;text-transform:uppercase;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rccd-stat .rccd-val{font-family:var(--f-disp);font-size:22px;font-weight:600;line-height:1;letter-spacing:-.01em}
.rccd-stat.tone-ok    .rccd-val{color:var(--green)}
.rccd-stat.tone-warn  .rccd-val{color:var(--amber)}
.rccd-stat.tone-err   .rccd-val{color:var(--red)}
.rccd-stat.tone-mute  .rccd-val{color:var(--ink-mute);font-size:15px}
.rccd-chart{position:relative;height:110px;min-width:0}
@media (max-width: 1200px){
  .rccd-row{grid-template-columns:1fr;gap:10px}
  .rccd-chart{height:120px}
}
/* Per-building breakdown: expandable sub-rows under a tenant row. */
.rccd-group{margin-bottom:14px}
.rccd-group .rccd-row{margin-bottom:0}
.rccd-caret{display:inline-block;width:14px;margin-right:5px;color:var(--ink-mute);cursor:pointer;font-size:11px;transition:.12s;user-select:none}
.rccd-caret:hover{color:var(--brand)}
.rccd-children{display:none}
.rccd-children.open{display:block}
.rccd-subrow{display:grid;grid-template-columns:120px repeat(5,minmax(70px,1fr)) 340px;gap:14px;align-items:center;background:var(--bg-2);border:1px solid var(--line);border-top:none;padding:7px 18px}
.rccd-subrow:first-child{border-top:1px dashed var(--line-2)}
.rccd-bname{font-family:var(--f-mono);font-size:12px;color:var(--ink-dim);padding-left:19px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rccd-substat{min-height:42px;padding:5px 8px}
.rccd-substat .rccd-val{font-size:16px}
.rccd-subchart{min-width:0}
@media (max-width: 1200px){ .rccd-subrow{grid-template-columns:1fr;gap:8px} }
/* Third level: Acutro-style full lifecycle breakdown for one building. */
.rccd-bcaret{display:inline-block;width:11px;margin-right:5px;color:var(--ink-mute);cursor:pointer;font-size:9px;transition:.12s;user-select:none}
.rccd-bcaret:hover{color:var(--brand)}
.rccd-bdetail{display:none}
.rccd-bdetail.open{display:block}
.rccd-bd-inner{background:var(--bg);border:1px solid var(--line);border-top:none;padding:12px 18px 14px 38px}
.rccd-bd-loading{color:var(--ink-mute);font-family:var(--f-mono);font-size:11px}
.rccd-bd-head{font-family:var(--f-mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:10px;display:flex;align-items:center;gap:12px}
.rccd-bd-total{color:var(--ink);font-weight:600;letter-spacing:.04em}
.rccd-bd-bar{display:flex;height:10px;border-radius:5px;overflow:hidden;background:var(--bg-2);margin-bottom:11px}
.rccd-bd-bar span{display:block;height:100%}
.rccd-bd-legend{display:flex;flex-wrap:wrap;gap:8px 18px;font-family:var(--f-mono);font-size:11.5px;color:var(--ink-dim)}
.rccd-bd-item{display:inline-flex;align-items:center;gap:7px}
.rccd-bd-item i{width:10px;height:10px;border-radius:2px;display:inline-block;flex:none}
.rccd-bd-item b{color:var(--ink);font-weight:600}
/* Overview · Performance (super-admin) */
.ovp-list{display:flex;flex-direction:column;gap:1px}
.ovp-li{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:7px 4px;border-bottom:1px solid var(--line);font-size:13px;color:var(--ink-dim)}
.ovp-li:last-child{border-bottom:none}
.ovp-li>span{display:inline-flex;align-items:center}
.ovp-li i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:8px;flex:none}
.ovp-li b{font-family:var(--f-mono);color:var(--ink);font-weight:600}
.ovp-li b.bad{color:var(--red)}
#t-ovp-contract,#t-ovp-owner{width:100%;border-collapse:collapse;font-size:12.5px}
#t-ovp-contract th,#t-ovp-owner th{text-align:right;font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);padding:8px 12px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--panel);white-space:nowrap}
#t-ovp-contract td,#t-ovp-owner td{text-align:right;font-family:var(--f-mono);padding:7px 12px;border-bottom:1px solid var(--line);color:var(--ink-dim);white-space:nowrap}
#t-ovp-contract th:first-child,#t-ovp-owner th:first-child,#t-ovp-contract td:first-child,#t-ovp-owner td:first-child{text-align:left;color:var(--ink)}
#t-ovp-contract tbody tr:hover,#t-ovp-owner tbody tr:hover{background:var(--bg-2)}
/* Customer -> CAFM site-group mapping (Settings) */
.cjc-grow{display:flex;gap:14px;align-items:flex-start;padding:8px 0;border-bottom:1px solid var(--line)}
.cjc-grow:last-child{border-bottom:none}
.cjc-gcust{min-width:110px;color:var(--ink);font-weight:600}
.cjc-gopts{display:flex;flex-wrap:wrap;gap:6px 16px;flex:1}
.cjc-gopt{display:inline-flex;align-items:center;gap:6px;color:var(--ink-dim);cursor:pointer}
.cjc-gopt input{accent-color:var(--brand);cursor:pointer}
.cjc-pcard{border:1px solid var(--line);border-radius:8px;margin-bottom:8px;overflow:hidden}
.cjc-phead{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;background:var(--panel-2);user-select:none}
.cjc-phead:hover{background:var(--panel)}
.cjc-pcaret{color:var(--ink-mute);font-size:10px;transition:transform .15s;flex:0 0 auto}
.cjc-pcard.open .cjc-pcaret{transform:rotate(90deg)}
.cjc-pstatus{font-size:11px;color:var(--ink-mute)}
.cjc-pstatus.on{color:var(--brand);font-weight:600}
.cjc-pcount{margin-left:auto;font-size:10.5px;color:var(--ink-mute)}
.cjc-pbody{padding:10px 12px;display:flex;flex-wrap:wrap;gap:8px 16px;border-top:1px solid var(--line)}
/* Active / Completed segmented toggle (both RCC dashboard tabs) */
.rccd-modeseg{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--r);overflow:hidden;flex:none}
.rccd-modebtn{appearance:none;background:var(--bg);border:none;color:var(--ink-dim);font-family:var(--f-ui);font-size:12px;font-weight:600;padding:7px 15px;cursor:pointer;transition:.12s}
.rccd-modebtn+.rccd-modebtn{border-left:1px solid var(--line-2)}
.rccd-modebtn.active{background:var(--brand);color:#fff}
.rccd-modebtn:not(.active):hover{color:var(--ink)}
/* Expandable rows — shared by the alert and intervention drill modals. The
   collapsed row keeps its one-line ellipsis; the detail row carries the full
   text plus every field the query returned. */
.rcx-row{cursor:pointer}
.rcx-row:hover{background:rgba(85,156,222,.06)}
.rcx-row.rcx-open{background:rgba(85,156,222,.09)}
.rcx-caret{display:inline-block;width:9px;color:var(--ink-mute);transition:transform .15s;margin-right:7px}
.rcx-row.rcx-open .rcx-caret{transform:rotate(90deg);color:var(--brand)}
.rcx-det{display:none}
.rcx-det.open{display:table-row}
.rcx-det>td{background:var(--bg);padding:14px 20px 16px 38px!important;border-left:2px solid var(--brand)}
.rcx-desc{font-size:13px;line-height:1.6;color:var(--ink);white-space:pre-wrap;margin-bottom:12px}
.rcx-kv{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:5px 18px;font-family:var(--f-mono);font-size:11px}
.rcx-k{color:var(--ink-mute);letter-spacing:.08em;text-transform:uppercase;white-space:nowrap}
.rcx-v{color:var(--ink-dim);word-break:break-word;white-space:pre-wrap}
/* CAFM jobs raised against an intervention — lives in its expanded row */
.rccj{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.rccj-head{font-family:var(--f-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute)}
.rccj-links{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-family:var(--f-mono);font-size:11px}
.rccj-muted{color:var(--ink-mute)}
.rccj-chip{display:inline-flex;align-items:center;gap:8px;background:var(--panel-2);border:1px solid var(--line-2);border-radius:99px;padding:3px 10px;color:var(--ink-dim)}
.rccj-chip b{color:var(--brand);font-weight:600}
.rccj-chip.clickable{cursor:pointer;transition:.12s}
.rccj-chip.clickable:hover{border-color:var(--brand);background:rgba(85,156,222,.1)}
/* Intervention log column widths. Ref, dates and the CAFM cell are fixed-shape
   values that shouldn't wrap; Building and Asset get a sensible ceiling and
   ellipsis instead of squashing into three lines. Description stays truncated —
   you open the row to read it. */
/* Fixed layout: the table always fits its container — no sideways scrolling.
   Columns are shares of the width, and anything too long is cut with an
   ellipsis (the full value is on hover, and the row opens for the detail). */
#iv-table{table-layout:fixed;width:100%}
#iv-table th,#iv-table td{vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#iv-table td.trunc{max-width:none}
/* The select column is child 1, so EVERY rule below is one further along than
   it used to be. When bulk edit added that column these were left pointing at
   the old positions: Description inherited Owner's 8% and became unreadable,
   Raised inherited Est. kWh's 6% and truncated its own dates, and CAFM — now
   child 12 — matched no rule at all, so the table overflowed its container and
   pushed CAFM off the right-hand edge behind a scrollbar.
   Widths still total 100%, so the table fits without scrolling sideways. */
#iv-table th:nth-child(1){width:3%}     /* Select     */
#iv-table th:nth-child(2){width:8%}     /* Ref        */
#iv-table th:nth-child(3){width:12%}    /* Building   */
#iv-table th:nth-child(4){width:7%}     /* System     */
#iv-table th:nth-child(5){width:10%}    /* Asset      */
#iv-table th:nth-child(6){width:19%}    /* Description*/
#iv-table th:nth-child(7){width:8%}     /* Owner      */
#iv-table th:nth-child(8){width:7%}     /* Priority   */
#iv-table th:nth-child(9){width:7%}     /* Status     */
#iv-table th:nth-child(10){width:7%}    /* Raised     */
#iv-table th:nth-child(11){width:5%}    /* Est. kWh   */
#iv-table th:nth-child(12){width:7%}    /* CAFM       */
.ivc-cafm{font-family:var(--f-mono);font-size:11.5px;line-height:1.45}
.ivc-cafm .ivc-job{color:var(--brand);cursor:pointer}
.ivc-cafm .ivc-job:hover{text-decoration:underline}
.ivc-cafm .ivc-st{display:block;font-size:10px;letter-spacing:.06em}
.ivc-cafm .ivc-untracked{color:var(--ink-mute)}
/* recorded on the record but not tracked here — readable, just not ours yet */
.ivc-cafm .ivc-rec{color:var(--ink-dim);cursor:pointer;border-bottom:1px dotted var(--line-2)}
.ivc-cafm .ivc-rec:hover{color:var(--brand);border-bottom-color:var(--brand)}
.rccj-chip.test{border-style:dashed;border-color:rgba(61,220,151,.45)}
.rccj-chip i{font-style:normal;font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--green);border:1px solid rgba(61,220,151,.45);border-radius:99px;padding:1px 6px}
.rccj-btn{appearance:none;background:var(--panel-2);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-ui);font-size:12px;font-weight:600;padding:6px 12px;cursor:pointer;transition:.12s}
.rccj-btn:hover{border-color:var(--brand);color:var(--brand)}
/* A comment/message in a job's audit trail */
.cjob-note{margin-top:5px;padding:7px 11px;border-left:2px solid var(--brand);background:rgba(85,156,222,.06);border-radius:0 var(--r) var(--r) 0;font-size:12.5px;line-height:1.55;color:var(--ink);white-space:pre-wrap}
/* Per-column filters in the intervention drill */
.rcci-frow th{padding:4px 8px!important;background:var(--bg-2)}
.rcci-flt{width:100%;padding:5px 7px;background:var(--bg);border:1px solid var(--line);border-radius:4px;color:var(--ink);font-family:var(--f-mono);font-size:11px}
.rcci-flt:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.rccj-linkbox{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}
.rccj-linkbox input{width:120px;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-mono);font-size:12px;padding:6px 9px}
.rccj-linkbox input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.rccj-err{color:var(--red);font-size:11px;max-width:320px;line-height:1.4}
.rccj-orphan{display:inline-flex;align-items:center}
.rccj-adopt{border-style:dashed;color:var(--amber);border-right-width:0;border-radius:var(--r) 0 0 var(--r)}
.rccj-adopt:hover{border-color:var(--amber);color:var(--amber)}
.rccj-forget{border-style:dashed;color:var(--ink-mute);border-radius:0 var(--r) var(--r) 0;padding:6px 9px;line-height:1}
.rccj-forget:hover{border-color:var(--red);color:var(--red)}
.rccj-warn{font-size:12px;line-height:1.55;color:var(--amber);background:rgba(243,167,18,.08);border:1px solid rgba(243,167,18,.35);border-radius:var(--r);padding:9px 12px}
.rccj-warn.test{color:var(--green);background:rgba(61,220,151,.08);border-color:rgba(61,220,151,.35)}
#rccj-modal textarea{width:100%;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-ui);font-size:13px;padding:9px 11px;resize:vertical}
/* the collapsed interface flags on a CAFM job — present, not prominent */
.cjob-more{margin-top:14px}
.cjob-more summary{cursor:pointer;font-family:var(--f-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);padding:6px 0;list-style:none}
.cjob-more summary::-webkit-details-marker{display:none}
.cjob-more summary::before{content:"▸ ";color:var(--ink-mute)}
.cjob-more[open] summary::before{content:"▾ "}
.cjob-more summary:hover{color:var(--ink-dim)}
.cjob-more .rcx-kv{margin-top:6px;opacity:.75}
/* ── P1 response-SLA pulse ───────────────────────────────────────────────────
   Shared by the risk-board P1 cards (.cr-card.p1) and the jeopardy hero KPIs
   (.jeo-kpi). p1Pulse() sets --p1-* inline from how far the soonest P1 is
   through its OWN response SLA window (raised → attendanceDueAt), so it scales
   to any contract (4h Apple, 1h others); p1Tick ticks it live. The nearer the
   deadline, the faster the pulse (--p1-dur), the wider and hotter the glow
   (--p1-spread/--p1-alpha), and the more it shifts from the P1 purple toward
   alarm red (--p1-rgb). The inset half of the glow hugs the border so urgency
   still reads inside the panels' overflow:hidden clip; the outer half blooms on
   the unclipped heroes. */
.p1-live{position:relative}
.p1-live::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  animation:p1pulse var(--p1-dur,2.6s) ease-in-out infinite}
@keyframes p1pulse{
  0%,100%{box-shadow:inset 0 0 3px 0 rgba(var(--p1-rgb,163,113,247),calc(var(--p1-alpha,.3)*.35)),
                     0 0 0 0 rgba(var(--p1-rgb,163,113,247),0)}
  50%    {box-shadow:inset 0 0 7px 0 rgba(var(--p1-rgb,163,113,247),var(--p1-alpha,.3)),
                     0 0 var(--p1-spread,14px) 1px rgba(var(--p1-rgb,163,113,247),var(--p1-alpha,.3))}
}
/* Past SLA: hold a red border so the breach reads even between pulses. */
.cr-card.p1.p1-breached{border-color:rgba(255,66,66,.9)}
.jeo-kpi.p1-breached{border-color:rgba(255,66,66,.55)}
/* Motion-sensitive users get the same urgency as a steady glow, no flashing. */
@media (prefers-reduced-motion:reduce){
  .p1-live::after{animation:none;
    box-shadow:inset 0 0 6px 0 rgba(var(--p1-rgb,163,113,247),var(--p1-alpha,.3)),
               0 0 calc(var(--p1-spread,14px)*.7) 0 rgba(var(--p1-rgb,163,113,247),calc(var(--p1-alpha,.3)*.85))}
}
/* ── Per-job time-to-breach pulse ──────────────────────────────
   Each risk-board job row glows on the same clock as the P1 hero, but scaled to
   THAT job's own completion deadline (crJobPulse, ticked live). Inset-only so
   the glow stays inside the list; P1 rows ride the purple→red ramp, others
   amber→red; nearer the breach = faster + hotter; steady red once breached. */
.cr-job-live{position:relative}
.cr-job-live::after{content:"";position:absolute;inset:-1px 0;pointer-events:none;border-radius:4px;
  animation:crjobpulse var(--p1-dur,2.8s) ease-in-out infinite}
@keyframes crjobpulse{
  0%,100%{box-shadow:inset 0 0 4px 0 rgba(var(--p1-rgb,224,165,58),calc(var(--p1-alpha,.3)*.35))}
  50%    {box-shadow:inset 0 0 11px 0 rgba(var(--p1-rgb,224,165,58),var(--p1-alpha,.3))}
}
.cr-job-live.p1-breached::after{animation:none;box-shadow:inset 0 0 9px 0 rgba(255,66,66,.5)}
@media (prefers-reduced-motion:reduce){
  .cr-job-live::after{animation:none;box-shadow:inset 0 0 8px 0 rgba(var(--p1-rgb,224,165,58),var(--p1-alpha,.3))}
}

/* ── Dialogs ──
   Replaces window.alert / confirm / prompt. Those are synchronous and blocking,
   they cannot be styled, they are invisible in Present/kiosk mode (a wall board
   showing a browser chrome dialog nobody is standing next to), and Chrome
   suppresses repeats with a "don't show again" checkbox that silently disables
   the confirmation on a destructive action. The destructive ones here write
   through to the client's Smartsheet, so being suppressible is not acceptable. */
#dlg-overlay{position:fixed;inset:0;z-index:600;display:none;align-items:center;
  justify-content:center;padding:24px;background:rgba(0,0,0,.62);backdrop-filter:blur(3px)}
#dlg-overlay.on{display:flex}
.dlg{width:460px;max-width:100%;background:linear-gradient(180deg,var(--panel),var(--bg-2));
  border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:0 24px 60px rgba(0,0,0,.6);
  animation:fade .16s ease;overflow:hidden}
.dlg-h{padding:18px 20px 0;font-family:var(--f-display,var(--f-ui));font-size:16px;
  font-weight:600;color:var(--ink)}
.dlg-b{padding:10px 20px 18px;font-family:var(--f-ui);font-size:13.5px;line-height:1.55;
  color:var(--ink-dim);white-space:pre-wrap}
.dlg-b b{color:var(--ink);font-weight:600}
.dlg-input{width:100%;margin-top:12px;padding:10px 12px;background:var(--bg);
  border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);
  font-family:var(--f-ui);font-size:13.5px}
.dlg-input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.dlg-err{margin-top:8px;font-family:var(--f-mono);font-size:11.5px;color:var(--red);display:none}
.dlg-err.on{display:block}
.dlg-f{display:flex;justify-content:flex-end;gap:9px;padding:14px 20px;
  background:var(--panel-2);border-top:1px solid var(--line)}
.dlg-f button{padding:9px 18px;border-radius:var(--r);font-family:var(--f-ui);
  font-size:13px;font-weight:600;cursor:pointer;border:1px solid var(--line-2);
  background:var(--raised);color:var(--ink);transition:.13s}
.dlg-f button:hover{border-color:var(--brand)}
.dlg-f .dlg-go{background:var(--brand);color:var(--on-brand);border-color:var(--brand)}
.dlg-f .dlg-go:hover{background:var(--brand-hover)}
.dlg-f .dlg-go.danger{background:var(--red);border-color:var(--red);color:#2a0808}
.dlg-f .dlg-go.danger:hover{filter:brightness(1.1)}
@media (max-width:560px){.dlg-f{flex-direction:column-reverse}.dlg-f button{width:100%}}

/* The undo bar borrows the failure bar's geometry (same place, same shape) but
   is a notice, not an error — hence the green edge. */
#undobar{position:fixed;left:50%;bottom:18px;transform:translateX(-50%);z-index:401;
  display:none;align-items:center;gap:12px;box-sizing:border-box;
  max-width:min(560px,calc(100vw - 28px));padding:11px 12px 11px 14px;
  background:var(--panel-2);border:1px solid var(--line-2);border-left:3px solid var(--green);
  border-radius:var(--r);box-shadow:0 14px 40px rgba(0,0,0,.45);
  font-family:var(--f-ui);font-size:13px;color:var(--ink)}
#undobar.on{display:flex}
#undo-msg{flex:1;min-width:0}
/* If a read fails at the same moment, the failure bar is the more urgent of
   the two — sit above it rather than overlapping. */
#neterr.on ~ #undobar.on,#undobar.on:has(~ #neterr.on){bottom:76px}
@media (max-width:560px){#undobar{left:10px;right:10px;transform:none;max-width:none}}

/* ── Weather-normalised energy ── */
.en-card{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--line-2);
  border-radius:var(--r-lg);padding:15px 18px;margin-bottom:11px}
.en-card.en-bad{border-left-color:var(--red)}
.en-card.en-warn{border-left-color:var(--amber)}
.en-card.en-ok{border-left-color:var(--green)}
.en-card.en-skip{opacity:.6}
.en-h{font-family:var(--f-ui);font-size:14px;color:var(--ink);display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.en-tag{font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-mute);border:1px solid var(--line-2);border-radius:4px;padding:2px 7px}
.en-fit{margin-left:auto;font-family:var(--f-mono);font-size:11px;color:var(--ink-dim)}
.en-nums{display:flex;flex-wrap:wrap;gap:22px;margin-top:11px}
.en-nums span{font-family:var(--f-mono);font-size:13px;color:var(--ink)}
.en-nums i{display:block;font-family:var(--f-ui);font-style:normal;font-size:10.5px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:3px}
.en-flags{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.en-flag{font-family:var(--f-mono);font-size:11px;padding:3px 8px;border-radius:5px;
  border:1px solid var(--line-2);background:var(--panel-2);color:var(--ink-dim)}
.en-flag.over{border-color:var(--red);color:var(--red)}
.en-flag.under{border-color:var(--green);color:var(--green)}
.en-why{font-family:var(--f-ui);font-size:12px;color:var(--ink-mute);margin-top:10px;line-height:1.55}

/* ── Data quality board ── */
.dq-card{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--line-2);
  border-radius:var(--r-lg);padding:16px 18px;margin-bottom:12px}
.dq-card.dq-bad{border-left-color:var(--red)}
.dq-card.dq-warn{border-left-color:var(--amber)}
.dq-card.dq-info{border-left-color:var(--brand)}
.dq-card.dq-ok{border-left-color:var(--green);opacity:.62}
.dq-h{display:flex;align-items:flex-start;gap:14px}
.dq-n{font-family:var(--f-mono);font-size:26px;font-weight:600;line-height:1;min-width:58px;color:var(--ink)}
.dq-card.dq-ok .dq-n{color:var(--green)}
.dq-t{font-family:var(--f-ui);font-size:14px;font-weight:600;color:var(--ink)}
.dq-i{font-family:var(--f-ui);font-size:12.5px;color:var(--ink-dim);margin-top:3px;line-height:1.5}
.dq-s{display:flex;flex-wrap:wrap;gap:6px;margin:12px 0 0 72px}
.dq-s span{font-family:var(--f-mono);font-size:11px;padding:3px 8px;background:var(--panel-2);
  border:1px solid var(--line);border-radius:5px;color:var(--ink-dim)}
.dq-s .dq-more{border-style:dashed;color:var(--ink-mute)}
.dq-f{margin:10px 0 0 72px;font-family:var(--f-ui);font-size:12px;color:var(--ink-mute);font-style:italic}
@media (max-width:560px){.dq-s,.dq-f{margin-left:0}}

/* ── Alerts board ── the data-quality card plus the two things that turn a
   finding into work: whose it is, and when it is due. Indented to 72px so the
   owner line hangs under the title rather than under the count. */
.al-act{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:12px 0 0 72px}
.al-un{font-family:var(--f-ui);font-size:12.5px;color:var(--ink-mute);font-style:italic}
.al-own{display:flex;align-items:center;flex-wrap:wrap;gap:7px;font-family:var(--f-ui);
  font-size:12.5px;color:var(--ink-dim)}
.al-sep{color:var(--line-2)}
.al-st{font-family:var(--f-mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;
  padding:2px 7px;border-radius:4px;border:1px solid var(--line);background:var(--panel-2)}
.al-st-in_progress{border-color:var(--brand);color:var(--brand)}
.al-st-blocked{border-color:var(--red);color:var(--red)}
.al-st-done{border-color:var(--green);color:var(--green)}
.al-late{color:var(--red);font-weight:600}
.al-done{color:var(--green)}
.al-prog{font-family:var(--f-mono);font-size:11px;color:var(--ink-mute)}
.al-note-r{font-style:italic;color:var(--ink-mute)}
.al-form{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end;margin:14px 0 0 72px;
  padding:14px;background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r-lg)}
.al-form label{display:flex;flex-direction:column;gap:5px;font-family:var(--f-ui);font-size:11px;
  text-transform:uppercase;letter-spacing:.06em;color:var(--ink-mute)}
.al-form .al-wide{flex:1 1 240px}
.al-form input,.al-form select{font-family:var(--f-ui);font-size:13px}
.al-formbtns{display:flex;align-items:center;gap:8px;flex:1 1 100%}
.al-danger{color:var(--red)}
.al-recs{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.al-recs-h{display:flex;align-items:center;gap:12px;margin:0 0 4px 72px;
  font-family:var(--f-ui);font-size:12.5px;color:var(--ink-dim)}
.al-recs-h button{margin-left:auto}
@media (max-width:560px){.al-act,.al-form,.al-recs-h{margin-left:0}}

/* ── Import plan ── what the file will do, field by field, before it does it. */
.ivp{margin-top:10px;max-height:440px;overflow-y:auto;border:1px solid var(--line);
  border-radius:var(--r-lg);background:var(--panel);padding:12px 14px;text-align:left}
.ivp-h{display:flex;flex-wrap:wrap;align-items:center;gap:7px;font-family:var(--f-ui);
  font-size:13px;color:var(--ink);padding-bottom:9px;border-bottom:1px solid var(--line)}
.ivp-chip{font-family:var(--f-mono);font-size:10.5px;text-transform:uppercase;
  letter-spacing:.05em;padding:2px 7px;border-radius:4px;border:1px solid var(--line);
  background:var(--panel-2);color:var(--ink-dim)}
.ivp-new{border-color:var(--green);color:var(--green)}
.ivp-upd{border-color:var(--brand);color:var(--brand)}
.ivp-del,.ivp-bad{border-color:var(--red);color:var(--red)}
.ivp-cf{border-color:var(--amber);color:var(--amber)}
.ivp-sec{margin-top:12px}
.ivp-st{font-family:var(--f-ui);font-size:11px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--ink-mute);margin-bottom:6px}
.ivp-cf-sec .ivp-st{color:var(--amber)}
.ivp-del-sec .ivp-st{color:var(--red)}
.ivp-row{padding:6px 0;border-top:1px solid var(--line-2)}
.ivp-ref{font-family:var(--f-mono);font-size:12px;color:var(--ink);
  display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.ivp-b{font-family:var(--f-ui);font-size:11.5px;color:var(--ink-mute)}
.ivp-f{display:flex;flex-wrap:wrap;align-items:baseline;gap:7px;margin:3px 0 0 14px;
  font-family:var(--f-ui);font-size:12px}
.ivp-f code{font-family:var(--f-mono);font-size:11px;color:var(--ink-mute);min-width:130px}
.ivp-from,.ivp-theirs{color:var(--ink-mute);text-decoration:line-through}
.ivp-theirs{text-decoration:none;color:var(--amber)}
.ivp-arrow{color:var(--ink-mute)}
.ivp-to,.ivp-yours{color:var(--ink);font-weight:600}
.ivp-more{font-family:var(--f-ui);font-size:11.5px;color:var(--ink-mute);
  font-style:italic;padding:6px 0 0}
.ivp i{color:var(--ink-mute)}
/* The decision lives at the bottom of the plan, so reaching it means having
   scrolled past what it is deciding about. */
.ivp-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px;
  padding-top:12px;border-top:1px solid var(--line);position:sticky;bottom:-12px;
  background:var(--panel)}
.ivp-foot .ivp-danger{background:var(--red);border-color:var(--red)}
.ivp-none{font-family:var(--f-ui);font-size:12px;color:var(--ink-mute);font-style:italic}

/* ── Command palette (styles) ── see palOpen() for the behaviour. */
#pal-overlay{position:fixed;inset:0;z-index:650;display:none;align-items:flex-start;
  justify-content:center;padding:12vh 20px 20px;background:rgba(0,0,0,.55);backdrop-filter:blur(3px)}
#pal-overlay.on{display:flex}
.pal{width:620px;max-width:100%;background:linear-gradient(180deg,var(--panel),var(--bg-2));
  border:1px solid var(--line-2);border-radius:var(--r-lg);
  box-shadow:0 28px 70px rgba(0,0,0,.6);overflow:hidden;animation:fade .14s ease}
#pal-input{width:100%;box-sizing:border-box;padding:16px 18px;background:none;border:none;
  border-bottom:1px solid var(--line);color:var(--ink);font-family:var(--f-ui);font-size:15px}
#pal-input:focus{outline:none;border-bottom-color:var(--brand);box-shadow:0 1px 0 0 var(--brand)}
#pal-input::placeholder{color:var(--ink-mute)}
.pal-list{max-height:min(52vh,440px);overflow-y:auto}
.pal-row{display:flex;align-items:center;gap:12px;padding:10px 18px;cursor:pointer;
  font-family:var(--f-ui);font-size:13.5px;color:var(--ink)}
.pal-row.sel{background:var(--panel-2)}
.pal-row .pal-k{font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--brand);min-width:74px;flex:none}
.pal-row .pal-sub{margin-left:auto;font-family:var(--f-mono);font-size:11px;color:var(--ink-mute);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:44%}
.pal-row mark{background:none;color:var(--brand);font-weight:600}
.pal-empty{padding:22px 18px;font-family:var(--f-ui);font-size:13px;color:var(--ink-mute)}
.pal-foot{display:flex;gap:16px;padding:9px 18px;background:var(--panel-2);
  border-top:1px solid var(--line);font-family:var(--f-ui);font-size:11px;color:var(--ink-mute)}
.pal-foot kbd{font-family:var(--f-mono);font-size:10px;padding:1px 5px;margin-right:3px;
  background:var(--raised);border:1px solid var(--line-2);border-radius:4px}
@media (max-width:560px){#pal-overlay{padding:6vh 10px 10px}}

/* ── Bulk selection ── */
.selbar{display:none;align-items:center;gap:10px;padding:10px 14px;
  background:var(--panel-2);border-bottom:1px solid var(--line-2);
  font-family:var(--f-ui);font-size:12.5px;color:var(--ink)}
.selbar.on{display:flex}
.selbar #iv-selcount{font-family:var(--f-mono);font-size:11.5px;color:var(--brand);margin-right:auto}
.iv-selcol{width:34px;text-align:center;padding-left:10px!important;padding-right:0!important}
.iv-selcol input{accent-color:var(--brand);cursor:pointer;width:15px;height:15px}
th.iv-selcol{cursor:default}
tr.iv-picked td{background:color-mix(in srgb,var(--brand) 12%,transparent)}
body.ro .iv-selcol,body.ro .selbar{display:none!important}

/* ── Table pager ── */
.pager{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 14px;
  border-top:1px solid var(--line);font-family:var(--f-ui);font-size:12.5px;color:var(--ink-dim)}
.pager:empty{display:none}
.pager .pg-range{margin-right:auto;font-family:var(--f-mono);font-size:11.5px}
.pager .pg-range b{color:var(--ink);font-weight:500}
.pager button{padding:6px 12px;background:var(--panel-2);color:var(--ink);
  border:1px solid var(--line-2);border-radius:6px;font-family:var(--f-ui);
  font-size:12px;cursor:pointer;transition:.13s}
.pager button:hover:not(:disabled){background:var(--brand);color:var(--on-brand);border-color:var(--brand)}
.pager button:disabled{opacity:.4;cursor:default}
.pager .pg-at{font-family:var(--f-mono);font-size:11.5px;min-width:92px;text-align:center}
.pager select{padding:6px 8px;background:var(--bg);color:var(--ink);border:1px solid var(--line-2);
  border-radius:6px;font-family:var(--f-ui);font-size:12px}
@media (max-width:560px){.pager .pg-range{flex-basis:100%;margin-right:0}}

/* ── Data-load failure bar ──
   Every read goes through api(), which used to answer a 500 or a dead upstream
   with an empty array — indistinguishable, on screen, from "there is genuinely
   nothing here". This bar is what tells the two apart. Fixed to the bottom so
   it never reflows a board mid-read, and it names the endpoint because half the
   failures are one tenant timing out while the rest of the page is fine. */
#neterr{position:fixed;left:50%;bottom:18px;transform:translateX(-50%);z-index:400;
  display:none;align-items:center;gap:12px;box-sizing:border-box;
  max-width:min(760px,calc(100vw - 28px));padding:11px 12px 11px 14px;
  background:var(--panel-2);border:1px solid var(--line-2);border-left:3px solid var(--red);
  border-radius:var(--r);box-shadow:0 14px 40px rgba(0,0,0,.45);
  font-family:var(--f-ui);font-size:13px;line-height:1.45;color:var(--ink)}
#neterr.on{display:flex}
#neterr.warn{border-left-color:var(--amber)}
#neterr-msg{flex:1;min-width:0}
#neterr-msg .ne-src{font-family:var(--f-mono);font-size:11.5px;color:var(--ink-dim);
  display:block;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.neterr-btn{flex:none;padding:6px 13px;background:var(--raised);color:var(--ink);
  border:1px solid var(--line-2);border-radius:6px;font-family:var(--f-ui);font-size:12px;
  font-weight:600;cursor:pointer;transition:.13s}
.neterr-btn:hover{background:var(--brand);color:var(--on-brand);border-color:var(--brand)}
.neterr-x{flex:none;width:26px;height:26px;padding:0;background:none;color:var(--ink-mute);
  border:none;border-radius:6px;font-size:18px;line-height:1;cursor:pointer}
.neterr-x:hover{background:var(--raised);color:var(--ink)}
@media (max-width:560px){#neterr{left:10px;right:10px;bottom:10px;transform:none;max-width:none}}


        /* stacking layers (no ties): frozen-header 40 > week-header 30 > frozen-body 20 > week-body 1 */
        #v-planner{--pl-h1:32px}
        .pl-bar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
        .pl-bar select,.pl-bar input,.pl-bar .pl-colbtn{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:12px;font-family:var(--f-ui);padding:7px 10px;height:34px}
        .pl-bar input.pl-search{min-width:230px}
        .pl-colwrap{position:relative}
        .pl-colbtn{cursor:pointer;display:inline-flex;align-items:center;gap:6px}
        .pl-colbtn:hover{border-color:var(--brand);color:var(--brand)}
        .pl-colmenu{position:absolute;top:38px;left:0;z-index:60;display:none;min-width:210px;max-height:340px;overflow:auto;background:var(--panel);border:1px solid var(--line-2);border-radius:var(--r);box-shadow:0 16px 40px rgba(0,0,0,.5);padding:8px}
        .pl-colmenu.open{display:block}
        .pl-colmenu label{display:flex;align-items:center;gap:8px;padding:5px 7px;border-radius:6px;font-size:12.5px;color:var(--ink);cursor:pointer}
        .pl-colmenu label:hover{background:var(--panel-2)}
        .pl-colmenu label input{height:auto}
        .pl-legend{display:flex;gap:13px;align-items:center;margin-left:auto}
        .pl-key{display:flex;align-items:center;gap:5px;color:var(--ink-dim);font-size:11px;font-family:var(--f-mono)}
        .pl-sw{width:12px;height:12px;border-radius:3px;display:inline-block}
        .pl-sw.s-planned{background:#3a4a66}.pl-sw.s-inprogress{background:var(--amber)}.pl-sw.s-complete{background:var(--green)}.pl-sw.s-overdue{background:var(--red)}
        .pl-sw.s-notcomplete{background:var(--red);box-shadow:0 0 0 2px rgba(255,107,107,.32)}
        .pl-meta{color:var(--ink-mute);font-family:var(--f-mono);font-size:11px;width:100%}
        .pl-scroll{max-height:74vh;overflow:auto}
        table.pl-tbl{border-collapse:separate;border-spacing:0;font-size:12px;color:var(--ink)}
        .pl-tbl th,.pl-tbl td{border-bottom:1px solid var(--line);border-right:1px solid var(--line);padding:6px 8px;white-space:nowrap;background:var(--panel);text-align:left}
        .pl-tbl thead tr.pl-lab th{position:sticky;top:0;z-index:30;height:var(--pl-h1);background:var(--bg-2);font-weight:600;color:var(--ink-dim);font-size:11px}
        .pl-tbl thead tr.pl-flt th{position:sticky;top:var(--pl-h1);z-index:30;padding:3px 5px;background:var(--bg-2)}
        .pl-tbl thead tr.pl-lab th.freeze,.pl-tbl thead tr.pl-flt th.freeze{z-index:40}
        .pl-flt input{width:100%;min-width:60px;padding:4px 6px;background:var(--bg);border:1px solid var(--line);border-radius:4px;color:var(--ink);font-family:var(--f-mono);font-size:11px}
        .pl-tbl thead tr.pl-lab th.freeze{padding-right:12px}
        .pl-resize{position:absolute;top:0;right:0;width:7px;height:100%;cursor:col-resize;z-index:3}
        .pl-resize:hover{background:var(--brand)}
        .pl-tbl td.freeze{position:sticky;z-index:20;background:var(--panel)}
        .pl-tbl th.freeze{position:sticky}
        .pl-info{overflow:hidden;text-overflow:ellipsis}
        /* The task columns are the way into the editor, so they have to look it. */
        .dv-open{cursor:pointer}
        /* Contract bands on the all-contracts board. The row spans the full grid, but
           the label is sticky so it survives scrolling out across 52 weeks. */
        .dv-grp>td{background:var(--surface-2,#101b2d);border-top:1px solid var(--line,#1e2c44);
                   border-bottom:1px solid var(--line,#1e2c44);padding:0;cursor:pointer}
        .dv-grp-in{display:inline-flex;align-items:center;gap:9px;position:sticky;left:0;
                   padding:7px 12px;white-space:nowrap}
        .dv-grp-x{color:var(--brand,#559cde);font-size:11px;width:10px}
        .dv-grp-in b{font-size:12.5px;letter-spacing:.02em}
        .dv-grp-n{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute,#8a9bb5);letter-spacing:.03em}
        .dv-grp-n em{font-style:normal;color:var(--red,#ff6b6b)}
        .dv-grp:hover>td{background:var(--surface-3,#16233a)}
        tr:hover>.dv-open{background:var(--surface-2,rgba(85,156,222,.10))}
        .dv-open:hover{color:var(--brand,#559cde)}
        .pl-tbl tbody tr:hover td{background:var(--panel-2)}
        .pl-tbl td.wk{width:24px;min-width:24px;max-width:24px;text-align:center;padding:2px;color:var(--ink-mute);position:relative;z-index:1}
        .pl-tbl th.wk{width:24px;min-width:24px;max-width:24px;text-align:center;padding:3px 2px}
        .pl-tbl .pstart{border-left:2px solid var(--line-2)}
        .pl-tbl td.wk.t{cursor:pointer}
        .pl-tbl td.wk .pl-dot{display:inline-block;width:15px;height:15px;border-radius:3px;vertical-align:middle;animation:none}
        td.wk.s-planned .pl-dot{background:#3a4a66}
        td.wk.s-inprogress .pl-dot{background:var(--amber)}
        td.wk.s-complete .pl-dot{background:var(--green)}
        td.wk.s-overdue .pl-dot{background:var(--red)}
        td.wk.s-notcomplete .pl-dot{background:var(--red);box-shadow:0 0 0 2.5px rgba(255,107,107,.34)}
        td.wk.t.has-note .pl-dot{outline:2px solid var(--violet);outline-offset:1px}
        .pl-wk-lab{font-size:9.5px;font-family:var(--f-mono);color:var(--ink-mute);line-height:1.15}
        .pl-wk-lab b{display:block;color:var(--ink-dim);font-size:10px}
        .pl-empty{padding:26px;color:var(--ink-mute);text-align:center}
        .pl-due{grid-column:span 2;font-family:var(--f-mono);font-size:11.5px;color:var(--ink-dim)}
        .pl-due b{color:var(--ink)}
        

        /* Deliverables reuses the planner's grid wholesale (.pl-tbl, .wk,
           .s-* statuses) — same board, different source of rows. Only what is
           genuinely new to it is styled here. */
        #v-deliv{--pl-h1:32px}
        .dv-seg{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--r);overflow:hidden;height:34px}
        .dv-segbtn{background:var(--bg);border:0;color:var(--ink-dim);font-family:var(--f-ui);font-size:12px;padding:0 12px;cursor:pointer}
        .dv-segbtn+.dv-segbtn{border-left:1px solid var(--line-2)}
        .dv-segbtn:hover{color:var(--ink)}
        .dv-segbtn.active{background:var(--panel-2);color:var(--brand)}
        .pl-bar .dv-add{width:auto;padding:0 14px;height:34px;font-size:12px}
        .dv-tbl td.wk.mo,.dv-tbl th.wk.mo{width:52px;min-width:52px;max-width:52px}
        .dv-tbl td.wk.add{cursor:cell}
        .dv-tbl td.wk.add:hover .pl-dot{background:var(--line-2);opacity:.65}
        .dv-tbl td.wk.add .pl-dot{background:transparent}
        .dv-count{position:absolute;top:1px;right:3px;font-family:var(--f-mono);font-size:8.5px;color:var(--ink-mute)}
        .dv-pick{top:auto;left:auto}                 /* positioned at the click */
        .dv-pick button{display:block;width:100%;text-align:left;background:none;border:0;color:var(--ink);font-family:var(--f-ui);font-size:12.5px;padding:6px 8px;border-radius:6px;cursor:pointer}
        .dv-pick button:hover{background:var(--panel-2)}
        .dv-freq{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute)}
        .modal-foot .ghost.danger{border-color:rgba(255,107,107,.45);color:var(--red)}
        .modal-foot .ghost.danger:hover{border-color:var(--red);background:rgba(255,107,107,.1)}
        .dvd-late{color:var(--red)} .dvd-soon{color:var(--amber)}
        .dvd-note{color:var(--ink-mute);font-size:11.5px;white-space:normal;max-width:340px}
        #v-delivdue{--plk-planned:#3a4a66}
        #v-plannerkpi{--plk-planned:#3a4a66}
        .plk-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:16px}
        .plk-head h3{font-family:var(--f-disp);font-size:19px;font-weight:600;margin:0}
        .plk-fy{color:var(--ink-mute);font-family:var(--f-mono);font-size:11px;margin-top:3px}
        .plk-asof{color:var(--ink-dim);font-size:12px}.plk-asof b{color:var(--ink)}
        .plk-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:16px}
        .plk-tile{background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:15px 16px;position:relative;overflow:hidden}
        .plk-tile .v{font-family:var(--f-disp);font-size:26px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1}
        .plk-tile .l{color:var(--ink-dim);font-size:12px;margin-top:6px}
        .plk-tile .s{color:var(--ink-mute);font-size:11px;font-family:var(--f-mono);margin-top:2px}
        .plk-tile::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--line-2)}
        .plk-tile.s-complete::before{background:var(--green)} .plk-tile.s-complete .v{color:var(--green)}
        .plk-tile.s-inprogress::before{background:var(--amber)} .plk-tile.s-inprogress .v{color:var(--amber)}
        .plk-tile.s-overdue::before{background:var(--red)} .plk-tile.s-overdue .v{color:var(--red)}
        .plk-tile.s-notcomplete::before{background:var(--red)} .plk-tile.s-notcomplete .v{color:var(--red)}
        .plk-tile.s-target::before{background:var(--violet)} .plk-tile.s-rate::before{background:var(--brand)} .plk-tile.s-rate .v{color:var(--brand)}
        .plk-card{background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:18px;margin-bottom:16px}
        .plk-ptitle{font-family:var(--f-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:14px}
        .plk-barwrap{position:relative;padding-top:22px}
        .plk-bar{position:relative;display:flex;height:26px;border-radius:6px;overflow:hidden;background:var(--bg);border:1px solid var(--line)}
        .plk-seg{height:100%}
        .plk-seg.s-planned{background:var(--plk-planned)} .plk-seg.s-inprogress{background:var(--amber)}
        .plk-seg.s-complete{background:var(--green)} .plk-seg.s-overdue{background:var(--red)}
        .plk-seg.s-notcomplete{background:var(--red);opacity:.72}
        .plk-target{position:absolute;top:-2px;bottom:-2px;width:0;border-left:2px dashed var(--violet);z-index:2}
        .plk-target span{position:absolute;top:-20px;left:50%;transform:translateX(-50%);white-space:nowrap;font-family:var(--f-mono);font-size:10px;color:var(--violet);background:var(--bg-2);padding:1px 5px;border-radius:4px;border:1px solid var(--line)}
        .plk-legend{display:flex;flex-wrap:wrap;gap:16px;margin-top:14px;font-size:12px;color:var(--ink-dim)}
        .plk-legend span{display:flex;align-items:center;gap:6px} .plk-legend i{width:11px;height:11px;border-radius:3px;display:inline-block}
        .plk-summ{margin-top:14px;font-size:13px;color:var(--ink-dim)} .plk-summ b{color:var(--ink)}
        .plk-pace{display:inline-block;font-family:var(--f-mono);font-size:11px;padding:2px 9px;border-radius:20px;margin-left:8px}
        .plk-pace.ok{background:rgba(61,220,151,.14);color:var(--green)} .plk-pace.behind{background:rgba(255,107,107,.14);color:var(--red)}
        table.plk-tbl{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}
        .plk-tbl th,.plk-tbl td{padding:9px 12px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
        .plk-tbl thead th{position:sticky;top:0;background:var(--bg-2);font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-dim);z-index:1}
        .plk-tbl td.num{text-align:right;font-variant-numeric:tabular-nums}
        .plk-tbl tbody tr:hover td{background:var(--panel-2)}
        .plk-tbl .c-complete{color:var(--green)} .plk-tbl .c-overdue{color:var(--red)} .plk-tbl .c-inprogress{color:var(--amber)}
        .plk-tbl .c-not_complete{color:var(--red);font-weight:600}
        .plk-mini{position:relative;display:flex;height:14px;min-width:150px;border-radius:4px;overflow:hidden;background:var(--bg);border:1px solid var(--line)}
        .plk-minicell{width:220px}
        .plk-mtarget{position:absolute;top:-2px;bottom:-2px;border-left:2px dashed var(--violet)}
        .plk-empty{color:var(--ink-mute);padding:30px;text-align:center}
        

          #v-cafmtrk .trk-bar-top{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}
          #v-cafmtrk .trk-seg{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--r);overflow:hidden;height:34px}
          #v-cafmtrk .trk-seg button{background:var(--panel-2);border:none;color:var(--ink-dim);font-family:var(--f-ui);font-size:12.5px;padding:0 14px;cursor:pointer;transition:.13s}
          #v-cafmtrk .trk-seg button:hover{color:var(--ink)}
          #v-cafmtrk .trk-seg button.on{background:rgba(85,156,222,.14);color:var(--brand)}
          #v-cafmtrk .trk-fld{display:flex;align-items:center;gap:6px;font-family:var(--f-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute)}
          #v-cafmtrk .trk-fld input,#v-cafmtrk .trk-fld select{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-mono);font-size:12px;padding:7px 9px;color-scheme:dark}
          #v-cafmtrk .trk-fld select{cursor:pointer;font-family:var(--f-ui)}
          #v-cafmtrk .trk-fld input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
          #v-cafmtrk .trk-presets{display:flex;gap:5px;flex-wrap:wrap}
          #v-cafmtrk .trk-presets button{background:var(--panel-2);border:1px solid var(--line-2);color:var(--ink-dim);border-radius:99px;padding:5px 11px;font-size:11px;cursor:pointer;transition:.13s}
          #v-cafmtrk .trk-presets button:hover{color:var(--ink);border-color:var(--brand)}
          /* the window controls mean nothing on the whole-book view */
          #v-cafmtrk.trk-nobook .trk-fld,#v-cafmtrk.trk-nobook .trk-presets{opacity:.35;pointer-events:none}
          #v-cafmtrk .trk-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:10px}
          #v-cafmtrk .trk-chips{display:flex;flex-direction:column;gap:6px}
          #v-cafmtrk .trk-chiprow{display:flex;gap:7px;flex-wrap:wrap;align-items:center}
          #v-cafmtrk .trk-cliab{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute);width:64px}
          #v-cafmtrk .trk-chip{font-size:11.5px;padding:4px 11px;border-radius:99px;border:1px solid var(--line-2);color:var(--ink-dim)}
          #v-cafmtrk .trk-chip.trk-late{border-color:rgba(255,85,85,.5);color:var(--red)}
          #v-cafmtrk .trk-chip.trk-breached{border-color:rgba(255,85,85,.35);color:#ff8f8f}
          #v-cafmtrk .trk-chip.trk-pending{border-color:rgba(243,167,18,.45);color:var(--amber)}
          #v-cafmtrk .trk-chip.trk-on_time{border-color:rgba(63,185,80,.45);color:var(--green)}
          #v-cafmtrk .trk-scope{margin-left:auto;font-size:11.5px;color:var(--ink-mute)}
          #v-cafmtrk .trk-stamp{opacity:.8}
          /* the key, so the bar is readable without hovering every marker */
          #v-cafmtrk .trk-key{display:flex;gap:16px;flex-wrap:wrap;font-size:11px;color:var(--ink-mute);margin-bottom:12px}
          #v-cafmtrk .trk-key span{display:inline-flex;align-items:center;gap:6px}
          #v-cafmtrk .trk-k{width:14px;height:8px;border-radius:2px;display:inline-block}
          #v-cafmtrk .trk-k-a{background:rgba(85,156,222,.45)}
          #v-cafmtrk .trk-k-c{background:rgba(85,156,222,.18)}
          #v-cafmtrk .trk-k-o{background:rgba(255,85,85,.5)}
          #v-cafmtrk .trk-k-d{width:8px;height:8px;border-radius:50%;background:var(--green)}
          #v-cafmtrk .trk-k-n{width:2px;height:12px;border-radius:0;background:var(--ink)}
          #v-cafmtrk .trk-k-t{width:2px;height:12px;border-radius:0;background:var(--brand)}
          #v-cafmtrk .trk-k-t2{width:2px;height:12px;border-radius:0;background:#9db4d4}
          #v-cafmtrk .trk-warn2{color:var(--ink-mute);opacity:.85;font-style:italic}
          #v-cafmtrk .trk-k-as{width:8px;height:8px;border-radius:0;transform:rotate(45deg);background:var(--panel);border:2px solid #c9a227}

          #v-cafmtrk .trk-list{display:flex;flex-direction:column;gap:8px}
          #v-cafmtrk .trk-row{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--line-2);border-radius:var(--r-lg);padding:11px 14px 12px;cursor:pointer;transition:.13s}
          #v-cafmtrk .trk-row:hover{border-color:var(--line-2);background:var(--raised)}
          #v-cafmtrk .trk-row.trk-late{border-left-color:var(--red)}
          #v-cafmtrk .trk-row.trk-breached{border-left-color:#ff8f8f}
          #v-cafmtrk .trk-row.trk-pending{border-left-color:var(--amber)}
          #v-cafmtrk .trk-row.trk-on_time{border-left-color:var(--green)}
          #v-cafmtrk .trk-meta{display:flex;align-items:center;gap:10px;font-size:12.5px;margin-bottom:9px}
          #v-cafmtrk .trk-ref{font-family:var(--f-mono);font-size:11.5px;color:var(--brand)}
          #v-cafmtrk .trk-p{font-family:var(--f-mono);font-size:10px;letter-spacing:.06em;padding:2px 7px;border-radius:4px;background:var(--bg-2);border:1px solid var(--line-2);color:var(--ink-dim)}
          #v-cafmtrk .trk-p.trk-p1{border-color:rgba(255,85,85,.5);color:var(--red)}
          #v-cafmtrk .trk-p.trk-p2{border-color:rgba(243,167,18,.5);color:var(--amber)}
          #v-cafmtrk .trk-sum{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}
          #v-cafmtrk .trk-site{color:var(--ink-mute);font-size:11.5px;white-space:nowrap;max-width:220px;overflow:hidden;text-overflow:ellipsis}
          #v-cafmtrk .trk-state{font-size:10.5px;padding:2px 9px;border-radius:99px;border:1px solid var(--line-2);color:var(--ink-dim);white-space:nowrap}
          /* the A/C prefix, so two chips side by side say WHICH clock each is */
          #v-cafmtrk .trk-state i{font-style:normal;font-family:var(--f-mono);font-size:9px;letter-spacing:.1em;opacity:.75;margin-right:5px;padding-right:5px;border-right:1px solid currentColor}
          #v-cafmtrk .trk-state+.trk-state{margin-left:5px}
          #v-cafmtrk .trk-state.trk-s-late,#v-cafmtrk .trk-state.trk-s-breached{border-color:rgba(255,85,85,.5);color:var(--red)}
          #v-cafmtrk .trk-state.trk-s-pending{border-color:rgba(243,167,18,.5);color:var(--amber)}
          #v-cafmtrk .trk-state.trk-s-on_time{border-color:rgba(63,185,80,.5);color:var(--green)}

          /* the timeline itself: raised on the left, everything placed as a
             percentage of THIS job's own span */
          #v-cafmtrk .trk-bar{position:relative;height:16px;background:var(--bg-2);border-radius:4px;overflow:visible}
          /* the two anchors, as gridlines — every row shares them, so a column
             reads straight down the list */
          #v-cafmtrk .trk-bar::before,#v-cafmtrk .trk-bar::after{content:"";position:absolute;top:-5px;bottom:-5px;width:1px;background:var(--line-2);opacity:.55}
          #v-cafmtrk .trk-bar::before{left:34%}
          #v-cafmtrk .trk-bar::after{left:68%}
          #v-cafmtrk .trk-axis{position:relative;height:15px;margin:2px 14px 6px;font-family:var(--f-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute)}
          #v-cafmtrk .trk-ax{position:absolute;top:0;transform:translateX(-50%);white-space:nowrap}
          #v-cafmtrk .trk-ax[style*="left:0"]{transform:translateX(0)}
          #v-cafmtrk .trk-ax[style*="left:100%"]{transform:translateX(-100%)}
          #v-cafmtrk .trk-ax-a{color:var(--brand)}
          #v-cafmtrk .trk-ax-c{color:#9db4d4}
          #v-cafmtrk .trk-bar.trk-nobar{height:auto;padding:3px 8px;font-size:11px;color:var(--ink-mute);background:none}
          #v-cafmtrk .trk-fill{position:absolute;top:0;height:16px;border-radius:4px}
          #v-cafmtrk .trk-fill-c{background:rgba(85,156,222,.16)}
          #v-cafmtrk .trk-fill-a{background:rgba(85,156,222,.42)}
          #v-cafmtrk .trk-over{position:absolute;top:0;height:16px;background:repeating-linear-gradient(45deg,rgba(255,85,85,.55),rgba(255,85,85,.55) 4px,rgba(255,85,85,.28) 4px,rgba(255,85,85,.28) 8px)}
          #v-cafmtrk .trk-over-a{opacity:.9}
          #v-cafmtrk .trk-tick{position:absolute;top:-4px;width:2px;height:24px;background:var(--ink-mute);opacity:.95}
          #v-cafmtrk .trk-tick-a{background:var(--brand);box-shadow:0 0 0 1px rgba(10,17,32,.6)}
          #v-cafmtrk .trk-tick-c{background:#9db4d4;box-shadow:0 0 0 1px rgba(10,17,32,.6)}
          #v-cafmtrk .trk-dot{position:absolute;top:3px;width:10px;height:10px;margin-left:-5px;border-radius:50%;border:2px solid var(--panel)}
          #v-cafmtrk .trk-dot.ok{background:var(--green)}
          #v-cafmtrk .trk-dot.bad{background:var(--red)}
          #v-cafmtrk .trk-dot-c{top:3px}
          #v-cafmtrk .trk-now{position:absolute;top:-4px;width:2px;height:24px;background:var(--ink);opacity:.85}
          /* assignment: a hollow diamond, so it reads as a different KIND of
             event from the filled actual-stamp dots either side of it */
          #v-cafmtrk .trk-asg{position:absolute;top:4px;width:8px;height:8px;margin-left:-4px;transform:rotate(45deg);background:var(--panel);border:2px solid #c9a227}
          #v-cafmtrk .trk-legendrow{display:flex;gap:18px;flex-wrap:wrap;margin-top:9px;font-size:11px;color:var(--ink-mute);font-family:var(--f-mono)}
          #v-cafmtrk .trk-legendrow em{font-style:normal}
          /* The four stamps are the point of the row; the values beside them are
             support. Brightening the labels lets the eye find raised / assigned /
             attend / complete down a list without reading each line. */
          #v-cafmtrk .trk-legendrow b{color:var(--ink);font-weight:600;letter-spacing:.02em}
          #v-cafmtrk .trk-ok{color:var(--green)}
          #v-cafmtrk .trk-bad{color:var(--red)}
          #v-cafmtrk .trk-none{color:var(--ink-mute);opacity:.8}
          #v-cafmtrk .trk-who{font-size:11.5px;color:var(--ink-dim);white-space:nowrap;max-width:150px;overflow:hidden;text-overflow:ellipsis}
          #v-cafmtrk .trk-who b{color:var(--ink);font-weight:500}
          #v-cafmtrk .trk-assign .trk-ask{color:var(--brand);cursor:pointer;border-bottom:1px dotted var(--line-2)}
          #v-cafmtrk .trk-assign .trk-ask:hover{border-bottom-color:var(--brand)}
          #v-cafmtrk .trk-more{text-align:center;margin-top:14px}
          @media(max-width:820px){
            #v-cafmtrk .trk-site{display:none}
            #v-cafmtrk .trk-legendrow{gap:10px;font-size:10px}
          }
        

          .crp-bar{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:14px 16px;margin-bottom:16px}
          .crp-fld{display:flex;flex-direction:column;gap:6px}
          .crp-fld span{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
          .crp-fld input{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-mono);font-size:12.5px;padding:8px 10px;color-scheme:dark}
          .crp-fld input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
          .crp-presets{display:flex;gap:6px;flex-wrap:wrap;padding-bottom:1px}
          .crp-preset{background:var(--panel-2);border:1px solid var(--line-2);color:var(--ink-dim);border-radius:99px;padding:6px 12px;font-size:11.5px;font-family:var(--f-ui);cursor:pointer;transition:.13s}
          .crp-preset:hover{color:var(--ink);border-color:var(--brand)}
          .crp-preset.on{background:rgba(85,156,222,.14);border-color:var(--brand);color:var(--brand)}
          .crp-run{padding:8px 20px;font-size:12.5px;width:auto;height:34px}
          /* The customer and portfolio pickers, matching the pickers on the
             other CAFM tabs — a native select is white with black text and
             reads as an unstyled hole in a dark page. */
          .crp-sel{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:12.5px;font-family:var(--f-ui);padding:6px 10px;height:34px;min-width:168px;cursor:pointer}
          .crp-sel:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
          .crp-sel option{background:var(--panel);color:var(--ink)}
          .crp-right{margin-left:auto;display:flex;align-items:center;gap:10px}
          /* Hidden but still occupying its space. These appear as a report runs
             and as customers change; removing them from flow made the whole bar
             jump under the cursor mid-click. */
          .crp-off{visibility:hidden}
          /* second row: a toolbar, not another card — an empty panel strip
             sitting there before the first run reads as a mistake */
          .crp-bar2{background:none;border:none;margin-top:-10px;margin-bottom:14px;padding:0 2px;min-height:36px;align-items:center}
          .crp-stamp{margin-left:auto;font-size:11px;color:var(--ink-mute)}
          /* the raised-vs-due explainer, sitting with the tiles it qualifies */
          .crp-basis{grid-column:1/-1;margin-top:-6px;font-size:12px;line-height:1.6;color:var(--ink-dim)}
          .crp-basis b{color:var(--ink)}
          .crp-note{font-size:12px;line-height:1.6;color:var(--amber);background:rgba(243,167,18,.07);border:1px solid rgba(243,167,18,.3);border-radius:var(--r);padding:9px 13px;margin-bottom:14px}
          .crp-note b{color:var(--ink)}
          /* completion + matrix tables share one compact numeric look */
          .crp-tbl{width:100%;border-collapse:collapse}
          .crp-tbl th{position:sticky;top:0;background:var(--bg-2);z-index:1;font-family:var(--f-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);text-align:right;padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
          .crp-tbl th:first-child,.crp-tbl td:first-child{text-align:left;position:sticky;left:0;background:var(--bg-2);z-index:2}
          .crp-tbl th:first-child{z-index:3}
          .crp-tbl td{padding:9px 12px;text-align:right;font-family:var(--f-mono);font-size:12.5px;border-bottom:1px solid var(--line);white-space:nowrap}
          .crp-tbl td:first-child{font-family:var(--f-ui);font-size:13px;color:var(--ink)}
          .crp-tbl tbody tr:hover td{background:rgba(85,156,222,.05)}
          .crp-tbl tbody tr:hover td:first-child{background:var(--raised)}
          .crp-tbl tr.crp-tot td{border-top:1px solid var(--line-2);border-bottom:none;font-weight:600;color:var(--ink);background:rgba(85,156,222,.06)}
          .crp-tbl tr.crp-tot td:first-child{background:var(--raised)}
          .crp-roll td:first-child::after{content:"rolled up";margin-left:8px;font-family:var(--f-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);border:1px solid var(--line-2);border-radius:99px;padding:2px 7px}
          .crp-dim{color:var(--ink-mute)}
          /* rule between column groups — statutory / non-statutory / all / reactive */
          .crp-tbl th.crp-sep,.crp-tbl td.crp-sep{border-left:1px solid var(--line-2)}
          /* completion % reads as a bar behind the number — scannable down a column */
          .crp-pct{position:relative;display:inline-block;min-width:58px;text-align:right}
          .crp-bar-bg{position:absolute;inset:-4px -7px;border-radius:4px;background:linear-gradient(90deg,var(--c) var(--w),transparent var(--w));opacity:.16}
          .crp-scroll{overflow:auto;max-height:620px}
          .crp-legend{display:flex;flex-wrap:wrap;gap:12px;padding:0 16px 14px}
          .crp-legend span{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;color:var(--ink-dim)}
          .crp-legend i{width:9px;height:9px;border-radius:2px;display:inline-block}
          /* the completion table has a two-row header (grouped columns), which
             can't stick at a single offset — and it's one row per building, so
             it doesn't need to. */
          .crp-tbl.crp-flat th,.crp-tbl.crp-flat td:first-child{position:static}
          /* ── SLA performance panel ── */
          .cpf-card{padding:0;overflow:hidden;margin-bottom:16px}
          .cpf-head{display:flex;align-items:baseline;gap:12px;padding:14px 16px;border-bottom:1px solid var(--line);flex-wrap:wrap}
          .cpf-head b{font-size:14px;color:var(--ink)}
          .cpf-head span{font-size:12px;color:var(--ink-mute)}
          .cpf-opt{margin-left:auto;padding:5px 12px;font-size:11.5px;width:auto;height:auto}
          .cpf-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;padding:14px 16px}
          .cpf-kpi{background:var(--bg-2);border:1px solid var(--line);border-left:3px solid var(--line-2);border-radius:var(--r);padding:12px 14px}
          .cpf-kpi.g{border-left-color:var(--green)}
          .cpf-kpi.a{border-left-color:var(--amber)}
          .cpf-kpi.r{border-left-color:var(--red)}
          .cpf-lab{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
          .cpf-val{font-family:var(--f-disp);font-size:30px;font-weight:700;line-height:1.1;margin-top:3px;color:var(--ink);font-variant-numeric:tabular-nums}
          .cpf-kpi.g .cpf-val{color:var(--green)}
          .cpf-kpi.a .cpf-val{color:var(--amber)}
          .cpf-kpi.r .cpf-val{color:var(--red)}
          .cpf-sub{font-size:11px;color:var(--ink-mute);margin-top:4px;line-height:1.5}
          .cpf-note{font-size:11.5px;line-height:1.65;color:var(--ink-dim);margin:0 16px 12px}
          .cpf-note code{font-family:var(--f-mono);font-size:10.5px;color:var(--ink)}
          .cpf-note.cpf-warn{color:var(--amber)}
          .cpf-tbl{width:100%;border-collapse:collapse;margin-bottom:4px}
          .cpf-tbl th{font-family:var(--f-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);text-align:right;padding:8px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
          .cpf-tbl th:first-child{text-align:left}
          .cpf-tbl td{padding:9px 12px;text-align:right;font-family:var(--f-mono);font-size:12.5px;border-bottom:1px solid var(--line);color:var(--ink);font-variant-numeric:tabular-nums}
          .cpf-tbl td.cpf-prio{text-align:left;font-family:var(--f-ui)}
          .cpf-tbl td.cpf-n,.cpf-tbl td.cpf-dim{color:var(--ink-mute)}
          .cpf-tbl td.cpf-g{color:var(--green)}
          .cpf-tbl td.cpf-a{color:var(--amber)}
          .cpf-tbl td.cpf-r{color:var(--red)}
          /* job → task → asset, one row per sampled job */
          .crp-verdict{font-family:var(--f-mono);font-size:11.5px;color:var(--ink-dim);background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);padding:8px 12px;margin-bottom:10px}
          .crp-chain{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:8px}
          .crp-hop{background:var(--bg-2);border:1px solid var(--line);border-left:3px solid var(--line-2);border-radius:var(--r);padding:9px 12px;display:flex;flex-direction:column;gap:4px;min-width:0}
          .crp-hop b{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.14em;color:var(--ink-mute)}
          .crp-hop span{overflow:hidden;text-overflow:ellipsis}
          .crp-hop.ok{border-left-color:var(--brand)}
          .crp-hop.bad{border-left-color:var(--red)}
          .crp-found{font-family:var(--f-mono);font-size:11px;color:var(--green);word-break:break-word}
        

          .cr-board{color:var(--cr-ink)}
          .cr-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:0 2px 14px;border-bottom:1px solid var(--cr-line);margin-bottom:16px}
          .cr-title{font-size:18px;font-weight:600;color:var(--cr-ink)}
          .cr-title .cr-sub{color:var(--cr-dim);font-weight:500}
          .cr-kicker{font-size:10px;letter-spacing:1.4px;color:var(--cr-mute);margin-top:4px;font-family:var(--f-mono)}
          .cr-clock{display:flex;align-items:center;gap:8px;font-variant-numeric:tabular-nums}
          .cr-clock .cr-time{font-size:20px;font-weight:600}
          .cr-clock .cr-date{font-size:12px;color:var(--cr-dim)}
          .cr-updated{color:var(--cr-dim);letter-spacing:0}
          .cr-dot{width:8px;height:8px;border-radius:50%;background:#3fb950;box-shadow:0 0 0 0 rgba(63,185,80,.5);animation:crpulse 2s infinite}
          @keyframes crpulse{0%{box-shadow:0 0 0 0 rgba(63,185,80,.5)}70%{box-shadow:0 0 0 7px rgba(63,185,80,0)}100%{box-shadow:0 0 0 0 rgba(63,185,80,0)}}
          .cr-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(430px,1fr));gap:16px}
          /* phones: a 430px min track overflows a ~390px canvas — stack instead */
          @media (max-width:700px){.cr-grid{grid-template-columns:1fr}}
          /* Portfolios: at most 4 panels — auto-fit + a smaller min so all four
             stretch onto one row from ~1220px up, wrapping cleanly below that. */
          /* Desktop: one column per portfolio (--pfn set by crRenderPortfolios).
             Narrower screens fall back to as-many-as-fit; phones stack. */
          #cr-grid-port{grid-template-columns:repeat(var(--pfn,2),minmax(0,1fr))}
          @media (max-width:1500px){#cr-grid-port{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}}
          @media (max-width:700px){#cr-grid-port{grid-template-columns:1fr}}
          /* normal mode: keep the portfolio job list compact (scrolls); present
             mode uncaps it below so panels fill the screen height. */
          #cr-grid-port .cr-panel>.cr-sec:last-child .cr-jobs{max-height:300px;overflow:auto}
          .cr-panel{background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sh-1)}
          .cr-phead{display:flex;align-items:center;justify-content:space-between;padding:11px 14px;background:var(--cr-panel2);border-bottom:1px solid var(--cr-line)}
          .cr-site{font-size:13px;font-weight:600;color:var(--cr-ink)}
          .cr-atrisk{font-size:11px;color:var(--cr-dim)}
          .cr-sec{padding:12px 14px}
          .cr-sec+.cr-sec{border-top:1px solid var(--cr-line)}
          .cr-slab{display:flex;align-items:center;justify-content:space-between;font-size:9px;font-weight:600;letter-spacing:.9px;color:var(--cr-dim);margin-bottom:9px}
          .cr-slab span{color:var(--cr-mute);letter-spacing:0}
          .cr-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:7px}
          .cr-card{border:1px solid;border-radius:5px;padding:7px 8px}
          .cr-card.cr-open{cursor:pointer;transition:filter .12s,box-shadow .12s}
          .cr-card.cr-open:hover{filter:brightness(1.25)}
          .cr-card.cr-active{box-shadow:0 0 0 2px currentColor inset}
          .cr-drill{margin:0}
          .cr-drill.open{margin:2px 0 6px;border:1px solid var(--cr-line);border-radius:6px;background:var(--cr-bg2);overflow:hidden}
          .cr-drill-h{display:flex;align-items:center;justify-content:space-between;padding:7px 11px;font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--cr-dim);background:var(--cr-panel);border-bottom:1px solid var(--cr-line)}
          .cr-drill-x{background:none;border:none;color:var(--cr-mute);cursor:pointer;font-size:13px;padding:0 2px}
          .cr-drill-x:hover{color:var(--cr-ink)}
          .cr-drill .cr-jobs{max-height:280px;overflow:auto;padding:2px}
          .cr-drill-all{width:100%;background:var(--cr-panel);border:none;border-top:1px solid var(--cr-line);color:var(--cr-accent);font-family:var(--f-mono);font-size:11px;padding:8px;cursor:pointer}
          .cr-drill-all:hover{background:var(--cr-panel2)}
          .cr-drill-all:disabled{color:var(--cr-mute);cursor:default}
          .cr-job-open{cursor:pointer}
          .cr-job-open:hover{background:rgba(88,166,255,.08)}
          .cr-card.crit{border-color:#ff5555;background:rgba(255,85,85,.12)}
          .cr-card.risk{border-color:#ffb454;background:rgba(255,180,84,.12)}
          .cr-card.watch{border-color:#f1e05a;background:rgba(241,224,90,.10)}
          .cr-card.p1{border-color:#a371f7;background:rgba(163,113,247,.16)}
          .cr-clab{font-size:8px;font-weight:600;letter-spacing:.5px;color:var(--cr-dim)}
          .cr-cval{font-size:23px;font-weight:600;line-height:1.1;margin-top:2px;color:var(--cr-ink-hi);font-family:var(--f-disp);font-variant-numeric:tabular-nums}
          .cr-csub{font-size:8px;color:var(--cr-mute)}
          .cr-card.crit .cr-csub{color:#ff8a8a}.cr-card.risk .cr-csub{color:#ffc776}.cr-card.watch .cr-csub{color:#f1e05a}.cr-card.p1 .cr-csub{color:#c4a7ff}
          .cr-jobs{display:flex;flex-direction:column}
          .cr-job{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:11.5px;border-bottom:1px solid var(--cr-line)}
          .cr-job:last-child{border-bottom:none}
          .cr-ref{font-family:var(--f-ui);font-variant-numeric:tabular-nums;font-size:10px;color:var(--cr-ink);flex:0 0 62px}
          .cr-badge{font-size:8px;font-weight:700;padding:2px 5px;border-radius:3px;flex:0 0 auto}
          .cr-badge.react{color:#bf5af2;background:rgba(191,90,242,.15)}
          .cr-badge.ppm{color:#58a6ff;background:rgba(88,166,255,.15)}
          .cr-desc{flex:1;color:var(--cr-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
          .cr-chip{font-family:var(--f-mono);font-size:10px;font-weight:700;padding:2px 7px;border-radius:3px;flex:0 0 auto}
          .cr-chip.crit{color:#ff5555;background:rgba(255,85,85,.14)}
          .cr-chip.risk{color:#ffb454;background:rgba(255,180,84,.14)}
          .cr-chip.watch{color:#f1e05a;background:rgba(241,224,90,.12)}
          .cr-summary{display:flex;align-items:center;gap:18px;padding:12px 16px;margin-bottom:16px;background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);flex-wrap:wrap;box-shadow:var(--sh-1)}
          .cr-total{display:flex;align-items:baseline;gap:9px}
          .cr-total-val{font-size:32px;font-weight:700;color:var(--cr-ink);line-height:1}
          .cr-total-lab{font-size:12px;color:var(--cr-dim)}
          .cr-total-lab b{color:#ff5555;font-weight:700}
          .cr-tags{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}
          .cr-tag{display:inline-flex;align-items:center;gap:7px;padding:6px 12px;border-radius:20px;border:1px solid var(--cr-line2);background:var(--cr-bg);color:var(--cr-tagtext);font-size:12px;font-weight:600;cursor:pointer;transition:.12s}
          .cr-tag:hover{border-color:var(--cr-mute)}
          .cr-tag.active{border-color:currentColor}
          .cr-tagdot{width:8px;height:8px;border-radius:50%;flex:0 0 8px}
          .cr-tagn{font-family:var(--f-mono);font-size:10.5px;color:var(--cr-dim)}
          .cr-toggle{margin-left:6px;padding:6px 12px;border-radius:20px;border:1px dashed var(--cr-line2);background:var(--cr-bg);color:var(--cr-dim);font-size:11.5px;font-weight:600;cursor:pointer;transition:.12s}
          .cr-toggle:hover{border-color:var(--cr-mute);color:var(--cr-tagtext)}
          .cafm-cust{background:var(--cr-bg);border:1px solid var(--cr-line2);border-radius:6px;color:var(--cr-ink);font-size:12.5px;font-family:var(--f-ui);padding:6px 10px;height:34px;cursor:pointer}
          @keyframes crspin{to{transform:rotate(360deg)}}
          .ghost.cr-spin{position:relative;color:transparent!important;pointer-events:none}
          .ghost.cr-spin::after{content:"";position:absolute;top:50%;left:50%;width:14px;height:14px;margin:-7px 0 0 -7px;border:2px solid var(--cr-line2);border-top-color:var(--cr-accent);border-radius:50%;animation:crspin .65s linear infinite}
          .cr-modeseg{display:inline-flex;border:1px solid var(--cr-line2);border-radius:6px;overflow:hidden;height:34px}
          .cr-modebtn{background:var(--cr-bg);border:none;color:var(--cr-dim);font-size:12px;font-weight:600;padding:0 13px;cursor:pointer}
          .cr-modebtn+.cr-modebtn{border-left:1px solid var(--cr-line2)}
          .cr-modebtn.active{background:var(--cr-accent2);color:#fff}
          .cr-modebtn:not(.active):hover{color:var(--cr-ink)}
          .cr-glowseg{display:inline-flex;align-items:center;border:1px solid var(--cr-line2);border-radius:6px;overflow:hidden;height:34px}
          .cr-glowlab{font-size:8px;letter-spacing:.8px;color:var(--cr-mute);padding:0 8px;font-family:var(--f-mono)}
          .cr-glowbtn{background:var(--cr-bg);border:none;border-left:1px solid var(--cr-line2);color:var(--cr-dim);font-size:11px;font-weight:600;padding:0 10px;height:100%;cursor:pointer}
          .cr-glowbtn.active{background:var(--cr-accent2);color:#fff}
          .cr-glowbtn:not(.active):hover{color:var(--cr-ink)}
          .cr-flip{display:inline-flex;align-items:center;gap:7px;margin-left:16px;padding:7px 13px;border-radius:20px;border:1px solid var(--cr-line2);background:var(--cr-bg);color:var(--cr-dim);font-size:12.5px;font-weight:600;cursor:pointer;transition:.12s}
          .cr-flip:hover{border-color:var(--cr-mute);color:var(--cr-tagtext)}
          .cr-flip.warn{border-color:#ff5555;color:#ff5555;background:rgba(255,85,85,.10)}
          .cr-flip.warn:hover{background:rgba(255,85,85,.18)}
          .cr-flip .dot{width:8px;height:8px;border-radius:50%;background:#ff5555}
          #cafm-kpis .k-val{color:var(--cr-ink)}
          .cr-badge.p1{color:#a371f7;background:rgba(163,113,247,.2)}
          /* light theme: darken the pale severity/label colours so they read on off-white */
          :root[data-theme="light"] .cr-badge.ppm{color:#1f5fb0}
          :root[data-theme="light"] .cr-badge.react{color:#8b2fc9}
          :root[data-theme="light"] .cr-chip.crit,:root[data-theme="light"] .cr-total-lab b{color:#d1332e}
          :root[data-theme="light"] .cr-chip.risk{color:#9a5e08}
          :root[data-theme="light"] .cr-chip.watch{color:#877000}
          :root[data-theme="light"] .cr-card.crit .cr-csub{color:#cf3b3b}
          :root[data-theme="light"] .cr-card.risk .cr-csub{color:#9a5e08}
          :root[data-theme="light"] .cr-card.watch .cr-csub{color:#877000}
          :root[data-theme="light"] .cr-card.p1 .cr-csub{color:#6d3fd6}
          body.present-mode .shell{grid-template-columns:1fr}
          body.present-mode .rail,body.present-mode .topbar,body.present-mode #subtabs{display:none}
          body.present-mode .canvas{padding:10px 14px;overflow:hidden;max-width:none}
          /* Portfolios present mode: fill the whole viewport — panels stretch to
             the full height and their job list grows to fill, so no dead space. */
          body.present-mode #v-cafmport.active{height:calc(100vh - 20px);display:flex;flex-direction:column}
          body.present-mode #v-cafmport .cr-board{flex:1;display:flex;flex-direction:column;min-height:0}
          body.present-mode #cr-grid-port{flex:1;min-height:0;grid-auto-rows:minmax(0,1fr)}
          body.present-mode #cr-grid-port .cr-panel{display:flex;flex-direction:column;min-height:0}
          body.present-mode #cr-grid-port .cr-panel>.cr-sec:last-child{flex:1;min-height:0;display:flex;flex-direction:column}
          body.present-mode #cr-grid-port .cr-panel>.cr-sec:last-child .cr-jobs{flex:1;max-height:none;overflow:hidden}
          #cafm-present-exit{display:none;position:fixed;top:12px;right:14px;z-index:9999;background:var(--cr-panel);border:1px solid var(--cr-line2);color:var(--cr-ink);border-radius:8px;padding:8px 15px;font-size:13px;font-weight:600;cursor:pointer}
          body.present-mode #cafm-present-exit{display:block}
          body.present-mode #cafm-present-exit:hover{border-color:var(--cr-mute)}
          .cr-ptag{font-size:8.5px;font-weight:600;padding:1px 7px;border-radius:10px;border:1px solid;vertical-align:middle;margin-left:7px}
        

          #v-coverage .cov-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:18px;flex-wrap:wrap}
          #v-coverage .cov-title{font-size:18px;font-weight:600;color:var(--ink)}
          #v-coverage .cov-sub{font-size:11px;letter-spacing:.6px;color:var(--ink-mute);text-transform:uppercase;margin-top:4px;font-family:var(--f-mono)}
          #v-coverage .cov-updated{text-transform:none;letter-spacing:0}
          #v-coverage .cov-tools{display:flex;align-items:center;gap:10px}
          #v-coverage .cov-panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);overflow:auto;box-shadow:var(--sh-1)}
          #v-coverage table{width:100%;border-collapse:collapse;font-size:13px;min-width:820px}
          #v-coverage th{font-size:9.5px;font-weight:600;letter-spacing:.6px;color:var(--ink-mute);text-transform:uppercase;padding:11px 14px;text-align:center;background:var(--panel-2)}
          #v-coverage th:first-child{text-align:left}
          #v-coverage th i{display:block;font-style:normal;font-size:8.5px;color:var(--ink-mute);letter-spacing:0;text-transform:none;font-weight:500;margin-top:2px}
          #v-coverage thead tr{border-bottom:1px solid var(--line)}
          #v-coverage td{padding:11px 14px;text-align:center;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;color:var(--ink)}
          #v-coverage tbody tr:last-child td{border-bottom:none}
          #v-coverage tbody tr:hover td{background:var(--panel-2)}
          #v-coverage .cov-cust{text-align:left;font-weight:600;color:var(--ink)}
          #v-coverage .cov-code{font-size:10px;color:var(--ink-mute);font-weight:500;margin-left:6px}
          #v-coverage .cov-count{font-weight:600}
          #v-coverage .cov-count.z{color:var(--ink-mute);font-weight:500}
          #v-coverage .cov-cell{display:inline-flex;flex-direction:column;align-items:center;gap:3px}
          #v-coverage .cov-frac{font-size:11px;color:var(--ink-dim)}
          #v-coverage .cov-pct{display:inline-block;min-width:46px;padding:2px 8px;border-radius:6px;font-weight:700;font-size:12px}
          #v-coverage .cov-pct.g{background:rgba(61,220,151,.14);color:var(--green)}
          #v-coverage .cov-pct.a{background:rgba(243,167,18,.16);color:var(--amber)}
          #v-coverage .cov-pct.r{background:rgba(255,107,107,.14);color:var(--red)}
          #v-coverage .cov-pct.n{background:var(--panel-2);color:var(--ink-mute)}
          #v-coverage tr.cov-total td{border-top:2px solid var(--line-2);font-weight:700;background:var(--panel-2)}
          #v-coverage .cov-sslink{text-decoration:none;color:var(--brand);font-weight:600}
          #v-coverage .cov-empty{padding:26px;text-align:center;color:var(--ink-mute)}
        

          #v-cafmexec .cx-panel{background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);box-shadow:var(--sh-1);overflow:hidden}
          #v-cafmexec table{width:100%;border-collapse:collapse;font-size:13px}
          #v-cafmexec th{font-size:9.5px;font-weight:600;letter-spacing:.6px;color:var(--cr-dim);text-transform:uppercase;padding:11px 12px;text-align:center}
          #v-cafmexec th:first-child{text-align:left}
          #v-cafmexec th i{display:block;font-style:normal;font-size:8.5px;color:var(--cr-mute);letter-spacing:0;text-transform:none;font-weight:500;margin-top:2px}
          #v-cafmexec thead tr{border-bottom:1px solid var(--cr-line)}
          #v-cafmexec td{padding:12px;text-align:center;border-bottom:1px solid var(--cr-line);font-variant-numeric:tabular-nums;color:var(--cr-ink);font-weight:600}
          #v-cafmexec tbody tr.cx-row{cursor:pointer}
          #v-cafmexec tbody tr.cx-row:hover td{background:var(--cr-bg2)}
          #v-cafmexec .cx-cust{text-align:left;font-weight:700;color:var(--cr-ink-hi);font-size:14px}
          #v-cafmexec .cx-cust .cx-go{font-size:10px;color:var(--cr-mute);font-weight:500;margin-left:8px}
          #v-cafmexec tr.cx-total td{border-top:2px solid var(--cr-line2);font-weight:700;background:var(--cr-bg2);color:var(--cr-ink-hi)}
          #v-cafmexec .cx-pill{display:inline-block;min-width:54px;padding:4px 10px;border-radius:7px;font-weight:700;font-variant-numeric:tabular-nums}
          #v-cafmexec .cx-pill.g{background:rgba(63,185,80,.14);color:#3fb950}
          #v-cafmexec .cx-pill.a{background:rgba(255,180,84,.16);color:#ffb454}
          #v-cafmexec .cx-pill.r{background:rgba(255,85,85,.14);color:#ff6b6b}
          #v-cafmexec .cx-pill.n{background:var(--cr-bg2);color:var(--cr-mute)}
          #v-cafmexec .cx-plain{color:var(--cr-ink)}
          #v-cafmexec .cx-plain.z{color:var(--cr-mute);font-weight:500}
          /* the Open figure drills into the jobs behind it */
          #v-cafmexec .cx-drill{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:4px;text-decoration-color:var(--cr-mute)}
          #v-cafmexec .cx-drill:hover{color:var(--cr-accent2);text-decoration-color:var(--cr-accent2)}
          #v-cafmexec .cx-err{color:#ff6b6b;font-size:11px;font-weight:500}
          #v-cafmexec .cx-loading td{opacity:.8}
          #v-cafmexec .cx-load-bar{display:inline-block;height:11px;width:70%;max-width:340px;border-radius:5px;background:linear-gradient(90deg,var(--cr-line) 25%,var(--cr-line2) 50%,var(--cr-line) 75%);background-size:200% 100%;animation:cxshimmer 1.15s linear infinite}
          @keyframes cxshimmer{to{background-position:-200% 0}}
          #v-cafmexec .cx-rag{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:11px 14px;margin-bottom:14px;background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);font-size:11px;color:var(--cr-dim)}
          #v-cafmexec .cx-rag label{display:inline-flex;align-items:center;gap:6px}
          #v-cafmexec .cx-rag input{width:52px;background:var(--cr-bg);border:1px solid var(--cr-line2);border-radius:5px;color:var(--cr-ink);padding:4px 6px;font-size:12px;font-variant-numeric:tabular-nums}
          #v-cafmexec .cx-ragkey{margin-left:auto;display:flex;gap:10px}
          #v-cafmexec .cx-ragkey span{display:inline-flex;align-items:center;gap:5px}
          #v-cafmexec .cx-sw{width:10px;height:10px;border-radius:3px;display:inline-block}
          body.present-mode #v-cafmexec.active{height:calc(100vh - 20px);overflow:auto}
          /* ── Print / PDF: any active CAFM board prints as a clean client-pack
             page. Force a light palette so a dark-mode screen still yields a
             legible PDF; hide chrome; keep RAG colours (print-color-adjust). ── */
          @media print{
            :root{--cr-panel:#fff;--cr-panel2:#f4f6fa;--cr-bg:#fff;--cr-bg2:#f6f8fb;--cr-line:#d9e0ea;--cr-line2:#c6d0de;--cr-ink:#1a2436;--cr-ink-hi:#0f1826;--cr-dim:#55627a;--cr-mute:#7787a0;--cr-tagtext:#3a4a63}
            *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}
            body{background:#fff!important}
            .rail,.topbar,#subtabs,.cr-clock,.cr-modeseg,.cafm-cust,.ghost,.cx-rag,.cr-flip,.cr-toggle,.cr-tags,#cafm-present-exit{display:none!important}
            .shell{grid-template-columns:1fr!important}
            .canvas{max-width:none!important;padding:0!important;overflow:visible!important}
            .view:not(.active){display:none!important}
            .view.active{position:static!important}
            .cr-head{border-color:#d9e0ea!important}
            .cr-panel,.jeo-panel,.co-panel,.pp-panel,.ph-panel,.cx-panel,.tr-panel,.jeo-kpi{break-inside:avoid;box-shadow:none!important}
            .jeo-drawer,.co-jobs{display:none!important}
          }
        

          #v-cafmjeo .jeo-hero{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}
          #v-cafmjeo .jeo-kpi{background:var(--cr-panel);border:1px solid var(--cr-line);border-left:3px solid var(--cr-line2);border-radius:var(--r-lg);padding:14px 16px;box-shadow:var(--sh-1)}
          #v-cafmjeo .jeo-kpi.bad{border-left-color:#ff5555}
          #v-cafmjeo .jeo-kpi.warn{border-left-color:#ffb454}
          #v-cafmjeo .jeo-kpi.good{border-left-color:#3fb950}
          #v-cafmjeo .jeo-klab{font-size:9.5px;font-weight:600;letter-spacing:1px;color:var(--cr-dim)}
          #v-cafmjeo .jeo-kval{font-size:34px;font-weight:700;line-height:1.05;margin-top:4px;color:var(--cr-ink-hi);font-family:var(--f-disp);font-variant-numeric:tabular-nums}
          #v-cafmjeo .jeo-kpi.bad .jeo-kval{color:#ff6b6b}
          #v-cafmjeo .jeo-kpi.warn .jeo-kval{color:#ffb454}
          #v-cafmjeo .jeo-kpi.good .jeo-kval{color:#3fb950}
          #v-cafmjeo .jeo-ksub{font-size:11px;color:var(--cr-mute);margin-top:3px}
          #v-cafmjeo .jeo-panel{background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);box-shadow:var(--sh-1);margin-bottom:16px;overflow:hidden}
          #v-cafmjeo .jeo-ptitle{font-size:10px;font-weight:600;letter-spacing:1px;color:var(--cr-dim);padding:12px 16px;border-bottom:1px solid var(--cr-line);background:var(--cr-panel2)}
          #v-cafmjeo table{width:100%;border-collapse:collapse;font-size:12.5px}
          #v-cafmjeo th{font-size:9.5px;font-weight:600;letter-spacing:.6px;color:var(--cr-dim);text-transform:uppercase;padding:9px 10px;text-align:center}
          #v-cafmjeo thead tr:first-child th{border-bottom:1px solid var(--cr-line)}
          #v-cafmjeo th i{display:block;font-style:normal;font-size:8.5px;color:var(--cr-mute);letter-spacing:0;text-transform:none;font-weight:500;margin-top:2px}
          #v-cafmjeo th.jeo-grp{color:var(--cr-ink)}
          #v-cafmjeo th.jeo-grp.bad{color:#ff6b6b}
          #v-cafmjeo th.jeo-grp.warn{color:#ffb454}
          #v-cafmjeo td{padding:9px 10px;text-align:center;border-bottom:1px solid var(--cr-line);font-variant-numeric:tabular-nums;color:var(--cr-ink)}
          #v-cafmjeo tbody tr:last-child td{border-bottom:none}
          #v-cafmjeo tbody tr:hover td{background:var(--cr-bg2)}
          #v-cafmjeo .jeo-rname,#v-cafmjeo .jeo-mrow{text-align:left;font-weight:600;color:var(--cr-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px}
          #v-cafmjeo .jeo-mnum,#v-cafmjeo .jeo-sites{color:var(--cr-dim);font-weight:600}
          #v-cafmjeo tr.jeo-mtotal td{border-top:1px solid var(--cr-line2);font-weight:700;background:var(--cr-bg2)}
          #v-cafmjeo tr.jeo-mtotal .jeo-mrow{color:var(--cr-ink-hi)}
          #v-cafmjeo .jeo-c,#v-cafmjeo .jeo-mcell{font-weight:600}
          #v-cafmjeo .jeo-c.z,#v-cafmjeo .jeo-mcell.z{color:var(--cr-mute);font-weight:500}
          #v-cafmjeo .jeo-c.bad,#v-cafmjeo .jeo-mcell.bad{color:#ff6b6b}
          #v-cafmjeo .jeo-c.warn,#v-cafmjeo .jeo-mcell.warn{color:#ffb454}
          #v-cafmjeo .jeo-c.p1c{color:#c4a7ff}
          #v-cafmjeo .jeo-clk{cursor:pointer;border-radius:5px;transition:background .12s,box-shadow .12s}
          #v-cafmjeo .jeo-clk:hover{background:rgba(88,166,255,.10)}
          #v-cafmjeo .jeo-clk.jeo-active{box-shadow:0 0 0 2px currentColor inset}
          #v-cafmjeo .jeo-rgrp{border-left:1px solid var(--cr-line)}
          #v-cafmjeo .jeo-drawer{margin-top:-4px;margin-bottom:16px}
          #v-cafmjeo .jeo-drawer.open{border:1px solid var(--cr-line);border-radius:var(--r-lg);background:var(--cr-panel);overflow:hidden;box-shadow:var(--sh-1)}
          #v-cafmjeo .jeo-drawer .cr-jobs{max-height:340px;overflow:auto;padding:4px 12px}
          #v-cafmjeo .jeo-jsite{flex:0 0 auto;font-size:10px;color:var(--cr-dim);max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
          #v-cafmjeo .jeo-empty{padding:26px;color:var(--cr-dim);text-align:center}
          body.present-mode #v-cafmjeo.active{height:calc(100vh - 20px);overflow:auto}
        

          .ana-pane{display:none}
          .ana-pane.active{display:block}
          #v-cafmana .ana-bar{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap}
          #v-cafmana .ana-tab{background:var(--cr-panel);border:1px solid var(--cr-line2);border-radius:8px;color:var(--cr-dim);font-size:13px;font-weight:600;padding:8px 16px;cursor:pointer;transition:.13s}
          #v-cafmana .ana-tab:hover{color:var(--cr-ink);border-color:var(--cr-mute)}
          #v-cafmana .ana-tab.active{background:var(--cr-accent2);color:#fff;border-color:var(--cr-accent2)}
        

          #v-cafmtrend .jeo-hero{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}
          #v-cafmtrend .jeo-kpi{background:var(--cr-panel);border:1px solid var(--cr-line);border-left:3px solid var(--cr-line2);border-radius:var(--r-lg);padding:14px 16px;box-shadow:var(--sh-1)}
          #v-cafmtrend .jeo-kpi.good{border-left-color:#3fb950}#v-cafmtrend .jeo-kpi.warn{border-left-color:#ffb454}#v-cafmtrend .jeo-kpi.bad{border-left-color:#ff5555}
          #v-cafmtrend .jeo-klab{font-size:9.5px;font-weight:600;letter-spacing:1px;color:var(--cr-dim)}
          #v-cafmtrend .jeo-kval{font-size:34px;font-weight:700;line-height:1.05;margin-top:4px;color:var(--cr-ink-hi);font-family:var(--f-disp);font-variant-numeric:tabular-nums}
          #v-cafmtrend .jeo-kpi.good .jeo-kval{color:#3fb950}#v-cafmtrend .jeo-kpi.warn .jeo-kval{color:#ffb454}#v-cafmtrend .jeo-kpi.bad .jeo-kval{color:#ff6b6b}
          #v-cafmtrend .jeo-ksub{font-size:11px;color:var(--cr-mute);margin-top:3px}
          #v-cafmtrend .tr-panel{background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);box-shadow:var(--sh-1);margin-bottom:16px;overflow:hidden}
          #v-cafmtrend .tr-phead{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--cr-line);background:var(--cr-panel2)}
          #v-cafmtrend .tr-ptitle{font-size:10px;font-weight:600;letter-spacing:1px;color:var(--cr-dim)}
          #v-cafmtrend .tr-legend{display:flex;gap:14px;font-size:10px;color:var(--cr-dim)}
          #v-cafmtrend .tr-lg{display:inline-flex;align-items:center;gap:5px}
          #v-cafmtrend .tr-sw{width:10px;height:10px;border-radius:2px;display:inline-block}
          #v-cafmtrend .tr-chart{padding:16px 16px 10px}
          #v-cafmtrend .tr-cols{display:flex;align-items:flex-end;gap:8px;height:210px}
          #v-cafmtrend .tr-col{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;height:100%;min-width:0}
          #v-cafmtrend .tr-bars{display:flex;align-items:flex-end;gap:3px;height:100%;width:100%;justify-content:center}
          #v-cafmtrend .tr-bar{width:42%;border-radius:3px 3px 0 0;min-height:2px;transition:height .3s}
          #v-cafmtrend .tr-bar.raised{background:#58a6ff}
          #v-cafmtrend .tr-bar.breach{background:#ff5555}
          #v-cafmtrend .tr-meta{display:flex;flex-direction:column;align-items:center;gap:1px;margin-top:7px}
          #v-cafmtrend .tr-otp{font-size:9.5px;font-weight:700;font-variant-numeric:tabular-nums}
          #v-cafmtrend .tr-otp.good{color:#3fb950}#v-cafmtrend .tr-otp.warn{color:#ffb454}#v-cafmtrend .tr-otp.bad{color:#ff6b6b}#v-cafmtrend .tr-otp.na{color:var(--cr-mute)}
          #v-cafmtrend .tr-xlab{font-size:9px;color:var(--cr-dim);white-space:nowrap}
          #v-cafmtrend .tr-age{padding:16px;display:flex;flex-direction:column;gap:12px}
          #v-cafmtrend .tr-agerow{display:flex;align-items:center;gap:14px}
          #v-cafmtrend .tr-agelab{width:92px;font-size:12px;color:var(--cr-ink);font-weight:600}
          #v-cafmtrend .tr-agebar{flex:1;height:24px;background:var(--cr-bg2);border-radius:6px;overflow:hidden}
          #v-cafmtrend .tr-agefill{height:100%;border-radius:6px;min-width:2px;transition:width .3s}
          #v-cafmtrend .tr-agefill.fresh{background:#3fb950}#v-cafmtrend .tr-agefill.recent{background:#58a6ff}#v-cafmtrend .tr-agefill.aging{background:#ffb454}#v-cafmtrend .tr-agefill.stale{background:#ff5555}
          #v-cafmtrend .tr-ageval{width:62px;text-align:right;font-variant-numeric:tabular-nums;font-weight:700;color:var(--cr-ink-hi)}
          #v-cafmtrend .tr-note{padding:0 16px 14px;font-size:11px;color:var(--cr-mute)}
          body.present-mode #v-cafmtrend.active{height:calc(100vh - 20px);overflow:auto}
        

          #v-cafmcomp .jeo-hero{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}
          #v-cafmcomp .jeo-kpi{background:var(--cr-panel);border:1px solid var(--cr-line);border-left:3px solid var(--cr-line2);border-radius:var(--r-lg);padding:14px 16px;box-shadow:var(--sh-1)}
          #v-cafmcomp .jeo-kpi.good{border-left-color:#3fb950}#v-cafmcomp .jeo-kpi.warn{border-left-color:#ffb454}#v-cafmcomp .jeo-kpi.bad{border-left-color:#ff5555}
          #v-cafmcomp .jeo-klab{font-size:9.5px;font-weight:600;letter-spacing:1px;color:var(--cr-dim)}
          #v-cafmcomp .jeo-kval{font-size:34px;font-weight:700;line-height:1.05;margin-top:4px;color:var(--cr-ink-hi);font-family:var(--f-disp);font-variant-numeric:tabular-nums}
          #v-cafmcomp .jeo-kpi.good .jeo-kval{color:#3fb950}#v-cafmcomp .jeo-kpi.warn .jeo-kval{color:#ffb454}#v-cafmcomp .jeo-kpi.bad .jeo-kval{color:#ff6b6b}
          #v-cafmcomp .jeo-ksub{font-size:11px;color:var(--cr-mute);margin-top:3px}
          #v-cafmcomp .co-note{display:flex;align-items:center;gap:9px;padding:10px 14px;margin-bottom:16px;border:1px solid rgba(243,167,18,.35);background:rgba(243,167,18,.10);border-radius:var(--r-lg);font-size:11.5px;color:var(--cr-ink)}
          #v-cafmcomp .co-panel{background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);box-shadow:var(--sh-1);margin-bottom:16px;overflow:hidden}
          #v-cafmcomp .co-ptitle{font-size:10px;font-weight:600;letter-spacing:1px;color:var(--cr-dim);padding:12px 16px;border-bottom:1px solid var(--cr-line);background:var(--cr-panel2)}
          #v-cafmcomp table{width:100%;border-collapse:collapse;font-size:12.5px}
          #v-cafmcomp th{font-size:9.5px;font-weight:600;letter-spacing:.6px;color:var(--cr-dim);text-transform:uppercase;padding:9px 12px;text-align:center}
          #v-cafmcomp th:first-child{text-align:left}
          #v-cafmcomp thead tr{border-bottom:1px solid var(--cr-line)}
          #v-cafmcomp td{padding:9px 12px;text-align:center;border-bottom:1px solid var(--cr-line);font-variant-numeric:tabular-nums;color:var(--cr-ink)}
          #v-cafmcomp tbody tr:last-child td{border-bottom:none}
          #v-cafmcomp .co-name{text-align:left;font-weight:600;color:var(--cr-ink)}
          #v-cafmcomp .co-ovd{color:#ff6b6b;font-weight:700}#v-cafmcomp .co-ovd.z{color:var(--cr-mute);font-weight:500}
          #v-cafmcomp .co-due{color:#ffb454;font-weight:700}#v-cafmcomp .co-due.z{color:var(--cr-mute);font-weight:500}
          #v-cafmcomp .co-rag{display:inline-block;min-width:52px;padding:2px 8px;border-radius:6px;font-weight:700;font-size:11.5px}
          #v-cafmcomp .co-rag.g{background:rgba(63,185,80,.14);color:#3fb950}#v-cafmcomp .co-rag.a{background:rgba(255,180,84,.16);color:#ffb454}#v-cafmcomp .co-rag.r{background:rgba(255,85,85,.14);color:#ff6b6b}#v-cafmcomp .co-rag.n{background:var(--cr-bg2);color:var(--cr-mute)}
          #v-cafmcomp .co-srow{cursor:pointer}
          #v-cafmcomp .co-srow:hover td{background:var(--cr-bg2)}
          #v-cafmcomp .co-caret{display:inline-block;width:12px;color:var(--cr-mute);transition:transform .15s}
          #v-cafmcomp .co-srow.open .co-caret{transform:rotate(90deg)}
          #v-cafmcomp .co-jobs td{padding:0;background:var(--cr-bg2)}
          #v-cafmcomp .co-jobs .cr-jobs{padding:4px 16px;max-height:320px;overflow:auto}
          #v-cafmcomp .co-patch{font-size:8.5px;font-weight:600;padding:1px 7px;border-radius:10px;border:1px solid;margin-left:8px;vertical-align:middle}
          #v-cafmcomp .co-empty{padding:26px;color:var(--cr-dim);text-align:center}
          #v-cafmcomp .co-jsite{flex:0 0 auto;font-size:10px;color:var(--cr-dim);max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
          body.present-mode #v-cafmcomp.active{height:calc(100vh - 20px);overflow:auto}
        

          #v-cafmppm .jeo-hero{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}
          #v-cafmppm .jeo-kpi{background:var(--cr-panel);border:1px solid var(--cr-line);border-left:3px solid var(--cr-line2);border-radius:var(--r-lg);padding:14px 16px;box-shadow:var(--sh-1)}
          #v-cafmppm .jeo-kpi.good{border-left-color:#3fb950}#v-cafmppm .jeo-kpi.warn{border-left-color:#ffb454}#v-cafmppm .jeo-kpi.bad{border-left-color:#ff5555}#v-cafmppm .jeo-kpi.brand{border-left-color:#58a6ff}
          #v-cafmppm .jeo-klab{font-size:9.5px;font-weight:600;letter-spacing:1px;color:var(--cr-dim)}
          #v-cafmppm .jeo-kval{font-size:34px;font-weight:700;line-height:1.05;margin-top:4px;color:var(--cr-ink-hi);font-family:var(--f-disp);font-variant-numeric:tabular-nums}
          #v-cafmppm .jeo-kpi.good .jeo-kval{color:#3fb950}#v-cafmppm .jeo-kpi.warn .jeo-kval{color:#ffb454}#v-cafmppm .jeo-kpi.bad .jeo-kval{color:#ff6b6b}#v-cafmppm .jeo-kpi.brand .jeo-kval{color:#58a6ff}
          #v-cafmppm .jeo-ksub{font-size:11px;color:var(--cr-mute);margin-top:3px}
          #v-cafmppm .pp-note{display:flex;gap:9px;padding:10px 14px;margin-bottom:16px;border:1px solid var(--cr-line);background:var(--cr-panel2);border-radius:var(--r-lg);font-size:11.5px;color:var(--cr-dim)}
          #v-cafmppm .pp-panel{background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);box-shadow:var(--sh-1);margin-bottom:16px;overflow:hidden}
          #v-cafmppm .pp-ptitle{font-size:10px;font-weight:600;letter-spacing:1px;color:var(--cr-dim);padding:12px 16px;border-bottom:1px solid var(--cr-line);background:var(--cr-panel2);display:flex;justify-content:space-between}
          #v-cafmppm .pp-src{font-size:9px;font-weight:600}
          #v-cafmppm .pp-src.plan{color:#58a6ff}#v-cafmppm .pp-src.cafm{color:#bf5af2}
          #v-cafmppm table{width:100%;border-collapse:collapse;font-size:12.5px}
          #v-cafmppm th{font-size:9.5px;font-weight:600;letter-spacing:.5px;color:var(--cr-dim);text-transform:uppercase;padding:9px 11px;text-align:center}
          #v-cafmppm th:first-child{text-align:left}
          #v-cafmppm th.pp-grp.plan{color:#58a6ff}#v-cafmppm th.pp-grp.cafm{color:#bf5af2}
          #v-cafmppm thead tr:first-child th{border-bottom:1px solid var(--cr-line)}
          #v-cafmppm td{padding:9px 11px;text-align:center;border-bottom:1px solid var(--cr-line);font-variant-numeric:tabular-nums;color:var(--cr-ink)}
          #v-cafmppm tbody tr:last-child td{border-bottom:none}
          #v-cafmppm tbody tr:hover td{background:var(--cr-bg2)}
          #v-cafmppm .pp-name{text-align:left;font-weight:600;color:var(--cr-ink)}
          #v-cafmppm .pp-plan{border-left:1px solid var(--cr-line)}
          #v-cafmppm .pp-rag{display:inline-block;min-width:50px;padding:2px 8px;border-radius:6px;font-weight:700;font-size:11.5px}
          #v-cafmppm .pp-rag.g{background:rgba(63,185,80,.14);color:#3fb950}#v-cafmppm .pp-rag.a{background:rgba(255,180,84,.16);color:#ffb454}#v-cafmppm .pp-rag.r{background:rgba(255,85,85,.14);color:#ff6b6b}#v-cafmppm .pp-rag.n{background:var(--cr-bg2);color:var(--cr-mute)}
          #v-cafmppm .pp-ovd{color:#ff6b6b;font-weight:700}#v-cafmppm .pp-ovd.z{color:var(--cr-mute);font-weight:500}
          #v-cafmppm .pp-empty{padding:26px;color:var(--cr-dim);text-align:center}
          body.present-mode #v-cafmppm.active{height:calc(100vh - 20px);overflow:auto}
        

          #v-cafmplant .jeo-hero{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}
          #v-cafmplant .jeo-kpi{background:var(--cr-panel);border:1px solid var(--cr-line);border-left:3px solid var(--cr-line2);border-radius:var(--r-lg);padding:14px 16px;box-shadow:var(--sh-1)}
          #v-cafmplant .jeo-kpi.bad{border-left-color:#ff5555}#v-cafmplant .jeo-kpi.warn{border-left-color:#ffb454}#v-cafmplant .jeo-kpi.good{border-left-color:#3fb950}
          #v-cafmplant .jeo-klab{font-size:9.5px;font-weight:600;letter-spacing:1px;color:var(--cr-dim)}
          #v-cafmplant .jeo-kval{font-size:34px;font-weight:700;line-height:1.05;margin-top:4px;color:var(--cr-ink-hi);font-family:var(--f-disp);font-variant-numeric:tabular-nums}
          #v-cafmplant .jeo-kpi.bad .jeo-kval{color:#ff6b6b}#v-cafmplant .jeo-kpi.warn .jeo-kval{color:#ffb454}
          #v-cafmplant .jeo-ksub{font-size:11px;color:var(--cr-mute);margin-top:3px}
          #v-cafmplant .ph-note{display:flex;gap:9px;padding:10px 14px;margin-bottom:16px;border:1px solid var(--cr-line);background:var(--cr-panel2);border-radius:var(--r-lg);font-size:11.5px;color:var(--cr-dim)}
          #v-cafmplant .ph-warn{border-color:rgba(243,167,18,.35);background:rgba(243,167,18,.10);color:var(--cr-ink)}
          #v-cafmplant .ph-panel{background:var(--cr-panel);border:1px solid var(--cr-line);border-radius:var(--r-lg);box-shadow:var(--sh-1);overflow:hidden}
          #v-cafmplant .ph-ptitle{font-size:10px;font-weight:600;letter-spacing:1px;color:var(--cr-dim);padding:12px 16px;border-bottom:1px solid var(--cr-line);background:var(--cr-panel2)}
          #v-cafmplant table{width:100%;border-collapse:collapse;font-size:12.5px}
          #v-cafmplant th{font-size:9.5px;font-weight:600;letter-spacing:.5px;color:var(--cr-dim);text-transform:uppercase;padding:9px 12px;text-align:center}
          #v-cafmplant th:first-child{text-align:left}
          #v-cafmplant thead tr{border-bottom:1px solid var(--cr-line)}
          #v-cafmplant td{padding:10px 12px;text-align:center;border-bottom:1px solid var(--cr-line);font-variant-numeric:tabular-nums;color:var(--cr-ink)}
          #v-cafmplant tbody tr:last-child td{border-bottom:none}
          #v-cafmplant tbody tr:hover td{background:var(--cr-bg2)}
          #v-cafmplant .ph-name{text-align:left;font-weight:600;color:var(--cr-ink)}
          #v-cafmplant .ph-sub{font-size:10px;color:var(--cr-mute);font-weight:500}
          #v-cafmplant .ph-up{color:#ff6b6b;font-weight:700}#v-cafmplant .ph-dn{color:#3fb950;font-weight:700}#v-cafmplant .ph-flat{color:var(--cr-mute)}
          #v-cafmplant .ph-na{color:var(--cr-mute);font-weight:500}
          #v-cafmplant .ph-risk{display:inline-block;min-width:64px;padding:3px 10px;border-radius:7px;font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.4px}
          #v-cafmplant .ph-risk.high{background:rgba(255,85,85,.15);color:#ff6b6b}#v-cafmplant .ph-risk.medium{background:rgba(255,180,84,.16);color:#ffb454}#v-cafmplant .ph-risk.low{background:var(--cr-bg2);color:var(--cr-mute)}
          #v-cafmplant .ph-empty{padding:26px;color:var(--cr-dim);text-align:center}
          body.present-mode #v-cafmplant.active{height:calc(100vh - 20px);overflow:auto}
        

        .vis-badge{display:inline-flex;align-items:center;gap:6px;font-size:10px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;padding:3px 9px;border-radius:999px;background:rgba(243,167,18,.12);color:var(--amber);border:1px solid rgba(243,167,18,.35)}
        .vis-rag{display:inline-block;min-width:52px;text-align:center;font-family:var(--f-mono);font-weight:600;font-size:12px;padding:2px 8px;border-radius:6px}
        .vis-rag.g{background:rgba(61,220,151,.14);color:var(--green)}
        .vis-rag.a{background:rgba(243,167,18,.14);color:var(--amber)}
        .vis-rag.r{background:rgba(255,107,107,.14);color:var(--red)}
        .vis-rag.n{background:var(--panel-2);color:var(--ink-mute)}
        .vis-bar{height:7px;border-radius:4px;background:var(--panel-2);overflow:hidden;min-width:80px}
        .vis-bar>span{display:block;height:100%;border-radius:4px}
        .vis-mx-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--r-lg);max-height:calc(100vh - 250px);min-height:340px}
        .vis-mx-search{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r);color:var(--ink);padding:6px 10px;font-size:12px;font-family:var(--f-ui);min-width:180px}
        .vis-mx-search:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
        .vis-mx-search::placeholder{color:var(--ink-mute)}
        .vis-mx-empty{padding:14px;text-align:center;color:var(--ink-mute);font-size:12px}
        table.vis-mx{border-collapse:separate;border-spacing:0;font-size:11px;min-width:100%}
        table.vis-mx th,table.vis-mx td{padding:6px 8px;border-bottom:1px solid var(--line);white-space:nowrap}
        table.vis-mx thead th{position:sticky;top:0;background:var(--panel-2);z-index:2;font-weight:600;color:var(--ink-dim);text-align:center}
        table.vis-mx thead th.vis-mx-course{writing-mode:vertical-rl;transform:rotate(180deg);height:120px;vertical-align:bottom;font-weight:500}
        table.vis-mx td.vis-mx-name,table.vis-mx th.vis-mx-name{position:sticky;left:0;background:var(--panel);z-index:1;text-align:left;min-width:170px;font-weight:500;color:var(--ink)}
        table.vis-mx thead th.vis-mx-name{z-index:3}
        .vis-cell{display:inline-block;width:16px;height:16px;border-radius:4px;border:1px solid var(--line-2)}
        .vis-cell.g{background:var(--green)}.vis-cell.a{background:var(--amber)}.vis-cell.r{background:var(--red)}
        .vis-cell.b{background:var(--brand)}.vis-cell.n{background:transparent;border-style:dashed}
        .vis-legend{display:flex;gap:16px;flex-wrap:wrap;font-size:11px;color:var(--ink-dim);margin:2px 0 12px}
        .vis-legend span{display:inline-flex;align-items:center;gap:6px}
      

        .bms-bar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:16px}
        .bms-bar select,.bms-bar input{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-size:12.5px;font-family:var(--f-ui);padding:7px 10px;height:34px}
        .bms-bar input.wide{min-width:240px}
        .bms-note{font-size:12.5px;line-height:1.6;color:var(--ink-dim);background:var(--panel);border:1px solid var(--line);border-left:2px solid var(--brand);border-radius:var(--r);padding:10px 14px;margin-bottom:16px}
        .bms-note b{color:var(--ink)}
        .bms-warn{border-left-color:var(--amber);color:var(--amber)}
        .bms-warn b{color:var(--ink)}

        /* record card — the shared row shape across every list */
        .bms-list{display:flex;flex-direction:column;gap:9px}
        .bms-rec{width:100%;text-align:left;background:linear-gradient(180deg,var(--panel),var(--bg-2));border:1px solid var(--line);border-radius:var(--r-lg);padding:13px 15px;cursor:pointer;transition:.13s;font-family:var(--f-ui)}
        .bms-rec:hover{border-color:var(--brand)}
        .bms-rec.done{opacity:.58}
        .bms-rline{display:flex;align-items:center;gap:9px;margin-bottom:7px;flex-wrap:wrap}
        .bms-dot{width:7px;height:7px;border-radius:50%;flex:none}
        .bms-sev{font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:600}
        .bms-kind{font-size:11.5px;color:var(--ink-mute)}
        .bms-ref{margin-left:auto;font-family:var(--f-mono);font-size:11px;color:var(--ink-mute)}
        .bms-rec h4{font-family:var(--f-disp);font-size:14.5px;font-weight:600;color:var(--ink);margin:0 0 3px}
        .bms-meta{font-family:var(--f-mono);font-size:11px;color:var(--ink-mute);line-height:1.5}
        .bms-burn{display:flex;align-items:center;gap:10px;margin-top:9px}
        .bms-rail{flex:1;height:4px;border-radius:3px;background:var(--line);overflow:hidden}
        .bms-rail i{display:block;height:100%;border-radius:3px}
        .bms-rem{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-dim);white-space:nowrap}
        .bms-rem.od{color:var(--red)}

        /* review clock line — every open adjustment plotted by how far through
           its window it is. The band past 100% is deliberately visible: an
           adjustment three times past its clock should look it. */
        .bms-clock{position:relative;height:104px;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;margin-bottom:6px}
        .bms-clock .band{position:absolute;left:78%;right:0;top:0;bottom:0;background:rgba(255,107,107,.07)}
        .bms-clock .tick{position:absolute;top:0;bottom:0;width:1px;background:var(--line-2)}
        .bms-clock .tick.warn{background:rgba(243,167,18,.5)}
        .bms-clock .tick.breach{background:rgba(255,107,107,.55)}
        .bms-clock .tick em{position:absolute;top:5px;left:5px;font-style:normal;font-family:var(--f-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);white-space:nowrap}
        .bms-clock .cdot{position:absolute;width:11px;height:11px;border-radius:50%;transform:translate(-50%,-50%);border:1.5px solid var(--bg);cursor:pointer;transition:.12s;padding:0}
        .bms-clock .cdot:hover{transform:translate(-50%,-50%) scale(1.5)}
        .bms-clock .cdot.od{box-shadow:0 0 0 3px rgba(255,107,107,.22)}
        .bms-clock .cempty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--ink-mute);font-size:12.5px}
        .bms-clockfoot{display:flex;justify-content:space-between;font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute);margin-bottom:18px}

        /* distributions */
        .bms-drow{display:grid;grid-template-columns:1fr 2.4fr auto;gap:10px;align-items:center;padding:5px 0;font-size:12.5px}
        .bms-drow .k{color:var(--ink-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
        .bms-drow .t{height:6px;border-radius:3px;background:var(--line);overflow:hidden}
        .bms-drow .t i{display:block;height:100%;border-radius:3px;background:var(--brand)}
        .bms-drow .v{font-family:var(--f-mono);font-size:11.5px;color:var(--ink)}

        /* pipeline */
        .bms-pipe{display:flex;height:34px;border-radius:var(--r);overflow:hidden;border:1px solid var(--line);margin:4px 0 10px}
        .bms-pipe div{display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10.5px;color:#06101f;font-weight:600;min-width:0;overflow:hidden}
        .bms-pipekey{display:flex;gap:14px;flex-wrap:wrap;font-family:var(--f-mono);font-size:10.5px;color:var(--ink-dim)}
        .bms-pipekey span{display:flex;align-items:center;gap:5px}
        .bms-pipekey i{width:9px;height:9px;border-radius:2px;display:inline-block}

        /* alerts */
        .bms-alert{display:flex;gap:11px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);border-left-width:2px;border-radius:var(--r);background:var(--panel);margin-bottom:7px;cursor:pointer;width:100%;text-align:left;font-family:var(--f-ui);transition:.12s}
        .bms-alert:hover{border-color:var(--brand)}
        .bms-alert.bad{border-left-color:var(--red)}
        .bms-alert.warn{border-left-color:var(--amber)}
        .bms-alert.ok{border-left-color:var(--green)}
        .bms-alert b{display:block;font-size:13px;color:var(--ink);font-weight:600;margin-bottom:2px}
        .bms-alert span{font-family:var(--f-mono);font-size:11px;color:var(--ink-mute)}

        /* weekly programme ribbon — Mon..Sun, one row per programme */
        .bms-week{display:flex;flex-direction:column;gap:3px;margin:8px 0}
        .bms-wrow{display:grid;grid-template-columns:30px 1fr;gap:8px;align-items:center}
        .bms-wrow .d{font-family:var(--f-mono);font-size:10px;color:var(--ink-mute)}
        .bms-wtrack{position:relative;height:13px;background:var(--bg);border-radius:3px;overflow:hidden;border:1px solid var(--line)}
        .bms-wseg{position:absolute;top:0;bottom:0;border-radius:2px}
        .bms-wlegend{display:flex;gap:14px;flex-wrap:wrap;font-family:var(--f-mono);font-size:10px;color:var(--ink-mute);margin-top:6px}
        .bms-wlegend i{width:9px;height:9px;border-radius:2px;display:inline-block;margin-right:5px;vertical-align:-1px}

        /* detail sheet */
        .bms-kv{display:grid;grid-template-columns:150px 1fr;gap:6px 14px;font-size:13px;padding:7px 0;border-bottom:1px solid var(--line)}
        .bms-kv dt{font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);padding-top:2px}
        .bms-kv dd{color:var(--ink);margin:0}
        .bms-quote{font-size:13.5px;line-height:1.6;color:var(--ink);background:var(--bg);border-left:2px solid var(--brand);border-radius:0 var(--r) var(--r) 0;padding:11px 14px;margin:12px 0}
        .bms-tl{display:flex;flex-direction:column;gap:0;margin-top:6px}
        .bms-tli{position:relative;padding:0 0 16px 20px;border-left:1px solid var(--line);font-size:12.5px;color:var(--ink-dim);line-height:1.55}
        .bms-tli:last-child{border-left-color:transparent}
        .bms-tli::before{content:'';position:absolute;left:-4.5px;top:5px;width:8px;height:8px;border-radius:50%;background:var(--line-2);border:1.5px solid var(--bg)}
        .bms-tli.m-Approved::before,.bms-tli.m-Closed::before{background:var(--green)}
        .bms-tli.m-Rejected::before{background:var(--red)}
        .bms-tli.m-Extended::before,.bms-tli.m-Submitted::before{background:var(--amber)}
        .bms-tli.m-Applied::before{background:var(--brand)}
        .bms-tli b{display:block;color:var(--ink);font-size:12.5px;font-weight:600;margin-bottom:2px}
        .bms-tli .ts{display:block;font-family:var(--f-mono);font-size:10px;color:var(--ink-mute);margin-top:3px}
        .bms-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
        .bms-act{padding:9px 15px;border-radius:var(--r);font-size:12.5px;font-weight:600;cursor:pointer;font-family:var(--f-ui);border:1px solid var(--line-2);background:var(--panel-2);color:var(--ink);transition:.13s}
        .bms-act:hover{border-color:var(--brand);color:var(--brand)}
        .bms-act.pri{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}
        .bms-act.pri:hover{opacity:.86;color:var(--on-brand)}
        .bms-act.danger:hover{border-color:var(--red);color:var(--red)}
        .bms-form{margin-top:16px;padding:14px;background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r)}
        .bms-form textarea{width:100%;min-height:82px;resize:vertical;background:var(--panel);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-ui);font-size:13px;padding:9px 11px}
        .bms-form textarea.err{border-color:var(--red)}
        .bms-form textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
        .bms-hint{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute);margin-top:8px;line-height:1.5}

        /* routing */
        .bms-route{display:flex;gap:10px;align-items:flex-start;padding:11px 13px;border:1px solid var(--line);border-radius:var(--r);background:var(--bg);margin:10px 0;font-size:12.5px;line-height:1.55;color:var(--ink-dim)}
        .bms-lvl{font-family:var(--f-mono);font-size:10px;letter-spacing:.09em;text-transform:uppercase;font-weight:600;padding:3px 8px;border-radius:4px;white-space:nowrap;flex:none}

        /* time-grid editor */
        .bms-grid{display:flex;flex-direction:column;gap:6px;margin:10px 0}
        .bms-grow{display:grid;grid-template-columns:34px 22px 1fr 1fr;gap:8px;align-items:center}
        .bms-grow label{font-family:var(--f-mono);font-size:11px;color:var(--ink-dim)}
        .bms-grow input[type=time]{background:var(--bg);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-mono);font-size:12px;padding:6px 8px;width:100%;color-scheme:dark}
        .bms-grow input[type=time]:disabled{opacity:.35}
        .bms-grow input[type=checkbox]{accent-color:var(--brand);width:15px;height:15px;cursor:pointer}

        .bms-cols{display:grid;grid-template-columns:1.15fr 1fr;gap:18px;align-items:start}
        @media(max-width:1180px){.bms-cols{grid-template-columns:1fr}}
        .bms-h{display:flex;align-items:center;gap:10px;margin:22px 0 10px}
        .bms-h:first-child{margin-top:0}
        .bms-h h3{font-family:var(--f-mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-dim);white-space:nowrap}
        .bms-h .rule{flex:1;height:1px;background:var(--line)}
        .bms-h .cnt{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute)}
        .bms-mods{display:flex;flex-direction:column;gap:7px;margin-bottom:6px}
        .bms-mod{display:flex;gap:11px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line-2);border-radius:var(--r);background:var(--bg);cursor:pointer;text-align:left;font-family:var(--f-ui);transition:.12s;width:100%}
        .bms-mod:hover{border-color:var(--brand)}
        .bms-mod[aria-pressed=true]{border-color:var(--brand);background:rgba(85,156,222,.09)}
        .bms-mod .bx{width:17px;height:17px;border-radius:4px;border:1px solid var(--line-2);flex:none;display:flex;align-items:center;justify-content:center;font-size:11px;color:transparent;margin-top:1px}
        .bms-mod[aria-pressed=true] .bx{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}
        .bms-mod b{display:block;font-size:13px;color:var(--ink);font-weight:600;margin-bottom:2px}
        .bms-mod span span{font-family:var(--f-mono);font-size:10.5px;color:var(--ink-mute);line-height:1.5}
        .bms-fb{background:var(--panel-2);border:1px solid var(--line-2);color:var(--ink-dim);border-radius:99px;padding:6px 13px;font-size:11.5px;font-family:var(--f-ui);cursor:pointer;transition:.13s}
        .bms-fb:hover{color:var(--ink);border-color:var(--brand)}
        .bms-fb[aria-pressed=true]{background:rgba(85,156,222,.14);border-color:var(--brand);color:var(--brand)}
        .bms-fbs{display:flex;gap:6px;flex-wrap:wrap}
      

      #cafm-opt-modal .modal-body{display:block;padding:0}
      #cafm-opt-modal .co-tabs{display:flex;gap:4px;padding:12px 22px 0;border-bottom:1px solid var(--line);flex-wrap:wrap}
      #cafm-opt-modal .co-tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--ink-dim);font-family:var(--f-ui);font-size:12.5px;font-weight:600;padding:8px 12px;cursor:pointer;transition:.13s}
      #cafm-opt-modal .co-tab:hover{color:var(--ink)}
      #cafm-opt-modal .co-tab.active{color:var(--brand);border-bottom-color:var(--brand)}
      #cafm-opt-modal #cafm-opt-body{padding:20px 22px;max-height:62vh;overflow:auto}
      #cafm-opt-modal .co-sec+.co-sec{margin-top:22px;padding-top:18px;border-top:1px solid var(--line)}
      #cafm-opt-modal .co-h{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:8px}
      #cafm-opt-modal .co-note{font-size:12px;line-height:1.6;color:var(--ink-dim);margin:8px 0 0}
      #cafm-opt-modal .co-note b{color:var(--ink)}
      /* radio cards — the option and why you'd pick it, on one line each */
      #cafm-opt-modal .co-radio{display:flex;gap:10px;align-items:flex-start;padding:11px 13px;margin-top:8px;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);cursor:pointer;transition:.13s}
      #cafm-opt-modal .co-radio:hover{border-color:var(--line-2)}
      #cafm-opt-modal .co-radio.on{border-color:var(--brand);background:rgba(85,156,222,.07)}
      #cafm-opt-modal .co-radio input{width:auto;margin-top:2px}
      #cafm-opt-modal .co-radio b{display:block;font-size:13px;color:var(--ink);font-weight:600}
      #cafm-opt-modal .co-radio em{display:block;font-style:normal;font-size:11.5px;color:var(--ink-dim);margin-top:2px;line-height:1.5}
      #cafm-opt-modal .co-checks{display:flex;gap:8px;flex-wrap:wrap}
      #cafm-opt-modal .co-checks-col{flex-direction:column;gap:6px}
      #cafm-opt-modal .co-check{display:inline-flex;align-items:center;gap:7px;padding:7px 12px;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);font-size:12.5px;color:var(--ink-dim);cursor:pointer;transition:.13s}
      #cafm-opt-modal .co-check:hover{border-color:var(--line-2);color:var(--ink)}
      #cafm-opt-modal .co-check.on{border-color:var(--brand);color:var(--ink);background:rgba(85,156,222,.07)}
      #cafm-opt-modal .co-check.co-dim{opacity:.55;cursor:default}
      #cafm-opt-modal .co-check input{width:auto}
      #cafm-opt-modal .co-segs{display:flex;gap:6px}
      #cafm-opt-modal .co-seg{background:var(--bg-2);border:1px solid var(--line);color:var(--ink-dim);border-radius:var(--r);padding:7px 15px;font-size:12.5px;font-family:var(--f-ui);cursor:pointer;transition:.13s}
      #cafm-opt-modal .co-seg:hover{color:var(--ink);border-color:var(--line-2)}
      #cafm-opt-modal .co-seg.on{background:rgba(85,156,222,.14);border-color:var(--brand);color:var(--brand)}
      #cafm-opt-modal .co-nums{display:flex;gap:14px;flex-wrap:wrap}
      #cafm-opt-modal .co-num{display:flex;flex-direction:column;gap:5px;font-size:11.5px;color:var(--ink-dim)}
      #cafm-opt-modal .co-num input{width:88px}
      #cafm-opt-modal .co-num em{font-style:normal;font-size:10.5px;color:var(--ink-mute)}
      /* the measured SLA table */
      #cafm-opt-modal .co-tbl{width:100%;border-collapse:collapse;margin-top:10px}
      #cafm-opt-modal .co-tbl th{font-family:var(--f-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);text-align:right;padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
      #cafm-opt-modal .co-tbl th:first-child{text-align:left}
      #cafm-opt-modal .co-tbl td{padding:9px 10px;text-align:right;font-family:var(--f-mono);font-size:12.5px;border-bottom:1px solid var(--line);color:var(--ink);white-space:nowrap}
      #cafm-opt-modal .co-tbl td.co-prio{text-align:left;font-family:var(--f-ui);text-transform:capitalize}
      #cafm-opt-modal .co-tbl td.co-prio i{display:block;font-style:normal;font-size:10px;color:var(--ink-mute);text-transform:none}
      #cafm-opt-modal .co-tbl td.co-n{color:var(--ink-mute)}
      /* an overridden cell says so, and keeps the measurement it replaced in
         view — an override that hid the measurement would hide the very
         misconfiguration the matrix exists to surface */
      #cafm-opt-modal .co-tbl td.co-ov{color:var(--brand)}
      #cafm-opt-modal .co-tbl td.co-ov i{display:block;font-style:normal;font-size:9.5px;color:var(--ink-mute)}
      #cafm-opt-modal .co-warn{font-family:var(--f-ui);font-size:10.5px;color:var(--amber)}
      #cafm-opt-modal .co-ok{color:var(--green)}
      #cafm-opt-modal .co-mini{padding:4px 10px;font-size:11px;width:auto;height:auto}
    

.wx-badge{display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 12px;border-radius:var(--r);background:var(--panel);border:1px solid var(--line-2);color:var(--ink);cursor:pointer;font-family:var(--f-ui);font-size:13px;transition:.13s}
.wx-badge:hover{background:var(--panel-2);border-color:var(--brand)}
.wx-badge .wx-loc{color:var(--ink-dim);font-size:12px;max-width:0;overflow:hidden;white-space:nowrap;transition:.18s;opacity:0}
.wx-badge:hover .wx-loc{max-width:80px;opacity:1;margin-right:1px}
.wx-badge .wx-ico{font-size:15px;line-height:1}
.wx-badge .wx-temp{font-weight:600;font-variant-numeric:tabular-nums}
.wx-modal{width:920px;max-width:100%}
.wx-controls{display:flex;flex-wrap:wrap;align-items:flex-end;gap:14px 18px;margin-bottom:14px}
.wx-dates{display:flex;gap:14px}
.wx-dates .field{display:flex;flex-direction:column;gap:5px}
.wx-dates label{font-family:var(--f-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
.wx-dates input{background:var(--bg-2);border:1px solid var(--line-2);border-radius:var(--r);color:var(--ink);font-family:var(--f-ui);font-size:13px;padding:7px 10px;color-scheme:dark}
.wx-dates input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
.wx-ranges{display:flex;gap:7px;flex-wrap:wrap}
.wx-range{background:var(--panel-2);border:1px solid var(--line-2);color:var(--ink-dim);border-radius:20px;padding:6px 13px;font-size:12px;cursor:pointer;transition:.12s}
.wx-range:hover{color:var(--ink);border-color:var(--brand)}
.wx-range.active{background:var(--brand-deep);border-color:var(--brand-deep);color:#fff}
.wx-chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.wx-chip{display:inline-flex;align-items:center;gap:7px;background:transparent;border:1px solid var(--line-2);color:var(--ink-dim);border-radius:20px;padding:6px 13px;font-size:12.5px;cursor:pointer;transition:.12s}
.wx-chip:hover{color:var(--ink)}
.wx-chip .wx-dot{width:9px;height:9px;border-radius:50%;background:currentColor;opacity:.35;transition:.12s}
.wx-chip.active{color:#fff;border-color:transparent}
.wx-chip.active .wx-dot{opacity:1}
.wx-chart-wrap{position:relative;height:380px}
.wx-msg{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--ink-mute);font-size:13px;pointer-events:none}
.wx-hint{margin-top:12px;color:var(--ink-mute);font-size:11.5px}
@media(max-width:640px){.wx-chart-wrap{height:300px}}


#ai-fab{position:fixed;right:22px;bottom:22px;z-index:900;display:flex;align-items:center;gap:0;height:52px;padding:0 15px;border-radius:26px;background:linear-gradient(135deg,var(--brand-deep),var(--violet));color:#fff;box-shadow:0 8px 26px rgba(47,111,196,.42);cursor:pointer;border:1px solid rgba(255,255,255,.16);transition:.18s;overflow:hidden;max-width:52px}
#ai-fab:hover{max-width:220px;box-shadow:0 10px 32px rgba(47,111,196,.55)}
#ai-fab svg{width:22px;height:22px;flex:0 0 22px}
#ai-fab .ai-fab-label{white-space:nowrap;font-weight:600;font-size:13.5px;opacity:0;margin-left:0;transition:.18s}
#ai-fab:hover .ai-fab-label{opacity:1;margin-left:10px}
#ai-panel{position:fixed;right:22px;bottom:22px;z-index:901;width:min(420px,calc(100vw - 32px));height:min(620px,calc(100vh - 90px));display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line-2);border-radius:var(--r-lg);box-shadow:0 24px 70px rgba(0,0,0,.55);overflow:hidden}
.ai-head{display:flex;align-items:center;justify-content:space-between;padding:13px 15px;background:var(--panel-2);border-bottom:1px solid var(--line)}
.ai-title{display:flex;align-items:center;gap:9px;font-family:var(--f-disp);font-weight:600;font-size:15px;color:var(--ink)}
.ai-title .ai-spark{width:18px;height:18px;color:var(--violet)}
.ai-title .ai-model{font-family:var(--f-mono);font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);border:1px solid var(--line-2);padding:2px 6px;border-radius:20px}
.ai-x{background:none;border:none;color:var(--ink-dim);font-size:16px;cursor:pointer;padding:4px 7px;border-radius:6px;line-height:1}
.ai-x:hover{background:var(--raised);color:var(--ink)}
.ai-log{flex:1;overflow-y:auto;padding:15px;display:flex;flex-direction:column;gap:12px}
.ai-msg{max-width:88%;padding:10px 13px;border-radius:12px;font-size:13.5px;line-height:1.55;white-space:pre-wrap;word-wrap:break-word}
.ai-msg.u{align-self:flex-end;background:var(--brand-deep);color:#fff;border-bottom-right-radius:4px}
.ai-msg.a{align-self:flex-start;background:var(--panel-2);color:var(--ink);border:1px solid var(--line);border-bottom-left-radius:4px}
.ai-msg.err{align-self:flex-start;background:rgba(255,107,107,.12);color:#ff9b9b;border:1px solid rgba(255,107,107,.3)}
.ai-msg.a code{font-family:var(--f-mono);font-size:12px;background:var(--bg-2);padding:1px 5px;border-radius:4px}
.ai-hint{color:var(--ink-mute);font-size:12.5px;text-align:center;margin:auto 10px;line-height:1.6}
.ai-typing{align-self:flex-start;display:flex;gap:4px;padding:12px 14px;background:var(--panel-2);border:1px solid var(--line);border-radius:12px}
.ai-typing span{width:6px;height:6px;border-radius:50%;background:var(--ink-mute);animation:aiBlink 1.2s infinite}
.ai-typing span:nth-child(2){animation-delay:.2s}.ai-typing span:nth-child(3){animation-delay:.4s}
@keyframes aiBlink{0%,60%,100%{opacity:.25}30%{opacity:1}}
.ai-input{display:flex;gap:8px;padding:12px;border-top:1px solid var(--line);background:var(--panel-2)}
.ai-input textarea{flex:1;resize:none;max-height:120px;background:var(--bg-2);border:1px solid var(--line-2);border-radius:9px;color:var(--ink);font-family:var(--f-ui);font-size:13.5px;padding:10px 12px;line-height:1.4}
.ai-input textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--ring)}
#ai-send{flex:0 0 40px;width:40px;border:none;border-radius:9px;background:var(--brand-deep);color:#fff;font-size:15px;cursor:pointer;transition:.15s}
#ai-send:hover{background:var(--brand)}#ai-send:disabled{opacity:.5;cursor:default}
/* Overview headline: coloured direction on the sub-line. Down is good for
   consumption and cost, which is the only place these are used. */
.kpi .k-sub.ov-up{color:var(--green)}
.kpi .k-sub.ov-dn{color:var(--red)}
/* Chart empty-state. Overlays the canvas rather than replacing it — see
   ovEmptyCanvas(): removing the canvas made the chart unrecoverable. */
.chart-h .chart-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  color:var(--ink-mute);font-size:12.5px;text-align:center;padding:0 20px}

/* ── NABERS UK ── */
.nb-kpis{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:20px}
.nb-kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:13px 17px;min-width:132px;flex:1 1 132px}
.nb-kpi i{display:block;font-family:var(--f-ui);font-style:normal;font-size:10.5px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:6px}
.nb-kpi b{display:block;font-family:var(--f-mono);font-size:23px;font-weight:600;
  line-height:1.1;color:var(--ink)}
.nb-kpi em{display:block;font-style:normal;font-family:var(--f-ui);font-size:11px;
  color:var(--ink-dim);margin-top:5px;line-height:1.4}
.nb-sec{font-family:var(--f-ui);font-size:11px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--ink-mute);margin:26px 0 4px}
.nb-secnote{font-family:var(--f-ui);font-size:12px;color:var(--ink-mute);line-height:1.6;
  margin:0 0 13px;max-width:60em}
.nb-card{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--line-2);
  border-radius:var(--r-lg);padding:15px 18px;margin-bottom:11px}
.nb-card.nb-ok{border-left-color:var(--green)}
.nb-card.nb-warn{border-left-color:var(--amber)}
.nb-card.nb-bad{border-left-color:var(--red)}
.nb-card.nb-skip{border-left-color:var(--line-2);opacity:.78}
.nb-stars{font-family:var(--f-mono);font-size:15px;letter-spacing:.12em;color:var(--brand)}
.nb-card.nb-bad .nb-stars{color:var(--red)}
.nb-card.nb-warn .nb-stars{color:var(--amber)}
.nb-card.nb-ok .nb-stars{color:var(--green)}
.nb-num{font-family:var(--f-mono);font-size:13px;color:var(--ink-dim)}
.nb-next{font-family:var(--f-ui);font-size:12.5px;color:var(--ink-dim);margin-top:12px;
  line-height:1.55}
.nb-next b{color:var(--ink)}
.nb-flagline{font-family:var(--f-ui);font-size:11.5px;color:var(--ink-mute);margin-top:8px;
  line-height:1.5}
.nb-warnflag{font-style:normal;font-family:var(--f-ui);font-size:10px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--amber);margin-left:6px}
.nb-blockers{list-style:none;margin:11px 0 0;padding:0}
.nb-blockers li{font-family:var(--f-ui);font-size:12.5px;color:var(--ink-dim);
  line-height:1.55;margin-bottom:5px}
.nb-field{font-family:var(--f-mono);font-size:10px;letter-spacing:.07em;text-transform:uppercase;
  color:var(--ink-mute);border:1px solid var(--line-2);border-radius:4px;padding:1px 6px;
  margin-right:9px}
.nb-fix{display:flex;flex-wrap:wrap;align-items:flex-end;gap:11px;margin-top:13px;
  padding-top:13px;border-top:1px solid var(--line)}
.nb-fix label{display:block;font-family:var(--f-ui);font-size:10.5px;letter-spacing:.07em;
  text-transform:uppercase;color:var(--ink-mute)}
.nb-fix input{display:block;margin-top:5px;width:150px;background:var(--panel-2);
  border:1px solid var(--line-2);border-radius:6px;color:var(--ink);
  font-family:var(--f-mono);font-size:13px;padding:7px 9px}
.nb-disclaimer{font-family:var(--f-ui);font-size:11.5px;color:var(--ink-mute);line-height:1.6;
  margin:26px 0 0;max-width:60em}
.nb-mtable{width:100%;border-collapse:collapse;margin-top:11px}
.nb-mtable td{font-family:var(--f-ui);font-size:12.5px;color:var(--ink-dim);
  padding:5px 10px 5px 0;border-bottom:1px solid var(--line);vertical-align:middle}
.nb-mtable td:first-child{color:var(--ink)}
.nb-mtable select{background:var(--panel-2);border:1px solid var(--line-2);border-radius:6px;
  color:var(--ink);font-family:var(--f-ui);font-size:12px;padding:5px 8px;min-width:190px}
.nb-jump{color:var(--brand);cursor:pointer;white-space:nowrap}
.nb-jump:hover{text-decoration:underline}
.nb-flagline.nb-conflict{color:var(--red)}
.nb-flagline.nb-conflict b{color:var(--red)}

/* ── Settings > Sections ──────────────────────────────────────────────────
   One row per section, its tabs indented under it. The switch reads as "this
   deployment uses it", not "disable it": the ON state is the normal one, so a
   page full of switches at rest says nothing is hidden. */
.sc-sec{border:1px solid var(--line-2);border-radius:var(--r);background:var(--bg);margin-bottom:8px;overflow:hidden}
.sc-sec.off{background:var(--bg-2);border-style:dashed}
.sc-row{display:flex;align-items:center;gap:12px;padding:11px 14px}
.sc-row+.sc-tabs{border-top:1px solid var(--line-2)}
.sc-name{font-size:13.5px;font-weight:600;color:var(--ink)}
.sc-sec.off .sc-name{color:var(--ink-dim)}
.sc-note{font-size:11.5px;color:var(--ink-mute);margin-left:auto;text-align:right;line-height:1.45}
.sc-locked{font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);margin-left:auto}
.sc-tabs{display:grid;grid-template-columns:1fr 1fr;gap:2px 18px;padding:8px 14px 12px 34px;background:var(--bg-2)}
.sc-tab{display:flex;align-items:center;gap:10px;padding:5px 0;font-size:12.5px;color:var(--ink)}
.sc-tab.off{color:var(--ink-dim)}
.sc-tab .switch{width:32px;height:18px}
.sc-tab .sw-track::before{width:12px;height:12px}
.sc-tab .switch input:checked + .sw-track::before{transform:translateX(14px)}
.sc-count{font-family:var(--f-mono);font-size:11px;color:var(--ink-mute)}
@media(max-width:720px){.sc-tabs{grid-template-columns:1fr}}
