/* ==========================================================================
   Plan-T | home
   Self-hosted fonts, zero third-party requests.
   ========================================================================== */

@font-face{font-family:'Outfit';src:url('../fonts/outfit-latin.woff2') format('woff2');font-weight:300 700;font-style:normal;font-display:swap}
@font-face{font-family:'Public Sans';src:url('../fonts/publicsans-latin.woff2') format('woff2');font-weight:100 900;font-style:normal;font-display:swap}
@font-face{font-family:'Public Sans';src:url('../fonts/publicsans-italic-latin.woff2') format('woff2');font-weight:300 600;font-style:italic;font-display:swap}
@font-face{font-family:'Caveat';src:url('../fonts/caveat-sub.woff2') format('woff2');font-weight:600;font-style:normal;font-display:swap}

:root{
  --ink:#14180b;        /* hero */
  --deep:#17210c;       /* impact */
  --banner:#161e0b;     /* questions banner */
  --brown:#211808;      /* footer */
  --green:#3f5213;      /* CTA green */
  --orange:#d87026;
  --cream:#f6f2e8;
  --paper:#fbfaf6;
  --leaf:#7a9b4e;
  --rule:rgba(33,24,8,.14);
  --rule-l:rgba(246,242,232,.16);
  --wrap:1216px;
  --gap:104px;         /* half the 208px Brian wants between sections */
  /* Type scale, verbatim from the PLAN-T brand system. Nothing on this page
     may use a size that is not one of these steps. Headings are Outfit
     SemiBold, body is Public Sans Regular. */
  --t-display:80px; --t-display-lh:88px;
  --h-xl:60px;      --h-xl-lh:72px;
  --h-lg:48px;      --h-lg-lh:56px;
  --h-md:36px;      --h-md-lh:44px;
  --h-sm:28px;      --h-sm-lh:36px;
  --h-xs:20px;      --h-xs-lh:28px;
  --b-xl:24px;      --b-xl-lh:36px;
  --b-lg:20px;      --b-lg-lh:30px;
  --b-md:18px;      --b-md-lh:28px;
  --b-sm:16px;      --b-sm-lh:24px;
  --b-xs:14px;      --b-xs-lh:20px;
  --cap:12px;       --cap-lh:16px;
  /* the two display figures Brian sized by hand: the hero line and the
     numbers, Outfit 128 on 128 */
  --t-hero:128px;   --t-hero-lh:128px;
  --ease:cubic-bezier(.22,1,.36,1);
  --pop:cubic-bezier(.34,1.56,.64,1);
}

/* narrower screens move one step down the scale. Every value below is still
   a step of the brand scale, never a size in between. */
@media (max-width:1100px){
  :root{
    --t-hero:80px;  --t-hero-lh:88px;
    --h-xl:48px;    --h-xl-lh:56px;
    --h-lg:36px;    --h-lg-lh:44px;
    --h-md:28px;    --h-md-lh:36px;
    --b-xl:20px;    --b-xl-lh:30px;
  }
}
@media (max-width:700px){
  :root{
    --t-hero:60px;  --t-hero-lh:72px;
    --h-xl:36px;    --h-xl-lh:44px;
    --h-lg:28px;    --h-lg-lh:36px;
    --h-md:20px;    --h-md-lh:28px;
    --b-xl:18px;    --b-xl-lh:28px;
    --b-lg:18px;    --b-lg-lh:28px;
  }
}

*,*::before,*::after{box-sizing:border-box}
/* clip, not hidden: hidden on the body alone turns it into its own scroll
   container and leaves a strip of html showing beside the scrollbar */
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;
  overflow-x:clip;background:var(--paper)}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:'Public Sans',system-ui,sans-serif;font-size:var(--b-sm);line-height:var(--b-sm-lh);
  -webkit-font-smoothing:antialiased;overflow-x:clip;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3,h4{font-family:'Outfit',system-ui,sans-serif;margin:0;letter-spacing:-.02em}
p{margin:0}
.wrap{width:100%;max-width:var(--wrap);margin-inline:auto;padding-inline:24px}

/* ---------- shared type ---------- */
.h2{font-size:var(--h-xl);line-height:var(--h-xl-lh);font-weight:600}
.h2--cream{color:var(--cream)}
.h3{font-size:var(--h-xl);line-height:var(--h-xl-lh);font-weight:600}
.lead{font-size:var(--b-lg);line-height:var(--b-lg-lh);max-width:64ch;opacity:.82;margin-top:24px}
/* every small caps label reads in the menu's face, Public Sans SemiBold */
.kicker{font-family:'Public Sans',system-ui,sans-serif;font-size:var(--cap);line-height:var(--cap-lh);font-weight:600;letter-spacing:.14em;text-transform:uppercase;opacity:.6}

/* ---------- buttons ----------
   The plate grows a touch and a disc of ink opens from the middle, after
   Codrops' "Locate" button (ButtonHoverStyles, MIT), redrawn in our own
   colours: each variant sets its plate, its ink and the label it turns to. */
.btn{
  position:relative;display:inline-flex;align-items:center;gap:.5em;white-space:nowrap;
  font-family:'Outfit',system-ui,sans-serif;font-size:var(--b-lg);font-weight:600;line-height:var(--b-lg-lh);
  padding:0;border:0;background:none;color:var(--btn-fg);isolation:isolate;
  --btn-r:8px;--btn-pad:12px 24px;
}
.btn__bg{
  position:absolute;inset:0;z-index:-1;border-radius:var(--btn-r);overflow:hidden;
  background:var(--btn-bg);
  transition:transform 0.4s cubic-bezier(.1,0,.3,1);
}
.btn:hover .btn__bg,.btn:focus-visible .btn__bg{transform:scale3d(1.05,1.11,1)}
/* the disc opens from the centre */
.btn__bg::before{
  content:"";position:absolute;top:50%;left:50%;width:118%;height:0;padding-bottom:118%;
  border-radius:50%;background:var(--btn-ink);
  transform:translate3d(-50%,-50%,0) scale3d(0,0,1);
}
.btn:hover .btn__bg::before,.btn:focus-visible .btn__bg::before{
  transition:transform 0.4s cubic-bezier(.1,0,.3,1);
  transform:translate3d(-50%,-50%,0) scale3d(1,1,1);
}
/* and the corners fill in behind it, so nothing of the plate is left showing */
.btn__bg::after{
  content:"";position:absolute;inset:0;background:var(--btn-ink);
  opacity:0;transition:opacity 0.3s;
}
.btn:hover .btn__bg::after,.btn:focus-visible .btn__bg::after{
  opacity:1;transition-duration:0.01s;transition-delay:0.3s;
}
.btn__label{display:block;padding:var(--btn-pad);transition:color 0.25s var(--ease) .1s}
.btn:hover .btn__label,.btn:focus-visible .btn__label{color:var(--btn-fg-on)}

.btn--orange{--btn-bg:var(--orange);--btn-ink:var(--brown);--btn-fg:#fff;--btn-fg-on:#fff}
.btn--ghost{--btn-bg:var(--brown);--btn-ink:var(--orange);--btn-fg:var(--cream);--btn-fg-on:#fff}
.btn--pale{--btn-bg:var(--cream);--btn-ink:var(--green);--btn-fg:var(--ink);--btn-fg-on:var(--cream)}
.nav__cta{font-size:var(--b-md);line-height:var(--b-md-lh);--btn-pad:8px 24px}

/* ==========================================================================
   NAV
   ========================================================================== */
.nav{position:fixed;inset:0 0 auto 0;z-index:60;padding:48px 0;
  transition:background 0.26s var(--ease),padding 0.26s var(--ease)}
/* edge to edge, with the 64px side inset Brian asked for */
.nav__inner{width:100%;max-width:none;padding-inline:64px;
  display:flex;align-items:center;justify-content:space-between;gap:24px}
.nav__logo img{height:24px;width:auto;transition:filter 0.25s}
.nav__links{display:flex;align-items:center;gap:30px;font-family:'Public Sans',system-ui,sans-serif;font-weight:600;
  font-size:var(--b-md);line-height:var(--b-md-lh);color:var(--cream);transition:color 0.25s}
.nav__item{display:flex;align-items:center}
.nav__links a{position:relative;padding-block:4px}
.nav__links a::after{content:"";position:absolute;left:0;right:100%;bottom:0;height:1px;
  background:currentColor;opacity:.5;transition:right 0.25s var(--ease)}
.nav__links a:hover::after{right:0}
.nav__links a.is-active{color:var(--orange)}
/* la pagina donde estas queda subrayada en naranja, no solo coloreada */
.nav__links a.is-active::after{right:0;background:var(--orange);opacity:1;height:2px}

/* Learn dropdown */
.nav__item{position:relative}
/* no panel, no card: the sub items simply hang under the parent */
/* the sub items sit on their own dark plate, so they read over any section */
.drop{position:absolute;left:-18px;top:calc(100% + 14px);min-width:220px;
  padding:12px 18px 14px;border-radius:10px;
  background:var(--ink);
  opacity:0;pointer-events:none;transform:translateY(8px);
  transition:opacity 0.25s var(--ease),transform 0.25s var(--ease)}
/* an invisible bridge, so the pointer can cross the gap without closing it */
.nav__item::after{content:"";position:absolute;left:0;right:0;top:100%;height:16px}
.nav__item:hover .drop,.nav__item:focus-within .drop{
  opacity:1;pointer-events:auto;transform:none}
.drop>a{display:block;padding:8px 0;font-size:var(--b-sm);line-height:var(--b-sm-lh);white-space:nowrap;opacity:.78;color:var(--cream)}
.drop>a:hover{opacity:1}
.drop>a::after{left:0;right:100%}
.drop>a:hover::after{right:0}
/* one single bar for the whole page: dark ink, settles when you scroll */
.nav.is-scrolled{padding:14px 0;background:rgba(20,24,11,.94)}

/* ==========================================================================
   HERO
   ========================================================================== */
.hero{position:relative;min-height:100svh;background:var(--ink);color:var(--cream);
  display:flex;flex-direction:column;justify-content:center;overflow:hidden;isolation:isolate}
.hero__media{position:absolute;inset:0;z-index:-2}
.hero{--mx:70%;--my:45%;--px:0px;--py:0px}
.hero__poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:.82;transform:scale(1.06) translate3d(var(--px),var(--py),0)}
.hero__video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;
  transform:scale(1.06) translate3d(var(--px),var(--py),0);
  transition:opacity 0.7s var(--ease);will-change:transform}
.hero__video.is-playing{opacity:.82}
/* dark where the words live, open on the right so the forest reads.
   The veil is masked away around the pointer, so the forest surfaces
   wherever the cursor goes. */
.hero__media::after{content:"";position:absolute;inset:0;
  background:
    linear-gradient(90deg,rgba(20,24,11,.94) 0%,rgba(20,24,11,.88) 26%,
      rgba(20,24,11,.52) 52%,rgba(20,24,11,.16) 76%,rgba(20,24,11,.06) 100%),
    radial-gradient(70% 70% at 24% 46%,rgba(20,24,11,.55) 0%,rgba(20,24,11,0) 70%);
  -webkit-mask-image:radial-gradient(circle 320px at var(--mx) var(--my),
    rgba(0,0,0,.42) 0%,rgba(0,0,0,.78) 46%,#000 78%);
  mask-image:radial-gradient(circle 320px at var(--mx) var(--my),
    rgba(0,0,0,.42) 0%,rgba(0,0,0,.78) 46%,#000 78%)}
.hero__scrim{position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(20,24,11,.62) 0%,rgba(20,24,11,0) 22%,
    rgba(20,24,11,0) 58%,rgba(20,24,11,.92) 92%,var(--ink) 100%)}

.hero__inner{width:100%;max-width:var(--wrap);margin-inline:auto;padding:0 24px;position:relative;z-index:2}
.hero__title{font-size:var(--t-hero);line-height:var(--t-hero-lh);font-weight:600;letter-spacing:-.035em}
/* room under the mask for the descender of the g, taken back so the leading holds */
.hero__title .line{display:block;overflow:hidden;padding-bottom:.2em;margin-bottom:-.2em}
.hero__title .tm{font-size:.3em;vertical-align:top;line-height:1;position:relative;top:.22em;letter-spacing:0;font-weight:500}
.hero__title .w{display:block;transform:translateY(105%);
  animation:rise .72s var(--ease) forwards}
.hero__title .line:nth-child(2) .w{animation-delay:.08s}
.hero__title .accent{color:var(--orange)}
@keyframes rise{to{transform:translateY(0)}}

.hero__sub{margin-top:8px;max-width:44ch;font-size:var(--b-xl);line-height:var(--b-xl-lh);opacity:0;
  animation:fadeUp .6s var(--ease) .3s forwards}
.hero__cta{display:flex;gap:16px;margin-top:36px;opacity:0;
  animation:fadeUp .6s var(--ease) .42s forwards}
@keyframes fadeUp{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}

/* logos ride an endless slider, paused on hover */
.hero__brands{position:absolute;left:0;right:0;bottom:44px;z-index:2;
  opacity:0;animation:fadeUp .65s var(--ease) .58s forwards;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent)}
.marquee{display:flex;width:max-content}
.marquee__row{display:flex;align-items:center;gap:clamp(40px,5.4vw,80px);
  padding-right:clamp(40px,5.4vw,80px);flex:0 0 auto;
  animation:slide 34s linear infinite}
.hero__brands:hover .marquee__row{animation-play-state:paused}
@keyframes slide{to{transform:translateX(-100%)}}
.hero__brands img{height:auto;width:auto;max-height:26px;opacity:.62;
  filter:grayscale(1) brightness(2.2);transition:opacity 0.25s}
.hero__brands img:hover{opacity:1}
.hero__brands img[alt="SayTrees"]{max-height:30px}
.hero__brands img[alt="St. Mark's School of Texas"]{max-height:16px}
.hero__brands img[alt="Southwestern Medical District"]{max-height:24px}

/* ==========================================================================
   DIVIDERS
   ========================================================================== */
.divider{position:relative;line-height:0;z-index:5}
.divider--wave{height:clamp(70px,9vw,130px);margin-top:-1px}
.divider--wave svg{width:100%;height:100%;display:block}

/* a skein of birds crosses where the thin line used to be */

/* ==========================================================================
   MISSION
   ========================================================================== */
/* the statement is a normal block: it writes itself as it comes up and simply
   scrolls away while the meadow arrives. No pin, so no blank frame between. */
.mission{background:var(--paper);padding:var(--gap) 0 48px}
.mission__inner{display:block}
.mission__text{
  width:100%;max-width:calc(var(--wrap) - 30px);margin-inline:auto;padding-inline:24px;
  font-family:'Outfit',system-ui,sans-serif;font-weight:600;font-size:var(--h-md);line-height:var(--h-md-lh);
  letter-spacing:-.02em;
}
.mission__text .word{display:inline-block;transition:color 0.25s linear,opacity 0.25s linear;
  color:rgba(20,24,11,.14)}
.mission__text .word.on{color:var(--ink)}
.mission__text .pbreak{display:block;height:.75em}

/* ==========================================================================
   METHOD
   ========================================================================== */
.method{background:var(--paper);padding:0 0 0}
/* the paper lets go into the white of the section below */
.method::after{content:"";display:block;height:clamp(80px,10vw,120px);
  background:linear-gradient(180deg,var(--paper) 0%,#fdfcfa 45%,#fff 100%)}
/* same column as every other section, so the left edge lines up down the page */
.method__head .lead{max-width:60ch}
/* the method reads in two columns, so the block is wider and shorter */
.method__head .lead{max-width:1000px;
  columns:2;column-gap:clamp(36px,5vw,72px);text-wrap:pretty}
@media (max-width:820px){
  :root{--gap:56px}
.method__head .lead{columns:1}}

/* the drawing holds still while the four layers arrive one at a time */
.method__pin{position:relative;height:300vh;margin-top:clamp(32px,4vw,56px)}
.method__stage{position:sticky;top:0;height:100svh;display:grid;place-items:center}
/* a quarter smaller, so the drawing sits in the page instead of filling it */
.forest{position:relative;width:75%;aspect-ratio:1647/955;max-width:1080px;margin-inline:auto}
/* a few butterflies drift over the canopy */
.flutter{position:absolute;inset:0;z-index:4;pointer-events:none}
.forest__layer{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;
  transform-origin:50% 100%;
  opacity:0;transform:translateY(6%) scale(.965);
  transition:opacity 0.67s var(--ease),transform 0.75s var(--ease)}
.forest__layer.on{opacity:1;transform:none}

/* the names are written by hand onto the plate itself, each one lying along
   the layer it belongs to */
.method__legend{position:absolute;inset:0;margin:0;padding:0;list-style:none;z-index:6;
  pointer-events:none}
.method__legend li{position:absolute;left:var(--x);top:var(--y);
  transform:rotate(var(--rot));transform-origin:left center;
  opacity:0;transition:opacity 0.35s var(--ease)}
.method__legend li.on{opacity:1}
.method__legend .lbl{font-family:'Caveat',cursive;font-weight:600;
  font-size:var(--h-sm);line-height:1;color:var(--ink);
  display:inline-block;white-space:nowrap;
  /* the nib passes left to right, so the word appears as it is written */
  -webkit-mask-image:linear-gradient(90deg,#000 0 var(--ink-pos,0%),
    rgba(0,0,0,.4) calc(var(--ink-pos,0%) + 4%),transparent calc(var(--ink-pos,0%) + 9%));
  mask-image:linear-gradient(90deg,#000 0 var(--ink-pos,0%),
    rgba(0,0,0,.4) calc(var(--ink-pos,0%) + 4%),transparent calc(var(--ink-pos,0%) + 9%));
  transition:-webkit-mask-image 0.64s var(--ease),mask-image 0.64s var(--ease)}
.method__legend li.on .lbl{--ink-pos:104%}
.method__legend .def{display:none}

/* the plate runs edge to edge and tucks up under the flock: the picture
   carries a band of its own sky at the top */
/* the plate is built from five depths of planting and one of sky. It holds
   still while the layers arrive, then lets the page go on. */
.wood{position:relative;width:100%;height:170svh;margin-top:0;z-index:1}
.wood__stage{position:sticky;top:0;width:100%;height:100svh;overflow:hidden;isolation:isolate}
/* edge to edge while the plot is low, and the camera steps back just enough
   as the forest gains height, so the treetops always arrive complete */
.wood__forest{position:absolute;left:50%;bottom:0;z-index:2;width:100%;
  aspect-ratio:2000/1333;
  transform:translateX(-50%) translateY(calc(19% - 24px));transform-origin:50% 100%}
/* the second reading lands exactly where the statement stood, over the open
   sky of the young plot */
.wood__stage .method__head{position:absolute;left:0;right:0;top:0;z-index:7;
  padding-top:calc(var(--gap) - 40px);padding-bottom:56px;
  opacity:0;transform:translateY(18px);will-change:transform,opacity;
  background:linear-gradient(180deg,var(--paper) 55%,rgba(251,250,246,0) 100%)}
.method__head{padding-top:clamp(24px,3.4vw,48px)}
.wl{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:fill;
  opacity:0;pointer-events:none;user-select:none;
  will-change:transform,opacity;transform:translate3d(0,26px,0) scaleY(.985);
  transform-origin:50% 70%;backface-visibility:hidden}
/* the sky keeps a soft focus, set once, never recomputed */
.wl--sky{filter:blur(1.6px)}
/* sky and the emergent crowns sit behind, the ground in front */
.wl--sky{z-index:0}
.wl--emerg{z-index:1}
.wl--tall{z-index:2}
.wl--grass{z-index:3}
.wl--small{z-index:4}
.wl--edge{z-index:5}

/* the flock crosses the sky of the stage, above the young forest */
.wood__birds{position:absolute;left:0;top:7svh;width:100%;height:clamp(90px,10vw,130px);
  z-index:3;pointer-events:none}
.wood__flies{position:absolute;inset:0;z-index:6;overflow:hidden;pointer-events:none}
.bfly{position:absolute;top:0;left:0;display:block;width:clamp(20px,2.3vw,44px);
  color:var(--wing,#d87026);opacity:0;will-change:transform,opacity}
.bfly svg{display:block;width:100%;height:auto;overflow:visible}
.bfly .w{transform-origin:50% 60%;animation:flap var(--flap,.2s) ease-in-out infinite alternate}
.bfly .wl{fill:currentColor}
.bfly .w path{fill:currentColor}
.bfly .bd{fill:#2b2415}
.bfly .wr{animation-delay:-.05s}
@keyframes flap{from{transform:scaleX(1)}to{transform:scaleX(.28)}}

@media (prefers-reduced-motion:reduce){
  .wood{height:auto}
  .wood__stage{position:static;height:auto}
  .wood__forest{position:relative;top:auto;transform:none}
  .wl{opacity:1;transform:none}
  .bfly,.bfly .w{animation:none}
}

/* ==========================================================================
   IMPACT
   ========================================================================== */
.impact{position:relative;background:#fff;color:var(--ink);
  /* the wood above ends in a lot of sky: the readings climb into it */
  margin-top:clamp(-90px, -90px + (100vw - 1440px) * 0.26, 48px);
  padding:40px 0 var(--gap)}
/* and the white lets go into the cream of the one after it */
.impact::after{content:"";position:absolute;left:0;right:0;bottom:0;
  height:clamp(160px,20vw,300px);pointer-events:none;
  background:linear-gradient(180deg,rgba(246,242,232,0) 0%,rgba(246,242,232,.45) 55%,var(--cream) 100%)}
.impact .kicker{color:var(--green);opacity:1}
.impact .h2--cream{color:var(--ink)}

/* the numbers: the whole block holds still while the four readings load.
   Text swaps in place on the left, the photo wipes on the right. */
/* one screen each: the readings hand over on their own clock, no pinning */
.arch{position:relative;margin-top:96px}
/* only as tall as its content, so the 96px above it is the real gap */
.arch__inner{display:grid;grid-template-columns:minmax(0,.78fr) minmax(0,1fr);
  gap:clamp(24px,4vw,56px);align-items:center;
  width:100%;max-width:var(--wrap);margin-inline:auto;padding-inline:24px}
.arch__left{position:relative;height:min(62svh,560px)}
.arch__left .beat{position:absolute;inset:0;display:flex;flex-direction:column;
  justify-content:center;padding-right:2vw;opacity:0;
  transform:translateY(26px);will-change:transform,opacity}
/* the picture bleeds to the right edge of the screen, never onto the words */
.arch__right{position:relative;aspect-ratio:3/2;max-height:min(84svh,720px);margin-bottom:-15px;
  justify-self:stretch;margin-right:calc(-1 * max(0px,(100dvw - var(--wrap)) / 2 + 24px))}
/* 15px shorter than the frame, so the pictures sit a touch lower and flatter */
.imgstack{position:absolute;inset:0 0 15px 0;width:100%;height:auto;
  border-radius:16px;overflow:hidden;background:#e8e2d4}
.img-wrapper{position:absolute;inset:0;overflow:hidden}
.img-wrapper img{width:100%;height:100%;object-fit:cover;object-position:0 0%;
  will-change:object-position}

/* ==========================================================================
   The six benefits, drawn and animated. No photographs, no player library.
   ========================================================================== */
.arch--flip .imgstack{background:#f4f1e6}
/* each drawing carries its own paper, so it hides the one behind it */
.arch--flip .img-wrapper{background:#f4f1e6}
.fig{width:100%;height:100%;display:block}
.fig *{stroke:var(--green);stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
.fig circle,.fig ellipse{fill:none}
.fig .ground{stroke:rgba(33,24,8,.3)}

/* 1. cleaner air: the stream comes in loaded and leaves clean */
.fig--air .stream{stroke:rgba(63,82,19,.35);stroke-dasharray:14 12;
  animation:flow 3.4s linear infinite}
.fig--air .s2{animation-duration:4.2s}
.fig--air .s3{animation-duration:3.8s;animation-delay:-1s}
.fig--air .dirty circle{fill:var(--orange);stroke:none;
  animation:driftIn 4s ease-in infinite}
.fig--air .dirty circle:nth-child(2){animation-delay:-1s}
.fig--air .dirty circle:nth-child(3){animation-delay:-2s}
.fig--air .dirty circle:nth-child(4){animation-delay:-3s}
.fig--air .clean circle{fill:var(--leaf);stroke:none;animation:breathe 3s ease-in-out infinite}
.fig--air .clean circle:nth-child(2){animation-delay:-1s}
.fig--air .clean circle:nth-child(3){animation-delay:-2s}
@keyframes flow{to{stroke-dashoffset:-52}}
@keyframes driftIn{0%{transform:translateX(0);opacity:0}
  20%{opacity:1}70%{opacity:1}100%{transform:translateX(190px);opacity:0}}
@keyframes breathe{0%,100%{opacity:.25;transform:translateX(0)}50%{opacity:1;transform:translateX(14px)}}

/* 2. cooler streets: the sun climbs, the shade spreads, the heat gives up */
.fig--shade .sun{stroke:var(--orange);animation:arc 7s ease-in-out infinite alternate}
.fig--shade .rays path{animation:rays 2.4s ease-in-out infinite alternate}
.fig--shade .shadow{fill:rgba(33,24,8,.16);stroke:none;transform-origin:400px 322px;
  animation:spread 7s ease-in-out infinite alternate}
.fig--shade .heat path{stroke:var(--orange);opacity:.8;
  animation:heat 3s ease-in-out infinite}
.fig--shade .heat path:nth-child(2){animation-delay:-1.4s}
@keyframes arc{from{transform:translate(0,0)}to{transform:translate(28px,-22px)}}
@keyframes rays{from{opacity:.45}to{opacity:1}}
@keyframes spread{from{transform:scaleX(1)}to{transform:scaleX(4.2)}}
@keyframes heat{0%{opacity:.9;transform:translateY(0)}100%{opacity:0;transform:translateY(-26px)}}

/* 3. less flooding: it rains, and the soil takes it in */
.fig--water .soil{stroke:rgba(33,24,8,.18)}
.fig--water .rain path{stroke:var(--leaf);animation:fall 1.9s linear infinite}
.fig--water .d2{animation-delay:-.5s}
.fig--water .d3{animation-delay:-.9s}
.fig--water .d4{animation-delay:-1.4s}
.fig--water .soak path{stroke:rgba(122,155,78,.7);stroke-dasharray:8 10;
  animation:soak 2.6s linear infinite}
.fig--water .k2{animation-delay:-.8s}
.fig--water .k3{animation-delay:-1.6s}
.fig--water .roots{stroke:rgba(124,93,33,.75)}
@keyframes fall{0%{transform:translateY(0);opacity:0}
  15%{opacity:1}85%{opacity:1}100%{transform:translateY(140px);opacity:0}}
@keyframes soak{to{stroke-dashoffset:-36}}

/* 4. more wildlife: they come back and settle in */
.fig--wild .bush{stroke:var(--green)}
.fig--wild .birds path{stroke:var(--ink);stroke-width:2.6}
.fig--wild .b1{animation:landA 6s ease-in-out infinite}
.fig--wild .b2{animation:landB 6s ease-in-out infinite .8s}
.fig--wild .b3{animation:landC 6s ease-in-out infinite 1.7s}
.fig--wild .bugs circle{fill:var(--orange);stroke:none}
.fig--wild .g1{animation:hover1 5s ease-in-out infinite}
.fig--wild .g2{animation:hover2 6.4s ease-in-out infinite}
@keyframes landA{0%{transform:translate(70px,90px)}55%{transform:translate(280px,150px)}
  100%{transform:translate(292px,196px)}}
@keyframes landB{0%{transform:translate(40px,140px)}55%{transform:translate(330px,180px)}
  100%{transform:translate(346px,224px)}}
@keyframes landC{0%{transform:translate(90px,60px)}55%{transform:translate(240px,170px)}
  100%{transform:translate(252px,214px)}}
@keyframes hover1{0%,100%{transform:translate(210px,230px)}50%{transform:translate(250px,206px)}}
@keyframes hover2{0%,100%{transform:translate(372px,244px)}50%{transform:translate(340px,214px)}}

/* 5. healthier people: a walk, and a heartbeat that settles */
.fig--people .walker{stroke:var(--ink);animation:stroll 9s linear infinite}
.fig--people .legs{animation:step .9s ease-in-out infinite alternate;transform-origin:0 -30px}
.fig--people .arms{animation:step .9s ease-in-out infinite alternate-reverse;transform-origin:0 -58px}
.fig--people .pulse{stroke:var(--orange);stroke-dasharray:520;stroke-dashoffset:520;
  animation:beat 4.6s ease-in-out infinite}
@keyframes stroll{0%{transform:translate(70px,322px)}100%{transform:translate(540px,322px)}}
@keyframes step{from{transform:rotate(-11deg)}to{transform:rotate(11deg)}}
@keyframes beat{0%{stroke-dashoffset:520}60%{stroke-dashoffset:0}
  85%{stroke-dashoffset:0;opacity:1}100%{stroke-dashoffset:0;opacity:0}}

/* 6. stronger neighborhoods: the street gathers around it */
.fig--block .houses path{stroke:rgba(33,24,8,.55)}
.fig--block .tree{stroke:var(--green)}
.fig--block .folk circle{fill:var(--orange);stroke:none}
.fig--block .p1{animation:gather1 7s ease-in-out infinite}
.fig--block .p2{animation:gather2 7s ease-in-out infinite .5s}
.fig--block .p3{animation:gather3 7s ease-in-out infinite 1s}
.fig--block .p4{animation:gather4 7s ease-in-out infinite 1.5s}
@keyframes gather1{0%{transform:translate(120px,316px);opacity:0}
  20%{opacity:1}80%{opacity:1;transform:translate(262px,300px)}100%{opacity:0}}
@keyframes gather2{0%{transform:translate(470px,316px);opacity:0}
  20%{opacity:1}80%{opacity:1;transform:translate(338px,300px)}100%{opacity:0}}
@keyframes gather3{0%{transform:translate(230px,316px);opacity:0}
  20%{opacity:1}80%{opacity:1;transform:translate(280px,308px)}100%{opacity:0}}
@keyframes gather4{0%{transform:translate(378px,316px);opacity:0}
  20%{opacity:1}80%{opacity:1;transform:translate(322px,308px)}100%{opacity:0}}

@media (prefers-reduced-motion:reduce){.fig *{animation:none !important}}

/* mirrored block: the pictures take the left and bleed to that edge */
.arch--flip .arch__inner{grid-template-columns:minmax(0,1fr) minmax(0,.78fr)}
.arch--flip .arch__right{order:-1;justify-self:stretch;
  margin-right:0;margin-left:calc(-1 * max(0px,(100dvw - var(--wrap)) / 2 + 24px))}
.arch--flip .arch__left .beat{padding-right:0;padding-left:2vw}
/* the run indicator sits under the copy, one tick per reading */
.steps{display:flex;align-items:flex-end;gap:7px;height:18px;margin-top:32px}
/* they are buttons, so every default has to be undone or they render as pills */
.steps button{appearance:none;-webkit-appearance:none;box-sizing:content-box;
  width:2px;height:8px;min-width:0;padding:0;margin:0;border:0;border-radius:0;
  background:rgba(33,24,8,.28);font:inherit;color:inherit;cursor:pointer;
  transition:height 0.29s var(--ease),background 0.29s var(--ease)}
.steps button:hover{background:rgba(33,24,8,.62)}
.steps button.done{background:rgba(33,24,8,.42)}
.steps button.now{height:18px;background:var(--green)}

.beat__title{font-family:'Outfit',system-ui,sans-serif;font-weight:600;font-size:var(--h-md);
  line-height:var(--h-md-lh);letter-spacing:-.03em;color:var(--green)}
.arch--flip .beat__copy{margin-top:24px;max-width:34ch}
/* each picture carries its own clip, which only runs while its reading is up */
/* the clip is framed exactly like the still under it, or it reads as a
   different, cropped picture the moment it starts */
.give__clip{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  object-position:0 0%;will-change:object-position;
  opacity:0;transition:opacity 0.4s var(--ease);pointer-events:none}
.give__clip.is-live{opacity:1}

.beat__num{display:block;margin-top:16px;margin-bottom:16px;font-family:'Outfit',system-ui,sans-serif;font-weight:600;
  font-size:var(--t-hero);line-height:var(--t-hero-lh);letter-spacing:-.055em;
  font-variant-numeric:tabular-nums;white-space:nowrap;
  background-image:linear-gradient(rgba(20,24,11,.34),rgba(20,24,11,.34)),var(--num-img);
  background-size:auto,cover;background-position:50% 50%,50% 46%;
  -webkit-background-clip:text;background-clip:text;color:transparent}
/* the unit rides small, so every figure can share one size */
.beat__num .unit{font-size:.34em;letter-spacing:-.01em;margin-left:.1em;vertical-align:.62em}
/* declared here, so the paths follow the stylesheet and survive a move
   into a subdirectory */
.nums-on .arch__left .beat:nth-of-type(1) .beat__num{--num-img:url('../img/planted/04.webp')}
.nums-on .arch__left .beat:nth-of-type(2) .beat__num{--num-img:url('../img/planted/08.webp')}
.nums-on .arch__left .beat:nth-of-type(3) .beat__num{--num-img:url('../img/beat_skyline.webp')}
.nums-on .arch__left .beat:nth-of-type(4) .beat__num{--num-img:url('../img/beat_canopy.webp')}
.beat__word{font-family:'Outfit',system-ui,sans-serif;font-weight:600;font-size:var(--h-md);
  line-height:var(--h-md-lh);letter-spacing:-.03em;color:var(--green)}
.beat__copy{margin-top:24px;max-width:40ch;font-size:var(--b-lg);line-height:var(--b-lg-lh)}
.beat__copy .word{display:inline-block;color:rgba(20,24,11,.16);
  transition:color 0.25s linear}
.beat__copy .word.on{color:rgba(20,24,11,.62)}
/* the method copy is written the same way as the statement */
.method__head .lead .word{display:inline-block;color:rgba(20,24,11,.16);transition:color .18s linear}
.method__head .lead .word.on{color:rgba(20,24,11,.82)}
.clipnum{
  display:inline-block;font-family:'Outfit',system-ui,sans-serif;font-weight:600;letter-spacing:-.045em;
  font-size:clamp(96px,12.5vw,190px);line-height:.9;
  background-image:url('../img/method_forest_white.webp');
  background-size:cover;background-position:50% 62%;
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.bigstat__num{margin-top:16px}
.bigstat__word{font-family:'Outfit',system-ui,sans-serif;font-weight:600;font-size:clamp(30px,4.4vw,60px);
  line-height:1;letter-spacing:-.03em;margin-top:8px}
.bigstat__copy{max-width:44ch;margin-top:28px;font-size:15.5px;opacity:.76}

.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:36px;
  margin-top:clamp(60px,8vw,112px)}
.stat b{display:block;font-family:'Outfit',system-ui,sans-serif;font-weight:700;font-size:clamp(34px,4.6vw,58px);
  letter-spacing:-.035em;font-variant-numeric:tabular-nums;color:var(--cream)}
.stat span{display:block;margin-top:16px;font-size:15px;opacity:.68}

.impact .h3{margin-top:var(--gap)}
.gives{display:grid;grid-template-columns:repeat(3,1fr);gap:48px 40px;margin-top:96px}
.give__img{border-radius:12px;overflow:hidden;aspect-ratio:16/10;background:#e8e2d4}
.give__img img{width:100%;height:100%;object-fit:cover;
  transition:transform 0.52s var(--ease)}
.give:hover .give__img img{transform:scale(1.05)}
.give h4{margin-top:20px;font-size:var(--h-xs);line-height:var(--h-xs-lh);font-weight:600;letter-spacing:-.01em;color:var(--green)}
.give p{margin-top:12px;font-size:var(--b-sm);line-height:var(--b-sm-lh);opacity:.68}

/* ==========================================================================
   PATHS (Phantom-style deck)
   ========================================================================== */
.paths{position:relative;background:var(--cream);padding:var(--gap) 0}
/* a section title reads better broken in two than run across the screen */
.paths__head .h2{max-width:20ch}
.paths__head .lead{max-width:60ch}
.paths__head .lead{margin-top:24px}

.deck{margin-top:clamp(48px,6vw,80px);display:grid;grid-template-columns:repeat(4,1fr);
  gap:24px;perspective:1100px;perspective-origin:50% 40%}
.card{
  position:relative;display:block;border-radius:16px;overflow:hidden;aspect-ratio:2/3;
  background:#1c2410;will-change:transform;transform-style:preserve-3d;
  transition:border-color 0.25s var(--ease);
}
.card:hover{border-color:rgba(33,24,8,.3)}
.card>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transition:transform 0.52s var(--ease)}
.card:hover>img{transform:scale(1.05)}
.card::after{content:"";position:absolute;inset:38% 0 0;z-index:1;
  background:linear-gradient(180deg,rgba(15,18,8,0),rgba(15,18,8,.72))}
.card__body{position:absolute;left:0;right:0;bottom:0;z-index:2;padding:20px 20px 24px;color:#fff}
.card__body h3{font-size:var(--h-xs);line-height:var(--h-xs-lh);font-weight:600}
.card__body p{margin-top:8px;font-size:var(--b-xs);line-height:var(--b-xs-lh);opacity:.92}

/* ==========================================================================
   QUESTIONS (constellation)
   ========================================================================== */
/* pinned like Anthropic: read the title, then the card expands edge to edge */
.questions{background:var(--cream);height:165vh;padding:0}
.posts{margin-top:-1px}
.qsticky{position:sticky;top:0;height:100svh;display:flex;align-items:center;overflow:hidden}
.banner{
  position:relative;width:100%;height:88svh;
  background:var(--banner);color:var(--cream);
  border-radius:22px;overflow:hidden;isolation:isolate;
  display:flex;justify-content:center;
}
/* the stage keeps the exact Figma proportion, centered with air above and
   below so the top row of photos never kisses the edge */
.banner__stage{position:relative;height:88%;max-width:96%;aspect-ratio:1216/760;
  flex:0 0 auto;align-self:center}
.banner__lines{position:absolute;inset:0;width:100%;height:100%;z-index:1}
.banner__lines line{stroke:rgba(246,242,232,.26);stroke-width:1;opacity:0;
  transition:opacity 0.41s var(--ease) var(--d,0ms),stroke 0.25s}
.banner__lines line.on{opacity:1}

.banner__core{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:4;
  text-align:center;width:min(460px,60%)}
.banner__core h2{font-size:var(--h-xl);line-height:var(--h-xl-lh);font-weight:600;letter-spacing:-.03em}
.banner__core .btn{margin-top:28px}

/* geometry comes inline from the Figma export */
.q{position:absolute;width:16.3%;z-index:3;text-align:center;
  opacity:0;transform:translateY(14px);
  transition:opacity 0.41s var(--ease),transform 0.41s var(--ease)}
.q.on{opacity:1;transform:none}
.q h3{font-size:var(--b-md);line-height:var(--b-md-lh);font-weight:600;letter-spacing:-.015em}
/* the answer only shows when a linked photo (or the question) is hovered */
.q p{margin-top:8px;font-size:var(--cap);line-height:var(--cap-lh);opacity:0;
  transform:translateY(5px);transition:opacity 0.26s var(--ease),transform 0.26s var(--ease)}
.q.show p,.q:hover p{opacity:.66;transform:none}

/* photos pop in small and grow, then keep drifting */
/* small tiles around each question, always drifting, like the Anthropic nodes */
.node{position:absolute;object-fit:cover;border-radius:4px;z-index:2;cursor:pointer;
  width:52px;height:52px;translate:-50% -50%;
  opacity:0;scale:.6;
  transition:opacity 0.41s var(--ease) var(--d,0ms),scale 0.41s var(--ease) var(--d,0ms);
  animation:nodefloat var(--fdur,6s) ease-in-out infinite alternate;
  animation-delay:var(--fdel,0s)}
.node:nth-of-type(3n){width:46px;height:58px}
.node:nth-of-type(4n){width:58px;height:46px}
.node.on{opacity:1;scale:1}
.node:hover{scale:1.16;z-index:5;transition:opacity 0.25s,scale 0.25s var(--ease)}
@keyframes nodefloat{
  from{transform:translate(calc(var(--ax,7px)*-1),calc(var(--ay,12px)*-1))}
  to{transform:translate(var(--ax,7px),var(--ay,12px))}
}

/* ==========================================================================
   POSTS
   ========================================================================== */
.posts{background:var(--cream);padding:var(--gap) 0}
.posts__head{text-align:center;display:flex;flex-direction:column;align-items:center}
.posts__head .lead{margin-top:20px}

/* the Figma mosaic: three columns, text over the photos, hover widens a column */
/* the button sits where the tile used to, at the foot of the first column */
.posts__more{align-self:flex-end;margin-top:-8px;font-size:var(--b-md);line-height:var(--b-md-lh);padding:10px 20px}
.mosaic{display:flex;gap:24px;margin-top:96px;align-items:flex-start;
  width:100%;max-width:1008px;margin-inline:auto;padding-inline:24px}
/* the columns never resize, so hovering one card cannot shove the others */
.mcol{min-width:0;display:flex;flex-direction:column;gap:24px}
.mcol--a{flex:363 1 0}
.mcol--b{flex:359 1 0}
.mcol--c{flex:226 1 0}
/* the card lifts on its own layer instead */
@media (hover:hover){
  .post{transition:transform .45s var(--ease)}
  .post--photo:hover{transform:translateY(-6px) scale(1.015);z-index:3}
}
.post{position:relative;display:block;border-radius:14px;overflow:hidden}
.post--photo{background:#1c2410;color:#fff}
.post--photo>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transition:transform 0.52s var(--ease)}
.post--photo:hover>img{transform:scale(1.05)}
.post--photo::after{content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(15,18,8,0) 24%,rgba(15,18,8,.42) 52%,
    rgba(15,18,8,.78) 78%,rgba(15,18,8,.9) 100%)}
.post__meta{position:absolute;left:0;right:0;bottom:0;z-index:2;padding:16px 20px 16px}
.post h3{font-size:var(--h-xs);line-height:var(--b-sm-lh);font-weight:600}
.post time{display:block;margin-top:8px;font-size:var(--cap);line-height:var(--cap-lh);opacity:.7}

.post--lead{aspect-ratio:363/370}

.post--wide{aspect-ratio:359/173}
.post--big{aspect-ratio:359/367}
.post--ghost{aspect-ratio:226/173}
.post--dark{aspect-ratio:226/245}

/* ==========================================================================
   DONATE
   ========================================================================== */
.donate{background:var(--green);color:var(--cream);padding:128px 0;text-align:center}
.donate__h{font-family:'Outfit',system-ui,sans-serif;font-weight:600;font-size:var(--h-xl);line-height:var(--h-xl-lh);letter-spacing:-.03em;
  max-width:16ch;margin-inline:auto}
.donate__sub{margin:24px auto 0;max-width:56ch;font-size:var(--b-lg);line-height:var(--b-lg-lh);opacity:.92}
.donate__copy{margin:24px auto 0;max-width:70ch;font-size:var(--b-lg);line-height:var(--b-lg-lh);opacity:.72}
.donate__cta{display:flex;gap:16px;justify-content:center;margin-top:48px}

/* ==========================================================================
   FOOTER
   ========================================================================== */
/* the soil from the brand system sits under the footer, dark enough that the
   type never has to fight it */
.foot{position:relative;background:var(--brown);color:var(--cream);
  padding:128px 0 36px;isolation:isolate}
.foot::before{content:"";position:absolute;inset:0;z-index:-1;
  background:url('../img/n_soil.webp') center/300px repeat;
  opacity:.3;filter:saturate(.7)}
.foot::after{content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(180deg,var(--brown) 0%,rgba(33,24,8,.82) 34%,rgba(33,24,8,.92) 100%)}
.foot__top{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:start}
.foot__big{font-family:'Outfit',system-ui,sans-serif;font-weight:600;font-size:var(--h-xl);line-height:var(--h-xl-lh);letter-spacing:-.035em}
/* a fat orange bar behind the foot of each line, wiped in from the left */
.uline{position:relative;display:inline-block;isolation:isolate}
.uline::after{content:"";position:absolute;left:-.04em;right:-.04em;bottom:.08em;height:.3em;
  background:var(--orange);z-index:-1;
  transform:scaleX(0);transform-origin:0 50%;
  /* slow and even, so you actually watch the stroke being drawn */
  transition:transform 1.15s cubic-bezier(.65,0,.35,1) var(--d,0ms)}
.unfold.on .uline::after,.on .uline::after{transform:scaleX(1)}
/* and it answers a hover the way the original does: the bar pulls out to the
   right and draws itself back in from the left */
.uline:hover::after{animation:barwipe 1.15s cubic-bezier(.65,0,.35,1)}
@keyframes barwipe{
  0%{transform:scaleX(1);transform-origin:100% 50%}
  48%{transform:scaleX(0);transform-origin:100% 50%}
  49%{transform:scaleX(0);transform-origin:0 50%}
  100%{transform:scaleX(1);transform-origin:0 50%}
}
@media (prefers-reduced-motion:reduce){.uline:hover::after{animation:none}}
.foot__tag{margin-top:24px;font-size:var(--b-xs);line-height:var(--b-xs-lh);opacity:.68}
.foot__social{margin-top:16px;display:flex;gap:20px;font-size:var(--b-xs);line-height:var(--b-xs-lh);opacity:.68}
.foot__social a:hover{opacity:1;text-decoration:underline}
.foot__right{display:grid;gap:44px}
.foot .kicker{color:var(--cream);opacity:.5}

.sub__row{display:flex;align-items:center;gap:10px;margin-top:16px;
  border-bottom:1px solid var(--rule-l);padding-bottom:12px}
/* it beats while the field is empty, and settles the moment you start */
.sub__heart{flex:0 0 auto;display:flex;width:18px;height:18px;color:var(--orange);
  transition:opacity 0.35s var(--ease),transform 0.35s var(--ease)}
.sub__heart svg{width:100%;height:100%;fill:currentColor}
.sub__heart{animation:heartbeat 1.6s ease-in-out infinite}
.sub.is-typing .sub__heart{animation:none;opacity:.42;transform:scale(.86)}
@keyframes heartbeat{
  0%,28%,100%{transform:scale(1)}
  10%{transform:scale(1.22)}
  19%{transform:scale(1.03)}
}
@media (prefers-reduced-motion:reduce){.sub__heart{animation:none}}
.sub input{flex:1;background:none;border:0;color:var(--cream);font:inherit;font-size:var(--b-sm);outline:0}
.sub input::placeholder{color:rgba(246,242,232,.45)}
.sub button{background:none;border:0;color:var(--cream);cursor:pointer;
  font-family:'Outfit',system-ui,sans-serif;font-size:var(--b-xs);line-height:var(--b-xs-lh);font-weight:600;padding:0 4px}
.sub button:hover{color:var(--orange)}
.sub__fine{margin-top:12px;font-size:var(--cap);line-height:var(--cap-lh);opacity:.42}

.cols{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}
.cols a{display:block;margin-top:12px;font-size:var(--b-sm);line-height:var(--b-sm-lh);opacity:.78;transition:opacity 0.25s}
.cols .kicker{margin-bottom:8px}
.cols a:hover{opacity:1}

.foot__pm{border-bottom:1px solid rgba(216,112,38,.5);padding-bottom:1px;
  transition:color 0.25s,border-color 0.25s}
.foot__pm:hover{color:var(--orange);border-color:var(--orange)}
.foot__bottom{margin-top:clamp(60px,8vw,100px);padding-top:24px;border-top:1px solid var(--rule-l);
  display:flex;align-items:center;justify-content:space-between;gap:24px;font-size:var(--b-xs);line-height:var(--b-xs-lh);opacity:.6}
.foot__logo{width:120px;height:auto}

/* headings arrive one line at a time */
.unfold .ln{display:block;overflow:hidden;
  /* room for descenders, taken back so the spacing does not change */
  padding-bottom:.22em;margin-bottom:-.22em}
.unfold .ln__i{display:block;transform:translateY(105%);
  transition:transform 0.52s var(--ease)}
.unfold.on .ln__i{transform:none}
/* the wave: the line itself holds still and every letter rides up on its own
   beat, so the phrase arrives with a ripple across it */
.unfold.wave .ln__i{transform:none}
.unfold.wave .ch{display:inline-block;transform:translateY(112%) rotate(5deg);
  transition:transform 0.62s var(--pop)}
.unfold.wave.on .ch{transform:none}

/* ==========================================================================
   REVEAL
   ========================================================================== */
[data-reveal]{opacity:0;transform:translateY(22px);
  transition:opacity 0.49s var(--ease),transform 0.49s var(--ease)}
[data-reveal].on{opacity:1;transform:none}

/* review helpers: ?still and ?final unpin the page so a full capture is honest */
html.still{scroll-behavior:auto}
.still .hero__title .w{transform:none;animation:none}
.still .hero__sub,.still .hero__cta,.still .hero__brands{opacity:1;animation:none}
.still .marquee__row{animation:none}
.final .hero{min-height:820px}
.final .mission{min-height:0}
.final .questions{height:auto}
.final .qsticky{position:static;height:auto;display:block;overflow:visible}
.final .banner{height:820px}
.final .arch__right{position:static;height:auto}

/* ==========================================================================
   RESPONSIVE
   ========================================================================== */
@media (max-width:1080px){
  .method__legend{position:static;margin:28px auto 0;grid-auto-flow:column;justify-content:center;
    padding-inline:24px}
  .method__legend li{transform:none}
  .gives{grid-template-columns:repeat(2,1fr)}
  .deck{grid-template-columns:repeat(2,1fr)}
}
/* ==========================================================================
   THE MENU ON A PHONE
   Three lines in the bar. Tap them and the links drop as one dark panel, the
   sections with their children laid out under them. The bar stays on top.
   ========================================================================== */
.nav__burger{display:none;width:44px;height:44px;padding:0;margin:-6px -8px -6px 0;
  border:0;background:none;cursor:pointer;position:relative;z-index:2;flex:0 0 auto}
.nav__burger span{position:absolute;left:11px;right:11px;height:2px;border-radius:2px;
  background:var(--cream);transition:transform .35s var(--ease),opacity .25s var(--ease),top .35s var(--ease)}
.nav__burger span:nth-child(1){top:14px}
.nav__burger span:nth-child(2){top:21px}
.nav__burger span:nth-child(3){top:28px}
.nav.is-open .nav__burger span:nth-child(1){top:21px;transform:rotate(45deg)}
.nav.is-open .nav__burger span:nth-child(2){opacity:0}
.nav.is-open .nav__burger span:nth-child(3){top:21px;transform:rotate(-45deg)}
@media (max-width:820px){
  .nav__burger{display:block}
  .nav__logo{position:relative;z-index:2}
  .nav__inner{padding-inline:24px;gap:16px}
  .nav__cta{margin-left:auto;--btn-pad:8px 18px}
  /* the panel */
  .nav__links{display:flex;flex-direction:column;align-items:stretch;gap:0;
    position:fixed;inset:0;padding:calc(96px + 16px) 24px 40px;
    background:var(--ink);color:var(--cream);overflow-y:auto;
    opacity:0;visibility:hidden;transform:translateY(-8px);
    transition:opacity .3s var(--ease),transform .35s var(--ease),visibility 0s .35s}
  .nav.is-open .nav__links{opacity:1;visibility:visible;transform:none;transition-delay:0s}
  .nav.is-open{background:var(--ink)}
  .nav__links > a,.nav__item > a{display:block;padding:18px 0;
    font-family:'Outfit',system-ui,sans-serif;font-weight:600;font-size:var(--h-sm);
    line-height:var(--h-sm-lh);letter-spacing:-.02em;border-bottom:1px solid rgba(246,242,232,.12)}
  .nav__links a::after{display:none}
  .nav__item{display:block;position:static}
  /* the children sit under their parent, always open */
  .drop{position:static;min-width:0;opacity:1;visibility:visible;transform:none;
    padding:4px 0 14px 18px;background:none;border:0;box-shadow:none;
    border-bottom:1px solid rgba(246,242,232,.12)}
  .drop>a{padding:9px 0;font-size:var(--b-md);line-height:var(--b-md-lh);opacity:.72}
  /* the links arrive one after another */
  .nav__links > *{opacity:0;transform:translateY(10px);
    transition:opacity .4s var(--ease),transform .4s var(--ease)}
  .nav.is-open .nav__links > *{opacity:1;transform:none}
  .nav.is-open .nav__links > :nth-child(1){transition-delay:.08s}
  .nav.is-open .nav__links > :nth-child(2){transition-delay:.13s}
  .nav.is-open .nav__links > :nth-child(3){transition-delay:.18s}
  .nav.is-open .nav__links > :nth-child(4){transition-delay:.23s}
  .nav.is-open .nav__links > :nth-child(5){transition-delay:.28s}
  .nav.is-open .nav__links > :nth-child(6){transition-delay:.33s}
  body.menu-open{overflow:hidden}
  .hero__cta{flex-wrap:wrap}
  .donate__cta{flex-wrap:wrap}
  .hero__brands{gap:24px;flex-wrap:wrap;justify-content:center;bottom:28px}
  .hero__brands img{max-height:18px}
  .stats{grid-template-columns:1fr;gap:28px}
  .gives{grid-template-columns:1fr}
  .deck{grid-template-columns:1fr}
  .card{aspect-ratio:4/5}
  .mosaic{flex-direction:column}
  .mcol{width:100%}
  .post{aspect-ratio:16/10 !important}
  /* the run keeps working on a phone: picture on top, reading under it */
  .arch{margin-top:56px}
  .arch__inner,.arch--flip .arch__inner{grid-template-columns:1fr;gap:24px;padding-inline:20px}
  .arch__right,.arch--flip .arch__right{order:-1;position:relative;justify-self:stretch;
    aspect-ratio:3/2;max-height:none;margin-inline:0}
  .arch__left{height:auto;min-height:320px}
  .arch__left .beat,.arch--flip .arch__left .beat{padding:0}
  .imgstack{max-height:none}
  .foot__top{grid-template-columns:1fr;gap:44px}
  .foot__bottom{flex-direction:column;align-items:flex-start;gap:12px}
  .questions{height:auto;padding:0 0 60px}
  .qsticky{position:static;height:auto;display:block;overflow:visible}
  .banner{height:auto;min-height:0;padding:44px 20px;border-radius:16px;display:block}
  .banner__stage{height:auto;aspect-ratio:auto}
  .banner__core{position:static;transform:none;width:auto;margin-bottom:36px}
  .banner__lines,.node{display:none}
  .q{position:static;width:auto;margin-top:24px;opacity:1;transform:none;text-align:left}
  .q p{opacity:.66;transform:none}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;
    transition-duration:.01ms !important;scroll-behavior:auto !important}
  [data-reveal],.forest__layer,.q,.node{opacity:1;transform:none}
}


/* ==========================================================================
   ?flat=1 — capture mode. Every pinned runway collapses to a normal block
   and every rotating reading shows at once, so a static capture of the page
   has no dead bands. Never used by visitors.
   ========================================================================== */
.flatcap .mission{height:auto}
.flatcap .wood{height:auto}
.flatcap .wood__stage{position:relative;height:auto;overflow:visible;padding-top:64px}
.flatcap .wood__forest{position:relative;left:auto;bottom:auto;transform:none;
  width:100%;margin:0 auto}
.flatcap .wl{opacity:1 !important;transform:none !important;filter:none !important}
.flatcap .wood__birds,.flatcap .wood__flies,.flatcap .flutter{display:none}
.flatcap .wood__stage .method__head{position:static;opacity:1 !important;
  transform:none !important;background:none;padding:48px 24px 8px}
.flatcap .method__head .ln__i{transform:none !important}
.flatcap .method__head .lead .word{color:rgba(20,24,11,.82)}
.flatcap .arch{height:auto}
.flatcap .arch__inner{position:static;height:auto;display:block;padding-block:48px}
.flatcap .arch__left{position:static;height:auto}
.flatcap .arch__left .beat{position:static;opacity:1 !important;transform:none !important;
  display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1fr);gap:48px;
  align-items:center;margin:0 auto 72px;max-width:var(--wrap);padding-inline:24px}
.flatcap .arch__right{display:none}
.flatcap .beat__copy .word{color:rgba(20,24,11,.62) !important}
.flatcap .steps{display:none}
.flatcap .questions{height:auto}
.flatcap .qsticky{position:static;height:auto}
.flatcap .banner{height:880px !important;margin-inline:24px !important;border-radius:22px !important}
.flatcap .banner .q,.flatcap .banner .node,.flatcap .banner line{opacity:1}
