/* =============================================================
   HEARTS OF GOLD LEGACY CANINES — design system (site.css)

   THE CHARTER (binding — every page follows this, no drift):
   · BONES = H. Light warm paper ground. Every major section opens with a
     full-bleed photo banner; the section title sits in the banner's lower
     edge over a gradient. Dense editorial content beneath. Dark ink ground
     appears ONLY in the donate band (.cta-band / .field) + footer.
   · TYPE VOICE. Fraunces (soft + optical axes) for ALL display type.
     Hero = a short distilled mission-derived headline, oversized serif, set
     half-on-photo / half-on-paper (J's overlap device — executed once,
     in the hero only). The mission statement VERBATIM gets its own serif
     section immediately below the hero (index) and the centerpiece
     treatment (mission.html). Jost for body/UI. Kaushan Script — the logo
     wordmark's face — appears NOWHERE except inside the logo images, with
     ONE sanctioned exception (Founder-approved 2026-07-29): the nav's
     "The Heartbeat" link, so the blog reads as a named sub-brand rather
     than another menu item. See `.nav-links a[href$="blog.html"]` below.
     Do not extend it further without the same approval.
   · GOLD RULE — gold does exactly three jobs:
       (1) the thread motif, (2) the Donate button,
       (3) one key-phrase underline per section.
     Nothing else is gold. Text-gold = #806010 (contrast-safe on the
     papers); bright #E0B028 only on fills/strokes >=3px or dark ground.
   · SIGNATURE — the tamed golden thread: a short hand-drawn-quality gold
     SVG stroke (not page-length, not scroll-scrubbed) that (a) draws in
     (stroke-dashoffset) as each section reveals — small varied gestures:
     an arc, a heart hint, a paw hint — and (b) forms the key-phrase
     underline. One per section, quiet, consistent.
   · MOTION — calm IntersectionObserver reveals (2.5s failsafe) + honest
     count-up stats with bracketed placeholders. NOTHING else: no
     parallax, no marquee, no sticky stacking, no polaroids, no
     magnetic buttons.
   · FINISHING LAYER: GOLDEN HOUR (binding — the approved site-wide finish):
       (1) ken-burns on EVERY photo banner's .bg — slow perpetual drift,
           8–10s, alternating direction per banner (JS adds .kb-alt to
           every other banner; pure-CSS kbA otherwise);
       (2) drifting warm sunlight gradient on EVERY dark band
           (.cta-band / .field / .site-footer) and on .banner.hero;
       (3) gold dust motes ONLY on the page-hero banner and donate bands —
           mark those hosts with class `motes` (max 7 per container,
           JS-injected .mote spans; nowhere else, ever);
       (4) warm glow-bloom on primary/ghost button hover.
     Transform/opacity only. Reduced-motion = static warm gradients,
     no ken-burns, faint still motes. No-JS = static gradients keep the
     warmth; content never depends on any of it.

   site.js depends on these class names:
     .site-nav  .site-nav.open  .site-nav.scrolled  .menu-btn
     .mobile-menu  .reveal / .reveal.in  .thread / .thread.drawn
     .count[data-target]  .banner .bg (.kb-alt)  .motes / .mote
     (all gated by <html class="js"> except the CSS-only ken-burns)
   Structural contract: .wrap .section .two .lede .lbl .btn .btn-primary
     .btn-ghost .field .cta-band .site-nav .site-footer .reveal

   ---------------------------------------------------------------
   GOOGLE FONTS <link> (paste verbatim into every page <head>, after
   charset/viewport, before site.css) — Fraunces variable (ital, optical
   size, weight, SOFT) + Jost variable.
   ---------------------------------------------------------------
   <link rel="preconnect" href="https://fonts.googleapis.com">
   <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
   <link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght,SOFT@0,9..144,300..700,50;1,9..144,300..700,50&family=Jost:wght@300..700&family=Kaushan+Script&display=swap" rel="stylesheet">

   ---------------------------------------------------------------
   CANONICAL NAV MARKUP  (paste verbatim into every page <body>)
   ---------------------------------------------------------------
   <a class="skip" href="#main">Skip to content</a>
   <nav class="site-nav"><div class="wrap nav-in">
     <a class="brand" href="index.html"><img src="assets/logo-horiz.png" alt="Hearts of Gold Legacy Canines"></a>
     <div class="nav-links">
       <a href="index.html">Home</a><a href="mission.html">Our Mission</a>
       <a href="programs.html">Programs</a><a href="get-involved.html">Get Involved</a>
       <a href="blog.html">Field Notes</a><a href="sponsors.html">Sponsors</a><a href="contact.html">Contact</a>
     </div>
     <div class="nav-cta"><a class="btn btn-primary" href="get-involved.html#give">Donate</a></div>
     <button class="menu-btn" aria-label="Menu" aria-expanded="false">☰</button>
   </div><div class="mobile-menu">
     <a href="index.html">Home</a><a href="mission.html">Our Mission</a>
     <a href="programs.html">Programs</a><a href="get-involved.html">Get Involved</a>
     <a href="blog.html">Field Notes</a><a href="sponsors.html">Sponsors</a><a href="contact.html">Contact</a>
     <a class="btn btn-primary" href="get-involved.html#give">Donate</a>
   </div></nav>

   ---------------------------------------------------------------
   CANONICAL FOOTER MARKUP  (dark ink ground; white horizontal logo)
   ---------------------------------------------------------------
   <footer class="site-footer"><div class="wrap">
     <div class="fscript"><img src="assets/logo-horiz-white.png" alt="Hearts of Gold Legacy Canines"></div>
     <p class="ftag">Raising, training &amp; placing exceptional therapy and service dogs</p>
     <p class="fmeta">Missouri, USA<br><a href="contact.html">Reach us through the contact page</a></p>
     <nav class="footer-nav">
       <a href="index.html">Home</a><a href="mission.html">Our Mission</a>
       <a href="programs.html">Programs</a><a href="get-involved.html">Get Involved</a>
       <a href="blog.html">Field Notes</a><a href="sponsors.html">Sponsors</a><a href="contact.html">Contact</a>
       <a class="book" href="get-involved.html#give">Donate</a>
     </nav>
     <p class="fine">Hearts of Gold Legacy Canines is a 501(c)(3) nonprofit organization.
       EIN pending. Donations are tax-deductible to the extent allowed by law.</p>
   </div></footer>

   The blanket "Demonstration site: figures, story, and photography are
   illustrative samples" line was REMOVED 2026-08-06: her real photography and
   her own copy landed 2026-07-29, and no invented figures remain, so the
   disclaimer had become false in the direction that matters — it understated
   the site. Two pages keep a NARROW, still-true note of their own:
   heart-of-hawkins (litter dates + available puppies are placeholders) and
   sponsors (tiers/open slots are illustrative; MAS is the real tech sponsor).
   What IS still a demo carries its own inline label at the point of use —
   the giving panel, the contact form, and the newsletter signup — never in
   the footer, so the disclaimer sits where the visitor can act on it.
   ============================================================= */

/* ================= Tokens ================= */
:root{
  --gold:#E0B028; --gold-deep:#806010; --gold-soft:#f3e3b4;
  --ink:#141210; --ink-2:#3d3831; --ink-3:#6b6357;
  --paper:#FBF8F1; --paper-2:#F5EFE2;
  --cream:#f3ead9; --cream-dim:#d9cdb5;
  --line:rgba(20,18,16,.12); --line-2:rgba(20,18,16,.06);
  --serif:"Fraunces",Georgia,serif;
  --sans:"Jost",Helvetica,Arial,sans-serif;
  --nav-h:86px; /* golden-hour finish: enlarged nav logo (was 66px) */
}

/* ================= Reset / base ================= */
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--sans);color:var(--ink);background:var(--paper);line-height:1.6;
  font-size:1.03rem;-webkit-font-smoothing:antialiased;overflow-x:hidden}
img{max-width:100%;display:block}
a{color:inherit}
/* Fraunces carries ALL display type — soft axis on, optical sizing auto. */
h1,h2,h3,h4{font-family:var(--serif);font-weight:500;letter-spacing:-.01em;line-height:1.08;
  font-optical-sizing:auto;font-variation-settings:"SOFT" 50}

/* Skip-to-content link (a11y) — hidden until keyboard-focused */
.skip{position:fixed;top:0;left:0;z-index:2000;background:var(--gold-deep);color:#fff;
  padding:.65rem 1.1rem;border-radius:0 0 8px 0;text-decoration:none;font-weight:600;
  transform:translateY(-200%);transition:transform .15s ease}
.skip:focus{transform:translateY(0);outline:3px solid var(--ink);outline-offset:2px}

/* Visually-hidden utility (labels for assistive tech) */
.vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* Visible focus ring everywhere (a11y floor beyond the skip link) */
a:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible{
  outline:3px solid var(--gold-deep);outline-offset:2px}

/* ================= Layout ================= */
.wrap{max-width:1200px;margin:0 auto;padding:0 clamp(20px,5vw,56px);position:relative;z-index:1}
/* .section is the standard vertical rhythm block on paper. */
.section{padding:clamp(48px,7vw,96px) 0;position:relative;z-index:1}
.section-tight{padding:clamp(32px,5vw,60px) 0}
/* When .wrap carries a section class, the section padding shorthand would
   zero the wrap's horizontal gutters — restore them explicitly. */
.wrap.section,.wrap.section-tight{
  padding-left:clamp(20px,5vw,56px);padding-right:clamp(20px,5vw,56px)}
/* .band — a quieter strip on the deeper paper (fact strips, cost band). */
.band{background:var(--paper-2);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}

/* Section label — small uppercase letterspaced, ink (gold is spoken for). */
.lbl{font-weight:600;font-size:.78rem;letter-spacing:.24em;text-transform:uppercase;
  color:var(--ink-3);display:block;margin-bottom:1.2em}

/* Editorial two-column: heading left, prose right. */
.two{display:grid;grid-template-columns:1fr 1fr;gap:clamp(30px,6vw,80px);align-items:start}
@media(max-width:820px){.two{grid-template-columns:1fr;gap:26px}}
h2{font-size:clamp(1.9rem,4.4vw,3.2rem)}
h3{font-size:clamp(1.35rem,2.6vw,1.9rem)}
.lede{font-family:var(--serif);font-size:clamp(1.12rem,2vw,1.4rem);font-weight:400;
  color:var(--ink-2);max-width:46ch;line-height:1.5;font-variation-settings:"SOFT" 50}
.lede p+p{margin-top:1em}
.prose{color:var(--ink-2);max-width:62ch}
.prose p+p{margin-top:1em}

/* ================= Banner — the section opener (bones = H) =================
   Full-bleed photo, title set into the lower edge over a gradient.
   Every major paper section opens with one; the hero is taller and uses
   the overlap device instead of an in-banner title. */
.banner{position:relative;height:56vh;min-height:22rem;overflow:hidden;display:flex;align-items:flex-end}
/* TWO PHOTO VARIANTS PER BANNER — the convention every page follows.
   One file cannot serve this band. It is viewport-proportional, so it is
   ~2.86:1 on a 1440x900 laptop (74vh hero: ~2.16:1) but flips to NEAR-PORTRAIT
   on a phone (~1.05:1; hero ~0.75:1). So each page declares its banner photo
   TWICE, in its own <style>:
     default            assets/photos/banner/<name>.jpg — the 2.6:1 variant, cut
                        per-photo by tools/hog-photos.mjs. Needs no
                        background-position: it is already framed on purpose.
     @media <=820px     assets/photos/<name>.jpg — the 3:2 master, our tallest
                        asset, WITH its per-photo `center NN%` tuning. A wide
                        crop here would show a ~29%-wide slice of itself.
   Deliberately NOT done with a custom property: a relative url() inside one is
   resolved against the stylesheet where the var is SUBSTITUTED (this file, in
   assets/), not where it was declared, so `assets/photos/x.jpg` became
   `assets/assets/photos/x.jpg` and 404'd on every banner. Keeping the url() in
   the page that owns the path is what makes it resolve.
   mas-cms overrides land as an inline style.backgroundImage (site-hydrator.js)
   and outrank both — an admin-replaced photo serves as-is at every width. */
.banner .bg{position:absolute;inset:0;background-size:cover;background-position:center;
  filter:brightness(.74) saturate(1.05) sepia(.08)}
.banner .grad{position:absolute;inset:0;
  background:linear-gradient(to top,rgba(20,18,16,.82) 0%,rgba(20,18,16,.22) 45%,rgba(20,18,16,.04) 100%)}
.banner .title{position:relative;z-index:2;width:100%;padding-bottom:clamp(1.6rem,4vh,2.8rem);color:var(--cream)}
.banner .eyebrow{font-family:var(--sans);font-size:.78rem;font-weight:600;letter-spacing:.28em;
  text-transform:uppercase;color:var(--cream-dim);margin-bottom:.6rem}
.banner h2{color:var(--cream);font-size:clamp(1.9rem,4.4vw,3.4rem);
  text-shadow:0 2px 24px rgba(20,18,16,.8)}
.banner.hero{height:74vh;min-height:26rem}
.banner-deep .grad{background:linear-gradient(to top,rgba(20,18,16,.9) 0%,rgba(20,18,16,.5) 30%,rgba(20,18,16,.28) 58%,rgba(20,18,16,.04) 100%)}
@media(max-width:820px){.banner{height:44vh}.banner.hero{height:62vh}}

/* Hero overlap — J's half-on-photo device, executed ONCE, hero only.
   The h1 is pulled up over the banner by exactly 2.2em (two lines at
   line-height 1.06); a hard gradient clipped to the text turns the
   on-photo lines cream and the on-paper lines ink, with the color
   switch landing in the gap between lines 2 and 3 at every width. */
.overlap{position:relative;z-index:5}
.overlap h1{font-weight:500;line-height:1.06;letter-spacing:-.015em;
  font-size:clamp(1.9rem,4.6vw,3.9rem);margin-top:-2.2em;max-width:26ch;
  color:var(--ink)}
@supports(-webkit-background-clip:text) or (background-clip:text){
  .overlap h1{
    background:linear-gradient(180deg,var(--cream) 0 2.18em,var(--ink) 2.18em);
    -webkit-background-clip:text;background-clip:text;color:transparent}
}
/* Hero eyebrow lives in the banner, above the pulled-up headline. */
.banner.hero .title{padding-bottom:calc(2.2 * clamp(1.9rem,4.6vw,3.9rem) + 2.2rem)}

/* ================= The tamed golden thread =================
   Short hand-drawn gold strokes: an arc, a heart hint, a paw hint.
   One per section. JS sets dasharray/offset and adds .drawn on reveal;
   reduced-motion / no-JS render them fully drawn. */
.thread{display:block;overflow:visible;color:var(--gold)}
.thread path{fill:none;stroke:currentColor;stroke-width:3.5;
  stroke-linecap:round;stroke-linejoin:round;
  transition:stroke-dashoffset 1.15s cubic-bezier(.4,0,.2,1) .15s}
/* Stacked-lockup moment — one dignified centerpiece use per page, brand asset pass. */
.mission-lockup{width:clamp(160px,20vw,220px);height:auto;margin:0 auto 1.1rem;display:block}
/* Small real-mark glyph swap — replaces generic gold heart svg at section/band tops. */
.glyph-icon{width:38px;height:auto;margin-bottom:1.1rem;display:block}
.glyph-icon.sm{width:34px}
.avatar-icon{width:28px;height:28px;border-radius:50%;vertical-align:middle;margin-right:.5em}
/* Key-phrase underline — gold job #3, one per section. */
.underline-key{position:relative;display:inline-block;white-space:nowrap;font-weight:600;color:inherit}
.underline-key .thread{position:absolute;left:-.1em;bottom:-.42em;width:calc(100% + .2em);height:.5em}
.underline-key .thread path{stroke-width:3;vector-effect:non-scaling-stroke}
/* Underline threads render fully drawn — non-scaling-stroke makes the JS
   dash draw-in measure in SVG user units while painting in screen space,
   so stretched underlines stall partway (~140px). Opt them out. */
.underline-key .thread path{stroke-dasharray:none !important;stroke-dashoffset:0 !important}
/* On dark grounds the thread stays bright gold (allowed on dark). */
.field .thread,.cta-band .thread{color:var(--gold)}

/* ================= Buttons ================= */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5em;
  font-family:var(--sans);font-weight:600;font-size:.85rem;text-transform:uppercase;letter-spacing:.08em;
  border-radius:4px;padding:12px 26px;text-decoration:none;border:1.5px solid transparent;cursor:pointer;
  transition:transform .22s ease,background .22s ease,color .22s ease,border-color .22s ease,box-shadow .22s ease}
/* Donate = gold job #2. Solid gold fill, ink text — the only gold button. */
.btn-primary{background:var(--gold);color:var(--ink)}
.btn-primary:hover{transform:translateY(-2px);background:var(--gold-deep);color:#fff}

/* A button-shaped element that is deliberately NOT actionable yet (the giving
   panel while online giving is being set up). It keeps the panel's visual
   rhythm but must not offer an affordance it cannot honour: no hover lift, no
   glow, no pointer cursor. Rendered as a <span role="note">, so there is
   nothing to click and nothing for a keyboard or screen reader to focus. */
.btn.is-soon{background:transparent;color:var(--ink-3);
  border:1px dashed rgba(128,96,16,.42);cursor:default;box-shadow:none}
.btn.is-soon:hover{transform:none;background:transparent;color:var(--ink-3);box-shadow:none}
.cta-band .btn-primary,.field .btn-primary{
  box-shadow:0 0 34px rgba(224,176,40,.4),0 0 80px rgba(224,176,40,.18)}
.cta-band .btn-primary:hover,.field .btn-primary:hover{background:var(--cream);color:var(--ink);
  box-shadow:0 0 46px rgba(224,176,40,.55),0 0 110px rgba(224,176,40,.25)}
.btn-ghost{background:transparent;color:var(--ink);border-color:var(--ink)}
.btn-ghost:hover{transform:translateY(-2px);background:var(--ink);color:var(--paper)}
.field .btn-ghost,.cta-band .btn-ghost{color:#fff;border-color:rgba(255,255,255,.6)}
.field .btn-ghost:hover,.cta-band .btn-ghost:hover{background:#fff;color:var(--ink);border-color:#fff}

/* ================= Site nav ================= */
.site-nav{position:sticky;top:0;z-index:60;
  background:rgba(251,248,241,.86);backdrop-filter:saturate(150%) blur(12px);
  -webkit-backdrop-filter:saturate(150%) blur(12px);
  border-bottom:1px solid transparent;transition:border-color .3s ease,background .3s ease,box-shadow .3s ease}
.site-nav.scrolled{border-bottom-color:var(--line);background:rgba(251,248,241,.95);
  box-shadow:0 8px 24px -20px rgba(20,18,16,.6)}
.nav-in{display:flex;align-items:center;justify-content:space-between;gap:18px;height:var(--nav-h)}
.brand{text-decoration:none;line-height:1;flex-shrink:0;display:inline-flex;align-items:center}
.brand img{height:62px;width:auto;display:block}
@media(max-width:860px){:root{--nav-h:72px}.brand img{height:50px}}
.nav-links{display:flex;gap:22px;font-weight:500;font-size:.9rem}
.nav-links a{color:var(--ink-2);text-decoration:none;position:relative;padding:4px 0;transition:color .2s ease}
.nav-links a:hover{color:var(--ink)}
.nav-links a[aria-current="page"]{color:var(--ink);font-weight:600}
.nav-links a[aria-current="page"]::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:2px;
  background:var(--ink);border-radius:2px}
/* "The Heartbeat" set in the logo's own face — the charter's one sanctioned
   Kaushan Script exception (see the header). Matched by href suffix so the one
   rule covers the top nav AND the mobile menu on all 11 pages, and the blog
   sub-pages' `../blog.html` too. Kaushan ships in a single weight (400) and
   runs optically small, so it needs the size bump and a nudge of letter-spacing
   to sit level with its .9rem Jost neighbours; line-height is pinned so the
   taller ascenders cannot grow --nav-h. */
.nav-links a[href$="blog.html"],
.mobile-menu a[href$="blog.html"]{font-family:"Kaushan Script",cursive;font-weight:400;
  font-size:1.05rem;letter-spacing:.01em;line-height:.9}
.nav-cta{display:flex;align-items:center;gap:18px;flex-shrink:0}
.nav-cta .btn{padding:9px 20px}
.menu-btn{display:none;background:none;border:none;font-size:1.5rem;line-height:1;color:var(--ink);cursor:pointer;padding:4px 6px}

/* Mobile menu (toggled by site.js adding .open to .site-nav) */
.mobile-menu{display:none;flex-direction:column;gap:2px;padding:10px clamp(20px,5vw,56px) 22px;
  background:rgba(251,248,241,.98);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}
.mobile-menu a{text-decoration:none;color:var(--ink);font-weight:500;padding:12px 4px;border-bottom:1px solid var(--line-2)}
.mobile-menu a:last-child{border-bottom:none}
.mobile-menu .btn{margin-top:14px;align-self:flex-start;border-bottom:none}
.site-nav.open .mobile-menu{display:flex}
@media(max-width:860px){
  .nav-links{display:none}
  .nav-cta{display:none}
  .menu-btn{display:block;min-width:44px;min-height:44px;padding:8px 10px}
  /* Mobile tap-target + iOS-zoom floor (44px targets; inputs never <16px) */
  .footer-nav{gap:4px 14px}
  .footer-nav a{display:inline-block;padding:10px 6px}
  .prog-row .more{padding:10px 0;margin-top:.4rem}
}

/* ================= Editorial columns ================= */
.cols{columns:2;column-gap:clamp(2.5rem,4vw,4rem);color:var(--ink-2)}
.cols p{margin-bottom:1.1em;break-inside:avoid}
.cols .drop::first-letter{font-family:var(--serif);font-weight:600;color:var(--ink);
  float:left;font-size:3.3rem;line-height:.85;padding:.22rem .5rem 0 0}
@media(max-width:820px){.cols{columns:1}}

/* ================= Program rows (editorial split, bones = H) ================= */
.prog-row{display:grid;grid-template-columns:.9fr 1.1fr;gap:clamp(1.8rem,4vw,3.5rem);align-items:center;
  padding:clamp(1.8rem,3vw,2.6rem) 0;border-top:1px solid var(--line)}
.prog-row:first-of-type{border-top:none;padding-top:0}
.prog-row img{width:100%;aspect-ratio:3/2;object-fit:cover;border-radius:4px}
.prog-row.flip img{order:2}
.prog-row p{color:var(--ink-2);margin-top:.7rem;max-width:52ch}
.prog-row .more{font-weight:600;font-size:.92rem;color:var(--ink);display:inline-block;margin-top:.9rem;
  text-decoration-thickness:2px;text-underline-offset:3px}
.prog-row .more:hover{color:var(--gold-deep)}
@media(max-width:820px){.prog-row{grid-template-columns:1fr}.prog-row.flip img{order:0}}

/* ================= Stats — honest count-ups =================
   Bracketed placeholders stay bracketed; JS animates the inner .count
   span, reduced-motion renders the final number immediately. */
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;text-align:center}
@media(max-width:820px){.stat-grid{grid-template-columns:1fr 1fr;gap:1.6rem}}
.stat-num{font-family:var(--serif);font-weight:500;font-size:clamp(2rem,3.6vw,3rem);
  color:var(--ink);line-height:1.1;font-variant-numeric:tabular-nums;font-variation-settings:"SOFT" 50}
.stat-lbl{font-size:.9rem;color:var(--ink-2);margin-top:.4rem}
.stat-ask{display:block;font-size:.76rem;color:var(--ink-3);margin-top:.15rem}
.nl-msg{font-size:.85rem}
.nl-msg.error{color:#8a2f2b}

/* ================= Story band ================= */
.story-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(2rem,4.5vw,4rem);align-items:start}
.photo-pair{position:relative;padding-bottom:3.2rem}
.photo-pair img:first-child{width:82%;aspect-ratio:4/3;object-fit:cover;border-radius:4px}
.photo-pair img:last-child{position:absolute;right:0;bottom:0;width:52%;aspect-ratio:1/1;object-fit:cover;
  border-radius:4px;border:6px solid var(--paper);box-shadow:0 18px 44px rgba(20,18,16,.26)}
.sample-note{display:inline-block;font-size:.78rem;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ink-3);border:1px solid var(--line);border-radius:3px;
  padding:.3em .8em;margin-bottom:1rem}
@media(max-width:820px){.story-grid{grid-template-columns:1fr}}

/* ================= Newsletter mock ================= */
.newsletter{display:flex;gap:12px;flex-wrap:wrap;margin-top:1.4rem;max-width:34rem}
.newsletter input{flex:1 1 220px;font-family:var(--sans);font-size:.95rem;color:var(--ink);
  background:#fff;border:1.5px solid var(--line);border-radius:4px;padding:12px 14px}
.newsletter input::placeholder{color:var(--ink-3)}
@media(max-width:860px){.newsletter input{font-size:16px}} /* iOS zoom floor */
.newsletter .btn-ghost{flex:0 0 auto}

/* ================= Dark grounds — donate band =================
   .field is the generic dark-ink block; .cta-band the donate close. */
.field{background:var(--ink);color:var(--cream);padding:clamp(52px,8vw,100px) 0;position:relative;overflow:hidden}
.field h2,.field h3{color:var(--cream)}
.field .lbl{color:var(--cream-dim)}
.cta-band{background:radial-gradient(ellipse at 50% 28%,rgba(224,176,40,.15),transparent 62%),var(--ink);
  color:var(--cream);text-align:center;padding:clamp(64px,10vh,120px) 0}
.cta-band h2{color:var(--cream);font-size:clamp(1.9rem,4.4vw,3.2rem);max-width:26ch;margin:0 auto}
.cta-band p{color:var(--cream-dim);max-width:46ch;margin:1.4em auto 0}
.cta-band .btn{margin-top:2.2em;font-size:1rem;padding:16px 44px}

/* ================= Reveal (scroll-in) =================
   Gated by html.js so no-JS visitors always see content immediately. */
.reveal{opacity:1;transform:none}
.js .reveal{opacity:0;transform:translateY(24px);
  transition:opacity .7s ease,transform .7s ease}
.js .reveal.in{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){
  .js .reveal{opacity:1;transform:none;transition:none}
  .thread path{transition:none}
}

/* ================= Footer ================= */
.site-footer{background:var(--ink);color:#fff;padding:56px 0 34px;position:relative;overflow:hidden;z-index:1}
.site-footer::before{content:"";position:absolute;left:0;right:0;top:0;height:1px;background:rgba(255,255,255,.18)}
.site-footer .wrap{text-align:center}
.site-footer .fscript img{height:56px;width:auto;display:inline-block}
.site-footer .ftag{color:rgba(255,255,255,.62);font-size:.95rem;max-width:52ch;margin:10px auto 0}
.site-footer .fmeta{color:rgba(255,255,255,.5);font-size:.85rem;margin-top:12px;line-height:1.7}
.footer-nav{display:flex;flex-wrap:wrap;justify-content:center;gap:8px 22px;margin-top:22px;font-weight:500;font-size:.9rem}
.footer-nav a{color:rgba(255,255,255,.82);text-decoration:none}
.footer-nav a:hover{color:#fff}
.footer-nav a.book{color:var(--gold-soft)}
.site-footer .fine{margin-top:20px;font-size:.74rem;color:rgba(255,255,255,.42);max-width:60ch;margin-left:auto;margin-right:auto}

/* ================= Finishing layer — "Golden hour" =================
   Cinematic ambient light (Founder-approved study 3): a slow perpetual
   ken-burns on every photo banner, drifting late-afternoon sunlight on
   the hero and every dark band, a handful of barely-there gold dust
   motes (page-hero + donate bands ONLY, via .motes hosts), and a warm
   glow-bloom on button hover. Transform/opacity only. */

/* Ken-burns — every .banner .bg drifts; site.js adds .kb-alt to every
   other banner on the page so directions alternate down the page.
   Pure CSS, so no-JS visitors still get the (single-direction) drift;
   reduced-motion turns it off entirely below. */
.banner .bg{will-change:transform;animation:kbA 9s ease-in-out infinite alternate}
.banner .bg.kb-alt{animation:kbB 10s ease-in-out infinite alternate}
.banner.hero .bg{animation-duration:8.5s}
@keyframes kbA{from{transform:scale(1.03) translate3d(0,0,0)}
  to{transform:scale(1.1) translate3d(-1.1%,-.7%,0)}}
@keyframes kbB{from{transform:scale(1.1) translate3d(1%,.6%,0)}
  to{transform:scale(1.03) translate3d(0,0,0)}}

/* Late-afternoon light drifting across the hero banner… */
.banner.hero::after{content:"";position:absolute;inset:-45%;z-index:1;pointer-events:none;
  background:radial-gradient(closest-side at 32% 38%,rgba(255,198,84,.30),transparent 68%);
  mix-blend-mode:screen;will-change:transform;
  animation:sunDrift 26s ease-in-out infinite alternate}
/* …and across every dark ground (donate bands, .field blocks, footer).
   Without JS or with reduced motion these render as a static warm glow. */
.cta-band{position:relative;overflow:hidden}
.cta-band::before,.field::before,.site-footer::after{content:"";position:absolute;inset:-45%;
  z-index:0;pointer-events:none;will-change:transform;
  background:radial-gradient(closest-side at 60% 45%,rgba(224,176,40,.16),transparent 70%);
  animation:sunDrift 32s ease-in-out infinite alternate-reverse}
@keyframes sunDrift{from{transform:translate3d(-5%,-3%,0) rotate(0deg)}
  to{transform:translate3d(7%,5%,0) rotate(5deg)}}

/* Gold dust motes — injected by site.js into .motes hosts ONLY
   (the page-hero banner + donate bands; max 7 per container). */
.mote{position:absolute;width:5px;height:5px;border-radius:50%;z-index:2;pointer-events:none;
  background:radial-gradient(circle,rgba(255,224,130,.95),rgba(224,176,40,0) 72%);
  filter:blur(.4px);opacity:0;will-change:transform,opacity;
  animation:moteFloat var(--dur,16s) ease-in-out var(--delay,0s) infinite alternate}
@keyframes moteFloat{
  0%{transform:translate3d(0,0,0);opacity:0}
  18%{opacity:var(--peak,.55)}
  82%{opacity:calc(var(--peak,.55)*.6)}
  100%{transform:translate3d(var(--dx,20px),var(--dy,-90px),0);opacity:0}}

/* Warm glow-bloom on button hover. */
.btn-primary:hover{box-shadow:0 0 22px rgba(224,176,40,.55),0 0 60px rgba(224,176,40,.28)}
.cta-band .btn-primary:hover,.field .btn-primary:hover{
  box-shadow:0 0 52px rgba(224,176,40,.6),0 0 130px rgba(224,176,40,.3)}
.btn-ghost:hover{box-shadow:0 0 18px rgba(224,176,40,.28)}

/* Reduced motion: static warm gradients, no ken-burns, faint still motes. */
@media(prefers-reduced-motion:reduce){
  .banner .bg,.banner .bg.kb-alt,
  .banner.hero::after,.cta-band::before,.field::before,.site-footer::after{animation:none}
  .mote{animation:none;opacity:.3}
}
