/* =============================================================================
   QUEERING ANCs — STRUCTURE / COMPONENT LAYER
   Capital Stonewall Democrats
   -----------------------------------------------------------------------------
   Brand-agnostic: references tokens (theme.css) only, never a raw brand value.
   A superset of the original styles.css — every existing class name & behavior
   is preserved; states are refined and new civic/learning components are added.
   ============================================================================ */

/* ----------------------------------------------------------------------------
   0 · RESET & BASE
   ---------------------------------------------------------------------------- */
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
/* Q124 — the [hidden] attribute always wins. A component class that sets display (e.g. .pulse-band's
   inline-flex) otherwise overrides the UA [hidden]{display:none} and renders an EMPTY pill — the errant
   hero bubble. Elements are always revealed by REMOVING the attribute, never by overriding display. */
[hidden]{display:none !important}
body{
  margin:0;
  background:var(--bg);
  color:var(--text);
  font-family:var(--font-ui);
  font-size:var(--fs-body);
  line-height:var(--lh-body);
  font-weight:var(--fw-regular);
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
img,svg{max-width:100%}
hr{border:0;border-top:1px solid var(--line);margin:var(--space-7) 0}
::selection{background:var(--accent);color:var(--paper)}

/* Consistent keyboard focus everywhere. Components override with their own
   ring where a tighter fit looks better, but nothing is ever focus-invisible. */
:where(a,button,input,select,textarea,summary,[tabindex]):focus-visible{
  outline:var(--focus-ring);
  outline-offset:var(--focus-offset);
  border-radius:var(--r-xs);
}
:where(a,button,input,select,textarea,summary):focus:not(:focus-visible){outline:none}

/* Skip link for keyboard / screen-reader users */
.skip-link{
  position:absolute;left:var(--space-4);top:-60px;z-index:50;
  background:var(--ink);color:var(--on-dark);
  padding:10px 16px;border-radius:var(--r-sm);font-weight:600;font-size:14px;text-decoration:none;
  transition:top var(--dur-fast) var(--ease);
}
.skip-link:focus{top:var(--space-4)}

/* ----------------------------------------------------------------------------
   1 · LAYOUT · MASTHEAD · BRANDMARK
   ---------------------------------------------------------------------------- */
/* ACCEPTANCE-ADDENDUM §2.14 — the marketing content axis uses a 40px gutter (24 ≤560). Override --gutter on the
   marketing subtree only; app pages (no body.mktg) keep the base --gutter. Every marketing element that reads
   var(--gutter) (.wrap/.lwrap, hero-in, lnav-in, section-pad) picks this up, so all marketing gutters match. */
body.mktg{--gutter:40px}
@media(max-width:560px){body.mktg{--gutter:24px}}
/* Mobile touch target — consent/opt-in checkboxes + radios on marketing forms were browser-default (~13px),
   too small to tap on a phone. Bump to a 20px box (toward WCAG 2.5.8) with a token accent. App forms unchanged. */
body.mktg input[type="checkbox"],body.mktg input[type="radio"]{width:20px;height:20px;min-width:20px;min-height:20px;flex:none;accent-color:var(--accent);cursor:pointer}
/* Mobile touch target (app tier) — the marketing rule above was scoped body.mktg only, so real checkboxes/
   radios on tool surfaces (voter-tool header toggle, CRM standardized checkboxes, canvass dispositions, sheet
   bodies) stayed browser-default ~13px on a phone — below the §2.5 / 2.5.8 floor. Same 20px box + token accent,
   scoped to the app shell + the sheet so the field is tappable one-handed. Custom-styled chips use hidden
   inputs + a styled span and are untouched (they already meet 44px). */
html.has-tool-rail input[type="checkbox"],html.has-tool-rail input[type="radio"],
.sheet__body input[type="checkbox"],.sheet__body input[type="radio"]{width:20px;height:20px;min-width:20px;min-height:20px;flex:none;accent-color:var(--accent);cursor:pointer}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--gutter) var(--space-11)}
.wrap.wide{max-width:var(--maxw-wide)}
/* Q197 — the wide container. Pages write class="wrap wrap-wide" (one class), but the rule above is `.wrap.wide`
   (two classes) — so `wrap-wide` matched nothing and every wide page silently fell back to 720px (the "wrong/
   skinny width"). Define it globally, ONE source, so the chrome frame is consistent everywhere it's used. */
.wrap-wide{max-width:var(--maxw-wide)}

/* Q615 — APP SHELL. The logged-in Campaign Copilot (/learn/ + demo) and the Admin console (/admin/) are a
   full-viewport APP, not the marketing site: a full-height anchored left rail + an independently-scrolling
   main pane, no marketing masthead. This is the SHARED foundation (spec docs/APP_SHELL_SPEC.md) — each
   surface adds its own rail colour (portal pink in portal.css; admin ink in admin.css). `.is-app` is set once
   the app is entered (portal: when signed in / demo; admin: always). Before it, the container is a plain
   document-flow block (the sign-in doorway keeps its centred column). */
.appshell{min-height:100dvh}
.appshell.is-app{height:100dvh;display:grid;grid-template-columns:[rail] var(--rail-w) [main] 1fr;overflow:clip}
.appshell__rail{display:none}
.appshell.is-app .appshell__rail{display:flex;flex-direction:column;height:100dvh;overflow:hidden}
.appshell__main{min-width:0}
.appshell.is-app .appshell__main{height:100dvh;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}
/* Q625 — clamp the PAGE in app mode so the BODY physically cannot scroll (the shell was "pulling up" at the bottom
   because the document itself still scrolled). body.app-mode is set by setAppMode(on); the plain body rule is the
   universal fallback, and html:has(body.app-mode) clamps the root where :has is supported. Only .appshell__main
   scrolls now. ≤760 reverts to normal document flow (the rail becomes a drawer/dock).
   Q731 — overflow:CLIP, not hidden: `hidden` still lets the browser scroll the document PROGRAMMATICALLY (a
   focus/scrollIntoView on a control deep in the pane scrolled the whole shell up ~1269px off-screen, with no
   scrollbar to return → the "profile toggle blanks the page" bug). `clip` is not a scroll container, so
   focus-scroll can only move .appshell__main (the one legitimate scroller). Belt-and-suspenders scroll pin in
   portal.js setAppMode. */
html:has(body.app-mode){height:100dvh;overflow:clip}
body.app-mode{height:100dvh;overflow:clip}
/* Mobile (≤760): the rail collapses to each surface's drawer/dock; the page returns to normal document flow. */
@media (max-width:760px){
  .appshell.is-app{display:block;height:auto;overflow:visible}
  .appshell.is-app .appshell__rail{display:none}
  .appshell.is-app .appshell__main{height:auto;overflow-y:visible}
  html:has(body.app-mode){height:auto;overflow:visible}
  body.app-mode{height:auto;overflow:visible}
}

/* ─── Mobile native feel ───────────────────────────────────────────────────────
   viewport-fit=cover (in every page's viewport meta) enables the safe-area insets the
   journey-dock already codes, so the fixed bottom dock sits cleanly above the iOS home
   indicator. These add the rest of the "real app, not a webpage" polish: */
/* no grey tap-flash on any control (the #1 tell that it's a browser, not an app) */
a,button,label,summary,select,input,textarea,[role="button"],.dock-tab{-webkit-tap-highlight-color:transparent}
/* the app scroller (document flow on ≤760) doesn't rubber-band-chain into the URL bar or pull-to-refresh */
body.app-mode{overscroll-behavior-y:contain}
/* the fixed dock never gets selected/long-press-magnified while thumbing through the app */
.journey-dock,.dock-tab{-webkit-touch-callout:none;user-select:none}
/* iOS zooms the whole page when you focus an input under 16px — force 16px on mobile form fields so tapping a
   search/field never yanks the layout (checkboxes/radios excluded — sized separately above). */
@media(max-width:760px){
  input:not([type="checkbox"]):not([type="radio"]),select,textarea{font-size:16px}
}

.masthead{
  display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  padding:26px 0 16px;border-bottom:1px solid var(--line);margin-bottom:34px;
}
.wordmark{font-family:var(--font-display);font-weight:var(--fw-semibold);font-size:19px;letter-spacing:-.01em;color:var(--ink);text-decoration:none}
/* Q213 — the wordmark is an <a> to home; pin EVERY link state to the ink brand color with no underline, so it
   never falls back to the UA purple/underlined visited-link look on any page. */
a.wordmark,a.wordmark:link,a.wordmark:visited,a.wordmark:hover,a.wordmark:focus,a.wordmark:active{color:var(--ink);text-decoration:none}
.org{font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-weight:500}
.logo{display:block;height:30px;width:auto}

/* Wordmark lockup container — the chosen logo mark drops in beside/above it */
.brandmark{display:inline-flex;flex-direction:column;align-items:flex-start;gap:8px;text-decoration:none;color:var(--ink)}
.brandmark .wordmark{line-height:1}
.brandmark.inline{flex-direction:row;align-items:center;gap:11px}

/* ----------------------------------------------------------------------------
   2 · THE SPARK — our connective mark  (queer + civic, reused everywhere)
   An asterisk: the mark of annotation and expansiveness. It's the footnote of
   democracy (the hyper-local office everyone overlooks — "*this matters") and
   the "*" of trans* / LGBTQ+ that means "and everyone." In the lockup it
   connects the verb to the office — Queering * ANCs — and it recurs as bullets,
   dividers, the seal's heart, badge marks, and the level-up burst. Sized by
   font-size, colored by `color`. Monochrome by default; the pride variant
   carries six rainbow spokes for hero + celebratory moments only.
   ---------------------------------------------------------------------------- */
.spark{position:relative;display:inline-block;width:1em;height:1em;flex:none;color:var(--accent);vertical-align:-0.13em;
  background:linear-gradient(currentColor,currentColor) center/15% 100% no-repeat}
.spark::before,.spark::after{content:"";position:absolute;inset:0;background:linear-gradient(currentColor,currentColor) center/15% 100% no-repeat}
.spark::before{transform:rotate(60deg)}
.spark::after{transform:rotate(120deg)}
.spark--ink{color:var(--ink)}
.spark--pink{color:var(--pink)}
.spark--paper{color:var(--paper)}
/* pride spark — six rainbow spokes, for the logo / seal / celebration only */
.spark--pride{background:linear-gradient(180deg,var(--pride-1) 0 50%,var(--pride-4) 50% 100%) center/15% 100% no-repeat}
.spark--pride::before{background:linear-gradient(180deg,var(--pride-2) 0 50%,var(--pride-5) 50% 100%) center/15% 100% no-repeat}
.spark--pride::after{background:linear-gradient(180deg,var(--pride-3) 0 50%,var(--pride-6) 50% 100%) center/15% 100% no-repeat}

/* spark divider — connective tissue between sections */
.sparkrule{display:flex;align-items:center;gap:15px;color:var(--line)}
.sparkrule::before,.sparkrule::after{content:"";flex:1;height:1px;background:currentColor}
.sparkrule .spark{font-size:17px;color:var(--accent)}

/* spark bullet list */
.sparklist{list-style:none;margin:14px 0 0;padding:0}
.sparklist li{display:flex;gap:11px;align-items:baseline;padding:8px 0;color:var(--ink-2);font-size:16px}
.sparklist li .spark{font-size:14px;color:var(--accent)}

@keyframes sparkburst{0%{transform:scale(.3) rotate(-45deg);opacity:0}55%{transform:scale(1.3) rotate(15deg);opacity:1}100%{transform:scale(1) rotate(0)}}
.stagebadge.is-levelup .spark{animation:sparkburst .6s var(--ease-spring)}

/* ----------------------------------------------------------------------------
   Design System v1.3 — shared micro-components (Q579)
   §22 states (empty · loading · saved · celebration) · §23 onboarding head · §24 switch.
   Canonical, reusable, on-token. Every animation is collapsed by the global
   prefers-reduced-motion rule further down — the celebration then falls back to a
   STATIC spark (the state change itself is the feedback), and the saved beat just
   appears. Nothing here uses raw hex; the switch mirrors the shipped §24 spec.
   ---------------------------------------------------------------------------- */
@keyframes sparkPop{0%{transform:scale(.7);opacity:0}60%{transform:scale(1.08)}100%{transform:scale(1);opacity:1}}

/* §22 — Empty = the invitation: a warm sentence + the single starting action (never a scary $0). */
.state-empty{display:flex;flex-direction:column;gap:10px;align-items:flex-start;color:var(--muted);font-size:15px}

/* §22 — Loading/sync = a quiet status whisper (pair with aria-live="polite" in markup). */
.state-loading{color:var(--muted);font-size:14px}

/* §22 — Saved = a green check disc + one sentence (sparkPop on entry). */
.state-saved{display:inline-flex;align-items:center;gap:9px;color:var(--ok);font-weight:600;font-size:14px}
.state-saved__disc{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:var(--ok-soft);flex:none}
.state-saved__disc svg{width:13px;height:13px;stroke:var(--ok);fill:none;stroke-width:2.6}
@media (prefers-reduced-motion:no-preference){.state-saved{animation:sparkPop .45s var(--ease-spring)}}

/* §22 — Celebration = a pride spark burst + a human line; reduced-motion → a STATIC spark. */
.state-celebration{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center}
.state-celebration .spark{font-size:34px}
.state-celebration__line{font-weight:700;color:var(--ink)}
@media (prefers-reduced-motion:no-preference){.state-celebration .spark{animation:sparkburst .6s var(--ease-spring)}}

/* §23 — Onboarding head = a pride spark on white (onboarding IS a pride-on-white moment, rule 5). */
.onboard-spark{font-size:30px}

/* §24 — Switch = 40×24 pill, 2px ink border; off --line-strong, on --accent; 16px white knob. */
.switch{flex:0 0 auto;width:40px;height:24px;border-radius:var(--r-pill);border:2px solid var(--ink);background:var(--line-strong);position:relative;cursor:pointer;padding:0;transition:background .15s}
/* Q606 — expand the switch tap target to ≥44px (WCAG 2.5.5) without changing the 40×24 visual: a transparent
   centered overlay catches the tap around the small pill. */
.switch::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:44px;height:44px}
.switch[aria-checked="true"]{background:var(--accent)}
.switch__knob{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:50%;background:var(--surface);transition:transform .15s}
.switch[aria-checked="true"] .switch__knob{transform:translateX(16px)}
.switch:focus-visible{outline:2px solid var(--accent);outline-offset:2px}

/* ----------------------------------------------------------------------------
   3 · TYPE
   ---------------------------------------------------------------------------- */
.eyebrow{
  font-size:var(--fs-eyebrow);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;
  color:var(--muted);font-weight:var(--fw-semibold);margin:0 0 14px;
}
.eyebrow.accent{color:var(--accent)}
.eyebrow.pink{color:var(--secondary-strong)}

/* Q61 — the daily quote (three quiet placements). Tokens only; no animation (reduced-motion safe). */
.daily-quote{margin:22px 0 0;padding:16px 0 0;border-top:1px solid var(--seat-line,#D9D5CC)}
.daily-quote .dq-frame{margin:0 0 8px}
.daily-quote .dq-q{margin:0;font-family:var(--font-display);font-weight:var(--fw-semibold);font-size:var(--fs-d3,1.25rem);line-height:1.3;color:var(--ink);border:0;padding:0;quotes:none}
.daily-quote .dq-cite{margin:10px 0 0;font-size:13px;color:var(--muted);font-style:normal}
.daily-quote .dq-cite cite{font-style:normal}
.daily-quote .dq-src{margin-left:6px;white-space:nowrap}
.daily-quote .dq-attr{margin-left:6px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);opacity:.85}

h1.display{font-family:var(--font-display);font-weight:var(--fw-display);font-size:var(--fs-d1);line-height:var(--lh-d1);letter-spacing:var(--ls-d1);margin:0 0 18px}
h2.display{font-family:var(--font-display);font-weight:var(--fw-display);font-size:var(--fs-d2);line-height:var(--lh-d2);letter-spacing:var(--ls-d2);margin:0 0 12px}
h3.display{font-family:var(--font-display);font-weight:var(--fw-display);font-size:var(--fs-d3);line-height:var(--lh-d3);letter-spacing:var(--ls-d3);margin:0 0 10px}
.display .mark{background:linear-gradient(180deg,transparent 58%,var(--highlight) 58% 92%,transparent 92%);padding:0 .04em}

.sub{font-size:var(--fs-body-lg);line-height:var(--lh-body-lg);color:var(--ink-2);max-width:48ch;margin:0 0 22px}
.body{font-size:var(--fs-body);color:var(--muted);max-width:52ch;margin:0 0 30px}
.body b{color:var(--ink-2);font-weight:var(--fw-semibold)}

a.link{color:var(--accent);text-decoration:none;border-bottom:1px solid var(--accent-soft);padding-bottom:1px;font-weight:500;transition:border-color var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}
a.link:hover{border-bottom-color:var(--accent)}
a.link:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset);border-bottom-color:transparent}
/* Q463 in-content quiz front-door CTA — a calm, spaced nudge line (the anchor carries a.link styling) */
.quiz-nudge{margin:var(--space-4) 0;font-weight:500}

/* Placeholder for imagery you'll drop in later (striped, with a monospace note) */
.ph{
  background:repeating-linear-gradient(45deg,var(--surface-sunken) 0 11px,var(--surface-2) 11px 22px);
  border:1.5px dashed var(--line-strong);border-radius:var(--r);
  display:grid;place-items:center;text-align:center;
  color:var(--muted);font-family:var(--font-num);font-size:12px;letter-spacing:.03em;
  min-height:180px;padding:18px;
}

/* ----------------------------------------------------------------------------
   4 · STEPLINE  (top-of-quiz progress)
   ---------------------------------------------------------------------------- */
.stepline{display:flex;align-items:center;gap:14px;margin-bottom:30px;color:var(--muted)}
.stepline .n{font-variant-numeric:tabular-nums;font-size:13px;letter-spacing:.04em;white-space:nowrap}
.stepline .track{flex:1;height:2px;background:var(--line);position:relative;overflow:hidden;border-radius:var(--r-pill)}
.stepline .track i{position:absolute;inset:0 auto 0 0;width:0;background:var(--accent);transition:width var(--dur) var(--ease)}

/* ----------------------------------------------------------------------------
   5 · FORMS
   ---------------------------------------------------------------------------- */
fieldset{border:0;margin:0;padding:0}
legend{font-family:var(--font-display);font-weight:var(--fw-display);font-size:var(--fs-d3);line-height:var(--lh-d3);letter-spacing:var(--ls-d3);padding:0;margin-bottom:8px}
.qhelp{font-size:14.5px;color:var(--muted);margin:0 0 22px;max-width:50ch}

.field{display:block;margin:20px 0 0}
.field .flabel{font-size:13px;font-weight:var(--fw-semibold);color:var(--ink-2);margin-bottom:7px;letter-spacing:.01em}
.field .fhelp{font-size:12.5px;color:var(--muted);margin-top:6px}

input[type=text],input[type=email],input[type=search],input[type=tel],input[type=url],input[type=number],input[type=date],select,textarea{
  width:100%;font:inherit;font-size:16px;padding:12px 13px;
  background:var(--surface);color:var(--ink);
  border:1px solid var(--line-strong);border-radius:var(--r-sm);
  transition:border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease);
}
textarea{min-height:108px;resize:vertical;line-height:1.5}
input:hover:not(:disabled),select:hover:not(:disabled),textarea:hover:not(:disabled){border-color:var(--ink-2)}
input[type=text]:focus,input[type=email]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=url]:focus,select:focus,textarea:focus{
  outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent);
}
input::placeholder,textarea::placeholder{color:var(--muted)}
input:disabled,select:disabled,textarea:disabled{background:var(--surface-sunken);color:var(--muted);cursor:not-allowed;border-style:dashed}
[aria-invalid="true"],input.invalid,select.invalid{border-color:var(--bad)!important}
[aria-invalid="true"]:focus,input.invalid:focus{box-shadow:0 0 0 3px var(--bad-soft)!important}
select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--ink-2) 50%),linear-gradient(135deg,var(--ink-2) 50%,transparent 50%);background-position:calc(100% - 18px) 51%,calc(100% - 13px) 51%;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:38px}

/* ----------------------------------------------------------------------------
   6 · BUTTONS  (hard "stamp" shadow is the signature. Full state matrix.)
   ---------------------------------------------------------------------------- */
.btn,.btn-outline{
  font:inherit;font-size:15px;font-weight:var(--fw-semibold);letter-spacing:.01em;cursor:pointer;
  border:2px solid var(--ink);padding:12px 22px;border-radius:var(--r-sm);text-decoration:none;
  display:inline-flex;align-items:center;justify-content:center;gap:9px;
  box-shadow:0 0 0 transparent;
  transition:transform var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease),background-color var(--dur-fast) var(--ease);
}
.btn{background:var(--accent);color:var(--on-accent)}
.btn-outline{background:var(--surface);color:var(--ink)}
.btn:hover,.btn-outline:hover{transform:translate(-2px,-2px);box-shadow:var(--shadow-pop)}
.btn:active,.btn-outline:active{transform:translate(0,0);box-shadow:var(--shadow-pop-sm)}
.btn:focus-visible,.btn-outline:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.btn:disabled,.btn-outline:disabled,.btn[aria-disabled="true"],.btn-outline[aria-disabled="true"]{opacity:.32;cursor:not-allowed;transform:none;box-shadow:none;pointer-events:none}
/* Q177 — base size + stroke for the .arr glyph so it's NEVER unbounded. Without this, an .arr used outside
   .btn/.hub-tile (e.g. the "Canvassing safety tips" .link) had no width/height and defaulted to a giant
   black fill. Container rules (.btn .arr, .hub-tile .arr) override the size where they need to. */
.arr{width:1em;height:1em;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:2;vertical-align:-.125em}
.btn .arr,.btn-outline .arr{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.8;transition:transform var(--dur-fast) var(--ease)}
.btn:hover .arr,.btn-outline:hover .arr{transform:translateX(3px)}

/* Variants (additive — markup opts in; primary/.btn behavior unchanged) */
.btn.secondary{background:var(--secondary-strong);color:#fff}
.btn.dark{background:var(--ink);color:var(--on-dark)}
.btn-outline.accent{color:var(--accent);border-color:var(--accent)}
.btn-outline.accent:hover{box-shadow:var(--shadow-pop-accent)}
.btn.block,.btn-outline.block{width:100%}
.btn.sm,.btn-outline.sm{padding:8px 15px;font-size:13.5px}
.btn.lg,.btn-outline.lg{padding:15px 28px;font-size:16.5px}

/* ============================================================================
   Broad-daylight reskin — MARKETING buttons (body.mktg only). Pills, --r-pill,
   ≥52px, Inter 600. No print-stamp: elevation is quiet blur. The app keeps the
   stamp buttons above (this scope never touches portal/tool/admin surfaces).
   ========================================================================== */
body.mktg .btn,body.mktg .btn-outline{
  border-radius:var(--r-pill);border-width:1px;min-height:52px;padding:0 26px;
  font-weight:var(--fw-semibold);box-shadow:none;
  transition:background-color var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease);
}
body.mktg .btn{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}
body.mktg .btn:hover{background:var(--accent-strong);border-color:var(--accent-strong);color:var(--on-accent);transform:none;box-shadow:none}
body.mktg .btn:active{transform:none;box-shadow:none}
body.mktg .btn-outline{background:var(--surface);color:var(--ink);border-color:var(--line-strong)}
body.mktg .btn-outline:hover{background:var(--surface);color:var(--ink);border-color:var(--muted);transform:none;box-shadow:none}
body.mktg .btn-outline:active{transform:none;box-shadow:none}
body.mktg .btn-outline.accent{color:var(--accent);border-color:var(--accent)}
body.mktg .btn-outline.accent:hover{border-color:var(--accent-strong);box-shadow:none}
body.mktg .btn.sm,body.mktg .btn-outline.sm{min-height:44px;padding:0 18px;font-size:13.5px}
body.mktg .btn.lg,body.mktg .btn-outline.lg{min-height:54px;padding:0 30px;font-size:16px}
/* On the cobalt punch band: a white pill with --accent text (reskin §3). */
body.mktg .punch .punch-btn{background:var(--surface);color:var(--accent);border-color:var(--surface)}
body.mktg .punch .punch-btn:hover{background:var(--surface);color:var(--accent-strong);border-color:var(--surface);box-shadow:none}
/* On the deep-pink band: a ghost pill, 1.5px white border. */
body.mktg .punch--host .punch-btn{background:transparent;color:var(--on-secondary);border:1.5px solid rgba(255,255,255,.9)}
body.mktg .punch--host .punch-btn:hover{background:rgba(255,255,255,.1);color:var(--on-secondary);border-color:#fff;box-shadow:none}

/* Quiet text button */
.btn-quiet{background:none;border:none;color:var(--muted);font:inherit;font-size:15px;font-weight:500;cursor:pointer;padding:8px 2px;border-radius:var(--r-xs);transition:color var(--dur-fast) var(--ease)}
.btn-quiet:hover{color:var(--ink)}
.btn-quiet:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.btn-quiet:disabled{opacity:.35;cursor:not-allowed}

/* ----------------------------------------------------------------------------
   7 · QUIZ CONTROLS
   ---------------------------------------------------------------------------- */

/* Multi/single option rows */
.opts{margin:0}
.opt{display:flex;align-items:center;gap:14px;padding:15px 4px;cursor:pointer;border-top:1px solid var(--line);transition:padding-left var(--dur-fast) var(--ease),background-color var(--dur-fast) var(--ease)}
.opt:last-of-type{border-bottom:1px solid var(--line)}
.opt:hover{padding-left:8px;background:var(--surface-2)}
.opt input{position:absolute;opacity:0;width:0;height:0}
.opt .mark{width:16px;height:16px;flex:none;border:1.5px solid var(--line-strong);border-radius:3px;display:grid;place-items:center;transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.opt .mark:after{content:"";width:8px;height:8px;border-radius:1px;background:var(--accent);transform:scale(0);transition:transform var(--dur-fast) var(--ease-spring)}
.opt input:checked ~ .mark{border-color:var(--accent)}
.opt input:checked ~ .mark:after{transform:scale(1)}
.opt .lab{font-size:16.5px;color:var(--ink-2)}
.opt input:checked ~ .lab{color:var(--ink);font-weight:500}
.opt:has(input:checked){box-shadow:inset 3px 0 0 var(--accent);background:var(--accent-soft)}
.opt input:focus-visible ~ .mark{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.opt input:disabled ~ .lab{color:var(--muted)}
.opt:has(input:disabled){cursor:not-allowed;background:none;box-shadow:none}
/* Radio rendering: round mark */
.opt.radio .mark{border-radius:50%}
.opt.radio .mark:after{border-radius:50%}

/* 1–5 scale (Likert) */
.scale{display:flex;gap:8px;margin:18px 0 10px}
.scale .pip{flex:1}
.scale .pip input{position:absolute;opacity:0;width:0;height:0}
.scale .pip .face{display:flex;align-items:center;justify-content:center;height:46px;border:1.5px solid var(--line-strong);border-radius:var(--r-sm);font-weight:var(--fw-semibold);color:var(--ink-2);cursor:pointer;transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.scale .pip .face:hover{border-color:var(--accent);color:var(--accent)}
.scale .pip input:checked ~ .face{border-color:var(--accent);background:var(--accent);color:var(--on-accent)}
.scale .pip input:checked ~ .face{transform:translateY(-2px)}
.scale .pip input:focus-visible ~ .face{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.scale-ends{display:flex;justify-content:space-between;font-size:12.5px;color:var(--muted)}

/* "Well" — compact mini-scale matrix rows */
.well{margin:14px 0 0}
.well-row{padding:16px 0;border-top:1px solid var(--line)}
.well-row:last-child{border-bottom:1px solid var(--line)}
.well-q{font-size:15.5px;color:var(--ink);margin:0 0 10px;font-weight:500}
.well-opts{display:flex;gap:8px}
.well-opts label{flex:1}
.well-opts input{position:absolute;opacity:0;width:0;height:0}
.well-opts .face{display:block;text-align:center;padding:9px 6px;border:1.5px solid var(--line-strong);border-radius:var(--r-sm);font-size:13.5px;color:var(--ink-2);cursor:pointer;transition:border-color var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.well-opts .face:hover{border-color:var(--accent);color:var(--accent)}
.well-opts input:checked ~ .face{border-color:var(--accent);color:var(--accent);font-weight:var(--fw-semibold);background:var(--accent-soft)}
.well-opts input:focus-visible ~ .face{outline:var(--focus-ring);outline-offset:var(--focus-offset)}

/* Rank / reorder list */
.rank{list-style:none;margin:18px 0 0;padding:0}
.rank li{display:flex;align-items:center;gap:12px;padding:11px 0;border-top:1px solid var(--line);transition:background var(--dur-fast) var(--ease)}
.rank li:last-child{border-bottom:1px solid var(--line)}
.rank li:hover{background:var(--surface-2)}
.rank .rnk{font-family:var(--font-display);font-weight:var(--fw-bold);font-size:17px;color:var(--accent);min-width:22px;font-variant-numeric:tabular-nums}
.rank .rlab{flex:1;font-size:16px;color:var(--ink)}
.rank .mv{border:1.5px solid var(--line-strong);background:var(--surface);color:var(--ink-2);width:30px;height:30px;border-radius:var(--r-sm);cursor:pointer;display:grid;place-items:center;transition:border-color var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.rank .mv:hover:not(:disabled){border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
.rank .mv:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.rank .mv:disabled{opacity:.3;cursor:not-allowed}
.rank .mv svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2}

/* SMD finder (look up your district) */
.smd-find{display:flex;gap:10px;align-items:flex-end;margin:20px 0 0;flex-wrap:wrap}
.smd-find .field{flex:1;min-width:200px;margin:0}
.smd-out{margin:14px 0 0;font-size:15px;line-height:1.5}
.smd-out.ok{padding-left:14px;border-left:2px solid var(--accent);color:var(--ink-2)}
.smd-out.warn{padding-left:14px;border-left:2px solid var(--line-strong);color:var(--muted)}
.smd-out b{color:var(--ink);font-weight:var(--fw-semibold)}
/* Q440 — inline field error (host finder etc.): token-only, no ad-hoc inline hex. */
.field-err{color:var(--secondary-strong);font-size:13px;margin:2px 0 0}
.field-err.resolving{color:var(--ink-2)}
/* Q478 — the host kit's day-of detail is collapsed into canonical chevron-disclosures (details.disclosure);
   this is just the lead-in line that introduces that stack, keeping the page lean under the top actions. */
.host-more-lead{margin:28px 0 8px;font-weight:var(--fw-semibold);color:var(--ink-2)}

/* Platform builder (numbered planks) */
.platform{list-style:none;margin:14px 0 0;padding:0;counter-reset:plat}
.platform li{display:flex;gap:14px;padding:11px 0;border-top:1px solid var(--line);align-items:baseline}
.platform li:before{counter-increment:plat;content:counter(plat);font-family:var(--font-display);font-weight:var(--fw-bold);color:var(--accent);min-width:18px;font-variant-numeric:tabular-nums}
.platform .ptxt{color:var(--ink-2);font-size:16px}

/* Care / human-voice note (trans-blue keyline = the "we've got you" voice) */
.care{font-size:15px;color:var(--ink-2);line-height:1.55;margin:0 0 10px;padding-left:14px;border-left:2px solid var(--trans-blue);max-width:54ch}

/* Multi-select hint + confirm */
.multihint{font-size:13px;color:var(--muted);margin:0 0 14px}
/* A10: optional free-text under a multi-select ("Something else") */
.ft-field{display:block;margin:16px 0 0}
.ft-label{display:block;font-size:14px;font-weight:600;color:var(--ink-2);margin:0 0 6px}
.ft-field textarea{width:100%;font:inherit;font-size:16px;padding:11px 13px;border:2px solid var(--seat-line,#D9D5CC);border-radius:9px;background:#fff;resize:vertical}
.ft-field textarea:focus{border-color:var(--ink);outline:2px solid var(--accent);outline-offset:1px}
/* A2: inline text button (Change location) */
button.linkbtn{background:none;border:0;padding:0;color:var(--accent);font:inherit;text-decoration:underline;text-underline-offset:2px;cursor:pointer}
button.linkbtn:hover{color:var(--ink)}
.confirm{margin-top:18px;padding-left:16px;border-left:2px solid var(--accent)}

/* ----------------------------------------------------------------------------
   8 · ACTIONS BAR
   ---------------------------------------------------------------------------- */
.actions{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:34px}
/* Q212 — the quiz's primary Start CTA, pulled ABOVE THE FOLD: sits right under the intro sub (not 34px down)
   and left-aligns as the clear primary action; the ANC facts + eligibility note follow below it. */
.actions.intro-cta{margin-top:14px;margin-bottom:26px;justify-content:flex-start}
.actions .grow{display:flex;gap:12px;flex-wrap:wrap}

/* ----------------------------------------------------------------------------
   9 · RESULTS
   ---------------------------------------------------------------------------- */
.result-head{margin-bottom:34px}
.lead{font-size:18px;line-height:1.55;color:var(--ink-2);max-width:52ch;margin:0}
.flag{font-size:14.5px;color:var(--muted);margin:14px 0 0;padding-left:14px;border-left:2px solid var(--line-strong);max-width:52ch}

.section{margin-top:38px;padding-top:30px;border-top:1px solid var(--line)}
.section > .eyebrow{margin-bottom:18px}

.score{display:flex;align-items:flex-end;gap:16px;margin-bottom:14px}
.score .num{font-family:var(--font-display);font-weight:var(--fw-display);font-size:64px;line-height:.86;letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--accent)}
.score .den{font-size:15px;color:var(--muted);padding-bottom:7px}

.bar{height:3px;background:var(--line);position:relative;overflow:hidden;margin:2px 0 12px;border-radius:var(--r-pill)}
.bar i{position:absolute;inset:0 auto 0 0;width:0;background:var(--accent);transition:width var(--dur-slow) var(--ease)}
.bar.tall{height:6px}
.bar.spectrum-fill i{background:linear-gradient(90deg,var(--spectrum-1),var(--spectrum-4))}

/* Q275 — optional "how this was scored" breakdown on the quiz result */
.score-how{margin:16px 0 0;border:2px solid var(--line);border-radius:var(--r-lg);background:var(--surface-sunken);padding:0 16px}
.score-how>summary{cursor:pointer;padding:12px 0;font-weight:var(--fw-semibold);font-size:14px;list-style:none;display:flex;justify-content:space-between;align-items:center;gap:10px}
.score-how>summary::-webkit-details-marker{display:none}
.score-how>summary::after{content:"+";color:var(--muted);font-weight:var(--fw-semibold)}
.score-how[open]>summary::after{content:"\2013"}
.score-how-intro{font-size:14px;color:var(--ink-2);margin:0 0 12px}
.score-how-list{list-style:none;margin:0 0 14px;padding:0;display:flex;flex-direction:column;gap:11px}
.shrow{display:grid;grid-template-columns:minmax(110px,1.1fr) 2fr auto;align-items:center;gap:12px;font-size:14px}
.shk{color:var(--ink-2)}
.shbar{height:6px;background:var(--line);border-radius:var(--r-pill);position:relative;overflow:hidden}
.shbar i{position:absolute;inset:0 auto 0 0;background:var(--accent);border-radius:var(--r-pill)}
.shv{font-variant-numeric:tabular-nums;color:var(--muted);white-space:nowrap}
.shv b{color:var(--ink)}
@media(max-width:560px){.shrow{grid-template-columns:1fr auto}.shbar{display:none}}

.pairs{display:grid;grid-template-columns:1fr 1fr;gap:30px 36px}
.pair .k{font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);font-weight:var(--fw-semibold);margin-bottom:8px}
.pair .v{font-size:16px;color:var(--ink-2);line-height:1.5}

.count{display:flex;gap:22px;margin:2px 0 4px}
.count .u b{font-family:var(--font-display);font-weight:var(--fw-display);font-size:32px;line-height:1;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.count .u span{font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-top:6px;display:block}

.dates{list-style:none;margin:0;padding:0}
.dates li{display:flex;gap:16px;padding:9px 0;border-top:1px solid var(--line);font-size:15px}
.dates .d{font-variant-numeric:tabular-nums;color:var(--muted);min-width:118px}
.dates li.key .ev{color:var(--ink);font-weight:var(--fw-semibold)}
.dates li.key{box-shadow:inset 3px 0 0 var(--accent);padding-left:12px;margin-left:-12px}

/* Q241 — "here's your team" accompaniment beat at the result screen */
.teamlist{list-style:none;margin:0;padding:0}
.teamlist li{position:relative;padding:9px 0 9px 30px;border-top:1px solid var(--line);font-size:15px;line-height:1.45;color:var(--ink-2)}
.teamlist li::before{content:"";position:absolute;left:4px;top:15px;width:11px;height:7px;border-left:3px solid var(--accent);border-bottom:3px solid var(--accent);transform:rotate(-45deg)}

.cta-form{margin-top:14px;max-width:420px}

.nextsteps{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:16px 0 6px}
.nextsteps a{justify-content:center;text-align:center}

/* ----------------------------------------------------------------------------
   10 · STATUS PILLS / TAGS
   (module status, approval state — text + soft bg + matching ink, all AA)
   ---------------------------------------------------------------------------- */
.pill{
  display:inline-flex;align-items:center;gap:6px;
  font-size:12px;font-weight:var(--fw-bold);letter-spacing:.1em;text-transform:uppercase;line-height:1;
  padding:5px 10px;border-radius:var(--r-pill);border:1.5px solid;white-space:nowrap;
}
/* No leading dot by design — a clean tag, not an "AI pill". */
.pill.is-done{color:var(--ok);background:var(--ok-soft);border-color:var(--ok-border)}
.pill.is-progress{color:var(--accent-strong);background:var(--accent-soft);border-color:var(--info-border)}
.pill.is-locked{color:var(--muted);background:var(--surface-sunken);border-color:var(--line-strong)}
.pill.is-new{color:var(--secondary-strong);background:var(--secondary-soft);border-color:var(--secondary-border)}
.pill.is-review{color:var(--warn);background:var(--warn-soft);border-color:var(--warn-border)}
.pill.is-approved{color:var(--on-accent);background:var(--accent);border-color:var(--ink)}

/* ----------------------------------------------------------------------------
   11 · CALLOUTS / ALERTS
   ---------------------------------------------------------------------------- */
.callout{position:relative;padding:16px 18px;border:1.5px solid var(--border);border-radius:var(--r);background:var(--surface);margin:18px 0}
.callout__title{font-weight:var(--fw-semibold);color:var(--ink);margin:0 0 4px;font-size:15px}
.callout p{margin:0;color:var(--ink-2);font-size:15px;line-height:1.55}
.callout p + p{margin-top:8px}
.callout--info{background:var(--info-soft);border-color:var(--info-border);box-shadow:inset 3px 0 0 var(--accent)}
.callout--ok{background:var(--ok-soft);border-color:var(--ok-border);box-shadow:inset 3px 0 0 var(--ok)}
.callout--warn{background:var(--warn-soft);border-color:var(--warn-border);box-shadow:inset 3px 0 0 var(--warn)}
.callout--bad{background:var(--bad-soft);border-color:var(--bad-border);box-shadow:inset 3px 0 0 var(--bad)}
/* Pride callout: the bold human-voice moment — a confident dark statement card */
.callout--pride{background:var(--surface-ink);border-color:var(--ink);color:var(--on-dark)}
.callout--pride .callout__title{color:#fff}
.callout--pride p{color:var(--on-dark-muted)}
.callout--pride .stars{margin-bottom:14px}

/* ----------------------------------------------------------------------------
   12 · IN-MODULE FEEDBACK BOX  (right / wrong answer reveal)
   ---------------------------------------------------------------------------- */
.feedback{border-radius:var(--r);padding:16px 18px;margin:16px 0;border:1.5px solid var(--border);background:var(--surface)}
.feedback__label{display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.12em;text-transform:uppercase;font-weight:var(--fw-bold);margin-bottom:6px}
.feedback__label .ic{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;flex:none;color:#fff}
.feedback__label .ic svg{width:11px;height:11px;stroke:currentColor;fill:none;stroke-width:2.4}
.feedback p{margin:0;font-size:15px;color:var(--ink-2);line-height:1.55}
.feedback--correct{background:var(--ok-soft);border-color:var(--ok-border);box-shadow:inset 3px 0 0 var(--ok)}
.feedback--correct .feedback__label{color:var(--ok)}
.feedback--correct .ic{background:var(--ok)}
.feedback--incorrect{background:var(--bad-soft);border-color:var(--bad-border);box-shadow:inset 3px 0 0 var(--bad)}
.feedback--incorrect .feedback__label{color:var(--bad)}
.feedback--incorrect .ic{background:var(--bad)}

/* ----------------------------------------------------------------------------
   13 · LEARNING PORTAL — module grid + cards + progress ring + nav
   ---------------------------------------------------------------------------- */
.navlinks{display:flex;align-items:center;gap:8px;flex-wrap:nowrap}   /* Q119 — desktop: ONE line, never wrap the ES toggle (the commissioner bug); the 760px block re-wraps for mobile */
.navlinks a{font-size:14px;font-weight:500;color:var(--ink-2);text-decoration:none;padding:7px 11px;border-radius:var(--r-sm);white-space:nowrap;transition:background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}
.navlinks a:hover{background:var(--surface-2);color:var(--ink)}
.navlinks a[aria-current],.navlinks a.active{color:var(--accent);background:var(--accent-soft)}
.navlinks a:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}

/* Q119 — SHARED HEADER discipline (HOMEPAGE_NOMINATE_FIXES §6). Two variants only: public + portal.
   The canonical public header keeps its nav on ONE line on desktop — the ES toggle never wraps
   (the "For Sitting Commissioners" bug) — and collapses to a clean full-width row on mobile. */
.site-header{align-items:center}
.site-header .wordmark{white-space:nowrap}
.site-nav{display:flex;align-items:center;gap:8px;flex-wrap:nowrap}
/* Q817 — FIXPACK FIX 1: the ONE-HEADER-ROW law for every app tool screen below a tab root. A 44×44 borderless ‹
   back + the screen title (Bricolage 19px, ink) on the SAME line, vertically centered; an optional muted 13px meta
   line under it for list context ("Stevie's Voters · SMD 2G04") — never a link, never above the title. Replaces
   lone-chevron rows + breadcrumb trails app-wide. Tokens only. */
.app-hdr{display:flex;align-items:center;gap:var(--space-1);margin:0 0 var(--space-2)}
.app-hdr__back{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;margin-left:-10px;font-size:28px;line-height:1;color:var(--ink);text-decoration:none;background:none;border:0;cursor:pointer}
.app-hdr__back:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;border-radius:var(--r)}
.app-hdr__t{margin:0;font-family:var(--font-display);font-weight:700;font-size:var(--fs-d4);line-height:var(--lh-d4);color:var(--ink)}
.app-hdr__meta{margin:2px 0 var(--space-4);font-size:var(--fs-caption);color:var(--muted)}
.app-hdr + .app-hdr__meta{margin-top:0}
/* Canvass "Nearest to me" (opt-in geolocation) — the you-are-here map dot. Styled here (not inline in canvass.js) so
   the marker colour stays a token, never a standalone brand hex. */
.cv-you{stroke:var(--accent,#2238FF);fill:var(--accent,#2238FF)}

/* Q824 — the "Add to Home Screen" install nudge (pwa-install.js). Dismissible; floats above the mobile dock when one
   is present. Marketing-safe elevation (--shadow-soft-lg, not the app-only print-stamp). */
.pwa-nudge{position:fixed;left:12px;right:12px;bottom:calc(14px + env(safe-area-inset-bottom));z-index:70;max-width:520px;margin:0 auto;display:flex;align-items:center;gap:10px;background:var(--surface);border:1.5px solid var(--line-strong);border-radius:var(--r-lg);box-shadow:var(--shadow-soft-lg);padding:12px 14px;font-size:14px;line-height:1.35;color:var(--ink)}
.pwa-nudge--dock{bottom:calc(84px + env(safe-area-inset-bottom))}
.pwa-nudge__spark{flex:0 0 auto;width:22px;height:22px;font-size:22px}
.pwa-nudge__body{flex:1;min-width:0}
.pwa-nudge__go{flex:0 0 auto}
.pwa-nudge__x{flex:0 0 auto;width:32px;height:32px;background:none;border:0;color:var(--muted);font-size:22px;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.pwa-nudge__x:hover{color:var(--ink)}
.pwa-nudge__x:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset);border-radius:var(--r-sm)}

/* Q600 — the mobile nav-toggle (hamburger). Hidden on desktop (links sit inline); revealed ≤560 (below). */
/* Q815 — a tighter, rounder toggle: 40×40 (was an oversized 44 boxy square that dwarfed the wordmark), radius --r to
   match the button language, a firmer --line-strong edge (the --line ghost border read as unintentional), 24px glyph. */
.nav-toggle{display:none;position:relative;align-items:center;justify-content:center;width:40px;height:40px;min-width:40px;min-height:40px;padding:0;background:none;border:1.5px solid var(--line-strong);border-radius:var(--r);color:var(--ink-2);cursor:pointer}
/* Q815 — the 40px visual keeps a ≥44px tap target via a transparent centered overlay (WCAG 2.5.5), the same
   pattern the canonical .switch uses (test-a11y-harden-q606) — smaller box, no loss of hit area. */
.nav-toggle::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:44px;height:44px}
.nav-toggle:hover{background:var(--surface-2);color:var(--ink)}
.nav-toggle:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.nav-toggle svg{width:24px;height:24px}
.site-nav-link{font-size:14px;font-weight:500;color:var(--ink-2);text-decoration:none;padding:9px 11px;border-radius:var(--r-sm);white-space:nowrap;min-height:44px;display:inline-flex;align-items:center;transition:background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}
.site-nav-link:hover{background:var(--surface-2);color:var(--ink)}
.site-nav-link[aria-current]{color:var(--accent);background:var(--accent-soft)}
/* Q206 — the Support link is the pink pill in the shared header too (matches the homepage's .support-pill),
   so the exact same nav renders on every page. Mirrors landing.css's .lnav-links a.support-pill. */
.site-nav .support-pill{padding:7px 15px;border-radius:var(--r-pill);background:var(--secondary-soft);color:var(--secondary-strong);font-size:14px;font-weight:600;border:1.5px solid transparent}
.site-nav .support-pill:hover{background:var(--secondary-hover);color:var(--secondary-strong);border-color:var(--secondary-strong)}
.site-nav .support-pill:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.site-nav-link:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.site-nav .site-nav-cta{white-space:nowrap}
.site-nav .langtoggle{flex:none;min-height:44px}

/* ============================================================================
   Broad-daylight reskin — the PUBLIC marketing header only (data-nav="public").
   76px, white, 1px --line bottom; nav links --ink-2 500 → --ink; the CTA is a
   primary cobalt pill and Donate/outline controls are hairline pills (≥44px in
   nav). Scoped so the portal/tool app chrome is untouched.
   ========================================================================== */
.site-header[data-nav="public"]{
  min-height:76px;margin-bottom:0;
  position:sticky;top:0;z-index:20;box-sizing:border-box;
}
/* Full-bleed white banner + hairline: the header sits inside the page column (.wrap/.lwrap max-width),
   so its own background is capped. This pseudo paints the surface + bottom hairline across the FULL
   viewport (100vw, centered) behind the nav, while the nav content stays aligned to the column. */
.site-header[data-nav="public"]::before{
  content:"";position:absolute;top:0;bottom:0;left:calc(50% - 50vw);width:100vw;
  background:var(--surface);border-bottom:1px solid var(--line);z-index:-1;
}
.site-header[data-nav="public"] .site-nav-link{color:var(--ink-2);font-weight:500;border-radius:var(--r-pill)}
.site-header[data-nav="public"] .site-nav-link:hover{background:transparent;color:var(--ink)}
/* the primary nav CTA (Campaign Copilot) — cobalt pill, ≥44px */
.site-header[data-nav="public"] .site-nav-cta{
  height:44px;padding:0 22px;display:inline-flex;align-items:center;
  background:var(--accent);color:var(--on-accent);border:0;
  border-radius:var(--r-pill);font-weight:600;font-size:14.5px;text-decoration:none;
  box-shadow:none;transition:background var(--dur-fast) var(--ease);
}
.site-header[data-nav="public"] .site-nav-cta:hover{background:var(--accent-strong);color:var(--on-accent);box-shadow:none}
.site-header[data-nav="public"] .site-nav-cta:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
/* Donate — outline hairline pill (was the pink support-pill), calm on white */
.site-header[data-nav="public"] .support-pill{
  height:44px;padding:0 20px;display:inline-flex;align-items:center;
  background:var(--surface);color:var(--ink);border:1px solid var(--line-strong);
  border-radius:var(--r-pill);font-weight:600;font-size:14.5px;
  transition:border-color var(--dur-fast) var(--ease);
}
.site-header[data-nav="public"] .support-pill:hover{background:var(--surface);color:var(--ink);border-color:var(--muted)}
.site-header[data-nav="public"] .langtoggle{border-radius:var(--r-pill)}

.modules{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:18px;margin:22px 0}
.module-card{
  position:relative;display:flex;flex-direction:column;gap:12px;
  background:var(--surface);border:1.5px solid var(--border);border-radius:var(--r-lg);
  padding:22px;text-decoration:none;color:inherit;box-shadow:var(--shadow-soft);
  transition:transform var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease);
}
a.module-card:hover,button.module-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-soft-lg);border-color:var(--ink)}
.module-card:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.module-card__top{display:flex;align-items:center;justify-content:space-between;gap:12px}
.module-card__n{font-family:var(--font-num);font-weight:600;font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-variant-numeric:tabular-nums}
.module-card__title{font-family:var(--font-display);font-weight:var(--fw-semibold);font-size:20px;letter-spacing:-.015em;line-height:1.15;margin:0;color:var(--ink)}
.module-card__desc{font-size:14.5px;color:var(--muted);margin:0;line-height:1.5}
.module-card__foot{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid var(--line)}
.module-card__foot .meta{font-size:12.5px;color:var(--muted)}
.module-card.is-done{border-color:var(--ok-border)}
.module-card.is-active{border-color:var(--ink);box-shadow:var(--shadow-pop)}
.module-card.is-locked{opacity:.62;box-shadow:none;cursor:not-allowed}
.module-card.is-locked:hover{transform:none;box-shadow:none;border-color:var(--border)}

/* Donut progress ring — set --p (0–100) inline: <div class="ring" style="--p:60"> */
.ring{
  --p:0;--size:46px;
  width:var(--size);height:var(--size);flex:none;border-radius:50%;position:relative;
  display:grid;place-items:center;font-family:var(--font-num);font-size:12px;font-weight:600;color:var(--ink-2);font-variant-numeric:tabular-nums;
  background:
    radial-gradient(closest-side,var(--surface) 0 70%,transparent 71% 100%),
    conic-gradient(var(--accent) calc(var(--p)*1%),var(--surface-sunken) 0);
}
.ring.is-done{background:radial-gradient(closest-side,var(--surface) 0 70%,transparent 71% 100%),conic-gradient(var(--ok) 100%,var(--ok) 0)}
.ring.lg{--size:64px;font-size:13px}

/* ----------------------------------------------------------------------------
   14 · ACHIEVEMENT BADGE  (downloadable completion coin)
   Self-contained block — renders standalone for export/print.
   ---------------------------------------------------------------------------- */
.badge{
  position:relative;width:212px;height:212px;border-radius:50%;
  background:var(--surface);border:2px solid var(--ink);box-shadow:var(--shadow-pop);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;
  text-align:center;padding:30px 26px;overflow:hidden;
}
/* discrete spectrum ring band inside the coin */
.badge::before{
  content:"";position:absolute;inset:9px;border-radius:50%;z-index:0;
  background:conic-gradient(
    var(--spectrum-1) 0 20%,var(--spectrum-2) 20% 40%,var(--spectrum-3) 40% 60%,
    var(--spectrum-4) 60% 80%,var(--spectrum-5) 80% 100%);
  -webkit-mask:radial-gradient(closest-side,transparent 0 85%,#000 86%);
  mask:radial-gradient(closest-side,transparent 0 85%,#000 86%);
}
.badge > *{position:relative;z-index:1}
/* Q107 BRAND SAFETY — the compact mark holds the pride SPARK, never the "QA" 2-letter monogram (too close to "QAnon") */
.badge .monogram{width:34px;height:34px;border-radius:50%;background:var(--ink);color:var(--on-dark);display:grid;place-items:center}
.badge .b-kicker{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-weight:var(--fw-bold)}
.badge .b-title{font-family:var(--font-display);font-weight:var(--fw-bold);font-size:21px;line-height:1.04;letter-spacing:-.02em;color:var(--ink);max-width:9ch}
.badge .b-status{font-size:10px;letter-spacing:.14em;text-transform:uppercase;font-weight:var(--fw-bold);color:var(--ok)}
.badge.locked{filter:grayscale(1);opacity:.5}
.badge.lg{width:264px;height:264px}

/* ----------------------------------------------------------------------------
   15 · APPROVED SEAL  (official stamp — used on certificate / approvals)
   ---------------------------------------------------------------------------- */
.seal{
  position:relative;width:150px;height:150px;border-radius:50%;border:2px solid var(--ink);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;text-align:center;
  box-shadow:var(--shadow-pop-sm);
  background:
    radial-gradient(closest-side,var(--surface) 0 78%,transparent 79% 100%),
    conic-gradient(
      var(--spectrum-1) 0 20%,var(--spectrum-2) 20% 40%,var(--spectrum-3) 40% 60%,
      var(--spectrum-4) 60% 80%,var(--spectrum-5) 80% 100%);
}
.seal::before{content:"";position:absolute;inset:15px;border:1.5px solid var(--ink);border-radius:50%;opacity:.32}
.seal .s-top,.seal .s-bottom{font-size:8.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-weight:var(--fw-bold);max-width:13ch;line-height:1.3}
.seal .s-main{font-family:var(--font-display);font-weight:var(--fw-bold);font-size:19px;letter-spacing:-.01em;color:var(--ink);line-height:1}
.seal .s-bar{height:3px;width:30px;border-radius:var(--r-pill);background:var(--accent)}
.seal.sm{width:108px;height:108px}
.seal.sm .s-main{font-size:14px}

/* ----------------------------------------------------------------------------
   16 · CERTIFICATE  (printable completion document)
   ---------------------------------------------------------------------------- */
.certificate{
  position:relative;background:var(--surface);border:2px solid var(--ink);box-shadow:var(--shadow-pop);
  max-width:880px;margin:0 auto;padding:clamp(28px,5vw,56px);overflow:hidden;
}
.certificate::before{content:"";position:absolute;inset:13px;border:1px solid var(--line-strong);pointer-events:none}
.certificate > *{position:relative}
.cert-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:30px}
.cert-org{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted);font-weight:var(--fw-bold)}
.cert-eyebrow{font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--accent);font-weight:var(--fw-bold);margin:0 0 14px}
.cert-name{font-family:var(--font-display);font-weight:var(--fw-display);font-size:clamp(28px,5.6vw,52px);line-height:1.02;letter-spacing:-.025em;margin:0 0 16px;color:var(--ink);overflow-wrap:anywhere;word-break:break-word;max-width:100%}
.cert-body{font-size:17px;line-height:1.55;color:var(--ink-2);max-width:54ch;margin:0 0 36px}
.cert-foot{display:flex;align-items:flex-end;justify-content:space-between;gap:28px;flex-wrap:wrap;padding-top:24px;border-top:1px solid var(--line)}
.cert-sigs{display:flex;gap:40px;flex-wrap:wrap}
.cert-sig{min-width:170px}
.cert-sig .line{height:1.5px;background:var(--ink);margin-bottom:8px}
.cert-sig .who{font-size:13px;color:var(--ink);font-weight:var(--fw-semibold)}
.cert-sig .role{font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-top:2px}
.cert-seal{flex:none}

/* ----------------------------------------------------------------------------
   17 · ADMIN TABLES
   ---------------------------------------------------------------------------- */
.table-wrap{width:100%;overflow-x:auto;border:1.5px solid var(--border);border-radius:var(--r);background:var(--surface)}
.table{width:100%;border-collapse:collapse;font-size:14.5px;min-width:560px}
.table thead th{
  text-align:left;font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:var(--fw-bold);
  padding:13px 16px;border-bottom:2px solid var(--ink);white-space:nowrap;background:var(--surface-2);
}
.table tbody td{padding:13px 16px;border-bottom:1px solid var(--line);color:var(--ink-2);vertical-align:middle}
.table tbody tr:last-child td{border-bottom:0}
.table tbody tr{transition:background var(--dur-fast) var(--ease)}
.table tbody tr:hover{background:var(--surface-2)}
.table .num{font-family:var(--font-num);font-variant-numeric:tabular-nums;text-align:right;color:var(--ink)}
.table .who{font-weight:var(--fw-semibold);color:var(--ink)}
.table th.num{text-align:right}
.table-sort{background:none;border:0;font:inherit;font-weight:var(--fw-bold);font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);cursor:pointer;padding:0;display:inline-flex;gap:5px;align-items:center}
.table-sort:hover,.table-sort[aria-sort]{color:var(--ink)}
.table-sort:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}

/* ----------------------------------------------------------------------------
   17.5 · CANDIDATE DASHBOARD  (private "my journey" progress portal)
   Cute via microcopy + color + gentle motion — never emoji. Honors
   prefers-reduced-motion (the global rule collapses these animations).
   ---------------------------------------------------------------------------- */

/* — Signature tracker (25 "Qualifies" · 50 "Challenge-proof") ------------- */
.tracker{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--r-lg);padding:24px;box-shadow:var(--shadow-soft)}
.tracker__head{display:flex;align-items:center;justify-content:space-between;gap:16px 22px;flex-wrap:wrap;margin-bottom:8px}
.tracker__lead{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.tracker__count{display:flex;align-items:flex-end;gap:11px}
.tracker__count .num{font-family:var(--font-display);font-weight:var(--fw-display);font-size:clamp(46px,8vw,62px);line-height:.82;letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--tracker-fill);transition:color var(--dur) var(--ease)}
.tracker__count .den{font-size:15px;color:var(--muted);padding-bottom:7px}
.tracker.is-goal .tracker__count .num{color:var(--tracker-goal)}
.tracker__update{display:flex;gap:8px;align-items:center}
.tracker__update input{width:88px;text-align:center;font-variant-numeric:tabular-nums}
.tracker__track{position:relative;padding-top:38px;margin-top:14px}
.tracker__track .bar{height:12px;border-radius:var(--r-pill);background:var(--surface-sunken)}
.tracker__track .bar i{border-radius:var(--r-pill);background:var(--tracker-fill)}
.tracker.is-goal .tracker__track .bar i{background:var(--tracker-goal)}
.tracker__mark{position:absolute;top:0;bottom:0;left:var(--at,50%);width:0;pointer-events:none}
.tracker__mark .stem{position:absolute;top:30px;bottom:0;left:50%;width:2px;transform:translateX(-50%);background:var(--milestone);opacity:.5;border-radius:2px}
.tracker__mark .chip{position:absolute;top:0;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;line-height:1.15;white-space:nowrap}
.tracker__mark .chip b{font-family:var(--font-num);font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--ink)}
.tracker__mark .chip span{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:700;margin-top:1px}
.tracker__mark--end .chip{left:auto;right:0;transform:none;align-items:flex-end}
.tracker__mark--end .stem{left:auto;right:0;transform:none}
.tracker__mark.is-reached .stem{background:var(--ok);opacity:1}
.tracker__mark.is-reached .chip b{color:var(--ok)}
.tracker__cap{font-size:15px;color:var(--ink-2);line-height:1.55;margin:18px 0 0;max-width:62ch}
.tracker__cap b{color:var(--ink);font-weight:600}

/* the journey ladder is now .stepper (v1.1) — revive the level-up pop on the current node */
.stepper.is-levelup li.is-current .node{animation:levelpop .6s var(--ease-spring)}
/* compact inline stage badge (dashboard header) */
.stagebadge{display:inline-flex;align-items:center;gap:9px;padding:7px 14px 7px 10px;border:1.5px solid var(--border);border-radius:var(--r-pill);background:var(--surface);font-size:13.5px;font-weight:600;color:var(--ink);white-space:nowrap}
.stagebadge .n{font-family:var(--font-num);font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums;padding-left:9px;margin-left:3px;border-left:1px solid var(--line)}
.stagebadge.is-levelup{animation:levelpop .6s var(--ease-spring);border-color:var(--levelup)}
@keyframes levelpop{0%{transform:scale(1)}35%{transform:scale(1.12)}100%{transform:scale(1)}}
@keyframes ringpulse{0%{opacity:.7;transform:scale(1)}100%{opacity:0;transform:scale(1.9)}}

/* — Reflection / check-in ------------------------------------------------- */
.checkin{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--r-lg);padding:22px}
.checkin__prompt{font-size:16px;color:var(--ink);font-weight:500;margin:0 0 12px;line-height:1.45}
.checkin__foot{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:14px}
.checkin__streak{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--muted);font-weight:600}
.checkin__saved{display:none;align-items:center;gap:8px;font-size:14px;color:var(--ok);font-weight:600;margin:14px 0 0}
.checkin__saved svg{width:16px;height:16px;stroke:var(--ok);fill:none;stroke-width:2.4;flex:none}
.checkin.is-saved .checkin__saved{display:inline-flex}
.checkin.is-saved .checkin__foot{display:none}
.checkin .scale-ends{margin-top:2px}
/* "Your why" — re-surfaced reflection */
.why{position:relative;background:var(--surface-2);border:1.5px solid var(--border);border-radius:var(--r-lg);padding:24px 24px 24px 28px;overflow:hidden}
.why::before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;background:var(--accent)}
.why__eyebrow{display:flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);font-weight:700;margin:0 0 12px}
.why__quote{font-family:var(--font-display);font-weight:var(--fw-display);font-size:clamp(19px,2.5vw,25px);line-height:1.28;letter-spacing:-.015em;color:var(--ink);margin:0}
.why__foot{display:flex;align-items:center;gap:12px;margin-top:16px;font-size:13px;color:var(--muted)}

/* — "My journey" dashboard layout ----------------------------------------- */
.journey{display:grid;gap:18px}
.journey__head{display:flex;align-items:center;justify-content:space-between;gap:14px 18px;flex-wrap:wrap}
.journey__head .greet{font-family:var(--font-display);font-weight:var(--fw-display);font-size:clamp(22px,3vw,28px);letter-spacing:-.02em;margin:0;color:var(--ink)}
.journey__stats{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.stat{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--r-lg);padding:20px;display:flex;flex-direction:column;gap:9px}
.stat__n{font-family:var(--font-display);font-weight:var(--fw-display);font-size:36px;line-height:1;letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--ink)}
.stat__n .d{font-size:17px;color:var(--muted);font-weight:var(--fw-semibold)}
.stat__l{font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-weight:700}
.stat .bar{margin-top:3px}
.journey__bottom{display:grid;grid-template-columns:1.5fr 1fr;gap:18px}
.nextstep{display:flex;flex-direction:column;gap:12px;background:var(--surface);border:2px solid var(--ink);border-radius:var(--r-lg);padding:22px;box-shadow:var(--shadow-pop)}
.nextstep .eyebrow{margin:0}
.nextstep__title{font-family:var(--font-display);font-weight:var(--fw-display);font-size:21px;line-height:1.15;letter-spacing:-.015em;color:var(--ink);margin:0}
.nextstep__why{font-size:14px;color:var(--muted);margin:0;line-height:1.5}
.nextstep .btn{margin-top:auto;align-self:flex-start}
@media(max-width:760px){
  .journey__stats{grid-template-columns:1fr}
  .journey__bottom{grid-template-columns:1fr}
}

/* ----------------------------------------------------------------------------
   17.6 · SUPPORT / DONATE BAND  (calm, warm — never a pop-up or nag)
   Amount chips reuse the selectable-control language; Give = primary button.
   ---------------------------------------------------------------------------- */
/* Q248 — the donate box shares the ONE .card frame (see landing.css); only its grid layout lives here. */
.support{display:grid;grid-template-columns:1.05fr .95fr;gap:30px 44px;align-items:center}
.support__copy h2.display{margin:0 0 12px}
.support__copy .sub{margin:0;max-width:44ch}
.support__form{display:flex;flex-direction:column;gap:18px}
.amounts{display:flex;flex-wrap:wrap;gap:10px}
.amount{position:relative}
.amount input{position:absolute;opacity:0;width:0;height:0}
.amount .face{display:flex;align-items:center;justify-content:center;min-width:70px;padding:13px 19px;
  border:1.5px solid var(--line-strong);border-radius:var(--r-sm);background:var(--surface);
  font-weight:var(--fw-semibold);font-size:16px;color:var(--ink-2);cursor:pointer;font-variant-numeric:tabular-nums;
  transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.amount .face:hover{border-color:var(--accent);color:var(--accent)}
.amount input:checked ~ .face{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-strong);font-weight:var(--fw-bold);transform:translateY(-1px)}
.amount input:focus-visible ~ .face{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.amount--other .face{min-width:84px}

/* monthly toggle (switch) */
.toggle{display:inline-flex;align-items:center;gap:11px;cursor:pointer;font-size:15px;font-weight:var(--fw-medium);color:var(--ink-2);user-select:none}
.toggle input{position:absolute;opacity:0;width:0;height:0}
.toggle .track{position:relative;width:44px;height:26px;flex:none;border-radius:var(--r-pill);background:var(--surface-sunken);border:1.5px solid var(--line-strong);transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease)}
.toggle .knob{position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:var(--surface);box-shadow:0 1px 2px rgba(18,16,22,.25);transition:transform var(--dur-fast) var(--ease-spring)}
.toggle input:checked ~ .track{background:var(--accent);border-color:var(--accent)}
.toggle input:checked ~ .track .knob{transform:translateX(18px)}
.toggle input:focus-visible ~ .track{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.support__actions{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}
.support .reassure{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--muted);line-height:1.45;margin:0;max-width:46ch}
.support .reassure svg{width:13px;height:13px;stroke:var(--muted);fill:none;stroke-width:1.7;flex:none}

/* quiet "Support" link (footer / nav) */
.support-link{display:inline-flex;align-items:center;gap:8px;font-size:14px;font-weight:var(--fw-semibold);color:var(--ink-2);text-decoration:none;padding:6px 13px;border:1.5px solid var(--line-strong);border-radius:var(--r-pill);transition:border-color var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.support-link::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--accent);flex:none}
.support-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
.support-link:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}

@media(max-width:760px){.support{grid-template-columns:1fr;gap:24px}}

/* ----------------------------------------------------------------------------
   18 · FOOTER
   ---------------------------------------------------------------------------- */
footer{margin-top:54px;padding-top:24px;border-top:1px solid var(--line);font-size:12.5px;color:var(--muted);line-height:1.6}
footer .foot-top{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;flex-wrap:wrap;margin-bottom:18px}
footer a{color:var(--ink-2);text-decoration:none;border-bottom:1px solid transparent;transition:border-color var(--dur-fast) var(--ease)}
footer a:hover{border-bottom-color:var(--ink-2)}
footer a:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}

/* ----------------------------------------------------------------------------
   19 · UTILITIES
   ---------------------------------------------------------------------------- */
.hidden{display:none}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0;white-space:nowrap}
/* Skip link — visible only on keyboard focus. Unified class across all pages (S8). */
.skip{position:absolute;left:-9999px;top:0;z-index:60;background:var(--ink);color:#fff;padding:10px 16px;border-radius:0 0 var(--r-sm) 0;font-size:14px;font-weight:var(--fw-semibold);text-decoration:none}
.skip:focus{left:0}
.skip:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset)}
.stack-2{display:flex;flex-direction:column;gap:var(--space-2)}
.stack-4{display:flex;flex-direction:column;gap:var(--space-4)}
.row{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap}
.panel{background:var(--surface);border:1.5px solid var(--border);border-radius:var(--r-lg);padding:var(--space-6)}
.panel-pop{background:var(--surface);border:2px solid var(--ink);border-radius:var(--r);padding:var(--space-6);box-shadow:var(--shadow-pop)}

/* Inverted (dark) section — high-contrast brand moment */
.invert{background:var(--surface-ink);color:var(--on-dark);border-radius:var(--r-lg);padding:var(--space-8)}
.invert .eyebrow{color:var(--trans-blue)}
.invert h1.display,.invert h2.display,.invert h3.display{color:var(--on-dark)}
.invert .sub,.invert .body{color:var(--on-dark-muted)}
.invert a.link{color:var(--trans-blue);border-bottom-color:transparent}
.invert .btn-outline{background:transparent;color:var(--on-dark);border-color:var(--on-dark)}

/* ----------------------------------------------------------------------------
   20 · RESPONSIVE
   ---------------------------------------------------------------------------- */
@media(max-width:760px){
  .masthead{flex-direction:column;align-items:flex-start;gap:6px}
  .mast-right{width:100%;justify-content:space-between;gap:var(--space-2)}   /* Q108 P0-1 — the login-screen action row goes full width + wraps instead of overflowing */
  .site-header{align-items:flex-start}
  /* Q119/Q219 — mobile: the shared header stacks. The wordmark sits on its own line (masthead is column
     above) and the whole nav drops full-width beneath it. 44px tap targets are inherited from the
     base .site-nav-link / .langtoggle rules. */
  .navlinks{width:100%;justify-content:flex-start;flex-wrap:wrap;gap:var(--space-2)}
  /* Q242 — the shared header's three nav links sit on ONE line beneath the wordmark (Q219 wrapped them onto
     2–3 lines). nowrap here + the condensed padding/gap/font in the 560 block below fit one row at 360–390px. */
  .site-nav{width:100%;justify-content:flex-start;flex-wrap:nowrap;gap:6px}
  .cert-foot{flex-direction:column;align-items:flex-start}
}
@media(max-width:560px){
  /* Q600 — the four links don't fit one row ≤560, so instead of wrapping to two rows (Q392) they COLLAPSE
     behind the nav-toggle (hamburger). The header bar is ONE row (wordmark + toggle); the menu drops full-width
     below only when the toggle is open (.masthead.nav-open). No animation → reduced-motion safe. 44px targets. */
  .masthead{flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:space-between}
  .nav-toggle{display:inline-flex}
  .site-nav{display:none;order:3;width:100%;flex-direction:column;align-items:stretch;flex-wrap:nowrap;gap:4px;margin-top:8px}
  .masthead.nav-open .site-nav{display:flex}
  .site-nav-link{font-size:12.5px;padding:9px 10px}
  .site-nav .site-nav-cta{font-size:12.5px;padding:9px 11px;text-align:center}
  .site-nav .support-pill{font-size:12.5px;padding:9px 12px;text-align:center}
  .pairs{grid-template-columns:1fr;gap:24px}
  .nextsteps{grid-template-columns:1fr}
  .modules{grid-template-columns:1fr}
  .actions{flex-direction:column-reverse;align-items:stretch}
  .actions .grow{justify-content:stretch}
  .actions .grow .btn,.actions .grow .btn-outline{flex:1}
  .scale{gap:6px}
  .scale .pip .face{height:42px}
}

/* ----------------------------------------------------------------------------
   21 · MOTION PREFERENCES
   ---------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.001ms!important;animation-iteration-count:1!important;
    transition-duration:.001ms!important;scroll-behavior:auto!important;
  }
}

/* ----------------------------------------------------------------------------
   22 · PRINT  (certificate is the print target)
   ---------------------------------------------------------------------------- */
@media print{
  @page{size:landscape;margin:14mm}
  body{background:#fff;color:#000}
  .no-print{display:none!important}
  .certificate{box-shadow:none;border:2px solid #000;max-width:100%;margin:0;page-break-inside:avoid}
  .certificate::before{border-color:var(--neutral-rule)}
  .seal,.badge{box-shadow:none;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .spectrum,.seal,.badge::before{-webkit-print-color-adjust:exact;print-color-adjust:exact}
}

/* --- re-added during reconciliation (emitted by app.js, were dropped in the design pass) --- */
.rank .moves{display:flex;gap:6px}
.nextsteps-note{font-size:13.5px;color:var(--muted);margin:4px 0 0}

/* =============================================================================
   23 · DESIGN SYSTEM v1.1 — net-new components
   ========================================================================== */

/* 23.0 · INPUT GAP FIX (Audit #2 C-1, the "weird sizes").
   Native number/date/etc. were unstyled — they omitted the base field rule. Bind them to the
   same look. :where() keeps zero specificity so component width rules (.logadd input, etc.) win. */
input:where([type=number],[type=date],[type=month],[type=week],[type=time],[type=datetime-local],[type=password]){
  width:100%;font:inherit;font-size:16px;padding:12px 13px;min-height:46px;
  background:var(--surface);color:var(--ink);
  border:1px solid var(--line-strong);border-radius:var(--r-sm);
  transition:border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease);
}
input:where([type=number],[type=date],[type=month],[type=week],[type=time],[type=datetime-local],[type=password]):hover:not(:disabled){border-color:var(--ink-2)}
input:where([type=number],[type=date],[type=month],[type=week],[type=time],[type=datetime-local],[type=password]):focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent)}
.no-spin{appearance:textfield;-moz-appearance:textfield}
.no-spin::-webkit-outer-spin-button,.no-spin::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
/* 23.0b · small-button target size (Audit #2 S-1) — align field+button rows at one height */
.btn.sm,.btn-outline.sm,.btn-quiet.sm{min-height:46px;display:inline-flex;align-items:center;justify-content:center;gap:6px}

/* 23.1 · STEPPER — the journey ladder (role=progressbar on <ol>, aria-current on <li>). */
.stepper{list-style:none;display:flex;margin:0;padding:0}
.stepper li{flex:1 1 0;position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;gap:8px;min-width:0;padding-top:2px}
.stepper li + li::before{content:"";position:absolute;top:13px;right:50%;width:100%;height:2px;background:var(--line-strong);z-index:0}
.stepper .node{position:relative;z-index:1;width:28px;height:28px;border-radius:50%;background:var(--surface);border:2px solid var(--line-strong);display:grid;place-items:center;color:var(--muted)}
.stepper .node svg{width:15px;height:15px;stroke:currentColor;stroke-width:3;fill:none}
.stepper .node .dot{width:8px;height:8px;border-radius:50%;background:currentColor}
.stepper .lbl{font-size:12.5px;line-height:1.25;color:var(--muted)}
.stepper li.is-done .node{background:var(--accent);border-color:var(--accent);color:#fff}
.stepper li.is-done + li::before{background:var(--accent)}
.stepper li.is-current .node{border-color:var(--accent);color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}
.stepper li.is-current .lbl{color:var(--ink);font-weight:var(--fw-semibold)}
.stepper--stacked,.stepper.is-stacked{flex-direction:column;align-items:stretch}
.stepper--stacked li,.stepper.is-stacked li{flex-direction:row;justify-content:flex-start;text-align:left;gap:12px;padding:8px 0;min-height:44px}
.stepper--stacked li + li::before,.stepper.is-stacked li + li::before{top:-6px;right:auto;left:13px;width:2px;height:100%}
.stepper--stacked .node,.stepper.is-stacked .node{flex:none}
.stepper--stacked .lbl,.stepper.is-stacked .lbl{flex:1}
@media(max-width:560px){
  .stepper{flex-direction:column;align-items:stretch}
  .stepper li{flex-direction:row;justify-content:flex-start;text-align:left;gap:12px;padding:8px 0;min-height:44px}
  .stepper li + li::before{top:-6px;right:auto;left:13px;width:2px;height:100%}
  .stepper .node{flex:none}
  .stepper .lbl{flex:1}
}

/* 23.2 · DROPZONE — photo / logo upload tile. */
.dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;
  border:2px dashed var(--line-strong);border-radius:var(--r);background:var(--surface-sunken);padding:24px 18px;cursor:pointer;min-height:128px;
  transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.dropzone:hover,.dropzone.is-dragover{border-color:var(--accent);background:var(--accent-soft)}
.dropzone:focus-within{outline:var(--focus-ring);outline-offset:2px}
.dropzone input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer}
.dropzone__icon{width:28px;height:28px;color:var(--muted)}
.dropzone__title{font-weight:var(--fw-semibold);font-size:14.5px;color:var(--ink)}
.dropzone__hint{font-size:12.5px;color:var(--muted);line-height:1.4;max-width:36ch}
.dropzone.is-filled{border-style:solid;border-color:var(--line-strong);padding:14px}
.dropzone__preview{width:96px;height:96px;border-radius:var(--r-sm);object-fit:cover}
.dropzone--logo{min-height:104px}
.dropzone--logo .dropzone__preview{width:auto;max-width:160px;max-height:72px;border-radius:0}

/* 23.3 · LOGADD / LOGLIST / DAYCOUNT — add-as-you-go signatures. */
.logadd{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-end}
.logadd .field{margin:0}
.logadd input[type=number]{width:96px}
.loglist{list-style:none;margin:12px 0 0;padding:0;display:flex;flex-direction:column;gap:0}
.loglist li{display:flex;gap:12px;align-items:baseline;font-size:13px;padding:6px 0;border-bottom:1px solid var(--line)}
.loglist .n{font-weight:700;color:var(--accent);min-width:38px}
.loglist .when{color:var(--muted)}
.loglist .note{color:var(--ink-2)}
.daycount{display:inline-flex;align-items:baseline;gap:6px;font-size:12.5px;color:var(--ink-2);
  background:var(--surface-sunken);border:1px solid var(--border);border-radius:var(--r-pill);padding:4px 11px}
.daycount b{font-size:14px;color:var(--accent);font-weight:700}
.daycount.is-soon b{color:var(--secondary-strong)}
.daycount.is-past{opacity:.65}
.daycount.is-past b{color:var(--muted)}

/* 23.4 · TIMELINE — the tracker's mini date axis (start → reach-50 → file-by → Aug 5). */
.timeline{margin-top:16px}
.timeline__track{position:relative;height:6px;border-radius:3px;background:var(--line-strong);margin:8px 7px 0}
.timeline__done{position:absolute;left:0;top:0;height:100%;border-radius:3px;background:var(--accent)}
.timeline__proj{position:absolute;top:50%;height:0;border-top:2px dashed var(--accent);opacity:.55;transform:translateY(-50%)}
.timeline__pt{position:absolute;top:50%;width:13px;height:13px;border-radius:50%;transform:translate(-50%,-50%);border:2px solid var(--paper);box-shadow:0 0 0 1px var(--line-strong);background:var(--ink)}
.timeline__pt.is-today{background:var(--ink)}
.timeline__pt.is-goal{background:var(--accent)}
.timeline__pt.is-file{background:var(--secondary-strong)}
.timeline__pt.is-proj{background:var(--ok)}
.timeline__ends{display:flex;justify-content:space-between;font-size:12px;color:var(--muted);margin-top:8px}
.timeline__legend{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:10px}
.timeline__legend span{font-size:12px;color:var(--ink-2);display:inline-flex;align-items:center;gap:5px}
.timeline__legend span::before{content:"";width:9px;height:9px;border-radius:50%;flex:none;background:var(--ink)}
.timeline__legend .is-goal::before{background:var(--accent)}
.timeline__legend .is-file::before{background:var(--secondary-strong)}
.timeline__legend .is-proj::before{background:var(--ok)}

/* 23.5 · (SEGMENT removed — the Public/Private control belongs to the post-launch Explore directory;
   not shipping a component that isn't wired into any UI. Re-add with Explore.) */
.block{display:block;width:100%}

/* 23.6 · SEATMAP — the empty-seat data-viz (tiles are <button>, colors from --seat-*). */
.seatmap{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:8px}
.seat{display:flex;flex-direction:column;gap:1px;align-items:flex-start;text-align:left;font:inherit;cursor:pointer;
  border:1.5px solid var(--seat-line);border-radius:var(--r-sm);padding:8px 10px;background:var(--surface);color:var(--ink);
  transition:transform var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease)}
.seat b{font-size:14px}
.seat span{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
.seat:hover{transform:translateY(-1px);border-color:var(--ink)}
.seat:focus-visible{outline:var(--focus-ring);outline-offset:2px}
/* Q246 — card border/bold colors keyed to the classes seats.js actually emits (is-nocand/is-unopposed/
   is-contested), matching the legend swatches. Was `.is-open` (never emitted) → no-candidate cards fell back to
   the neutral grey border and read identical to was-contested; contested was also grey (--seat-line). */
.seat.is-nocand{border-color:var(--seat-nocand)}
.seat.is-nocand b{color:var(--seat-nocand)}
.seat.is-unopposed{border-color:var(--seat-unopposed)}
.seat.is-unopposed b{color:var(--seat-unopposed)}
.seat.is-contested{border-color:var(--seat-contested)}
/* Q283 — 2026 filing status (board tiles): no-filer yet (pink · the opportunity) · running (cobalt) · filed (taupe) */
.seat.is-nofiler{border-color:var(--seat-nocand)}
.seat.is-nofiler b{color:var(--seat-nocand)}
.seat.is-running{border-color:var(--seat-unopposed)}
.seat.is-running b{color:var(--seat-unopposed)}
.seat.is-filed{border-color:var(--seat-contested)}
/* Q311 — a TOP-OPPORTUNITY tile (empty for 2026 + won on a handful of votes in 2024): a heavier pink ring
   plus a small pink corner marker draws the eye without a new color. Marker is a positioned pink dot. */
.seat.is-opp{border-color:var(--seat-nocand);position:relative;border-width:2.5px;box-shadow:inset 0 0 0 1px var(--seat-nocand-soft)}
.seat-opp{position:absolute;top:7px;right:8px;width:8px;height:8px;border-radius:50%;background:var(--seat-nocand);flex:none}
.seatlegend{display:flex;flex-wrap:wrap;gap:8px 16px;margin:0 0 16px}
.seatlegend span{font-size:12px;color:var(--ink-2);display:inline-flex;align-items:center;gap:6px}
.seatlegend span::before{content:"";width:11px;height:11px;border-radius:3px;flex:none;border:1.5px solid var(--seat-line);background:var(--surface)}
/* Q199 — the list legend swatches keyed to the classes seats.js actually emits (was `.is-open`, which never
   matched `is-nocand` → no-candidate + was-contested both fell back to the neutral default swatch and looked
   identical). Each status now has its OWN swatch: no-candidate (pink), one-candidate (cobalt), was-contested
   (muted taupe) — clearly distinct. */
.seatlegend .is-nocand::before{border-color:var(--seat-nocand);background:var(--seat-nocand-soft)}
.seatlegend .is-unopposed::before{border-color:var(--seat-unopposed);background:var(--accent-soft)}
.seatlegend .is-contested::before{border-color:var(--seat-contested);background:var(--surface-sunken)}
.seatlegend .is-nofiler::before{border-color:var(--seat-nocand);background:var(--seat-nocand-soft)}
.seatlegend .is-running::before{border-color:var(--seat-unopposed);background:var(--accent-soft)}
.seatlegend .is-filed::before{border-color:var(--seat-contested);background:var(--surface-sunken)}
/* Q311 — the opportunity swatch reads as a solid pink dot (matching the tile marker), round not square. */
.seatlegend .is-opp::before{border-color:var(--seat-nocand);background:var(--seat-nocand);border-radius:50%}
@media(prefers-reduced-motion:reduce){.seat:hover{transform:none}}

/* 23.7 · HEADSHOT — circular frame in the six-color pride ring (hard arcs, not a blend). */
.headshot{position:relative;width:72px;height:72px;border-radius:50%;flex:none;padding:3px;
  background:conic-gradient(var(--pride-1) 60deg,var(--pride-2) 60deg 120deg,var(--pride-3) 120deg 180deg,var(--pride-4) 180deg 240deg,var(--pride-5) 240deg 300deg,var(--pride-6) 300deg)}
.headshot__img,.headshot__initial{display:block;width:100%;height:100%;border-radius:50%;object-fit:cover;border:3px solid var(--paper);background:var(--surface);box-sizing:border-box}
.headshot__initial{display:grid;place-items:center;font-family:var(--font-display);font-weight:700;font-size:26px;color:var(--accent)}
.headshot.sm{width:46px;height:46px;padding:2px}
.headshot.sm .headshot__initial{font-size:18px}
.headshot.lg{width:104px;height:104px}
.headshot.lg .headshot__initial{font-size:38px}

/* 23.8 · CHECKLIST + LOCKED states — the brunch eligibility gate. */
.checklist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.checklist li{display:flex;align-items:flex-start;gap:10px;font-size:14.5px;color:var(--ink-2)}
.checkcircle{flex:none;width:22px;height:22px;border-radius:50%;border:2px solid var(--line-strong);display:grid;place-items:center;color:transparent;background:var(--surface);margin-top:1px}
.checkcircle svg{width:12px;height:12px;stroke:currentColor;stroke-width:3;fill:none}
.checklist li.is-done .checkcircle{background:var(--ok);border-color:var(--ok);color:#fff}
.checklist li.is-done{color:var(--ink)}
.btn.is-locked,.btn.is-locked:hover,.btn.is-locked:focus{background:var(--surface-sunken);color:var(--muted);border-color:var(--line-strong);box-shadow:none;transform:none;cursor:not-allowed}
.btn.is-locked .lockicon{width:14px;height:14px;margin-right:2px}
.pill.is-locked{background:var(--surface-sunken);color:var(--muted);border:1px solid var(--line-strong)}

/* 23.9 · DISCLOSURE — FAQ / sources accordions. */
details.disclosure{border:1px solid var(--border);border-radius:var(--r-sm);padding:0 16px;margin:10px 0}
details.disclosure > summary{cursor:pointer;font-weight:var(--fw-semibold);padding:14px 0;list-style:none;display:flex;justify-content:space-between;align-items:center;gap:12px}
details.disclosure > summary::-webkit-details-marker{display:none}
details.disclosure > summary::after{content:"";width:9px;height:9px;border-right:2px solid var(--ink-2);border-bottom:2px solid var(--ink-2);transform:rotate(45deg);transition:transform var(--dur-fast) var(--ease);flex:none}
details.disclosure[open] > summary::after{transform:rotate(-135deg)}
details.disclosure[open]{padding-bottom:16px}
details.disclosure > summary:focus-visible{outline:var(--focus-ring);outline-offset:3px}

/* ============================================================================
   Broad-daylight reskin — INTERIOR TEMPLATES (body.mktg). Shared across every
   marketing page beyond home: a centered page header + the three modules
   (one-act form / disclosure FAQ / reader prose). App surfaces are untouched.
   ========================================================================== */
/* marketing ground = white (--surface); --paper is wells-only (matches the home). */
body.mktg{background:var(--surface)}
/* Disclosure (FAQ) — grouped into ONE hairline card, rows divided by --line, the
   summary in Bricolage 600, the chevron rotates open, answers --muted, 44px rows. */
body.mktg details.disclosure{border:0;border-radius:0;padding:20px 24px;margin:0}
body.mktg details.disclosure + details.disclosure{border-top:1px solid var(--line)}
body.mktg details.disclosure > summary{font-family:var(--font-display);font-weight:var(--fw-display);font-size:16.5px;padding:0;min-height:44px;color:var(--ink)}
body.mktg details.disclosure > summary::after{border-color:var(--muted)}
body.mktg details.disclosure[open]{padding-bottom:20px}
body.mktg details.disclosure > p{color:var(--muted);font-size:14.5px;line-height:1.6;margin:10px 0 0}
/* wrap a run of disclosures in .faq / .disclosure-card to get the card frame. Centered block (margin-inline
   auto) so the card sits centered in its section under a centered heading; its OWN content stays left-aligned. */
body.mktg .faq,body.mktg .disclosure-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-xl);box-shadow:var(--shadow-soft);overflow:hidden;max-width:720px;margin-inline:auto;text-align:left}

/* Interior page header — centered spark(optional) → eyebrow → H1 600 → lede --muted. */
body.mktg .page-head,body.mktg .reader-head{text-align:center;max-width:720px;margin:0 auto var(--space-9)}
body.mktg .page-head h1.display,body.mktg .reader-head h1.display,body.mktg main > .lwrap > h1.display:first-child{
  font-family:var(--font-display);font-weight:var(--fw-display);font-size:clamp(38px,6vw,56px);
  line-height:1.04;letter-spacing:-.02em;margin:16px auto 0}
/* an interior page whose first heading is a BARE main > h1.display (no .lwrap / .page-head wrapper, e.g. /explore,
   /leaders) OR one wrapped only in the i18n .lang toggle (e.g. /about, prose pages) still needs the top breathing
   room below the header — spacing ONLY (margin-top), so the page keeps its own type + prose rhythm. */
body.mktg main > h1.display:first-child,body.mktg main > .lang > h1.display:first-child{margin-top:16px}
body.mktg .page-head .lead,body.mktg .reader-head .lead{color:var(--muted);max-width:540px;margin:20px auto 0}

/* Reader (About · Trust · Evidence) — prose at --muted 15px/1.7, max ~640px;
   source-link rows in a hairline card with a trailing ↗. */
body.mktg .reader-prose{max-width:640px;margin-inline:auto;color:var(--muted);font-size:15px;line-height:1.7}
/* reader body copy reads --muted 15px/1.7; headings keep --ink via h1.display etc. */
body.mktg main.prose > p,body.mktg .reader-prose > p{color:var(--muted);font-size:15px;line-height:1.7}
body.mktg .source-links{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-xl);box-shadow:var(--shadow-soft);max-width:640px;margin:var(--space-7) auto 0;overflow:hidden}
body.mktg .source-links > a{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:17px 24px;text-decoration:none;color:var(--ink);font-weight:var(--fw-medium);font-size:15px}
body.mktg .source-links > a + a{border-top:1px solid var(--line)}
body.mktg .source-links > a::after{content:"↗";color:var(--accent-strong);flex:none}
body.mktg .source-links > a:hover{color:var(--accent-strong)}

/* =============================================================================
   24 · DESIGN SYSTEM v1.1 — bold badge + certificate (optional direction)
   The original .badge coin + .seal are untouched; this is an alternate bold award.
   ========================================================================== */
/* Q102 — the full BOLD CARD system (BADGE_CERTIFICATE_DESIGN.md, matches the reference PNGs). Grounded in
   the live base tokens above (3px ink keyline, --surface ground, --r-lg, the 8px hard stamp shadow); the
   render (learn/portal.js) points shelf/library/earn/cohort-gate at these. Left-aligned per the PNG.
   Tokens only; state lives in words + the pill (never color alone); the pride spark is aria-hidden. */
.award{position:relative;display:flex;flex-direction:column;gap:9px;text-align:left;
  border:3px solid var(--ink);border-radius:var(--r-lg);background:var(--surface);padding:20px 22px;box-shadow:8px 8px 0 var(--ink)}
/* Q693 — the whole medallion is the door: the card is an <a>, so make it look + behave clickable (no link underline,
   inherit text color, a clear hover lift + focus ring). The foot cue keeps the accent color. */
a.award{text-decoration:none;color:inherit;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease}
a.award:hover{transform:translate(-2px,-2px);box-shadow:10px 10px 0 var(--ink)}
a.award:focus-visible{outline:3px solid var(--accent);outline-offset:3px}
a.award .award__path{color:var(--accent-strong);font-weight:700}
a.award:hover .award__path{text-decoration:underline}
.award__top{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
.award__kicker{font:700 var(--fs-eyebrow)/1.2 var(--font-ui);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;color:var(--muted)}
.award__spark{font-size:24px;line-height:1}
.award--locked .award__spark{color:var(--muted)}
.award__title{margin:0;font-family:var(--font-display);font-weight:var(--fw-display-heavy);font-size:clamp(22px,3.8vw,29px);line-height:1.03;letter-spacing:-.01em;color:var(--ink);text-wrap:balance}
.award--locked .award__title{color:var(--ink-2)}
.award__desc{margin:0;font-size:14px;line-height:1.42;color:var(--ink-2)}
.award__foot{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-top:2px}
.award__pill{display:inline-flex;align-items:center;gap:7px;min-height:34px;padding:5px 15px;border-radius:var(--r-pill,999px);
  font:700 12.5px/1 var(--font-ui);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap}
.award__pill--cobalt{background:var(--accent);color:var(--on-accent)}
.award__pill--muted{background:var(--surface-sunken);color:var(--muted);border:1.5px solid var(--line-strong)}
.award__pill .ic{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;flex:none}
.award__cohort{font:700 12px/1 var(--font-ui);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.award__path{display:inline-flex;align-items:center;min-height:44px;font:600 13px/1.35 var(--font-ui);color:var(--accent);text-decoration:none}
.award__path:hover,.award__path:focus-visible{text-decoration:underline}
.award__footer{margin-top:4px;padding-top:8px;border-top:1.5px solid var(--line);font:700 var(--fs-eyebrow)/1.2 var(--font-ui);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;color:var(--muted)}

/* the certificate — .certificate--bold (landscape typographic shell, printable, NO drop shadow on print) */
.certificate--bold{position:relative;display:block;background:var(--surface);border:3px solid var(--ink);border-radius:var(--r-lg);
  padding:30px 34px 34px;margin:6px 0 0;max-width:760px;text-align:left}
.certificate--bold::before{content:none}
.certificate--bold .cert-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}
.certificate--bold .cert-mark{font-family:var(--font-display);font-weight:var(--fw-display-heavy);font-size:16px;letter-spacing:0;text-transform:none;color:var(--ink)}
.certificate--bold .cert-mark .spark{font-size:14px}
.certificate--bold .cert-spark{font-size:26px}
.certificate--bold .cert-eyebrow{margin:22px 0 6px;font:700 var(--fs-eyebrow)/1.2 var(--font-ui);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;color:var(--accent)}
.certificate--bold .cert-name{margin:0;font-family:var(--font-display);font-weight:var(--fw-display-heavy);font-size:clamp(28px,7vw,58px);line-height:1;letter-spacing:-.02em;color:var(--ink);overflow-wrap:anywhere;word-break:break-word;max-width:100%}
.certificate--bold .cert-body{margin:16px 0 0;max-width:46ch;font-size:15px;line-height:1.5;color:var(--ink-2)}
.certificate--bold .cert-rule{height:1.5px;background:var(--line);margin:22px 0 0}
.certificate--bold .cert-sigs{display:flex;flex-wrap:wrap;gap:34px;margin:16px 0 0}
.certificate--bold .cert-sig-img{display:block;max-height:44px;width:auto;margin:0 0 4px;object-fit:contain}   /* Q715 — signature image above the signer name (hidden by JS until the file exists) */
.certificate--bold .cert-sig b{display:block;font:600 14px/1.3 var(--font-ui);color:var(--ink)}
.certificate--bold .cert-sig span{display:block;margin-top:2px;font:600 11px/1.2 var(--font-ui);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.certificate--bold .cert-sig .cert-date{font-family:var(--font-num);font-variant-numeric:tabular-nums}
.certificate--bold .cert-stamp{display:inline-flex;align-items:center;gap:8px;margin:20px 0 0;padding:8px 18px;border-radius:var(--r-pill,999px);
  background:var(--accent);color:var(--on-accent);box-shadow:5px 5px 0 var(--ink);font:700 12.5px/1 var(--font-ui);letter-spacing:.06em;text-transform:uppercase}
.certificate--bold .cert-stamp .spark{font-size:15px;color:var(--on-accent)}
@media print{
  .certificate--bold{box-shadow:none;border-color:var(--ink)}
  .certificate--bold .cert-stamp{box-shadow:none;-webkit-print-color-adjust:exact;print-color-adjust:exact}
}

/* =============================================================================
   22 · GEOGRAPHIC SEAT MAP (SEAT_MAP_SPEC.md) — real 2023 SMD polygons in our
   palette. Per-feature status classes are set by the map JS; colors come from the
   --seat-* tokens. Vacancy is a separate hatch overlay. Never say "open" in copy.
   ========================================================================== */
.geowrap{display:grid;grid-template-columns:1fr 340px;gap:20px;margin-top:22px;align-items:start}
@media(max-width:760px){.geowrap{grid-template-columns:1fr}}
.geomap{width:100%;height:min(68vh,620px);border:1.5px solid var(--border);border-radius:var(--r);
  background:var(--surface-sunken);overflow:hidden}
.geomap .leaflet-container{background:var(--surface-sunken);font:inherit;outline:none}
.geomap .leaflet-interactive:focus{outline:none}

/* — Gentle in-page navigation (plan/checklist links) ----------------------- */
/* Smooth travel for anchor jumps, only when motion is welcome. */
@media (prefers-reduced-motion: no-preference){ html{scroll-behavior:smooth} }
/* Breathing room above any landed target so it never kisses the viewport edge. */
#why-card,#trk,#portal,#stump-card,#profile-panel,#crew-block,#board-block,.plan-anchor{scroll-margin-top:18px}
/* The landing glow: a soft accent ring that says "here" — appears on arrival, lifts away. */
.is-landed{outline:3px solid var(--accent-soft);outline-offset:5px;border-radius:var(--r-lg)}
@media (prefers-reduced-motion: no-preference){
  .is-landed{animation:landfade 1.8s var(--ease) forwards}
  @keyframes landfade{0%,55%{outline-color:var(--accent-soft)}100%{outline-color:transparent}}
}

/* Light washes so the street basemap reads through every district (this rule OWNS fill-opacity —
   CSS beats Leaflet's inline attr, which is how the old fill-opacity:1 was overriding map.js). */
.geo-poly{stroke:var(--seat-line);stroke-width:.8;fill-opacity:.22;cursor:pointer;transition:fill-opacity .12s ease}   /* Q198 — visible boundary on the paper ground (was paper-on-paper = invisible with no basemap) */
.geo-poly.is-contested{fill:var(--seat-contested)}
.geo-poly.is-unopposed{fill:var(--seat-unopposed)}
.geo-poly.is-noran{fill:var(--seat-nocand);fill-opacity:.32}
.geo-poly.is-nodata{fill:var(--seat-empty)}
/* Q283 — 2026 filing status (map fills): no-filer yet (pink · the opportunity) · running (cobalt) · filed (taupe) */
.geo-poly.is-nofiler{fill:var(--seat-nocand);fill-opacity:.32}
.geo-poly.is-running{fill:var(--seat-unopposed)}
.geo-poly.is-filed{fill:var(--seat-contested)}
/* Q311 — the TOP-OPPORTUNITY ring: a winnable-and-empty seat (empty for 2026 + won on a handful of votes in
   2024) carries a heavier pink stroke so it stands out from the plain no-filer fill without a new color. The
   later interaction states (is-sel/is-hover/is-focus) still override the stroke when the seat is engaged. */
.geo-poly.is-opp{stroke:var(--seat-nocand);stroke-width:2.5;fill-opacity:.44}
.geo-poly:hover{fill-opacity:.5}
.geo-poly.is-sel{fill-opacity:.55}
/* Q421 — neighbor-activity engagement heat (k-anon, momentum not shame): lit wards glow cobalt by bucket, quiet
   wards stay neutral. Placed AFTER the status fills so the heat wins by source order when the toggle is on. */
.geo-poly.heat-1{fill:var(--accent);fill-opacity:.2}
.geo-poly.heat-2{fill:var(--accent);fill-opacity:.36}
.geo-poly.heat-3{fill:var(--accent);fill-opacity:.54}
/* interaction states — the feature is brought to front so its stroke isn't clipped */
.geo-poly.is-hover{stroke:var(--ink);stroke-width:2}
.geo-poly.is-dim{fill-opacity:.08!important}   /* QL1 list<->map sync: non-matching districts recede */
.geo-poly.is-focus{stroke:var(--accent);stroke-width:2.5;stroke-dasharray:5 4}
.geo-poly.is-sel{stroke:var(--ink);stroke-width:3.5}
.geo-poly.is-home{stroke:var(--accent);stroke-width:3}
.geo-vac{fill:url(#vac-hatch)}
.geo-pin{filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}

/* legend */
.geolegend{display:flex;flex-wrap:wrap;gap:8px 16px;margin:14px 0 0}
.geolegend span{font-size:12px;color:var(--ink-2);display:inline-flex;align-items:center;gap:6px}
.geolegend span::before{content:"";width:13px;height:13px;border-radius:3px;flex:none;border:1px solid var(--seat-line)}
.geolegend .is-contested::before{background:var(--seat-contested)}
.geolegend .is-unopposed::before{background:var(--seat-unopposed)}
.geolegend .is-noran::before{background:var(--seat-nocand)}
.geolegend .is-nodata::before{background:var(--seat-empty)}
.geolegend .is-nofiler::before{background:var(--seat-nocand)}
.geolegend .is-running::before{background:var(--seat-unopposed)}
.geolegend .is-filed::before{background:var(--seat-contested)}
.geolegend .is-vac::before{background:var(--seat-empty);background-image:repeating-linear-gradient(45deg,var(--ink) 0 2px,transparent 2px 5px)}

/* the seat card (map select) */
.seatcard{border:2px solid var(--ink);border-radius:var(--r);background:var(--surface);padding:18px 20px;box-shadow:var(--shadow-pop-sm)}
.seatcard__id{font-family:var(--font-display);font-weight:700;font-size:20px;margin:0}
.seatcard__meta{font-size:13px;color:var(--muted);margin:2px 0 12px}
.seatcard__rep{font-size:15px;color:var(--ink);margin:0 0 4px}
.seatcard__vac{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;
  color:#fff;background:var(--ink);border-radius:var(--r-pill);padding:3px 10px;margin:0 0 8px}
.seatcard__status{font-size:14px;color:var(--ink-2);margin:0 0 6px}
/* Q456 — the public candidate name(s) on a seat card; a participant carries the brand spark. */
.seatcard__cands{font-size:13.5px;color:var(--ink);margin:0 0 8px;line-height:1.5}
.seatcard__cands-lbl{color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.04em}
.seatcard__cand{display:inline-block;font-weight:600;margin-right:8px}
.seatcard__spark{font-size:0.82em;vertical-align:-0.04em}
.seatcard__take{font-size:13.5px;color:var(--ink);margin:0 0 14px;line-height:1.45}
/* Q311 — the winnable-and-empty callout in the seat card: a pink left-rule that draws the eye to the proof-point. */
.seatcard__opp{font-size:13.5px;font-weight:600;color:var(--secondary-strong);margin:0 0 14px;line-height:1.45;
  border-left:3px solid var(--seat-nocand);padding-left:10px}
.seatcard__actions{display:flex;gap:10px;flex-wrap:wrap}
/* Q292 — the demoted adopt/watch action: a quiet get-updates link under the seat-card doors. */
.seatcard__updates{margin:8px 0 0}
.seatcard__updates .btn-quiet{font-size:14px;padding:4px 2px}
.seatcard__empty{color:var(--muted);font-size:14px}

/* the a11y companion list — equal to the map, searchable + sortable */
.smdlist-wrap{margin-top:34px}
.smdlist-tools{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.smdlist-tools input{max-width:280px}
.smdlist{width:100%;border-collapse:collapse;font-size:13.5px}
.smdlist th,.smdlist td{text-align:left;padding:9px 12px;border-bottom:1px solid var(--line)}
.smdlist th button{background:none;border:0;font:inherit;font-weight:700;color:var(--ink);cursor:pointer;padding:0;display:inline-flex;gap:4px;align-items:center}
.smdlist th button:focus-visible{outline:var(--focus-ring);outline-offset:2px}
.smdlist tbody tr{cursor:pointer}
.smdlist tbody tr:hover{background:var(--surface-sunken)}
.smdlist tbody tr.is-sel{background:var(--accent-soft)}
.smdlist tbody tr:focus-visible{outline:var(--focus-ring);outline-offset:-2px}
.smd-dot{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:7px;vertical-align:-1px}
.smd-dot.is-contested{background:var(--seat-contested)}
.smd-dot.is-unopposed{background:var(--seat-unopposed)}
.smd-dot.is-noran{background:var(--seat-nocand)}
.smd-dot.is-nodata{background:var(--seat-empty)}
.smd-dot.is-nofiler{background:var(--seat-nocand)}
.smd-dot.is-running{background:var(--seat-unopposed)}
.smd-dot.is-filed{background:var(--seat-contested)}
.smd-dot.is-opp{background:var(--seat-nocand);border-radius:50%}   /* Q311 — the opportunity chip's pink dot */

/* shared EN/ES language toggle (quiz, privacy, about — pages that don't load portal.css) */
/* Q203 (supersedes Q160) — the ES toggle is HIDDEN sitewide, UNCONDITIONALLY. Spanish is not vetted, so no
   language toggle may appear anywhere. This does NOT depend on any JS adding .lang-locked, so it can't
   regress via script load-order/timing (the Q193 shared header injects #lang after the lock JS runs — that
   is how it came back). The JS locks still force English + clear a stale qa_lang="es". To re-enable once
   Spanish is reviewed: delete this rule AND set window.LANG_TOGGLE_ENABLED = true. */
.langtoggle,#lang,#quizlang,#storylang,.lang-locked .langtoggle{display:none!important}
.langtoggle{font:inherit;font-size:12px;font-weight:600;letter-spacing:.04em;cursor:pointer;background:none;border:1.5px solid var(--line-strong);color:var(--ink-2);border-radius:999px;padding:6px 14px}
.langtoggle:hover{border-color:var(--accent);color:var(--accent)}

/* Canonical chip-picker (CHIP_PICKER_PATTERN) — pills ARE the value */
.cp-group{margin:14px 0}
.cp-legend{font-weight:600;font-size:14px;margin:0 0 4px}
.cp-helper{font-size:13px;color:var(--muted);margin:0 0 10px;transition:color .15s}
.cp-helper--pulse{color:var(--secondary-strong,var(--secondary-strong));font-weight:700}
.cp-chips{display:flex;flex-wrap:wrap;gap:8px}
.cp-chip{display:inline-flex;align-items:center;gap:7px;border:2px solid var(--seat-line,#D9D5CC);border-radius:999px;padding:7px 14px;cursor:pointer;font:inherit;font-size:13.5px;font-weight:600;background:#fff;color:var(--ink)}
.cp-chip:hover{border-color:var(--ink)}
.cp-chip.is-on{background:var(--accent);border-color:var(--accent);color:#fff}
.cp-chip:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.cp-rank{display:grid;place-items:center;width:17px;height:17px;border-radius:50%;background:rgba(255,255,255,.28);font-size:12px;font-weight:800}
.cp-somethingelse{border-style:dashed}
.cp-x{font-weight:800;opacity:.8}
.cp-custombox{margin:10px 0 0}
.cp-ownwords{display:block;font-size:13px;font-weight:600;margin:0 0 6px}
.cp-inline{display:flex;gap:8px}
.cp-inline input{flex:1;font:inherit;font-size:16px;padding:8px 12px;border:2px solid var(--seat-line,#D9D5CC);border-radius:var(--r-sm);box-sizing:border-box}

/* Fast-lane decided banner (FRONT_DOOR_SPEC B) */
.decided-banner{font-family:var(--font-display);font-weight:700;font-size:18px;line-height:1.4;background:var(--surface-sunken,#EFECE2);border-left:4px solid var(--accent);border-radius:0 10px 10px 0;padding:14px 18px;margin:0}
.decided-branch{border:2px solid var(--line,#E4E0D5);border-radius:12px;padding:14px 16px;margin:16px 0 0;display:grid;gap:10px}
.decided-branch legend{padding:0 6px}

/* Share-moment sheet (SHARE_LOOP_SPEC) — one component, all nine moments */
.sharem-overlay{position:fixed;inset:0;background:rgba(26,22,34,.5);display:flex;align-items:center;justify-content:center;z-index:1000;padding:20px}
.sharem{background:#fff;border-radius:16px;padding:22px;max-width:440px;width:100%;box-shadow:var(--shadow-pop);position:relative}
.sharem-x{position:absolute;top:8px;right:12px;background:none;border:none;font-size:26px;line-height:1;cursor:pointer;color:var(--ink-2)}
.sharem-h{font-family:var(--font-display);font-weight:800;font-size:19px;margin:0 0 12px}
.sharem-text{width:100%;box-sizing:border-box;font:inherit;font-size:15px;padding:12px;border:2px solid var(--line,#E4E0D5);border-radius:10px;resize:vertical}
.sharem-card{display:block;width:100%;height:auto;border-radius:12px;border:2px solid var(--line,#E4E0D5);margin:0 0 12px}
/* Q447 — host share-card color variants: token-only swatches (cobalt · pink · parchment). */
.sharem-variants{display:flex;gap:10px;margin:0 0 12px}
.sharem-swatch{width:44px;height:44px;border-radius:var(--r-pill,999px);border:2px solid var(--ink);cursor:pointer;padding:0}
.sharem-swatch[aria-pressed="true"]{outline:3px solid var(--ink);outline-offset:2px}
.sharem-swatch--cobalt{background:var(--accent)}
.sharem-swatch--pink{background:var(--secondary-strong)}
.sharem-swatch--parchment{background:var(--paper)}
/* Q412 personal ref-QR — "show a neighbor in person" (nominate share box + quiz result) */
.nominate-qr,.quiz-qr{margin:12px 0 0;text-align:center}
.nominate-qr canvas,.quiz-qr canvas{width:132px;height:132px;border-radius:8px;border:1.5px solid var(--line,#E4E0D5)}
.nominate-qr figcaption,.quiz-qr figcaption{margin-top:6px}
/* Q424 "Is this for me?" reassurance — expandable answers on the canonical details.disclosure (chevron + stacked
   hairline list from styles.css/landing.css); the bespoke box is gone so it matches the specced accordion. */
.reassure__q{font-weight:600;cursor:pointer}
.reassure__a{margin-top:2px;color:var(--muted)}
/* Q415 reciprocity — a warm "your nudge landed" beat back to the nominator (never guilts) */
.nominate-reciprocity:not([hidden]){margin:12px 0 0;padding:10px 12px;border-radius:10px;background:var(--soft-pink,#FFE4EE);border:1.5px solid var(--line,#E4E0D5)}
.nominate-landed{margin:0 0 8px;font-weight:600}
.sharem-actions{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}
a.sharem-save{display:inline-flex;align-items:center;text-decoration:none}

/* Threshold breath (Q60 / CALM §2) — static settle line, reduced-motion-safe by construction */
.threshold-breath{font-weight:600;margin:0 0 14px}

/* Feedback modal (Q84) — native dialog, system tokens */
.fbk{border:2px solid var(--ink);border-radius:16px;padding:22px;max-width:460px;width:92vw;box-shadow:var(--shadow-pop);background:var(--surface)}
.fbk::backdrop{background:rgba(26,22,34,.5)}
.fbk-form{position:relative}
.fbk-x{position:absolute;top:-6px;right:-4px;background:none;border:none;font-size:26px;line-height:1;cursor:pointer;color:var(--ink-2)}
.fbk-h{font-family:var(--font-display);font-weight:800;font-size:22px;margin:0 0 6px}
.fbk-sub{font-size:14px;color:var(--ink-2);margin:0 0 12px}
.fbk-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px}
/* the intent pills — a dedicated feedback-chip class (the shared .chipbtn only lives in seats/map page CSS, not loaded
   here, so the pills were bare unstyled buttons → selection looked dead). Renders the chip + a token selected state. */
.fbk-chip{font:inherit;font-size:14px;font-weight:600;min-height:44px;display:inline-flex;align-items:center;padding:0 16px;border:1px solid var(--line-strong);border-radius:var(--r-pill);background:var(--surface);color:var(--ink);cursor:pointer}
.fbk-chip:hover{border-color:var(--muted)}
.fbk-chip.is-on,.fbk-chip[aria-pressed="true"]{border:1.5px solid var(--accent);background:var(--accent-wash);color:var(--accent-strong)}
.fbk-chip:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
.fbk textarea.field{width:100%;box-sizing:border-box;resize:vertical}
.fbk-ctx{font-size:12px;margin:6px 0}
.fbk-emailopt{display:flex;align-items:center;gap:6px;font-size:14px;margin:8px 0}
.fbk #fbk-email{width:100%;box-sizing:border-box;margin:0 0 8px}
.fbk-actions{margin-top:12px}
.fbk-done{font-weight:600;margin:8px 0 0}
.fbk-tie{display:block;font-weight:400;font-size:13px;color:var(--ink-2);margin-top:6px}
.foot-feedback{margin-top:10px}
/* Q627 — gated-tool preview + unlock lightbox (locked ≠ hidden; a look-don't-touch tease). Tokens only; the
   .card frame is reused for the dimmed stage; the lightbox reuses the canonical native <dialog> pattern (.fbk). */
.gated-preview{display:flex;flex-direction:column;gap:16px;max-width:720px}
.gated-preview__bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.gated-preview__label{font-weight:700;color:var(--ink)}
.gated-preview__unlock{margin-left:auto}
/* dimmed + blurred (a static filter — reduced-motion-safe by construction) + inert; it can't be used */
.gated-preview__stage{position:relative;opacity:.55;filter:blur(1.5px);pointer-events:none;user-select:none}
.gated-stage__eb{margin:0 0 10px}
.gated-stage__empty{margin:0;color:var(--locked-fg)}
.gs-topline{display:flex;justify-content:space-between;gap:12px;font-weight:700;padding-bottom:10px;border-bottom:1.5px solid var(--line)}
.gs-topline__v{color:var(--accent)}
.gs-list{list-style:none;margin:10px 0 0;padding:0;display:grid;gap:8px}
.gs-row{display:flex;justify-content:space-between;gap:12px;font-size:15px;color:var(--ink)}
.gs-row__amt{color:var(--ink-2)}
.gs-tag{font-size:13px;color:var(--ink-2)}
.toolgate{border:2px solid var(--ink);border-radius:16px;padding:24px;max-width:460px;width:92vw;box-shadow:var(--shadow-pop);background:var(--surface);position:relative}
.toolgate::backdrop{background:rgba(26,22,34,.5)}
.toolgate__x{position:absolute;top:8px;right:12px;background:none;border:none;font-size:26px;line-height:1;cursor:pointer;color:var(--ink-2)}
.toolgate__head{display:grid;gap:6px;margin-bottom:14px}
.toolgate__h{font-family:var(--font-display);font-weight:800;font-size:22px;margin:0}
.toolgate__sub{margin:0;color:var(--ink-2)}
.toolgate__stepseb{margin:0 0 8px}
.toolgate__steps{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.tg-step{display:flex;align-items:center;gap:10px}
.tg-step__ic{display:inline-flex;width:24px;height:24px;flex:0 0 auto;color:var(--ink-2)}
.tg-step.is-done .tg-step__ic{color:var(--journey-done,var(--accent))}
.tg-step__body{flex:1 1 auto;min-width:0}
.tg-step__name{font-weight:600;color:var(--ink)}
.tg-step.is-done .tg-step__name{color:var(--ink-2)}
.tg-step__done{flex:0 0 auto;font-size:13px;color:var(--ink-2)}
.tg-step__go{flex:0 0 auto;white-space:nowrap}
/* Q628 — carrot-driven onboarding: the leveling-up progress line toward the flagship tool. Tokens; a left accent
   rule keeps it calm (not a bespoke boxed panel). */
.carrot{margin:14px 0 0;padding:2px 0 2px 14px;border-left:3px solid var(--accent)}
.carrot__eb{margin:0 0 2px}
.carrot__msg{margin:0 0 8px;font-weight:600;color:var(--ink)}
/* Q676 — the done/todo step checklist rides the carrot rail card (screen 40), same tg-step grammar as the lightbox. */
.carrot__steps{margin:0 0 14px}
.carrot__actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center}
.carrot.is-unlocked{display:flex;gap:10px;align-items:flex-start;border-left-color:var(--journey-done,var(--accent))}
.carrot.is-unlocked .carrot__body{display:grid;gap:8px}
/* Q45 — the "Make one ask" kit (recruit-the-recruiters). Shared by the dashboard + supporter surface;
   self-contained (crew page doesn't load support.css), tokens-only. */
.ask-kit{display:grid;gap:12px}
.ak-intro{margin:0;font-size:15px;color:var(--ink)}
.ak-chips{display:flex;flex-wrap:wrap;gap:8px}
.ak-chip{font:inherit;font-size:14px;min-height:44px;box-sizing:border-box;background:var(--surface);border:2px solid var(--seat-line);border-radius:var(--r-pill);padding:6px 14px;color:var(--ink);cursor:pointer;text-align:left}
.ak-chip:hover{border-color:var(--ink)}
.ak-chip.is-on{background:var(--accent);border-color:var(--accent);color:#fff}
.ak-chip:focus-visible{outline:var(--focus-ring,2px solid var(--accent));outline-offset:2px}
.ak-out{display:grid;gap:8px;border-left:3px solid var(--accent);padding:4px 0 4px 14px}
.ak-lab{margin:0;font-size:12px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);font-weight:700}
.ak-script{margin:0;padding-left:18px;display:grid;gap:4px;font-size:15px;line-height:1.45}
.ak-job{margin:0;font-size:13.5px;color:var(--muted);font-weight:600}
.ak-linkrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.ak-link{flex:1 1 200px;min-width:140px;min-height:44px;font-size:16px;padding:6px 10px;border:1.5px solid var(--line-strong);border-radius:var(--r);background:#fff;color:var(--ink)}
.ak-report{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:4px 0 0}
.ak-report__q{flex-basis:100%;font-size:14px;color:var(--ink)}
.ak-again{margin:0;font-weight:600;color:var(--accent)}
.ak-count{margin:0;font-size:13px;color:var(--muted)}
.ak-receipt{margin:0;font-size:13px;font-weight:600;color:var(--accent)}
.ak-receipt:empty{display:none}
/* Q47 belonging stories — doubt-moment card (quiz + front door + portal) + collection form */
.bstory{margin:0;border-left:3px solid var(--accent);padding:8px 0 8px 14px;display:grid;gap:6px}
.bstory__eyebrow{margin:0;font-size:12px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);font-weight:700}
.bstory__q{margin:0;font-size:16px;line-height:1.5;color:var(--ink)}
.bstory__by{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--muted)}
.bstory__pic{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:var(--r-pill);background:var(--accent-tint);color:var(--ink);font-size:12px;font-weight:700}
.fd-story{margin-top:12px}
.bshare{display:grid;gap:10px}
.bshare__intro{margin:0;font-size:14px;color:var(--ink)}
.bshare__note{margin:0;font-size:12.5px}
.bshare__thanks{margin:0;font-weight:600}
.bs-tier{border:0;padding:0;margin:0;display:grid;gap:6px}
.bs-tieropt{display:flex;align-items:center;gap:8px;font-size:14px;min-height:44px}
.bs-tieropt input{min-width:20px;min-height:20px}
.bshare .bs-text,.bshare .bs-type,.bshare .bs-name{font-size:16px}
/* Q76 partner interest pipeline — the "Partner with us" form (About + /partners/) */
.partner-section{max-width:640px;margin:28px 0 0}   /* Q228 — left-align the form to the page frame, not centered/offset */
.partner-title{margin:0 0 8px}
.partner-form{display:grid;gap:12px}
.pi-intro{margin:0;font-size:15px;color:var(--ink)}
.pi-set{border:0;padding:0;margin:0}
.pi-set .cp-chips{margin-top:6px}   /* Q194 — partner interest chips are the canonical .cp-chip now; the bespoke .pi-chip is retired */
.partner-form input,.partner-form textarea{font-size:16px}
.pi-check{display:flex;gap:8px;align-items:flex-start;font-size:14px}
.pi-check input{margin-top:3px;min-width:18px;min-height:18px}
.pi-thanks{margin:0 0 8px;font-weight:600}
.pi-activation{margin:0;padding-left:18px;display:grid;gap:6px}

/* Q190 — the shared "nominate a neighbor" modal (nominate.js openModal), used by the adopt-a-seat
   "I know someone" CTA and available on any page. Self-contained (scoped under .nominate-modal) so it styles
   correctly without landing.css. Tokens only. */
.nominate-modal{border:2px solid var(--ink);border-radius:var(--r-lg);padding:24px;max-width:min(460px,92vw);width:100%;background:var(--surface);color:var(--ink);box-shadow:8px 8px 0 var(--ink)}
.nominate-modal::backdrop{background:rgba(0,0,0,.45)}
.nominate-modal__x{display:flex;justify-content:flex-end;margin:-8px -8px 0 0}
.nominate-modal__x .linkbtn{font-size:20px;line-height:1;min-height:44px;min-width:44px}
.nominate-modal .nominate-title{font-family:var(--font-display);font-weight:var(--fw-display);font-size:clamp(20px,2.6vw,24px);margin:0 0 6px;letter-spacing:-.01em}
.nominate-modal .nominate-sub{margin:0 0 4px;color:var(--ink-2);font-size:14.5px;line-height:1.5}
.nominate-modal .nominate-form{display:flex;flex-direction:column;gap:12px;margin-top:10px}
.nominate-modal .nominate-fields{display:flex;gap:12px;flex-wrap:wrap}
.nominate-modal .nominate-field{display:flex;flex-direction:column;gap:5px;flex:1 1 150px}
.nominate-modal .nominate-field--wide{flex-basis:100%}
.nominate-modal .nominate-field span{font-size:13px;font-weight:600;color:var(--ink-2)}
.nominate-modal .nominate-field input{font:inherit;font-size:16px;padding:11px 13px;min-height:44px;border:1.5px solid var(--line-strong);border-radius:var(--r-sm);background:var(--surface);color:var(--ink)}
.nominate-modal .nominate-field input:focus-visible{outline:var(--focus-ring);outline-offset:var(--focus-offset);border-color:var(--accent)}
.nominate-modal .nominate-note{margin:-2px 0 0;font-size:12.5px;color:var(--muted);line-height:1.45}
.nominate-modal .nominate-out{display:flex;flex-direction:column;gap:10px}
.nominate-modal .nominate-preview{margin:0;padding:13px 15px;border-radius:var(--r-sm);background:var(--surface-2);border:1px solid var(--line);font-size:15px;line-height:1.5}
.nominate-modal .nominate-share{display:flex;gap:8px;flex-wrap:wrap}
.nominate-modal .nominate-share .btn-outline{text-decoration:none}
.nominate-modal .nominate-done{font-size:13px;color:var(--muted)}

/* TOOLS-HUB-FIXPACK FIX 4 — the signed-in app shell never shows the marketing footer, and never FLASHES it during a
   full-page tool switch: hide the app footer at first paint (before site-footer.js runs) so the bare HTML never
   paints the footer border rules. Marketing footers (other data-site-footer values) are untouched. */
footer[data-site-footer="app"]{display:none!important}
.portal-feedback{display:none}
