/* Shared additions for the inner pages: breadcrumb, page hero, section patterns,
 * card and strip primitives. Loaded after styles.css on every page, so it may only
 * ADD selectors - never redefine one styles.css already owns, or the home page moves.
 *
 * ============================================================================================
 * WHAT IS IN HERE (every block is commented where it starts)
 *
 *   .crumbs          breadcrumb bar - the builder emits it, no page writes it
 *   .phero           page hero: eyebrow, h1, lead, actions, media, floating stat card
 *   .explorer        filter bar: status pills, search field, programme select, result count
 *   .badge           status badge: --active / --upcoming / --past, each a WORD and a SHAPE
 *   .chip            small label over a photograph (programme name, year)
 *   .mcard           generic media card, image zooms on hover, badge and chip slots
 *   .strip           full-width impact strip, dark by default, --light for a pale one
 *   .band--sage      soft tinted section  |  .band--forest  dark section (colours in section 15)
 *   .steps           numbered step row with a connecting line (vertical under 900px)
 *   .acc             accordion built from <details> / <summary>
 *   .dtable          data table that becomes stacked rows under 700px (needs td[data-label])
 *   .split-7-5       two-column editorial split (.split-5-7 puts the media first)
 *   .donut           the chart Hope.donut() draws: arcs, legend, centre label
 *   helpers          .grid-2/3/4, .stack, .measure, .notice, .quote, .meterline, .section--tight
 *
 * Reuse from styles.css before reaching for anything here: .container .section .section__head
 * .btn .btn--primary/--outline/--green/--light .card .card--tint .pill .pill--tag .bar .stat
 * .tiles-mini (the transparency row) .list-check .eyebrow .lead .small .muted and every form class.
 * ============================================================================================ */

/* ------------------------------------------------------------------ added tokens
   New custom properties only - nothing here changes a value styles.css set. */
:root {
  --amber-ink: #8A6200;      /* yellow darkened until it passes AA as text (5.3:1 on warm white) */
  --amber-line: #EBD08A;     /* the border that goes with it */
  --stripe: #EFF4EC;         /* table zebra: sage at ~30% over warm white */
  --on-dark-line: rgba(255, 255, 255, .16);
  --steps-line: var(--line-2);
}

/* ================================================================== 1. Breadcrumb
   <nav class="crumbs"><div class="container"><ol class="crumbs__list">...  (build_site.py writes it) */
.crumbs { padding-block: 14px 0; }
.crumbs__list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: .82rem; color: var(--muted); }
.crumbs__list li { display: flex; align-items: center; gap: 6px; min-width: 0; }
.crumbs__list li + li::before { content: "/"; color: var(--line-2); }
.crumbs a { color: var(--muted); text-decoration: none; }
.crumbs a:hover { color: var(--leaf-dark); text-decoration: underline; }
.crumbs [aria-current="page"] { color: var(--forest); font-weight: 700; }

/* ================================================================== 2. Page hero
   <section class="phero phero--bleed">
     <div class="container phero__inner">
       <div class="phero__copy"> eyebrow / h1.phero__title / p.phero__lead / .phero__actions </div>
       <div class="phero__media"> img.phero__img + .phero__card </div>  */
.phero { position: relative; background: var(--cream); overflow: hidden; }
.phero__inner { display: grid; grid-template-columns: minmax(0, 6fr) minmax(0, 6fr); gap: var(--gap-lg); align-items: center; padding-block: clamp(28px, 3.6vw, 56px) clamp(40px, 5vw, 76px); }
.crumbs + .phero .phero__inner { padding-top: clamp(16px, 2vw, 32px); }
.phero__title { font-size: clamp(2.1rem, 1.2rem + 3vw, 3.9rem); line-height: 1.05; letter-spacing: -.026em; margin: 0 0 .4em; text-wrap: balance; max-width: 15ch; }
.phero__title em { font-style: normal; color: var(--leaf); }
.phero__lead { font-size: 1.08rem; color: var(--muted); max-width: 48ch; margin: 0 0 26px; }
.phero__actions { display: flex; flex-wrap: wrap; gap: 12px; }
.phero__note { margin: 22px 0 0; font-size: .82rem; color: var(--muted); max-width: 46ch; }
.phero__media { position: relative; min-width: 0; }
.phero__img { width: 100%; aspect-ratio: 4 / 3; max-height: 560px; object-fit: cover; border-radius: var(--radius-lg); background: var(--sage); }

/* --bleed runs the photograph out to the right edge of the viewport, as the designs do */
.phero--bleed .phero__img { border-radius: var(--radius-lg) 0 0 var(--radius-lg); }
@media (min-width: 900px) {
  .phero--bleed .phero__media { margin-right: min(0px, calc((var(--container) - 100vw) / 2 - var(--gutter))); }
}

/* the floating card over the photograph: three or four live counters */
/* The card that floats over a hero photograph. It is a small table of figures, so it is built
   like one: a quiet header, then rows on a hairline, each row an icon, a number and a label. */
.phero__card {
  position: absolute; right: clamp(14px, 1.8vw, 36px); top: clamp(14px, 2.4vw, 36px);
  background: var(--warm-white);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: var(--shadow-lg);
  padding: 16px 18px;
  display: grid; gap: 0;
  min-width: 216px; max-width: 290px;
}
.phero__card--low { top: auto; bottom: clamp(14px, 2.4vw, 36px); }

/* An optional caption, so the numbers are not four figures with no question attached. */
.phero__card[data-title]::before {
  content: attr(data-title);
  grid-column: 1 / -1;
  margin: -2px 0 12px;
  padding-bottom: 11px;
  border-bottom: 1px solid var(--line);
  font-size: .64rem; font-weight: 800; letter-spacing: .13em; text-transform: uppercase;
  color: var(--muted);
}

.phero__stat { display: flex; align-items: center; gap: 12px; min-width: 0; margin: 0; }
/* One hairline between rows instead of a gap, which reads as a considered list rather than
   four things that happen to be near each other. */
.phero__stat + .phero__stat { margin-top: 11px; padding-top: 11px; border-top: 1px solid var(--line); }

/* The chip is a span, and so is the label. Scope the label rules with :not() or they win on
   specificity and knock the chip out of its own centre - which is exactly what they used to do. */
.phero__stat > .phero__stat-icon {
  width: 32px; height: 32px; border-radius: 50%;
  background: var(--sage); color: var(--forest);
  display: grid; place-items: center; flex: none;
  font-size: 1rem; line-height: 1;
}
.phero__stat > .phero__stat-icon .icon { width: 17px; height: 17px; stroke-width: 2; }

.phero__stat > span:not(.phero__stat-icon) { display: block; min-width: 0; }
.phero__stat strong { display: block; font-size: 1.32rem; font-weight: 800; line-height: 1.12; letter-spacing: -.02em; color: var(--forest); font-variant-numeric: tabular-nums; }
.phero__stat > span:not(.phero__stat-icon) > span { display: block; font-size: .74rem; font-weight: 600; color: var(--muted); line-height: 1.3; margin-top: 1px; }

/* hero entrance - the same load animation the home page uses, only under .js-reveal */
.js-reveal .phero__copy > * { animation: hero-in var(--dur-4) var(--ease-out) backwards; }
.js-reveal .phero__copy > :nth-child(1) { animation-delay: 60ms; }
.js-reveal .phero__copy > :nth-child(2) { animation-delay: 130ms; }
.js-reveal .phero__copy > :nth-child(3) { animation-delay: 200ms; }
.js-reveal .phero__copy > :nth-child(4) { animation-delay: 260ms; }
.js-reveal .phero__copy > :nth-child(5) { animation-delay: 320ms; }
.js-reveal .phero__img { animation: hero-img-in 760ms var(--ease-out) 150ms backwards; }
.js-reveal .phero__card { animation: chip-in var(--dur-4) var(--ease-spring) 620ms backwards; }

@media (max-width: 1199px) {
  .phero__card { min-width: 0; padding: 14px 16px; }
  .phero__stat + .phero__stat { margin-top: 9px; padding-top: 9px; }
  .phero__stat strong { font-size: 1.15rem; }
  .phero__stat > .phero__stat-icon { width: 28px; height: 28px; }
  .phero__stat > .phero__stat-icon .icon { width: 15px; height: 15px; }
}
@media (max-width: 899px) {
  .phero__inner { grid-template-columns: 1fr; padding-bottom: clamp(32px, 6vw, 56px); }
  .phero__title { max-width: 20ch; }
  .phero__img, .phero--bleed .phero__img { aspect-ratio: 16 / 10; max-height: 360px; border-radius: var(--radius-lg); }
  .phero__card, .phero__card--low { position: static; margin-top: 14px; max-width: none; grid-template-columns: repeat(2, minmax(0, 1fr)); box-shadow: var(--shadow); }
}
@media (max-width: 479px) { .phero__card, .phero__card--low { grid-template-columns: 1fr; } }

/* ================================================================== 3. Explorer bar
   <div class="explorer"><ul class="explorer__pills">…</ul><div class="explorer__search">…</div>… */
.explorer { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 16px; padding-block: clamp(16px, 2vw, 26px); }
.explorer__pills { list-style: none; display: flex; gap: 8px; margin: 0; padding: 4px; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.explorer__pills::-webkit-scrollbar { display: none; }
.explorer__pills li { flex: none; }
.explorer__pill { font: inherit; font-weight: 700; font-size: .92rem; line-height: 1.2; white-space: nowrap; cursor: pointer; padding: 11px 20px; min-height: 44px; display: inline-flex; align-items: center; gap: 8px; border-radius: 999px; border: 1.5px solid var(--line-2); background: var(--warm-white); color: var(--forest); transition: background-color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
.explorer__pill:hover { border-color: var(--leaf); background: var(--sage-2); }
.explorer__pill[aria-pressed="true"] { background: var(--forest); border-color: var(--forest); color: var(--white); }
.explorer__pill .explorer__n { font-weight: 800; font-variant-numeric: tabular-nums; opacity: .72; }
.explorer__search { position: relative; flex: 1 1 260px; min-width: 190px; max-width: 460px; }
.explorer__search input { border-radius: 999px; padding-left: 44px; }
.explorer__search .icon { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); color: var(--muted); pointer-events: none; }
.explorer__field { flex: 0 1 250px; min-width: 190px; }
.explorer__field select { border-radius: 999px; }
.explorer__count { flex: 1 0 auto; text-align: right; font-size: .85rem; color: var(--muted); font-variant-numeric: tabular-nums; }
@media (max-width: 767px) {
  .explorer { gap: 10px; }
  .explorer__pills { margin-inline: calc(-1 * var(--gutter)); padding-inline: var(--gutter); width: calc(100% + 2 * var(--gutter)); }
  .explorer__search, .explorer__field { flex: 1 1 100%; max-width: none; }
  .explorer__count { text-align: left; }
}

/* ================================================================== 4. Status badge
   Each variant carries a word AND a shape - a filled circle, a diamond, a bar - so the state
   survives greyscale, colour blindness and a projector with the saturation turned down. */
.badge { display: inline-flex; align-items: center; gap: 7px; font-size: .7rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; line-height: 1; padding: 7px 13px 7px 10px; border-radius: 999px; border: 1.5px solid var(--line-2); background: var(--warm-white); color: var(--muted); white-space: nowrap; }
.badge::before { content: ""; flex: none; width: 9px; height: 9px; background: currentColor; }
.badge--active { color: var(--leaf-dark); border-color: #B7D6C2; }
.badge--active::before { border-radius: 50%; }                                   /* circle */
.badge--upcoming { color: var(--amber-ink); border-color: var(--amber-line); }
.badge--upcoming::before { border-radius: 2px; transform: rotate(45deg); }        /* diamond */
.badge--past { color: var(--muted); border-color: var(--line-2); }
.badge--past::before { height: 4px; width: 11px; border-radius: 2px; }            /* bar */
.badge--on-dark { background: rgba(252, 251, 247, .95); }

/* ================================================================== 5. Chip
   A small label that sits over a photograph or next to a title. */
.chip { display: inline-flex; align-items: center; gap: 6px; font-size: .75rem; font-weight: 700; line-height: 1.2; padding: 7px 12px; border-radius: 999px; background: var(--warm-white); color: var(--forest); border: 1px solid var(--line); max-width: 100%; }
.chip .icon { width: 16px; height: 16px; color: var(--leaf); flex: none; }
.chip span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chip--float { box-shadow: var(--shadow); border-color: transparent; }
.chip--sage { background: var(--sage); border-color: var(--sage-3); }
.chip--ghost { background: transparent; border-color: var(--line-2); color: var(--muted); }

/* ================================================================== 6. Media card
   <article class="mcard">
     <div class="mcard__media"><img …><span class="badge badge--active">Active</span></div>
     <div class="mcard__body"> h3.mcard__title / p.mcard__text / ul.mcard__meta / .mcard__foot */
.mcard { display: flex; flex-direction: column; min-width: 0; height: 100%; background: var(--warm-white); border: 1px solid var(--line); border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow); transition: transform var(--dur-2) var(--ease-out), box-shadow var(--dur-2) var(--ease-out); }
.mcard__media { position: relative; background: var(--sage); overflow: hidden; }
.mcard__media img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; transition: transform 600ms var(--ease-out); }
.mcard__media .badge { position: absolute; right: 14px; top: 14px; box-shadow: var(--shadow); }
.mcard__media .chip { position: absolute; left: 14px; bottom: 14px; }
.mcard__body { flex: 1; display: flex; flex-direction: column; gap: 10px; padding: 20px 22px 22px; min-width: 0; }
.mcard__title { font-size: 1.15rem; margin: 0; }
.mcard__title a { color: inherit; text-decoration: none; }
.mcard__title a:hover { text-decoration: underline; }
.mcard__text { margin: 0; font-size: .93rem; color: var(--muted); }
.mcard__meta { list-style: none; margin: 0; display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: .84rem; color: var(--muted); }
.mcard__meta li { display: flex; align-items: center; gap: 6px; }
.mcard__meta .icon { width: 17px; height: 17px; color: var(--leaf); }
.mcard__foot { margin-top: auto; padding-top: 6px; display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.mcard__foot .btn { flex: 0 1 auto; }
.mcard--feature .mcard__media img { aspect-ratio: 16 / 10; }
.mcard--feature .mcard__body { padding: 24px 26px 26px; gap: 12px; }
.mcard--feature .mcard__title { font-size: clamp(1.3rem, 1rem + .8vw, 1.75rem); }
.mcard--feature .mcard__text { font-size: 1rem; }
.mcard--row { flex-direction: row; align-items: stretch; }
.mcard--row .mcard__media { flex: 0 0 38%; max-width: 38%; }
.mcard--row .mcard__media img { height: 100%; aspect-ratio: auto; min-height: 150px; }
.mcard--flat { box-shadow: none; }
.mcard--tint { background: var(--sage-2); border-color: var(--sage-3); box-shadow: none; }
.mcard:focus-within { transform: translateY(-4px); box-shadow: var(--shadow-lg); }
@media (hover: hover) and (pointer: fine) {
  .mcard:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); }
  .mcard:hover .mcard__media img { transform: scale(1.045); }
  .mcard:hover .link-btn .icon { transform: translateX(4px); }
}
@media (max-width: 599px) {
  .mcard--row { flex-direction: column; }
  .mcard--row .mcard__media { flex: none; max-width: none; }
  .mcard--row .mcard__media img { aspect-ratio: 2.2 / 1; min-height: 0; height: auto; }
}

/* styles.css gives .bar `flex: 1` because on the home page it always sits in a flex ROW.
   Dropped into a flex column - a card body, a stack, a table cell - it would grow to fill the
   whole column, so it is pinned back here. Add .bar--block anywhere else it needs pinning. */
.mcard__body > .bar, .stack > .bar, .split__copy > .bar, .dtable .bar, .acc__a > .bar, .bar--block { flex: none; width: 100%; }

/* the raised-of-goal line under a campaign card's bar */
.meterline { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin: 0; font-size: .9rem; color: var(--muted); }
.meterline strong { font-size: 1.35rem; color: var(--leaf-dark); letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
.meterline .meterline__pct { font-weight: 700; color: var(--forest); font-variant-numeric: tabular-nums; }

/* ================================================================== 7. Impact strip
   <section class="strip"><div class="container"><ul class="strip__list"> …  */
.strip { background: var(--forest); color: var(--white); }
.strip__list { list-style: none; margin: 0; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(18px, 2.4vw, 40px); padding-block: clamp(26px, 3.2vw, 46px); }
.strip__item { display: flex; align-items: center; gap: 14px; min-width: 0; }
.strip__icon { width: 48px; height: 48px; border-radius: 50%; background: rgba(246, 183, 44, .14); color: var(--yellow); display: grid; place-items: center; flex: none; }
.strip__icon .icon { width: 24px; height: 24px; }
.strip__body { min-width: 0; }
.strip__num { display: block; font-size: clamp(1.55rem, 1rem + 1.2vw, 2.25rem); font-weight: 800; line-height: 1.05; letter-spacing: -.022em; font-variant-numeric: tabular-nums; }
.strip__label { display: block; font-size: .9rem; font-weight: 700; color: var(--on-dark); }
.strip__sub { display: block; font-size: .76rem; color: var(--on-dark-muted); }
.strip__note { margin: 14px 0 0; font-size: .76rem; color: var(--on-dark-muted); }
.strip :focus-visible { outline-color: var(--yellow); }
/* a pale version of the same strip, for a light section */
.strip--light { background: var(--sage-2); color: var(--ink); border-block: 1px solid var(--sage-3); }
.strip--light .strip__icon { background: var(--sage); color: var(--leaf); }
.strip--light .strip__num { color: var(--forest); }
.strip--light .strip__label { color: var(--forest); }
.strip--light .strip__sub, .strip--light .strip__note { color: var(--muted); }
.strip--light :focus-visible { outline-color: var(--leaf); }
@media (max-width: 899px) { .strip__list { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 22px 18px; } }
@media (max-width: 419px) {
  .strip__icon { width: 40px; height: 40px; }
  .strip__icon .icon { width: 20px; height: 20px; }
  .strip__item { gap: 10px; }
}

/* ================================================================== 8. Bands
   .band--sage for a soft section, .band--forest for a dark one. Put them on the <section>
   alongside .section so the vertical rhythm stays the same as every other section.
   The dark band's text colours are at the BOTTOM of this file, so they win on order over every
   primitive above them; only the sage band, which changes nothing but the background, is here. */
.band--sage { background: var(--sage-2); }
.band--sage .card, .band--sage .mcard { background: var(--warm-white); }

/* ================================================================== 9. Steps
   <ol class="steps"><li class="steps__item"><span class="steps__num">01</span>
       <h3 class="steps__title">Listen first</h3><p class="steps__text">…</p></li> … */
.steps { --steps-gap: clamp(18px, 2vw, 30px); list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--steps-gap); }
.steps--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.steps__item { position: relative; min-width: 0; }
.steps__item::before { content: ""; position: absolute; left: 44px; right: calc(-1 * var(--steps-gap)); top: 20px; height: 2px; background: var(--steps-line); }
.steps__item:last-child::before { content: none; }
.steps__num { position: relative; z-index: 1; display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; margin: 0 0 14px; border-radius: 50%; border: 2px solid var(--sage-3); background: var(--warm-white); color: var(--leaf-dark); font-weight: 800; font-size: .85rem; font-variant-numeric: tabular-nums; letter-spacing: .02em; }
.steps__title { font-size: 1.02rem; margin: 0 0 6px; }
.steps__text { margin: 0; font-size: .9rem; color: var(--muted); }
@media (max-width: 899px) {
  .steps, .steps--3 { grid-template-columns: 1fr; gap: 0; }
  .steps__item { padding: 0 0 26px 58px; }
  .steps__item:last-child { padding-bottom: 0; }
  .steps__item::before { left: 20px; right: auto; top: 46px; bottom: 6px; width: 2px; height: auto; }
  .steps__num { position: absolute; left: 0; top: 0; margin: 0; }
}

/* ================================================================== 10. Accordion
   <div class="acc"><details class="acc__item"><summary class="acc__q">Question</summary>
       <div class="acc__a"><p>Answer</p></div></details> … */
.acc { display: grid; gap: 12px; align-items: start; }
.acc--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.acc--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.acc__item { background: var(--warm-white); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; }
.acc__q { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; padding: 16px 18px; font-weight: 700; font-size: .98rem; color: var(--forest); cursor: pointer; list-style: none; transition: background-color var(--dur-1) var(--ease-out); }
.acc__q::-webkit-details-marker { display: none; }
.acc__q::after { content: "+"; flex: none; width: 26px; height: 26px; border-radius: 50%; background: var(--sage); color: var(--leaf-dark); display: grid; place-items: center; font-size: 1.15rem; font-weight: 800; line-height: 1; transition: background-color var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
.acc__q:hover { background: var(--sage-2); }
.acc__q:focus-visible { outline: 3px solid var(--leaf); outline-offset: -3px; }
.acc__item[open] .acc__q { background: var(--sage-2); }
.acc__item[open] .acc__q::after { content: "\2212"; background: var(--forest); color: var(--white); }
.acc__a { padding: 4px 18px 18px; font-size: .93rem; color: var(--muted); }
.acc__a > :last-child { margin-bottom: 0; }
.js-reveal .acc__item[open] .acc__a { animation: rise-in var(--dur-3) var(--ease-out); }
@media (max-width: 899px) { .acc--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 599px) { .acc--2, .acc--3 { grid-template-columns: 1fr; } }

/* ================================================================== 11. Data table
   <div class="dtable-wrap"><table class="dtable"> … and every <td> carries data-label="Header",
   which is what the stacked layout under 700px prints in front of the value. */
.dtable-wrap { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--warm-white); }
.dtable { width: 100%; border-collapse: collapse; font-size: .92rem; }
.dtable caption { caption-side: bottom; text-align: left; font-size: .78rem; color: var(--muted); padding: 12px 2px 0; }
.dtable th, .dtable td { padding: 13px 16px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--line); }
.dtable thead th { background: var(--sage-2); color: var(--forest); font-size: .74rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; white-space: nowrap; border-bottom-color: var(--sage-3); }
.dtable tbody tr:nth-child(even) > * { background: var(--stripe); }
.dtable tbody tr:last-child > * { border-bottom: 0; }
.dtable th.num, .dtable td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.dtable td strong, .dtable tbody th { color: var(--forest); }
.dtable .bar { min-width: 90px; }
@media (max-width: 699px) {
  .dtable-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
  .dtable, .dtable tbody, .dtable tr, .dtable td, .dtable tbody th { display: block; width: 100%; }
  /* the table is no longer a table, so its caption has to be an ordinary block again */
  .dtable caption { display: block; width: 100%; padding: 0 2px 12px; }
  .dtable thead { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
  .dtable tr { background: var(--warm-white); border: 1px solid var(--line); border-radius: var(--radius); margin-bottom: 12px; overflow: hidden; }
  .dtable tbody tr:nth-child(even) > * { background: transparent; }
  .dtable td, .dtable tbody th { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; text-align: right; padding: 11px 14px; border-bottom: 1px solid var(--line); }
  .dtable td::before, .dtable tbody th::before { content: attr(data-label); flex: none; font-weight: 700; font-size: .78rem; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); text-align: left; }
  .dtable td:not([data-label])::before, .dtable tbody th:not([data-label])::before { content: none; }
  .dtable tr > :last-child { border-bottom: 0; }
}

/* ================================================================== 12. Editorial split
   .split-7-5 = copy left, media right. .split-5-7 = media left, copy right. */
.split-7-5, .split-5-7 { display: grid; gap: var(--gap-lg); align-items: center; }
.split-7-5 { grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); }
.split-5-7 { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
.split-7-5--top, .split-5-7--top { align-items: start; }
.split__media { position: relative; min-width: 0; }
.split__media img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-lg); background: var(--sage); }
.split__copy { min-width: 0; }
.split__copy > p { color: var(--muted); }
.split__copy .btn { margin-top: 8px; }
@media (max-width: 899px) {
  .split-7-5, .split-5-7 { grid-template-columns: 1fr; }
  .split-5-7 .split__media { order: -1; }
  .split__media img { aspect-ratio: 16 / 10; }
}

/* ================================================================== 13. Donut
   Drawn by Hope.donut(mount, slices, opts). Each arc takes its colour from --c, and the legend
   repeats every label in text, so the chart never depends on colour alone. */
.donut { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: clamp(20px, 3vw, 44px); align-items: center; }
.donut__chart { position: relative; width: clamp(180px, 20vw, 250px); flex: none; }
.donut__svg { display: block; width: 100%; height: auto; transform: rotate(-90deg); }
.donut__track { fill: none; stroke: var(--sage-2); }
.donut__arc { fill: none; stroke: var(--c, var(--leaf)); transition: stroke-dasharray var(--dur-4) var(--ease-out); }
.donut__centre { position: absolute; inset: 0; display: grid; place-content: center; text-align: center; padding: 18%; }
.donut__centre strong { display: block; font-size: clamp(1.05rem, .7rem + .9vw, 1.45rem); font-weight: 800; letter-spacing: -.02em; color: var(--forest); font-variant-numeric: tabular-nums; }
.donut__centre span { display: block; font-size: .74rem; color: var(--muted); line-height: 1.3; margin-top: 2px; }
.donut__legend { list-style: none; margin: 0; display: grid; gap: 12px; min-width: 0; }
.donut__item { display: flex; align-items: flex-start; gap: 12px; min-width: 0; }
.donut__swatch { flex: none; width: 14px; height: 14px; margin-top: 3px; border-radius: 4px; background: var(--c, var(--leaf)); box-shadow: inset 0 0 0 1px rgba(8, 39, 29, .14); }
.donut__text { min-width: 0; }
.donut__label { display: block; font-size: .95rem; font-weight: 700; color: var(--forest); }
.donut__value { display: block; font-size: .82rem; color: var(--muted); font-variant-numeric: tabular-nums; }
@media (max-width: 767px) {
  .donut { grid-template-columns: 1fr; justify-items: center; gap: 22px; }
  .donut__legend { width: 100%; }
}

/* ================================================================== 14. Helpers */
/* card grids - they collapse in the usual order without a page writing a media query */
.grid-2, .grid-3, .grid-4 { display: grid; gap: var(--gap); align-items: stretch; }
.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 1023px) { .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 899px) { .grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 599px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } }

.stack { display: grid; gap: 16px; align-content: start; }
.stack--sm { gap: 10px; }
.stack--lg { gap: 26px; }
.measure { max-width: 62ch; }
.section--tight { padding-block: clamp(36px, 4.4vw, 64px); }
.section--flush-top { padding-top: 0; }
.rule { border: 0; border-top: 1px solid var(--line); margin: clamp(28px, 3vw, 44px) 0; }

/* a quiet note: the 80G line, "figures as of", "illustrative story" */
.notice { display: flex; gap: 10px; align-items: flex-start; background: var(--cream); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 14px 16px; margin: 0; font-size: .85rem; color: var(--muted); }
.notice .icon { flex: none; margin-top: 2px; color: var(--leaf); }
.notice strong { color: var(--forest); }
.notice--sage { background: var(--sage-2); border-color: var(--sage-3); }
.notice--dark { background: var(--forest-2); border-color: var(--on-dark-line); color: var(--on-dark); }
.notice--dark .icon { color: var(--yellow); }
.notice--dark strong { color: var(--white); }

/* pull quote for an origin or story block */
.quote { margin: 0; padding-left: 22px; border-left: 4px solid var(--yellow); }
.quote p { font-size: clamp(1.1rem, .95rem + .55vw, 1.4rem); line-height: 1.4; color: var(--forest); font-weight: 600; text-wrap: balance; }
.quote figcaption { font-size: .85rem; color: var(--muted); }

/* icon in a soft disc - the repeated "category" mark on cards and list rows */
.disc { width: 44px; height: 44px; border-radius: 50%; background: var(--sage); color: var(--leaf); display: grid; place-items: center; flex: none; }
.disc .icon { width: 22px; height: 22px; }
.disc--gold { background: var(--yellow-tint); color: var(--forest); }

/* a plain fact list: label above value, used under hero cards and in detail panels */
.facts { list-style: none; margin: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 16px 22px; }
.facts li { min-width: 0; }
.facts dt, .facts .facts__label { display: block; font-size: .76rem; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); font-weight: 700; margin-bottom: 2px; }
.facts dd, .facts .facts__value { display: block; margin: 0; font-size: 1.15rem; font-weight: 800; color: var(--forest); letter-spacing: -.015em; font-variant-numeric: tabular-nums; }
/* an empty-state line for a filtered list that matched nothing */
.empty { text-align: center; padding: 40px 20px; color: var(--muted); background: var(--warm-white); border: 1px dashed var(--line-2); border-radius: var(--radius); }
.empty strong { display: block; color: var(--forest); font-size: 1.05rem; margin-bottom: 4px; }

/* ================================================================== 15. Dark band colours
   Last in the file on purpose: every primitive above sets a light-theme colour, and these have
   to win. Two layers - what the band itself paints, then the light "islands" (cards, tables,
   accordions, notices) that sit on it and keep their own colours. */
.band--forest { background: var(--forest); color: var(--white); }
.band--forest h1, .band--forest h2, .band--forest h3, .band--forest h4,
.band--forest .quote p, .band--forest .donut__centre strong, .band--forest .donut__label,
.band--forest .facts dd, .band--forest .facts .facts__value { color: var(--white); }
.band--forest p, .band--forest li, .band--forest dd, .band--forest dt, .band--forest figcaption,
.band--forest .lead, .band--forest .section__intro, .band--forest .split__copy > p,
.band--forest .steps__text, .band--forest .meterline { color: var(--on-dark); }
.band--forest .muted, .band--forest .small.muted, .band--forest .donut__value,
.band--forest .facts dt, .band--forest .facts .facts__label { color: var(--on-dark-muted); }
.band--forest .eyebrow { color: var(--yellow); }
.band--forest .meterline strong, .band--forest .meterline .meterline__pct { color: var(--yellow); }
.band--forest a:not(.btn):not(.chip) { color: var(--yellow); }
.band--forest :focus-visible { outline-color: var(--yellow); }
.band--forest .bar { background: rgba(255, 255, 255, .2); }
.band--forest .bar__fill { background: var(--yellow); }
.band--forest .card { background: var(--forest-2); border-color: var(--on-dark-line); }
.band--forest hr, .band--forest .rule { border-color: var(--on-dark-line); }
.band--forest .disc { background: rgba(246, 183, 44, .14); color: var(--yellow); }
.band--forest .steps { --steps-line: var(--on-dark-line); }
.band--forest .steps__num { background: transparent; border-color: var(--yellow); color: var(--yellow); }
.band--forest .donut__track { stroke: rgba(255, 255, 255, .12); }
.band--forest .donut__swatch { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .28); }

/* light islands: anything with its own pale surface keeps light-theme text on it */
.band--forest :is(.mcard, .card--light, .acc__item, .dtable-wrap, .empty, .notice:not(.notice--dark)) { background: var(--warm-white); color: var(--ink); border-color: var(--line); }
.band--forest :is(.mcard, .card--light, .acc__item, .dtable, .empty, .notice:not(.notice--dark)) :is(h2, h3, h4, strong, .acc__q, .facts__value) { color: var(--forest); }
.band--forest :is(.mcard, .card--light, .acc__item, .dtable, .empty, .notice:not(.notice--dark)) :is(p, li, dd, dt, .muted, .mcard__text, .mcard__meta, .acc__a, .facts__label) { color: var(--muted); }
.band--forest :is(.mcard, .card--light, .acc__item, .dtable, .notice:not(.notice--dark)) a:not(.btn) { color: var(--leaf); }
.band--forest :is(.mcard, .card--light) .meterline strong { color: var(--leaf-dark); }
.band--forest :is(.mcard, .card--light) .meterline .meterline__pct { color: var(--forest); }
.band--forest :is(.mcard, .card--light) .bar { background: var(--sage); }
.band--forest :is(.mcard, .card--light) .bar__fill { background: var(--leaf); }
.band--forest :is(.mcard, .card--light) :focus-visible { outline-color: var(--leaf); }
.band--forest .dtable thead th { color: var(--forest); }
.band--forest .dtable td, .band--forest .dtable th { border-bottom-color: var(--line); }

/* A picture uploaded through the Add to website pop-up. It has no editorial crop of its own,
   so it sits centred; everything else about the slot is unchanged. */
img.img--custom { object-position: 50% 50%; }

/* Crops for the seven photographs added on 25 September. Each one keeps the face or the hand-over
   in frame when the slot is wider than it is tall. */
img.img--study       { object-position: 42% 45%; }
img.img--computerlab { object-position: 40% 50%; }
img.img--uniform     { object-position: 44% 45%; }
img.img--tutoring    { object-position: 50% 42%; }
img.img--classroom   { object-position: 46% 48%; }
img.img--kitpacking  { object-position: 56% 45%; }
img.img--volunteers  { object-position: 52% 45%; }

/* The supplied logo replaces the drawn leaf mark in the header and the footer. styles.css sizes
   .brand__mark for an <svg>; an <img> needs the box spelled out, and on the dark footer the mark
   sits on a pale disc so its darkest green never disappears into the background. */
img.brand__mark { display: block; width: 40px; height: 40px; object-fit: contain; flex: 0 0 auto; }
.brand--light img.brand__mark {
  background: var(--cream);
  border-radius: 50%;
  padding: 4px;
  width: 44px;
  height: 44px;
}
@media (max-width: 900px) {
  img.brand__mark { width: 34px; height: 34px; }
  .brand--light img.brand__mark { width: 38px; height: 38px; }
}
