:root{
  /* ---- accent (indigo) ---- */
  --accent:#6366F1;--accent-d:#4F46E5;--accent-l:#818CF8;
  --accent-soft:rgba(99,102,241,.10);--accent-soft-2:rgba(99,102,241,.16);
  /* secondary brand color — overridable per dealer (see css/triton.css). */
  --accent-2:#EC4899;--accent-2-d:#DB2777;
  /* ---- surfaces ---- */
  --bg:#f5f5f7;--sidebar-bg:#fbfbfd;--panel:#ffffff;
  --line:#e6e6eb;--line-2:#ededf1;
  --ink:#1d1d1f;--muted:#6e6e73;--muted-2:#86868b;
  /* ---- status ---- */
  --good:#15803D;--good-bg:#E7F6EC;
  --neutral:#B45309;--neutral-bg:#FBF3E2;
  --bad:#DC2626;--bad-bg:#FBEAEA;
  /* ---- misc ---- */
  --ring:rgba(99,102,241,.35);--ease:cubic-bezier(.4,0,.2,1);
  --sh-1:0 1px 2px rgba(17,17,26,.04),0 1px 3px rgba(17,17,26,.04);
  --sh-2:0 2px 8px rgba(17,17,26,.05),0 8px 24px rgba(17,17,26,.05);
  --sh-3:0 6px 16px rgba(17,17,26,.08),0 16px 40px rgba(17,17,26,.10);
  /* ---- legacy aliases (report markup references these) ---- */
  --teal:var(--accent);--teal-d:var(--accent-d);--navy:var(--ink);--gold:var(--neutral);}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  background:var(--bg);color:var(--ink);overflow:hidden;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}
#app{display:flex;flex-direction:column;height:100vh;overflow:hidden}
/* ---- header ---- */
header{background:#fff;color:var(--ink);padding:7px 24px;display:flex;align-items:center;justify-content:space-between;
  border-bottom:1px solid var(--line);box-shadow:var(--sh-1);position:relative;z-index:6;flex:0 0 auto}
header .hdr-title{flex:0 1 auto;min-width:0}
header .auth{margin-left:auto}
header h1{font-size:15px;margin:0;font-weight:600;letter-spacing:-.012em;color:var(--ink)}
header h1:focus{outline:none}
header .sub{font-size:11px;color:var(--muted);margin-top:1px}
.badge{font-size:10px;background:var(--accent-soft);color:var(--accent-d);padding:4px 9px;border-radius:8px;border:1px solid transparent}
/* ---- auth area ---- */
.auth{display:flex;align-items:center;gap:10px}
.auth-chip{font-size:12px;color:var(--muted);background:var(--bg);border:1px solid var(--line);padding:6px 11px;border-radius:9px;font-weight:500}
.auth-chip.admin{color:var(--accent-d);background:var(--accent-soft);border-color:transparent;font-weight:600}
.auth-chip.org{color:var(--fg);font-weight:600}
.auth-chip.org .org-level{margin-left:6px;padding:1px 6px;border-radius:6px;background:var(--accent-soft);color:var(--accent-d);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.02em}
.auth-chip.org .org-scope{margin-left:6px;color:var(--muted);font-weight:500}
.auth-btn{background:#fff;border:1px solid var(--line);border-radius:9px;padding:6px 13px;font-size:12.5px;cursor:pointer;color:var(--ink);font-weight:500;box-shadow:var(--sh-1);transition:background .15s var(--ease),border-color .15s var(--ease),box-shadow .15s var(--ease)}
.auth-btn:hover{background:#fafafb;border-color:#c7c7cc;box-shadow:var(--sh-2)}
.auth-select{appearance:none;-webkit-appearance:none;padding:6px 30px 6px 12px;font-size:12.5px;border:1px solid var(--line);border-radius:9px;color:var(--ink);cursor:pointer;box-shadow:var(--sh-1);
  background:#fff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none' stroke='%2386868b' stroke-width='1.5'><path d='M3 4.5 6 7.5 9 4.5'/></svg>") no-repeat right 10px center}
.auth-select:focus-visible{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--ring)}
/* ---- layout ---- */
.layout{display:flex;flex:1 1 auto;min-height:0}
nav{width:230px;background:var(--sidebar-bg);color:var(--ink);flex:0 0 230px;min-height:0;overflow-y:auto;font-size:13px;padding:0 10px 22px;border-right:1px solid var(--line)}
/* business logo, pinned to the top of the sidebar (the full-height left rail) */
.nav-brand{position:sticky;top:0;z-index:2;background:var(--sidebar-bg);
  display:flex;align-items:center;justify-content:center;padding:18px 12px 16px;margin-bottom:4px;border-bottom:1px solid var(--line)}
.nav-logo{height:auto;width:150px;max-width:100%;object-fit:contain;display:block}
/* content column to the right of the sidebar: header on top, scrolling main below */
.content{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0}
/* section header — clearly a non-clickable label: muted, uppercase, with a divider above */
nav .grp{padding:14px 12px 5px;font-size:10px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted-2);font-weight:700;border-top:1px solid var(--line);margin-top:8px}
nav .grp:first-of-type{border-top:none;margin-top:0}
/* report link — clearly a clickable item: darker text, button-like hover */
nav a{display:block;padding:8px 12px;margin:1px 0;border-radius:8px;color:var(--ink);text-decoration:none;cursor:pointer;font-weight:500;
  transition:background .14s var(--ease),color .14s var(--ease),box-shadow .14s var(--ease),transform .1s var(--ease)}
nav a:hover{background:var(--accent-soft-2);color:var(--accent-d)}
nav a:active{transform:translateY(.5px)}
nav a.on{background:var(--accent);color:#fff;font-weight:600;box-shadow:0 2px 8px var(--ring)}
nav a.on:hover{background:var(--accent-d);color:#fff}
main{flex:1;min-width:0;overflow-x:hidden;overflow-y:auto;background:var(--bg)}
/* ---- scrollbars ---- */
nav,main{scrollbar-width:thin;scrollbar-color:var(--accent) transparent}
nav::-webkit-scrollbar,main::-webkit-scrollbar{width:7px;height:7px}
nav::-webkit-scrollbar-track,main::-webkit-scrollbar-track{background:transparent}
nav::-webkit-scrollbar-thumb,main::-webkit-scrollbar-thumb{background:var(--accent);border-radius:8px}
nav::-webkit-scrollbar-thumb:hover,main::-webkit-scrollbar-thumb:hover{background:var(--accent-d)}
/* ---- toolbar (compact, single-row inline) ---- */
.toolbar{display:flex;gap:5px 12px;flex-wrap:wrap;align-items:center;background:rgba(255,255,255,.78);
  backdrop-filter:saturate(1.8) blur(20px);-webkit-backdrop-filter:saturate(1.8) blur(20px);
  border-bottom:1px solid var(--line);padding:5px 16px;position:sticky;top:0;z-index:5;box-shadow:var(--sh-1)}
/* groups read as one inline row; label sits beside its control, not stacked above */
.toolbar .grp{display:flex;flex-direction:row;align-items:center;gap:7px}
.toolbar label{font-size:11px;font-weight:600;color:var(--muted);text-transform:none;letter-spacing:0;white-space:nowrap}
/* self-describing controls (the dropdowns already say "All dealers" etc.) drop their
   label; segmented groups and the date range keep an inline label for clarity */
.toolbar .grp:has(select) > label,
.toolbar .grp:has(.mpick) > label{display:none}
.toolbar select{min-width:120px;padding-top:4px;padding-bottom:4px}
.toolbar .seg button{padding:3px 11px}
/* ---- form controls ---- */
select{appearance:none;-webkit-appearance:none;padding:7px 30px 7px 11px;font-size:13px;border:1px solid var(--line);border-radius:9px;color:var(--ink);min-width:132px;cursor:pointer;box-shadow:var(--sh-1);transition:border-color .15s var(--ease),box-shadow .15s var(--ease);
  background:#fff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none' stroke='%2386868b' stroke-width='1.5'><path d='M3 4.5 6 7.5 9 4.5'/></svg>") no-repeat right 10px center}
select:hover{border-color:#c7c7cc}
select:focus-visible{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--ring)}
.adm-input{padding:7px 11px;font-size:13px;border:1px solid var(--line);border-radius:9px;background:#fff;color:var(--ink);box-shadow:var(--sh-1);transition:border-color .15s var(--ease),box-shadow .15s var(--ease)}
.adm-input:hover{border-color:#c7c7cc}
.adm-input:focus-visible{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--ring)}
/* ---- segmented control (Apple-style) ---- */
.seg{display:inline-flex;background:#ececf0;border:1px solid var(--line);border-radius:10px;padding:2px;gap:2px}
.seg button{border:0;background:transparent;padding:6px 13px;font-size:12.5px;cursor:pointer;border-radius:8px;color:var(--muted);font-weight:500;
  transition:background .15s var(--ease),color .15s var(--ease),box-shadow .15s var(--ease)}
.seg button:hover:not(.on){color:var(--ink)}
.seg button.on{background:#fff;color:var(--ink);font-weight:600;box-shadow:var(--sh-1)}
.srcbtn{margin-left:auto;align-self:center;display:flex;gap:8px;align-items:center}
.src-pill{font-size:11px;font-weight:600;padding:5px 10px;border-radius:9px;background:var(--neutral-bg);color:var(--neutral);border:1px solid transparent}
.src-pill.live{background:var(--good-bg);color:var(--good)}
/* ---- buttons ---- */
.btn{background:#fff;border:1px solid var(--line);border-radius:9px;padding:7px 13px;font-size:12.5px;cursor:pointer;color:var(--ink);font-weight:500;box-shadow:var(--sh-1);
  transition:background .15s var(--ease),border-color .15s var(--ease),box-shadow .15s var(--ease),transform .1s var(--ease)}
.btn:hover{background:#fafafb;border-color:#c7c7cc;box-shadow:var(--sh-2)}
.btn:active{transform:translateY(.5px);box-shadow:var(--sh-1)}
.btn:focus-visible{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--ring)}
/* ---- page ---- */
.page{padding:18px 20px}
.page h2.ptitle{margin:0 0 3px;font-size:20px;font-weight:600;letter-spacing:-.015em;color:var(--accent)}
.page .pcrumb{font-size:11px;color:var(--muted-2);margin-bottom:7px;text-transform:uppercase;letter-spacing:.04em;font-weight:500}
.page .pdesc{font-size:12.5px;color:var(--muted);margin-bottom:15px;line-height:1.5;max-width:760px}
.row{display:grid;gap:14px;margin-bottom:14px}
/* standalone top-level blocks (cards/narrative emitted outside a .row) need their own
   vertical rhythm — .row supplies margin-bottom, a bare .card/.narr does not */
.page>.card,.page>.narr{margin-bottom:14px}
.kpis{grid-template-columns:repeat(auto-fit,minmax(155px,1fr))}
.c2{grid-template-columns:1fr 1fr}.c3{grid-template-columns:1fr 1fr 1fr}.c23{grid-template-columns:1.4fr 1fr}
/* ---- cards ---- */
.card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:18px;box-shadow:var(--sh-2);position:relative}
.card h3{margin:0 0 13px;font-size:12.5px;color:var(--ink);font-weight:600}
.kpi{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:15px 17px;position:relative;overflow:hidden;box-shadow:var(--sh-2);
  transition:transform .18s var(--ease),box-shadow .18s var(--ease)}
.kpi:hover{transform:translateY(-2px);box-shadow:var(--sh-3)}
.kpi::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--stripe,var(--accent))}
.kpi .lbl{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-weight:600}
.kpi .val{font-size:25px;font-weight:600;color:var(--ink);margin-top:5px;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.kpi .note{font-size:10.5px;color:var(--muted);margin-top:2px}
/* ---- bars ---- */
.bar-row{display:grid;grid-template-columns:120px 1fr 96px;align-items:center;gap:9px;margin-bottom:9px;font-size:12.5px}
.bar-track{background:#ececf0;border-radius:7px;height:18px;position:relative;overflow:hidden}
.bar-fill{height:100%;border-radius:7px;background:linear-gradient(90deg,var(--accent),var(--accent-l));transition:filter .15s var(--ease),width .3s var(--ease)}
.bar-goal{position:absolute;top:-3px;bottom:-3px;width:2px;background:var(--bad)}
.bar-val{text-align:right;font-variant-numeric:tabular-nums;color:var(--muted)}
/* ---- pills ---- */
.pill{font-size:10px;padding:2px 8px;border-radius:8px;font-weight:600}
.pill.good{background:var(--good-bg);color:var(--good)}.pill.neutral{background:var(--neutral-bg);color:var(--neutral)}.pill.bad{background:var(--bad-bg);color:var(--bad)}
.pill.elite{background:#E0F2F4;color:#0E7C86}
/* ---- tables ---- */
table{width:100%;border-collapse:collapse;font-size:12px}
th,td{text-align:left;padding:7px 8px;border-bottom:1px solid var(--line-2)}
th{color:var(--muted);font-weight:600;font-size:10px;text-transform:uppercase;letter-spacing:.03em}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
/* ---- legend ---- */
.legend{display:flex;gap:12px;flex-wrap:wrap;font-size:11.5px;margin-top:8px;color:var(--muted)}
.legend span{display:inline-flex;align-items:center;gap:5px}
.dot{width:9px;height:9px;border-radius:3px;display:inline-block}
/* ---- narrative ---- */
.narr{background:#fff;border:1px solid var(--line);border-left:4px solid var(--accent);border-radius:12px;padding:13px 16px;font-size:12.5px;line-height:1.55;color:var(--ink);box-shadow:var(--sh-1)}
/* ---- report loading indicator (shown while a report builds) ---- */
.rpt-busy{display:flex;align-items:center;justify-content:center;gap:12px;padding:72px 0;color:#64748b;font-size:13px;font-weight:600}
.rpt-busy .sp{width:22px;height:22px;border:3px solid var(--line);border-top-color:var(--accent);border-radius:50%;animation:oti-spin .7s linear infinite}
/* ---- site-wide loading overlay (shown for any data load / filter / fetch) ---- */
.oti-load{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;
  background:rgba(245,245,247,.55);backdrop-filter:blur(1.5px);-webkit-backdrop-filter:blur(1.5px);animation:oti-load-in .12s var(--ease) both}
.oti-load .oti-load-card{display:flex;align-items:center;gap:13px;background:var(--panel);border:1px solid var(--line);
  border-radius:12px;padding:15px 22px;box-shadow:var(--sh-3);color:var(--muted);font-size:13px;font-weight:600}
.oti-load .sp{width:24px;height:24px;border:3px solid var(--line);border-top-color:var(--accent);border-radius:50%;animation:oti-spin .7s linear infinite}
@keyframes oti-load-in{from{opacity:0}to{opacity:1}}
/* ---- home: category sections (each --cat / --cat-soft set on the <section>) ---- */
.home-sec{margin-top:26px}
.home-sec:first-of-type{margin-top:4px}
.home-sec-head{display:flex;align-items:flex-start;gap:11px;margin:0 2px 13px;padding-bottom:11px;
  border-bottom:1px solid var(--line)}
.home-sec-head .hs-ic{flex:0 0 auto;width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;
  font-size:13px;font-weight:700;letter-spacing:-.02em;background:var(--cat-soft,var(--accent-soft));color:var(--cat,var(--accent))}
.home-sec-head .hs-meta{flex:1 1 auto;min-width:0;padding-top:1px}
.home-sec-head .hs-title{font-size:15px;font-weight:700;color:var(--ink);letter-spacing:-.01em}
.home-sec-head .hs-desc{font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.45;max-width:760px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.home-sec-head .hs-count{flex:0 0 auto;align-self:center;font-size:10.5px;font-weight:600;color:var(--muted);
  background:var(--bg);border:1px solid var(--line);border-radius:20px;padding:3px 11px;white-space:nowrap}
/* ---- home grid (category-colored tiles) ---- */
.home-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));gap:12px}
.home-card{background:var(--cat-bg,var(--panel));border:1px solid var(--line);border-radius:12px;padding:14px 15px 14px 17px;cursor:pointer;position:relative;overflow:hidden;box-shadow:var(--sh-1);
  transition:transform .18s var(--ease),box-shadow .18s var(--ease),border-color .18s var(--ease),background .18s var(--ease)}
.home-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--cat,var(--accent))}
.home-card .ht{font-weight:600;color:var(--ink);font-size:13.5px;line-height:1.3}
.home-card .hd{font-size:11.5px;color:var(--muted);margin-top:3px}
.home-card:hover{transform:translateY(-2px);box-shadow:var(--sh-2);border-color:var(--cat,var(--accent));background:var(--cat-soft,var(--panel))}
/* ---- misc ---- */
.muted{color:var(--muted)} .gaugewrap{display:flex;gap:14px;flex-wrap:wrap;justify-content:space-around}
[data-drill]{cursor:pointer}
.bar-row[data-drill]:hover .bar-fill{filter:brightness(1.1)}
rect[data-drill]:hover,path[data-drill]:hover{opacity:.82}
tr[data-drill]:hover{background:#f5f5f7}
/* ---- chips ---- */
.chips{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}
.chip{background:var(--accent-soft);border:1px solid transparent;color:var(--accent-d);border-radius:9px;padding:5px 12px;font-size:11.5px;cursor:pointer;font-weight:600;
  transition:background .15s var(--ease),transform .1s var(--ease)}
.chip:hover{background:var(--accent-soft-2);transform:translateY(-1px)}
.chip:active{transform:translateY(0)}
.chip .x{margin-left:6px;opacity:.65}
.hint{font-size:10.5px;color:var(--muted);font-weight:400;font-style:italic}
/* ---- admin editors ---- */
.adm-input{padding:5px 8px;font-size:12.5px;border:1px solid var(--line);border-radius:5px;background:#fff;color:var(--ink);width:108px;text-align:right;font-variant-numeric:tabular-nums}
.adm-input:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 2px rgba(46,134,171,.15)}
.adm-actions{display:flex;gap:10px;align-items:center;margin-top:16px}
.adm-saved{font-size:12px;color:var(--good);font-weight:600}
.adm-dirty{font-size:12px;color:#9a7212;font-weight:600}
/* ---- period-over-period comparison band ---- */
.cmpband{border:1px solid var(--line);border-radius:8px;background:#F7FAFB;padding:10px 14px;margin:0 0 12px}
.cmptitle{font-size:12px;color:var(--ink);font-weight:600;margin-bottom:8px}
.cmptitle .cmpvs{color:var(--muted);font-weight:500}
.cmpgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.cmpcell{background:#fff;border:1px solid var(--line);border-radius:6px;padding:8px 10px}
.cmpcell .cmpl{font-size:11px;color:var(--muted)}
.cmpcell .cmpnow{font-size:18px;font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
.cmpdelta{font-size:12px;font-weight:700}
.cmpthen{font-size:11px;color:var(--muted);margin-left:4px}
.grp-members{display:grid;grid-template-columns:1fr 1fr;gap:4px 14px;margin-top:6px}
.grp-chk{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink);cursor:pointer}
.grp-chk input{cursor:pointer;margin:0}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn.primary{background:var(--teal);color:#fff;border-color:var(--teal);font-weight:600}
.btn.primary:hover{background:var(--teal-d);border-color:var(--teal-d)}
.deal-detail-pager{display:flex;align-items:center;gap:10px;margin-top:20px;flex-wrap:wrap}
.auth-select option{color:var(--ink)}

/* ---- roles & rights matrix ---- */
.matrix-scroll{overflow-x:auto}
.roles-matrix th.num,.roles-matrix td.num{text-align:center;min-width:46px}
.roles-matrix th{font-size:11px;white-space:nowrap;vertical-align:bottom}
.roles-matrix .rolecol{text-align:left;white-space:nowrap}
.roles-matrix input[type=checkbox]{cursor:pointer}
.roles-matrix input[type=checkbox]:disabled{cursor:not-allowed}
.role-name{font-weight:600}
.role-sys{font-size:10.5px;color:var(--muted);margin-left:6px;text-transform:uppercase;letter-spacing:.04em}

/* ---- ask-a-question (NL query) ---- */
.askbar{display:flex;gap:8px;align-items:center}
.q-card{border-left:4px solid var(--teal)}
.q-card .q-answer{font-size:30px;font-weight:700;color:var(--navy);font-variant-numeric:tabular-nums;line-height:1.1;margin:2px 0}
.q-card .q-extra{font-size:12.5px;color:var(--muted)}

/* ---- narrative insights & alerts ---- */
.insights{display:flex;flex-direction:column;gap:8px}
.insight{display:flex;gap:10px;align-items:flex-start;padding:9px 11px;border:1px solid var(--line);border-left-width:4px;border-radius:6px;background:#fff}
.insight.bad{border-left-color:var(--bad);background:#FDF3F2}
.insight.warn{border-left-color:var(--neutral);background:#FDF9EF}
.insight.good{border-left-color:var(--good);background:#F1F9F4}
.insight.info{border-left-color:var(--teal)}
.insight .ins-dot{flex:0 0 20px;width:20px;height:20px;line-height:20px;text-align:center;border-radius:50%;color:#fff;font-size:11px;font-weight:700}
.insight.bad .ins-dot{background:var(--bad)}
.insight.warn .ins-dot{background:var(--neutral)}
.insight.good .ins-dot{background:var(--good)}
.insight.info .ins-dot{background:var(--teal)}
.insight .ins-t{font-size:13px;font-weight:600;color:var(--ink)}
.insight .ins-d{font-size:12px;color:var(--muted);line-height:1.45;margin-top:2px}

/* ---- dashboard tiles (at-a-glance gauges) ---- */
.tilegrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:12px;margin-bottom:14px}
.tile{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:12px 10px 10px;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;height:100%}
.tile svg{display:block}
.tile.stat{justify-content:center;min-height:110px}
.tile .tile-v{font-size:26px;font-weight:700;color:var(--navy);font-variant-numeric:tabular-nums;margin-top:6px}
.tile .tile-l{font-size:11.5px;font-weight:600;color:var(--ink);text-transform:uppercase;letter-spacing:.3px;margin-top:2px}
.tile .tile-s{font-size:10.5px;color:var(--muted)}
.dash-sec{font-size:12px;font-weight:700;color:var(--navy);text-transform:uppercase;letter-spacing:.4px;margin:6px 2px 8px}
.tile-wrap{cursor:pointer;border-radius:8px;transition:box-shadow .1s;display:flex}
.tile-wrap>.tile{flex:1}
.tile-wrap:hover .tile{border-color:var(--teal)}
.tile-wrap.sel .tile{border-color:var(--teal);box-shadow:0 0 0 2px rgba(46,134,171,.25)}

/* ---- multi-level drilldown ---- */
.drillcrumb{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 12px;font-size:13px}
.drillcrumb .dc{color:var(--teal-d);font-weight:600;cursor:pointer;padding:2px 8px;border:1px solid var(--teal);border-radius:12px;background:#E8F1F6}
.drillcrumb .dc:hover{background:var(--teal);color:#fff}
.drillcrumb .dc.cur{background:var(--navy);color:#fff;border-color:var(--navy);cursor:default}
.drillcrumb .dcsep{color:var(--muted)}
tr[data-dstep]{cursor:pointer}
tr[data-dstep]:hover{background:#EaF2F6}
.drillhint{font-size:11px;color:var(--muted);font-style:italic;margin:0 0 8px}

/* ---- ranking controls ---- */
.rankctl{display:flex;align-items:center;gap:8px;margin:0 0 10px;flex-wrap:wrap}
.rankctl .ranklbl{font-size:10px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.4px}
/* charts: responsive wrapper + click-to-expand */
.chart{width:100%}
.chart svg{max-width:100%}
/* anchored to the card (the title row's right side is always clear), so it never overlaps bar values */
.chart-zoom,.chart-dl,.chart-copy{position:absolute;top:14px;right:14px;z-index:5;width:24px;height:24px;padding:0;border:1px solid var(--line);
  background:#fff;color:var(--muted);border-radius:6px;font-size:13px;line-height:1;cursor:pointer;opacity:.45}
.chart-dl{right:44px}
.chart-copy{right:74px}
.card:hover .chart-zoom,.card:hover .chart-dl,.card:hover .chart-copy{opacity:.85}
.card > h3{padding-right:94px}   /* reserve room so a long title never runs under the corner buttons */
.chart-zoom:hover,.chart-dl:hover,.chart-copy:hover{border-color:var(--teal);color:var(--teal-d);opacity:1}
.chart-copy.copied{border-color:var(--teal);color:var(--teal-d);opacity:1}
.chart-copy.copyfail{border-color:#c0392b;color:#c0392b;opacity:1}
.chart-modal{position:fixed;inset:0;z-index:200;background:rgba(15,23,42,.55);display:flex;align-items:center;justify-content:center;padding:24px}
.chart-modal-box{background:#fff;border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,.3);width:min(1100px,95vw);max-height:92vh;overflow:auto;padding:16px 20px 22px}
.chart-modal-head{display:flex;align-items:center;justify-content:space-between;gap:12px;font-weight:700;font-size:15px;color:var(--ink);margin-bottom:12px}
.chart-modal-x{border:0;background:transparent;font-size:24px;line-height:1;cursor:pointer;color:var(--muted)}
.chart-modal-x:hover{color:var(--ink)}
.chart-modal .chart-zoom,.chart-modal .chart-dl,.chart-modal .chart-copy{display:none}
.chart-modal-head .gap1{flex:1}
.chart-modal-png{border:1px solid var(--line);background:#fff;color:var(--muted);border-radius:6px;font-size:12px;font-weight:600;padding:3px 10px;cursor:pointer}
.chart-modal-png:hover{border-color:var(--teal);color:var(--teal-d)}
/* ---- print / PDF: show only the report content ---- */
@media print {
  header, nav, .toolbar, .nav-backdrop, .chips, .srcbtn, .navtoggle, .chart-zoom, .chart-dl, .chart-copy, .tbl-zoom, .oti-load, .actions-menu { display:none !important; }
  .layout { display:block !important; }
  main { margin:0 !important; padding:0 !important; }
  .card { break-inside:avoid; box-shadow:none; border:1px solid #d4dce2 }
  body, .layout, main { background:#fff !important }
  a[data-nav], [data-drill], [data-rank] { cursor:default }
  @page { margin:12mm }
  thead { display:table-header-group }        /* repeat table headers on each printed page */
  tr { break-inside:avoid }
  .tablewrap, .chart.wide { overflow:visible !important }  /* print full tables, not the scroll viewport */
  .kpi, .tile { break-inside:avoid }
}
/* ---- table expand / export control (drill.js openTableModal) ---- */
.tablewrap{position:relative}
.tbl-zoom{position:absolute;top:-26px;right:0;z-index:5;width:24px;height:24px;padding:0;border:1px solid var(--line);
  background:var(--panel);border-radius:6px;color:var(--muted);cursor:pointer;font-size:13px;line-height:1;opacity:0;transition:opacity .15s}
.card:hover .tbl-zoom{opacity:.85}
.tbl-zoom:hover{border-color:var(--teal);color:var(--teal-d);opacity:1}
.chart-modal .tbl-zoom{display:none}
.table-modal-body{overflow:auto;max-height:80vh}
.table-modal-body table{width:100%}
/* ---- sortable data tables (sort.js) ---- */
table.sortable>thead>tr>th{cursor:pointer;user-select:none;white-space:nowrap}
table.sortable>thead>tr>th:hover{color:var(--teal-d)}
table.sortable>thead>tr>th::after{content:"\2195";opacity:.28;font-size:9px;margin-left:4px}
table.sortable>thead>tr>th[data-sort=asc]::after{content:"\2191";opacity:.85}
table.sortable>thead>tr>th[data-sort=desc]::after{content:"\2193";opacity:.85}
/* ---- penetration heatmap ---- */
.heatmap{border-collapse:separate;border-spacing:3px;width:100%;font-size:11px;table-layout:fixed}
.heatmap thead th{font-weight:600;color:var(--muted);padding:3px 2px;text-align:center;font-size:10.5px}
.heatmap tbody th{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px;padding:4px 8px 4px 2px;font-weight:600;color:var(--ink);position:sticky;left:0;background:var(--panel);cursor:pointer}
.heatmap tbody th:hover{color:var(--teal-d)}
.heatmap td{text-align:center;padding:6px 4px;border-radius:5px;color:#16333f;font-weight:700;font-variant-numeric:tabular-nums}
.heat-legend{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:11px;color:var(--muted)}
.heat-bar{display:inline-block;width:140px;height:10px;border-radius:5px;background:linear-gradient(90deg,#FF3366,#ff9e00,#00C851)}
/* ---- KPI sparkline ---- */
.kpi-spark{margin-top:8px;height:22px}
.kpi-spark .spark{width:100%;height:22px;display:block;opacity:.85}
/* ---- toolbar actions: inline on desktop, overflow "…" menu on phones ---- */
.actions-menu{display:inline-flex;gap:8px;align-items:center}
.actions-menu>summary{display:none}
.actions-body{display:inline-flex;gap:8px;align-items:center;flex-wrap:wrap}
.anom-build{display:flex;flex-wrap:wrap;gap:6px 22px;align-items:flex-start}
.anom-build .seg{flex-wrap:wrap;max-width:780px}
.seg-val{display:inline-flex;align-items:center;gap:6px}
.anom-unit{color:var(--muted);font-weight:700;font-size:13px}
.medal{display:inline-block;width:20px;height:20px;line-height:20px;text-align:center;border-radius:50%;color:#fff;font-weight:700;font-size:11px;font-variant-numeric:tabular-nums}

/* ---- multi-select dropdown (MultiPick) ---- */
.mpick{position:relative;display:inline-block}
.mpick-btn{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:130px;max-width:210px;
  position:relative;z-index:30;   /* above another open dropdown's backdrop so switching fields is one click */
  padding:5px 8px;font-size:12.5px;border:1px solid var(--line);border-radius:5px;background:#fff;color:var(--ink);cursor:pointer}
.mpick-btn:hover{border-color:var(--teal)}
.mpick-btn.has{border-color:var(--teal);color:var(--teal-d);font-weight:600}
.mpick-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mpick-caret{font-size:9px;color:var(--muted)}
.mpick-backdrop{position:fixed;inset:0;z-index:20;background:transparent}
.mpick-panel{position:absolute;top:calc(100% + 4px);left:0;z-index:21;min-width:210px;max-width:280px;
  background:#fff;border:1px solid var(--line);border-radius:7px;box-shadow:0 6px 20px rgba(27,58,75,.16);padding:8px}
.mpick-search{width:100%;box-sizing:border-box;padding:5px 8px;font-size:12.5px;border:1px solid var(--line);border-radius:5px;margin-bottom:6px}
.mpick-search:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 2px rgba(46,134,171,.15)}
.mpick-list{max-height:240px;overflow-y:auto;display:flex;flex-direction:column;gap:1px}
.mpick-opt{display:flex;align-items:center;gap:8px;padding:4px 6px;font-size:12.5px;color:var(--ink);border-radius:4px;cursor:pointer}
.mpick-opt:hover{background:#EAF2F6}
.mpick-opt input{cursor:pointer;margin:0}
.mpick-all{font-weight:600;border-bottom:1px solid var(--line);border-radius:0;margin-bottom:3px;padding-bottom:6px}
.mpick-empty{font-size:12px;color:var(--muted);padding:6px;font-style:italic}
.mpick-foot{display:flex;align-items:center;justify-content:space-between;margin-top:6px;padding-top:6px;border-top:1px solid var(--line)}
.mpick-count{font-size:11px;color:var(--muted)}
.mpick-clear{background:#fff;border:1px solid var(--line);border-radius:5px;padding:3px 9px;font-size:11.5px;cursor:pointer;color:var(--muted)}
.mpick-clear:hover{border-color:var(--teal);color:var(--teal-d)}

/* ---- Blazor loading + error UI ---- */
.loading-progress{position:relative;display:block;width:8rem;height:8rem;margin:20vh auto 1rem}
.loading-progress circle{fill:none;stroke:#e6e6eb;stroke-width:0.6rem;transform-origin:50% 50%;transform:rotate(-90deg)}
.loading-progress circle:last-child{stroke:var(--accent);stroke-dasharray:calc(3.141*var(--blazor-load-percentage,0%)*0.8),500%;transition:stroke-dasharray .05s ease-in-out}
.loading-progress-text{position:absolute;text-align:center;font-weight:bold;inset:calc(20vh + 3.25rem) 0 auto 0;color:var(--muted)}
.loading-progress-text:after{content:var(--blazor-load-percentage-text,"Loading")}
/* DB-load phase: resources are 100% but data is still loading. Spin the ring so the
   loader honestly shows work is in progress instead of sitting at a full "100%". */
.oti-data-loading .loading-progress circle:last-child{stroke-dasharray:25%,500%;animation:oti-spin .9s linear infinite}
@keyframes oti-spin{from{transform:rotate(-90deg)}to{transform:rotate(270deg)}}
#blazor-error-ui{background:var(--bad-bg);color:var(--bad);border-top:1px solid var(--bad);bottom:0;display:none;left:0;padding:.6rem 1.25rem;position:fixed;width:100%;z-index:1000;box-shadow:0 -1px 2px rgba(0,0,0,.1)}
#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem}
@media (prefers-reduced-motion:reduce){
  *{transition:none!important}
  .kpi:hover,.home-card:hover{transform:none}
}

/* ---- mobile nav toggle (hamburger) — hidden on desktop ---- */
.navtoggle{display:none;border:1px solid var(--line);background:#fff;border-radius:9px;font-size:17px;line-height:1;
  padding:7px 12px;cursor:pointer;color:var(--ink);box-shadow:var(--sh-1);flex:0 0 auto}
.navtoggle:hover{background:#fafafb;border-color:#c7c7cc}
.nav-backdrop{display:none}
/* filter-pane toggle — hidden on desktop (toolbar always shown); shown on mobile */
.filtertoggle{display:none}

/* ============ responsive: tablet & phone ============ */
@media (max-width:768px){
  /* header: show hamburger, tighten, drop the tagline, keep title beside the toggle */
  header{padding:11px 12px;gap:8px;flex-wrap:nowrap}
  header h1{font-size:15.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  header .sub{display:none}
  .navtoggle{display:inline-flex;align-items:center;justify-content:center}
  /* keep the auth chip + sign-in control at full size and on one line; the brand
     title (min-width:0) takes the ellipsis when space runs out */
  .hdr-title{margin-right:auto;min-width:0}
  .auth{gap:6px;flex-wrap:nowrap;justify-content:flex-end;flex:0 0 auto}
  .auth-chip{white-space:nowrap}
  /* a <select> sizes to its widest option (long user names), so cap it — the visible
     "Sign in as…" label is short and the native dropdown still expands when opened */
  .auth-select{min-width:0;max-width:130px;text-overflow:ellipsis}

  /* sidebar becomes an off-canvas drawer with a tap-to-close backdrop */
  nav{position:fixed;top:0;left:0;bottom:0;width:266px;flex-basis:266px;z-index:40;padding-top:14px;
    transform:translateX(-100%);transition:transform .25s var(--ease);box-shadow:var(--sh-3)}
  .layout.nav-open nav{transform:translateX(0)}
  .nav-backdrop{display:block;position:fixed;inset:0;z-index:35;background:rgba(0,0,0,.38);
    opacity:0;visibility:hidden;transition:opacity .25s var(--ease),visibility .25s}
  .layout.nav-open .nav-backdrop{opacity:1;visibility:visible}

  /* filter pane: collapsed behind a toggle so it doesn't fill the screen */
  .filtertoggle{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;
    padding:10px 14px;font-size:13px;font-weight:600;color:var(--ink);background:#fff;cursor:pointer;
    border:0;border-bottom:1px solid var(--line);box-shadow:var(--sh-1)}
  .filtertoggle .ft-caret{font-size:10px;color:var(--muted)}
  .toolbar{display:none}
  main.filters-open .toolbar{display:flex}
  /* toolbar (when open): scroll with the page (not sticky), controls fill the width */
  .toolbar{position:static;padding:10px 12px;gap:10px}
  .toolbar .grp{flex:1 1 140px;min-width:140px}
  .toolbar select,.mpick,.mpick-btn{width:100%;min-width:0;max-width:none}
  .seg{flex-wrap:wrap}
  .srcbtn{margin-left:0;width:100%;flex-wrap:wrap}

  /* page padding + collapse fixed multi-column grids to single column */
  .page{padding:13px}
  .c2,.c3,.c23{grid-template-columns:1fr}
  .cmpgrid{grid-template-columns:1fr 1fr}
  .grp-members{grid-template-columns:1fr}
  .bar-row{grid-template-columns:92px 1fr 64px;gap:7px}

  /* wide data tables scroll horizontally instead of being clipped by main{overflow-x:hidden}.
     The heatmap is excluded so it stays a real <table> and its sticky first column works. */
  .page table:not(.heatmap),.card table:not(.heatmap){display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:nowrap}

  /* label-dense charts (heatmap / scatter / histogram): scroll at a legible width
     instead of shrinking labels to nothing when squeezed onto a phone */
  .chart.wide{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .chart.wide > svg,.chart.wide .heatmap{min-width:520px}
  .heatmap tbody th{max-width:120px}

  /* collapse the export / view actions behind a "…" button */
  .actions-menu{position:relative}
  .actions-menu>summary{display:inline-flex;align-items:center;justify-content:center;list-style:none;cursor:pointer;min-width:40px;font-size:18px;line-height:1}
  .actions-menu>summary::-webkit-details-marker{display:none}
  .actions-body{display:none}
  .actions-menu[open] .actions-body{display:flex;flex-direction:column;align-items:stretch;gap:8px;
    position:absolute;right:0;top:calc(100% + 6px);z-index:60;background:#fff;border:1px solid var(--line);
    border-radius:10px;box-shadow:var(--sh-3);padding:10px;min-width:180px}
  .actions-menu[open] .actions-body .btn,.actions-menu[open] .actions-body select{width:100%;text-align:left}
}

/* ============ responsive: small phone ============ */
@media (max-width:480px){
  header h1{font-size:14.5px}
  .page h2.ptitle{font-size:18px}
  .kpi .val{font-size:22px}
  .cmpgrid{grid-template-columns:1fr}
}
