/* ==========================================================================
   JAMIE BONNER — School Trustee, Winnipeg School Division Ward 4

   Design: prairie vernacular, two-ink.
   Flat oxblood and deep green on cream — printed, not rendered. No gradients,
   no blur, no soft shadows. Depth comes from hard offset blocks and rules.
   Horizontal rules do the structural work; the prairie is horizons.

   Type: wide letter-spaced condensed caps for display, plain sans for reading.
   System fonts only — nothing to download, fast on a phone in a parking lot.
   ========================================================================== */

:root {
  /* --- The two inks + paper ------------------------------------------- */
  /* Ratios below are measured, not estimated. All pairs used in the design
     clear WCAG AA (4.5:1); the tightest is --ink-faint on --cream-deep at
     4.77:1, so darken --ink-faint if you ever darken that paper tone. */
  --oxblood:   #7c2128;   /* primary ink   —  8.93:1 on cream */
  --oxblood-d: #5e181e;   /* pressed state */
  --green:     #1f4733;   /* second ink    —  9.37:1 on cream */
  --green-d:   #143024;

  --cream:     #f7f2e7;   /* paper */
  --cream-deep:#efe7d6;   /* second paper tone */
  --ink:       #211d1a;   /* text          — 14.98:1 on cream */
  --ink-soft:  #4f4740;   /* secondary     —  8.15:1 on cream */
  --ink-faint: #6d635a;   /* meta          —  5.25:1 on cream */
  --rule:      #211d1a;   /* rules are ink, always */

  /* Wheat, used sparingly as a fill only — never for text */
  --wheat:     #e0c98b;

  /* --- Type scale ----------------------------------------------------- */
  --step--1: clamp(.82rem, .8rem + .1vw, .88rem);
  --step-0:  clamp(1.02rem, .99rem + .16vw, 1.1rem);
  --step-1:  clamp(1.16rem, 1.08rem + .34vw, 1.36rem);
  --step-2:  clamp(1.4rem, 1.2rem + .8vw, 1.95rem);
  --step-3:  clamp(1.7rem, 1.35rem + 1.7vw, 2.7rem);
  --step-4:  clamp(2.5rem, 1.5rem + 5.4vw, 5.6rem);

  --gap: 1.35rem;
  --bay: clamp(3.5rem, 8vw, 6.5rem);

  /* Condensed grotesque — the prairie signage voice.
     Ordered so each platform lands on a genuine condensed face before any
     fallback to Impact, which is far heavier and reads crude at display size:
       macOS/iOS  -> Avenir Next Condensed, then HelveticaNeue-CondensedBold
       Windows    -> Arial Narrow
       Android    -> Roboto Condensed
       Linux      -> Liberation Sans Narrow / DejaVu Sans Condensed
     Ends at the sans stack rather than Impact so a system with no condensed
     face gets clean wide-tracked caps instead of a slab of black. */
  --display: "Avenir Next Condensed", "HelveticaNeue-CondensedBold",
             "Arial Narrow", "Roboto Condensed", "Liberation Sans Narrow",
             "DejaVu Sans Condensed", var(--sans);
  --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
          "Helvetica Neue", Arial, sans-serif;

  --measure: 60ch;
}

*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-padding-top: 4.5rem;
}

body {
  margin: 0;
  font-family: var(--sans);
  font-size: var(--step-0);
  line-height: 1.6;
  color: var(--ink);
  background: var(--cream);
  overflow-x: hidden;
}

/* --- Display type: wide, condensed, all caps -------------------------- */

.display,
h1, h2 {
  font-family: var(--display);
  /* 700, not 400: the stack now leads with Avenir Next Condensed, which has
     real weights and renders thin at 400. Faces that only ship bold ignore
     this and look the same either way. */
  font-weight: 700;
  text-transform: uppercase;
  line-height: .95;
  letter-spacing: .06em;
  color: var(--ink);
  margin: 0;
}
h1 { font-size: var(--step-4); letter-spacing: .02em; }
h2 { font-size: var(--step-3); }

/* Sub-headings stay sans — readable, not shouty. */
h3 {
  font-family: var(--sans);
  font-size: var(--step-1);
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -.01em;
  color: var(--ink);
  margin: 0 0 .5rem;
}

p { margin: 0 0 1.1rem; }
p:last-child { margin-bottom: 0; }

.lede { font-size: var(--step-1); line-height: 1.55; }

a {
  color: var(--oxblood);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
a:hover { color: var(--ink); background: var(--wheat); }

:focus-visible {
  outline: 3px solid var(--oxblood);
  outline-offset: 2px;
}

img { max-width: 100%; height: auto; display: block; }

/* --- Layout ----------------------------------------------------------- */

.wrap {
  width: 100%;
  max-width: 74rem;
  margin-inline: auto;
  padding-inline: var(--gap);
}

.skip-link { position: absolute; left: -9999px; }
.skip-link:focus {
  left: var(--gap); top: var(--gap); z-index: 30;
  background: var(--cream); color: var(--ink);
  padding: .7rem 1.1rem;
  border: 2px solid var(--ink);
}

/* ======================================================================
   HORIZON RULES — the core motif.
   A thick ink rule with a thin one beneath it, like a prairie skyline.
   ====================================================================== */

.horizon {
  border: 0;
  height: 0;
  margin: 0;
  border-top: 3px solid var(--rule);
  position: relative;
}
.horizon::after {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 4px;
  border-top: 1px solid var(--rule);
}

/* Label sitting on a horizon, like a survey marker */
.kicker {
  display: inline-flex;
  align-items: center;
  gap: .6rem;
  font-family: var(--sans);
  font-size: .72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .22em;
  color: var(--oxblood);
  margin: 0 0 .9rem;
}
.kicker::before {
  content: "";
  width: 1.75rem;
  height: 3px;
  background: var(--oxblood);
  flex: none;
}

.section-head { margin-bottom: clamp(2rem, 4vw, 3rem); }
.section-head h2 { margin-bottom: 1rem; }
.section-intro {
  color: var(--ink-soft);
  font-size: var(--step-1);
  max-width: var(--measure);
  margin: 0;
}

.side-title {
  font-family: var(--sans);
  font-size: .72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .2em;
  color: var(--ink);
  margin: 0 0 1rem;
  padding-bottom: .6rem;
  border-bottom: 3px solid var(--rule);
}

/* ======================================================================
   HEADER — a masthead band, not a floating bar
   ====================================================================== */

.site-header {
  position: sticky;
  top: 0;
  z-index: 20;
  background: var(--cream);
  border-bottom: 3px solid var(--rule);
}

.header-inner {
  display: flex;
  align-items: stretch;
  justify-content: space-between;
  gap: 1rem;
  min-height: 3.9rem;
}

.wordmark {
  display: inline-flex;
  align-items: center;
  gap: .8rem;
  text-decoration: none;
  color: inherit;
  padding-block: .55rem;
}
.wordmark:hover { background: none; }

/* Monogram: a hard oxblood block. No rounding. */
.wordmark-mark {
  display: grid;
  place-items: center;
  width: 2.3rem; height: 2.3rem;
  flex: none;
  background: var(--oxblood);
  color: var(--cream);
  font-family: var(--display);
  font-weight: 700;
  font-size: 1.05rem;
  letter-spacing: .04em;
}
.wordmark-text { display: flex; flex-direction: column; line-height: 1.15; }
.wordmark-text strong {
  font-family: var(--display);
  font-size: 1.15rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .07em;
}
.wordmark-text small {
  font-size: .66rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: var(--ink-faint);
}

.nav-toggle {
  display: inline-grid;
  place-items: center;
  width: 3rem;
  margin-right: -.5rem;
  background: none;
  border: 0;
  border-left: 1px solid var(--rule);
  cursor: pointer;
}
.nav-toggle-bars,
.nav-toggle-bars::before,
.nav-toggle-bars::after {
  display: block;
  width: 21px; height: 3px;
  background: var(--ink);
  transition: transform .18s ease, opacity .14s ease;
}
.nav-toggle-bars { position: relative; }
.nav-toggle-bars::before,
.nav-toggle-bars::after { content: ""; position: absolute; left: 0; }
.nav-toggle-bars::before { top: -7px; }
.nav-toggle-bars::after  { top:  7px; }
.nav-toggle[aria-expanded="true"] .nav-toggle-bars { background: transparent; }
.nav-toggle[aria-expanded="true"] .nav-toggle-bars::before { transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] .nav-toggle-bars::after  { transform: translateY(-7px) rotate(-45deg); }

.nav-wrap {
  display: none;
  position: absolute;
  left: 0; right: 0; top: 100%;
  background: var(--cream);
  border-bottom: 3px solid var(--rule);
}
.nav-wrap.is-open { display: block; }

.nav { list-style: none; margin: 0; padding: 0 var(--gap) .75rem; }
.nav a {
  display: block;
  padding: .8rem 0;
  font-family: var(--display);
  font-weight: 700;
  font-size: 1.25rem;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--ink);
  text-decoration: none;
  border-bottom: 1px solid var(--rule);
}
.nav li:last-child a { border-bottom: 0; }
.nav a:hover { color: var(--oxblood); background: none; }

@media (min-width: 54rem) {
  .nav-toggle { display: none; }
  .nav-wrap {
    display: flex;          /* stretches .nav to full header height */
    position: static;
    border: 0;
    background: none;
  }
  .nav { display: flex; align-items: stretch; padding: 0; }
  .nav li { display: flex; }   /* pass full height through to the link */
  .nav a {
    display: flex;
    align-items: center;
    /* Tightened from 1.15rem / .16em: five nav items plus the wordmark were
       crowding the bar just above the 54rem breakpoint. */
    padding: 0 .9rem;
    font-family: var(--sans);
    font-size: .74rem;
    font-weight: 700;
    letter-spacing: .12em;
    white-space: nowrap;
    border-bottom: 0;
    border-left: 1px solid var(--rule);
  }
  .nav li:last-child a { border-right: 1px solid var(--rule); }
  .nav a:hover { background: var(--oxblood); color: var(--cream); }
}

/* ======================================================================
   HERO — name across the full width, horizon beneath, photo as ink block
   ====================================================================== */

.hero { padding-block: clamp(2rem, 5vw, 3.5rem) 0; }

.hero-top { margin-bottom: clamp(1.5rem, 4vw, 2.5rem); }

/* Name set as large as it will go, riding on a horizon. */
.hero-name {
  margin: 0 0 .35rem;
  /* Tighten optical gap left by the condensed face's side bearing */
  margin-left: -.03em;
}
.hero-role {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .5rem 1.25rem;
  padding-top: .85rem;
  font-family: var(--sans);
  font-size: .82rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .2em;
  color: var(--ink);
}
.hero-role .ward-tag {
  background: var(--green);
  color: var(--cream);
  padding: .25rem .6rem;
  letter-spacing: .14em;
}

.hero-body {
  display: grid;
  gap: clamp(2rem, 5vw, 3.25rem);
  padding-bottom: var(--bay);
}

.tagline {
  font-family: var(--display);
  font-weight: 700;
  font-size: var(--step-2);
  line-height: 1.1;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--green);
  max-width: 22ch;
  margin: 0 0 1.75rem;
}

.hero-actions { display: flex; flex-wrap: wrap; gap: .8rem; margin-bottom: 2.25rem; }

/* Election date: a hard-edged two-panel block, like a stamped ticket. */
.election-card {
  display: flex;
  flex-wrap: wrap;
  align-items: stretch;
  border: 3px solid var(--rule);
  background: var(--cream-deep);
  max-width: 30rem;
}
.election-card-main { flex: 1 1 13rem; padding: .9rem 1.1rem; }
.election-label {
  font-size: .68rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .2em;
  color: var(--ink-faint);
  margin: 0 0 .25rem;
}
.election-date {
  font-family: var(--display);
  font-weight: 700;
  font-size: var(--step-1);
  text-transform: uppercase;
  letter-spacing: .05em;
  line-height: 1.1;
  margin: 0;
}
.election-countdown {
  flex: none;
  display: grid;
  place-content: center;
  text-align: center;
  padding: .75rem 1.1rem;
  background: var(--oxblood);
  color: var(--cream);
  border-left: 3px solid var(--rule);
  min-width: 6.5rem;
}
.countdown-num {
  display: block;
  font-family: var(--display);
  font-weight: 700;
  font-size: 2.2rem;
  line-height: .9;
  letter-spacing: .02em;
}
.countdown-unit {
  font-size: .62rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .16em;
}

/* Photo: offset ink block behind, hard edges, slight rotation. */
.hero-photo { justify-self: center; width: 100%; max-width: 15rem; }

.photo-frame {
  position: relative;
  margin: 0;
  border: 3px solid var(--rule);
  background: var(--cream-deep);
  aspect-ratio: 5 / 6;
  overflow: hidden;
}
.photo-frame img { width: 100%; height: 100%; object-fit: cover; }

/* The offset — reads as a second ink pass slightly off register. */
.hero-photo-stack { position: relative; }
.hero-photo-stack::before {
  content: "";
  position: absolute;
  inset: 0;
  transform: translate(10px, 10px);
  background: var(--wheat);
  border: 3px solid var(--rule);
  z-index: -1;
}

.photo-placeholder {
  display: grid;
  place-items: center;
  align-content: center;
  gap: .6rem;
  color: var(--ink-faint);
  font-size: .78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .14em;
  text-align: center;
  padding: 1.5rem;
}
.photo-icon {
  width: 3rem; height: 3rem;
  fill: none; stroke: currentColor;
  stroke-width: 1.5; stroke-linecap: square;
}

@media (min-width: 56rem) {
  .hero-body { grid-template-columns: 1.35fr 1fr; align-items: start; }
  .hero-photo { justify-self: end; max-width: 21rem; }
}

/* ======================================================================
   SECTIONS
   ====================================================================== */

.section { padding-block: var(--bay); border-top: 3px solid var(--rule); }
.section-alt { background: var(--cream-deep); }

/* --- About ------------------------------------------------------------ */

.about-grid { display: grid; gap: clamp(2rem, 5vw, 3.5rem); }
.about-main { max-width: var(--measure); }
.about-main h3 { margin-top: 2.5rem; }

/* Opening greeting — his first line, set larger than body but without a
   drop cap, since it is only a sentence long. */
.about-main .greeting {
  font-family: var(--display);
  font-size: var(--step-2);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  line-height: 1.15;
  color: var(--green);
  margin-bottom: 1.6rem;
}

/* Drop cap, letterpress flavour. Only on .dropcap — a 3.6em cap floats about
   three lines deep, so it needs a paragraph with at least that many. */
.about-main .dropcap::first-letter {
  float: left;
  font-family: var(--display);
  font-weight: 700;
  font-size: 3.6em;
  line-height: .78;
  padding: .06em .12em 0 0;
  color: var(--oxblood);
}

.pullquote {
  margin: 0;
  padding: 1.35rem 1.5rem;
  background: var(--green);
  color: var(--cream);
  border: 3px solid var(--rule);
}
.pullquote blockquote { margin: 0; }
.pullquote p {
  font-family: var(--display);
  font-weight: 700;
  font-size: var(--step-1);
  text-transform: uppercase;
  letter-spacing: .04em;
  line-height: 1.2;
  margin: 0;
}
.pullquote cite {
  display: block;
  margin-top: .9rem;
  font-family: var(--sans);
  font-size: .72rem;
  font-style: normal;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .18em;
  opacity: .8;
}

.experience { list-style: none; margin: 0; padding: 0; }
.experience li {
  padding: .8rem 0;
  border-bottom: 1px solid var(--rule);
  color: var(--ink-soft);
  display: flex;
  gap: .8rem;
}
.experience li::before {
  content: "\2022";
  color: var(--oxblood);
  font-weight: 700;
  flex: none;
}
.experience li:last-child { border-bottom: 0; }

@media (min-width: 56rem) {
  .about-grid { grid-template-columns: minmax(0, 1.55fr) minmax(0, .95fr); }
  .about-side { align-self: start; position: sticky; top: 5.5rem; }
}

/* --- Platform: numbered ledger rows, not floating cards --------------- */

.ledger { border-top: 3px solid var(--rule); }

.ledger-row {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0 1.25rem;
  padding: 1.6rem 0;
  border-bottom: 1px solid var(--rule);
  transition: background-color .15s ease;
}
.ledger-row:last-child { border-bottom: 3px solid var(--rule); }
.ledger-row:hover { background: rgb(124 33 40 / .05); }

.ledger-num {
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(2rem, 6vw, 3.1rem);
  line-height: .85;
  letter-spacing: .01em;
  color: var(--oxblood);
  margin: 0;
  min-width: 1.6em;
}
.ledger-body { min-width: 0; }
.ledger-body h3 {
  font-family: var(--display);
  font-size: var(--step-2);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  line-height: 1;
  margin-bottom: .6rem;
}
.ledger-body p { color: var(--ink-soft); max-width: var(--measure); margin: 0; }

@media (max-width: 34rem) {
  .ledger-row { grid-template-columns: 1fr; gap: .5rem; }
  .ledger-num { min-width: 0; }
}

/* --- Ward ------------------------------------------------------------- */

.ward-grid { display: grid; gap: clamp(2rem, 5vw, 3rem); }
.ward-main { max-width: var(--measure); }

.school-list { list-style: none; margin: 0; padding: 0; }
.school-list li {
  display: flex;
  align-items: baseline;
  gap: .75rem;
  padding: .75rem 0;
  border-bottom: 1px solid var(--rule);
  color: var(--ink-soft);
}
.school-list li:last-child { border-bottom: 0; }
.school-list li::before {
  content: "";
  flex: none;
  width: .7rem; height: .7rem;
  background: var(--green);
}

@media (min-width: 56rem) {
  .ward-grid { grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); }
}

/* Grade range beside each school name */
.school-list .grades {
  margin-left: auto;
  padding-left: 1rem;
  font-size: .72rem;
  font-weight: 700;
  letter-spacing: .12em;
  color: var(--ink-faint);
  white-space: nowrap;
}

/* --- Endorsements ----------------------------------------------------- */

.endorse-grid {
  display: grid;
  gap: 0;
  border-top: 3px solid var(--rule);
}
.endorsement {
  margin: 0;
  padding: 1.6rem 0;
  border-bottom: 1px solid var(--rule);
}
.endorsement:last-child { border-bottom: 3px solid var(--rule); }
.endorsement blockquote { margin: 0 0 .9rem; }
.endorsement blockquote p {
  font-family: var(--display);
  font-weight: 700;
  font-size: var(--step-1);
  text-transform: uppercase;
  letter-spacing: .04em;
  line-height: 1.2;
  color: var(--green);
  max-width: 44ch;
}
.endorsement figcaption {
  font-size: .74rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .16em;
}
.endorsement figcaption span {
  display: block;
  font-weight: 400;
  letter-spacing: .1em;
  color: var(--ink-faint);
  margin-top: .2rem;
}

/* --- Trustee role: a grid of plain ruled cells, no card chrome -------- */

.role-grid {
  display: grid;
  gap: 0;
  border-top: 3px solid var(--rule);
  border-left: 1px solid var(--rule);
}
.role-item {
  padding: 1.35rem 1.25rem;
  border-right: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}
.role-item h3 {
  font-family: var(--display);
  font-weight: 700;
  font-size: var(--step-1);
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--green);
  margin-bottom: .5rem;
}
.role-item p { color: var(--ink-soft); margin: 0; }
.role-note { margin-top: 1.25rem; }

@media (min-width: 40rem) {
  .role-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 64rem) {
  .role-grid { grid-template-columns: repeat(3, 1fr); }
}

/* --- Voting ----------------------------------------------------------- */

.vote-grid {
  display: grid;
  gap: clamp(1.75rem, 4vw, 2.5rem);
}
@media (min-width: 44rem) {
  .vote-grid { grid-template-columns: repeat(2, 1fr); }
}

.vote-block { min-width: 0; }
.vote-block > p { color: var(--ink-soft); }
.vote-block > p strong { color: var(--ink); }

/* The date, set large — the single most important fact on the page.
   Selector matches .vote-block > p's specificity so the oxblood wins. */
.vote-block > .vote-big {
  font-family: var(--display);
  font-weight: 700;
  font-size: var(--step-2);
  text-transform: uppercase;
  letter-spacing: .04em;
  line-height: 1.05;
  color: var(--oxblood);
  margin: 0 0 .4rem;
}

.vote-list { list-style: none; margin: 0 0 1rem; padding: 0; }
.vote-list li {
  padding: .7rem 0;
  border-bottom: 1px solid var(--rule);
  color: var(--ink-soft);
}
.vote-list li:last-child { border-bottom: 0; }
.vote-list strong { color: var(--ink); }

/* Checklist variant — a green square marker per requirement. */
.vote-check li {
  position: relative;
  padding-left: 1.4rem;
}
.vote-check li::before {
  content: "";
  position: absolute;
  left: 0; top: 1.3rem;    /* aligns with the first line of text */
  width: .65rem; height: .65rem;
  background: var(--green);
}

/* Warnings voters trip over — kept visually distinct from body copy.
   Fills with the opposite paper tone to whichever section it sits in, so the
   callout reads as a separate block either way. */
.vote-callout {
  border-left: 4px solid var(--oxblood);
  background: var(--cream-deep);
  padding: .8rem 1rem;
  margin: 0 0 1rem;
  font-size: var(--step--1);
  color: var(--ink);
}
.section-alt .vote-callout { background: var(--cream); }

/* --- Contact ---------------------------------------------------------- */

.contact-grid { display: grid; gap: clamp(2rem, 5vw, 3.5rem); }

.contact-list { list-style: none; margin: 0; padding: 0; }
.contact-list li {
  padding: 1rem 0;
  border-bottom: 1px solid var(--rule);
}
.contact-list li:first-child { border-top: 3px solid var(--rule); }
.contact-label {
  display: block;
  font-size: .68rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .2em;
  color: var(--ink-faint);
  margin-bottom: .25rem;
}
.contact-list a {
  font-family: var(--display);
  font-weight: 700;
  font-size: var(--step-1);
  text-transform: uppercase;
  letter-spacing: .05em;
  text-decoration: none;
  border-bottom: 2px solid var(--oxblood);
}

.contact-form {
  display: grid;
  gap: 1.1rem;
  padding: clamp(1.35rem, 3vw, 1.9rem);
  border: 3px solid var(--rule);
  background: var(--cream);
}
.section-alt .contact-form { background: var(--cream); }
.field { display: grid; gap: .35rem; }
label {
  font-size: .72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .16em;
}

input, textarea {
  font: inherit;
  font-size: 1rem;              /* >=16px prevents iOS zoom on focus */
  font-family: var(--sans);
  color: var(--ink);
  padding: .7rem .75rem;
  border: 2px solid var(--rule);
  border-radius: 0;
  background: var(--cream);
  width: 100%;
  -webkit-appearance: none;
  appearance: none;
}
input:focus, textarea:focus {
  outline: 3px solid var(--oxblood);
  outline-offset: -1px;
  background: #fff;
}
textarea { resize: vertical; min-height: 7rem; }

@media (min-width: 56rem) {
  .contact-grid { grid-template-columns: minmax(0, .8fr) minmax(0, 1.2fr); }
}

/* No-donations / no-signs note under the contact details */
.no-asks {
  margin-top: 2.25rem;
  padding: 1.25rem 1.35rem;
  background: var(--cream-deep);
  border-left: 4px solid var(--green);
}
.no-asks .side-title { color: var(--green); }
.no-asks p { color: var(--ink-soft); font-size: var(--step--1); line-height: 1.6; }
.contact-list a { text-transform: none; letter-spacing: .01em; overflow-wrap: anywhere; }

/* --- Buttons: hard blocks, press down on click ------------------------ */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 2.9rem;
  padding: .7rem 1.5rem;
  font-family: var(--sans);
  font-size: .78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .16em;
  border: 3px solid var(--rule);
  border-radius: 0;
  text-decoration: none;
  cursor: pointer;
  justify-self: start;
  transition: transform .1s ease, box-shadow .1s ease,
              background-color .12s ease, color .12s ease;
}
.btn-primary {
  background: var(--oxblood);
  color: var(--cream);
  box-shadow: 5px 5px 0 var(--rule);
}
.btn-primary:hover {
  background: var(--oxblood-d);
  color: var(--cream);
  transform: translate(2px, 2px);
  box-shadow: 3px 3px 0 var(--rule);
}
.btn-primary:active { transform: translate(5px, 5px); box-shadow: 0 0 0 var(--rule); }

.btn-ghost {
  background: var(--cream);
  color: var(--ink);
  box-shadow: 5px 5px 0 var(--rule);
}
.btn-ghost:hover {
  background: var(--wheat);
  color: var(--ink);
  transform: translate(2px, 2px);
  box-shadow: 3px 3px 0 var(--rule);
}
.btn-ghost:active { transform: translate(5px, 5px); box-shadow: 0 0 0 var(--rule); }

.fineprint { font-size: var(--step--1); color: var(--ink-faint); }

/* --- Footer: solid green band ---------------------------------------- */

.site-footer {
  background: var(--green);
  color: var(--cream);
  border-top: 3px solid var(--rule);
  padding-block: clamp(2.25rem, 5vw, 3.25rem);
  font-size: var(--step--1);
}
.footer-inner { display: grid; gap: 1.75rem; align-items: start; }
.footer-brand { display: flex; gap: .9rem; align-items: flex-start; }
.footer-brand .wordmark-mark {
  background: var(--cream);
  color: var(--green);
}
.footer-brand p { margin: 0; line-height: 1.55; }
.footer-brand strong {
  display: block;
  font-family: var(--display);
  font-size: 1.15rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .07em;
  margin-bottom: .2rem;
}
.site-footer p { margin: 0 0 .4rem; }
.site-footer a { color: var(--cream); }
.site-footer a:hover { background: var(--oxblood); color: var(--cream); }
.footer-meta .election-stamp {
  font-family: var(--display);
  font-weight: 700;
  font-size: 1.1rem;
  text-transform: uppercase;
  letter-spacing: .06em;
}
.authorized { opacity: .75; max-width: 34ch; }

@media (min-width: 46rem) {
  .footer-inner { grid-template-columns: 1fr auto; }
  .footer-meta { text-align: right; }
  .authorized { margin-left: auto; }
}

/* ======================================================================
   MOTION — inks land, they don't drift.
   Reveals are gated on .js so a blocked script can never hide content.
   ====================================================================== */

@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }

  /* --- Base reveal: ink settling onto paper. Short, weighted easing —
     it arrives and stops. No float, no drift, no long fades. ---------- */
  .js .reveal {
    opacity: 0;
    transform: translateY(14px);
    transition: opacity .34s cubic-bezier(.2, .7, .3, 1),
                transform .44s cubic-bezier(.2, .8, .25, 1);
  }
  .js .reveal.is-visible { opacity: 1; transform: none; }

  /* Stagger children of a ledger or list so rows land in sequence,
     like sheets stacking. Index set by JS as --i. */
  .js .reveal[style*="--i"] { transition-delay: calc(var(--i) * 70ms); }

  /* --- Horizon rules draw themselves left to right ------------------- */
  .js .horizon-draw {
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform .8s cubic-bezier(.16, .84, .2, 1);
  }
  .js .horizon-draw.is-visible { transform: scaleX(1); }

  .js .section > .wrap > .section-head .kicker::before {
    transform: scaleX(0);
    transform-origin: left center;
    transition: transform .5s cubic-bezier(.16, .84, .2, 1) .1s;
  }
  .js .section > .wrap > .section-head.is-visible .kicker::before {
    transform: scaleX(1);
  }

  /* --- Hero name: words lift into register on load ------------------- */
  .ink-word {
    display: inline-block;
    overflow: hidden;
    vertical-align: bottom;
    /* Room for the condensed face's descender-free caps */
    padding-bottom: .04em;
  }
  .ink-word > span {
    display: inline-block;
    transform: translateY(105%);
  }
  .js .ink-word > span {
    animation: ink-lift .9s cubic-bezier(.16, .84, .2, 1) forwards;
  }
  .js .ink-word:nth-child(1) > span { animation-delay: .06s; }
  .js .ink-word:nth-child(2) > span { animation-delay: .17s; }

  @keyframes ink-lift {
    from { transform: translateY(105%); }
    to   { transform: translateY(0); }
  }

  /* Kicker above the name fades up first */
  .js .kicker-lift {
    opacity: 0;
    animation: kicker-in .5s ease-out .02s forwards;
  }
  @keyframes kicker-in {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: none; }
  }

  /* --- Photo: the wheat block slides into register behind the frame --- */
  .js .hero-photo-stack::before {
    transform: translate(0, 0);
    transition: transform .85s cubic-bezier(.16, .84, .2, 1) .25s;
  }
  .js .hero-photo.is-visible .hero-photo-stack::before {
    transform: translate(10px, 10px);
  }

  /* --- Ledger numbers count up into place --------------------------- */
  .js .ledger-row .ledger-num {
    opacity: 0;
    transform: translateX(-10px);
    transition: opacity .4s ease-out .1s, transform .5s
                cubic-bezier(.16, .84, .2, 1) .1s;
  }
  .js .ledger-row.is-visible .ledger-num { opacity: 1; transform: none; }

  /* --- Drift: set by JS on scroll. Tiny amounts only — the page should
     feel like paper shifting, not a video game.

     Applied to .hero-photo (the outer wrapper), never to
     .hero-photo-stack — the stack's ::before owns a transform for the
     register-slide, and stacking two transforms on one element makes the
     offset block jump. One element, one transform responsibility. ----- */
  .js .hero-name { transform: translateY(var(--drift, 0)); }
  .js .hero-photo-drift { transform: translateY(var(--drift-photo, 0)); }
}

/* Scroll progress rule across the very top of the page. */
.scroll-rule {
  position: fixed;
  top: 0; left: 0; right: 0;
  height: 3px;
  z-index: 40;
  background: transparent;
  pointer-events: none;
}
.scroll-rule span {
  display: block;
  height: 100%;
  width: 0;
  background: var(--oxblood);
  transform-origin: left center;
}

@media (prefers-reduced-motion: reduce) {
  .reveal, .js .reveal { opacity: 1; transform: none; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    transition-duration: .01ms !important;
  }
}

/* ======================================================================
   PRINT — this design is already a print piece
   ====================================================================== */

@media print {
  .site-header, .nav-wrap, .nav-toggle, .hero-actions,
  .contact-form { display: none !important; }
  body { font-size: 10.5pt; background: #fff; }
  .section, .hero { padding-block: .9rem; }
  .hero-photo-stack::before { display: none; }
  .ledger-row, .endorsement, .role-item, .vote-block { break-inside: avoid; }
  .vote-big, .role-item h3 { color: #000; }
  .vote-callout { border-left-color: #000; background: #fff; }
  .btn { display: none; }
  .site-footer { background: #fff; color: #000; }
  .pullquote { background: #fff; color: #000; border-color: #000; }
  .pullquote p { color: #000; }
  .about-main .greeting { color: #000; }
  .ward-tag, .election-countdown { background: #fff; color: #000; }
  .reveal { opacity: 1 !important; transform: none !important; }
}
