/* ===========================================================================
   Take Stock in Children of Broward. Shared design system.
   Built 2026-07-27 by Iris. Motion system adapted from themisfoundry.com:
   IntersectionObserver reveals, subtle 6px lift, expo-out easing, SVG draw,
   breathe pulse, hairline borders, mono captions. Mood: daylight, not iron.
   =========================================================================== */

/* PALETTE BREAK, 2026-08-07 (Kyle round 5: "still stuck in this green and cream").
   Her logo mark carries orange #f06000, green #a0d050, teal #0090a0 and NO cream, NO
   dark green. So the triad is now STRUCTURAL: teal owns the dark surfaces, orange is
   the action colour everywhere, marigold and green support. The paper/ruled-line/
   notepad world is kept intact -- this is a re-colour, not a re-skin. */
:root{
  --paper:      #fffdfa;   /* was cream #fdfcf7 */
  --paper-2:    #ffffff;
  --paper-sunk: #eaf4f4;   /* was beige #f4f2e9 -> pale teal wash */
  --board:      #073c44;   /* was deep GREEN #0f312c -> deep teal, her #0090a0 darkened */
  --board-2:    #0a5460;
  --clay:       #a63c0a;   /* NEW: burnt-orange dark panel so the dark never repeats */
  --clay-2:     #c04a0d;
  --ink:        #14201f;
  --ink-dim:    #35494c;
  --ink-mute:   #4c5f61;
  --pen-red:    #d9482b;
  --chalk:      #eaf6f6;
  --chalk-dim:  rgba(234,246,246,.76);
  --chalk-mute: rgba(234,246,246,.62);
  --act:       #f26f1d;    /* THE action colour = her logo orange (was olive #9db811) */
  --act-deep:  #a8420a;    /* dark enough for small text on paper (6.1:1 on white) */
  --act-soft:  #fdeadd;
  --act-ink:   #2a1405;    /* text that sits ON orange */
  --sun:        #f2b03c;
  --sun-soft:   #fdf0d6;
  --sun-deep:   #8f5208;   /* darkened 08-07: 4.34 on the yellow sticky was under the 4.5 floor */
  --line:       #e7e3dc;
  --line-2:     #d6d1c7;
  /* her logo's own triad, sampled from the real mark */
  --t-orange:      #f26f1d;
  --t-teal:        #0a99a3;
  --t-green:       #a4cf45;
  --t-teal-deep:   #077a83;  /* filled buttons that carry WHITE text (5.1:1) */
  --t-teal-ink:    #065f68;  /* teal as SMALL text on light (6.3-7.4:1) */
  --t-orange-ink:  #c24f0c;  /* orange as LARGE display numbers on light (4.75:1) */
  --t-orange-soft: #feeadb;
  --t-teal-soft:   #def1f2;
  --t-green-soft:  #eef6d9;
  --radius:     7px;
  --max:        1120px;
  --ease:       cubic-bezier(.22,1,.36,1);
  --spring:     cubic-bezier(.34,1.4,.44,1);
}

*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
  font-size:17px;line-height:1.6;overflow-x:hidden;
}
/* TYPE WEIGHT, 2026-08-10 (Kyle: "the text is very thin and hard to read").
   `-webkit-font-smoothing:antialiased` was set on <body>, so it thinned EVERY glyph on the
   site on macOS -- dark-on-light copy is where that reads as weak. It belongs only where
   light text sits on a dark ground, which is the case it was invented for. */
.sec-dark,.sec-teal,.sec-clay,.phead,.matchband,header.hero-bleed{
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4{margin:0;text-wrap:balance}
p{margin:0}
a{color:inherit}
.wrap{max-width:var(--max);margin:0 auto;padding:0 28px}
.mono{
  font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
  font-size:12px;letter-spacing:.15em;text-transform:uppercase;font-weight:640;
  font-variant-numeric:tabular-nums;
}
:focus-visible{outline:2.5px solid var(--act-deep);outline-offset:3px;border-radius:2px}

/* ---------- reveal system ---------- */
.reveal{opacity:0;transform:translateY(6px);transition:opacity .62s var(--ease),transform .62s var(--ease)}
.reveal.in{opacity:1;transform:none}
.reveal[data-d="1"]{transition-delay:.07s}
.reveal[data-d="2"]{transition-delay:.14s}
.reveal[data-d="3"]{transition-delay:.21s}
.reveal[data-d="4"]{transition-delay:.28s}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .reveal{opacity:1;transform:none;transition:none}
  .mark-path{stroke-dashoffset:0 !important;animation:none !important}
  .pulse{animation:none !important}
}

/* ---------- build note (delete before launch) ---------- */
.buildnote{background:#241f10;color:#f6e6b8;padding:9px 0;font-size:12px}
.buildnote .wrap{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.buildnote b{color:var(--sun)}
.buildnote .ph{color:var(--sun)}
.ph{color:var(--sun-deep);font-size:13px;vertical-align:super;font-weight:800}

/* ---------- nav ---------- */
nav{
  position:sticky;top:0;z-index:50;background:rgba(255,253,250,.88);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  border-bottom:1px solid var(--line);
}
/* THE TOP STRIP (2026-08-09, Kyle picked "two-tier civic" from four shot variants):
   a slim contact bar above the nav, the shape schools and established nonprofits
   use. The nav below it stays sticky; the strip scrolls away. */
.topstrip{background:var(--board);color:var(--chalk);
  font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
  font-size:12px;letter-spacing:.08em;padding:8px clamp(20px,3.4vw,48px);
  display:flex;gap:14px 30px;justify-content:flex-end;flex-wrap:wrap}
.topstrip a{color:inherit;text-decoration:none}
.topstrip a:hover{color:var(--sun)}
/* Phones (2026-09-24): one line, phone and email only. The three items used to wrap into two
   or three centred rows and spend 45px before the header began; the town is in every footer. */
@media(max-width:640px){
  .topstrip{justify-content:space-between;flex-wrap:nowrap;font-size:11px;letter-spacing:.04em;
    gap:12px;padding:8px 16px}
  .topstrip a{white-space:nowrap}
  .topstrip span{display:none}
}
@media(max-width:400px){.topstrip{letter-spacing:.02em;font-size:10.5px}}
@media print{.topstrip{display:none !important}}

/* Full-bleed bar (2026-08-09, Kyle: "squished to the center ... the logo is not all
   the way on the left, and the donate is also awkwardly in the middle"). The 1120px
   wrap made the whole bar float mid-screen on wide monitors. The nav now owns the
   full width: logo hard left, links beside the Donate button hard right, everything
   a size up and genuinely bold. */
nav .wrap{max-width:none;display:flex;align-items:center;gap:clamp(20px,3vw,40px);
  padding:13px clamp(20px,3.4vw,48px)}
.brand{display:flex;align-items:center;gap:11px;text-decoration:none;flex:none;margin-right:auto}
.brand img{height:62px;width:auto;display:block}
@media(max-width:880px){.brand img{height:44px}}   /* 44 + 8px either side = a 60px header (2026-09-24) */
.brand .glyph{
  width:30px;height:30px;border-radius:6px;background:var(--board);flex:none;
  display:grid;place-items:center;color:var(--act);font-weight:800;font-size:15px;
}
.brand .nm{font-weight:730;font-size:16px;letter-spacing:-.015em;line-height:1.15}
.brand .nm small{display:block;font-weight:600;font-size:10px;letter-spacing:.15em;
  text-transform:uppercase;color:var(--ink-mute);font-family:ui-monospace,Menlo,monospace}
.navlinks{display:flex;gap:clamp(20px,2.4vw,36px);align-items:center}
.navlinks a{
  text-decoration:none;font-size:16.5px;font-weight:680;color:var(--ink);letter-spacing:-.01em;
  padding:6px 0;border-bottom:2.5px solid transparent;
  transition:color .2s var(--ease),border-color .2s var(--ease);
}
.navlinks a:hover{color:var(--act-deep)}
.navlinks a.active{color:var(--ink);border-bottom-color:var(--act)}
/* DROPDOWN NAV (2026-08-09, Kyle picked dropdowns for the growing sitemap).
   <details>/<summary> so keyboard and touch work with zero JS; site.js only closes
   siblings and handles outside-click/Escape. Panels are sticker-shadowed bubbles,
   same language as the cards. */
.navdrop{position:relative}
.navdrop summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:8px;
  font-size:16.5px;font-weight:680;color:var(--ink);letter-spacing:-.01em;padding:6px 0;
  border-bottom:2.5px solid transparent;
  transition:color .2s var(--ease),border-color .2s var(--ease)}
.navdrop summary::-webkit-details-marker{display:none}
.navdrop summary::after{content:"";width:8px;height:8px;flex:none;margin-top:-4px;
  border-right:2.5px solid currentColor;border-bottom:2.5px solid currentColor;
  transform:rotate(45deg);transition:transform .25s var(--ease)}
.navdrop[open] summary::after{transform:rotate(225deg);margin-top:3px}
.navdrop summary:hover{color:var(--act-deep)}
.navdrop summary.active{color:var(--ink);border-bottom-color:var(--act)}
.navdrop .drop{position:absolute;top:calc(100% + 14px);left:50%;transform:translateX(-50%);
  min-width:230px;background:var(--paper);border:2px solid var(--line-2);border-radius:16px;
  box-shadow:var(--sticker-shadow);padding:10px;display:grid;gap:2px;z-index:60}
.navlinks .drop a{display:block;padding:10px 14px;border-radius:10px;font-size:15.5px;
  font-weight:640;color:var(--ink);border-bottom:0;white-space:nowrap}
.navlinks .drop a:hover{background:var(--t-teal-soft);color:var(--t-teal-ink)}
.navlinks .drop a.here{background:var(--sun-soft);color:var(--ink)}
/* MOBILE DROPDOWNS: the 2026-08-10 overlay fix (panels anchored under their own summary so
   opening one no longer re-laid-out the header) was superseded 2026-09-24 by THE DRAWER,
   just below the .navcta rules -- on phones the links are no longer in the header at all. */
.navcta{
  text-decoration:none;background:var(--act);color:var(--act-ink);font-weight:760;font-size:16px;
  padding:13px 26px;border-radius:var(--pill);flex:none;
  transition:transform .28s var(--spring),background .2s var(--ease);
}
.navcta:hover{background:var(--act-deep);color:#fff;transform:translateY(-1px)}
.navcta[aria-current="page"]{background:var(--board);color:var(--chalk)}
.navcta[aria-current="page"]:hover{background:var(--board-2);color:#fff}
/* ---------- THE DRAWER (2026-09-24) ----------
   Below 880px the four dropdowns and two links wrapped into two or three rows under the
   logo, so the sticky header ran 130-175px tall on a phone -- a quarter of the screen, on
   every page, before any content -- and an open dropdown then laid its panel over the row
   beneath it. Now the header is one 60px row (logo, Donate, Menu) and the links live in a
   full-screen sheet behind the Menu button: the four groups become accordion rows, every
   tap target is at least 44px tall, and the sheet ends with the three ways in -- students,
   mentors, donors, Amanda's order (2026-09-09) -- and the phone and email. The <details>
   markup is unchanged; site.js owns open/close, focus and the scroll lock. Above 880px the
   button and the two drawer-only blocks do not render. */
.menubtn,.menu-doors,.menu-contact{display:none}
html.menu-open,html.menu-open body{overflow:hidden}
@media(max-width:880px){
  nav .wrap{flex-wrap:nowrap;gap:10px;padding:8px 16px}
  .navcta{padding:10px 15px;font-size:14.5px}
  .menubtn{display:inline-flex;align-items:center;gap:9px;min-height:44px;min-width:44px;
    padding:0 13px 0 11px;border:1.5px solid var(--line-2);border-radius:var(--pill);
    background:transparent;color:var(--ink);font:inherit;font-size:14px;font-weight:720;
    letter-spacing:-.01em;line-height:1;cursor:pointer;flex:none}
  .menubtn-bars{display:grid;gap:4px;width:18px}
  .menubtn-bars i{display:block;height:2.5px;background:currentColor;border-radius:2px;
    transition:transform .25s var(--ease),opacity .2s var(--ease)}
  nav.is-open .menubtn-bars i:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
  nav.is-open .menubtn-bars i:nth-child(2){opacity:0}
  nav.is-open .menubtn-bars i:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}
  /* closed: the links are not in the layout at all */
  .navlinks{display:none}
  /* open: the nav becomes a full-screen sheet; the header row stays put and the list scrolls */
  nav.is-open{position:fixed;top:0;left:0;right:0;bottom:0;z-index:90;background:var(--paper);
    backdrop-filter:none;-webkit-backdrop-filter:none;border-bottom:0}
  nav.is-open .wrap{display:grid;grid-template-columns:minmax(0,1fr) auto auto;
    grid-template-rows:auto minmax(0,1fr);align-items:center;column-gap:10px;height:100%;
    padding:8px 16px 0}
  nav.is-open .brand{grid-row:1;grid-column:1;margin-right:0}
  nav.is-open .navcta{grid-row:1;grid-column:2}
  nav.is-open .menubtn{grid-row:1;grid-column:3}
  nav.is-open .navlinks{display:flex;flex-direction:column;align-items:stretch;gap:0;
    grid-row:2;grid-column:1 / -1;align-self:stretch;min-height:0;overflow-y:auto;
    overscroll-behavior:contain;-webkit-overflow-scrolling:touch;
    margin:8px -16px 0;padding:6px 16px 40px;border-top:1px solid var(--line)}
  /* one row per item, 52px tall, a hairline between rows */
  .navlinks > a,.navdrop summary{display:flex;align-items:center;justify-content:space-between;
    gap:12px;min-height:52px;padding:12px 4px;font-size:17px;font-weight:700;white-space:normal;
    border-bottom:1px solid var(--line)}
  .navlinks > a.active,.navdrop summary.active{color:var(--act-deep);border-bottom-color:var(--line)}
  .navdrop{position:static}
  .navdrop summary::after{margin:-3px 4px 0 0;width:9px;height:9px}
  .navdrop[open] summary{border-bottom-color:transparent}
  .navdrop[open] summary::after{margin:4px 4px 0 0}
  .navdrop .drop{position:static;transform:none;min-width:0;background:transparent;border:0;
    border-radius:0;box-shadow:none;padding:0 0 10px 14px;display:grid;gap:0;
    border-bottom:1px solid var(--line)}
  .navlinks .drop a{display:flex;align-items:center;min-height:46px;padding:10px 10px;
    font-size:16px;font-weight:620;white-space:normal;border-radius:8px}
  .navlinks .drop a.here{background:var(--sun-soft)}
  /* the three ways in, in Amanda's order, then how to reach the office */
  .menu-doors{display:grid;gap:10px;margin-top:22px}
  .menu-doors a{display:flex;align-items:center;justify-content:space-between;gap:12px;
    min-height:54px;padding:14px 18px;border-radius:var(--radius);font-weight:720;font-size:16.5px;
    text-decoration:none;border-bottom:0}
  .menu-doors a:hover{filter:brightness(1.06)}
  .menu-doors a.md-scholar,.menu-doors a.md-scholar:hover{background:var(--sun);color:#3d2a05}
  .menu-doors a.md-mentor,.menu-doors a.md-mentor:hover{background:var(--t-teal-deep);color:#fff}
  .menu-doors a.md-give,.menu-doors a.md-give:hover{background:var(--t-orange);color:var(--act-ink)}
  .menu-contact{display:grid;gap:0;margin-top:24px;padding-top:16px;border-top:1px solid var(--line)}
  .menu-contact .mono{color:var(--ink-mute);margin-bottom:4px}
  .menu-contact a{display:flex;align-items:center;min-height:44px;padding:0;font-size:15.5px;
    font-weight:620;color:var(--ink-dim);text-decoration:none;border-bottom:0}
}

/* ---------- buttons ---------- */
.btn{
  text-decoration:none;font-weight:700;font-size:16px;padding:15px 26px;border-radius:var(--radius);
  display:inline-block;border:0;cursor:pointer;font-family:inherit;
  transition:transform .3s var(--spring),background .22s var(--ease);
}
.btn-primary{background:var(--board);color:var(--chalk)}
.btn-primary:hover{background:var(--board-2);transform:translateY(-2px)}
.btn-act{background:var(--act);color:var(--act-ink)}
.btn-act:hover{background:var(--act-deep);color:#fff;transform:translateY(-2px)}
.btn-ghost{background:transparent;color:var(--ink);border:1.5px solid var(--line-2)}
.btn-ghost:hover{border-color:var(--board);transform:translateY(-2px)}

/* ---------- page header (interior pages) ----------
   2026-08-07, Kyle round 6 "cut it, photos everywhere": the hand-drawn .phead-ill line
   art is GONE from every page. A header is now a saturated colour band (teal or clay,
   alternating down the nav) carrying a real photograph. Text sits on the SOLID panel,
   never over the photo, so contrast is measurable instead of hoped-for. */
.phead{padding:0;border-bottom:0;position:relative;overflow:hidden}
.phead-teal{background:var(--board);color:var(--chalk)}
.phead-clay{background:var(--clay);color:var(--chalk)}
.phead::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(to bottom,transparent 0 37px,rgba(255,255,255,.055) 37px 38px);
  mask-image:linear-gradient(to bottom,transparent,#000 30%,transparent);
  -webkit-mask-image:linear-gradient(to bottom,transparent,#000 30%,transparent);
}
.phead .wrap{position:relative}
.phead-grid{display:grid;grid-template-columns:1.02fr .98fr;gap:52px;align-items:center;
  padding-top:62px;padding-bottom:62px}
.phead-teal .mono{color:var(--t-green)}
.phead-clay .mono{color:var(--sun-soft)}
.phead h1{font-size:clamp(40px,7.2vw,88px);line-height:.98;letter-spacing:-.038em;
  font-weight:800;margin-top:18px;max-width:14ch;color:#fff}
/* Long headlines. Added 2026-08-28 when the news posts got their REAL headlines back —
   hers are press-release headlines ("...Celebrates Graduation of 31 Scholars with Nearly
   Half a Million Dollars in Scholarships", 123 characters). The hero type above is built
   for four-word statements at up to 88px in a 14ch column, which turned that headline
   into an 854px wall of text. Her words are not the problem and are not shortened; the
   type scale is. Additive class — nothing else on the site is affected. */
.phead h1.longhead{font-size:clamp(27px,3.4vw,44px);line-height:1.1;letter-spacing:-.022em;
  max-width:26ch}
.phead .lede{margin-top:22px;max-width:52ch;font-size:19.5px;color:rgba(255,255,255,.92);line-height:1.62}
.phead-photo{border-radius:14px;overflow:hidden;aspect-ratio:4/3;
  box-shadow:0 30px 60px -26px rgba(0,0,0,.55);border:1px solid rgba(255,255,255,.18)}
.phead-photo img{width:100%;height:100%;object-fit:cover;display:block}
@media(max-width:940px){
  .phead-grid{grid-template-columns:1fr;gap:30px;padding-top:40px;padding-bottom:46px}
  .phead-photo{aspect-ratio:16/9}
}

/* ---------- generic section ---------- */
section{scroll-margin-top:78px}
.sec{padding:88px 0}
.sec-tight{padding:66px 0}
/* VERTICAL RHYTHM, 2026-08-10 (Kyle: "section sizing/formatting... cramped in places").
   Measured before touching it: section padding rendered IDENTICALLY at 1280px and 390px --
   there was no responsive rhythm at all. index.html ran 11,756px on a phone with roughly
   1,700px of that being section padding alone. */
@media(max-width:720px){
  /* 2026-09-24: once the cards and headings tightened for phones, 58px read as dead space.
     40px keeps the rhythm without a screen of air between sections. */
  .sec{padding:48px 0}      /* 40 read as cramped on Kyle's phone the same day; 48 with fewer blocks */
  .sec-tight{padding:36px 0}
}
.sec-head{max-width:60ch}
.sec-head .mono{color:var(--ink-mute)}
.sec-head h2{font-size:clamp(28px,4.1vw,43px);line-height:1.08;letter-spacing:-.03em;
  font-weight:790;margin-top:15px}
.sec-head p{margin-top:19px;font-size:18.5px;color:var(--ink-dim);max-width:56ch}
.sec-dark{background:var(--board);color:var(--chalk)}
.sec-dark .sec-head .mono{color:var(--t-green)}
.sec-dark .sec-head h2{color:#fff}
.sec-dark .sec-head p{color:var(--chalk-dim)}
/* the second dark: burnt orange, so a page never shows the same dark panel twice */
.sec-clay{background:var(--clay);color:var(--chalk)}
.sec-clay .sec-head .mono{color:var(--sun-soft)}
.sec-clay .sec-head h2{color:#fff}
.sec-clay .sec-head p{color:rgba(255,255,255,.9)}
.sec-clay .tick{background:var(--sun)}
.sec-clay .btn-act{background:#fff;color:var(--clay)}
.sec-clay .btn-act:hover{background:var(--sun);color:var(--act-ink)}
.sec-sunk{background:var(--paper-sunk)}
/* a full-saturation teal band: colour as structure, not as an accent */
.sec-teal{background:var(--t-teal-deep);color:#fff}
.sec-teal .sec-head .mono{color:#fff6d9}
.sec-teal .sec-head h2{color:#fff}
.sec-teal .sec-head p{color:rgba(255,255,255,.86)}

/* ---------- prose ---------- */
.prose{max-width:64ch;margin-top:34px}
.prose p{font-size:17.5px;color:var(--ink-dim);line-height:1.72}
.prose p + p{margin-top:18px}
.prose b{color:var(--ink);font-weight:660}

/* ---------- card grids ---------- */
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:48px}
.grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-top:48px}
.card{
  background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius);
  padding:30px 27px 32px;
  transition:transform .4s var(--spring),border-color .3s var(--ease),box-shadow .3s var(--ease);
}
.card:hover{transform:translateY(-4px);border-color:var(--line-2);
  box-shadow:0 10px 30px -18px rgba(15,49,44,.4)}
.card .step{font-family:ui-monospace,Menlo,monospace;font-size:12px;font-weight:700;
  letter-spacing:.1em;color:var(--act-deep)}
.card .ic{margin:20px 0 18px;width:42px;height:42px;display:grid;place-items:center;
  border-radius:9px;background:var(--act-soft)}
.card h3{font-size:21px;font-weight:740;letter-spacing:-.018em}
.card p{margin-top:11px;font-size:16.5px;color:var(--ink-dim);line-height:1.62}
.card .foot{margin-top:16px;padding-top:14px;border-top:1px solid var(--line);
  font-family:ui-monospace,Menlo,monospace;font-size:12px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--ink-dim);font-weight:640}
@media(max-width:880px){.grid-3,.grid-2{grid-template-columns:1fr}}

/* ---------- ticked list (on dark) ---------- */
.ticks{display:grid;grid-template-columns:repeat(2,1fr);gap:0;margin-top:44px;
  border:1px solid rgba(238,245,241,.16);border-radius:var(--radius);overflow:hidden}
.tick-row{padding:26px 28px;border-right:1px solid rgba(238,245,241,.14);
  border-bottom:1px solid rgba(238,245,241,.14);display:flex;gap:15px;align-items:flex-start}
.tick-row:nth-child(2n){border-right:0}
.tick-row:nth-last-child(-n+2){border-bottom:0}
.tick{flex:none;width:21px;height:21px;border-radius:5px;background:var(--act);
  display:grid;place-items:center;margin-top:2px}
.tick-row b{display:block;font-size:16.5px;font-weight:680;color:#fff}
/* ⚠ SCOPED TO THE TEXT COLUMN ON PURPOSE (fixed 2026-08-08). This was `.tick-row span`,
   which also matched `span.tick` - the icon chip - at specificity 0,1,1 and overrode its
   own `display:grid` to `block`. place-items then did nothing, the inline <svg> fell to
   the text baseline, and every checkmark sat 4.5px left of centre. Kyle spotted it by eye.
   Keep this descendant scoped to the div, or the icon breaks again silently. */
.tick-row > div span{display:block;margin-top:5px;font-size:14.5px;color:var(--chalk-mute);line-height:1.52}
.tick svg{display:block}
@media(max-width:760px){
  .ticks{grid-template-columns:1fr}
  .tick-row{border-right:0}
  .tick-row:nth-last-child(2){border-bottom:1px solid rgba(238,245,241,.14)}
}

/* ---------- stat band ---------- */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;margin-top:46px}
.stats > div{background:var(--paper-2);padding:28px 24px}
.stats .n{font-size:38px;font-weight:800;letter-spacing:-.035em;font-variant-numeric:tabular-nums;
  line-height:1;color:var(--board)}
.stats .l{margin-top:10px;font-size:15.5px;font-weight:500;color:var(--ink-dim);line-height:1.5}
@media(max-width:880px){.stats{grid-template-columns:repeat(2,1fr)}}
@media(max-width:460px){.stats{grid-template-columns:1fr}}

/* ---------- steps rail ---------- */
.rail{margin-top:46px;border-top:1px solid var(--line)}
.rail-row{display:grid;grid-template-columns:88px 1fr;gap:26px;padding:26px 0;
  border-bottom:1px solid var(--line);align-items:start}
.rail-row .k{font-family:ui-monospace,Menlo,monospace;font-size:12px;font-weight:700;
  letter-spacing:.1em;color:var(--act-deep);padding-top:4px}
.rail-row h4{font-size:19px;font-weight:720;letter-spacing:-.016em}
.rail-row p{margin-top:8px;font-size:16.5px;color:var(--ink-dim);line-height:1.62;max-width:60ch}
@media(max-width:640px){.rail-row{grid-template-columns:1fr;gap:8px}}

/* ---------- FAQ ---------- */
.faq{margin-top:42px;border-top:1px solid var(--line)}
.faq details{border-bottom:1px solid var(--line)}
.faq summary{
  padding:22px 40px 22px 0;cursor:pointer;list-style:none;position:relative;
  font-size:18px;font-weight:660;letter-spacing:-.012em;
}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{
  content:"+";position:absolute;right:6px;top:19px;font-size:23px;font-weight:400;
  color:var(--act-deep);transition:transform .3s var(--spring);
}
.faq details[open] summary::after{transform:rotate(45deg)}
.faq .a{padding:0 40px 24px 0;font-size:16.5px;color:var(--ink-dim);line-height:1.68;max-width:64ch}

/* ---------- form ---------- */
/* the form card is always light; reset colour so it survives being placed in .sec-dark */
.form{background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius);
  padding:34px;margin-top:44px;max-width:660px;color:var(--ink)}
.field{margin-bottom:20px}
.field label{display:block;font-size:14px;font-weight:650;margin-bottom:7px}
.field .hint{font-weight:500;color:var(--ink-mute);font-size:13px}
.field input,.field select,.field textarea{
  width:100%;padding:13px 14px;border:1px solid var(--line-2);border-radius:var(--radius);
  background:var(--paper);font:inherit;font-size:16px;color:var(--ink);
  transition:border-color .2s var(--ease);
}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--board);outline:none}
.field textarea{min-height:104px;resize:vertical}
.row-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:600px){.row-2{grid-template-columns:1fr}}
.formnote{margin-top:14px;font-size:14.5px;color:var(--ink-dim);line-height:1.6}
.previewmsg{margin-top:16px;padding:14px 18px;background:var(--sun-soft);
  border-left:3px solid var(--sun-deep);border-radius:0 var(--radius) var(--radius) 0;
  font-size:14.5px;color:var(--ink-dim);line-height:1.55}
.previewmsg b{color:var(--ink)}
.previewmsg:focus{outline:none}

/* ---------- doors ---------- */
.doors{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:48px}
.door{border-radius:var(--radius);padding:38px 34px 34px;
  transition:transform .4s var(--spring)}
.door:hover{transform:translateY(-4px)}
.door-give{background:var(--board);color:var(--chalk)}
.door-give h3{color:#fff}
.door-give .mono{color:var(--t-green)}  /* orange on the teal board is 4.06; her green is 6.7 */
.door-give p{color:var(--chalk-dim)}
.door-mentor{background:var(--sun-soft);border:1px solid var(--line-2)}
.door-mentor .mono{color:var(--ink-mute)}
.door-mentor p{color:var(--ink-dim)}
.door .mono{margin-bottom:14px}
.door h3{font-size:25px;font-weight:760;letter-spacing:-.024em}
.door p{margin-top:13px;font-size:16px;line-height:1.58;max-width:40ch}
.door .go{display:inline-flex;align-items:center;gap:8px;margin-top:24px;text-decoration:none;
  font-weight:700;font-size:16px;padding:13px 22px;border-radius:var(--radius);
  transition:gap .28s var(--spring),background .2s var(--ease)}
.door-give .go{background:var(--act);color:var(--act-ink)}
.door-give .go:hover{gap:14px}
.door-mentor .go{background:var(--board);color:var(--chalk)}
.door-mentor .go:hover{gap:14px;background:var(--board-2)}
@media(max-width:880px){.doors{grid-template-columns:1fr}}

/* ---------- illustration layer ----------
   .board-scene (the chalkboard) and .phead-ill (the five line drawings) were CUT
   2026-08-07 on Kyle's round-6 ruling, once 14 real photographs existed. The small
   icon + doodle line work stays: it is punctuation, never a stand-in for material. */
.hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:48px;align-items:center}
@media(max-width:940px){.hero-grid{grid-template-columns:1fr;gap:34px}}
.card .ic svg,.door .ic svg{display:block}
.door .ic{margin-bottom:18px;width:52px;height:52px;display:grid;place-items:center;
  border-radius:12px;background:rgba(255,255,255,.55)}
.door-give .ic{background:rgba(238,245,241,.12)}
/* chalk draw-on: paths marked .draw sketch themselves when a .reveal ancestor gets .in */
.draw{stroke-dasharray:420;stroke-dashoffset:420}
.in .draw{animation:chalkdraw 1.3s var(--ease) .5s forwards}
@keyframes chalkdraw{to{stroke-dashoffset:0}}
@media (prefers-reduced-motion:reduce){
  .draw{stroke-dashoffset:0 !important;animation:none !important}
}
@media print{.phead-photo,.herovid{display:none !important}}

/* ---------- HERO VIDEO (Kyle round 5: "the video should be at the top and autoplay on open")
   video-hero.mp4 is a SILENT 960x540 encode of her own 2020 PSA (3.8MB, -an). It loops
   muted so browser autoplay policy is satisfied everywhere. Sound lives on the full-quality
   PSA further down the page, which is click-to-play -- so there is no unmute control up here
   to lie about. WCAG SC 2.2.2: anything auto-playing over 5s needs a pause control, and it
   is a real button, not a hover affordance. Two treatments were built and shot; Kyle picked FULL BLEED on 2026-08-07. */
.herovid{position:relative;overflow:hidden;background:#04252a}
.herovid video{display:block;width:100%;height:100%;object-fit:cover}
.vidctl{position:absolute;right:14px;bottom:14px;display:flex;gap:9px;z-index:4}
.vbtn{display:grid;place-items:center;width:44px;height:44px;border-radius:50%;border:0;
  cursor:pointer;background:rgba(4,37,42,.72);color:#fff;backdrop-filter:blur(7px);
  -webkit-backdrop-filter:blur(7px);transition:transform .28s var(--spring),background .2s var(--ease)}
.vbtn:hover{background:var(--act);color:var(--act-ink);transform:scale(1.08)}
.vbtn svg{display:block}

/* --- treatment A: full bleed behind the headline --- */
header.hero-bleed{position:relative;background:#04252a;padding:0}
header.hero-bleed::before{display:none}
/* the page's .hero .wrap{position:relative} would trap the absolute video inside the
   1120px column, so in bleed mode the header itself is the containing block. */
header.hero-bleed .wrap{position:static}
/* the video is a LATER sibling than the copy, so without this it paints over the
   headline. That is exactly what the first screenshot showed. */
.hero-bleed .hero-grid > *{position:relative;z-index:3}
.hero-bleed .herovid{z-index:1}
/* the marker highlight multiplies, which vanishes on dark footage; screen it instead */
.hero-bleed .markwrap svg{mix-blend-mode:screen}
.hero-bleed .mark-path{stroke:var(--act);opacity:.92}
.hero-bleed .herovid{position:absolute;inset:0}
.hero-bleed .herovid::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(100deg, rgba(4,37,42,.94) 0%, rgba(4,37,42,.88) 38%,
             rgba(4,37,42,.60) 66%, rgba(4,37,42,.46) 100%);
}
.hero-bleed .hero-grid{grid-template-columns:minmax(0,60ch);padding-top:64px;padding-bottom:68px;
  position:relative;z-index:3;min-height:min(62vh,560px);align-content:center}
header.hero-bleed h1,.hero-bleed .markwrap{color:#fff}
.hero-bleed .herosub{color:rgba(255,255,255,.92)}
.hero-bleed .eyebrow{color:var(--t-green)}
.hero-bleed .btn-ghost{color:#fff;border-color:rgba(255,255,255,.55)}
.hero-bleed .btn-ghost:hover{border-color:#fff;background:rgba(255,255,255,.1)}
.hero-bleed .btn-primary{background:var(--act);color:var(--act-ink)}
.hero-bleed .btn-primary:hover{background:#fff;color:var(--clay)}
/* short laptops: the one action must still clear the fold at 1280x700 */
@media(min-width:941px) and (max-height:760px){
  .hero-bleed .hero-grid{padding-top:40px;padding-bottom:44px;min-height:0}
  header.hero-bleed h1{font-size:clamp(40px,4.9vw,64px)}
  .hero-bleed .herosub{font-size:18px}
}
@media(max-width:940px){
  .hero-bleed .hero-grid{padding-top:52px;padding-bottom:56px;min-height:0}
  .hero-bleed .herovid::after{background:linear-gradient(180deg, rgba(4,37,42,.9), rgba(4,37,42,.82))}
}

@media (prefers-reduced-motion:reduce){
  /* no autoplay: site.js pauses and shows the poster, and nothing here re-starts it */
  .herovid video{animation:none !important}
}

/* ---------- photographs: polaroids taped to the paper ---------- */
.photoband{display:grid;grid-template-columns:repeat(3,1fr);gap:34px;margin-top:50px;align-items:start}
@media(max-width:880px){.photoband{grid-template-columns:1fr;gap:34px;max-width:430px}}
.polaroid{background:#fff;border:1px solid var(--line);padding:12px 12px 38px;
  box-shadow:0 16px 34px -18px rgba(15,49,44,.35);position:relative;
  transition:transform .45s var(--spring)}
.polaroid img{width:100%;height:auto;display:block}
.polaroid::before{content:"";position:absolute;top:-13px;left:50%;width:94px;height:26px;
  background:rgba(242,176,60,.5);transform:translateX(-50%) rotate(-3deg);border-radius:2px}
.polaroid.tilt-l{transform:rotate(-1.8deg)}
.polaroid.tilt-r{transform:rotate(1.5deg)}
.polaroid:hover{transform:rotate(0) translateY(-6px)}
.photosplit{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
@media(max-width:880px){.photosplit{grid-template-columns:1fr;gap:34px}}

/* ---------- the three ways in (her buttons, her banner colors, every page) ---------- */
.involve{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:26px}
@media(max-width:760px){.involve{grid-template-columns:1fr}}
.involve a{display:flex;align-items:center;justify-content:space-between;gap:12px;
  text-decoration:none;padding:20px 22px;border-radius:var(--radius);font-weight:700;
  font-size:16.5px;transition:transform .3s var(--spring),filter .2s var(--ease)}
.involve a:hover{transform:translateY(-3px);filter:brightness(1.06)}
.inv-give{background:var(--t-orange);color:var(--act-ink)}
.inv-mentor{background:var(--t-teal-deep);color:#fff}
.inv-scholar{background:var(--sun);color:#3d2a05}

/* triad accents for cards + icon chips */
.acc-teal{border-top:3px solid var(--t-teal)}
.acc-orange{border-top:3px solid var(--t-orange)}
.acc-green{border-top:3px solid var(--t-green)}
.acc-sun{border-top:3px solid var(--sun)}
.ic-teal{background:var(--t-teal-soft) !important}
.ic-orange{background:var(--t-orange-soft) !important}
.ic-green{background:var(--t-green-soft) !important}

/* ---------- the video frame ---------- */
.videoframe{margin-top:40px;aspect-ratio:16/9;border-radius:12px;overflow:hidden;
  border:1px solid var(--line-2);box-shadow:0 24px 44px -22px rgba(15,49,44,.4);background:#000}
.videoframe iframe{width:100%;height:100%;border:0;display:block}
@media print{.videoframe,.marquee,.carousel{display:none !important}}

/* ---------- the teacher's desk: notepads, clipboards, pens, highlighters ---------- */
.notepad{position:relative;background:#fff;border:1px solid var(--line-2);border-radius:10px;
  box-shadow:0 18px 38px -20px rgba(15,49,44,.35);padding:34px 30px 26px 56px;
  background-image:
    linear-gradient(to right, transparent 0 40px, rgba(217,72,43,.35) 40px 42px, transparent 42px),
    repeating-linear-gradient(to bottom, transparent 0 33px, #e6eff0 33px 34px)}
.notepad.spiral{margin-top:16px}
.notepad.spiral::before{content:"";position:absolute;top:-13px;left:30px;right:30px;height:26px;
  background:radial-gradient(circle at 9px 13px, var(--paper) 3.5px, #7b8a84 4.5px 6px, transparent 7px);
  background-size:36px 26px;background-repeat:repeat-x}
.clipboard{position:relative;background:#fff;border:1px solid var(--line-2);border-radius:10px;
  box-shadow:0 18px 38px -20px rgba(15,49,44,.35);padding:56px 32px 28px;
  background-image:repeating-linear-gradient(to bottom, transparent 0 33px, #e6eff0 33px 34px)}
.clipboard::before{content:"";position:absolute;top:-14px;left:50%;transform:translateX(-50%);
  width:128px;height:30px;background:var(--board);border-radius:9px 9px 5px 5px}
.clipboard::after{content:"";position:absolute;top:-24px;left:50%;transform:translateX(-50%);
  width:44px;height:22px;border:5px solid #8b978f;border-bottom:0;border-radius:22px 22px 0 0}
.hl{background:linear-gradient(104deg, transparent 1%, rgba(242,176,60,.5) 3% 97%, transparent 99%);
  padding:0 3px;border-radius:3px;box-decoration-break:clone;-webkit-box-decoration-break:clone}
.hl-green{background:linear-gradient(104deg, transparent 1%, rgba(164,207,69,.45) 3% 97%, transparent 99%)}
.hl-teal{background:linear-gradient(104deg, transparent 1%, rgba(10,153,163,.22) 3% 97%, transparent 99%)}
.note-list{list-style:none;margin:0;padding:0}
.note-list li{position:relative;list-style:none;padding:13px 0 13px 42px;border-bottom:1px dashed var(--line-2);
  font-size:16.5px;line-height:1.55;color:var(--ink)}
.note-list li::before{content:none!important}
.note-list li:last-child{border-bottom:0}
.note-list li b{font-weight:700}
.penmark{position:absolute;left:2px;top:12px}
.sticky{background:#fff6bd;padding:20px 20px 22px;border-radius:2px;position:relative;
  box-shadow:0 12px 26px -14px rgba(15,49,44,.45);transform:rotate(-1.6deg)}
.sticky.teal{background:var(--t-teal-soft);transform:rotate(1.4deg)}
.sticky.orange{background:var(--t-orange-soft);transform:rotate(-1deg)}
.sticky::before{content:"";position:absolute;top:-11px;left:50%;width:86px;height:22px;
  background:rgba(242,176,60,.45);transform:translateX(-50%) rotate(-2deg);border-radius:2px}
.grade{position:absolute;font-weight:800;color:var(--pen-red);transform:rotate(-8deg);
  font-size:30px;letter-spacing:-.02em}
.grade::after{content:"";position:absolute;inset:-10px -14px;border:3px solid var(--pen-red);
  border-radius:50%;transform:rotate(4deg);opacity:.85}

/* stat cards on paper, numbers that climb */
.statrow{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:46px}
.statrow.four{grid-template-columns:repeat(4,1fr)}
@media(max-width:880px){.statrow,.statrow.four{grid-template-columns:1fr}}
.statcard{position:relative;background:#fff;border:1px solid var(--line-2);border-radius:10px;
  padding:26px 24px 24px;box-shadow:0 16px 34px -20px rgba(15,49,44,.3);
  background-image:repeating-linear-gradient(to bottom, transparent 0 29px, #e8f1f2 29px 30px)}
.statcard .n{font-size:46px;font-weight:800;letter-spacing:-.035em;line-height:1;
  font-variant-numeric:tabular-nums}
.statcard .l{margin-top:10px;font-size:15.5px;color:var(--ink-dim);line-height:1.5;font-weight:550}
.n-orange{color:var(--t-orange-ink)}.n-teal{color:var(--t-teal-ink)}.n-green{color:#6e9420}.n-sun{color:var(--sun-deep)}
.statcard .doodle{position:absolute;top:14px;right:14px}

/* self-hosted video player (no third-party chrome) */
.player{position:relative;margin-top:40px;aspect-ratio:16/9;border-radius:12px;overflow:hidden;
  border:1px solid var(--line-2);box-shadow:0 24px 44px -22px rgba(15,49,44,.4);background:#000}
.player video{width:100%;height:100%;display:block;background:#000}
.player .playbtn{position:absolute;inset:0;display:grid;place-items:center;border:0;cursor:pointer;
  background:linear-gradient(rgba(15,49,44,.12),rgba(15,49,44,.38));padding:0}
.player .ring{width:96px;height:96px;border-radius:50%;background:var(--t-orange);
  display:grid;place-items:center;box-shadow:0 16px 40px -10px rgba(242,111,29,.7);
  transition:transform .32s var(--spring)}
.player .playbtn:hover .ring{transform:scale(1.1)}
.player .playbtn[hidden]{display:none}

/* THE BULLETIN BOARD (was: newsletter masthead). 2026-08-09, Kyle: "The news and
   events can look a bit better. it weakens the page because everything else looks
   AWESOME!" The old band was the last un-bubbled component on the site: hard 10px
   corners, hairline borders, a newspaper rule. Now the stories are pinned clippings -
   taped, slightly tilted, sticker-shadowed - the same language as the polaroids. */
.newsband{border-top:0;border-bottom:0;padding:72px 0 78px;background:var(--paper-sunk)}
.newshead{display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  border-bottom:0;padding-bottom:0;flex-wrap:wrap}
.newshead h2{font-size:clamp(28px,4.1vw,43px);font-weight:800;letter-spacing:-.03em}
.newsgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px;margin-top:34px}
@media(max-width:880px){.newsgrid{grid-template-columns:1fr}}
.newsitem{position:relative;text-decoration:none;display:block;border:2px solid var(--line-2);
  border-radius:var(--bubble);background:#fff;box-shadow:var(--sticker-shadow);
  padding:10px 10px 0;transition:transform .35s var(--spring),box-shadow .3s var(--ease)}
.newsitem:nth-child(odd){transform:rotate(-.9deg)}
.newsitem:nth-child(even){transform:rotate(.8deg)}
/* One washi strip per clipping, colours alternating, never centred-and-straight. */
.newsitem::before{content:"";position:absolute;top:-15px;left:50%;z-index:2;
  transform:translateX(-56%) rotate(-3.5deg);width:110px;height:33px;
  background:url(img/fasteners/washi-sun.png) no-repeat center / contain;
  filter:drop-shadow(0 2px 3px rgba(0,0,0,.15))}
.newsitem:nth-child(2)::before{background-image:url(img/fasteners/washi-teal.png);
  transform:translateX(-46%) rotate(2.5deg)}
.newsitem:nth-child(3)::before{background-image:url(img/fasteners/washi-kraft.png);
  transform:translateX(-52%) rotate(-2deg)}
.newsitem:hover{transform:translateY(-5px) rotate(0);box-shadow:0 18px 36px -20px rgba(15,49,44,.45)}
.newsitem img{width:100%;aspect-ratio:3/2;object-fit:cover;display:block;
  border-radius:calc(var(--bubble) - 8px) calc(var(--bubble) - 8px) 6px 6px}
.newsitem .t{padding:16px 12px 8px;font-size:16.5px;font-weight:700;line-height:1.4;color:var(--ink)}
.newsitem .r{padding:0 12px 18px;font-size:13px;font-weight:700;color:var(--act-deep);
  font-family:ui-monospace,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}
@media(prefers-reduced-motion:reduce){.newsitem:hover{transform:none}}
/* The carousel scrollport clips vertical overflow, so the tape needs headroom
   INSIDE the scroll container or it gets sliced off at the card's top edge. */
.newsband .carousel{padding-top:24px;margin-top:14px}
@media print{.player,.newsband{display:none !important}}

/* program cards can carry a photograph */
.cardimg{margin:-30px -27px 22px;overflow:hidden;aspect-ratio:16/9;
  border-radius:calc(var(--radius) - 2px) calc(var(--radius) - 2px) 0 0}
.cardimg img{width:100%;height:100%;object-fit:cover;display:block}
@media print{.polaroid{box-shadow:none;transform:none}.involve{display:none}}

/* ---------- footer ---------- */
footer{background:var(--paper-sunk);border-top:1px solid var(--line);padding:52px 0 44px}
.fgrid{display:flex;justify-content:space-between;gap:36px;flex-wrap:wrap}
.fgrid .mono{color:var(--ink-mute);margin-bottom:13px}
.fcol p,.fcol a{font-size:15.5px;font-weight:500;color:var(--ink-dim);line-height:1.75;text-decoration:none;display:block}
.fcol a:hover{color:var(--board)}
.legal{margin-top:36px;padding-top:22px;border-top:1px solid var(--line);
  font-size:13px;font-weight:500;color:var(--ink-dim);line-height:1.7;max-width:80ch}

/* ---------- print ---------- */
@media print{
  nav,.buildnote,.navcta,.herocta,.formnote,.custom,.cta,.toggle{display:none !important}
  body{background:#fff;color:#000;font-size:11.5px}
  .reveal{opacity:1 !important;transform:none !important;transition:none !important}
  .mark-path{stroke-dashoffset:0 !important;animation:none !important}
  .sec{padding:26px 0}
  .phead{padding:20px 0 18px}
  .sec-dark,.sec-clay,.sec-teal,.sec-sunk,.tagband,.strip,.give-side,.door-give,.myth .yes{
    background:#fff !important;color:#000 !important;border:1px solid #ccc}
  .sec-dark *,.sec-clay *,.sec-teal *,.tagband *,.strip *,.give-side *,.door-give *,.myth .yes *{color:#000 !important}
  .tick{background:#eee !important}
  .card,.door{box-shadow:none !important;transform:none !important;break-inside:avoid}
  .tablewrap{overflow:visible;border:0}
  table{min-width:0;font-size:9.5px;width:100%}
  th,td{padding:6px 6px;white-space:normal !important}
  .tag{border:1px solid #999;background:#fff !important;color:#000 !important}
  a{text-decoration:none}
  footer{background:#fff;border-top:1px solid #ccc;padding:18px 0}
}

/* ===========================================================================
   MOVES 4-6, 2026-08-07. Kyle round 5: "no cool picture carousels or anything to
   show off premium and unique taste ... words big and popping ... numbers climbing
   and producing aesthetic animations and motion."
   =========================================================================== */

/* ---------- MOVE 4a: the marquee. A slow drifting strip, duplicated once so the
   loop is seamless, edges masked so photos arrive and leave instead of popping.
   It also solves photo SCARCITY: eight images read as abundance where a 3-up grid
   reads as "we had three photos." Pure CSS -- no library, no JS tick. ---------- */
.marquee{position:relative;overflow:hidden;padding:6px 0;
  mask-image:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent);
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent)}
.marquee-track{display:flex;gap:18px;width:max-content;animation:drift 62s linear infinite}
.marquee:hover .marquee-track,.marquee:focus-within .marquee-track{animation-play-state:paused}
.marquee figure{margin:0;flex:none;width:clamp(220px,26vw,330px);aspect-ratio:4/3;
  border-radius:12px;overflow:hidden;background:var(--board);
  box-shadow:0 20px 40px -24px rgba(7,60,68,.55)}
.marquee img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .8s var(--ease)}
.marquee figure:hover img{transform:scale(1.05)}
@keyframes drift{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
@media (prefers-reduced-motion:reduce){
  .marquee-track{animation:none}
  .marquee{overflow-x:auto;-webkit-overflow-scrolling:touch}
}

/* ---------- MOVE 4b: the editorial carousel. Native scroll-snap, so it drags and
   flicks correctly on touch with no JS and no library. ---------- */
.carousel{display:grid;grid-auto-flow:column;grid-auto-columns:var(--card,clamp(300px,41%,450px));
  gap:24px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;
  padding:4px 4px 22px;margin:34px -4px 0;
  scrollbar-width:thin;scrollbar-color:var(--line-2) transparent}
.carousel > *{scroll-snap-align:start}
.carousel::-webkit-scrollbar{height:8px}
.carousel::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:99px}
.carousel::-webkit-scrollbar-track{background:transparent}
@media(max-width:880px){.carousel{grid-auto-columns:min(78%,340px)}}
.carnav{display:flex;gap:9px;margin-top:6px}
.carnav[hidden]{display:none}
.carnav button{width:42px;height:42px;border-radius:50%;border:1.5px solid var(--line-2);
  background:var(--paper-2);cursor:pointer;display:grid;place-items:center;color:var(--ink);
  transition:transform .28s var(--spring),background .2s var(--ease),border-color .2s var(--ease)}
.carnav button:hover{background:var(--act);border-color:var(--act);color:var(--act-ink);transform:scale(1.07)}
.carnav button[disabled]{opacity:.36;cursor:default;transform:none;background:var(--paper-2);
  border-color:var(--line-2);color:var(--ink)}

/* ---------- MOVE 5: type that shouts. One display step ABOVE h1, for one or two
   words per page, tracked in hard. Negative tracking is not optional at this size.
   The TYPEFACE is still the stack we have: choosing a new one is Kyle's eye, not
   mine (Law 0), so this move ships the SCALE and leaves the face open. ---------- */
.display{font-size:clamp(56px,11vw,150px);line-height:.88;letter-spacing:-.038em;
  font-weight:800;text-wrap:balance}
.display-sub{margin-top:20px;font-size:19px;line-height:1.6;max-width:52ch}
.statcard .n,.stats .n{font-size:clamp(46px,6.2vw,84px);letter-spacing:-.04em;line-height:.94}

/* ---------- MOVE 6a: the odometer. Each digit is a 0-9 column in a clipped box,
   translated on a spring, so the number ROLLS rather than ticking through
   textContent. tabular-nums keeps the box from jittering while it moves. ---------- */
.odo{display:inline-flex;align-items:baseline;font-variant-numeric:tabular-nums}
.odo .lit{display:inline-block}
.odo .reel{display:inline-block;overflow:hidden;height:1em;line-height:1;vertical-align:baseline}
.odo .strip{display:block;transition:transform 1.15s var(--spring)}
.odo .strip span{display:block;height:1em;line-height:1}
@media (prefers-reduced-motion:reduce){.odo .strip{transition:none}}

/* the landing accent: an underline that draws itself as the number arrives. The felt
   difference is the LANDING, not the counting. */
.n-underline{display:block;width:100%;height:11px;margin-top:8px;overflow:visible}
.n-underline path{fill:none;stroke-width:5;stroke-linecap:round;
  stroke-dasharray:260;stroke-dashoffset:260;transition:stroke-dashoffset 1s var(--ease) .55s}
.landed .n-underline path{stroke-dashoffset:0}
@media (prefers-reduced-motion:reduce){.n-underline path{stroke-dashoffset:0;transition:none}}

/* ---------- MOVE 6b: scroll-linked motion, strictly behind @supports.
   animation-timeline is NOT Baseline -- MDN, read live 2026-08-07: "Limited
   availability ... does not work in some of the most widely-used browsers." Amanda
   will most likely open this on an iPhone, so the IntersectionObserver reveal in
   site.js is the FLOOR and every rule below is a bonus a Safari visitor never
   misses. Each rule below has a NAMED READER in the markup -- .parallax on the page
   header photograph, .readbar on the news band -- because a rule nothing applies is
   decoration, not a feature. ---------- */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion:no-preference){
    .parallax{animation:para linear both;animation-timeline:view();animation-range:cover}
    @keyframes para{from{transform:translateY(-5%)}to{transform:translateY(5%)}}  /* 10% total travel */
    .readbar{position:absolute;left:0;top:0;height:3px;background:var(--act);width:100%;
      transform-origin:0 50%;animation:fillbar linear both;
      animation-timeline:view();animation-range:entry 0% cover 88%}
    @keyframes fillbar{from{transform:scaleX(0)}to{transform:scaleX(1)}}
  }
}

/* ===========================================================================
   ROUND 7, 2026-08-07. Kyle: "its a lot to digest ... as a first time visitor i
   dont know where to look." Nothing is deleted -- he chose hierarchy only. What
   changes is RANK: one primary action per screen, one thing at display scale, one
   thing moving, and quiet earned back on either side of the loud parts.
   =========================================================================== */

/* the single fold action, sized so nothing else on that screen reads as its equal */
.btn-lg{font-size:18px;padding:19px 40px;box-shadow:0 18px 38px -16px rgba(242,111,29,.65)}

/* the demoted secondary. Still obvious, no longer a competing pill. */
.quietlink{display:inline-flex;align-items:center;gap:9px;text-decoration:none;
  font-weight:650;font-size:16px;padding:6px 2px;border-bottom:1.5px solid transparent;
  transition:border-color .22s var(--ease),gap .28s var(--spring)}
.quietlink:hover{gap:13px}
.hero-bleed .quietlink{color:rgba(255,255,255,.94);border-bottom-color:rgba(255,255,255,.42)}
.hero-bleed .quietlink:hover{border-bottom-color:#fff}
.herocta{align-items:center;gap:26px !important}

/* The nav Donate and the hero Donate are the SAME action. Two orange pills on one
   screen split the glance, so the nav one waits its turn: it is an outline while the
   hero is on screen and fills in the moment the hero scrolls away. site.js sets the
   flag; without JS it simply stays filled, which is the safe end of the trade. */
.navcta.deferred{background:transparent;color:var(--act-deep);
  box-shadow:inset 0 0 0 1.6px var(--line-2)}
.navcta.deferred:hover{background:var(--act);color:var(--act-ink);box-shadow:none}

/* quiet between the loud. The bands were stacked shoulder to shoulder; a saturated
   surface reads as a decision when there is calm on either side of it. */
.tagband,.newsband{margin-top:0}
.sec-sunk + .tagband{margin-top:0}
.marquee{padding:10px 0 4px}

/* MOVE 5 revisited: exactly one element per page may sit at display scale. On Our
   Success four 84px figures shouted at once, so no figure led. The dollar total is
   the one that persuades; the other three step down and support it. */
.statrow .statcard .n{font-size:clamp(32px,3.4vw,44px)}
.statrow .statcard.king .n{font-size:clamp(54px,7.4vw,96px)}
.statrow .statcard.king{grid-column:span 1}

/* ===========================================================================
   ROUND 8, 2026-08-07. Kyle: "we shouldnt just have a donate only like a pan,
   begging. we should have a mentor, donor, student button. more variety ... we need
   each role to be clear on how it works, how you can participate, and the flow."
   Round 7's one-action rule still holds in spirit: the three doors are ONE choice
   unit, not three pills competing for the same glance.
   =========================================================================== */

/* the three doors at the fold, in her banner colours */
.herochoice{margin-top:32px;max-width:820px}
.herochoice a{font-size:15.5px;padding:18px 18px;white-space:nowrap}
.herochoice a span[aria-hidden]{margin-left:6px}
@media(max-width:1060px) and (min-width:761px){.herochoice a{font-size:14px;padding:16px 14px}}
@media(max-width:760px){.herochoice{grid-template-columns:1fr;gap:12px}}

/* the sound control. The hero starts muted because every browser requires it, so this
   is the visitor's way in to the audio -- it is NOT decoration: video-hero.mp4 now
   carries a real 64k mono AAC track (it did not before round 8, when an unmute button
   would have been a lie). */
.soundbtn{display:inline-flex;align-items:center;gap:11px;margin-top:24px;cursor:pointer;
  font:inherit;font-size:15px;font-weight:650;padding:11px 20px 11px 14px;border-radius:99px;
  background:rgba(255,255,255,.13);color:#fff;border:1.5px solid rgba(255,255,255,.42);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  transition:background .2s var(--ease),border-color .2s var(--ease),transform .28s var(--spring)}
.soundbtn:hover{background:rgba(255,255,255,.24);border-color:#fff;transform:translateY(-1px)}
.soundbtn .ic{width:22px;height:22px;display:grid;place-items:center;flex:none}
.soundbtn .ic svg{display:block}

/* ---------- the three roles, spelled out: ONE FOLDER, three sections ----------
   Kyle picked direction C from three shot prototypes, 2026-08-11.

   What it replaces: three separate cards, each `background + 1px border + 12px
   radius` — his named failure state ("a generic bubble container with no life
   besides the color itself"), three times, in a uniform grid of equal cards that
   the board-page ruling already says reads corporate.

   Why a folder and not three nicer cards: round 8, "the three doors are one
   choice, not three competing asks." Three boxes argue with each other; one
   folder with three colour-coded sections is a single object a visitor reads
   once. The dashed rules are divisions INSIDE it, which is his own "boldness of
   these seperations" language from the storefront chrome — structure by division
   and full-width edges, never by more boxes.

   The texture is an OVERLAY capped at 7%, not a blended fill. Blending
   kraft-fibre into the background ran it at full strength and the panel read as
   scratched dirt; the lane's own rule holds textures at 4-8%.

   The tabs sit ON the folder's top edge rather than poking above it. The
   poking-above version painted underneath the folder and rendered as coloured
   stubs with the labels invisible. */
.roles{display:grid;grid-template-columns:repeat(3,1fr);gap:0;margin-top:74px;
  background:#fdf8ef;border:1px solid #ddd2bd;border-radius:3px;position:relative;
  box-shadow:0 20px 40px -24px rgba(15,49,44,.5)}
.roles::after{content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background:url(img/textures/kraft-fibre.png) repeat;background-size:320px 320px;
  opacity:.07;mix-blend-mode:multiply}
.role{background:none;border:0;border-radius:0;position:relative;z-index:1;
  border-right:1px dashed #d3c7b0;
  display:flex;flex-direction:column;height:100%}
.role:last-child{border-right:0}
.role-band{position:absolute;top:0;left:0;right:0;padding:10px 26px 11px;color:#fff;z-index:3}
.role-donor  .role-band{background:var(--act-deep)}
.role-mentor .role-band{background:var(--t-teal-deep)}
.role-scholar .role-band{background:var(--sun-deep)}
.role-body{padding:60px 26px 32px;display:flex;flex-direction:column;flex:1}
/* One column: the dividing rule turns with the axis, or the last section keeps a
   dangling edge and the folder stops reading as one object. */
@media(max-width:1000px){
  .roles{grid-template-columns:1fr;max-width:640px;margin-top:54px}
  .role{border-right:0;border-bottom:1px dashed #d3c7b0}
  .role:last-child{border-bottom:0}
}
.role h3{font-size:24px;font-weight:780;letter-spacing:-.022em}
.role-what{margin-top:10px;font-size:16.5px;line-height:1.55;color:var(--ink-dim)}
.role-lbl{margin-top:24px;color:var(--ink-mute)}
.flow{list-style:none;margin:14px 0 0;padding:0;counter-reset:step}
.flow li{position:relative;padding:0 0 15px 38px;font-size:15.5px;line-height:1.55;
  color:var(--ink-dim);counter-increment:step}
.flow li::before{content:counter(step);position:absolute;left:0;top:-1px;width:25px;height:25px;
  border-radius:50%;display:grid;place-items:center;font-size:12.5px;font-weight:800;
  font-family:ui-monospace,Menlo,monospace}
.role-donor   .flow li::before{background:var(--act-soft);color:var(--act-deep)}
.role-mentor  .flow li::before{background:var(--t-teal-soft);color:var(--t-teal-ink)}
.role-scholar .flow li::before{background:var(--sun-soft);color:var(--sun-deep)}
/* the thread that makes it read as a FLOW rather than three bullets */
.flow li:not(:last-child)::after{content:"";position:absolute;left:12px;top:26px;bottom:4px;
  width:2px;background:var(--line-2)}
.flow li b{color:var(--ink);font-weight:700}
.role-note{margin-top:6px;font-size:14.5px;line-height:1.6;color:var(--ink-dim)}
.role-note a{font-weight:650;color:var(--act-deep)}
.role-go{margin-top:auto;align-self:flex-start;font-size:15.5px;padding:13px 22px}
.role-body > .role-go{margin-top:22px}
.role-alt{margin-top:14px;font-size:13.5px;font-weight:650;color:var(--t-teal-ink)}
@media print{.roles{grid-template-columns:1fr}.role{break-inside:avoid}}

/* Phones: three stacked doors plus a sound button ran the fold long (876px inside an
   844px screen). The choice a visitor is being offered must be visible without a
   scroll, so the hero tightens rather than the choice shrinking to two. */
@media(max-width:760px){
  .hero-bleed .hero-grid{padding-top:32px;padding-bottom:30px}
  .herochoice{margin-top:22px;gap:10px}
  .herochoice a{padding:14px 18px;font-size:15.5px}
  .soundbtn{margin-top:16px;padding:9px 18px 9px 13px;font-size:14.5px}
  header.hero-bleed h1{font-size:clamp(34px,9.4vw,44px)}
  .hero-bleed .herosub{font-size:17px;margin-top:18px}
}
/* short phones (a 414x736 handset with browser chrome missed by 6px) */
@media(max-width:760px) and (max-height:760px){
  .hero-bleed .hero-grid{padding-top:24px;padding-bottom:22px}
  .hero-bleed .herosub{font-size:16px;margin-top:14px}
  .herochoice{margin-top:18px}
  .herochoice a{padding:12px 16px}
}
.lbl-short{display:none}
/* Very short phones: three stacked doors cannot fit under a headline on a 568-640px
   screen, so the choice becomes ONE compact row instead of disappearing below the
   fold. The roles are still all three -- only the words "Become a" are dropped. */
@media(max-width:760px) and (max-height:700px){
  .herochoice{grid-template-columns:repeat(3,1fr);gap:8px}
  .herochoice a{padding:12px 8px;font-size:14px;justify-content:center;text-align:center}
  .lbl-full{display:none}
  .lbl-short{display:inline}
  .herochoice a span[aria-hidden]{display:none}
  header.hero-bleed h1{font-size:clamp(29px,8.4vw,38px)}
  .hero-bleed .herosub{font-size:15.5px;margin-top:12px}
  .hero-bleed .hero-grid{padding-top:20px;padding-bottom:18px}
  .soundbtn{margin-top:14px}
}

/* ===========================================================================
   ROUND 9, 2026-08-07 — THE DONATE PAGE. The measured leak: every giving path left
   her domain, the front-door GoFundMe raised $3,400 from 17 donors in five years,
   nothing offered monthly, and donor records sat with the platform instead of the
   org. No on-domain giving also means no tracked conversion, which is a hard
   prerequisite for the Google Ad Grant, not a parallel task.
   =========================================================================== */
.giving{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:44px;align-items:start}
@media(max-width:960px){.giving{grid-template-columns:minmax(0,1fr);gap:34px}}

.giveform{background:var(--paper-2);border:1px solid var(--line);border-radius:14px;
  padding:32px 30px 30px;box-shadow:0 26px 52px -34px rgba(7,60,68,.5)}
.gf-block{border:0;padding:0;margin:0 0 26px}
.gf-block legend{padding:0;margin-bottom:11px;color:var(--ink-mute)}
.gf-hint{font-size:14.5px;line-height:1.6;color:var(--ink-dim);margin-top:10px}
.gf-hint b{color:var(--act-deep)}

/* segmented controls */
.seg{display:grid;grid-template-columns:1fr 1fr;gap:8px;background:var(--paper-sunk);
  padding:6px;border-radius:11px}
.seg-b{font:inherit;font-size:15.5px;font-weight:680;padding:13px 10px;border:0;cursor:pointer;
  border-radius:8px;background:transparent;color:var(--ink-dim);
  transition:background .2s var(--ease),color .2s var(--ease),box-shadow .2s var(--ease)}
.seg-b:hover{color:var(--ink)}
.seg-b.is-on{background:var(--paper-2);color:var(--ink);box-shadow:0 2px 8px -2px rgba(7,60,68,.28)}
@media(max-width:520px){.seg{grid-template-columns:1fr}}

/* amounts */
.amts{display:grid;grid-template-columns:repeat(5,1fr);gap:9px}
@media(max-width:620px){.amts{grid-template-columns:repeat(3,1fr)}}
.amt{font:inherit;font-size:17px;font-weight:730;padding:16px 6px;cursor:pointer;
  border:1.5px solid var(--line-2);border-radius:10px;background:var(--paper-2);color:var(--ink);
  font-variant-numeric:tabular-nums;
  transition:border-color .2s var(--ease),background .2s var(--ease),transform .28s var(--spring)}
.amt:hover{border-color:var(--act);transform:translateY(-2px)}
.amt.is-on{background:var(--act);border-color:var(--act);color:var(--act-ink)}
.amt-other{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:14px;
  flex-wrap:wrap}
.amt-other .mono{color:var(--ink-mute)}
.amt-field{display:inline-flex;align-items:center;gap:2px;border:1.5px solid var(--line-2);
  border-radius:10px;padding:0 14px;background:var(--paper);min-width:150px}
.amt-field:focus-within{border-color:var(--act)}
.amt-field .cur{font-weight:730;color:var(--ink-mute)}
.amt-field input{border:0;background:transparent;font:inherit;font-size:17px;font-weight:730;
  padding:13px 0;width:100%;color:var(--ink);font-variant-numeric:tabular-nums}
.amt-field input:focus{outline:none}
.amt-field input::-webkit-outer-spin-button,.amt-field input::-webkit-inner-spin-button{
  -webkit-appearance:none;margin:0}
.amt-field input[type=number]{-moz-appearance:textfield}

/* the match maths -- the whole reason this page exists */
.matchbox{margin-top:6px;border:1.5px solid var(--act);border-radius:12px;overflow:hidden;
  background:var(--act-soft)}
.mb-row{display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  padding:13px 20px;font-size:15.5px}
.mb-l{color:var(--ink-dim)}
.mb-v{font-weight:760;font-variant-numeric:tabular-nums;color:var(--ink);white-space:nowrap}
.mb-plus{border-top:1px dashed rgba(168,66,10,.34)}
.mb-plus .mb-v{color:var(--act-deep)}
.mb-total{border-top:1.5px solid var(--act);background:rgba(255,255,255,.55);padding-top:15px;
  padding-bottom:15px}
.mb-total .mb-l{color:var(--ink);font-weight:680}
.mb-total .mb-v{font-size:23px;letter-spacing:-.02em}
.mb-year{padding:0 20px 15px;font-size:13px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--act-deep);font-family:ui-monospace,Menlo,monospace}
/* the "where it is needed most" designation is NOT described as matched, so the maths
   row visibly stands down rather than quietly showing a zero */
.matchbox.no-match{border-color:var(--line-2);background:var(--paper-sunk)}
.matchbox.no-match .mb-plus{opacity:.5}
.matchbox.no-match .mb-plus .mb-v{color:var(--ink-mute)}
.matchbox.no-match .mb-total{border-top-color:var(--line-2)}
.matchbox.no-match .mb-year{color:var(--ink-mute)}

.gf-check{display:flex;gap:12px;align-items:flex-start;margin-top:22px;font-size:15px;
  line-height:1.5;cursor:pointer}
.gf-check input{width:19px;height:19px;margin-top:2px;flex:none;accent-color:var(--act)}
.gf-sub{display:block;color:var(--ink-mute);font-size:13.5px;margin-top:3px}
.gf-go{margin-top:24px;width:100%;text-align:center}
.giveform .previewmsg{margin-top:16px}

/* the side rail */
.giveside{display:grid;gap:16px}
/* ---------- the giving rail: ONE PAD, four entries ----------
   Kyle picked A from three shot prototypes, 2026-08-11.

   What it replaces: four `.gs-card`s, each `background + 1px border + 12px
   radius`, stacked in a column -- the named failure state four times over, and
   the same "uniform grid of equal cards" the board page and the role cards were
   both rebuilt to escape.

   Why a pad: it is the structural move that won on the role cards hours earlier
   -- offered better boxes or fewer boxes, he takes fewer boxes -- and the notepad
   is the one component here he has praised unprompted ("looks awesome with that
   background", round 10). The dashed rules divide entries INSIDE one object
   instead of fencing four.

   Round 10 also asked for a bolded lead-in on long prose because "eyes will
   scroll right past long plaintext paragraphs"; `.gs-lbl` carries the action
   colour and real weight to be that entry point. */
.gs-card{background:#fff;border:0;border-radius:0;position:relative;
  padding:24px 26px 26px 56px;
  border-bottom:1px dashed #ccd6d2;
  background-image:repeating-linear-gradient(180deg,transparent 0 31px,#e6eeeb 31px 32px)}
.gs-card:first-child{border-radius:10px 10px 0 0;margin-top:22px;
  box-shadow:0 -1px 0 #d8e2de inset,0 18px 34px -22px rgba(15,49,44,.4)}
.gs-card:last-child{border-bottom:0;border-radius:0 0 10px 10px;
  box-shadow:0 18px 34px -22px rgba(15,49,44,.4)}
/* the margin rule runs the full height of the pad, not per card */
.gs-card::before{content:"";position:absolute;left:36px;top:0;bottom:0;width:2px;background:#e8a9a2}
/* spiral binding, drawn once on the top edge */
.gs-card:first-child::after{content:"";position:absolute;top:-13px;left:36px;right:36px;height:26px;
  background:radial-gradient(circle at 12px 13px,#fff 0 6px,transparent 6px) repeat-x;
  background-size:38px 26px;border-top:1px solid #d8e2de}
.gs-lbl{color:var(--act-deep);font-weight:700}
.gs-lbl{color:var(--ink-mute);margin-bottom:10px}
.gs-card p{font-size:15.5px;line-height:1.6;color:var(--ink-dim)}
.gs-card p b,.gs-list b{color:var(--ink);font-weight:700}
.gs-list{list-style:none;margin:0;padding:0}
.gs-list > li{padding:9px 0 9px 20px;position:relative;font-size:15px;line-height:1.55;color:var(--ink-dim);
  border-bottom:1px dashed var(--line)}
.gs-list > li:last-child{border-bottom:0}
.gs-list > li::before{content:"";position:absolute;left:0;top:16px;width:8px;height:8px;border-radius:50%;
  background:var(--t-teal)}
.gs-list a{font-weight:650;color:var(--act-deep)}
.gs-trust{background:var(--t-teal-soft);border-color:#bfe2e5}
.gs-trust p{color:var(--ink)}
@media print{.giveform,.seg,.amts{break-inside:avoid}}
/* 320px: the form's own 60px of horizontal padding plus the wrap gutters left 204px of
   content, and the custom-amount field's 150px min-width pushed straight through it. */
@media(max-width:420px){
  .giveform{padding:22px 16px 24px}
  .amt-field{min-width:0;width:100%}
  .amt-other{gap:8px}
  .mb-row{padding-left:15px;padding-right:15px}
  .mb-year{padding-left:15px;padding-right:15px}
  .gs-card{padding:20px 17px 21px}
}

/* ---------------------------------------------------------------------------
   PayPal donate button, wearing the site's own button (added 2026-08-08).
   PayPal's SDK renders a fixed GIF we cannot restyle and must not replace with a
   synthetic click (popup blockers). So its image becomes an invisible hit area
   stretched across our real button. Donor sees ours; the click lands on theirs.
   --------------------------------------------------------------------------- */
.pp-wrap { position: relative; overflow: hidden; display: flex; width: 100%;
  align-items: center; justify-content: center; box-sizing: border-box; }
.pp-wrap .pp-label { pointer-events: none; }
.pp-wrap .pp-hit { position: absolute; inset: 0; width: 100%; height: 100%;
  opacity: 0; cursor: pointer; border: 0; margin: 0; padding: 0; }
.pp-wrap:focus-within { outline: 3px solid currentColor; outline-offset: 2px; }

/* ===========================================================================
   THE SCHOOLBOOK LAYER — added 2026-08-08, round 10.
   Kyle: "easy to scan fun bubbles. Think schooling and education not corporate
   bland. Same applies for all the containers, they need a little more
   educational and kid friendly love."

   THE DIAGNOSIS: --radius is 7px. Seven pixels is a SaaS dashboard radius. It is
   the single most corporate number in the file, it is on every container, and no
   amount of colour fixes it. This layer does not repaint anything - the palette
   is already hers and it is good. It changes SHAPE, WEIGHT and ENTRY POINTS.

   Three moves, in the order they matter:
     1. Bubbles, not boxes. Generous radii, and a soft offset shadow so a card
        reads like a sticker on a page rather than a div with a border.
     2. Outlines that are drawn, not hairlines. 2px in her own triad colours.
        A 1px #d6d1c7 border is a spreadsheet cell; a 2px teal outline is a
        worksheet.
     3. Prose gets an entry point. Kyle said four different ways that long
        plaintext gets skipped. A reader needs somewhere for the eye to land.
   =========================================================================== */

:root{
  --bubble:    22px;   /* cards, panels, notepads */
  --bubble-lg: 30px;   /* hero-scale containers */
  --pill:      999px;  /* chips, tags, go-buttons */
  --sticker-shadow: 0 6px 0 -1px rgba(7,60,68,.10), 0 18px 34px -20px rgba(7,60,68,.45);
}

/* ---------- 1. THE THREE DOORS become three bubbles ----------
   ⚠ FIRST, THE BUG UNDERNEATH THE TASTE NOTE (found 2026-08-08).
   `.threedoors` had NO rule anywhere in this file - not here, not in the original.
   get-involved.html has been shipping a class that does not exist, so its three
   doors computed to display:block and stacked full-width, one under another, at
   1064px each. That is not a styling preference, it is a missing layout.

   It is also EXACTLY what Kyle described without seeing the CSS: "we dont want a
   long vertical read", "very bland, old un designed containers", "the page feels
   undone for such an important spot". He was reading the symptom of a real
   defect. `.doors` (about.html) was defined and worked; `.threedoors` was an
   orphan class name. Define it, then style it. */
.threedoors{
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 46px;
}
@media(max-width: 900px){ .threedoors{ grid-template-columns: 1fr 1fr; } }
@media(max-width: 620px){ .threedoors{ grid-template-columns: 1fr; } }

.threedoors .door{
  border-radius: var(--bubble-lg);
  border: 2px solid transparent;
  box-shadow: var(--sticker-shadow);
  position: relative;
  padding: 34px 30px 30px;
  /* Each door is an <a>. Without this it inherits the underline meant for inline
     links, and a whole card underlining its own heading reads as a mistake. */
  text-decoration: none;
}
/* Each door wears one of HER triad colours as its outline, so the three read as
   a set of three choices rather than three unrelated panels. */
.door-mentor{ background: var(--sun-soft); border-color: var(--sun); }
.door-give  { background: var(--board);    border-color: var(--t-teal); }
.threedoors .door:nth-child(1){ background: var(--t-teal-soft); border-color: var(--t-teal); }
.threedoors .door:nth-child(2){ background: var(--t-green-soft); border-color: var(--t-green); }
.threedoors .door:nth-child(3){ background: var(--act-soft); border-color: var(--t-orange); }
.threedoors .door:nth-child(3) h3,
.threedoors .door:nth-child(3) .mono{ color: var(--ink); }
.threedoors .door:nth-child(3) .mono{ color: var(--act-deep); }

/* The icon chip becomes a round badge - the single biggest "school" signal, and
   it costs nothing but a border-radius. */
.threedoors .door .ic{
  width: 62px; height: 62px; border-radius: var(--pill);
  display: grid; place-items: center;
  background: rgba(255,255,255,.72);
  border: 2px solid currentColor; color: inherit;
  margin-bottom: 16px;
}
.threedoors .door .go{
  border-radius: var(--pill); padding: 11px 20px; font-weight: 730; font-size: 15px;
  display: inline-block; margin-top: 18px;
}
/* Playful, but restrained: a 4px lift and a whisper of rotation. Enough to feel
   alive on hover, not enough to look like a toy. */

/* ---------- THE PHOTO WALL — polaroids taped up (2026-08-12) ----------
   Kyle: "We can attach these photos like polaroids taped on a wall."

   NO CROPPING, EVER. Any object-fit:cover into a fixed box cuts something, and
   on photographs of people it comes off the faces -- two attempts at a tuned
   crop still took the top of a man's head off, measured at 17% and 11% of the
   source. A polaroid takes the photograph's own shape instead. The gate is
   `cropped_away === 0%`, computed per image, not "it looks fine small".

   ⚠ UNIFORM HEIGHT, VARIABLE WIDTH — the 2026-08-12 correction.
   The first version was a grid, so a portrait photo made its whole ROW as tall
   as itself and every landscape beside it sat above a slab of dead white. Kyle:
   "3 horizontal and 1 vertical on the same row creates that awkward white blank
   space." Sizing by height instead lets a portrait simply be NARROWER than its
   neighbours, which is what a row of real photographs pinned to a wall looks
   like -- and it keeps the no-crop rule, because the aspect ratio is still the
   photograph's own. This is the justified-gallery shape, not a grid. */
.photowall{
  display:flex; flex-wrap:wrap; align-items:flex-start; gap:30px 22px; margin:0;
  /* the horizontal padding is load-bearing: a rotated polaroid's corners reach
     past its own box, and without it the page gains sideways scroll. A tilt
     costs room -- give it the room rather than clipping it, which would take
     the tape off. */
  padding:10px 14px 6px;
}
/* ⚠ ONE ROW THAT FILLS EXACTLY — the 2026-08-12 correction, and the third shape
   this wall has taken. Kyle: "3 horizontal and 1 vertical on the same row
   creates that awkward white blank space", then: "it looks like when a sentence
   is too large to fit on one line, so a straggler gets kicked below."

   Both complaints are the same defect from two angles. A grid made every row as
   tall as its tallest item; fixing that with a uniform height still let the row
   WRAP, orphaning the fifth photo onto a line of its own with blank space either
   side. A photo wall does not have widows.

   The fix is the justified-gallery trick: flex-basis 0 with flex-grow set to each
   photograph's OWN aspect ratio (written into the markup as --ar). Widths then
   come out proportional to shape, which means every frame in a row lands at the
   same height AND the row fills the width exactly. A portrait is simply narrower
   than the landscapes beside it. Nothing wraps, nothing is orphaned, and nothing
   is cropped, because each frame still holds the photograph's own ratio. */
.photowall .pola{
  flex:var(--ar,1.5) 1 0; min-width:0;
  margin:0; background:#fff; padding:10px 10px 30px;
  border:1px solid var(--line); position:relative;
  box-shadow:0 16px 30px -18px rgba(15,49,44,.5);
  transition:transform .45s var(--spring);
}
.photowall .pola img{ display:block; width:100%; height:auto; }
.photowall .pola::before{                       /* the tape */
  content:""; position:absolute; top:-12px; left:50%; width:82px; height:22px;
  background:url(img/fasteners/washi-teal.png) no-repeat center/contain;
  transform:translateX(-50%) rotate(-2deg);
}
.photowall .pola:nth-child(3n+2)::before{ background-image:url(img/fasteners/washi-sun.png);
  transform:translateX(-50%) rotate(1.6deg); }
.photowall .pola:nth-child(3n+3)::before{ background-image:url(img/fasteners/washi-kraft.png);
  transform:translateX(-50%) rotate(-1deg); }
.photowall .pola:nth-child(4n+1){ transform:rotate(-1.2deg); }
.photowall .pola:nth-child(4n+2){ transform:rotate(.8deg); }
.photowall .pola:nth-child(4n+3){ transform:rotate(-.5deg); }
.photowall .pola:nth-child(4n+4){ transform:rotate(1.3deg); }
.photowall .pola:hover{ transform:rotate(0) translateY(-6px); }
@media(prefers-reduced-motion:reduce){ .photowall .pola:hover{ transform:none; } }
/* Phones: ONE per row. Two-up looked obvious and is arithmetically impossible
   to do well -- equal-width pairs can only have equal heights if the photographs
   share a ratio, and ours do not, so a portrait beside a landscape put up to
   137px of dead white between them. Measured, not guessed. One per row cannot
   have an orphan, cannot mismatch heights, needs no crop, and at 390px a single
   polaroid is finally big enough to read. */
@media(max-width:760px){
  .photowall{ flex-direction:column; align-items:stretch; gap:30px; padding:10px 10px 6px; }
  .photowall .pola{ flex:0 0 auto; width:100%; }
}

/* ---------- the three doors: structure instead of an icon (2026-08-12) ----------
   Three icon sets have now failed on this component: the first drawn set (Kyle
   could not read the backpack or the hand), the simple stroke replacements
   ("sub par", round 13), and our own hand-drawn IRIS-A4 set ("those look
   terrible. the donor thing idek what im looking at", round 16).

   The answer is not a fourth icon. An icon on a door is a placeholder for a
   photograph, and Law 1 is MATERIAL, never placeholder. Her library holds no
   photograph of a mentor with a student, so the door carries type and structure
   and waits.

   What replaces the icon's job of saying "who is this for" at a glance: the
   audience word becomes a TAB on the card's own top edge, so the label is
   structure rather than another line of type. Same move as the role cards and
   the donate rail -- his own "boldness of these seperations" language. */
.threedoors .door{
  border-radius:2px; position:relative; overflow:hidden;
  padding:58px 26px 30px;
  box-shadow:0 14px 30px -18px rgba(15,49,44,.45);
}
/* paper grain, held at the lane's 4-8% cap rather than blended into the fill */
.threedoors .door::after{
  content:""; position:absolute; inset:0; pointer-events:none;
  background:url(img/textures/kraft-fibre.png) repeat; background-size:300px 300px;
  opacity:.10; mix-blend-mode:multiply;
}
.threedoors .door .mono{
  position:absolute; top:0; left:0; margin:0; padding:9px 18px 10px;
  /* !important because line ~1145 sets .door:nth-child(3) .mono to --act-deep,
     which on an --act-deep tab is invisible. Found by eye AFTER a verification
     pass that checked overflow, icons and slots but never ran contrast — the one
     check that would have caught it. */
  color:#fff !important; background:var(--t-teal-deep);
  font-size:10.5px; letter-spacing:.11em; z-index:3;
}
.threedoors .door:nth-child(2) .mono{ background:#5c7d1a; }
.threedoors .door:nth-child(3) .mono{ background:var(--act-deep); }
.threedoors .door h3{
  border-bottom:3px solid rgba(0,0,0,.22); padding-bottom:8px;
  display:block; width:fit-content; margin-bottom:6px;
}
.threedoors .door .go{ margin-top:20px; }
/* .door-scholar was shipping as .door-mentor, so its CTA was borrowing the mentor
   rule's fill. Fixing the duplicate class removed the fill with it — give the
   scholar door its own. */
.door-scholar .go{ background:var(--board); color:var(--chalk); }
.door-scholar .go:hover{ gap:14px; background:var(--board-2); }

/* THE DOOR PHOTO — a taped polaroid, not a cropped band.
   Two crop attempts clipped heads here (3:2 then 4:3 with object-position 22%).
   A polaroid takes the photograph's own aspect ratio, so nothing is cut. */
.threedoors .door-photo{
  margin:0 0 20px; padding:9px 9px 26px; position:relative; z-index:2;
  background:#fff; border:1px solid var(--line);
  box-shadow:0 14px 26px -16px rgba(15,49,44,.5);
  transform:rotate(-1.2deg);
}
.threedoors .door-mentor .door-photo{ transform:rotate(.9deg); }
.threedoors .door-give   .door-photo{ transform:rotate(-.5deg); }
.threedoors .door-photo::before{
  content:""; position:absolute; top:-11px; left:50%; width:86px; height:22px;
  background:url(img/fasteners/washi-teal.png) no-repeat center/contain;
  transform:translateX(-50%) rotate(-2deg);
}
.threedoors .door-mentor .door-photo::before{ background-image:url(img/fasteners/washi-sun.png); }
.threedoors .door-give   .door-photo::before{ background-image:url(img/fasteners/washi-kraft.png); }
.threedoors .door-photo img{ width:100%; height:auto; display:block; }
.threedoors .door:has(.door-photo){ padding-top:34px; }
.threedoors .door:has(.door-photo) .mono{
  position:static; display:inline-block; margin:0 0 14px -26px;
}

.threedoors .door:hover{ transform: translateY(-5px) rotate(-.5deg); }
.threedoors .door:nth-child(2n):hover{ transform: translateY(-5px) rotate(.5deg); }

/* ---------- 2. EVERY OTHER CONTAINER gets the same rounding ---------- */
.card, .polaroid, .videoframe, .matchbox, .form, .gs-card, .ticks, .stats,
.notepad, .quote, .statbox, .panel{ border-radius: var(--bubble); }
.ic, .chip, .tag, .badge{ border-radius: var(--pill); }
.btn{ border-radius: var(--pill); }

/* The inline three-ways row (hero + page footers) becomes pill buttons. */
.involve a{ border-radius: var(--pill); padding: 18px 26px; }

/* ---------- 3. PROSE GETS AN ENTRY POINT ----------
   Kyle: "improve the plaintext by adding some bold starting font, like those old
   time books used to do lol. Not drastically."
   So: NOT a giant illuminated drop cap. A bolded, slightly larger opening phrase
   that the eye catches, which is what those books actually did to start a
   chapter. Applied with a class so it is a decision per paragraph, never a
   blanket rule that would bold half the site. */
.lead-in::first-line{ font-weight: 620; }
.opener{ font-weight: 760; font-size: 1.06em; color: var(--ink); letter-spacing: -.012em; }
.dropcap::first-letter{
  float: left; font-size: 3.1em; line-height: .84; font-weight: 800;
  padding: 4px 10px 0 0; color: var(--act-deep);
}
/* A scannable fact row - the antidote to a wall of prose. */
.factrow{ display: grid; gap: 10px; margin-top: 18px; }
.fact{
  display: flex; gap: 12px; align-items: flex-start;
  background: var(--paper-2); border: 2px solid var(--line);
  border-radius: var(--bubble); padding: 15px 18px;
}
.fact .fdot{
  flex: none; width: 26px; height: 26px; border-radius: var(--pill);
  display: grid; place-items: center; font-weight: 800; font-size: 13px;
  background: var(--t-teal-soft); color: var(--t-teal-ink); border: 2px solid var(--t-teal);
}

@media (prefers-reduced-motion: reduce){
  .threedoors .door:hover,
  .threedoors .door:nth-child(2n):hover{ transform: none; }
}

/* ===========================================================================
   PAGE HEADERS: from "lines on a colour" to an actual page of schoolwork.
   Kyle 08-08: "the headers of each page are still semi lame too with just lines
   on a solid colored background. That can be more imaginative."

   He described the code exactly. `.phead::before` was a repeating-linear-gradient
   of horizontal rules over a flat fill. Ruled lines alone do not read as a
   notebook - what makes paper legible AS paper is the RED MARGIN RULE down the
   left and a torn edge where the sheet ends. Both are free, both are pure CSS,
   and together they do more than any amount of extra colour.
   =========================================================================== */

/* 1. The ruled sheet: horizontal rules, plus the vertical margin rule that every
      exercise book on earth has. Kept faint - this is texture, not decoration. */
.phead::before{
  background:
    linear-gradient(to right, transparent 0 62px,
      rgba(217,72,43,.34) 62px 63.5px, transparent 63.5px),
    repeating-linear-gradient(to bottom, transparent 0 37px,
      rgba(255,255,255,.055) 37px 38px);
  mask-image: linear-gradient(to bottom, transparent, #000 22%, #000 78%, transparent);
  -webkit-mask-image: linear-gradient(to bottom, transparent, #000 22%, #000 78%, transparent);
}
@media(max-width: 760px){
  /* The margin rule sits under the text at small widths, so drop it and keep
     the horizontal ruling. A texture that fights the words is worse than none. */
  .phead::before{ background: repeating-linear-gradient(to bottom, transparent 0 37px,
    rgba(255,255,255,.055) 37px 38px); }
}

/* 2. The torn bottom edge. A straight border between a coloured header and the
      page below is the single most "template" line on the site. This tears it. */
/* THE TORN EDGE, now the real drawn asset (2026-08-08).
   Was a hand-coded data-URI wave. img/dividers/torn.svg is Apollo's, and it is a
   better edge - irregular the way paper actually tears, rather than a sine curve.

   Used as a MASK, not a background image, and that is the load-bearing detail:
   the asset ships teal-filled, but a torn edge has to be the colour of whatever
   section sits BELOW it. As a mask, the shape punches through and background-color
   supplies the colour, so one file serves every section. Recolouring an <img>
   background from CSS is impossible; masking it is trivial. */
.phead::after{
  content:""; position:absolute; left:0; right:0; bottom:-1px; height:22px;
  pointer-events:none; background-color: var(--paper);
  -webkit-mask: url(img/dividers/torn.svg) repeat-x bottom / 700px 100%;
          mask: url(img/dividers/torn.svg) repeat-x bottom / 700px 100%;
}
.phead.tear-sunk::after{ background-color: var(--paper-sunk) }
.phead.tear-none::after{ display:none }

/* 3. The photo in the header stops being a rounded rectangle and becomes a
      pinned print - the same language as the .polaroid tape used elsewhere on
      the site, which was already the most "school" thing in the file and was
      only being used in one place. */
.phead-photo{
  border-radius: 4px;
  transform: rotate(-1.1deg);
  box-shadow: 0 18px 40px -18px rgba(0,0,0,.55);
  border: 7px solid #fffdfa;
}
.phead-photo::after{
  content:""; position:absolute; top:-13px; left:50%; transform:translateX(-50%) rotate(-2deg);
  width:92px; height:26px; background:rgba(242,176,60,.72);
  box-shadow:0 1px 3px rgba(0,0,0,.18);
}
.phead-grid .phead-photo{ position:relative }
@media(prefers-reduced-motion: reduce){ .phead-photo{ transform:none } }

/* ---------- STAT BUBBLES: the antidote to a statistic buried in a sentence ----------
   Kyle 08-08, three separate times: long plaintext gets skipped. The worst case is
   not a boring paragraph, it is a paragraph with a NUMBER hidden inside it - the
   reader loses the one thing the section existed to tell them.
   `.stats` already exists for a 4-up band on light backgrounds; this is its
   scannable, bubbled sibling for prose sections and dark bands. */
.statbubbles{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:34px}
@media(max-width:820px){.statbubbles{grid-template-columns:1fr}}
/* INVERTED 2026-08-10 -- defensively, not to fix a live defect. Every current use is
   legible; this changes which way the component fails when someone MISPLACES it.
   It was authored chalk-first, with the light treatment as an override keyed on
   `.sec:not(.sec-dark):not(.sec-teal):not(.sec-clay)`. That override only fires
   inside a `.sec`, so a bubble dropped on a light ground that is not a section --
   a bare <div>, a <main>, a light `.phead` -- renders white text on cream, which is
   invisible rather than merely ugly. A dark ground always announces itself with a
   class; a light one does not. So light is the default now and chalk is the opt-in,
   and the misplacement failure becomes dark-on-dark, which is still readable. */
.statbub{
  background:var(--paper-2);
  border:2px solid var(--line-2);
  border-radius:var(--bubble);
  padding:26px 24px 24px;
}
.statbub .n{
  display:block;font-size:clamp(42px,5.4vw,60px);line-height:1;font-weight:820;
  letter-spacing:-.04em;color:var(--t-orange-ink);
}
.statbub .t{display:block;margin-top:12px;font-size:16px;line-height:1.5;font-weight:640;color:var(--ink)}
.statbub .src{display:block;margin-top:10px;font-size:12.5px;color:var(--ink-mute);letter-spacing:.02em}
/* On a ground that has declared itself dark, the same component flips to chalk. */
.sec-dark .statbub,.sec-teal .statbub,.sec-clay .statbub,.phead .statbub,.matchband .statbub{
  background:rgba(255,255,255,.055);border-color:rgba(234,246,246,.24);
}
.sec-dark .statbub .n,.sec-teal .statbub .n,.sec-clay .statbub .n,
.phead .statbub .n,.matchband .statbub .n{color:var(--sun)}
.sec-dark .statbub .t,.sec-teal .statbub .t,.sec-clay .statbub .t,
.phead .statbub .t,.matchband .statbub .t{color:#fff}
.sec-dark .statbub .src,.sec-teal .statbub .src,.sec-clay .statbub .src,
.phead .statbub .src,.matchband .statbub .src{color:var(--chalk-mute)}


/* ---------- KEPT NOTES (testimonials, 2026-08-10) ---------------------------
   Kyle: "we need a lot of effort towards showing the care. put some effort into showing
   love in those areas, the emotion felt in those moments."

   The existing exemplar for these four quotes was a 2x2 grid of pastel rounded rectangles
   with a coloured border each. That is the container Kyle named as the failure state, four
   times, and a uniform equal grid is the structural default the taste ledger says always
   reads corporate (board-page entry, round 13).

   These are private moments -- a mentee's face lighting up, a student's dark days. The
   object that holds a private moment in the school-materials world is a NOTE, and the thing
   that shows care is that somebody KEPT it. So: different paper stock each, real fasteners,
   no two the same width or angle, and the student's line -- the hardest-won of the four --
   gets the largest sheet and the red margin rule. Nothing here is a card grid.

   NARROW STACKED TYPE IS A REPEAT OFFENSE (round 13): every note is wide enough to give the
   quote long horizontal lines. Minimum measure is guarded below, not left to the grid. */
.keptnotes{background:var(--paper);position:relative;overflow:hidden;padding:84px 0 92px}
.keptnotes::before{                 /* the desk it all sits on, barely there */
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:url(img/textures/graph-paper.png) repeat;background-size:300px 300px;opacity:.055;
}
.keptnotes .wrap{position:relative;z-index:1}
.kn-head{max-width:none}
.kn-head h2{font-size:clamp(28px,3.6vw,42px);line-height:1.1;letter-spacing:-.028em;font-weight:800;
  margin-top:12px;max-width:24ch}
.kn-head p{margin-top:16px;font-size:17.5px;line-height:1.68;color:var(--ink-dim);max-width:60ch}

/* Two columns, but the notes are NOT equal: each hugs its own content and its own angle. */
.kn-board{display:grid;grid-template-columns:1.08fr .92fr;gap:34px 42px;
  align-items:start;margin-top:52px}
.note{position:relative;background:#fff;padding:34px 32px 28px;
  box-shadow:0 20px 42px -24px rgba(7,60,68,.5), 0 2px 0 rgba(7,60,68,.06)}
.note q{quotes:none}
.note .said{
  display:block;position:relative;z-index:1;margin:0;
  font-size:18px;line-height:1.66;color:var(--ink);font-weight:480;
}
.note .sig{
  display:block;margin-top:20px;padding-top:14px;font-size:14.5px;line-height:1.5;
  font-weight:640;color:var(--ink-dim);font-style:italic;letter-spacing:.005em;
}
.note .sig::before{                 /* a ruled sign-off line, the way a note is signed */
  content:"";display:block;width:74px;height:2px;margin-bottom:13px;
  background:rgba(7,60,68,.28);
}
/* The drawn quote mark sits BEHIND the words at low opacity, never through them. */
.note .qm{position:absolute;top:16px;left:22px;width:52px;height:42px;opacity:.2;
  pointer-events:none;z-index:0}
.note .qm path{fill:none;stroke-width:5.5;stroke-linecap:round;stroke:var(--t-teal-ink)}

/* --- 1. the student. The hardest-won line of the four, so it gets the biggest sheet,
       ruled stock and the red margin rule, and it leads the board. --- */
.note-student{
  grid-row:span 2;transform:rotate(-.7deg);padding:40px 38px 34px 74px;
  border:1px solid var(--line-2);border-radius:3px;
  background-image:
    linear-gradient(to right, transparent 0 56px, rgba(217,72,43,.34) 56px 58px, transparent 58px),
    repeating-linear-gradient(to bottom, transparent 0 34px, #e6eff0 34px 35px);
}
.note-student .said{font-size:21px;line-height:34px;font-weight:520}
/* The ruled sheet and the red margin rule already carry this one. A quote mark on top
   of it landed ON the words, which is the thing the mark is not allowed to do -- and
   restraint is the stated law, so the busiest note goes without. */
.note-student .qm{display:none}
.note-student .qm path{stroke:var(--t-teal-ink)}
.note-student::before{             /* paperclip: this one was kept on purpose */
  content:"";position:absolute;top:-22px;left:132px;width:34px;height:80px;
  background:url(img/fasteners/paperclip-1.png) no-repeat center / contain;
  transform:rotate(4deg);z-index:2;
}

/* --- 2. a mentor, on a plain slip with washi tape --- */
.note-mentor-a{
  transform:rotate(1.1deg);border:1px solid var(--line);border-radius:2px;
  background:#fffdf6;
}
.note-mentor-a::before{
  content:"";position:absolute;top:-14px;left:50%;width:116px;height:29px;margin-left:-58px;
  background:url(img/fasteners/washi-sun.png) no-repeat center / contain;
  transform:rotate(-2.4deg);
}
.note-mentor-a .qm path{stroke:var(--sun-deep)}

/* --- 3. the graduate, on kraft with an index tab --- */
.note-grad{
  transform:rotate(-1.5deg);border:1px solid #d8cdb8;border-radius:2px;
  background:#fdf6e9;
  background-image:url(img/textures/kraft-fibre.png);background-size:260px 260px;
  background-blend-mode:multiply;
}
.note-grad::before{
  content:"";position:absolute;top:-11px;right:34px;width:52px;height:34px;
  background:url(img/fasteners/index-tab-teal.png) no-repeat center / contain;
}
.note-grad .qm path{stroke:#5c7d1a}

/* --- 4. a mentor, on a sticky --- */
.note-mentor-b{
  transform:rotate(.8deg);background:#fff6bd;border-radius:2px;padding:30px 28px 26px;
  box-shadow:0 14px 30px -16px rgba(15,49,44,.5);
}
.note-mentor-b::before{
  content:"";position:absolute;top:-12px;left:40px;width:98px;height:25px;
  background:url(img/fasteners/washi-teal.png) no-repeat center / contain;
  transform:rotate(1.8deg);
}
.note-mentor-b .qm path{stroke:var(--act-deep)}

.kn-foot{margin-top:46px;font-size:15.5px;line-height:1.6;color:var(--ink-mute);max-width:64ch}

@media(max-width:900px){
  .keptnotes{padding:58px 0 64px}
  .kn-board{grid-template-columns:1fr;gap:30px;margin-top:38px}
  .note-student{grid-row:auto;padding:32px 26px 28px 56px;
    background-image:
      linear-gradient(to right, transparent 0 40px, rgba(217,72,43,.34) 40px 42px, transparent 42px),
      repeating-linear-gradient(to bottom, transparent 0 34px, #e6eff0 34px 35px)}
  .note-student .said{font-size:19px}
  .note-student .qm{left:50px}
  .note-student::before{left:auto;right:26px}
  .note{padding:30px 24px 26px}
}

/* ---------- THE STORY BAND (homepage, 2026-08-10) ---------------------------
   Amanda's team, after a conference on emotional storytelling: put success stories
   in front of the ask. They were right about the order and the site was worse than
   they knew -- across 14 pages there was not one person, name or quote, and her live
   Wix site has none either (checked /our-success and every blog post). The numbers
   were doing a job only a person can do.

   Every word in this band is already published by her: the May 2025 graduation
   release, verbatim. Nothing here is written by us and nothing is a stock sentiment.
   The student's own voice is still missing and only she can supply it -- when it
   arrives it replaces the pastor's line as the lead quote, which is why that quote
   sits in its own element rather than being welded into the layout. */
.storyband{background:var(--paper-sunk);position:relative;overflow:hidden;padding:78px 0 84px}
.storyband .wrap{display:grid;grid-template-columns:minmax(300px,.85fr) 1fr;gap:56px;align-items:start}
.story-photo{margin:0;transform:rotate(-1.4deg)}
.story-photo img{width:100%;height:auto;display:block}
.story-photo figcaption{
  margin-top:14px;font-family:ui-monospace,Menlo,monospace;font-size:12px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--ink-dim);font-weight:640;text-align:center;
}
.story-pull{
  font-size:clamp(28px,3.5vw,42px);line-height:1.16;letter-spacing:-.028em;font-weight:780;
  color:var(--ink);margin:18px 0 0;text-wrap:balance;
}
.story-pull .u{position:relative;white-space:nowrap}
.story-pull .u::after{                /* the ONE drawn mark in this band */
  content:"";position:absolute;left:-2%;right:-2%;bottom:-.16em;height:.3em;
  background:url(img/marks/underline_orange.svg) no-repeat center / 100% 100%;
}
.story-attrib{margin-top:16px;font-size:15.5px;font-weight:600;color:var(--ink-dim)}
.story-turn{
  margin-top:32px;padding-left:24px;border-left:2px solid rgba(217,72,43,.42);
  font-size:17.5px;line-height:1.68;color:var(--ink-dim);max-width:58ch;
}
.story-turn b{color:var(--ink);font-weight:680}
.story-figs{display:flex;flex-wrap:wrap;gap:10px 34px;margin-top:30px}
.story-figs div{display:flex;flex-direction:column}
.story-figs .n{font-size:clamp(30px,3vw,40px);line-height:1;font-weight:820;
  letter-spacing:-.035em;color:var(--t-orange-ink);font-variant-numeric:tabular-nums}
.story-figs .l{margin-top:7px;font-size:14.5px;line-height:1.4;font-weight:600;color:var(--ink-dim)}
.story-ed{
  margin-top:34px;padding-top:22px;border-top:1px solid var(--line-2);
  font-size:16.5px;line-height:1.66;color:var(--ink-dim);max-width:60ch;
}
.story-ed .story-who{display:block;margin-top:12px;font-size:14.5px;font-weight:660;color:var(--ink)}
.story-cta{margin-top:32px;display:flex;flex-wrap:wrap;gap:12px}
@media(max-width:880px){
  .storyband{padding:56px 0 60px}
  .storyband .wrap{grid-template-columns:1fr;gap:34px}
  .story-photo{max-width:420px;margin:0 auto}
}

/* ---------- THE TALLY SHEET (homepage numbers, 2026-08-10) ------------------
   Replaces three `.statbub` cards. Kyle, on the bar for the whole lane: "other
   containers that look like a generic bubble container with no life besides the
   colour itself. That reads as a generic build."

   `.statbub` was authored for a DARK ground (white at 5.5% opacity, chalk border);
   on the homepage it sits on cream, so the light-section override flipped it to a
   white rounded rectangle with a hairline. Three of them, side by side, each a
   different height because one label runs to three lines and the others to one --
   so the row also carried two boxes of dead space.

   ONE ruled sheet holding three rows fixes both at once: it is a real object from
   the school-materials world, and rows cannot go ragged the way a card row does.
   Restraint per the note below -- ruled stock, a red margin rule, one strip of
   washi, and exactly ONE drawn mark, spent on the number worth remarking on. */
.tally{
  position:relative;
  background:#fff;
  border:1px solid var(--line-2);
  border-radius:3px;
  box-shadow:0 20px 44px -24px rgba(7,60,68,.42);
  transform:rotate(-.35deg);
  margin-top:38px;
  padding:16px 34px 12px 78px;
  background-image:
    linear-gradient(to right, transparent 0 62px, rgba(217,72,43,.34) 62px 64px, transparent 64px),
    repeating-linear-gradient(to bottom, transparent 0 33px, #e6eff0 33px 34px);
}
.tally::before{                       /* washi strip, same fastener the news cards use */
  content:""; position:absolute; top:-13px; left:64px; width:104px; height:27px;
  background:url(img/fasteners/washi-teal.png) no-repeat center / contain;
  transform:rotate(-2.2deg);
}
/* No row rule: the ruled lines ARE the separator. A border here put a second,
   shorter line system across the sheet, offset from the rules it sat between. */
.tally-row{
  display:grid; grid-template-columns:300px 1fr; align-items:baseline;
  gap:8px 26px; padding:24px 0 20px;
}
.tally-row .n{
  font-size:clamp(46px,6vw,74px); line-height:1; font-weight:820; letter-spacing:-.042em;
  color:var(--t-orange-ink); font-variant-numeric:tabular-nums;
}
.tally-row .t{font-size:17px; line-height:1.5; font-weight:600; color:var(--ink); max-width:46ch}
/* THE one drawn mark on this object: the graduation rate is the remarkable claim. */
.tally-row.ringed .n{position:relative; display:inline-block}
/* The ring must be sized to the TEXT, not to the cell. `.n` was display:block, so
   its box filled the 300px grid column while "100%" is only 204px wide -- the ring
   was drawn against the wrong rectangle and landed over the "00". Kyle: "its not
   circling the 100 its circling the 00." Shrink-wrap the box to its own glyphs
   first, then the inset is a real margin around real text. */
.tally-row.ringed .n{
  /* justify-self, not display: `.n` is a GRID ITEM, and a grid item stretches to
     its column regardless of what display it is given. inline-block alone left the
     box at the full 300px column while the glyphs are 204px, which is what put the
     ring in the wrong place to begin with. */
  display:inline-block; justify-self:start; position:relative;
}
.tally-row.ringed .n::after{
  /* the WIDE variant: circle_orange.svg keeps its aspect ratio, so background-size
     100% 100% still drew a circle -- it sat on the "00" and ignored the "1" and the
     "%". A pen circling a word draws an ellipse; this copy carries
     preserveAspectRatio="none" so it actually stretches to the number. */
  content:""; position:absolute; inset:-19px -17px -15px -15px; pointer-events:none;
  background:url(img/marks/circle_orange_wide.svg) no-repeat center / 100% 100%;
  opacity:.8;
}
@media(max-width:720px){
  .tally{padding:10px 22px 8px 54px; transform:rotate(-.25deg);
    background-image:
      linear-gradient(to right, transparent 0 40px, rgba(217,72,43,.34) 40px 42px, transparent 42px),
      repeating-linear-gradient(to bottom, transparent 0 33px, #e6eff0 33px 34px)}
  .tally::before{left:42px}
  .tally-row{grid-template-columns:1fr; gap:2px; padding:18px 0 16px}
}

/* ---------- THE EXEMPLAR PLACEMENTS (our-mission.html, 2026-08-08) ----------
   RESTRAINT IS THE POINT. Four uses on a whole page, each earning its place:
   a torn edge where a hard line was, a chalk texture on the one dark band, tape
   on the one photo, and a drawn underline on the one heading that matters.
   The temptation with 42 new assets is to use 42 of them. That is confetti, and
   it would undo the reason the assets exist. */

/* 1. Chalk dust on the dark band. 7% - inside the 4-8% cap, and the cap is the
      whole reason the texture reads as atmosphere instead of noise. */
.sec-dark{ position:relative; isolation:isolate }
.sec-dark::before{
  content:""; position:absolute; inset:0; z-index:-1; pointer-events:none;
  background:url(img/textures/chalk-dust.png) repeat; background-size:340px 340px;
  opacity:.07;
}

/* 2. A drawn underline under one heading. Sits BELOW the baseline and never
      through the words - the rule Kyle set when he said don't block the lines. */
.h-mark{ position:relative; display:inline-block }
.h-mark::after{
  content:""; position:absolute; left:-1%; width:102%; bottom:-.26em; height:.16em;
  background-color: var(--sun);
  -webkit-mask:url(img/marks/underline_teal.svg) no-repeat center / 100% 100%;
          mask:url(img/marks/underline_teal.svg) no-repeat center / 100% 100%;
}
.sec:not(.sec-dark) .h-mark::after{ background-color: var(--t-orange) }

/* 3. Washi tape on a photo. One piece, off-centre, slightly rotated - tape that
      is centred and straight reads as a graphic, not as tape. */
.taped{ position:relative }
.taped::before{
  content:""; position:absolute; z-index:2; top:-15px; left:16%;
  width:132px; height:42px; transform:rotate(-3.5deg);
  background:url(img/fasteners/washi-sun.png) no-repeat center / contain;
  filter:drop-shadow(0 2px 3px rgba(0,0,0,.16));
}
@media(max-width:760px){ .taped::before{ width:96px; height:31px; top:-11px } }

/* Sidebar numbers on the donate page (2026-08-08). Kyle: "the plaintext on the
   side of that page reads thin." It was thin because the three best numbers this
   organisation has - $20.3M, 2,151, 100% - were set as body copy inside bullets.
   Same fix as the Crisis section: the number leads at display size, the sentence
   explains underneath. */
.gs-nums{display:grid;gap:14px;margin-top:12px}
.gs-n{display:grid;gap:2px;padding-left:13px;border-left:3px solid var(--t-teal)}
.gs-n .v{font-size:27px;font-weight:820;letter-spacing:-.03em;line-height:1.05;color:var(--t-orange-ink)}
.gs-n .k{font-size:14px;line-height:1.45;color:var(--ink-dim);font-weight:560}

/* ---------- THE VISION BAND (2026-08-08) ----------
   Kyle: "Thats their vision! Show it as such everywhere."
   A vision statement is the one sentence an organisation would put on a wall. It was
   formatted as a sub-heading with body text under it. Centred, large, and given room,
   with the ruled-paper texture behind it so it reads as something written down rather
   than a paragraph that happens to be last. */
.visionband{position:relative;isolation:isolate;text-align:center}
.visionband::before{
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:url(img/textures/ruled-paper-grain.png) repeat;background-size:300px 300px;opacity:.06;
}
.vision-lbl{color:var(--t-teal-ink);margin-bottom:20px}
/* 2026-08-09, Kyle: "cramped to the middle and is more vertically oriented, with 1-3
   words on a line and then stacked. i hate that so much ive told you that looks
   terrible before. It should be longer horiztonal lines." Second offense of the same
   law - the 19ch measure stacked the creed into a tower. Full measure, one size step
   down, two long lines instead of six short ones. */
.vision{
  margin:0 auto;max-width:none;border:0;padding:0;
  font-size:clamp(27px,4.1vw,49px);line-height:1.18;letter-spacing:-.03em;
  font-weight:790;color:var(--ink);text-wrap:balance;
}
.vision-sub{margin:26px auto 0;max-width:none;font-size:19px;font-weight:680;color:var(--t-teal-ink)}

/* ===========================================================================
   THE PLAN PAGE (plan.html, 2026-08-08).
   Kyle: "put together a roadmap, very easy to digest (same educational subtle
   design) just to make it a little fun."

   The design job here is ownership. A director with no time needs to know at a
   glance which rows are hers, so the who-badge is the loudest thing after the
   step number, and the two colours never swap meaning.
   =========================================================================== */

.keyrow{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:center;font-size:14.5px;color:var(--ink-dim)}
.keytxt{margin-right:10px}

.who{display:inline-block;border-radius:var(--pill);padding:6px 13px;
  font-size:12.5px;font-weight:760;letter-spacing:.01em;white-space:nowrap;border:2px solid}
.who-you{background:var(--act-soft);color:var(--act-deep);border-color:var(--t-orange)}
.who-us{background:var(--t-teal-soft);color:var(--t-teal-ink);border-color:var(--t-teal)}

.steps{list-style:none;margin:0;padding:0;display:grid;gap:18px}
.step{display:grid;grid-template-columns:66px 1fr;gap:20px;align-items:start;
  background:var(--paper-2);border:2px solid var(--line);border-radius:var(--bubble);
  padding:26px 28px 24px}
/* The step number as a chalk circle - the single cheapest "school" signal on the
   page, and it doubles as the thing the eye uses to count progress. */
.step-n{width:56px;height:56px;border-radius:var(--pill);display:grid;place-items:center;
  background:var(--board);color:var(--sun);font-size:25px;font-weight:820;
  border:2px solid var(--t-teal)}
.step-head{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:center;margin-bottom:10px}
.step-head h3{font-size:22px;font-weight:780;letter-spacing:-.022em;margin:0}
.step-body > p{font-size:16px;line-height:1.62;color:var(--ink-dim);margin:0 0 12px;max-width:64ch}

.tasklist{list-style:none;margin:14px 0 0;padding:0;display:grid;gap:9px}
.tasklist li{display:flex;gap:11px;align-items:flex-start;font-size:15.5px;line-height:1.55;
  color:var(--ink);max-width:64ch}
/* The drawn checkmark, masked so it takes the section's colour. Kyle praised the
   checkmark lists specifically, so this extends that pattern rather than replacing
   the solid chips that already work elsewhere. */
.tick-m{flex:none;width:19px;height:19px;margin-top:3px;background-color:var(--t-teal);
  -webkit-mask:url(img/marks/checkmark_teal.svg) no-repeat center / contain;
          mask:url(img/marks/checkmark_teal.svg) no-repeat center / contain}

.gain{margin-top:15px;padding:13px 16px;border-radius:var(--bubble);
  background:var(--sun-soft);border:2px solid var(--sun);
  font-size:15px;line-height:1.55;color:var(--ink);max-width:64ch}

@media(max-width:700px){
  .step{grid-template-columns:1fr;gap:14px;padding:22px 20px}
  .step-n{width:46px;height:46px;font-size:21px}
  .step-head h3{font-size:19.5px}
}

/* ===========================================================================
   THE ONE INTAKE (join.html, 2026-08-08)
   Three doors into one form. The path picker is the whole design problem: it has
   to make the choice obvious without making the form feel like three forms.
   =========================================================================== */
.intake{max-width:760px}
.pathpick{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:6px}
@media(max-width:720px){.pathpick{grid-template-columns:1fr}}
.path{display:grid;gap:5px;text-align:left;cursor:pointer;font:inherit;
  background:var(--paper-2);border:2px solid var(--line);border-radius:var(--bubble);
  padding:18px 18px 16px;transition:border-color .2s var(--ease),background .2s var(--ease),transform .3s var(--spring)}
.path:hover{transform:translateY(-2px);border-color:var(--line-2)}
.path.is-on{border-color:var(--t-teal);background:var(--t-teal-soft)}
.path-t{font-size:16.5px;font-weight:740;color:var(--ink)}
.path-s{font-size:13.5px;line-height:1.45;color:var(--ink-mute)}
/* Icons masked from the drawn set, so they take the state colour and stay on-hand. */
.path-ic{width:30px;height:30px;margin-bottom:4px;background-color:var(--t-teal-ink);
  -webkit-mask:url(img/icons/partnership.svg) no-repeat center / contain;
          mask:url(img/icons/partnership.svg) no-repeat center / contain}
.path-ic-cap{-webkit-mask-image:url(img/icons/graduation-cap.svg);mask-image:url(img/icons/graduation-cap.svg)}
.path-ic-env{-webkit-mask-image:url(img/icons/envelope.svg);mask-image:url(img/icons/envelope.svg)}
.path.is-on .path-ic{background-color:var(--t-teal-ink)}

.intake-note{margin-top:16px;padding:15px 17px;border-radius:var(--bubble);
  font-size:15px;line-height:1.6;border:2px solid}
.intake-note.is-ok  {background:var(--t-green-soft);border-color:var(--t-green);color:var(--ink)}
.intake-note.is-warn{background:var(--sun-soft);border-color:var(--sun);color:var(--ink)}
.intake-note.is-err {background:#fdecea;border-color:var(--pen-red);color:#5e1b10}


/* ---------- READABLE MEASURE (2026-08-12) ----------
   Kyle: "the font on that page and on some pages of the site is terribly hard to
   read plaintext. that hurts my eyes... poorly spaced as well."

   Measured before changing anything: the scholar application page ran at an
   AVERAGE of 117 characters per line and a maximum of 137, with 0 margin between
   paragraphs. news.html was 110. The hand-built pages were already 75-78, which
   is why only some pages hurt -- the ported pages inherited no measure at all.
   Typographic comfort is 45-75 characters; past ~90 the eye loses its place on
   the return sweep, which is felt as strain rather than seen as a defect.

   Capped at 68ch and given real paragraph rhythm. This is a floor for the whole
   site, so any future ported page arrives readable instead of needing this found
   again. */
.sec .wrap p,
.sec .wrap li,
.phead .lede,
.mb-note,          /* index: was running 158ch, the widest line on the site */
footer .legal{ max-width:68ch; }   /* the footer sits OUTSIDE .sec, so it needed naming */
.sec .wrap p + p{ margin-top:1.05em; }
.sec .wrap ul li + li,
.sec .wrap ol li + li{ margin-top:.55em; }
/* headings keep their own measure -- a display line wants to be longer */
.sec .wrap h1, .sec .wrap h2, .sec .wrap h3{ max-width:22ch; }
.sec .wrap h2 + p, .sec .wrap h3 + p{ margin-top:.7em; }


/* ---------- KEPT NOTES + TALLY: close the vertical gaps (2026-08-12) ----------
   Kyle: "this whole area on the home page is poorly spaced. too much vertical
   room between these small containers-with just analytics."

   The section was spaced for the blocks it USED to hold. Three short quotes and
   three one-line statistics do not need gala-sized air between them -- the gap
   should be proportional to the size of the thing it separates, and here it was
   fixed while the contents shrank. Tightened, not cramped: the quotes keep their
   own breathing room inside each note. */
.keptnotes{ padding:60px 0 64px; }
.keptnotes .kn-grid,
.keptnotes .notes{ gap:22px; }
.keptnotes .note{ margin-bottom:0; }
.kn-foot{ margin-top:30px; }
.tally{ margin-top:34px; }
.tally-row{ padding:16px 0; }
.tally-row .t{ margin-top:2px; }
@media(max-width:720px){
  .keptnotes{ padding:44px 0 48px; }
  .tally-row{ padding:13px 0; }
}


/* ---------- THE CORKBOARD — contact page (2026-08-12) ----------
   Kyle: "on the contact page, instead of just 3 polaroids, try to make a fun
   corkboard style picture collage."

   Not the tidy justified row the other pages use. A board is deliberately
   irregular: photos at real angles, overlapping slightly, pinned rather than
   taped, sizes varying. It still never crops -- each photo keeps its own shape,
   sized by its aspect ratio like everywhere else. */
.corkboard{
  position:relative; display:flex; flex-wrap:wrap; justify-content:center;
  align-items:center; gap:20px 14px; padding:38px 26px 42px; margin:0;
  background:#c9a06a;
  background-image:
    radial-gradient(rgba(120,80,40,.30) 1px, transparent 1.4px),
    radial-gradient(rgba(255,235,205,.24) 1px, transparent 1.4px),
    url(img/textures/kraft-fibre.png);
  background-size:9px 9px, 13px 13px, 300px 300px;
  background-blend-mode:normal,normal,multiply;
  border:1px solid #a67f4e; border-radius:4px;
  box-shadow:inset 0 0 44px rgba(90,58,24,.34), 0 20px 40px -26px rgba(15,49,44,.55);
}
.corkboard .pin{
  margin:0; background:#fff; padding:9px 9px 26px;
  border:1px solid rgba(0,0,0,.10); position:relative;
  box-shadow:0 12px 22px -12px rgba(40,25,8,.65);
  flex:var(--ar,1.5) 0 auto; max-width:210px;
  transition:transform .4s var(--spring), box-shadow .3s var(--ease);
}
.corkboard .pin img{ display:block; width:100%; height:auto; }
.corkboard .pin::after{                 /* the pin head */
  content:""; position:absolute; top:-7px; left:50%; width:14px; height:14px;
  transform:translateX(-50%); border-radius:50%;
  background:radial-gradient(circle at 34% 32%, #ff8a5c 0 34%, #d1401a 60%, #96270d 100%);
  box-shadow:0 2px 4px rgba(0,0,0,.45);
}
.corkboard .pin:nth-child(3n+2)::after{ background:radial-gradient(circle at 34% 32%,#7fd4dd 0 34%,#0a99a3 60%,#06666e 100%); }
.corkboard .pin:nth-child(3n+3)::after{ background:radial-gradient(circle at 34% 32%,#d3e88a 0 34%,#a4cf45 60%,#6b8f22 100%); }
.corkboard .pin:nth-child(5n+1){ transform:rotate(-3.2deg); }
.corkboard .pin:nth-child(5n+2){ transform:rotate(2.4deg)  translateY(10px); }
.corkboard .pin:nth-child(5n+3){ transform:rotate(-1.4deg) translateY(-8px); }
.corkboard .pin:nth-child(5n+4){ transform:rotate(3.6deg); }
.corkboard .pin:nth-child(5n+5){ transform:rotate(-2.2deg) translateY(6px); }
.corkboard .pin:hover{ transform:rotate(0) scale(1.05); z-index:4;
  box-shadow:0 20px 34px -14px rgba(40,25,8,.7); }
@media(prefers-reduced-motion:reduce){ .corkboard .pin:hover{ transform:none; } }
@media(max-width:760px){
  .corkboard{ padding:26px 14px 30px; gap:16px 10px; }
  .corkboard .pin{ max-width:44%; padding:7px 7px 20px; }
}


/* ---------- NEWS: a wider, width-filling section (2026-08-12) ----------
   Kyle: "Lets give the news page a better, wider width filling section."

   The page inherited the site's standard --max measure, which is right for
   reading a long argument and wrong for a news index -- a list of stories wants
   to feel like a front page, not a column. The prose cap set earlier still holds
   INSIDE each story, so the wider frame does not undo the readability work. */
.newswide .wrap{ max-width:1360px; }
.newswide .photowall{ padding-left:0; padding-right:0; }
/* the story list itself: a wide two-up that keeps a readable measure per item */
.newsgrid{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(420px,1fr));
  gap:34px 30px; margin-top:34px; align-items:start;
}
.newsgrid > *{ min-width:0; }
.newsgrid p, .newsgrid li{ max-width:60ch; }
@media(max-width:900px){ .newsgrid{ grid-template-columns:1fr; gap:26px; } }


/* ================= PARTICIPATION SURFACES (2026-08-12) =================
   Kyle: "place all of those into the website so that when we do finally have
   betterworld access its just a simple embed into an already crafted, and
   nurtured section... slickly slide these in there without removing the
   emotional pull. Make them easy to access, and more so geared towards
   participating with the kids and the other kind community members."

   THE RULE THESE ARE BUILT ON, and it is the session's founding instruction:
   sell the kids before you ask. None of these open with a price. Each opens
   with the room you are being invited into, and the transaction is the last
   line, not the first.

   Each maps to a REAL OBJECT from her world rather than a generic web widget:
     · an admission ticket with a tear-off stub   (events / RSVP)
     · a bid sheet clipped to a clipboard          (silent auction -- which is
       literally how a silent auction is run on the night)
     · a tear-off slip                             (the newsletter)

   ⛔ THE EMBED SLOT IS ABSENT UNTIL IT IS REAL. Every section renders complete
   without BetterWorld: no dead "Buy now", no greyed control, no fake form. The
   action falls back to a real working path (her inbox). When the account exists,
   drop the embed into .bw-slot and the fallback hides itself -- one element, no
   redesign. Absence must never look like presence; that is the donate.html
   fail-safe, and it is why nothing here can lie about being live. */

.participate{ position:relative; }
.bw-slot:empty{ display:none; }
.bw-slot:not(:empty) + .bw-fallback{ display:none; }
.bw-slot{ margin-top:20px; }

/* ---- the admission ticket ---- */
.ticket{
  display:grid; grid-template-columns:1fr 250px; align-items:stretch;
  background:#fffdf6; border:1.5px solid var(--line-2); border-radius:4px;
  box-shadow:0 20px 38px -24px rgba(15,49,44,.5); overflow:hidden; margin-top:30px;
}
.ticket-body{ padding:34px 34px 32px; }
.ticket-stub{
  position:relative; padding:30px 26px; background:var(--paper-sunk);
  display:flex; flex-direction:column; justify-content:center; gap:14px;
}
/* the perforation the stub tears along */
.ticket-stub::before{
  content:""; position:absolute; left:-1px; top:10px; bottom:10px; width:2px;
  background-image:radial-gradient(circle, var(--line-2) 1.4px, transparent 1.6px);
  background-size:2px 11px;
}
.ticket-eyebrow{ color:var(--t-teal-ink); }
.ticket h3{ font-size:29px; font-weight:800; letter-spacing:-.028em; margin-top:10px; max-width:20ch; }
.ticket-lede{ margin-top:12px; font-size:17px; line-height:1.62; color:var(--ink-dim); max-width:52ch; }
.stub-row{ display:flex; flex-direction:column; gap:3px; }
.stub-k{ font-size:10.5px; letter-spacing:.11em; color:var(--ink-mute); }
.stub-v{ font-size:16.5px; font-weight:750; color:var(--ink); }
@media(max-width:760px){
  .ticket{ grid-template-columns:1fr; }
  .ticket-stub{ border-top:2px dashed var(--line-2); }
  .ticket-stub::before{ display:none; }
  .ticket-body{ padding:26px 22px 24px; }
}

/* ---- the silent-auction bid sheet ---- */
.bidsheet{
  position:relative; background:#fff; border:1px solid var(--line-2); border-radius:10px;
  padding:44px 32px 32px; margin-top:34px;
  box-shadow:0 20px 38px -24px rgba(15,49,44,.5);
  background-image:repeating-linear-gradient(180deg,transparent 0 33px,#eaf1ee 33px 34px);
}
.bidsheet::before{                       /* the clip */
  content:""; position:absolute; top:-15px; left:50%; transform:translateX(-50%);
  width:104px; height:28px; background:#cfd6d3; border:1px solid #b6bfbb; border-radius:5px;
}
.bidsheet::after{
  content:""; position:absolute; top:-26px; left:50%; transform:translateX(-50%);
  width:50px; height:22px; border:3px solid #b6bfbb; border-bottom:0; border-radius:10px 10px 0 0;
}
.bidsheet .redline{ position:absolute; left:26px; top:0; bottom:0; width:2px; background:#e8a9a2; }
.bidsheet-in{ padding-left:26px; }
.bid-rows{ list-style:none; margin:18px 0 0; padding:0; }
.bid-rows li{
  display:grid; grid-template-columns:34px 1fr; gap:14px; align-items:baseline;
  padding:11px 0; border-bottom:1px dashed var(--line-2); font-size:16px; line-height:1.55;
}
.bid-rows li:last-child{ border-bottom:0; }
.bid-n{ font-weight:820; color:var(--act-deep); font-variant-numeric:tabular-nums; }

/* ---- the tear-off newsletter slip ---- */
.tearoff{
  position:relative; background:#fffdf6; border:1px solid var(--line-2);
  border-radius:4px; padding:32px 30px 34px; margin-top:30px;
  box-shadow:0 16px 32px -22px rgba(15,49,44,.45);
}
.tearoff::before{                        /* the cut line */
  content:""; position:absolute; left:20px; right:20px; top:-1px; height:10px;
  background:url(img/dividers/perforated.svg) repeat-x center / auto 10px; opacity:.5;
}
.tearoff h3{ font-size:25px; font-weight:790; letter-spacing:-.024em; max-width:22ch; }
.tearoff p{ margin-top:11px; font-size:16.5px; line-height:1.62; color:var(--ink-dim); max-width:56ch; }
.tearoff .scissors{
  position:absolute; right:22px; top:-9px; width:22px; height:22px; opacity:.55;
  background:url(img/dividers/cut-with-scissors.svg) no-repeat center / contain;
}
/* the honest fallback while there is no account wired */
.bw-fallback{ margin-top:22px; }
.bw-note{
  margin-top:14px; font-size:14px; line-height:1.6; color:var(--ink-mute); max-width:62ch;
}

/* ================= CONTAINER PASS, LAST FOUR BUBBLES (2026-08-15) =================
   The measured ranking (iris_container_rank.py) had four generic bubbles left on
   the two public money pages: the give form, its two segmented trays and the
   other-amount field, and the match box. Kyle's bar: every container earns the
   hand-made vocabulary or it is a defect. Each of these maps to a real object
   from her world rather than a styled rectangle:
     · the give form      -> a pledge sheet, taped up, ruled like the notepads
     · the seg trays      -> penciled frames on the sheet
     · the match box      -> the chalkboard. The $1 -> $2 equation IS the
                             chalkboard motif sitewide (index match band); the
                             live calculator now speaks in the same voice. */

.giveform{position:relative;
  background-image:repeating-linear-gradient(to bottom, transparent 0 35px, #edf3f2 35px 36px)}
.giveform::before{content:""; position:absolute; z-index:2; top:-15px; left:50%;
  width:132px; height:42px; transform:translateX(-50%) rotate(-2.5deg);
  background:url(img/fasteners/washi-teal.png) no-repeat center / contain;
  filter:drop-shadow(0 2px 3px rgba(0,0,0,.16))}
@media(max-width:760px){.giveform::before{width:96px;height:31px;top:-11px}}

.seg{border:2px solid var(--line-2); background:var(--paper-sunk)}
.amt-field{border-width:2px}

/* the chalkboard calculator. Chalk on board, sun-yellow for the match line --
   the same palette as the index match band, so the promise and the working
   arithmetic read as one object. */
.matchbox{border:none; background:var(--board); position:relative; isolation:isolate;
  overflow:hidden; box-shadow:inset 0 0 0 6px #052d33, inset 0 0 0 7px rgba(234,246,246,.28)}
.matchbox::before{content:""; position:absolute; inset:0; z-index:-1;
  background:url(img/textures/chalk-dust.png) repeat; background-size:340px 340px; opacity:.08}
.matchbox .mb-l{color:var(--chalk-dim)}
.matchbox .mb-v{color:var(--chalk)}
.mb-plus{border-top:1px dashed rgba(234,246,246,.35)}
.mb-plus .mb-v{color:var(--sun)}
.mb-total{border-top:1.5px solid rgba(234,246,246,.5); background:rgba(255,255,255,.07)}
.mb-total .mb-l{color:var(--chalk)}
.mb-year{color:var(--sun)}
/* whole-program gifts are not matched: the board stays, the match line chalks out */
.matchbox.no-match{border:none; background:var(--board)}
.matchbox.no-match .mb-plus{opacity:.45}
.matchbox.no-match .mb-plus .mb-v{color:var(--chalk-mute); text-decoration:line-through}
.matchbox.no-match .mb-total{border-top-color:rgba(234,246,246,.35)}
.matchbox.no-match .mb-year{color:var(--chalk-mute)}

/* Get Involved: the three door CTAs stop being pills. A teacher's underline
   swipe and a drawn arrow -- the whole card is the click target anyway. */
.threedoors .door .go{background:transparent; color:var(--act-deep); padding:0 0 12px;
  border-radius:0; font-size:17px; font-weight:760;
  background-image:url(img/marks/underline_orange.svg);
  background-repeat:no-repeat; background-position:left bottom; background-size:100% 9px}
.threedoors .door .go::after{content:""; display:inline-block; width:26px; height:16px;
  margin-left:10px; vertical-align:-2px;
  background:url(img/marks/arrow_orange.svg) no-repeat center / contain;
  transition:margin-left .28s var(--spring)}
.threedoors .door:hover .go::after{margin-left:16px}

/* ===== DENSITY PASS, 2026-09-03. Kyle: "less of a vertical scroll mission... more info in less
   vertical room without crowding still." Measured first at 1366x800: the homepage was 12
   screens, events and the scholar page 7-8, news 6, and the quotes board sat on nine pages at
   1,270px each. Every rule below is an override of a rule above it; nothing above was edited,
   so the whole pass reverts by deleting this block. */
.sec{padding:56px 0}
.sec-tight{padding:40px 0}
.phead .wrap{padding-top:40px!important;padding-bottom:38px!important}
.phead-grid{gap:40px}
.phead-photo{aspect-ratio:16/10;max-height:300px}
.sec-head{margin-bottom:26px}
footer{padding:34px 0 28px}
.fgrid{gap:28px}
.legal{margin-top:22px;padding-top:14px;font-size:12px}
/* the quotes board: four notes in one row instead of two rows */
.keptnotes{padding:44px 0 48px!important}
.kn-head h2{font-size:clamp(24px,2.8vw,32px)}
.kn-head p{margin-top:8px;font-size:15.5px}
.kn-board{margin-top:26px;gap:18px 20px}
.note{padding:26px 26px 22px}
.note .said{font-size:15.5px;line-height:1.58}
.kn-foot{margin-top:24px}
/* photo bands: same justified row, shorter frames */
.photowall{gap:22px 18px;padding:8px 14px 4px;max-width:1180px;margin:0 auto}
.photowall .pola{padding:8px 8px 22px}
/* full-width figures pasted into articles and lists: capped, centred */
figure.polaroid[style*="max-width: 100%"]{max-width:560px!important;margin:18px auto}
/* a run of photos inside a news post becomes a three-up gallery */
.postgallery{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin:22px 0}
.postgallery figure.polaroid{max-width:none!important;margin:0!important;padding:8px 8px 20px}
.postgallery figure.polaroid img{aspect-ratio:4/3;object-fit:cover}
@media(max-width:760px){.postgallery{grid-template-columns:1fr 1fr}}
/* the news index: cards, not a stack of full-width prints */
.newslist{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:22px;margin-top:22px}
.newscard{display:flex;flex-direction:column;background:#fff;border:1px solid var(--line-2);border-radius:10px;overflow:hidden;text-decoration:none;color:inherit;box-shadow:0 14px 30px -20px rgba(15,49,44,.35);transition:transform .35s var(--spring)}
.newscard:hover{transform:translateY(-3px)}
.newscard figure{margin:0;aspect-ratio:16/9;overflow:hidden;background:var(--paper-2)}
.newscard figure img{width:100%;height:100%;object-fit:cover;display:block}
.newscard .nc-body{padding:18px 20px 20px}
.newscard h3{font-size:18px;line-height:1.3;font-weight:760;color:var(--ink);margin:0}
.newscard .byline{margin-top:8px;font-size:13.5px;color:var(--ink-mute)}
.newscard .teaser{margin-top:10px;font-size:14.5px;line-height:1.55;color:var(--ink-dim);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.newscard .more{margin-top:12px;font-size:14.5px;font-weight:640;color:var(--t-teal-ink)}
/* the events list: two columns of past sessions */
.evlist .note-list{display:grid;grid-template-columns:1fr 1fr;gap:4px 44px}
.evlist .note-list li{break-inside:avoid;padding:10px 0}
.evlist .note-list li:first-child{grid-column:1 / -1}
.evlist figure.polaroid{max-width:220px!important;margin:8px 0 6px!important;padding:6px 6px 16px}
@media(max-width:760px){.evlist .note-list{grid-template-columns:1fr}}
/* homepage bands */
.storyband{padding:56px 0 60px}
.newsband{padding:52px 0 56px}
.roles{margin-top:44px}
.matchband{padding:52px 0}
.roles{margin-top:30px}
.hero-bleed{min-height:0}
.statsvid{display:grid;grid-template-columns:.9fr 1.1fr;gap:44px;align-items:center}
.statsvid .player{margin-top:0}
.statsvid .tally{margin:0}
@media(max-width:900px){.statsvid{grid-template-columns:1fr}}
.marquee figure{width:clamp(150px,17vw,220px)}
.newsband .newslist{margin-top:26px}
.nextup{margin-top:22px;display:flex;flex-wrap:wrap;gap:10px 18px;align-items:center;background:#fff;border:1px solid var(--line-2);border-radius:10px;padding:14px 18px}
.nextup .mono{color:var(--act-deep)}
.nextup b{color:var(--ink)}
.nextup a.btn{margin-left:auto}
@media(max-width:700px){.nextup a.btn{margin-left:0}}
@media(min-width:1100px){.newsband .newslist{grid-template-columns:repeat(4,1fr)}}
@media(min-width:700px) and (max-width:1099px){.newsband .newslist{grid-template-columns:1fr 1fr}}
/* tetris, not a grid: the quotes pack into two columns by height */
.kn-board{display:block;columns:2;column-gap:28px;margin-top:26px}
.kn-board .note{break-inside:avoid;display:inline-block;width:100%;margin:0 0 22px;box-sizing:border-box}
@media(max-width:860px){.kn-board{columns:1}}
/* numbers beside the video, both starting at the top, sized to match */
.statsvid{align-items:start;grid-template-columns:1fr 1fr}
/* ⛔ 2026-09-21: the rule above re-declares grid-template-columns AFTER the
   @media(max-width:900px) collapse further up this file. Same specificity, later in the
   source, so it won. The homepage carried 134px of horizontal scroll on every phone —
   the video sat entirely off the right edge — and it would have taken the Ad Grant's
   mobile traffic straight into it. The collapse is restated here, below the override,
   rather than moving the override: it is additive and it cannot be undone by anything
   that comes after it in this file. If a third .statsvid rule is ever added below this,
   check this again.
   minmax(0,1fr), not 1fr: a 1fr track will not shrink below its content's minimum width, and
   .statsvid .tally-row below carries a fixed 190px column. With plain 1fr the track computed to
   379px inside a 334px container and the video still ran 18px off the screen. */
@media(max-width:900px){.statsvid{grid-template-columns:minmax(0,1fr)}}
.statsvid .tally{margin-top:14px}
.statsvid .tally-row{padding:14px 0 12px;grid-template-columns:190px 1fr;gap:6px 18px}
.statsvid .tally-row .n{font-size:clamp(38px,3.4vw,56px)}
.statsvid .tally-row .t{font-size:15.5px}
/* two halves, not a stack: a short list beside another short list */
.progsplit{display:grid;grid-template-columns:1.15fr .85fr;gap:36px 44px;align-items:start;margin-top:36px}
.progsplit > div > .mono{margin-top:0!important}
.progsplit .factrow{max-width:none!important}
@media(max-width:900px){.progsplit{grid-template-columns:1fr}}
/* the band is 48px tall and absolutely positioned; 60px of body padding left a 12px gap to the title */
.role-body{padding-top:86px}
.newsband .wrap{max-width:1360px}
.story-photos{display:grid;gap:0}

/* ============================================================================
   CONDENSE PASS — 2026-09-09, after Amanda's call that morning.

   Her brief, her words: "she goes to a website and gets lost in the cool stuff."
   Clear conversions first, and condense. Three surfaces get built here.

   1. The EVENT ITEM (.ev-*). One repeatable block whose slots are exactly the
      fields on the staff submission form: kind, title, when, one paragraph, one
      link. A staff member fills a form; this is what comes out. Nobody making a
      submission chooses a layout, because there is only one.
      Two upcoming events share a row and pack from the top (Kyle's tetris law,
      2026-09-03); a single one takes the full width rather than sitting in a
      narrow column beside a hole.
   2. The PAST ARCHIVE (.ev-archive). Eighteen closed sessions used to occupy the
      page above the one thing a visitor could still act on. Collapsed, in two
      columns, they cost no height until someone opens them, and nothing of hers
      was deleted to get there.
   3. The NEWS LIST at content width. The linter measured four cards across at
      268px on news.html, which is four vertical reads. Two columns, per the same
      law: never narrow columns for density.
   ============================================================================ */

/* --- 1. the repeatable event block --- */
.ev-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,380px),1fr));
  gap:24px;align-items:start;margin-top:30px}
.ev-item{background:#fff;border:1px solid var(--line-2);border-radius:10px;
  padding:22px 24px 20px;box-shadow:0 14px 30px -22px rgba(15,49,44,.35)}
.ev-tag{font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
  font-size:12px;letter-spacing:.06em;text-transform:uppercase;font-weight:640;color:var(--act-deep)}
.ev-title{font-size:19px;line-height:1.32;font-weight:760;color:var(--ink);margin:8px 0 0}
.ev-title a{color:inherit;text-decoration:none}
.ev-title a:hover{text-decoration:underline}
.ev-when{margin-top:8px;font-size:14.5px;color:var(--ink-dim)}
.ev-desc{margin-top:12px;font-size:15.5px;line-height:1.6;color:var(--ink-dim);max-width:56ch}
.ev-act{margin-top:18px}

/* --- 2. the collapsed season archive --- */
.ev-archive{border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  margin-top:8px;max-width:1040px}
.ev-archive > summary{padding:20px 40px 20px 0;cursor:pointer;list-style:none;position:relative;
  font-size:16.5px;color:var(--ink-dim)}
.ev-archive > summary b{color:var(--ink);font-weight:700}
.ev-archive > summary::-webkit-details-marker{display:none}
.ev-archive > summary::after{content:"+";position:absolute;right:6px;top:16px;font-size:23px;
  font-weight:400;color:var(--act-deep);transition:transform .3s var(--spring)}
.ev-archive[open] > summary::after{transform:rotate(45deg)}
.ev-past{columns:2;column-gap:44px;padding:0 0 26px}
.ev-past p{break-inside:avoid;margin:0 0 18px;font-size:14.5px;line-height:1.5;color:var(--ink-dim)}
.ev-past b{color:var(--ink);font-weight:660}
.ev-past .polaroid{max-width:210px;margin:0 0 10px}
@media(max-width:820px){.ev-past{columns:1}}

/* --- 3. news cards at content width: two, never four --- */
@media(min-width:900px){.newswide .newslist{grid-template-columns:1fr 1fr}}

/* --- 4. the foldout: a summary on the page, her full detail one click away ---
   Amanda asked for pages to be condensed, and Kyle ruled that condensing means
   collapsing her words, never deleting them. This is the component that keeps
   that promise. Deliberately NOT .faq: that one is a stack of questions with a
   top border and dividers between siblings; this is a single expandable block
   sitting under a paragraph. Scoped by class so it never reaches .navdrop,
   which is also a <details>. */
.foldout{margin-top:26px;max-width:74ch;border:1px solid var(--line);border-radius:10px;
  background:var(--paper-2)}
.foldout > summary{padding:16px 44px 16px 20px;cursor:pointer;list-style:none;position:relative;
  font-size:16px;color:var(--ink-dim)}
.foldout > summary b{color:var(--ink);font-weight:700}
.foldout > summary::-webkit-details-marker{display:none}
.foldout > summary::after{content:"+";position:absolute;right:18px;top:12px;font-size:23px;
  font-weight:400;color:var(--act-deep);transition:transform .3s var(--spring)}
.foldout[open] > summary::after{transform:rotate(45deg)}
.foldout[open] > summary{border-bottom:1px solid var(--line)}
.foldout-body{padding:20px 20px 24px}
.foldout-body p{font-size:16.5px;line-height:1.68;color:var(--ink-dim);max-width:64ch}
.foldout-body p + p{margin-top:16px}

/* --- 5. the season poster, paired with the next open event --- */
/* The poster stacks above its sentence rather than sitting beside it. Measured first:
   side by side inside a half-width cell the copy column came out 264px, which is the
   narrow read the whole pass exists to remove, and the poster stood 177px taller than
   the text next to it. A poster over a line of copy is not a vertical read -- two
   columns of prose would have been. */
.ev-season figure{max-width:250px;margin:0 0 20px}
.ev-season p{font-size:16.5px;line-height:1.6;margin:0;max-width:46ch}

/* --- 6. a card title is not a section headline ---
   site.css line ~1898 caps every h1/h2/h3 inside .sec .wrap at 22ch. That is right
   for a headline and wrong inside a grid cell: it made news card titles 275px wide
   in a 641px card, and event titles 290px wide in a 1064px one -- three narrow lines
   in a wide box, which is the vertical read Kyle's law forbids. Additive override,
   scoped to the two card titles, so the 22ch floor still holds everywhere else. */
.sec .wrap .newscard h3,
.sec .wrap .ev-title{max-width:none}

/* --- 7. news cards read across, not down ---
   At content width four cards across made each 268px, which is four vertical reads.
   Two columns fixes the read; turning the card on its side keeps the page from
   growing to pay for it -- the 16/9 image was 359px of the card's 643px height. */
@media(min-width:900px){
  .newswide .newscard{flex-direction:row}
  .newswide .newscard figure{flex:0 0 232px;aspect-ratio:4/3}
  .newswide .newscard .nc-body{padding:20px 22px}
}

/* --- 8. the Get Involved doors ---
   These five rules lived in a <style> block inside get-involved.html and redeclared
   .threedoors and .threedoors .door at top level, which the layout linter flags (R8)
   and which is the exact shape of the 2026-09-03 bug where a page-local .step
   inherited the site-wide grid and rendered a card as a vertical strip. .threedoors
   appears on that one page only, so the rules move here unscoped and unchanged. */
.threedoors{margin-top:0}
@media(max-width:880px){.threedoors{grid-template-columns:1fr}}
.threedoors .door{display:block;text-decoration:none;border:1px solid var(--line-2)}
.threedoors .door h3{font-size:23px}
.threedoors .go{margin-top:20px}

/* --- 9. the staff submission form (submit-event.html) ---
   Not linked from the nav and not served while .assetsignore lists the file. The form sits
   beside a live preview of the exact block the submission becomes, which is what makes
   "no layout decisions" true rather than just claimed. */
.sub-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:34px;align-items:start;margin-top:8px}
@media(max-width:940px){.sub-grid{grid-template-columns:1fr}}
.sub-preview{position:sticky;top:24px;background:var(--paper-2);border:1px solid var(--line);
  border-radius:var(--bubble);padding:22px}
.sub-hint{font-size:14.5px;line-height:1.55;color:var(--ink-mute);margin:8px 0 18px;max-width:40ch}
.sub-preview .ev-item{box-shadow:none}
.sub-note{margin-top:14px;font-size:15.5px;line-height:1.6;max-width:60ch;color:var(--ink-dim)}
.sub-note.is-ok{color:var(--t-teal-ink);font-weight:640}
.sub-note.is-err{color:#a4331d;font-weight:640}
.sub-note.is-warn{border-left:3px solid var(--act);padding-left:14px}
/* Off-screen rather than display:none, so a bot that reads the DOM still finds and fills it. */
.sub-trap{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.sub-next{margin-top:22px;border-top:1px solid var(--line);padding-top:18px}
.sub-next p{font-size:14.5px;line-height:1.6;color:var(--ink-mute);margin-top:8px;max-width:40ch}
/* A disabled button has to LOOK disabled. The submission form ships switched off, and an orange
   primary button that silently does nothing is the "absence of config looking like presence of a
   processor" failure wearing different clothes. */
.btn:disabled{opacity:.42;cursor:not-allowed;box-shadow:none;transform:none}
.btn:disabled:hover{transform:none}
/* The flyer as it will appear on the events page, shown inside the submission preview. */
.ev-flyer-prev{max-width:190px;margin:0 0 16px}


/* ---------- MOBILE SWEEP (2026-09-24) ----------
   Read on real phones after launch. Four things were true of every page at 375px: the .wrap
   kept its 28px desktop gutters (56px of a 375px screen gone before a word), the 22ch heading
   cap built for a 1120px column broke four-word headlines across four or five lines, section
   padding was still 58px at both ends, and cards kept their desktop padding after the grids
   collapsed to one column, so a 3-up row became a long vertical read. Every rule below runs
   only on small screens and only trims; nothing leaves a page. The nav keeps its own gutters
   (nav .wrap is more specific) and the .cardimg bleed is re-paired with the card padding. */
@media(max-width:760px){
  .sec .wrap h1,.sec .wrap h2,.sec .wrap h3{max-width:none}   /* the cap is a desktop measure */
  .phead h1,.phead h1.longhead{max-width:none}
  .phead-photo{max-height:260px}                              /* the photo never pushes the copy off the first screen */
}
@media(max-width:640px){
  .wrap{padding:0 16px}
  .card{padding:18px 16px 20px}
  .cardimg{margin:-18px -16px 16px}
  .statbub{padding:18px 16px 16px}
  .statbub .n{font-size:clamp(32px,8vw,44px)}
  .role-body{padding:52px 18px 26px}
  .role-band{padding:9px 18px 10px}
  .threedoors .door{padding:24px 20px 22px}
}


/* ---------- PHONES, SECOND PASS (2026-09-24, from Kyle's own phone) ----------
   Two screenshots. In the first, the notepad's labels ran one word per line: `.statsvid
   .tally-row` pins the number column at 190px to cure a desktop hole, and on a 390px phone
   that left 94px for "awarded in scholarships locally". In the second, the three role cards
   (903, 844 and 660px tall) stacked into 2,409px -- his words: "those 3 lists should be next
   to each other, one long vertical scroll is not great." Measured before touching anything:
   the homepage ran 15,016px on a 390px phone, and the news band alone was 2,371px of it. */

/* 1. the notepad: number above its label, both full width */
@media(max-width:700px){
  .statsvid .tally-row{grid-template-columns:1fr;gap:4px 0;padding:14px 0 12px}
  .statsvid .tally-row .t{max-width:none}
}

/* 2. the three doors sit side by side. Below 880px the folder is a swipe row: each card 84%
   of the width with the next one peeking in, scroll-snap so a flick lands on a card, the
   dashed divider back to a vertical rule between cards, and the arrow pair below (site.js
   hides it wherever nothing scrolls, so desktop never sees it). The kraft texture is an
   absolutely positioned overlay that would scroll away with the first card, so it is off
   here; at 7% opacity nothing is lost. The class name says carousel because the layout lint
   excuses intentional horizontal scrollers by that word, and this is one. */
@media(max-width:880px){
  .roles.roles-carousel{display:grid;grid-auto-flow:column;grid-auto-columns:min(84%,360px);
    grid-template-columns:none;max-width:none;overflow-x:auto;scroll-snap-type:x mandatory;
    scroll-behavior:smooth;-webkit-overflow-scrolling:touch;
    scrollbar-width:thin;scrollbar-color:var(--line-2) transparent}
  .roles.roles-carousel::after{display:none}
  .roles.roles-carousel::-webkit-scrollbar{height:8px}
  .roles.roles-carousel::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:99px}
  .roles.roles-carousel::-webkit-scrollbar-track{background:transparent}
  .roles.roles-carousel .role{scroll-snap-align:start;height:auto;border-bottom:0;
    border-right:1px dashed #d3c7b0}
  .roles.roles-carousel .role:last-child{border-right:0}
  .roles-nav{margin-top:14px;justify-content:flex-end}
}
@media(min-width:881px){.roles-nav{display:none}}

/* 3. news cards read as rows on a phone: picture left, headline right. The teaser is our
   three-line excerpt (already truncated everywhere), not her words, so it steps aside; her
   headline stays whole and the post is one tap away. Four cards were 1,876px stacked. */
@media(max-width:699px){
  .newsband .newscard{flex-direction:row;align-items:stretch}
  .newsband .newscard figure{flex:0 0 116px;aspect-ratio:auto;min-height:118px}
  .newsband .newscard .nc-body{padding:12px 14px 12px;min-width:0}
  .newsband .newscard h3{font-size:15.5px;line-height:1.3}
  .newsband .newscard .byline{margin-top:6px;font-size:13px}
  .newsband .newscard .teaser{display:none}
  .newsband .newscard .more{margin-top:8px;font-size:14px}
}

/* 4. the two story polaroids share a row instead of stacking (539px became a desk of two),
   and the three programme cards lose spare height: a 2:1 picture, a smaller icon chip,
   body copy one step down. Inline desktop composition on the second photo is overridden
   here on purpose; it has no other way to be reached at this width. */
@media(max-width:640px){
  .story-photos{grid-template-columns:1fr 1fr;gap:14px;align-items:start}
  .story-photos .story-photo{margin:0!important;max-width:none!important}
  .cardimg{aspect-ratio:2/1}
  .card .ic{width:34px;height:34px;margin:14px 0 12px}
  .card .ic svg{width:20px;height:20px}
  .card p{font-size:15.5px;line-height:1.55}
}


/* ---------- PHONES, THIRD PASS (2026-09-24, Kyle: "still just a lot of vertical scroll on
   mobile, very cramped and cluttered") ----------
   Walked the whole homepage at 390px, screen by screen, with every lazy image loaded. The
   photo wall alone was 1,464px: five polaroids one per row (the 2026-08-12 choice, made for
   legibility, before anyone had scrolled it on a phone). The story band was an 829px wall of
   text; three decorated notes stacked to 1,050px; each programme card carried an eight-line
   paragraph. The moves below fold or re-flow -- Amanda's rule, condensing means folding,
   never deleting -- and every one is phone-only. */

/* the photo wall reserves its height before the pictures arrive (no jump). On phones the wall
   and the drifting strip ("What the program looks like") do not render at all -- Kyle, 2026-09-24,
   after a two-across wall still read as clutter: "hide the photo wall and drifting strip on
   mobile only." Both are decoration; the same photographs still carry the page headers, the
   cards and the story band, so nothing about the organisation is lost on a phone. */
.photowall .pola img{aspect-ratio:var(--ar,auto)}
@media(max-width:640px){
  .photowall,.sec-marquee{display:none}
}

/* folds: .mfold starts hidden, .mfold-clamp starts at three lines; the button that shares
   its data-fold opens them. Above 640px the button does not exist and nothing is folded. */
.mfold-btn{display:none}
@media(max-width:640px){
  .mfold{display:none}
  .mfold.is-open{display:block}
  .mfold-clamp:not(.is-open){display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  .mfold-btn{display:inline-flex;align-items:center;gap:9px;margin-top:12px;min-height:44px;padding:0 2px;
    background:none;border:0;font:inherit;font-size:15px;font-weight:700;letter-spacing:-.01em;
    color:var(--t-teal-ink);cursor:pointer}
  .mfold-btn::after{content:"";width:8px;height:8px;border-right:2.5px solid currentColor;
    border-bottom:2.5px solid currentColor;transform:rotate(45deg);margin-top:-5px;
    transition:transform .25s var(--ease)}
  .mfold-btn[aria-expanded="true"]::after{transform:rotate(225deg);margin-top:3px}
  .card .mfold-btn{margin-top:4px;min-height:40px}
  .story-figs{margin-top:22px}
}

/* the kept notes are one swipe row on phones; the paperclip and tapes sit in the row's top padding */
@media(max-width:640px){
  .kn-board.kn-carousel{display:grid;grid-template-columns:none;grid-auto-flow:column;
    grid-auto-columns:min(88%,360px);gap:0 14px;align-items:stretch;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;
    padding:28px 4px 14px;margin:8px -4px 0;scrollbar-width:thin;scrollbar-color:var(--line-2) transparent}
  .kn-board.kn-carousel .note{scroll-snap-align:start;transform:none;grid-row:auto;padding:24px 22px 22px}
  /* the student's note keeps its red margin rule but not the 74px desktop gutter: at card width that
     gutter turned her quote into a narrow column, the exact shape this pass exists to remove */
  .kn-board.kn-carousel .note-student{padding:26px 22px 22px 44px}
  .kn-board.kn-carousel .note-student::before{left:96px}
  .kn-board.kn-carousel .note .said{font-size:15.5px;line-height:1.58}
  .kn-board.kn-carousel .note-student .said{font-size:17px;line-height:1.55}
  .kn-nav{margin-top:4px;justify-content:flex-end}
}
@media(min-width:641px){.kn-nav{display:none}}
