/* elect.info -- the analysis of power. Persianate, money-forward brand (#2571):
   parchment/ink canvas, jewel-and-metal palette (garnet / saffron / gold with a
   teal counterpoint), editorial serif display + humanist sans body + mono for
   DATA ONLY. Signature: GILD THE VERIFIED FIGURE -- a sourced/traceable number
   gets gold; an estimate stays plain (ties provenance + as-of #2546). Retires the
   inherited Siege terminal (green-on-black, all-caps monospace, phosphor glow).
   Nonpartisan: no flat primary red/blue; partisan encoding is a jewel diverging
   (teal Dem / garnet Rep), with gold reserved for verified figures. Legacy token
   NAMES are kept (--green/--blue/--red) to minimise the diff; their VALUES are
   remapped to the brand palette, so every page inherits the brand at once. */
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@500;600;700&family=Spectral:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap');

:root{
  /* Persianate surfaces — parchment canvas, warm hairlines, ink text */
  --parchment:#F1E7CE; --ink:#17110C;
  --bg:#F1E7CE; --bg2:#EADFC0; --bg3:#E3D5AF; --panel:#F8F1DE;
  --border:#D8C79A; --border2:#E7DBBB; --grid:4px;
  --text:#17110C; --muted:#6B5D45; --faint:#9A8A6A;
  /* jewel-and-metal accents */
  --garnet:#6E1423; --saffron:#E3A72F; --gold:#C9A227; --teal:#2A9D8F;
  /* Metals family (BRAND_GUIDE.md "Metals" table) -- the money-accent
     sequence used for ordered/ranked composition plots ("gold sequential"). */
  --gold-bright:#E7C766; --gold-deep:#A9841E; --bronze:#8C6A2F; --copper:#B06B3A;
  /* money-flow four-series set (raised/spent/IE-support/transferred) --
     docs/brand/BRAND_GUIDE.md "Money-flow triad" table, electinfo/enterprise
     (name predates the 2026-08-30 four-series correction; still the source
     of truth). --teal-deep and --amethyst are deliberately distinct hexes
     from --teal/--blue (#2A9D8F) so a money series can never collide with
     the locked partisan encoding below; --copper (above) is the fourth role. */
  --teal-deep:#123F3A; --amethyst:#5E3B84;
  /* legacy primary-accent slot (was phosphor green) -> garnet; bright/hover -> teal.
     --greenglow is now a faint warm focus ring, not a neon halo. */
  --green:#6E1423; --green2:#2A9D8F; --greenglow:rgba(201,162,39,.16);
  /* partisan DATA ENCODING ONLY — jewel diverging, never flat primary red/blue.
     (brief suggests gold-teal; teal/garnet chosen to reserve gold for the
     verified-figure signature — the final partisan hues are a designer call.) */
  --blue:#2A9D8F;    /* Dem — DATA ENCODING ONLY, never brand/nav/links */
  --red:#6E1423;     /* Rep — DATA ENCODING ONLY, never brand/nav/links */
  --amber:#E3A72F;   /* partial (saffron) */
  --slate:#8A7B5C;   /* unknown / unverified (warm neutral) */
  --water:#6E1423;   /* editorial link colour (garnet) — NOT party blue */
  --water2:#2A9D8F;
  --mono:'IBM Plex Mono',ui-monospace,SFMono-Regular,'JetBrains Mono',monospace;  /* DATA only */
  --sans:'IBM Plex Sans',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
  --serif:'Spectral',Georgia,'Times New Roman',serif;                 /* ledes / body serif */
  --display:'Cormorant Garamond','Spectral',Georgia,serif;            /* editorial display */
  --gild:0 0 0 1px rgba(201,162,39,.35);   /* subtle gold ring for verified figures */
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);font-family:var(--sans);font-size:14px;line-height:1.55}
/* Workbench (Analyze + entitled compose): quiet warm lattice, no tactical neon grid. */
body.theme-workbench{
  background-image:
    radial-gradient(900px 480px at 88% -8%,rgba(201,162,39,.06),transparent),
    radial-gradient(700px 420px at -5% 0%,rgba(42,157,143,.06),transparent),
    linear-gradient(rgba(23,17,12,.020) 1px,transparent 1px),
    linear-gradient(90deg,rgba(23,17,12,.020) 1px,transparent 1px);
  background-size:auto,auto,32px 32px,32px 32px;}
/* Newsroom (public reading surfaces): calm parchment; links are garnet, headings
   are ink editorial serif; gold is reserved for the verified figure. */
body.theme-newsroom{background:var(--bg)}
body.theme-newsroom a{color:var(--water)}
body.theme-newsroom a:hover{color:var(--water2)}
body.theme-newsroom .section-h h1,body.theme-newsroom .section-h h2{color:var(--text)}
body.theme-newsroom .section-h h1::before,body.theme-newsroom .section-h h2::before{color:var(--gold)}
body.theme-newsroom .brand{color:var(--text)}
/* Buttons keep their OWN accent under newsroom (home-stage doors, Analyze plate,
   glossary doors). Higher class-count than `body.theme-newsroom a`, so these win. */
body.theme-newsroom .home-btn,body.theme-newsroom .ap-btn{color:var(--garnet)}
body.theme-newsroom .home-btn.ghost,body.theme-newsroom .ap-btn-ghost{color:var(--muted)}
body.theme-newsroom .entity-door{color:var(--teal)}
.lede{font-family:var(--serif);font-size:19px;line-height:1.6;color:var(--text);font-weight:400}
a{color:var(--water);text-decoration:none;transition:color .12s} a:hover{color:var(--water2)}
.mono{font-family:var(--mono)} .muted{color:var(--muted)} .faint{color:var(--faint)}
/* GILD THE VERIFIED FIGURE — the brand signature. A sourced/traceable-to-filing
   number carries gold; estimates stay plain (--muted). Apply `.verified` to any
   figure the DW attests. */
.verified,.gilded{color:var(--gold)}
.verified.ring{box-shadow:var(--gild);border-radius:3px;padding:0 4px}

/* top bar */
header{position:sticky;top:0;z-index:5;background:rgba(241,231,206,.92);backdrop-filter:blur(7px);border-bottom:1px solid var(--border)}
.bar{display:flex;align-items:center;gap:24px;padding:10px 22px;max-width:1360px;margin:0 auto}
.brand{display:flex;align-items:center;gap:9px;font-family:var(--display);font-weight:700;font-size:22px;letter-spacing:0;color:var(--text)}
.brand .dot{width:8px;height:8px;border-radius:50%;background:var(--gold);box-shadow:0 0 0 2px rgba(201,162,39,.25)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}
.brand small{color:var(--garnet);font-weight:600;font-size:10px;letter-spacing:.18em;text-transform:uppercase;font-family:var(--sans)}
nav{display:flex;gap:22px;font-family:var(--sans);font-size:13px;font-weight:600;letter-spacing:.01em}
nav a{color:var(--muted)} nav a:hover{color:var(--garnet)}
.login{font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.02em;color:var(--muted);border:1px solid var(--border);border-radius:4px;padding:4px 12px;text-decoration:none;white-space:nowrap}
.login:hover{color:var(--garnet);border-color:var(--garnet)}
.grow{flex:1}

/* honesty / coverage status strip — calm coverage meter, not alarm chrome */
.status{display:flex;align-items:center;gap:18px;padding:5px 22px;border-bottom:1px solid var(--border);
  background:var(--bg2);font-family:var(--sans);font-size:11px;color:var(--muted);max-width:1360px;margin:0 auto;
  letter-spacing:.01em}
.status .pill{display:inline-flex;align-items:center;gap:6px}
.status b{color:var(--text);font-weight:600}
.led{width:7px;height:7px;border-radius:50%}
.led.amber{background:var(--amber);color:var(--amber)}
.led.green{background:var(--teal);color:var(--teal)} .led.slate{background:var(--slate);color:var(--slate)}

/* layout */
.wrap{max-width:1360px;margin:0 auto;padding:22px 22px 64px}
.section-h{display:flex;align-items:baseline;gap:12px;margin:26px 2px 12px}
.section-h h1,.section-h h2{margin:0;font-family:var(--display);font-size:22px;font-weight:600;letter-spacing:0;color:var(--text)}
.section-h h1::before,.section-h h2::before{content:"\25AA  ";color:var(--gold);font-size:.6em;vertical-align:middle}
.section-h .rule{flex:1;height:1px;background:linear-gradient(90deg,var(--border),transparent)}
.panel{background:var(--panel);border:1px solid var(--border);border-radius:5px;padding:15px;margin-bottom:var(--grid)}
.panel h3{margin:0 0 12px;font-family:var(--sans);font-size:12px;font-weight:700;letter-spacing:.02em;color:var(--muted)}

/* race roster */
.race .cand{display:flex;align-items:center;gap:10px;margin-top:9px;padding-bottom:9px;border-bottom:1px solid var(--border2)}
.race .cand:last-child{border-bottom:none}
.race .party{width:3px;height:26px;border-radius:1px;background:var(--slate)}
.race .party.DEM,.race .party.d{background:var(--blue)}
.race .party.REP,.race .party.r{background:var(--red)}
.race .nm{flex:1;font-size:13px} .race .nm small{color:var(--muted);font-family:var(--mono);font-size:11px}
.race .amt{font-family:var(--mono);font-size:13px;color:var(--gold)}
.barbg{height:5px;background:var(--bg3);border-radius:2px;margin-top:4px;overflow:hidden}
.bar{height:100%;border-radius:2px;background:var(--slate)}
.bar.DEM{background:var(--blue)} .bar.REP{background:var(--red)}
.kv{font-family:var(--mono);color:var(--faint);font-size:12px}
/* Party pill — partisan jewel-diverging encoding (teal Dem / garnet Rep) */
.ppill{display:inline-block;font-family:var(--mono);font-size:10px;letter-spacing:.04em;padding:1px 6px;border-radius:3px;border:1px solid var(--border);color:var(--muted);vertical-align:middle;text-decoration:none}
a.ppill:hover{opacity:.72}
.ppill.dem{color:var(--blue);border-color:var(--blue)}
.ppill.rep{color:var(--red);border-color:var(--red)}
.ppill.other{color:var(--slate);border-color:var(--border)}
/* Home-state identity chip (#259) */
.home-chip{display:inline-block;font-family:var(--mono);font-size:10px;font-weight:700;letter-spacing:.06em;padding:2px 7px;border-radius:3px;border:1px solid var(--teal);color:var(--teal);vertical-align:middle;margin:0 6px}
tr.et-self{background:var(--bg2)}
tr.et-self td{border-bottom-color:var(--teal)}
/* Race-header (#471): a party's sole filer on record -- emphasized, not a claim
   they've won a primary, just that no contest exists to resolve. */
tr.et-headline td{border-left:3px solid var(--gold)}
/* Cross-party giving split bar (teal Dem / garnet Rep) */
.pbar{display:inline-flex;width:120px;height:8px;border-radius:2px;overflow:hidden;border:1px solid var(--border);vertical-align:middle}
.pbar span{display:block;height:100%}
.spark{vertical-align:middle;display:inline-block}

/* completeness banner */
.completeness-banner{display:flex;flex-wrap:wrap;align-items:center;gap:10px;border:1px solid var(--border);
  border-left-width:3px;border-radius:4px;padding:9px 13px;margin:0 0 var(--grid);font-size:12.5px;background:var(--bg2);font-family:var(--sans)}
.completeness-banner__heading{font-weight:700}
.completeness-banner__detail{color:var(--muted)}
.completeness-banner__tier,.completeness-banner__vintage{font-size:11px;color:var(--faint)}
.completeness-banner--warn{border-left-color:var(--amber)} .completeness-banner--warn .completeness-banner__heading{color:var(--amber)}
.completeness-banner--info{border-left-color:var(--slate)} .completeness-banner--info .completeness-banner__heading{color:var(--slate)}
.completeness-banner--ok{border-left-color:var(--teal)} .completeness-banner--ok .completeness-banner__heading{color:var(--teal)}

/* footer */
footer{border-top:1px solid var(--border);color:var(--faint);font-size:11px;padding:18px 22px;margin-top:20px;
  font-family:var(--sans);max-width:1360px;margin-left:auto;margin-right:auto;display:flex;gap:18px;flex-wrap:wrap;
  letter-spacing:.01em}
footer::before{content:"\25CF elect.info";color:var(--gold);letter-spacing:.04em;font-weight:600}

/* KPI strip (entity counts, non-money) — figures gilded (verified) */
.kpi-strip{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:1px;background:var(--border);padding:1px;border-radius:5px}
.kpi{display:flex;flex-direction:column;gap:3px;padding:14px 14px;background:var(--panel)}
.kpi-num{font-family:var(--mono);font-size:26px;font-weight:600;color:var(--gold);line-height:1.05}
.kpi-label{font-family:var(--sans);font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}

/* committees-by-type */
.ctype{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:6px 0;border-bottom:1px solid var(--border2)}
.ctype:last-child{border-bottom:none}
.ctype-label{font-size:13px;color:var(--text)}
.ctype-count{font-family:var(--mono);font-size:14px;font-weight:600;color:var(--gold)}

/* explore list pages (candidates / committees / parties / vendors) */
.explore-filter{display:flex;gap:8px;flex-wrap:wrap}
.explore-filter input{background:var(--panel);border:1px solid var(--border);color:var(--text);
  padding:8px 11px;border-radius:4px;font-size:13px;font-family:var(--sans)}
.explore-filter .ef-q{flex:1;min-width:180px}
.explore-filter .ef-st{width:64px;text-transform:uppercase;text-align:center}
.explore-filter input:focus{outline:none;border-color:var(--gold);box-shadow:var(--gild)}
.explore-filter .ef-go{background:var(--panel);border:1px solid var(--border);color:var(--garnet);cursor:pointer;
  padding:8px 18px;border-radius:4px;font-size:12px;letter-spacing:.02em;font-family:var(--sans);font-weight:600}
.explore-filter .ef-go:hover{border-color:var(--garnet);color:var(--garnet)}
table.etable{width:100%;border-collapse:collapse}
table.etable th{text-align:left;font-family:var(--sans);font-size:10px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muted);padding:7px 8px;border-bottom:1px solid var(--border)}
table.etable td{padding:8px;font-size:13px;border-bottom:1px solid var(--border2);vertical-align:top}
table.etable td.mono{font-size:12px}
table.etable td.et-name{color:var(--text);font-weight:600}
table.etable tbody tr:hover{background:var(--bg2)}
table.etable th.et-sortable{cursor:pointer;user-select:none}
table.etable th.et-sortable:hover{color:var(--text)}
table.etable th.sorted-asc::after{content:" \2191";font-size:9px}
table.etable th.sorted-desc::after{content:" \2193";font-size:9px}

/* ── dashboard landing (home_page) ─────── */
.dash-toolbar{display:flex;align-items:center;gap:6px;padding:6px 0 2px;flex-wrap:wrap}
.dash-tab{font-family:var(--sans);font-size:12px;letter-spacing:.01em;color:var(--muted);
  padding:5px 11px;border:1px solid var(--border);border-radius:3px}
.dash-tab.active{color:var(--garnet);border-color:var(--teal);background:var(--panel)}
a.dash-tab:hover{color:var(--garnet);border-color:var(--teal)}
.dash-chip{font-family:var(--sans);font-size:10px;letter-spacing:.03em;color:var(--muted);
  padding:4px 9px;border:1px solid var(--border);border-radius:3px}
.dash-chip.live{color:var(--teal);border-color:var(--teal)}
.dash-chip.warn{color:var(--amber);border-color:var(--amber)}
.dash-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));grid-auto-flow:row dense;
  grid-auto-rows:minmax(212px,1fr);gap:4px;margin-top:4px}
.dash-panel{background:var(--panel);border:1px solid var(--border);display:flex;flex-direction:column;min-height:212px}
.dash-panel--primary{grid-column:span 2;grid-row:span 2}
.dash-panel-h{height:36px;display:flex;align-items:center;gap:8px;padding:0 13px;border-bottom:1px solid var(--border2);flex:0 0 36px}
.dash-panel-h h3{margin:0;font-family:var(--display);font-size:16px;font-weight:600;letter-spacing:0;color:var(--text)}
.dash-panel-h .dash-panel-note{margin-left:auto;font-family:var(--mono);font-size:10px;color:var(--faint);letter-spacing:.04em}
.dash-panel-b{flex:1;padding:14px 13px;overflow:auto}
.dash-kicker{margin:0 0 7px;font-family:var(--sans);font-size:11px;font-weight:700;letter-spacing:.03em;color:var(--garnet)}
.dash-lede{font-size:15px;line-height:1.6;color:var(--text)}
.dash-lede p{margin:0 0 10px}
.dash-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px}
.dash-btn{font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.02em;color:var(--garnet);
  border:1px solid var(--teal);padding:9px 15px;border-radius:3px;background:rgba(42,157,143,.06)}
.dash-btn:hover{background:rgba(42,157,143,.12);color:var(--garnet)}
.dash-btn.ghost{color:var(--muted);border-color:var(--border);background:none}
.dash-btn.ghost:hover{color:var(--text)}
.dash-links{display:flex;flex-direction:column;gap:8px;font-family:var(--sans);font-size:13px}
.dash-panel .kpi-strip{background:none;padding:0;gap:12px}
.dash-panel .kpi{background:none;padding:2px 0}
@media(max-width:720px){.dash-panel--primary{grid-column:span 1;grid-row:span 1}}

/* cycle chips (explore filter + dashboard) */
.cycle-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:10px}
.cycle-chips .cyc-label{font-family:var(--sans);font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--faint);margin-right:2px}
.cyc{font-family:var(--mono);font-size:11px;color:var(--muted);padding:4px 9px;border:1px solid var(--border);border-radius:3px}
.cyc:hover{color:var(--garnet);border-color:var(--teal)}
.cyc.active{color:var(--garnet);border-color:var(--teal);background:var(--panel)}
.cyc-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:5px}

/* cycle hub cards (per-cycle actor rosters) */
.cyc-block{margin-top:18px}
.cyc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:10px;margin-top:6px}
.cyc-card{display:flex;flex-direction:column;gap:3px;padding:13px;border:1px solid var(--border);border-radius:4px;background:var(--panel)}
.cyc-card:hover{border-color:var(--teal)}
.cyc-card .yr{font-size:20px;font-weight:700;color:var(--gold);font-family:var(--display)}
.cyc-card .k{font-size:9px;text-transform:uppercase;letter-spacing:.1em;color:var(--faint)}
.cyc-card .rost{font-size:12px;color:var(--muted);margin-top:2px}
.cyc-card .rost b{color:var(--text)}
/* Coded-field gloss */
.gloss{color:var(--faint);font-size:.92em}
.gloss a{color:var(--muted);text-decoration:none;border-bottom:1px dotted var(--border)}
.gloss a:hover{color:var(--garnet);border-color:var(--garnet)}

/* Launchpad tile-strip (#132) — every entity page is a glance + gateway HUD. */
.launchpad{display:grid;grid-template-columns:repeat(auto-fill,minmax(158px,1fr));gap:8px;margin:14px 0 4px}
.lp-tile{display:flex;flex-direction:column;gap:2px;padding:10px 12px;border:1px solid var(--border);border-radius:5px;
  background:var(--panel);text-decoration:none;color:var(--text);transition:border-color .12s,background .12s}
a.lp-tile:hover{border-color:var(--gold);background:var(--bg3)}
.lp-label{font-family:var(--sans);font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--faint)}
.lp-metric{font-size:19px;font-weight:700;letter-spacing:-.01em;line-height:1.15;font-family:var(--display)}
.lp-sub{font-size:10px;color:var(--muted);line-height:1.25}
.lp-go{font-family:var(--mono);font-size:9px;color:var(--garnet);margin-top:5px}
.lp-held .lp-metric{color:var(--amber)}.lp-held .lp-go{color:var(--amber)}
.lp-soon .lp-metric{color:var(--slate)}.lp-soon .lp-go{color:var(--slate)}

/* ── #309 — phone + tablet responsive pass ───────── */
@media (max-width:960px){
  .wrap{padding:16px 14px 48px}
  .section-h{flex-wrap:wrap}
}
@media (max-width:760px){
  header .bar{flex-wrap:wrap;gap:8px 12px;padding:10px 14px}
  header .bar .grow{display:none;flex:0}
  header nav{order:3;width:100%;display:flex;flex-wrap:wrap;gap:9px 16px}
  header .bar form{order:2;margin:0!important}
  header .bar form input{width:100%!important}
  .status{flex-wrap:wrap;gap:8px 14px;padding:8px 14px}
  .panel{overflow-x:auto}
  table.etable{min-width:480px}
  .dash-grid{grid-template-columns:1fr!important}
  .dash-panel--primary{grid-column:auto!important;grid-row:auto!important}
}
@media (max-width:520px){
  .wrap{padding:12px 10px 40px}
  .brand small{display:none}
  body{font-size:13.5px}
  .kpi-strip{grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}
  .kpi-num{font-size:22px}
}

/* ── #257 in-page geography HUD — inline expandable disclosure ── */
.geo-inline{border:1px solid var(--border);border-radius:5px;background:var(--panel);margin:10px 0}
.geo-inline>summary{list-style:none;cursor:pointer;padding:11px 14px;display:flex;align-items:center;gap:12px;
  font-family:var(--sans);font-size:13px;letter-spacing:.01em;color:var(--text)}
.geo-inline>summary::-webkit-details-marker{display:none}
.geo-inline>summary::before{content:"\25B8";color:var(--gold);display:inline-block;transition:transform .15s}
.geo-inline[open]>summary::before{transform:rotate(90deg)}
.geo-inline>summary:hover{color:var(--garnet)}
.geo-inline-label{flex:1}
.geo-inline-full{font-size:10px;color:var(--water,#6E1423);text-decoration:none;white-space:nowrap}
.geo-inline-full:hover{color:var(--garnet)}
.geo-inline-body{border-top:1px solid var(--border)}
.geo-inline-frame{width:100%;border:0;display:block;background:transparent;min-height:260px}
