/* ==========================================================================
   Site styles — Citizens' Climate Lobby 2026 website
   Layered on top of styles/tokens.css. All values come from the design
   system unless explicitly noted as a deviation (see DEVIATIONS.md).
   ========================================================================== */

html { scroll-behavior: smooth; }
body { margin: 0; background: var(--bg-page); }

/* Full-width page. Content is framed to --frame-max (1440) by the fluid
   --page-gutter / --container-pad insets, while section backgrounds (nav,
   footer, colour bands) bleed to the viewport edge on wider screens. */
.page { margin: 0 auto; }
.container { max-width: 1128px; margin: 0 auto; padding: 0 var(--gutter); }
.container-wide { max-width: 1246px; margin: 0 auto; padding: 0 var(--gutter); }
.container-narrow { max-width: 780px; margin: 0 auto; padding: 0 var(--gutter); }

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

/* Figure margin reset now lives in canonical tokens.css as
   `:where(.ccl) figure { margin: 0 }`. Local rule removed. */

/* --------------------------------------------------------------------------
   Site header
   -------------------------------------------------------------------------- */
.site-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 96px;
  padding: 0 calc(var(--edge-inset) + var(--container-pad));
  background: var(--ccl-grey-10);
  /* Blue→green gradient divider beneath the primary header (design system). */
  border-bottom: 3px solid transparent;
  border-image: var(--gradient-underline) 1;
}
/* flex-shrink:0 is load-bearing. The header is a flex row, so without it the
   logo is the only item that yields and it gets crushed by the CTAs —
   measurably: 271px natural, 122px beside one CTA, and 0px (invisible) once a
   second one landed. The buttons have min-width and the toggle is fixed, so
   the brand absorbed all of it silently. */
.site-header .brand { flex-shrink: 0; }
.site-header .brand img { height: 38px; width: auto; }
.site-header nav { display: flex; align-items: center; gap: var(--spacing-2xl); }
.site-header nav a {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 16px;
  color: var(--grey-600);
  text-decoration: none;
  padding-bottom: 4px;
  border-bottom: 3px solid transparent; /* reserve space so the active underline doesn't shift layout */
}
.site-header nav a.active {
  color: var(--ccl-blue);
  font-weight: 700;
  border-image: var(--gradient-underline) 1; /* gradient underline on the active item */
}
/* Join (primary) + Donate (secondary) share one wrapper, and the wrapper is
   what makes them read as a pair. The header is `justify-content:
   space-between`, which splits free space equally between EVERY adjacent pair
   of children — so two loose CTAs got the same ~63px trench as brand↔nav
   (75px apart on a 1280 viewport despite a 12px margin). Grouped, the header
   is back to three children and the gap here is the real gap. */
.site-header .header-ctas {
  display: flex;
  align-items: center;
  gap: var(--spacing-sm);
  margin-left: var(--spacing-md);
}

/* Below ~700px the bar can't hold the logo, two 133px CTAs and the hamburger
   (they need ~660px of the ~327px available at 375px). Drop the CTAs rather
   than the logo — site.js clones both into the mobile menu, where they render
   full-width at the bottom of the panel, so nothing is lost. */
@media (max-width: 700px) {
  .site-header .header-ctas { display: none; }
}

/* --------------------------------------------------------------------------
   Utility (eyebrow) bar — slim strip above the main header for secondary,
   returning-visitor actions: a language switcher and the Volunteer Portal.
   Reads quieter than the header (grey-200 vs the header's grey-100) so it
   stays subordinate to the primary nav. position+z-index let the language
   dropdown paint above the (static) header that follows it in the DOM.
   -------------------------------------------------------------------------- */
.utility-bar {
  position: relative;
  z-index: 10;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--spacing-md);
  padding: 7px calc(var(--edge-inset) + var(--container-pad));
  background: var(--grey-200);
  font-family: var(--font-display);
  font-size: 13px;
  line-height: 1;
}
.utility-bar a { text-decoration: none; }
.utility-bar__sep { width: 1px; height: 14px; background: var(--grey-300); }
/* Dark blue, not --ccl-blue: at 13px bold on the utility bar's #ECF0F3 the
   lighter blue is 3.69:1, under AA's 4.5 (bold only counts as large text at
   18.66px+). Dark blue is 7.26:1. Hover underlines rather than shifting colour
   — the old hover target was this same dark blue, and lightening on hover
   would just move the failure into the hover state. */
.utility-bar__portal {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-weight: 700;
  color: var(--ccl-blue-dark);
}
.utility-bar__portal:hover { text-decoration: underline; }
.utility-bar__portal svg { width: 15px; height: 15px; }

/* Language switcher — native <details> so it works on every page without
   relying on assets/site.js (6 pages don't load it). Placeholder for now:
   the options don't translate yet. */
.lang-switch { position: relative; }
.lang-switch > summary {
  list-style: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--grey-600);
}
.lang-switch > summary::-webkit-details-marker { display: none; }
.lang-switch > summary::marker { content: ""; }
.lang-switch svg { width: 15px; height: 15px; }
.lang-switch .chev { transition: transform .15s ease; }
.lang-switch[open] .chev { transform: rotate(180deg); }
.lang-switch__menu {
  position: absolute;
  right: 0;
  top: calc(100% + 7px);
  margin: 0;
  padding: 6px 0;
  list-style: none;
  min-width: 132px;
  background: #fff;
  border: 1px solid var(--grey-200);
  border-radius: 6px;
  box-shadow: 0 6px 20px rgba(0, 0, 0, .10);
}
.lang-switch__menu a {
  display: block;
  padding: 7px 16px;
  color: var(--grey-600);
}
.lang-switch__menu a:hover { background: var(--grey-100); }

/* --------------------------------------------------------------------------
   Mobile primary navigation — hamburger + full-screen menu.
   Built by assets/site.js (cloned from the header <nav>, the active section's
   sub-pages, the Donate CTA and the utility-bar links) so no per-page markup
   is required. Everything here is inert above 900px; the display switches that
   turn it on live in the 900px block below, alongside the section-nav strip.
   -------------------------------------------------------------------------- */
.nav-toggle {
  display: none; /* shown only at the mobile breakpoint */
  appearance: none; border: 0; background: transparent; cursor: pointer;
  width: 44px; height: 44px; padding: 10px; margin-left: var(--spacing-sm);
  color: var(--grey-600); border-radius: var(--radius-pill);
}
.nav-toggle:hover { background: var(--grey-200); }
.nav-toggle svg { display: block; width: 24px; height: 24px; }
/* Scoped under .nav-toggle so it outranks the `.nav-toggle svg` rule above. */
.nav-toggle .nav-toggle__close { display: none; }
html.nav-open .nav-toggle__open  { display: none; }
html.nav-open .nav-toggle__close { display: block; }

.mobile-menu { display: none; }
.mobile-menu__panel {
  position: fixed; inset: 0; z-index: 100;
  background: var(--bg-page); overflow-y: auto; -webkit-overflow-scrolling: touch;
  display: flex; flex-direction: column; gap: var(--spacing-xl);
  padding: var(--spacing-lg) var(--spacing-lg) var(--spacing-2xl);
  transform: translateY(-8px); opacity: 0; visibility: hidden;
  transition: opacity .2s ease, transform .2s ease, visibility .2s ease;
}
html.nav-open .mobile-menu__panel { transform: none; opacity: 1; visibility: visible; }

.mobile-menu__bar {
  display: flex; align-items: center; justify-content: space-between;
  padding-bottom: var(--spacing-md); border-bottom: 1px solid var(--grey-200);
}
.mobile-menu__bar img { height: 34px; width: auto; }
.mobile-menu__close {
  appearance: none; border: 0; background: transparent; cursor: pointer;
  width: 44px; height: 44px; padding: 10px; color: var(--grey-600);
  border-radius: var(--radius-pill);
}
.mobile-menu__close:hover { background: var(--grey-200); }
.mobile-menu__close svg { display: block; width: 24px; height: 24px; }

.mobile-menu__primary { display: flex; flex-direction: column; }

/* Each top-level section is an accordion: a link (navigates) + a disclosure
   button (expands its sub-pages). The whole nav tree is driven by NAV_TREE in
   site.js, so every section can expand — not just the current one. */
.mobile-menu__section { border-bottom: 1px solid var(--grey-100); }
.mobile-menu__row { display: flex; align-items: center; width: 100%; }
/* A section with children renders its row as a full-width disclosure *button*:
   on mobile a tap expands (it never navigates — the section landing is reachable
   via its Overview child). A childless section keeps a plain navigating <a>.
   This diverges from desktop on purpose: there's no hover on touch, so one tap
   can't both navigate and disclose. */
button.mobile-menu__row {
  appearance: none; border: 0; background: transparent; cursor: pointer;
  font: inherit; color: inherit; text-align: left; padding: 0;
}
.mobile-menu__link {
  flex: 1; min-width: 0;
  font-family: var(--font-display); font-weight: 600; font-size: 22px;
  color: var(--grey-600); text-decoration: none; padding: 14px 0;
}
.mobile-menu__section--active > .mobile-menu__row > .mobile-menu__link {
  color: var(--ccl-blue); font-weight: 700;
}
.mobile-menu__expand {
  flex: 0 0 auto; width: 44px; height: 44px; margin-right: -10px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--grey-400);
}
.mobile-menu__expand svg { width: 22px; height: 22px; transition: transform .2s ease; }
.mobile-menu__section.is-open > .mobile-menu__row > .mobile-menu__expand svg { transform: rotate(180deg); }

/* Animated reveal via grid-rows 0fr→1fr (no fixed max-height needed). The
   inner element clips while collapsed. */
.mobile-menu__subwrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .24s ease; }
.mobile-menu__section.is-open > .mobile-menu__subwrap { grid-template-rows: 1fr; }
.mobile-menu__subinner { overflow: hidden; }

/* A section's sub-pages */
.mobile-menu__sub {
  display: flex; flex-direction: column;
  margin: 0 0 14px; padding-left: var(--spacing-md);
  border-left: 3px solid transparent; border-image: var(--gradient-underline) 1;
}
.mobile-menu__sub a {
  font-family: var(--font-body); font-size: 16px; color: var(--grey-500);
  text-decoration: none; padding: 9px 0;
}
.mobile-menu__sub a.current { color: var(--ccl-blue); font-weight: 700; }

.mobile-menu__cta { display: flex; flex-direction: column; gap: var(--spacing-sm); }
.mobile-menu__cta .btn { width: 100%; justify-content: center; font-size: 17px; padding: 14px; }

.mobile-menu__utility {
  display: flex; flex-direction: column; gap: var(--spacing-md);
  padding-top: var(--spacing-lg); border-top: 1px solid var(--grey-200);
}
.mobile-menu__utility a {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--font-display); font-weight: 600; font-size: 15px;
  color: var(--ccl-blue); text-decoration: none;
}
.mobile-menu__utility svg { width: 18px; height: 18px; }
/* Scoped so it outranks `.mobile-menu__utility a`; mutes language below the
   Volunteer Portal in the hierarchy. */
.mobile-menu__utility .mobile-menu__lang { color: var(--grey-500); font-weight: 500; }

/* Background scroll-lock while the menu is open. */
html.nav-open, html.nav-open body { overflow: hidden; }

@media (max-width: 900px) {
  /* Declutter the eyebrow on small screens: drop the language switcher,
     keep the Volunteer Portal link (the one returning users come for). */
  .utility-bar { gap: var(--spacing-sm); }
  .utility-bar .lang-switch,
  .utility-bar .utility-bar__sep { display: none; }
}

/* --------------------------------------------------------------------------
   Section nav (page-internal "About Us" wayfinding row)
   -------------------------------------------------------------------------- */
.section-nav {
  position: relative; /* anchors the mobile scroll-strip edge fades */
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: var(--spacing-xl);
  padding: var(--spacing-sm) var(--page-gutter);
  border-bottom: 1px solid var(--grey-200);
}
.section-nav .section-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 13px;
  line-height: 1;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--grey-400);
  margin: 0;
}
.section-nav .links { display: flex; align-items: center; gap: var(--spacing-2xs); }
.section-nav .links a {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 16px;
  line-height: 1;
  color: var(--grey-1000);
  text-decoration: none;
  padding: 8px 18px;
  border-radius: var(--radius-pill);
  transition: background-color .12s ease, color .12s ease;
}
.section-nav .links a:hover { background: var(--ccl-blue-bg); }
.section-nav .links a.current,
.section-nav .links a.current:hover {
  background: var(--ccl-blue);
  color: #fff;
  font-weight: 700;
}

/* --------------------------------------------------------------------------
   Breadcrumbs — Source Sans Pro tiny, chevron separators.
   Lives directly under the section-nav, above the page H1, per
   Hero System.md T3 pattern ("breadcrumb + eyebrow + H1 + one line").
   -------------------------------------------------------------------------- */
.breadcrumb {
  display: flex;
  align-items: center;
  gap: var(--spacing-xs);
  list-style: none;
  margin: 0;
  padding: var(--spacing-md) var(--page-gutter) 0;
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  line-height: var(--lh-tiny);
  color: var(--grey-500);
}
.breadcrumb li { display: flex; align-items: center; gap: var(--spacing-xs); }
.breadcrumb a {
  color: var(--grey-500);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color .12s ease, color .12s ease;
}
.breadcrumb a:hover { color: var(--ccl-blue); border-bottom-color: var(--ccl-blue); }
.breadcrumb li[aria-current="page"] {
  color: var(--ccl-black);
  font-weight: var(--fw-strong-body);
}
.breadcrumb .sep {
  color: var(--grey-300);
  font-size: 16px;
  line-height: 1;
}

/* Eyebrows — canonical .eyebrow-blue / .eyebrow-green / .eyebrow-meta now
   live in tokens.css (see A9/A16 resolved). Local defs removed. */

/* Category tag — topic metadata on an article or story card ("Advance
   Climate Policy", "News", "Youth"). NOT a wayfinding eyebrow (see the
   eyebrow roles in tokens.css): it names a property of the content, repeats
   freely across card grids, and links to that topic's story listing — so it
   reads at the meta scale (tiny, tight tracking) with card-CTA link ink
   rather than the eyebrow's section-start voice. Use <a class="category-tag">
   when it stands alone (article headers); inside a card that is itself a
   link, use a <p>/<span> — nested anchors aren't allowed, and the card
   carries the click. */
.category-tag {
  display: inline-block;
  align-self: flex-start;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-tiny);
  line-height: calc(var(--lh-tiny) / var(--fs-tiny));
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--fg-link-strong);
  text-decoration: none;
  /* Neutralize the global .ccl link underline (tokens.css paints it via
     border-bottom-color on hover) — otherwise it stacks with the
     text-decoration underline below and renders a double line. */
  border-bottom: none;
  margin: 0;
}
a.category-tag:hover { color: var(--ccl-navy); text-decoration: underline; }

/* --------------------------------------------------------------------------
   Buttons (extending tokens.css)
   -------------------------------------------------------------------------- */
.btn {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--text-md);
  line-height: 1;
  padding: 14px 28px;
  border-radius: var(--radius-pill);   /* pill = action (§9) */
  border: 2px solid transparent;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  text-decoration: none;
  transition: background-color .12s ease, border-color .12s ease, color .12s ease;
}
.btn-primary {
  background: var(--ccl-green);
  color: var(--ccl-black);
  border-color: var(--ccl-green);
  font-weight: 600;
}
.btn-primary:hover {
  background: var(--ccl-green-dark);
  border-color: var(--ccl-green-dark);
  color: #fff;
}

/* --------------------------------------------------------------------------
   Display + heading helpers
   -------------------------------------------------------------------------- */
.display {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-display);
  line-height: var(--lh-display);
  letter-spacing: -1px;
  color: var(--ccl-black);
  margin: 0;
}
.ccl .h1-bold {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
  /* No margin here on purpose — typography utility, not layout. Each
     context (.section-header, .values-header, .action-blogs) sets its
     own spacing. */
}
.h2-regular {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0;
}
.body-lead {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
}
/* Body 2 — the 19/1.5/-0.285 paragraph style that recurs across pages.
   Until A1 lands in the system (re-apply the canonical 18/28 token),
   this is the local utility to use instead of duplicating inline styles. */
.body-2 {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.body-lg {
  font-family: var(--font-body);
  font-size: 20px;
  line-height: var(--spacing-xl);
  letter-spacing: -0.3px;
  color: var(--ccl-black);
}

/* --------------------------------------------------------------------------
   T1 hero (used on page 1)
   Two-column split, blue offset slot behind a photo on the right.
   Slot ratio for photo/video: 1.05fr 1fr (per Hero System.md)
   -------------------------------------------------------------------------- */
.hero-t1 {
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: var(--spacing-5xl);
  padding: var(--spacing-5xl) var(--page-gutter);
  align-items: center;
}
.hero-t1__text { max-width: 560px; }

/* Hand-drawn underline emphasis on the personal-voice phrase is the shared
   .hdr-underline utility (§ Hero Emphasis) — this hero used to carry its own
   copy at a fixed 18px stroke, which shadowed the utility. Removed so there
   is one rule; see the note on .hdr-underline for why both values are em. */
.hero-t1__text .display { margin-top: var(--spacing-md); margin-bottom: var(--spacing-lg); }
.hero-t1__text p { font-size: 20px; line-height: var(--spacing-xl); color: var(--ccl-black); margin: 0 0 var(--spacing-lg); }

.hero-t1__media {
  position: relative;
  aspect-ratio: 16 / 10;
}
/* Modifier — use when the slot holds something other than a photo
   (a CongressWeb widget, an action card, a third-party embed). The
   blue offset stays (per Hero System.md T1 action-tool pattern) but the
   fixed aspect-ratio is dropped so the slot grows to fit content. */
.hero-t1__media--bare { aspect-ratio: auto; }
/* Blue offset slot — extends ABOVE and to the RIGHT of the photo, all four
   corners rounded at --radius-lg. Matches the .slot-bg pattern in the design
   system's Hero System CSS. */
.hero-t1__media::before {
  content: '';
  position: absolute;
  inset: -28px -28px 28px 28px;
  background: var(--ccl-blue);
  border-radius: var(--radius-lg);
  z-index: 0;
}
.hero-t1__media .photo {
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}
.hero-t1__media .photo img { width: 100%; height: 100%; object-fit: cover; }

/* Hero video (autoplay loop) sitting in the framed .photo slot, with a
   lower-third caption overlay. Used on the monthly-meeting hero. */
.hero-video-photo { margin: 0; padding: 0; }
.hero-video-photo__video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.hero-video-caption {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  margin: 0;
  z-index: 2;
  padding: var(--spacing-2xl) var(--spacing-lg) var(--spacing-md);
  background: linear-gradient(to top, rgba(0, 0, 0, 0.72), rgba(0, 0, 0, 0));
  color: #fff;
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1.4;
}
.hero-video-caption strong { font-weight: 700; }
/* Top-right toggle variant — keeps the pause control clear of the caption. */
.video-toggle--tr {
  top: var(--spacing-md);
  bottom: auto;
}

/* Lite YouTube embed container — base for the poster + play-button +
   later-injected iframe pattern. Every .lite-yt is its own positioning
   context so the absolutely-positioned .play-btn inside can't escape to
   an outer ancestor (regression we hit twice — see DEVIATIONS D6 notes).
   Context-specific overrides (founder-video, etc.) only add what they
   need (e.g. shadow) on top of this base. */
.lite-yt {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-md);
  overflow: hidden;
  cursor: pointer;
}
.lite-yt > img,
.lite-yt > iframe {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border: 0;
}

/* Play button — single base class + size modifiers. Apply by adding the
   class to any <button> sitting inside a positioned poster container
   (`.lite-yt`, `.hero-t1__media .photo`, `.founder-video .lite-yt`, etc.).
   Default is medium (74px). Use --lg for hero overlays, --sm for nested
   inset cards. The chrome (green circle + black arrow) is identical. */
.play-btn {
  position: absolute;
  inset: 0;
  margin: auto;
  width: 74px;
  height: 74px;
  border-radius: 50%;
  background: var(--ccl-green);
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-elevated);
  z-index: 2;
}
.play-btn::after {
  content: '';
  width: 0; height: 0;
  margin-left: 6px;
  border-style: solid;
  border-width: 14px 0 14px 22px;
  border-color: transparent transparent transparent var(--grey-1000);
}
.play-btn--lg { width: 96px; height: 96px; }
.play-btn--lg::after { margin-left: 8px; border-width: 18px 0 18px 28px; }
.play-btn--sm { width: 64px; height: 64px; }
.play-btn--sm::after { margin-left: 5px; border-width: 12px 0 12px 18px; }

/* Corner play affordance — anchors the button bottom-left so it never
   covers a face (pattern promoted from the Youth Action Team vivid build's
   .at-feature__media treatment). Add .play-btn--corner to the button and
   .video-scrim to its positioned poster container: the whole tile stays
   clickable, only the affordance moves, and the soft scrim keeps the
   chrome legible over light photos. Composes with the size modifiers. */
.play-btn--corner {
  inset: auto auto var(--spacing-sm) var(--spacing-sm);
  margin: 0;
  transition: transform .15s ease;
}
.video-scrim::before {
  content: '';
  position: absolute;
  left: 0;
  bottom: 0;
  width: 45%;
  height: 45%;
  background: radial-gradient(120% 120% at 0% 100%, rgba(0,0,0,.32), transparent 70%);
  border-radius: 0 0 0 var(--radius-md);
  pointer-events: none;
  z-index: 1;
}
.video-scrim:hover .play-btn--corner { transform: scale(1.08); }
/* Accent mark — sparkle squiggles in the negative space above-left of the
   offset block. Matches BrandMark kind="accent" placement in heroes.jsx. */
.hero-t1__media .accent-mark {
  position: absolute;
  top: -50px;
  left: -50px;
  width: 78px;
  height: auto;
  transform: rotate(-70deg);
  z-index: 3;
  pointer-events: none;
}

/* --------------------------------------------------------------------------
   Centered section header (What We Do, Our Team etc.)
   -------------------------------------------------------------------------- */
.section-header {
  text-align: center;
  padding: var(--spacing-3xl) var(--container-pad);
  max-width: 780px;
  margin: 0 auto;
}
.section-header .h1-bold { margin-bottom: var(--spacing-sm); }

/* Pillar cards (Reduce / Protect / Remove emissions) */
.pillar-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-md);
  max-width: 780px;
  margin: var(--spacing-lg) auto var(--spacing-3xl);
  padding: 0 var(--container-pad);
}
.pillar-card {
  background: var(--grey-100);
  border-radius: var(--radius-sm);
  padding: var(--spacing-md);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--spacing-lg);
  text-align: center;
}
.pillar-card .icon-circle {
  width: 116px;
  height: 116px;
  border-radius: 50%;
  background: var(--ccl-green);
  display: flex;
  align-items: center;
  justify-content: center;
}
.pillar-card .icon-circle img { width: 80px; height: 80px; }
.pillar-card h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0;
}

/* --------------------------------------------------------------------------
   "Last year we mobilized" + side gradient callout
   -------------------------------------------------------------------------- */
.mobilized {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 50px;
  padding: var(--spacing-md) var(--gutter);
  max-width: 1280px;
  margin: 0 auto;
}
.mobilized__list h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-sm);
}
/* Adapted from ImpactStats in the marketing kit — huge numeral with a
   CCL-green offset shadow, label stacked below. Hybrid size (56px instead
   of the kit's 88px) since these sit in a narrow column next to the
   gradient callout. */
.mobilized__stat { margin-bottom: var(--spacing-lg); }
.mobilized__stat .stat-n {
  position: relative;
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 56px;
  line-height: 0.95;
  letter-spacing: -0.02em;
  margin-bottom: var(--spacing-xs);
}
.mobilized__stat .stat-n-shadow {
  position: absolute;
  left: 3px;
  top: 3px;
  color: var(--brand);
  user-select: none;
}
.mobilized__stat .stat-n-fg {
  position: relative;
  color: var(--ccl-black);
}
.mobilized__stat .stat-l {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 18px;
  line-height: 1.35;
  color: var(--ccl-black);
}

.mobilized__callout {
  /* DEVIATION #3: design uses linear-gradient(to bottom,...), system says 135deg only. */
  background: var(--gradient-blue-green);
  border-radius: var(--radius-sm);
  padding: var(--spacing-md) var(--spacing-xl);
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--spacing-md);
  color: #fff;
}
.mobilized__callout h2 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  margin: 0;
  color: #fff;
}
.mobilized__callout p { color: #fff; font-size: 19px; letter-spacing: -0.285px; margin: 0; line-height: 1.4; }
.mobilized__callout .btn-ghost-on-dark { align-self: flex-start; }
/* Note: .ghost-btn local rule removed in favor of canonical .btn-ghost-on-dark
   from tokens.css. Apply the canonical class on the <a> instead. */

/* --------------------------------------------------------------------------
   Team cards row (Staff / Boards / Volunteers on page 1)
   -------------------------------------------------------------------------- */
.team-cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-lg);
  padding: var(--spacing-md) var(--gutter) var(--spacing-3xl);
  max-width: 1280px;
  margin: 0 auto;
}
.team-card {
  background: #fff;
  border: 1px solid rgba(0,0,0,0.1);
  border-radius: var(--radius-md);
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  box-shadow: var(--shadow-card);
  display: flex;
  flex-direction: column;
}
.team-card__image {
  height: 204px;
  background: var(--grey-200);
  overflow: hidden;
  border-bottom: 1px solid rgba(0,0,0,0.06);
}
.team-card__image img { width: 100%; height: 100%; object-fit: cover; }
.team-card__body { padding: var(--spacing-xl); display: flex; flex-direction: column; gap: var(--spacing-lg); }
.team-card__body h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-xs);
}
.team-card__body p {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 24px;
  color: rgba(0,0,0,0.6);
  margin: 0;
}
/* .team-card__link styling is shared — see "CARD CTA LINK". No layout delta. */

/* --------------------------------------------------------------------------
   Pull-quote — canonical `.conf-quote-block` from preview/pull-quote.html
   (May-23 DS bundle, B3/A12 resolved).
   Three-sided green→blue gradient border around the body; brand quote.svg
   glyph at top-left punching through the top border. Use `.tight` on
   `.quote-body` for shorter quotes (drops headline from H2 → H3).
   -------------------------------------------------------------------------- */
.conf-quote-block {
  display: grid;
  max-width: 750px;
  margin: var(--spacing-3xl) auto;
  box-sizing: border-box;
}
.conf-quote-block .quote-top,
.conf-quote-block .quote-bottom {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: 2em;
}
.conf-quote-block .quote-top { min-height: 78px; }
.conf-quote-block .quote-icon {
  background-color: var(--quote-surface-bg);
  z-index: 500;
  padding-right: 2em;
  position: relative;
}
.conf-quote-block .quote-icon img { display: block; width: 86px; height: auto; }
.conf-quote-block .quote-border-top { height: 5px; width: 100%; }
.conf-quote-block .quote-middle { display: grid; grid-template-columns: 1fr auto; }
.conf-quote-block .quote-body {
  margin-top: -39px;
  padding-top: 55px;
  margin-bottom: -21px;
  padding-bottom: 39px;
  padding-right: 1em;
  border-image: linear-gradient(180deg, var(--ccl-green) 7.45%, var(--ccl-blue) 92.22%) 1;
  border-width: 4px;
  border-right-style: solid;
  border-top-style: solid;
  border-bottom-style: solid;
}
.conf-quote-block .quote-body p { margin: 0; }
/* .tight modifier — when the quote is short, H2 reads too aerial. Drop to H3. */
.conf-quote-block .quote-body.tight p {
  font-size: var(--fs-h3);
  line-height: calc(var(--lh-h3) / var(--fs-h3));
}
/* Gradient-text emphasis inside the quote — one phrase per quote. */
.conf-quote-block .quote-body .emph {
  background: var(--gradient-blue-green);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  font-weight: var(--fw-strong-heading);
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}
.conf-quote-block .quote-author {
  padding-left: 1.5em;
  padding-right: 2em;
  background-color: var(--quote-surface-bg);
  position: relative;
  z-index: 500;
}
.conf-quote-block .quote-author-name {
  font-family: var(--font-display);
  font-weight: 700;
  font-style: italic;
  color: var(--ccl-black);
  font-size: 1em;
}
.conf-quote-block .quote-author-title {
  font-family: var(--font-body);
  font-style: italic;
  color: var(--grey-500);
  font-size: 0.95em;
  margin-top: 2px;
}
/* Spotlight variant — no em-dash, non-italic name (for member-spotlight). */
.conf-quote-block .quote-author.spotlight .quote-author-name,
.conf-quote-block .quote-author.spotlight .quote-author-title { font-style: normal; }

/* Mobile pull-quote — the canonical layout assumes a roomy container; on
   narrow viewports the block touches the screen edges, the 86px quote glyph
   eats half the row, and the 2em gap between icon and gradient line pushes
   text into too few characters per line. Pull the block in by --page-gutter
   so it lines up with every other section's edge, shrink the glyph (keeping
   the icon-half-over-border math: top min-height ÷ 2 = body negative
   margin-top), and tighten the column gap. Breakpoint matches the
   page-gutter flip + layout-reflow in tokens.css / site.css. */
@media (max-width: 900px) {
  .conf-quote-block {
    margin-left: var(--page-gutter);
    margin-right: var(--page-gutter);
  }
  .conf-quote-block .quote-top,
  .conf-quote-block .quote-bottom { gap: 1em; }
  .conf-quote-block .quote-top { min-height: 56px; }
  .conf-quote-block .quote-icon { padding-right: 1em; }
  .conf-quote-block .quote-icon img { width: 56px; }
  .conf-quote-block .quote-body {
    margin-top: -28px;
    padding-top: 36px;
    padding-right: 0.75em;
  }
  .conf-quote-block .quote-author {
    padding-left: 1em;
    padding-right: 1em;
  }
}

/* Surface awareness — pull-quote icon + author backgrounds read from
   var(--quote-surface-bg) (default #fff in tokens.css). Any parent that
   isn't white should declare this variable so the "punch-through" effect
   on the gradient borders still works. Examples: .team-panel below sets
   it to grey-100; the Take Action monthly-meetings panel does too. */

.divider-thick {
  width: 100%;
  max-width: 780px;
  height: 4px;
  background: var(--grey-200);
  margin: 0 auto;
}
/* Section-seam spacing. `.xx-divider { margin: var(--spacing-4xl) auto }` was
   page-local in seven files (at-/ld-/vv-divider), identical every time — this
   is that rule with a name. Dividers belong only at white-on-white seams; a
   tinted or gradient band already separates itself. */
.divider-thick--spaced { margin-block: var(--spacing-4xl); }

/* --------------------------------------------------------------------------
   Site footer — Figma 3042:2923

   Two stacked bands. The upper band on --grey-600 carries the CCL/CCE
   lockup + accreditation badges and three link columns (About, Get Involved,
   Contact, the last one ending in the social row). The lower legal bar sits
   a step darker and carries the copyright, the 501(c)(3)/(c)(4) disclosure
   and the policy links.

   Both bands bleed to the viewport edge; their content is framed by
   --page-gutter like every other full-width section.
   -------------------------------------------------------------------------- */
.site-footer {
  background: var(--grey-600);
  color: var(--grey-200);
}
.site-footer__cols {
  display: grid;
  /* Ratios reproduce the design's four column origins (72 / 533 / 786 / 1029
     in the 1440 frame). The brand column is widest because the badge row is
     ~380px of fixed artwork; Contact's track runs wider than its contents so
     the three link columns stay clustered rather than spreading to the edge. */
  grid-template-columns: 2.2fr 1.05fr 1fr 1.9fr;
  gap: var(--spacing-4xl);
  padding: var(--spacing-3xl) var(--page-gutter) var(--spacing-4xl);
}

/* -- Brand column ---------------------------------------------------------- */
/* White lockup, so no brightness/invert filter — the asset is already white. */
.site-footer__logo { width: 362px; max-width: 100%; height: auto; }
.site-footer__badges {
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  gap: var(--spacing-lg);
  list-style: none;
  margin: var(--spacing-xl) 0 0;
  padding: 0;
}
/* No shared sizing rule here on purpose: the three badges are unlike artworks
   at three different intrinsic ratios, so each carries its own width/height
   in the markup and this only stops them overflowing a narrow column. */
.site-footer__badges img { max-width: 100%; height: auto; }

/* -- Link columns ---------------------------------------------------------- */
.site-footer__col h4 {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading, 700);
  font-size: var(--fs-h4);
  line-height: calc(var(--lh-h4) / var(--fs-h4));
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: #fff;
  margin: 0 0 var(--spacing-xs);
}
.site-footer__col ul { list-style: none; padding: 0; margin: 0; }
/* 4px on top of the 28px line box reproduces the design's ~32px row pitch
   while keeping the system's --lh-small rather than a one-off line-height. */
.site-footer__col ul:not(.site-footer__social) li + li { margin-top: var(--spacing-2xs); }
.site-footer__col a,
.site-footer__col .site-footer__item {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-2xs);
  color: var(--grey-200);
  font-size: var(--fs-small);
  line-height: calc(var(--lh-small) / var(--fs-small));
  text-decoration: none;
}
.site-footer__col a:hover,
.site-footer__col a:focus-visible { color: #fff; text-decoration: underline; }
/* Off-site destinations keep the tabler external-link glyph from the design. */
.site-footer__col svg { width: 18px; height: 18px; flex: none; fill: currentColor; }

/* -- Social row ------------------------------------------------------------ */
/* Scoped through .site-footer__col so it outranks that block's `ul { margin: 0 }`
   reset, which is otherwise the more specific selector. */
.site-footer__col .site-footer__social {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
  list-style: none;
  margin: var(--spacing-lg) 0 0;
  padding: 0;
}
.site-footer__social li { display: flex; }
.site-footer__social img { width: 35px; height: 35px; }
.site-footer__social a { display: block; border-radius: var(--radius-pill); }
.site-footer__social a:hover img { opacity: 0.85; }

/* -- Legal bar ------------------------------------------------------------- */
/* #1A1A1A is Figma's `background/inverse`; the system has no token between
   --grey-600 (#333) and --grey-1000 (#000). See DESIGN-SYSTEM-FEEDBACK.md. */
.site-footer__legal {
  background: #1A1A1A;
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--spacing-lg) var(--spacing-4xl);
  padding: var(--spacing-md) var(--page-gutter);
  min-height: 96px;
}
.site-footer__legal p {
  margin: 0;
  max-width: 640px;
  font-size: var(--fs-tiny);
  line-height: calc(var(--lh-tiny) / var(--fs-tiny));
  color: var(--grey-300);
}
.site-footer__legal p strong { color: #fff; font-weight: 700; }
.site-footer__policy {
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-md) var(--spacing-xl);
  list-style: none;
  margin: 0;
  padding: 0;
}
.site-footer__policy a,
.site-footer__policy .site-footer__item {
  color: #fff;
  font-size: var(--fs-tiny);
  line-height: calc(var(--lh-tiny) / var(--fs-tiny));
  text-decoration: none;
  white-space: nowrap;
}
.site-footer__policy a:hover,
.site-footer__policy a:focus-visible { text-decoration: underline; }

/* Prototype-only: labels whose page doesn't exist yet render as plain text
   rather than a dead link, so user testing never hits a 404 or a click that
   does nothing. Swap the <span> for an <a> as each page lands. */
.site-footer__item { cursor: default; }

/* Between the frame width and the 900px collapse the four columns squeeze the
   badge row; drop the brand onto its own full-width row and let the three link
   columns share the next one. */
@media (max-width: 1200px) {
  .site-footer__cols { grid-template-columns: repeat(3, 1fr); gap: var(--spacing-xl) var(--spacing-4xl); }
  .site-footer__brand { grid-column: 1 / -1; }
}

/* ==========================================================================
   TAKE ACTION SECTION — 838:1918, 841:5902, 1039:4500
   T2 photo-overlay hero, action cards (time-eyebrow + title + body + arrow
   link), light-blue info card, three-parts grid, green/blue callout panels,
   progress meter, current-action banner.
   ========================================================================== */

/* T2 hero — full-bleed photo behind a white overlay card on the left.
   White card has eyebrow + display headline (with optional gradient phrase
   + gradient underline) + sub + primary CTA. Anchored top + left. */
.hero-t2 {
  position: relative;
  max-width: 1440px;
  margin: 0 auto var(--spacing-3xl);
  padding: var(--spacing-3xl) var(--gutter) var(--spacing-5xl);
}
.hero-t2__photo {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 7.7;
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}
.hero-t2__photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.hero-t2__card {
  position: absolute;
  top: 50%;
  left: var(--spacing-5xl);
  transform: translateY(-50%);
  background: #fff;
  border-radius: var(--radius-md);
  box-shadow: 0 1px 10px rgba(0,0,0,0.25);
  padding: var(--spacing-2xl);
  max-width: 510px;
}
.hero-t2__card .eyebrow-blue {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ccl-blue);
  margin: 0 0 var(--spacing-sm);
}
.hero-t2__card h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-display);
  line-height: var(--lh-display);
  letter-spacing: -1px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.hero-t2__card p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
}
/* T2 on a phone. Absolutely positioned, the 510px card is wider than the
   viewport and buries the photo it's supposed to sit on. Below the reflow
   breakpoint the card returns to flow and rides up over the photo's bottom
   edge instead, which keeps the overlay relationship at a size that fits.
   Scoped off --fluid: that modifier already owns its own mobile geometry. */
@media (max-width: 900px) {
  .hero-t2:not(.hero-t2--fluid) { padding-bottom: var(--spacing-3xl); }
  .hero-t2:not(.hero-t2--fluid) .hero-t2__photo { aspect-ratio: 4 / 3; }
  .hero-t2:not(.hero-t2--fluid) .hero-t2__card {
    position: static;
    transform: none;
    max-width: none;
    /* pull-up stays smaller than the padding, or the headline's first line
       lands on the photo instead of on the card. */
    margin: calc(-1 * var(--spacing-lg)) var(--spacing-md) 0;
    padding: var(--spacing-xl);
  }
}

/* T1 variant with text-left + blue offset slot containing a video poster.
   Used on Monthly Meeting + Current Actions detail pages. Slightly
   different proportions from the About Us T1. */
.hero-t1--media {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-5xl);
  padding: var(--spacing-3xl) var(--gutter);
  align-items: center;
  max-width: 1440px;
  margin: 0 auto;
}
.hero-t1--media .hero-t1__text { max-width: 480px; }
.hero-t1--media .hero-t1__text h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-display);
  line-height: var(--lh-display);
  letter-spacing: -1px;
  color: var(--ccl-black);
  margin: var(--spacing-md) 0 var(--spacing-lg);
}
/* :not(eyebrows) — this (0,2,1) selector otherwise outguns the canonical
   .ccl .eyebrow-* (0,2,0) color in tokens.css and paints eyebrows black. */
.hero-t1--media .hero-t1__text p:not(.eyebrow-blue):not(.eyebrow-green) {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
}
/* H3 Regular — parallel to .h2-regular; H3 size but weight 400 (not 700).
   Used as sub-headlines in T1-media heroes. */
.h3-regular {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
}
.hero-t1--media .hero-t1__text .h3-regular { margin: 0 0 var(--spacing-xl); }

/* Action card — white card, image top, time eyebrow + heading + body +
   arrow link. Same chrome as a blog card but with an "in-card text link"
   instead of a click-the-whole-card pattern. */
.action-cards-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-lg);
  max-width: 1166px;
  margin: var(--spacing-md) auto var(--spacing-2xl);
  padding: 0 var(--container-pad);
}
.action-card {
  background: #fff;
  border: 1px solid rgba(0,0,0,0.1);
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-card);
  display: flex;
  flex-direction: column;
}
.action-card__image {
  aspect-ratio: 16 / 9;
  background: var(--grey-200);
  overflow: hidden;
  border-bottom: 1px solid rgba(0,0,0,0.1);
}
.action-card__image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.action-card__body {
  padding: var(--spacing-xl);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
  flex: 1;
}
.action-card__time {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 14px;
  line-height: 20px;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: rgba(0,0,0,0.6);
  margin: 0;
}
.action-card__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 20px;
  line-height: 28px;
  color: var(--ccl-black);
  margin: 0;
}
.action-card__body p {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 24px;
  color: rgba(0,0,0,0.6);
  margin: 0;
  flex: 1;
}
/* .action-card__link styling is shared — see "CARD CTA LINK". Layout only: */
.action-card__link { margin-top: auto; }

/* The 3-up never collapsed, so on a phone each card was ~110px wide and any
   nowrap pill inside it (e.g. "Write Congress") ran past the card edge. Two-up
   at the shared reflow breakpoint, single column once even that is too narrow. */
@media (max-width: 900px) { .action-cards-row { grid-template-columns: 1fr 1fr; } }
@media (max-width: 620px) { .action-cards-row { grid-template-columns: 1fr; } }

/* Toggle filter (e.g. "Only show quick actions") — visual-only switch */
.cards-toolbar {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: var(--spacing-sm);
  max-width: 1166px;
  margin: var(--spacing-md) auto 0;
  padding: 0 var(--container-pad);
  font-family: var(--font-body);
  font-size: 16px;
  color: var(--ccl-black);
}
.toggle {
  display: inline-block;
  width: 64px;
  height: 32px;
  border-radius: 32px;
  background: rgba(0,0,0,0.04);
  border: 1px solid rgba(0,0,0,0.45);
  position: relative;
  cursor: pointer;
  vertical-align: middle;
}
.toggle::after {
  content: '';
  position: absolute;
  top: 2px; left: 2px;
  width: 26px; height: 26px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 2px rgba(0,0,0,0.2);
}

/* ==========================================================================
   EVENT CTA BAND — .event-cta
   The conference "Secure your spot" close, per Figma 1111-537: soft
   blue→green wash, handwritten kicker, benefit list, CTA, photo right.
   Distinct from `.join-cta` (dark navy, single line + button) because this
   one sells an event with reasons-to-come rather than restating a mission.
   ========================================================================== */
.event-cta {
  background: linear-gradient(197deg, #FFFFFF 12%, #E8F3F9 30%, #EBF4DC 79%);
  padding: var(--spacing-5xl) var(--page-gutter);
}
.event-cta__inner {
  max-width: 1166px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-3xl);
  align-items: center;
}
@media (max-width: 900px) { .event-cta__inner { grid-template-columns: 1fr; } }
.event-cta__kicker {
  font-family: var(--font-hand);
  font-weight: 400;
  font-size: 26px;
  line-height: 1.1;
  color: var(--ccl-blue);
  margin: 0 0 var(--spacing-2xs);
}
.ccl .event-cta__copy h2 { margin: 0 0 var(--spacing-lg); }
.event-cta__list { list-style: none; margin: 0 0 var(--spacing-xl); padding: 0; display: grid; gap: var(--spacing-sm); }
.event-cta__list li {
  display: flex;
  align-items: flex-start;
  gap: var(--spacing-sm);
  font-size: var(--fs-small);
  line-height: calc(var(--lh-small) / var(--fs-small));
  color: var(--ccl-black);
}
.event-cta__list img { width: 26px; height: 26px; flex-shrink: 0; }
.event-cta__media { border-radius: var(--radius-md); overflow: hidden; aspect-ratio: 4 / 3; }
.event-cta__media img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ==========================================================================
   PHOTO SHOWCASE — .photo-showcase
   A portrait feature (photo or vertical video) beside rows of landscape shots.
   Use when the photos are all a similar aspect ratio — CCL's library is nearly
   all 3:2 landscape, so a columns-based masonry just reads as an even grid and
   the size contrast has to come from the layout instead of the source images.

   Structure — feature, then a __grid of __rows holding two tiles each:
     .photo-showcase
       .photo-showcase__feature        portrait, 9:16
       .photo-showcase__grid
         .photo-showcase__row          even split
         .photo-showcase__row--wide    1.3 / 1 split
         .photo-showcase__row

   Alternating an off-balance row keeps the landscape tiles from marching in
   identical rectangles. The 1 : 1.75 column split is derived, not eyeballed:
   it's the ratio at which a 9:16 feature is exactly as tall as three rows of
   3:2 tiles, so nothing in an even row gets cropped.
   ========================================================================== */
.photo-showcase {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.75fr);
  gap: var(--spacing-sm);
}
.photo-showcase__grid {
  display: grid;
  grid-template-rows: repeat(3, 1fr);
  gap: var(--spacing-sm);
}
.photo-showcase__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-sm);
}
.photo-showcase__row--wide { grid-template-columns: 1.3fr 1fr; }
.photo-showcase__feature,
.photo-showcase__row > * {
  position: relative;
  border-radius: var(--radius-md);
  overflow: hidden;
  margin: 0;
  min-height: 0;
}
/* Media is taken out of flow so the tiles contribute no intrinsic height. That
   makes the feature's 9:16 the only thing sizing the block: __grid stretches to
   it, its three 1fr rows split that evenly, and every tile fills its own share.
   Leave the images in flow and each one sizes to its natural height instead,
   and the two columns drift out of alignment. */
.photo-showcase img,
.photo-showcase__feature > iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border: 0;
}
/* The feature is the one slot that fits portrait media, so it also takes a
   vertical video (a YouTube Short) — this ratio has to beat .lite-yt's 16/9. */
.photo-showcase__feature,
.photo-showcase__feature.lite-yt { aspect-ratio: 9 / 16; }

@media (max-width: 900px) {
  /* Side by side, the feature would have to be either tiny or crop-heavy, so
     stack it above the rows and cap it — a full-bleed 9:16 fills the screen.
     Stacked, there's no feature height left to stretch into, so the rows carry
     their own ratio: two 3:2 tiles plus a gap sit at roughly 3:1. */
  .photo-showcase { grid-template-columns: 1fr; }
  .photo-showcase__feature { max-width: 300px; margin-inline: auto; }
  .photo-showcase__grid { grid-template-rows: repeat(3, auto); }
  .photo-showcase__row { aspect-ratio: 3 / 1; }
}

/* ==========================================================================
   PHOTO MASONRY — .photo-masonry
   Promoted 2026-08-11 from `.at-about__gallery`, which was duplicated
   page-local across four action-team files and zero times here. Uneven photo
   heights stay uneven (CSS columns), which reads as a gallery rather than a
   uniform grid. On phones it becomes a swipeable strip instead of a tall stack.
   ========================================================================== */
.photo-masonry { columns: 3; column-gap: var(--spacing-sm); }
.photo-masonry--2 { columns: 2; }
.photo-masonry img {
  width: 100%;
  margin: 0 0 var(--spacing-sm);
  border-radius: var(--radius-md);
  display: block;
  break-inside: avoid;
}
@media (max-width: 900px) { .photo-masonry { columns: 2; } }
@media (max-width: 620px) {
  .photo-masonry {
    columns: auto;
    display: flex;
    gap: var(--spacing-sm);
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    margin: 0 calc(-1 * var(--container-pad));
    padding: 0 var(--container-pad) var(--spacing-xs);
  }
  .photo-masonry img { flex: 0 0 70%; height: 220px; margin: 0; object-fit: cover; scroll-snap-align: start; }
}

/* ==========================================================================
   CONFERENCE SESSION LIST — .sessions / .session
   One entry in a day's programme, inside a .tabs day panel. Time column +
   content so times align down the day. Shared (not page-local) because both
   the summer and fall conference pages run the same programme structure.
   ========================================================================== */
.sessions { display: grid; gap: var(--spacing-md); margin: 0; padding: 0; list-style: none; }
.session {
  display: grid;
  grid-template-columns: 160px minmax(0, 1fr);
  gap: var(--spacing-lg);
  padding-bottom: var(--spacing-md);
  border-bottom: 1px solid var(--grey-200);
}
.session:last-child { border-bottom: 0; padding-bottom: 0; }
.session__time {
  font-family: var(--font-display);
  font-weight: var(--fw-weak);
  font-size: var(--fs-small);
  color: var(--ccl-black);
}
.ccl .session__title {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-h4);
  line-height: calc(var(--lh-h4) / var(--fs-h4));
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-2xs);
}
.ccl .session__body { font-size: var(--fs-small); margin: 0; }
/* Speaker credits are a separate beat from the session copy — without this
   they butt straight up against the last line of the description. Lives on
   .session rather than .people--inline because it's the session's internal
   rhythm, not something the person component should carry everywhere. */
.session .people--inline { margin-top: var(--spacing-md); }
/* Nested breakouts read as a sub-list under their parent session. */
.session__sub { margin: var(--spacing-xs) 0 0; padding-left: var(--spacing-lg); font-size: var(--fs-small); display: grid; gap: var(--spacing-2xs); }
@media (max-width: 700px) {
  .session { grid-template-columns: 1fr; gap: var(--spacing-2xs); }
}

/* ==========================================================================
   PERSON CARD — .people / .person
   Promoted 2026-08-11 from two drifting page-local copies (action-team-pgm
   96px photos, action-team-roc 56px avatars) that were about to become a
   third on the conference pages. One component, two avatar treatments:
     .person__photo  — a real headshot
     .person__avatar — initials, for people with no photo yet. Never stand a
                       stock face in for a real, named person.
   Flex (not grid) so a partial last row centers.
   ========================================================================== */
.people {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--spacing-xl);
  padding: 0;
  margin: 0;
  list-style: none;
}
.person {
  --person-photo: 96px;
  flex: 0 1 calc((100% - 2 * var(--spacing-xl)) / 3);
  min-width: 220px;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2xs);
}
.person__photo,
.person__avatar {
  width: var(--person-photo);
  height: var(--person-photo);
  border-radius: var(--radius-sm);
  display: block;
  margin-bottom: var(--spacing-xs);
  flex-shrink: 0;
  overflow: hidden;
}
.person__photo {
  object-fit: cover;
  object-position: 50% 30%;
  background: var(--grey-200);
}
/* Tolerates either shape: <img class="person__photo"> or a wrapper div around
   an img (which the directory needs, so an aspect-ratio box can hold a
   background fallback while the image loads). */
.person__photo > img { width: 100%; height: 100%; object-fit: cover; display: block; }
.person__avatar {
  background: var(--ccl-blue-bg);
  color: var(--ccl-blue-dark);
  display: grid;
  place-items: center;
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: calc(var(--person-photo) / 3.4);
}
.ccl .person__name {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-h4);
  line-height: calc(var(--lh-h4) / var(--fs-h4));
  color: var(--ccl-black);
  margin: 0;
}
/* Grey, not blue. Blue is the interaction signal, and in the directory a link
   sits directly under this line — two blues stacked read as two links. 16px
   (--text-md) rather than --fs-tiny: 14px tested too small for CCL's audience,
   and it left the role looking subordinate to the 16px link below it.
   NOTE: 16px is outside the --fs-* scale, which jumps 14 -> 18. See §10. */
.ccl .person__role {
  font-family: var(--font-display);
  font-weight: var(--fw-weak);
  font-size: var(--text-md);
  line-height: 1.4;
  color: var(--grey-500);
  margin: 0;
}
.ccl .person__bio { font-size: var(--text-md); line-height: 1.5; margin: var(--spacing-2xs) 0 0; }
/* .person__link styling is shared — see "CARD CTA LINK". No layout delta. */

/* --- Chrome ---------------------------------------------------------------
   Bare is the default: a person you can't click is editorial, and chrome
   multiplies — 39 bordered, shadowed tiles read as a wall of boxes, which is
   why the team directory was built bare. Reach for --card in two cases only:
   a handful of people (roughly six or fewer) presented as a feature, or one
   person standing alone inside running prose, where the card does the job of
   a <figure>. A tint makes the card land harder but never obliges it.
   --card changes chrome ONLY — photo, type and spacing are identical either
   way, which is what keeps it a modifier instead of a second component. */
.person--card {
  background: #fff;
  border: 1px solid rgba(0,0,0,.10);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-card);
  padding: var(--spacing-xl);
}

/* --- Size / layout variants -----------------------------------------------
   Only --person-photo and the stack direction change between these. */

/* Inline — a speaker credited inside a session row. The full card read "too
   big and boxy" there. Photo + name + role on one line, left-aligned.

   Grid, not flex, because the role has to be allowed to WRAP. As flex items,
   name and role each get min-width:auto and refuse to shrink below their
   content, so a real title ("Fellow and Director, Carbon Pricing Initiative,
   Resources for the Future") pushed the page 478px wider than a phone. The
   minmax(0, 1fr) role track is what actually fixes it. */
.people--inline { justify-content: flex-start; gap: var(--spacing-lg) var(--spacing-2xl); }
.people--inline .person {
  --person-photo: 48px;
  flex: 0 1 auto;
  min-width: 0;
  display: grid;
  grid-template-columns: var(--person-photo) auto minmax(0, 1fr);
  align-items: center;
  gap: var(--spacing-sm);
}
.people--inline .person__photo,
.people--inline .person__avatar { margin-bottom: 0; }
/* Narrow: stack the role under the name beside the photo, matching the
   breakpoint where .session drops its time column. */
@media (max-width: 700px) {
  .people--inline .person {
    grid-template-columns: var(--person-photo) minmax(0, 1fr);
    align-items: start;
    row-gap: 0;
  }
  .people--inline .person__photo,
  .people--inline .person__avatar { grid-row: span 2; }
}

/* Compact — denser 4-up rows (speaker lists). */
.people--compact .person {
  --person-photo: 56px;
  flex-basis: calc((100% - 3 * var(--spacing-xl)) / 4);
}

/* Directory — the org chart. Photo goes fluid 1:1 so tiles fill the column,
   which is what lets 39 people stay scannable. Default 4-up (leadership and
   board); --dense is the 5-up staff grid. */
.people--directory,
.people--directory-dense {
  display: grid;
  justify-content: initial;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--spacing-xl) var(--spacing-3xl);
}
.people--directory-dense { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.people--directory .person,
.people--directory-dense .person {
  --person-photo: 100%;
  flex: initial;
  min-width: 0;
  gap: var(--spacing-sm);
}
.people--directory .person__photo,
.people--directory-dense .person__photo {
  aspect-ratio: 1 / 1;
  height: auto;
  margin-bottom: 0;
}

/* Spotlight — one person with copy beside them. Replaces .at-coordinator,
   .vv-coordinator and .info-session-presenter, which were the same thing at
   200 / 182 / 178px with three different role treatments. */
.person--spotlight {
  --person-photo: 200px;
  display: grid;
  grid-template-columns: var(--person-photo) minmax(0, 1fr);
  gap: var(--spacing-2xl);
  align-items: center;
  flex: initial;
}
.person--spotlight .person__photo,
.person--spotlight .person__avatar { margin-bottom: 0; border-radius: var(--radius-md); }
.person--spotlight .person__copy { display: flex; flex-direction: column; gap: var(--spacing-2xs); }
.ccl .person--spotlight .person__name {
  font-size: var(--fs-h3);
  line-height: calc(var(--lh-h3) / var(--fs-h3));
}
.ccl .person--spotlight .person__bio {
  font-size: var(--fs-small);
  line-height: calc(var(--lh-small) / var(--fs-small));
  margin-top: var(--spacing-xs);
}
@media (max-width: 640px) {
  .person--spotlight { grid-template-columns: 1fr; justify-items: center; text-align: center; }
}

/* ==========================================================================
   DATE / EVENT-LOGISTICS TREATMENTS  (see DESIGN-SYSTEM-FEEDBACK.md §8)
   Two patterns cover every date on the site; pick by JOB, not by page.

   A. .event-meta — attributes of an event being described (when, where,
      format, duration). Label/value pairs, no icons.
   B. .info-card  — THE next occurrence you can act on, always paired with an
      action; a page's single primary "act now" surface.

   Why no icons (resolved 2026-08-11, Alaina): three icon treatments were
   trialled — bare freehand marks, filled chips, and label/value. The marks
   read as decoration and, at 20–22px, their meaning wasn't legible; a small
   uppercase LABEL states the field outright. "It's much clearer in a way that
   I don't think is obvious through the icons."

   Date format: `Month D–D, YYYY` (en dash, always the year); weekday only
   when it anchors a recurring cadence; `TBD — Fall 2026` when unscheduled.
   ========================================================================== */

/* ---- A. Event meta: label / value ----------------------------------------
   Fields sit side by side and wrap to a stack. Row and column gaps are set
   separately on purpose: the wide gap that separates fields horizontally is
   far too much air once they stack. */
.event-meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-sm) var(--spacing-2xl);
  margin: 0 0 var(--spacing-md);
  padding: 0;
  list-style: none;
}
/* Inside a flex/grid parent that already spaces its children, the margin
   double-counts — zero it there. */
.ld-day .event-meta { margin-bottom: 0; }
/* .ccl-prefixed (0,2,0) so scoped hero paragraph rules can't clobber these.
   `.hero-t2__card p` is (0,1,1) and was overriding both label and value —
   the same class of cascade bug already logged for hero-t1 eyebrows. Both
   conference-page builds hit it independently. */
.ccl .event-meta__label {
  font-family: var(--font-display);
  text-transform: uppercase;
  letter-spacing: .06em;
  font-size: var(--fs-tiny);
  color: var(--ccl-blue-dark);
  margin: 0 0 2px;
}
.ccl .event-meta__value {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-h4);
  line-height: 1.2;
  color: var(--ccl-black);
  margin: 0;
}
/* Compact — for cards, where the full scale matches the card's own title and
   the meta ends up competing with it for the eye. Values drop to body size;
   labels are unchanged. */
.event-meta--compact { gap: var(--spacing-xs) var(--spacing-lg); }
.ccl .event-meta--compact .event-meta__value {
  font-size: var(--fs-small);
  line-height: calc(var(--lh-small) / var(--fs-small));
}

/* Condensed — one line, values only, middot-separated. For dense card grids
   where stacked label/value pairs read busy and wrap unevenly between cards.
   Labels stay in the DOM for screen readers; the field is obvious in context
   (a date followed by a place). */
.event-meta--inline { gap: var(--spacing-xs); align-items: baseline; }
.event-meta--inline li { display: flex; align-items: baseline; gap: var(--spacing-xs); }
.ccl .event-meta--inline .event-meta__label {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
.ccl .event-meta--inline .event-meta__value {
  font-size: var(--fs-small);
  line-height: calc(var(--lh-small) / var(--fs-small));
}
.event-meta--inline li + li::before {
  content: '\00B7';
  color: var(--grey-400);
  font-weight: 700;
}

/* Centered instances (e.g. the conference hero, which is text-align: center) */
.event-meta--center { justify-content: center; }

/* ---- B. Next-occurrence callout -------------------------------------------
   Card only. An earlier `.info-pill` variant was retired 2026-08-10: it was
   doing the same job as .event-meta one section away on the Events overview,
   which made the split arbitrary. The callout now earns its chrome only as a
   page's single primary "act on this now" surface (monthly-meeting hero). */
/* The freehand marks carry fine interior detail, so they need more room than a
   stroke icon would. */
.info-card__icon {
  width: 32px;
  height: 32px;
  flex-shrink: 0;
  color: var(--ccl-blue);
}
/* Card icon aligns to the date heading, not the middle of the copy block. */
.info-card__icon { align-self: start; margin-top: 3px; }

/* Three-parts grid — Learn. Celebrate. Act. on Monthly Meeting */
/* Left-aligned section header shared by the Take Action sub-pages
   (monthly-meeting, current-actions). Sits at the standard 1166 /
   container-pad content width so every header lines up with the card rows
   below. Replaces an older "use .section-header-centered then override to
   left with inline styles" pattern that drifted out of alignment. */
.mm-section-header {
  max-width: 1166px;
  margin: var(--spacing-3xl) auto var(--spacing-md);
  padding: 0 var(--container-pad);
  text-align: left;
}
.mm-section-header > .eyebrow-blue { margin-bottom: var(--spacing-sm); }
.mm-section-header > h2 { margin: 0 0 var(--spacing-md); }
.mm-section-header > h3 { margin: 0; color: var(--ccl-black); }
.mm-section-header > .body-lead { max-width: 790px; margin: 0; }
/* Row variant — title with a control (e.g. a filter toggle) on the right,
   laid out space-between. Sits directly above a card row so it carries no
   bottom margin. */
.mm-section-header--row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--spacing-lg);
  flex-wrap: wrap;
  margin-bottom: 0;
}
.mm-section-header--row > h2 { margin: 0; }

.three-parts {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-3xl);
  max-width: 1166px;
  margin: var(--spacing-2xl) auto var(--spacing-3xl);
  padding: 0 var(--container-pad);
}
.three-parts__col h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-xs);
  padding-bottom: var(--spacing-xs);
  position: relative;
}
.three-parts__col h3::after {
  content: '';
  display: block;
  width: 100%;
  height: 3px;
  background: var(--gradient-underline);
  margin-top: var(--spacing-xs);
}
.three-parts__col p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: var(--spacing-md) 0;
}
.three-parts__photo {
  width: 100%;
  aspect-ratio: 16 / 10;
  border-radius: var(--radius-md);
  overflow: hidden;
  margin-bottom: var(--spacing-md);
}
.three-parts__photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Stack under 900px like the other editorial grids — three ~200px text
   columns read cramped, and below ~500px their min-content overflows the
   page into horizontal scroll. */
@media (max-width: 900px) {
  .three-parts { grid-template-columns: 1fr; gap: var(--spacing-2xl); }
}


/* "Want to go deeper?" blue-tinted callout card — light blue bg, blue
   border, icon + title + body on left, button on right. */
.callout-blue {
  background: var(--grey-200);
  border: 1px solid var(--ccl-blue);
  border-radius: var(--radius-md);
  padding: var(--spacing-lg) var(--spacing-2xl);
  max-width: 802px;
  margin: var(--spacing-2xl) auto;
  display: grid;
  grid-template-columns: 84px 1fr auto;
  align-items: center;
  gap: var(--spacing-md);
}
/* Icon slot — holds a green-circle icon PNG (e.g. assets/icons/checkmark.png).
   Previously drew the circle + check in CSS; now takes a real icon asset so
   different callouts can carry different icons. */
.callout-blue__icon { width: 84px; height: 84px; flex: none; }
.callout-blue__icon img { width: 100%; height: 100%; object-fit: contain; display: block; }
/* Stack on phones: icon + copy + CTA in one centered column. The 84px/1fr/
   auto row can't fit a 375px viewport (the tracks' min-content pushes the
   page into horizontal scroll). */
@media (max-width: 600px) {
  .callout-blue {
    grid-template-columns: 1fr;
    justify-items: center;
    text-align: center;
    padding: var(--spacing-lg);
  }
}
.callout-blue__copy h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-xs);
}
.callout-blue__copy p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

/* Info card — inline 2-column callout, copy + CTA. Same surface family as
   .callout-blue (light blue tint, blue border) but without the icon column.
   Used for "Next call: ..." / "Conference: ..." compact info blocks. */
/* Card scale of the same callout: leading icon | copy | action. Tinted with
   --ccl-blue-bg (not grey) so it reads as the blue-outlined family the pill
   belongs to. */
.info-card {
  background: var(--ccl-blue-bg);
  border: 1px solid var(--ccl-blue);
  border-radius: var(--radius-md);
  padding: var(--spacing-lg) var(--spacing-2xl);
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--spacing-md);
}
/* Icon is optional — cards without one keep the original 2-column rhythm. */
.info-card:not(:has(.info-card__icon)) { grid-template-columns: 1fr auto; }
@media (max-width: 640px) {
  .info-card { grid-template-columns: auto 1fr; }
  .info-card .btn { grid-column: 1 / -1; justify-self: start; }
}
.info-card__copy h2,
.info-card__copy h3 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-xs);
}
.info-card__copy p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

/* Progress meter — "X/Y" count + gradient progress bar */
.progress-meter {
  display: flex;
  align-items: center;
  gap: var(--spacing-md);
  margin: var(--spacing-md) 0;
}
.progress-meter__count {
  font-family: var(--font-display);
  font-size: 16px;
  color: var(--ccl-black);
  white-space: nowrap;
}
.progress-meter__count strong { font-weight: 700; }
.progress-meter__bar {
  flex: 1;
  height: 12px;
  background: var(--grey-200);
  border-radius: 6px;
  overflow: hidden;
}
.progress-meter__fill {
  height: 100%;
  background: linear-gradient(90deg, var(--ccl-blue) 0%, var(--ccl-green) 100%);
  border-radius: 6px;
}

/* Current Action banner — image left + content right, used in
   the Take Action landing's "Current Action" feature section. */
/* ---- Current Action band -------------------------------------------------
   The tinted ground the feature sits on (join.html). It is the band, not the
   card, that does the work: the feature is a different KIND of thing from the
   sections around it — one time-bound action rather than the ongoing work —
   and on white, with the same centred header as its neighbours, only the
   eyebrow carried that difference. A tinted band also separates itself, so
   the seams on both sides lost their dividers.

   Both children arrive carrying outer margin (the header 48px on top, the
   banner 48px underneath), which is the wrapper's job at its own edges — see
   the .chapter-activities note — so both are zeroed and the band pads 64. */
.current-action-band {
  background: var(--grey-100);
  padding: var(--spacing-4xl) var(--page-gutter);
}
.current-action-band > .section-header-centered { margin-top: 0; }
.current-action-band > .current-action-banner { margin-bottom: 0; }

.current-action-banner {
  display: grid;
  grid-template-columns: 494px 1fr;
  gap: 0;
  max-width: 1024px;
  margin: var(--spacing-2xl) auto var(--spacing-3xl);
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-card);
  border: 1px solid rgba(0,0,0,0.1);
}
/* The photo is taken out of flow so it contributes no intrinsic height, which
   makes the copy column the only thing setting the banner's height. Left in
   flow, `height: 100%` falls back to the image's natural height while the row
   is being sized, so a portrait source (e.g. current-action-email.jpg at
   1387x2200 → 784px tall at this column width) stretches the banner to nearly
   twice its designed height and strands the copy in white space. Landscape
   sources happened to hide the bug.
   Crop stays centred. The homepage mosaic top-anchors its tiles because those
   are group shots framed tight, with heads close to the top edge; this slot
   takes single-subject photos with room above the head, and anchoring to the
   top there spends the frame on ceiling and drops the face out of the middle.
   Same rule either way — anchor where the subject is — just a different
   answer, so don't copy the mosaic's value over here. */
.current-action-banner__photo {
  position: relative;
  min-height: 0;
  background: var(--grey-200);
  overflow: hidden;
}
.current-action-banner__photo img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.current-action-banner__body {
  padding: var(--spacing-xl);
  background: #fff;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
}
.current-action-banner__body h2,
.current-action-banner__body h3 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0;
}
.current-action-banner__body p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}
/* Generic side-by-side button group (wraps on narrow screens). Promoted from
   .current-action-banner__body scope — also used in the lobby-day hero and
   conference callout. */
.button-row { display: flex; gap: var(--spacing-sm); flex-wrap: wrap; }

/* Conference callout (reuse from policy-wins but with bullet list option) */
.conference-bullets {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
  padding-left: 1.5em;
}
.conference-bullets li { margin-bottom: 4px; }

/* "Catch up with CCL" cards (past monthly meetings) — same as action-card
   pattern but with blue uppercase date eyebrow + speaker bio styling. */
.past-meeting-card .action-card__time { color: var(--ccl-blue); }

/* .btn-secondary-dark removed — use canonical `.btn .btn-secondary` from
   tokens.css instead. Charcoal fill, white text. */

/* Spread the Word section header */
.spread-word {
  max-width: 1166px;
  margin: var(--spacing-3xl) auto var(--spacing-md);
  padding: 0 var(--container-pad);
}
.spread-word h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.spread-word p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

/* ==========================================================================
   STORIES (blog index) — 581:1121
   Featured 3-up (1 large + 2 stacked), newsletter signup banner,
   topic tabs, search bar, post list rows, pagination.
   ========================================================================== */

/* ---- T3 "workhorse" hero ---------------------------------------------------
   Hero System.md's compact text-only tier: eyebrow + H1 + one line of
   supporting copy (breadcrumb above where the page has one). For section
   overviews and utility pages that don't warrant a T1/T2 media hero.
   .stories-hero below predates this and matches it in shape (centered
   variant); candidates to collapse into this component later. */
.hero-t3 {
  /* Container geometry matches .conference-callout (1140 + --container-pad)
     so the hero and the section below share a left edge — the old
     1128 + --gutter combo staggered them. */
  max-width: 1140px;
  margin: var(--spacing-3xl) auto var(--spacing-2xl);
  padding: 0 var(--container-pad);
}
.hero-t3 h1 {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-display);
  line-height: var(--lh-display);
  letter-spacing: -1px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-sm);
}
.hero-t3 p {
  font-family: var(--font-body);
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0;
  max-width: 720px;
}
.hero-t3 .eyebrow-blue,
.hero-t3 .eyebrow-green { margin-bottom: var(--spacing-xs); }

.stories-hero {
  text-align: center;
  max-width: 800px;
  margin: var(--spacing-4xl) auto var(--spacing-3xl);
  padding: 0 var(--container-pad);
}
.stories-hero h1 {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-display);
  line-height: var(--lh-display);
  letter-spacing: -1px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-sm);
}
.stories-hero p {
  font-family: var(--font-body);
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0;
}

/* Featured 3-up: 1 large card on the left, 2 stacked small on the right */
/* V2: full-width side-by-side lead, then a 3-up "more stories" row beneath it. */
.stories-featured {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2xl);
  max-width: 1166px;
  margin: var(--spacing-md) auto var(--spacing-2xl);
  padding: 0 var(--container-pad);
}
/* "More stories" row — modest 16:9 thumbnails with headline + excerpt below, so
   the row stays word-driven rather than three big photos. */
.stories-featured__more {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));  /* 3 → 2 → 1 as width shrinks */
  gap: var(--spacing-xl);
  border-top: 1px solid var(--grey-200);
  padding-top: var(--spacing-xl);
}
.story-brief {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sm);
  text-decoration: none;
  color: inherit;
}
.story-brief__thumb {
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-md);   /* match the lead card + post-row images (16px) */
  overflow: hidden;
  background: var(--grey-200);
}
.story-brief__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.story-brief__copy { display: flex; flex-direction: column; gap: var(--spacing-2xs); min-width: 0; }
.story-brief__copy h3 {
  font-family: var(--font-display);
  font-weight: var(--fw-weak);
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0;
}
/* Whole-card/row links share one hover affordance: the headline tints. */
.story-brief:hover h3,
.story-card:hover h2,
.post-row:hover h2 { color: var(--fg-link-strong); }
.story-brief__excerpt {
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  line-height: var(--lh-tiny);
  color: var(--grey-500);
  margin: 0;
}
/* Full-bleed image at top + padded body, matching .team-card / .action-card.
   Card clips the image's top corners via overflow:hidden (no per-image radius). */
.story-card {
  background: #fff;
  border-radius: var(--radius-md);
  border: 1px solid rgba(0,0,0,0.10);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  box-shadow: var(--shadow-card);
}
.story-card__image {
  aspect-ratio: 16 / 10;
  background: var(--grey-200);
  overflow: hidden;
  border-bottom: 1px solid rgba(0,0,0,0.06);
}
.story-card__image img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Body: gap owns vertical rhythm, so reset child margins (styling-principle #4). */
.story-card__body {
  padding: var(--spacing-lg);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
}
.ccl .story-card__body > * { margin: 0; }

/* Featured LEAD = full-width side-by-side: image left, copy centered right.
   (Overrides .story-card's column layout — defined after it so it wins.) */
.story-card--featured {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
}
.story-card--featured .story-card__image {
  aspect-ratio: auto;  /* cancel the base 16/10 so the image can stretch to fill the column */
  min-height: 340px;   /* a floor; grid-stretch makes it match a taller copy column — no dead space */
  border-bottom: none;
  border-right: 1px solid rgba(0,0,0,0.06);
}
.story-card--featured .story-card__body {
  justify-content: center;
  padding: var(--spacing-2xl);
}
.story-card--featured .story-card__body h2 { font-size: 36px; line-height: 44px; }
/* Publish date — small muted line on the lead + briefs (matches the post list).
   The lead groups headline + date in __head so the date sits tight under the
   headline rather than in the body's larger flex gap. */
.story-card__head { display: flex; flex-direction: column; gap: var(--spacing-2xs); }
.story-date {
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  line-height: var(--lh-tiny);
  color: var(--grey-500);
  letter-spacing: 0.01em;
  margin: 0;
}
/* ==========================================================================
   CARD CTA LINK — the standalone "Read More →" / "Meet the staff →" /
   "Send a Message →" affordance on cards. It NAVIGATES, so it's a link, not a
   button: no box, Source Sans Bold + trailing arrow.

   Same --ccl-navy as a prose link (§11): one blue means "link" everywhere, and
   navy is the only candidate with AA headroom on all three surfaces these sit
   on — white, grey-100 and the blue-bg tint (8.32 / 7.73 / 7.37). What marks
   this as the standalone variant is the ARROW and its placement, not a colour
   of its own. Lightens to --ccl-blue on hover, matching prose links.
   Components add only layout (e.g. action cards pin it with margin-top:auto). */
.read-more,
.team-card__link,
.action-card__link,
.person__link {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-xs);
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 16px;
  color: var(--ccl-navy);
  text-decoration: none;
}
.read-more::after,
.team-card__link::after,
.action-card__link::after,
.person__link::after { content: '→'; }
.read-more:hover,
.team-card__link:hover,
.action-card__link:hover,
.person__link:hover {
  color: var(--ccl-blue);
  border-bottom-color: transparent;
}

/* Newsletter subscribe banner — uses .cta-banner-navy as the base shape
   but with an inline form layout instead of a centered headline + CTA. */
.subscribe-banner {
  background: var(--ccl-navy);
  color: #fff;
  border-radius: var(--radius-md);
  padding: var(--spacing-2xl) var(--spacing-3xl);
  max-width: 1166px;
  margin: var(--spacing-2xl) auto;
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: var(--spacing-lg);
}
.subscribe-banner h2 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: #fff;
  margin: 0;
  max-width: 343px;
}
.subscribe-banner__form {
  display: flex;
  gap: var(--spacing-md);
  justify-content: flex-end;
  align-items: center;
}
.subscribe-banner__form input {
  flex: 1;
  max-width: 319px;
  height: 44px;
  padding: 0 12px;
  border: 1px solid var(--border-input);
  border-radius: var(--radius-xs);
  background: #fff;
  font-family: var(--font-display);
  font-style: italic;
  font-size: 16px;
  color: var(--grey-500);
}
.subscribe-banner__form input::placeholder { color: var(--grey-400); font-style: italic; }

/* ==========================================================================
   TABS — unified horizontal selector for the whole site.
   One base, scaled by --tabs-size / --tabs-gap (set by a size modifier).
   Works as <button role="tab"> (swaps an in-page panel) OR <a> (filters /
   navigates) — the active state matches aria-selected, aria-current, and a
   plain .active class, so the same CSS serves both. Active = Ubuntu bold +
   gradient underline (--gradient-underline, the locked blue→green). The 1px
   track runs flush to the row's container, like every other divider here.
   Used by: stories topic filter (--sm). Migrates next: team.html (--lg),
   and the conference agenda when built (--lg). See tabs-component-demo.html.
   ========================================================================== */
.tabs {
  display: flex;
  align-items: flex-end;
  flex-wrap: wrap;
  gap: var(--tabs-gap, var(--spacing-3xl));
  border-bottom: 1px solid var(--grey-300);
  margin: 0;
  padding: 0;
  list-style: none;
}
.tabs__tab {
  font-family: var(--font-display);
  font-weight: var(--fw-weak);
  font-size: var(--tabs-size, var(--fs-h3));
  line-height: var(--tabs-lh, var(--lh-h3));
  color: var(--grey-500);          /* muted but AA-clean (~9:1); not grey-400, which reads disabled + fails AA at 18px */
  text-decoration: none;
  background: none;
  border: 0;
  border-bottom: 3px solid transparent;
  padding: 0 0 var(--spacing-md);
  margin-bottom: -1px;              /* overlap the 1px track */
  cursor: pointer;
  white-space: nowrap;
}
.tabs__tab:hover { color: var(--ccl-black); }
.tabs__tab[aria-selected="true"],
.tabs__tab[aria-current="page"],
.tabs__tab.active {
  font-weight: var(--fw-strong-heading);   /* 700 — Ubuntu has no 600 face (DEVIATIONS D0) */
  color: var(--ccl-black);
  border-image: var(--gradient-underline) 1;
}
.tabs__tab:focus-visible {
  outline: 2px solid var(--ccl-blue);
  outline-offset: 4px;
  border-radius: 2px;
}
/* Size system — the only thing a page picks. Drives label scale + gap. */
.tabs--lg { --tabs-size: var(--fs-h3);    --tabs-lh: var(--lh-h3);    --tabs-gap: var(--spacing-3xl); } /* few short labels  */
.tabs--md { --tabs-size: var(--fs-h4);    --tabs-lh: var(--lh-h4);    --tabs-gap: var(--spacing-xl);  } /* medium            */
.tabs--sm { --tabs-size: var(--fs-small); --tabs-lh: var(--lh-small); --tabs-gap: var(--spacing-lg);  } /* many / long labels */
.tabs--scroll { flex-wrap: nowrap; overflow-x: auto; }  /* dense rows: scroll instead of wrap */

/* Stories "Blog Topics" filter — heading + the topic tab row, left-aligned. */
.topic-tabs-wrap {
  max-width: 1190px;
  margin: var(--spacing-3xl) auto var(--spacing-md);
  padding: 0 var(--container-pad);
}
/* "Blog Topics" uses .h2-regular (see HTML); only the section margin remains. */
.topic-tabs-wrap > h2 {
  margin: 0 0 var(--spacing-lg);
}
.topic-tabs-wrap .tabs { margin-bottom: var(--spacing-lg); }

/* Search bar — label inline with the input + Search button (secondary) */
.blog-search {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-sm);
  margin: var(--spacing-md) auto var(--spacing-3xl);
}
.blog-search label {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 16px;
  color: var(--ccl-black);
}
.blog-search input {
  width: 476px;
  height: 44px;
  padding: 0 12px;
  border: 1px solid var(--border-input);
  border-radius: var(--radius-xs);
  background: #fff;
  font-family: var(--font-body);
  font-size: 16px;
  color: var(--ccl-black);
}

/* Post list rows — horizontal: image left + content right */
.post-list {
  max-width: 1166px;
  margin: 0 auto var(--spacing-3xl);
  padding: 0 var(--container-pad);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2xl);
}
.post-row {
  display: grid;
  grid-template-columns: 375px 1fr;
  gap: var(--spacing-lg);
  align-items: center;
  text-decoration: none;
  color: inherit;
}
.post-row__image {
  aspect-ratio: 375 / 230;
  border-radius: var(--radius-md);
  overflow: hidden;
  background: var(--grey-200);
}
.post-row__image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.post-row__copy { display: flex; flex-direction: column; gap: var(--spacing-md); }
/* Heading uses .h3-regular, body uses .body-lead (see HTML); gap owns rhythm
   so child margins reset. The date is muted metadata with no matching role,
   so it keeps its own type. */
.ccl .post-row__copy > * { margin: 0; }
.post-row__date {
  font-family: var(--font-body);
  font-size: 19px;
  letter-spacing: -0.285px;
  color: var(--grey-500);
}

/* Pagination — canonical centered numbered nav (design-system spec).
   Tiles 40×40, --radius-sm, 1px --grey-200 border; current = filled + white +
   bold; "← Previous / Next →" inline labels (disabled = grey, not hidden);
   ellipsis is a borderless aria-hidden span; always show first + last + current±1.
   Below 480px collapses to "← Previous · 1 of 12 · Next →".
   A11y: the spec's --ccl-blue (#0081C7) gives white text and blue-on-white link
   text only ~4.2:1 (under AA for normal text), so this uses --fg-link-strong
   (#1A74A8, ~4.8:1) — the token meant for dense link rows — for the current-tile
   fill and the link/hover ink. */
.pagination {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: var(--spacing-xs);
  max-width: 1166px;
  margin: var(--spacing-2xl) auto var(--spacing-5xl);
  padding: 0 var(--container-pad);
  font-family: var(--font-body);
}
.pagination__tile {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 40px;
  height: 40px;
  padding: 0 12px;
  border: 1px solid var(--grey-200);
  border-radius: var(--radius-pill);   /* click target = action (§9) */
  font-size: var(--text-md);
  color: var(--fg2);
  text-decoration: none;
  transition: border-color .12s ease, color .12s ease;
}
.pagination__tile:hover {
  border-color: var(--fg-link-strong);
  color: var(--fg-link-strong);
}
.pagination__tile.is-current {
  background: var(--fg-link-strong);
  border-color: var(--fg-link-strong);
  color: #fff;
  font-weight: 700;
}
.pagination__nav {
  display: inline-flex;
  align-items: center;
  height: 40px;
  padding: 0 12px;
  font-size: var(--text-md);
  font-weight: 700;
  color: var(--fg-link-strong);
  text-decoration: none;
  white-space: nowrap;
}
.pagination__nav.is-disabled {
  color: var(--grey-300);
  pointer-events: none;
}
.pagination__ellipsis {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 24px;
  height: 40px;
  color: var(--grey-400);
  user-select: none;
}
.pagination__compact { display: none; }
/* Below 480px the numeric tiles take too much width — collapse to a compact
   "← Previous · 1 of 12 · Next →" form (spec). */
@media (max-width: 480px) {
  .pagination__tile, .pagination__ellipsis { display: none; }
  .pagination__compact {
    display: inline-flex;
    align-items: center;
    height: 40px;
    padding: 0 var(--spacing-xs);
    font-weight: 700;
    color: var(--fg2);
  }
}

/* ==========================================================================
   IMPACT SECTION (Our Impact landing, Past Progress, Policy Wins)
   These patterns follow the design system where one exists; the new ones
   (stat-impact, bills list, timeline rail) are flagged in DEVIATIONS.md.
   ========================================================================== */

/* ----- Impact Stats (canonical) ------------------------------------------
   Now a real design-system component (preview/impact-stats.html,
   ui_kits/marketing/ImpactStats.jsx). Class names match the system.
   Two-span numeral: offset shadow + foreground glyph, NOT CSS text-shadow,
   because layered spans give us a per-glyph offset that survives webfonts
   loading at different rates. */
.ccl-stats {
  background: #fff;
  padding: var(--spacing-4xl) var(--spacing-lg);
  margin: var(--spacing-3xl) auto;
  max-width: 1100px;
}
.ccl-stats .ccl-section-inner {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--spacing-lg);
}
.ccl-stat {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 14px;
}
.ccl-stat-n {
  position: relative;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 88px;
  line-height: .95;
  letter-spacing: -0.02em;
}
.ccl-stat-n-shadow {
  position: absolute;
  left: 4px;
  top: 4px;
  color: var(--brand);
  user-select: none;
}
.ccl-stat-n-fg {
  position: relative;
  color: var(--ccl-black);
}
.ccl-stat-l {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 18px;
  line-height: 1.35;
  color: var(--ccl-black);
  white-space: pre-line;
}

/* ----- Stats band background variants (impact-grey / impact-navy mocks) ----
   Used as a one-section-per-page "billboard moment" treatment. Both
   variants make the stats full-bleed (no max-width box on a white page),
   keep the green offset-shadow numerals, and override label colour where
   needed for contrast. */
.ccl-stats--grey,
.ccl-stats--navy {
  max-width: none;             /* full-bleed */
  margin: 0;                   /* no edge margin */
  padding: var(--spacing-5xl) var(--page-gutter);
}
.ccl-stats--grey  { background: var(--grey-100); }
.ccl-stats--navy  { background: var(--gradient-dark-blue); }

.ccl-stats--grey  .ccl-section-inner,
.ccl-stats--navy  .ccl-section-inner {
  max-width: 1100px;
  margin: 0 auto;
}

/* Navy: foreground numerals + labels flip to white; green shadow pops. */
.ccl-stats--navy .ccl-stat-n-fg { color: #fff; }
.ccl-stats--navy .ccl-stat-l    { color: rgba(255, 255, 255, 0.85); }

/* Section header inside the stats band — eyebrow + h2 + supporting line
   that frames the numbers below. Lets the stats read as evidence for a
   claim, not a freestanding "by the numbers" list. */
.ccl-stats__header {
  max-width: 780px;
  margin: 0 auto var(--spacing-3xl);
  text-align: center;
}
.ccl-stats__header .eyebrow-green { margin-bottom: var(--spacing-sm); }
.ccl-stats__header h2 {
  margin: 0 0 var(--spacing-md);
}
.ccl-stats__header > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

/* 3-stat layout for the new lineup — switch grid to 3 columns and tighten
   the max-width so the columns don't get awkwardly wide. */
.ccl-stats--grey .ccl-section-inner {
  grid-template-columns: repeat(3, 1fr);
  max-width: 900px;
}
@media (max-width: 700px) {
  /* Doubled class: outranks the later generic repeat(2, 1fr) mobile collapse. */
  .ccl-stats.ccl-stats--grey .ccl-section-inner { grid-template-columns: 1fr; }
}

/* ----- Navy contained-callout variant — the Kadence-style treatment.
   Section sits on the page's default white surface, the .ccl-stats__panel
   inside is the dark rounded box that holds header (left) + stats (right). */
.ccl-stats--callout {
  background: #fff;
  max-width: none;
  margin: 0;
  padding: var(--spacing-3xl) var(--page-gutter);
}
.ccl-stats--callout .ccl-stats__panel {
  max-width: 1140px;       /* match .bills-card so the accordion + callout align */
  margin: 0 auto;
  background: var(--ccl-blue-dark);    /* brand CCL Dark Blue (#15527B) */
  border-radius: var(--radius-lg);
  padding: var(--spacing-3xl) var(--spacing-4xl);
  display: grid;
  grid-template-columns: minmax(280px, 1fr) 2fr;
  gap: var(--spacing-3xl);
  align-items: center;
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.10);
}

/* Header inside the navy panel: left column, left-aligned, white ink. */
.ccl-stats--callout .ccl-stats__header {
  margin: 0;
  max-width: none;
  text-align: left;
}
.ccl-stats--callout .ccl-stats__header .eyebrow-green {
  color: var(--brand-medium);          /* lighter green pops better against dark navy */
  margin-bottom: var(--spacing-sm);
}
.ccl-stats--callout .ccl-stats__header h2 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  margin: 0 0 var(--spacing-md);
}
.ccl-stats--callout .ccl-stats__header > p {
  color: rgba(255, 255, 255, 0.78);
}

/* Stats inside the navy panel: 3-col grid, white numerals, muted labels. */
.ccl-stats--callout .ccl-section-inner {
  grid-template-columns: repeat(3, 1fr);
  max-width: none;
  margin: 0;
  gap: var(--spacing-xl);
}
.ccl-stats--callout .ccl-stat-n-fg { color: #fff; }
.ccl-stats--callout .ccl-stat-l    { color: rgba(255, 255, 255, 0.70); }

@media (max-width: 900px) {
  .ccl-stats--callout .ccl-stats__panel {
    grid-template-columns: 1fr;
    padding: var(--spacing-2xl);
    gap: var(--spacing-2xl);
  }
  .ccl-stats--callout .ccl-stats__header { text-align: center; }
  .ccl-stats--callout .ccl-stats__header .eyebrow-green { display: block; }
}
/* Doubled class beats the generic "mobile collapse to repeat(2, 1fr)" rule
   further down (same 0,2,0 specificity, later in source, so it would win
   otherwise). 767px, not 600: two columns can't hold a six-digit numeral at
   the 64px mobile size ("105,544" ≈ 225px min-content), so the 2-up track
   forces the page into horizontal scroll on phones. */
@media (max-width: 767px) {
  .ccl-stats.ccl-stats--callout .ccl-section-inner { grid-template-columns: 1fr; }
}

/* ----- Stacked variant of the contained callout
   Used on the About Us "Last year, we mobilized" section. Instead of
   header-left + stats-right, everything stacks vertically and centers:
     1. Eyebrow + headline
     2. Three stats in a row
     3. Connecting body line + CTA
   Lets the scale-and-relationships message read as one continuous
   thought instead of "numbers vs. counterpoint" in opposing columns. */
.ccl-stats--callout-stacked .ccl-stats__panel {
  grid-template-columns: 1fr;
  gap: var(--spacing-3xl);
  padding: var(--spacing-3xl) var(--spacing-4xl);
  text-align: center;
  align-items: stretch;
}
.ccl-stats--callout-stacked .ccl-stats__header {
  text-align: center;
  max-width: 640px;
  margin: 0 auto;
}
.ccl-stats--callout-stacked .ccl-stats__header .eyebrow-green {
  display: block;            /* centers the inline-default eyebrow */
}
.ccl-stats--callout-stacked .ccl-stats__header h2 {
  margin: 0;                 /* footer line + CTA below carry the spacing */
}
.ccl-stats--callout-stacked .ccl-stats__footer {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--spacing-md);
  max-width: 720px;
  margin: 0 auto;
}
.ccl-stats--callout-stacked .ccl-stats__footer > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: rgba(255, 255, 255, 0.88);
  margin: 0;
}

@media (max-width: 900px) {
  .ccl-stats--callout-stacked .ccl-stats__panel {
    padding: var(--spacing-2xl);
    gap: var(--spacing-2xl);
  }
}

/* ----- "Soft" modifier of the contained callout — grey-100 panel + dark ink.
   Lower intensity than the navy default; reads as integrated with the
   page surface (good for places like the About Us mobilized section that
   should feel part of the surrounding "What We Do" story, not a standalone
   billboard moment). Same structure + layout otherwise. */
.ccl-stats--callout-soft .ccl-stats__panel {
  background: var(--grey-100);
  box-shadow: none;
}
.ccl-stats--callout-soft .ccl-stats__header .eyebrow-green {
  color: var(--ccl-green-dark);             /* darker green for legibility on grey */
}
.ccl-stats--callout-soft .ccl-stats__header h2 { color: var(--ccl-black); }
.ccl-stats--callout-soft .ccl-stats__header > p { color: var(--ccl-black); }
.ccl-stats--callout-soft .ccl-stats__footer > p { color: var(--ccl-black); }
.ccl-stats--callout-soft .ccl-stat-n-fg { color: var(--ccl-black); }
.ccl-stats--callout-soft .ccl-stat-l    { color: var(--grey-600); }

/* ----- "Inline" modifier — strips the panel chrome entirely. Same stacked
   structure (heading → stats row → body + CTA), but the content sits
   directly on the page surface with no background, no rounded box, no
   shadow. Good when a contained moment would compete with other contained
   moments nearby (e.g. About Us where the pillar cards above are already
   the boxed beat — the mobilized stats become the section's inline
   editorial close instead of yet another container). */
.ccl-stats--callout-inline .ccl-stats__panel {
  background: transparent;
  box-shadow: none;
  padding: 0;
}
.ccl-stats--callout-inline .ccl-stats__header .eyebrow-green {
  color: var(--ccl-green-dark);
}
.ccl-stats--callout-inline .ccl-stats__header h2,
.ccl-stats--callout-inline .ccl-stats__header > p,
.ccl-stats--callout-inline .ccl-stats__footer > p { color: var(--ccl-black); }
.ccl-stats--callout-inline .ccl-stat-n-fg { color: var(--ccl-black); }
.ccl-stats--callout-inline .ccl-stat-l    { color: var(--grey-600); }
/* Heading reads as a subhead of the surrounding "What We Do" section,
   not a competing H1. Drop from fs-h1 (40px) to fs-h2 (32px). */
.ccl-stats--callout-inline .ccl-stats__header h2 {
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  letter-spacing: -0.4px;
}

/* ----- Bills list (Policy Wins card) ------------------------------------- */
.bills-card {
  position: relative;
  background: #fff;
  border-radius: var(--radius-md);
  padding: var(--spacing-xl) var(--spacing-3xl) var(--spacing-3xl);
  box-shadow: 0 2px 10px rgba(0,0,0,0.15);
  max-width: 1140px;
  margin: 0 auto;
  overflow: hidden;
}
.bills-card::before {
  /* Gradient left rail — blue→green, vertical (180deg twin of --gradient-underline). */
  content: '';
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 11px;
  background: linear-gradient(180deg, var(--ccl-blue) 0%, var(--ccl-green) 100%);
}
.bills-card h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
/* Bill accordion — native <details>/<summary>. Each bill is a closed
   row with + icon; opening expands to show CCL's involvement in the bill.
   The + rotates to × when the accordion is open (per chat2.md accordion spec). */
.bill-row {
  border: 1px solid var(--grey-300);
  border-radius: var(--radius-xs);
  margin-top: var(--spacing-sm);
  background: #fff;
  transition: border-color .12s ease;
}
.bill-row[open] { border-color: var(--ccl-blue); }
.bill-row > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--spacing-md);
  padding: var(--spacing-md) var(--spacing-lg);
  font-family: var(--font-body);
  font-size: 19px;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  cursor: pointer;
  list-style: none;
}
.bill-row > summary::-webkit-details-marker { display: none; }
.bill-row:hover { border-color: var(--ccl-blue); }
.bill-row strong { font-weight: 700; }
.bill-row__icon {
  flex-shrink: 0;
  width: 14px;
  height: 14px;
  position: relative;
  transition: transform .15s ease;
}
.bill-row__icon::before,
.bill-row__icon::after {
  content: '';
  position: absolute;
  background: var(--grey-500);
}
.bill-row__icon::before { /* horizontal stroke */ inset: 6px 0; }
.bill-row__icon::after  { /* vertical stroke */   inset: 0 6px; }
.bill-row[open] .bill-row__icon { transform: rotate(45deg); }
.bill-row[open] .bill-row__icon::before,
.bill-row[open] .bill-row__icon::after { background: var(--ccl-blue); }
.bill-row__body {
  padding: 0 var(--spacing-lg) var(--spacing-md);
  font-family: var(--font-body);
  font-size: 18px;
  line-height: 28px;
  color: var(--grey-600);
}
.bill-row__body p { margin: 0 0 12px; }
.bill-row__body p:last-child { margin-bottom: 0; }
/* A bill row carrying an id is a deep-link target — the Impact overview's
   condensed teasers link to the full entry here, and site.js opens the row on
   arrival. Keep the anchor off the top edge of the viewport. */
.bill-row[id] { scroll-margin-top: var(--spacing-xl); }
/* "Read the full story" closing a teaser: it follows a <p> that has given back
   its 12px bottom margin (no longer :last-child), so this only adds the rest. */
.bill-row__body > .read-more { margin-top: var(--spacing-xs); }

/* ----- Navy CTA banner — system pattern documented in SKILL.md ----------- */
.cta-banner-navy {
  background: var(--ccl-navy);
  color: #fff;
  border-radius: var(--radius-md);
  padding: var(--spacing-xl) var(--spacing-3xl);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--spacing-md);
  max-width: 780px;
  margin: var(--spacing-3xl) auto;
}
.cta-banner-navy h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: #fff;
  margin: 0;
  max-width: 580px;
}

/* ----- Conference callout (Policy Wins page bottom) ---------------------- */
.conference-callout {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-3xl);
  align-items: center;
  max-width: 1140px;
  margin: var(--spacing-3xl) auto var(--spacing-5xl);
  padding: 0 var(--container-pad);
}
.conference-callout h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.conference-callout p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
}
.conference-callout__media {
  aspect-ratio: 3 / 2;
  border-radius: var(--radius-md);
  overflow: hidden;
  background: var(--grey-200);
}
.conference-callout__media img { width: 100%; height: 100%; object-fit: cover; }

/* ----- Generic centered section header with optional green eyebrow ------- */
.section-header-centered {
  text-align: center;
  max-width: 913px;
  margin: var(--spacing-3xl) auto var(--spacing-xl);
  padding: 0 var(--container-pad);
}
.section-header-centered .h1-bold,
.section-header-centered h1 { margin: 0 0 var(--spacing-md); }
.section-header-centered .eyebrow-green { margin-bottom: var(--spacing-sm); }
.section-header-centered .body-lead { margin: 0 auto; max-width: 790px; }

/* ----- Partnership era block (Our Impact landing) ------------------------ */
.partnership-block {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-3xl);
  align-items: start;
  max-width: 1166px;
  margin: var(--spacing-3xl) auto var(--spacing-2xl);
  padding: 0 var(--container-pad);
}
.partnership-block .copy .eyebrow-meta { margin-bottom: var(--spacing-sm); }
.partnership-block .copy h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.partnership-block .copy p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 18px;
}
.partnership-block .photo {
  aspect-ratio: 4 / 5;
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}
.partnership-block .photo img { width: 100%; height: 100%; object-fit: cover; }

/* ==========================================================================
   PAST PROGRESS — vertical timeline of era cards
   ========================================================================== */

.timeline {
  position: relative;
  max-width: 1313px;
  margin: var(--spacing-3xl) auto var(--spacing-5xl);
  padding: 0 var(--gutter);
}
/* Vertical gradient rail behind the date labels */
.timeline::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: 194px;
  /* Vertical 180deg twin of --gradient-underline (blue→green). */
  width: 4px;
  background: linear-gradient(180deg, var(--ccl-blue) 0%, var(--ccl-green) 100%);
  border-radius: 2px;
}
.timeline-era {
  position: relative;
  display: grid;
  grid-template-columns: 130px 1fr;
  gap: 60px;
  align-items: start;
  margin-bottom: var(--spacing-3xl);
}
.timeline-era__date {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 20px;
  line-height: 28px;
  color: var(--grey-500);
  background: #fff;
  padding: var(--spacing-xs) 0;
  position: relative;
  z-index: 1;
  text-align: right;
  padding-right: var(--spacing-md);
}
.timeline-era__card {
  background: #fff;
  border-radius: var(--radius-md);
  padding: var(--spacing-lg);
  box-shadow: 0 4px 5px rgba(0,0,0,0.16);
  display: grid;
  grid-template-columns: 338px 1fr;
  gap: var(--spacing-md);
  align-items: start;
}
.timeline-era__card--stacked { display: block; }
.timeline-era__photo {
  border-radius: var(--radius-md);
  overflow: hidden;
  aspect-ratio: 16 / 10;
  background: var(--grey-200);
}
.timeline-era__photo img { width: 100%; height: 100%; object-fit: cover; }
.timeline-era__copy { padding-top: 0; }
.timeline-era__copy .eyebrow-meta { margin-bottom: var(--spacing-xs); }
.timeline-era__copy h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.timeline-era__copy h2.h2-larger {
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
}
.timeline-era__copy p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}
.timeline-era__copy p + p { margin-top: 18px; }

/* Case-study inset inside an era card */
.case-study {
  background: var(--grey-100);
  border-radius: var(--radius-lg);
  padding: var(--spacing-lg);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-xl);
  align-items: center;
  margin-top: var(--spacing-xl);
}
.case-study h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.case-study p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 18px;
}
/* Case-study .lite-yt inherits everything from the base .lite-yt rule.
   Add `class="play-btn play-btn--sm"` on the nested play button. */

/* Pull-quote inside an era card (Sen. Whitehouse) */
.era-quote {
  background: var(--grey-100);
  border-radius: var(--radius-xs);
  padding: var(--spacing-lg) var(--spacing-2xl);
  margin-top: var(--spacing-md);
  position: relative;
  border-left: 4px solid var(--ccl-blue);
}
.era-quote q {
  display: block;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-sm);
  quotes: none;
}
.era-quote q::before, .era-quote q::after { content: ''; }
.era-quote .attr {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 700;
  font-size: var(--fs-h3);
  color: var(--ccl-black);
}

/* Impact Stats mobile collapse — 768px per the system spec, not 900px */
@media (max-width: 767px) {
  .ccl-stats .ccl-section-inner { grid-template-columns: repeat(2, 1fr); }
  .ccl-stat-n { font-size: 64px; }
}
/* Below 560px the spec's 2×2 can't physically hold the numerals: a track is
   ~151px at 375px viewport and a six-glyph number at 64px needs ~200px, so
   the 2-up grid forces horizontal page scroll (give.html measured 424px).
   Single column keeps the 64px stamp intact. */
@media (max-width: 560px) {
  .ccl-stats .ccl-section-inner { grid-template-columns: 1fr; }
}

/* Responsive: collapse era card to single column under 900px */
@media (max-width: 900px) {
  .conference-callout,
  .partnership-block { grid-template-columns: 1fr; }
  /* .timeline horizontal padding inherits --page-gutter (24px at this width). */
  .timeline::before { left: 12px; }
  .timeline-era { grid-template-columns: 1fr; gap: var(--spacing-sm); padding-left: 32px; }
  .timeline-era__date { text-align: left; padding-right: 0; padding-left: var(--spacing-sm); }
  .timeline-era__card { grid-template-columns: 1fr; }
  .case-study { grid-template-columns: 1fr; }
  .bills-card { padding: var(--spacing-lg) var(--spacing-md) var(--spacing-lg) var(--spacing-xl); }
  .bill-row { padding: var(--spacing-sm) var(--spacing-md); }
}

/* ==========================================================================
   PAGE 2 — Mission & Values
   ========================================================================== */

.page-wash {
  /* DEVIATION #10: design uses 197° gradient, system documents 135° NW→SE */
  background: linear-gradient(197deg, #FFFFFF 12%, #E8F3F9 30%, #EBF4DC 79%);
  padding-top: var(--spacing-4xl);
  padding-bottom: var(--spacing-4xl);
}

.mission-block { text-align: center; padding: var(--spacing-4xl) var(--container-pad) var(--spacing-3xl); max-width: 900px; margin: 0 auto; }
.mission-block .mission-headline {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
  margin: 0;
}
.mission-block .mission-headline strong { font-weight: 700; }
/* The headline carries margin: 0, so the CTA below it owns the gap. */
.mission-block > .btn { margin-top: var(--spacing-xl); }
.mission-block .mission-headline .gradient-text {
  font-weight: 700;
  background: var(--gradient-blue-green);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
/* Pin the gradient underline to the emphasized phrase itself, not the
   page. background-image on an OUTER wrapper span so it doesn't conflict
   with .gradient-text's background-clip: text. box-decoration-break: clone
   makes the marker stretch per line when the phrase wraps on narrow widths. */
.mission-block .mission-underline {
  background-image: url('../assets/brand/underlines/single-xlg.svg');
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 100% 14px;
  padding-bottom: 0.18em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}
@media (max-width: 767px) {
  .mission-block .mission-underline {
    background-size: 100% 10px;
    padding-bottom: 0.15em;
  }
}

.values-header {
  text-align: center;
  padding: var(--spacing-3xl) var(--container-pad) var(--spacing-md);
  max-width: 900px;
  margin: 0 auto;
}
.values-header h1 { margin-top: var(--spacing-sm); margin-bottom: var(--spacing-sm); }
.values-header p { margin: 0; }

.values-mosaic {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-xl);
  max-width: 1140px;
  margin: var(--spacing-3xl) auto;
  padding: 0 var(--container-pad);
  align-items: start;
}
.values-mosaic .col {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-xl);
}
.value-card {
  background: #fff;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-card);
  padding: var(--spacing-xl);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
}
/* The icon PNGs already include their own green circle, so the container
   adds no background/ring — the icon fills the full 60px slot. */
.value-card .icon-circle {
  width: 60px;
  height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.value-card .icon-circle img { width: 60px; height: 60px; }
.value-card h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0;
}
.value-card p {
  font-family: var(--font-body);
  font-size: 20px;
  line-height: var(--spacing-xl);
  letter-spacing: -0.3px;
  color: var(--ccl-black);
  margin: 0;
}

.value-photo {
  width: 100%;
  border-radius: var(--radius-md);
  overflow: hidden;
  aspect-ratio: 4 / 5; /* portrait — closer to the Figma orientation */
  box-shadow: var(--shadow-card);
}
.value-photo img { width: 100%; height: 100%; object-fit: cover; }

/* Cutout PNG — transparent-background portraits floating in the wash.
   No frame, no shadow, no aspect-ratio crop. Let the PNG be itself.
   Negative margin-bottom cancels the column's flex gap so the cutout
   sits flush against (or "stands on") the card below it. */
.value-cutout {
  display: block;
  width: 100%;
  margin-bottom: calc(var(--spacing-xl) * -1);
}
.value-cutout img { display: block; width: 100%; height: auto; }

/* Floating glyph icons — small decorative pops in negative space,
   not column-width hero blocks. */
.value-glyph {
  display: flex;
  justify-content: center;
  padding: var(--spacing-xs) 0;
}
.value-glyph img {
  width: 250px;
  height: auto;
  opacity: 0.95;
}

/* Mission-in-action blog row (post-wash) */
.action-blogs {
  background: #fff;
  padding: var(--spacing-5xl) var(--page-gutter);
}
.action-blogs h2 {
  text-align: center;
  margin: 0 0 var(--spacing-2xl);
}
.action-blogs .grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-xl);
  max-width: 1166px;
  margin: 0 auto;
}

/* Volunteer-quote variant of .action-blogs — same grid + section chrome,
   but each cell is a quote graphic instead of a blog card. Reuses
   .action-blogs .grid for the layout (so the 900px collapse rule applies
   automatically) and only styles the inner card. */
.value-quote-card {
  background: var(--grey-100);
  border-radius: var(--radius-md);
  padding: var(--spacing-xl);
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-lg);
}
.value-quote-card__icon {
  width: 48px;
  height: auto;
  display: block;
}
/* Tiny label that can replace the icon when the card needs a textual
   "type" tag instead of the brand quote glyph — e.g. "Research Says"
   on the What We Do v1 IPCC citations, where the quote glyph would
   visually compete with the row's commitment icon. */
.value-quote-card__label {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: var(--fs-tiny);
  line-height: var(--lh-tiny);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ccl-blue);
  margin: 0;
}
.value-quote-card blockquote {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0;
  flex: 1;
}
.value-quote-card figcaption {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.4;
}
.value-quote-card__name {
  font-weight: 700;
  color: var(--ccl-black);
}
.value-quote-card__since {
  font-style: italic;
  color: var(--grey-500);
}

/* ==========================================================================
   PAGE 3 — Our Team
   ========================================================================== */

.team-header {
  text-align: center;
  padding: var(--spacing-3xl) var(--container-pad);
  max-width: 1200px;
  margin: 0 auto;
}
.team-header .display { margin-bottom: var(--spacing-md); }

.team-panel,
.tabs-panel {
  background: var(--grey-100);
  /* Any nested .conf-quote-block reads this for its icon/author bg. */
  --quote-surface-bg: var(--grey-100);
  border-radius: var(--radius-md);
  max-width: 1246px;
  margin: var(--spacing-md) auto var(--spacing-5xl);
  padding: var(--spacing-xl) var(--spacing-3xl) var(--spacing-4xl);
}
.team-tabs {
  display: flex;
  gap: var(--spacing-3xl);
  border-bottom: 1px solid var(--grey-300);
  padding-bottom: var(--spacing-md);
  margin-bottom: var(--spacing-xl);
}
.team-tabs button {
  background: transparent;
  border: 0;
  border-bottom: 3px solid transparent;
  padding: 0 0 var(--spacing-md);
  margin-bottom: -17px;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: rgba(0,0,0,0.9);
  cursor: pointer;
}
.team-tabs button[aria-selected="true"] {
  font-weight: 600;
  border-image: var(--gradient-underline) 1;
}
.team-tabs button:focus-visible {
  outline: 2px solid var(--ccl-blue);
  outline-offset: 4px;
  border-radius: 2px;
}

/* Each tab panel has the same H2 (department name) — Ubuntu Semi-Bold H1.
   Both selectors need their own descendant chain: `.team-panel, .tabs-panel
   [role="tabpanel"][hidden]` reads as "every .team-panel" plus "hidden panels
   inside .tabs-panel", which display:none'd the whole Team page section. */
.team-panel [role="tabpanel"][hidden],
.tabs-panel [role="tabpanel"][hidden] { display: none; }
.team-panel [role="tabpanel"] > h2,
.tabs-panel [role="tabpanel"] > h2 { margin-bottom: var(--spacing-xl); }
.team-panel .panel-intro {
  font-family: var(--font-body);
  font-size: 19px;
  letter-spacing: -0.285px;
  line-height: 1.5;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-2xl);
  max-width: 1156px;
}
.team-panel h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
  margin: var(--spacing-md) 0 var(--spacing-xl);
}

/* team.html's directory grids are now .people--directory / --directory-dense
   (see PERSON CARD). The 4-up vs 5-up split survives; the staff-only name
   override does not — one name size for every person, everywhere. */
.dept-group { margin-bottom: var(--spacing-2xl); }
/* Direct child only — otherwise this bleeds into the <h3 class="person__name">
   h3s inside cards and renders them at H2 size (32px). */
.dept-group > h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
}
.board-subgroup + .board-subgroup { margin-top: var(--spacing-3xl); }

/* Initials avatar — fallback for cards with no headshot yet. Never stand a
   stock face in for a real, named person. Element is .person__avatar; the
   --avatar-initials-1..6 palette from tokens.css is opt-in via data-color. */
.person__avatar[data-color] { color: #fff; }
.person__avatar[data-color="1"] { background: var(--avatar-initials-1); }
.person__avatar[data-color="2"] { background: var(--avatar-initials-2); }
.person__avatar[data-color="3"] { background: var(--avatar-initials-3); }
.person__avatar[data-color="4"] { background: var(--avatar-initials-4); }
.person__avatar[data-color="5"] { background: var(--avatar-initials-5); }
.person__avatar[data-color="6"] { background: var(--avatar-initials-6); }

/* Volunteers panel — text-left, photo-right split */
.volunteers-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-3xl);
  align-items: start;
}
.volunteers-split .copy p { margin: 0 0 18px; font-size: 19px; letter-spacing: -0.285px; line-height: 1.5; color: var(--ccl-black); }
.volunteers-split .copy p:first-child strong { font-family: var(--font-body); font-weight: 700; }
.volunteers-split .copy .dei-link { margin-bottom: var(--spacing-lg); }
.volunteers-split .photo {
  border-radius: var(--radius-md);
  overflow: hidden;
  aspect-ratio: 3 / 2;
}
.volunteers-split .photo img { width: 100%; height: 100%; object-fit: cover; }

/* Founder's Story */
.founder {
  max-width: 815px;
  margin: 0 auto;
  padding: var(--spacing-5xl) var(--container-pad);
}
.founder header { text-align: center; margin-bottom: var(--spacing-2xl); }
.founder header .name {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 20px;
  line-height: 28px;
  color: var(--ccl-black);
}
.founder header .dates {
  font-family: var(--font-body);
  font-size: 19px;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
}
.founder header h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  margin: 0 0 var(--spacing-md);
  color: var(--ccl-black);
}
.founder p {
  font-family: var(--font-body);
  font-size: 19px;
  letter-spacing: -0.285px;
  line-height: 1.5;
  color: var(--ccl-black);
  margin: 0 0 18px;
}

.founder-video {
  margin: var(--spacing-2xl) 0;
}
/* Founder-video .lite-yt inherits everything from the base .lite-yt rule;
   just adds a card shadow. Play button is the default (medium) size. */
.founder-video .lite-yt { box-shadow: var(--shadow-card); }
.founder-video figcaption {
  margin-top: var(--spacing-sm);
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  line-height: var(--lh-tiny);
  color: var(--grey-500);
  font-style: italic;
  text-align: center;
}

.cavalry-callout {
  background: var(--grey-100);
  padding: var(--spacing-xl) var(--spacing-3xl);
  margin: var(--spacing-2xl) 0;
  position: relative;
}

/* When the founder narrative sits inside a tabpanel, reset its standalone
   padding (the panel already has padding) and flip the cavalry callout to
   white so it stays distinguishable on the panel's grey-100 background. */
.team-panel .founder {
  padding-top: var(--spacing-md);
  padding-bottom: 0;
}
.team-panel .cavalry-callout {
  background: #fff;
  border: 1px solid var(--grey-200);
}
.cavalry-callout p {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0;
  max-width: 691px;
}
.cavalry-callout .underline {
  display: block;
  margin-top: var(--spacing-sm);
  width: 215px;
}

/* In-text emphasis — the two Hero-Emphasis treatments (one per headline).
   Choose by VOICE (per Hero System.md):
   • .gradient-text   = BRAND voice — proper nouns / named things / org
     positions (e.g. "CCL Chapter", "Permitting Reform").
   • .hdr-underline   = PERSONAL voice — emotional / invitational phrases,
     values, shared aspirations (e.g. "Find Your People", "together").
   Never both on the same headline. */
.gradient-text {
  background: var(--gradient-blue-green);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

/* Hand-drawn marker underline. Promoted from the per-hero copies
   (.hero-t1 / .join-local-hero / .at-hero) to a general utility so any
   headline can carry the personal-voice emphasis. box-decoration-break keeps
   the stroke per-line on wraps.

   BOTH values are em-based, and they have to stay that way. The original was
   `background-size: 100% 18px` against an em padding — a fixed stroke under
   scaling clearance. That made the marker grow optically as the type shrank:
   18px is 32% of a 56px display heading but 45% of a 40px h1 and 56% of a
   32px h2, so it climbed into the letterforms and, on 19px body copy, read as
   a strikethrough (see the note on summer-conference.html). 0.32em reproduces
   the original 18px stroke at 56px exactly, and holds that same proportion at
   every other size. Clearance went 0.18em -> 0.28em to sit the stroke clear of
   the descenders in words like "your". */
.hdr-underline {
  background-image: url('../assets/brand/underlines/single-xlg.svg');
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 100% 0.32em;
  padding-bottom: 0.28em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

/* --------------------------------------------------------------------------
   Responsive — reflow heavy layouts under 900px.
   Detailed mobile per-tier rules from Hero System.md are not implemented
   in this first pass (noted in DEVIATIONS.md #11).
   -------------------------------------------------------------------------- */
@media (max-width: 900px) {
  .hero-t1,
  .team-cards,
  .mobilized,
  .pillar-row,
  .people--directory,
  .people--directory-dense,
  .volunteers-split,
  .stories-featured,
  .subscribe-banner,
  .action-blogs .grid { grid-template-columns: 1fr; }
  .blog-search { flex-direction: column; align-items: stretch; padding: 0 var(--spacing-lg); }
  .blog-search input { width: 100%; }
  .post-row { grid-template-columns: 1fr; }
  .post-row__image { aspect-ratio: 16 / 10; }
  /* Featured side-by-side lead → stack (image on top) on narrow screens. */
  .story-card--featured { grid-template-columns: 1fr; }
  .story-card--featured .story-card__image { min-height: 0; aspect-ratio: 16 / 9; border-right: none; border-bottom: 1px solid rgba(0,0,0,0.06); }
  .story-card--featured .story-card__body { padding: var(--spacing-lg); }
  .story-card--featured .story-card__body h2 { font-size: var(--fs-h2); line-height: var(--lh-h2); }
  .subscribe-banner__form { flex-direction: column; align-items: stretch; }
  .subscribe-banner__form input { max-width: none; width: 100%; }
  .team-tabs { gap: var(--spacing-md); flex-wrap: wrap; }
  .hero-t1__media::before { inset: -16px -16px 16px 16px; }
  /* Horizontal padding on site-header, section-nav, site-footer comes from
     --page-gutter now (tokens.css drops it to --spacing-lg below 900px);
     only layout-shape overrides stay here. */
  .site-header nav { display: none; }
  .nav-toggle { display: inline-flex; }
  .mobile-menu { display: block; }

  /* Section sub-nav → single swipeable strip. The hamburger holds the
     complete path to every sub-page, so the strip is a zero-tap wayfinding
     convenience rather than the sole route. Label dropped (the page eyebrow
     already names the section); edge fades signal the row scrolls and are
     toggled by site.js as it scrolls. */
  .section-nav { padding-block: var(--spacing-sm); flex-direction: row; align-items: center; gap: 0; }
  .section-nav .section-title { display: none; }
  .section-nav .links {
    flex-wrap: nowrap; overflow-x: auto; gap: var(--spacing-xs); width: 100%;
    -webkit-overflow-scrolling: touch; scrollbar-width: none;
  }
  .section-nav .links::-webkit-scrollbar { display: none; }
  .section-nav .links a { flex: 0 0 auto; white-space: nowrap; }
  .section-nav::before, .section-nav::after {
    content: ""; position: absolute; top: 0; bottom: 0; width: 28px;
    pointer-events: none; opacity: 0; transition: opacity .15s ease; z-index: 1;
  }
  .section-nav::before { left: 0;  background: linear-gradient(to right, var(--bg-page), transparent); }
  .section-nav::after  { right: 0; background: linear-gradient(to left,  var(--bg-page), transparent); }
  .section-nav.is-fade-start::before { opacity: 1; }
  .section-nav.is-fade-end::after    { opacity: 1; }

  /* Footer collapses to one column; the legal bar stacks its two halves and
     left-aligns the policy links under the disclosure. */
  .site-footer__cols { grid-template-columns: 1fr; gap: var(--spacing-xl); padding-block: var(--spacing-3xl); }
  .site-footer__legal { justify-content: flex-start; }
  /* At design size the three badges are 380px and orphan the third onto its
     own row. Equal-height at 76px keeps them one band; `width: auto` means
     each still holds its own aspect ratio. */
  .site-footer__badges { gap: var(--spacing-sm); }
  .site-footer__badges img { height: 76px; width: auto; }

  /* Values mosaic — narrow widths
     - Collapse from 3-col grid to 1-col flow
     - Tighten the inter-item gap (it was 32px which made the stack huge)
     - Hide the standalone decorative glyph icons — they're atmospheric
       punctuation that doesn't add value when everything's in one column
     - Constrain photo/cutout max-width so they don't dominate the viewport
     - Recompute the cutout's negative margin to match the narrower gap */
  .values-mosaic {
    grid-template-columns: 1fr;
    gap: 0;
    padding: 0 var(--spacing-lg);
  }
  .values-mosaic .col { gap: var(--spacing-lg); }
  .values-mosaic .col + .col { margin-top: var(--spacing-lg); }
  .values-mosaic .value-glyph { display: none; }
  .values-mosaic .value-photo,
  .values-mosaic .value-cutout {
    max-width: 420px;
    margin-left: auto;
    margin-right: auto;
  }
  .values-mosaic .value-cutout { margin-bottom: calc(var(--spacing-lg) * -1); }

  /* Breadcrumb — drop the desktop 4xl horizontal padding */
  .breadcrumb { padding-left: var(--spacing-lg); padding-right: var(--spacing-lg); flex-wrap: wrap; }

  /* Mission/values page chrome — tighten vertical rhythm at narrow widths;
     horizontal padding comes from --page-gutter via the base rules. */
  .mission-block { padding-block: var(--spacing-3xl) var(--spacing-xl); }
  .values-header { padding-block: var(--spacing-xl) var(--spacing-md); }
  .action-blogs { padding-block: var(--spacing-3xl); }
}

/* ==========================================================================
   OUR APPROACH — Theory of Change, Policy Commitments, Quiz CTA, Strategic
   Plan download. Built from Figma 1781:4907. The page mostly reuses
   established primitives (hero-t1, section-header, eyebrow-blue,
   divider-thick, btn-primary) — these rules cover only the new patterns.
   ========================================================================== */

/* ---- Volunteer activity grid (5 expandable lever cards) -------------------
   Flexbox wrap so 3 cards land in row 1 and the remaining 2 center in row 2
   without leaving an awkward empty grid slot. Each card is a native <details>
   — the icon/title/lead/cta sit in <summary>; the longer body reveals below. */
.activity-grid {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--spacing-xl);
  max-width: 1100px;
  margin: var(--spacing-xl) auto var(--spacing-5xl);
  padding: 0 var(--container-pad);
  align-items: flex-start;
}
.activity-card {
  flex: 1 1 280px;
  max-width: 340px;
  background: #fff;
  border: 1px solid var(--grey-200);
  border-radius: var(--radius-md);
  overflow: hidden;                                /* clip photo to rounded corners */
  transition: border-color .15s, box-shadow .15s;
}
.activity-card[open] {
  border-color: var(--ccl-blue);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06);
}
.activity-card > summary {
  list-style: none;
  cursor: pointer;
  display: block;                                  /* photo + body stack */
}
.activity-card > summary::-webkit-details-marker { display: none; }
.activity-card > summary::marker { content: ''; }
.activity-card__image {
  width: 100%;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  background: var(--grey-200);
}
.activity-card__image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Per-image crop-anchor modifier. Use on cards where the natural
   composition is taller-aspect than the 16:10 card slot and the
   important content sits in the upper half of the photo (e.g. faces
   at the top, banner at the bottom). Anchors object-fit:cover to
   the top so heads stay visible. */
.activity-card__image--anchor-top img { object-position: 50% 0%; }
.activity-card__body {
  padding: var(--spacing-lg) var(--spacing-xl) var(--spacing-xl);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sm);
  text-align: left;
}
.activity-card[open] .activity-card__body {
  border-bottom: 1px solid var(--grey-200);
}
.activity-card__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0;
}
.activity-card__lead {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.45;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}
/* "Read more" / "Show less" CTA at the bottom of the card body */
.activity-card__cta {
  margin-top: var(--spacing-xs);
  color: var(--ccl-blue);
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 16px;
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-xs);
}
.activity-card__cta-close { display: none; }
.activity-card[open] .activity-card__cta-open { display: none; }
.activity-card[open] .activity-card__cta-close { display: inline; }
.activity-card__chevron {
  width: 10px;
  height: 10px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(45deg);
  margin-top: -3px;
  transition: transform .2s ease;
}
.activity-card[open] .activity-card__chevron {
  transform: rotate(-135deg);
  margin-top: 3px;
}
.activity-card__more {
  margin: 0;
  padding: var(--spacing-lg) var(--spacing-xl) var(--spacing-xl);
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.6;
  color: var(--grey-600);
  text-align: left;
}

/* ---- Policy Commitments — accordion list + side photo --------------------- */
/* Cross-page deep links (e.g. from Policy Wins) target the section header or an
   individual commitment; keep the anchor off the top edge of the viewport. */
#policy-commitments,
#reduce-emissions,
#remove-climate-pollution,
#protect-people { scroll-margin-top: var(--spacing-xl); }
.commitments-layout {
  display: grid;
  grid-template-columns: 1fr 329px;
  gap: var(--spacing-3xl);
  align-items: start;
  max-width: 1204px;
  margin: var(--spacing-xl) auto var(--spacing-5xl);
  padding: 0 var(--gutter);
}
.commitments-list {
  display: flex;
  flex-direction: column;
}
.commitment {
  border-bottom: 1px solid var(--grey-200);
}
.commitment summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: var(--spacing-lg);
  padding: var(--spacing-lg) 0;
  /* Subtle interactive treatment without losing the flat row look. */
  transition: color .12s ease;
}
.commitment summary::-webkit-details-marker { display: none; }
.commitment summary::marker { content: ''; }
.commitment summary:hover .commitment__title { color: var(--ccl-blue); }
.commitment__icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  flex-shrink: 0;
}
.commitment__icon img {
  width: 48px;
  height: 48px;
  object-fit: contain;
}
/* Boxed colour treatment retired per design call — icons render at their
   natural fill against the white row. .commitment__icon--blue/--green/--brown
   classes left in markup as hooks in case a colour tint comes back. */
.commitment__title {
  flex: 1;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
}
.commitment__chevron {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  /* CSS-only chevron — two diagonal lines drawn with borders */
  border-right: 2px solid var(--grey-600);
  border-bottom: 2px solid var(--grey-600);
  transform: rotate(45deg);
  transform-origin: center;
  margin-top: -6px;
  transition: transform 0.2s ease;
}
.commitment[open] .commitment__chevron {
  transform: rotate(-135deg);
  margin-top: 4px;
}
.commitment__body {
  padding: 0 0 var(--spacing-xl);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-lg);
}
.commitment__body > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

/* "Research Says" callout inside each commitment body */
.commitment__research {
  background: var(--ccl-blue-bg);
  border-radius: var(--radius-sm);
  padding: var(--spacing-lg);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sm);
  margin: 0;
}
.commitment__research-label {
  font-family: var(--font-body);
  font-weight: 700;
  color: var(--ccl-blue);
  font-size: 19px;
}
.commitment__research blockquote {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 19px;
  line-height: 1.5;
  margin: 0;
  color: var(--ccl-black);
}
.commitment__research-cite {
  font-size: 19px;
  font-weight: 700;
  line-height: 1.5;
  margin: 0;
}
.commitment__research-cite a {
  color: var(--ccl-blue-dark);
  text-decoration: underline;
  text-underline-offset: 2px;
}

.commitments-photo {
  border-radius: var(--radius-sm);
  overflow: hidden;
  margin: 0;
  aspect-ratio: 329 / 513;
  position: sticky;
  top: var(--spacing-xl);
}
.commitments-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ---- v2 commitments — open stacked rows (no accordion) -------------------
   Used on our-approach-v2.html. Three rows stacked top-to-bottom, each with
   the lever icon on the left and title + body on the right. Research Says
   quotes live in the .research-carousel below instead of inline. */
.commitments-stacked {
  max-width: 1166px;
  margin: var(--spacing-xl) auto var(--spacing-5xl);
  padding: 0 var(--gutter);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-3xl);
}
.commitment-row {
  display: grid;
  grid-template-columns: 80px 1fr;
  gap: var(--spacing-xl);
  align-items: start;
}
.commitment-row__icon {
  width: 80px;
  height: 80px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.commitment-row__icon img {
  width: 64px;
  height: 64px;
  object-fit: contain;
}
.commitment-row__content h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.commitment-row__content p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

/* ---- v2 research carousel — wraps .conf-quote-block slides ----------------
   The .conf-quote-block keeps its full gradient-border + brand-quote-glyph
   treatment as the per-slide visual. Carousel chrome adds a viewport
   (overflow:hidden), a translateX track, and prev/dots/next controls. */
.research-carousel {
  max-width: 1166px;
  margin: var(--spacing-md) auto var(--spacing-5xl);
  padding: 0 var(--gutter);
}
.research-carousel__viewport {
  overflow: hidden;
  /* Add a little vertical room so the .conf-quote-block negative margins
     (which intentionally bleed past the body) don't get clipped. */
  padding-block: var(--spacing-xs);
}
.research-carousel__track {
  display: flex;
  align-items: stretch;
  transition: transform 0.4s cubic-bezier(.4, 0, .2, 1);
  will-change: transform;
}
.research-carousel__slide {
  flex: 0 0 100%;
  min-width: 0;
  padding-inline: var(--spacing-xs);
  box-sizing: border-box;
}
.research-carousel__slide[aria-hidden="true"] {
  /* Stays in layout for the transform animation; just hidden from AT
     and not interactive. */
  pointer-events: none;
}
.research-carousel__slide .conf-quote-block {
  margin: 0 auto;             /* center within the slide */
  max-width: 820px;            /* slightly wider than default 750 so the carousel feels intentional */
}

.research-carousel__controls {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-xl);
  margin-top: var(--spacing-xl);
}
.research-carousel__btn {
  background: transparent;
  border: 1px solid var(--grey-300);
  border-radius: 50%;
  width: 44px;
  height: 44px;
  font-size: 18px;
  cursor: pointer;
  color: var(--ccl-black);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: border-color .15s, background .15s, color .15s;
  font-family: var(--font-display);
}
.research-carousel__btn:hover {
  border-color: var(--ccl-blue);
  background: var(--ccl-blue-bg);
  color: var(--ccl-blue-dark);
}
.research-carousel__btn:focus-visible {
  outline: 2px solid var(--ccl-blue);
  outline-offset: 2px;
}
.research-carousel__dots {
  display: flex;
  gap: var(--spacing-sm);
  align-items: center;
}
.research-carousel__dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--grey-300);
  border: 0;
  padding: 0;
  cursor: pointer;
  transition: background .15s, transform .15s;
}
.research-carousel__dot:hover { background: var(--ccl-blue); transform: scale(1.15); }
.research-carousel__dot[aria-current="true"] {
  background: var(--gradient-underline);
  background-color: var(--ccl-blue);  /* fallback */
  transform: scale(1.3);
}
.research-carousel__dot:focus-visible {
  outline: 2px solid var(--ccl-blue);
  outline-offset: 3px;
}

@media (max-width: 600px) {
  .commitment-row {
    grid-template-columns: 56px 1fr;
    gap: var(--spacing-md);
  }
  .commitment-row__icon { width: 56px; height: 56px; }
  .commitment-row__icon img { width: 48px; height: 48px; }
}

/* ---- v3 commitments — manifesto layout (numbered, side-by-side) ----------
   Used on our-approach-v3.html. Two-column grid per row: LEFT is the
   "Goal NN" eyebrow + icon-and-title pair, RIGHT is the body paragraph.
   Thin grey-200 divider above each row + below the last one. Reads as a
   declarative manifesto rather than the activity-card / lever pattern. */
.commitments-manifesto {
  max-width: 1166px;
  margin: var(--spacing-xl) auto 0;
  padding: 0 var(--gutter);
  display: flex;
  flex-direction: column;
}
/* When the Research Says section-header follows the manifesto rows
   directly, tighten its top padding so the carousel reads as part of
   the same Policy Commitments moment instead of a separate section. */
.commitments-manifesto + .section-header {
  padding-top: var(--spacing-lg);
}
.commitment-manifesto {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-3xl);
  align-items: start;
  padding: var(--spacing-3xl) 0;
  border-top: 1px solid var(--grey-200);
}
.commitment-manifesto:last-child {
  border-bottom: 1px solid var(--grey-200);
}
.commitment-manifesto__heading {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
}
.commitment-manifesto__eyebrow {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: var(--fs-tiny);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ccl-blue);
  margin: 0;
}
.commitment-manifesto__title-row {
  display: flex;
  align-items: center;
  gap: var(--spacing-md);
}
.commitment-manifesto__icon {
  width: 64px;
  height: 64px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
.commitment-manifesto__icon img {
  width: 56px;
  height: 56px;
  object-fit: contain;
}
.commitment-manifesto__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: 0;
}
.commitment-manifesto__body p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

@media (max-width: 900px) {
  .commitment-manifesto {
    grid-template-columns: 1fr;
    gap: var(--spacing-lg);
    padding: var(--spacing-2xl) 0;
  }
}

/* ---- v3 next-steps — side-by-side Quiz + Strategic Plan ------------------
   Replaces the original two stacked sections (.quiz-cta + .strategic-plan)
   with a two-up card grid. Equal-weight cards, each with its own visual
   anchor (photo / cover), eyebrow differentiates path (green = volunteer
   onboarding / blue = strategy depth). Green wash dropped — green lives on
   the active CTA button only. Buttons asymmetric (primary green / tertiary
   outlined) so the quiz reads as the preferred next step. */
.next-steps {
  background: #fff;
  padding: var(--spacing-5xl) var(--page-gutter);
}
.next-steps__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-2xl);
  max-width: 1166px;
  margin: 0 auto;
  align-items: stretch;
}
.next-step-card {
  background: #fff;
  border: 1px solid var(--grey-200);
  border-radius: var(--radius-md);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
}
.next-step-card__image {
  width: 100%;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--grey-100);
}
.next-step-card__image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Strategic-plan cover is portrait — fits a landscape slot badly with
   object-fit: cover (Capitol photo gets clipped off). Treat the cover
   as a PDF preview floating on a navy frame: contain instead of cover,
   ccl-blue-dark backdrop that matches the cover's own navy title bar
   so the two meet seamlessly, soft drop-shadow to lift the cover off
   the frame. Reads as "downloadable plan thumbnail," not "awkward crop". */
.next-step-card--plan .next-step-card__image {
  background: var(--ccl-blue-dark);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--spacing-lg);
}
.next-step-card--plan .next-step-card__image img {
  width: auto;
  height: 100%;
  max-width: 100%;
  object-fit: contain;
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);
  border-radius: var(--radius-xs);
}
.next-step-card__body {
  padding: var(--spacing-xl);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
  flex: 1;
}
.next-step-card__body h2 {
  margin: 0;
}
.next-step-card__body > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
  flex: 1;
}
.next-step-card__body .btn {
  align-self: flex-start;
}
/* The canonical .eyebrow-* utilities carry their own 12px margin-bottom
   for block-level use elsewhere on the site. Inside this card the 16px
   flex gap already governs spacing — stacking the margin on top pulls
   the title visually toward the body paragraph instead of the eyebrow
   above it. Zero the eyebrow's own margin here so every child of __body
   sits on a uniform 16px rhythm. */
.next-step-card__body .eyebrow-blue,
.next-step-card__body .eyebrow-green {
  margin-bottom: 0;
}

@media (max-width: 900px) {
  .next-steps__grid { grid-template-columns: 1fr; }
  .next-step-card__image { aspect-ratio: 16 / 10; }
}

/* ---- v1 bottom CTAs — split quiz hero + slim "go deeper" banner -----------
   Used on our-approach.html. Replaces the gradient-backdrop quiz card and
   the grey-100 strategic plan panel with two distinct moments: a big
   full-width split-card hero for the quiz (photo left, content right) and
   a thin "Go Deeper" banner for the strategic plan download (small cover
   thumb + title + outlined PDF button). No green wash on the quiz card. */
/* Light-grey band behind the quiz-hero + go-deeper cards. The band supplies
   the vertical spacing, so the sections drop their own outer margins inside it. */
.quiz-go-band { background: var(--grey-100); padding: var(--spacing-5xl) 0; }
.quiz-go-band .quiz-hero { margin-top: 0; }
.quiz-go-band .go-deeper { margin-bottom: 0; }

.quiz-hero {
  max-width: 1166px;
  margin: var(--spacing-5xl) auto var(--spacing-xl);
  padding: 0 var(--gutter);
}
.quiz-hero__inner {
  display: grid;
  grid-template-columns: 1fr 1fr;
  border: 1px solid var(--grey-200);
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: #fff;
  align-items: stretch;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
}
.quiz-hero__photo {
  min-height: 440px;
  overflow: hidden;
}
.quiz-hero__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.quiz-hero__body {
  padding: var(--spacing-3xl);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
  justify-content: center;
}
.quiz-hero__body .eyebrow-green { margin-bottom: 0; }
.quiz-hero__body h2 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
  margin: 0;
}
.quiz-hero__body > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}
.quiz-hero__body .btn {
  align-self: flex-start;
  margin-top: var(--spacing-sm);
}

/* "Go Deeper" thin banner — cover thumb + title + outlined PDF button. */
.go-deeper {
  max-width: 1166px;
  margin: 0 auto var(--spacing-5xl);
  padding: 0 var(--gutter);
}
.go-deeper__inner {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: var(--spacing-xl);
  align-items: center;
  background: #fff;
  border: 1px solid var(--grey-200);
  border-radius: var(--radius-md);
  padding: var(--spacing-xl);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.03);
}
.go-deeper__cover {
  width: 100px;
  margin: 0;
}
.go-deeper__cover img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: var(--radius-xs);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
}
.go-deeper__body {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2xs);
}
.go-deeper__body .eyebrow-blue { margin-bottom: var(--spacing-2xs); }
.go-deeper__body h3 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0;
}
.go-deeper__body > p {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.45;
  color: var(--grey-600);
  margin: 0;
}

@media (max-width: 900px) {
  .quiz-hero__inner { grid-template-columns: 1fr; }
  .quiz-hero__photo { min-height: 260px; }
  .quiz-hero__body { padding: var(--spacing-2xl); }
  .go-deeper__inner {
    grid-template-columns: 1fr;
    text-align: center;
    gap: var(--spacing-md);
    padding: var(--spacing-2xl);
  }
  .go-deeper__cover { margin: 0 auto; }
  .go-deeper__inner .btn { justify-self: center; }
}

/* ---- Pre-footer Join CTA ------------------------------------------------
   Sits between the last content section and the site footer on every page.
   Dark-blue gradient backdrop (the "navy + green" pairing we agreed on);
   big white display headline + supporting line on the left, primary green
   button on the right. Reusable component — same markup on every page so
   copy + link can be swapped once if anything ever needs to change. */
.join-cta {
  background: var(--gradient-dark-blue);
  padding: var(--spacing-5xl) var(--page-gutter);
  color: #fff;
}
.join-cta__inner {
  max-width: 1166px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: var(--spacing-2xl);
  align-items: center;
}
.join-cta__copy h2 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: #fff;
  margin: 0 0 var(--spacing-md);
  max-width: 600px;
}
.join-cta__copy p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  color: #fff;
  margin: 0;
  max-width: 560px;
  opacity: 0.92;
}

@media (max-width: 900px) {
  .join-cta__inner {
    grid-template-columns: 1fr;
    text-align: center;
    gap: var(--spacing-lg);
  }
  .join-cta__copy h2 { margin-left: auto; margin-right: auto; }
  .join-cta__copy p { margin-left: auto; margin-right: auto; }
  .join-cta__inner > .btn { justify-self: center; }
}

/* ---- Quiz CTA — full-bleed gradient backdrop + centered white card -------- */
.quiz-cta {
  background: var(--gradient-blue-green);
  padding: var(--spacing-5xl) var(--page-gutter);
  text-align: center;
}
.quiz-cta__card {
  background: #fff;
  border-radius: var(--radius-md);
  padding: var(--spacing-3xl) var(--spacing-3xl) var(--spacing-3xl);
  max-width: 700px;
  margin: 0 auto;
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.10);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--spacing-md);
}
.quiz-cta__card h2 {
  margin: 0;
}
.quiz-cta__card > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.45;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
  max-width: 520px;
}
.quiz-cta__card .btn {
  margin-top: var(--spacing-sm);
}
/* .button-row is the shared flex pair; the card is centered, so center the
   row too rather than letting it hug the left edge. */
.quiz-cta__card .button-row { justify-content: center; }

/* ---- Strategic Plan download — grey-100 panel with cover image + form ----- */
.strategic-plan {
  background: #fff;
  padding: var(--spacing-5xl) var(--page-gutter);
}
.strategic-plan__inner {
  background: var(--grey-100);
  border-radius: var(--radius-md);
  display: grid;
  grid-template-columns: 382px 1fr;
  gap: var(--spacing-2xl);
  align-items: center;
  max-width: 1091px;
  margin: 0 auto;
  padding: var(--spacing-3xl);
}
.strategic-plan__cover {
  position: relative;
  aspect-ratio: 382 / 496;
  border-radius: var(--radius-sm);
  overflow: hidden;
  margin: 0;
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25);
}
.strategic-plan__cover img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.strategic-plan__body {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
  align-items: flex-start;
}
.strategic-plan__body h2 {
  margin: 0;
}
.strategic-plan__body > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.45;
  color: var(--ccl-black);
  margin: 0;
}
.strategic-plan__body .btn {
  margin-top: var(--spacing-sm);
}

/* --------------------------------------------------------------------------
   Hover-underline cleanup
   tokens.css ships a "subtle underline on hover" pattern via a transparent
   border-bottom that turns blue on `a:hover`. Any link that ALSO has
   text-decoration: underline as its default state ends up rendering TWO
   underlines (text-decoration line + border-bottom line) when hovered.
   For every such link, suppress the border-bottom on hover so only the
   text-decoration underline remains.
   -------------------------------------------------------------------------- */
.person__link:hover,
.tabs__tab:hover,
.pagination__nav:hover,
.story-brief:hover,
.post-row:hover,
.volunteers-split .copy .dei-link a:hover,
.commitment__research-cite a:hover {
  border-bottom-color: transparent;
}
/* The lead card IS an <a> with a real border — keep its bottom edge the card
   color on hover instead of letting the global a:hover recolor it to a link. */
.story-card:hover { border-bottom-color: rgba(0,0,0,0.10); }

/* ==========================================================================
   JOIN SUMMARY — two-up Chapters / Action Teams choice cards, Power of
   Group Action video, More Stories CTA. Built from Figma 1475:13921.
   ========================================================================== */

/* ---- Two-up "Chapters" / "Action teams" choice cards ---------------------- */
.join-choices {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-4xl);
  max-width: 1166px;
  margin: var(--spacing-xl) auto var(--spacing-5xl);
  padding: 0 var(--gutter);
  align-items: stretch;
}
.join-choice {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--spacing-md);
}
.join-choice__photo {
  width: 100%;
  aspect-ratio: 556 / 270;
  border-radius: var(--radius-md);
  overflow: hidden;
  margin: 0;
}
.join-choice__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.join-choice h3 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: var(--spacing-sm) 0 0;
}
.join-choice p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.45;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}
/* Push the button to the bottom so both cards' CTAs line up even when
   the bodies differ in length. */
.join-choice .btn {
  margin-top: auto;
}

/* ---- Join form beside the two routing choices ----------------------------
   The overview's sign-up form with the same two doors as .join-choices —
   text-only and stacked — sitting beside it as the "or". Form and routing
   become ONE decision point instead of two stacked sections: someone who has
   already decided fills the form without scrolling past anything, someone who
   wants to look first has both doors in the same view.

   Shared rather than page-local because both Volunteer-overview arrangements
   under test (join.html, join-v2.html) use it, and the comparison is only
   honest if the one thing that differs between them is the hero.

   No blue offset slab here, deliberately. In this kit that device marks the
   page's primary conversion widget sitting IN a hero — .give-hero__widget and
   .join-local-hero__form use byte-identical insets, and both peek RIGHT
   because the widget is always the right column. Here the form is mid-page
   and shares its row with the choices, so the slab would claim a status the
   layout doesn't support — and it only fit at all once mirrored, the tell. */
.join-split {
  display: grid;
  /* Asymmetric on purpose: the form is the primary path, so it gets the wider
     track. Structural hierarchy reads as intentional where an ornament on the
     form itself read as decoration. */
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  gap: var(--spacing-4xl);
  align-items: start;
  /* --page-gutter, not a max-width + --gutter: this sits directly under the
     .hero-t1 on join.html, and the form's left edge has to land on the same
     rail as the hero copy. Both use the site's 1440/64 content band, so they
     stay aligned at every width instead of only at one. */
  margin: 0 auto var(--spacing-5xl);
  padding: 0 var(--page-gutter);
  /* Both pages' Join CTAs are same-page anchors to this section. */
  scroll-margin-top: var(--spacing-xl);
}
/* ONE card, not two. The heading has to sit outside #ccl-join-form — that's
   the FormAssembly target and the live embed replaces its contents — so the
   card treatment lives here, wrapping heading + form, and the inner
   .fa-form-hold drops the card styling it carries by default. Without that
   neutraliser you get a card inside a card, shadow and all. */
.join-split__card {
  background: #fff;
  border-radius: var(--radius-lg);
  padding: var(--spacing-xl);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}
.join-split__card .fa-form-hold {
  background: none;
  background-image: none;
  border-radius: 0;
  padding: 0;
  box-shadow: none;
  min-height: 0;
  display: block;
}
.join-split__form-title {
  font-family: var(--font-display);
  font-weight: var(--fw-weak);
  font-size: var(--fs-h3);
  line-height: calc(var(--lh-h3) / var(--fs-h3));
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-xs);
}
.join-split__form-lede {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  color: var(--grey-600);
  margin: 0 0 var(--spacing-lg);
}
.join-split__aside {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2xl);
}
.join-split__aside-head {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0;
}
/* The two choices live in a narrower column than the 2-up grid they came
   from, so they stack and drop their photos. */
.join-split__aside .join-choices {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2xl);
  max-width: none;
  margin: 0;
  padding: 0;
}
.join-split__aside .join-choice { gap: var(--spacing-sm); }
/* Demoted from h2 scale (32px/700). They were bigger AND bolder than the
   form's own title on the primary side, and bigger than the "Or explore…"
   heading they sit under — inverted twice over. h4 scale puts them below
   both. Needs .ccl to outrank the base .join-choice h3 rule above. */
.ccl .join-split__aside .join-choice h3 {
  font-size: var(--fs-h4);
  line-height: calc(var(--lh-h4) / var(--fs-h4));
}
/* Text-only choices: a rule between them so two bare blocks still read as
   two distinct options. */
.join-split__aside .join-choice + .join-choice {
  border-top: 1px solid var(--grey-200);
  padding-top: var(--spacing-2xl);
}

/* ---- Power of Group Action video — centered lite-yt embed ----------------- */
.group-action-video {
  max-width: 720px;
  margin: var(--spacing-xl) auto var(--spacing-5xl);
  padding: 0 var(--gutter);
}
.group-action-video .lite-yt {
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-md);
  overflow: hidden;
}

/* ---- "More Stories" button under the action-blogs grid -------------------- */
.action-blogs__cta {
  display: flex;
  justify-content: center;
  margin-top: var(--spacing-2xl);
}

@media (max-width: 900px) {
  .join-choices {
    grid-template-columns: 1fr;
    gap: var(--spacing-2xl);
  }
  .join-choice__photo { aspect-ratio: 16 / 9; }
  .join-split { grid-template-columns: 1fr; gap: var(--spacing-3xl); }
}

/* ---- Responsive collapse — match the 900px breakpoint elsewhere ----------- */
@media (max-width: 900px) {
  .activity-grid { grid-template-columns: repeat(2, 1fr); }
  .commitments-layout { grid-template-columns: 1fr; }
  .commitments-photo {
    max-width: 500px;
    margin: 0 auto;
    position: static;
    aspect-ratio: 4 / 3;
  }
  .strategic-plan__inner {
    grid-template-columns: 1fr;
    padding: var(--spacing-2xl);
  }
  .strategic-plan__cover { max-width: 320px; margin: 0 auto; }
  .quiz-cta__card { padding: var(--spacing-2xl); }
}
@media (max-width: 600px) {
  .activity-grid { grid-template-columns: 1fr; }
}


/* =========================================================================
   ATTEND A CONFERENCE — page-specific patterns
   ========================================================================= */

/* ----- Hero ------------------------------------------------------------- */
/* Full-bleed gradient wash behind the hero (per Figma): white -> light blue
   -> light green -> white, near-vertical. Fades back to white at the bottom
   so "Choose the right event" sits cleanly on white below. */
.conference-hero-wash {
  /* Straight 180deg, not the design's 187.57deg tilt: at that angle the
     gradient axis leans ~7.5deg off vertical, so across a wide viewport one
     end of the TOP edge is already well into the blue while the other is
     still white — which reads as a hard diagonal seam against the white
     breadcrumb strip above. Vertical keeps the same colour journey and makes
     the top edge uniformly white, so the wash eases in with no seam. */
  background: linear-gradient(180deg,
    #FFFFFF 0%,
    #E8F3F9 22%,
    #EBF4DC 70%,
    #FFFFFF 88%);
  padding: var(--spacing-2xl) 0 var(--spacing-4xl);
}
.conference-hero {
  max-width: 1208px;
  margin: 0 auto;
  padding: 0 var(--gutter);
  text-align: center;
}
.conference-hero .eyebrow-green {
  display: block;
  text-align: center;
  margin-bottom: var(--spacing-xs);
}
.conference-hero .display { margin: 0 0 var(--spacing-sm); }
.conference-hero__subhead {
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-xl);
}
.conference-hero__featured {
  max-width: 900px;
  margin: 0 auto var(--spacing-2xl);
}
.conference-hero__featured .h2-bold { margin: 0 0 var(--spacing-xs); }
.conference-hero__lede {
  font-family: var(--font-display);
  font-size: 20px;
  line-height: 28px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
}
.conference-hero__ctas {
  display: flex;
  gap: var(--spacing-md);
  justify-content: center;
  flex-wrap: wrap;
}
.conference-hero__media {
  margin-top: var(--spacing-xl);
  border-radius: var(--radius-md);
  overflow: hidden;
}
.conference-hero__media .lite-yt {
  aspect-ratio: 16 / 9;
  position: relative;
  border-radius: var(--radius-md);
  overflow: hidden;
}
.conference-hero__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Ambient autoplay loop (no sound) — fills the 16:9 hero media slot */
.conference-hero__media { position: relative; }
.conference-hero__video {
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  display: block;
  border-radius: var(--radius-md);
  background: var(--grey-200);
}
/* Pause / play toggle for the ambient loop (WCAG 2.2.2 — give users a
   way to stop auto-playing motion). Sits in the bottom-right corner. */
.video-toggle {
  position: absolute;
  right: var(--spacing-md);
  bottom: var(--spacing-md);
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  cursor: pointer;
  transition: background .15s;
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
}
.video-toggle:hover { background: rgba(0, 0, 0, 0.75); }
.video-toggle:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 2px;
}
.video-toggle__icon {
  width: 20px;
  height: 20px;
  fill: currentColor;
}
/* Default state = playing → show the pause glyph. */
.video-toggle .video-toggle__icon--play { display: none; }
.video-toggle .video-toggle__icon--pause { display: block; }
/* Paused state → show the play glyph. */
.video-toggle.is-paused .video-toggle__icon--play { display: block; }
.video-toggle.is-paused .video-toggle__icon--pause { display: none; }

/* ----- Conference event cards (image left, content right) ---------------- */
.conference-events {
  max-width: 1208px;
  margin: 0 auto var(--spacing-3xl);
  padding: 0 var(--gutter);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2xl);
}
.conference-event-card {
  display: grid;
  grid-template-columns: minmax(0, 519px) 1fr;
  gap: var(--spacing-2xl);
  align-items: start;
}
.conference-event-card:nth-child(even) {
  grid-template-columns: 1fr minmax(0, 519px);
}
.conference-event-card:nth-child(even) .conference-event-card__image {
  order: 2;
}
.conference-event-card:nth-child(even) .conference-event-card__body {
  order: 1;
}
.conference-event-card__image {
  border-radius: var(--radius-md);
  overflow: hidden;
  /* 16/10, not 4/3: these blurbs run 30–45 words, so a 4/3 crop stood ~100px
     taller than the shortest card's copy and left a hole under its button.
     16/10 brings the photo within ~35px of every card's text and is the
     system's default landscape crop (hero media, story cards, post rows). */
  aspect-ratio: 16 / 10;
}
.conference-event-card__image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.conference-event-card__body h3 {
  margin: 0 0 var(--spacing-sm);
}
.conference-event-card__body > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}

@media (max-width: 900px) {
  .conference-event-card,
  .conference-event-card:nth-child(even) {
    grid-template-columns: 1fr;
  }
  .conference-event-card:nth-child(even) .conference-event-card__image { order: 0; }
  .conference-event-card:nth-child(even) .conference-event-card__body { order: 0; }
}

/* ----- State conference cards (3-up grid) ------------------------------- */
.state-conference-grid {
  max-width: 1208px;
  margin: 0 auto var(--spacing-3xl);
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-xl);
}
.state-conference-card__image {
  border-radius: var(--radius-md);
  overflow: hidden;
  aspect-ratio: 16 / 10;
  margin-bottom: var(--spacing-md);
}
.state-conference-card__image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.state-conference-card h3 { margin: 0 0 var(--spacing-xs); }
/* Column layout so the CTA sits on a common baseline across the row — a
   longer location (e.g. "New York, New York") wraps the meta to two lines and
   would otherwise drop that card's button below its neighbours'. */
.state-conference-card { display: flex; flex-direction: column; }
.state-conference-card .btn { margin-top: auto; align-self: flex-start; }

@media (max-width: 900px) {
  .state-conference-grid { grid-template-columns: 1fr; }
}

/* ----- Monthly Meetings callout (text left, photo right) ---------------- */
.monthly-callout {
  max-width: 1208px;
  margin: 0 auto var(--spacing-3xl);
  padding: var(--spacing-2xl) var(--spacing-2xl);
  border-radius: var(--radius-md);
  background: var(--ccl-blue-bg);
  display: grid;
  grid-template-columns: 1fr minmax(0, 461px);
  gap: var(--spacing-2xl);
  align-items: center;
}
.monthly-callout__copy h2 { margin: 0 0 var(--spacing-sm); }
.monthly-callout__copy p { margin: 0 0 var(--spacing-md); }
.monthly-callout__image-wrap {
  border-radius: var(--radius-md);
  overflow: hidden;
  aspect-ratio: 16 / 10;
}
.monthly-callout__image-wrap img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

@media (max-width: 900px) {
  .monthly-callout { grid-template-columns: 1fr; }
}

/* Section header left-aligned variant + tight variant + CTA helper */
.section-header--left {
  text-align: left;
  max-width: 1208px;
  margin: 0 auto var(--spacing-lg);
  padding: 0 var(--gutter);
}
.section-header--left .gradient-text { display: inline; }
.section-header--tight { margin-bottom: var(--spacing-md); }
.section-header__cta {
  margin-top: var(--spacing-md);
}

/* ----- Quote + people cutout row (per Figma) ---------------------------- */
/* People cutout (transparent PNG) on the left, gradient-bordered pull-quote
   on the right. */
.conference-quote-row {
  max-width: 1208px;
  margin: 0 auto 0;          /* no bottom gap — cutout sits flush on the grey band below */
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: minmax(0, 580px) 1fr;
  gap: var(--spacing-2xl);
  align-items: end;
}
.conference-quote-row__cutout {
  align-self: end;
}
.conference-quote-row__cutout img {
  width: 100%;
  height: auto;
  display: block;            /* block kills the inline baseline gap so feet sit flush */
}
/* The quote block is already a standalone component; let it fill its column
   and sit centered vertically against the cutout. */
.conference-quote-row .conf-quote-block {
  margin: 0;
  align-self: center;
  padding-bottom: var(--spacing-2xl);   /* keep the quote off the grey seam */
}

@media (max-width: 900px) {
  .conference-quote-row {
    grid-template-columns: 1fr;
    gap: var(--spacing-lg);
    justify-items: center;
  }
  .conference-quote-row__cutout {
    max-width: 440px;
  }
  .conference-quote-row .conf-quote-block { padding-bottom: 0; }
}

/* ----- Bottom grey band (per Figma) ------------------------------------- */
/* Full-bleed grey-100 behind "What Happens at a CCL Conference?" through the
   Virtual Conferences section. Inner sections keep their own centering.
   No top margin so the people cutout above stands flush on its top edge. */
.conference-grey {
  background: var(--grey-100);
  padding: var(--spacing-3xl) 0 var(--spacing-4xl);
  margin-top: 0;
}

/* =========================================================================
   WATCH OUR INFO SESSION — page-specific patterns
   ========================================================================= */

/* ----- Hero ------------------------------------------------------------- */
.info-session-hero {
  max-width: 1024px;
  margin: var(--spacing-2xl) auto var(--spacing-3xl);
  padding: 0 var(--gutter);
  text-align: center;
}
.info-session-hero .display {
  margin: 0 auto var(--spacing-md);
  max-width: 920px;
}
.info-session-hero__subhead {
  color: var(--grey-600);
  margin: 0 0 var(--spacing-xl);
}
.info-session-hero__lede {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
  text-align: left;
}
.info-session-callout {
  background: var(--ccl-blue-bg);
  border-radius: var(--radius-xs);
  padding: var(--spacing-xl) var(--spacing-2xl);
  margin-top: var(--spacing-xl);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--spacing-md);
}
.info-session-callout__title {
  font-family: var(--font-display);
  font-size: 24px;
  line-height: 1.3;
  letter-spacing: -0.36px;
  color: var(--ccl-black);
  margin: 0;
}
.info-session-callout__alt {
  margin: 0;
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
}

/* ----- "What you will learn" + "Presenters" split ----------------------- */
.info-session-split {
  max-width: 1208px;
  margin: 0 auto var(--spacing-3xl);
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: var(--spacing-3xl);
  position: relative;
}
/* Vertical divider between the two columns (Figma cue) */
.info-session-split::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: calc((100% - var(--spacing-3xl)) * 2 / 3);
  width: 1px;
  background: var(--grey-200);
}
.info-session-learn h2 { margin: 0 0 var(--spacing-lg); }
.info-session-learn__list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
}
.info-session-learn__list > li {
  display: grid;
  grid-template-columns: 32px 1fr;
  gap: var(--spacing-sm);
  align-items: start;
}
.info-session-learn__list > li.info-session-learn__intro {
  grid-template-columns: 1fr;
  padding-left: 36px;
  color: var(--ccl-black);
  font-family: var(--font-body);
  font-style: italic;
  font-size: 19px;
}
.info-session-learn__check {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--ccl-blue);
  color: #fff;
  font-weight: 700;
  margin-top: 2px;
}
.info-session-learn__list h3 { margin: 0 0 4px; }
.info-session-learn__list p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  margin: 0;
}

.info-session-presenter h2 { margin: 0 0 var(--spacing-md); }
/* Sidebar presenter — the vertical .person at a larger photo. Was a separate
   component with its own 178px photo and a bold-body role treatment. */
.info-session-presenter .person { --person-photo: 178px; }

@media (max-width: 900px) {
  .info-session-split { grid-template-columns: 1fr; }
  .info-session-split::before { display: none; }
}

/* ----- Register Now (grey-100 row, two columns) ------------------------- */
.register-row {
  background: var(--grey-100);
  padding: var(--spacing-3xl) 0;
  margin: var(--spacing-2xl) 0;
}
.register-row > .section-header-centered {
  margin-bottom: var(--spacing-2xl);
}
.register-row__inner {
  max-width: 1208px;
  margin: 0 auto;
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: minmax(0, 459px) 1fr;
  gap: var(--spacing-3xl);
  align-items: start;
}
.register-card {
  background: #fff;
  border: 1px solid var(--grey-200);
  border-radius: var(--radius-md);
  padding: var(--spacing-xl);
}
.register-card > h3 { margin: 0 0 var(--spacing-sm); }
.register-card__note {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.4;
  margin: 0 0 var(--spacing-md);
}
.register-card__form {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sm);
}
.register-card__field {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.register-card__field > span {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 15px;
}
.register-card__field > span em {
  color: var(--ccl-blue);
  font-style: normal;
}
.register-card__field input,
.register-card__field select {
  font-family: var(--font-body);
  font-size: 15px;
  padding: 8px 10px;
  border: 1px solid var(--grey-200);
  border-radius: var(--radius-xs);
  background: #fff;
}
.register-card__check {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 15px;
}
.register-card__captcha-note {
  font-family: var(--font-body);
  font-size: 13px;
  color: var(--grey-600);
  margin: var(--spacing-sm) 0;
}
.register-card .btn { align-self: flex-start; }

.register-alternatives h3 { margin: 0 0 var(--spacing-sm); }
.register-alternatives > p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  margin: 0 0 var(--spacing-lg);
}
.register-alt-card {
  margin-bottom: var(--spacing-lg);
}
.register-alt-card h4 { margin: 0 0 var(--spacing-xs); }
.register-alt-card p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  margin: 0 0 var(--spacing-xs);
}
.register-alt-card__video {
  margin-top: var(--spacing-sm);
  border-radius: var(--radius-md);
  overflow: hidden;
  aspect-ratio: 16 / 9;
}
.register-alt-card__video .lite-yt {
  position: relative;
  width: 100%;
  height: 100%;
}
.register-alt-card__video img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* .link-blue retired 2026-08-12 — a third link treatment (700 + blue-dark +
   underline) that matched neither the prose link nor the card CTA link. Its two
   uses split correctly between the two: a sentence link became prose, and
   "Start Training >" became .read-more, which supplies its own arrow. */

@media (max-width: 900px) {
  /* minmax(0, …): a bare 1fr's auto minimum inherits the injected
     FormAssembly form's min-content (its .actions row won't shrink below
     ~316px), which widens the track past a phone viewport and hands the
     whole page a horizontal scrollbar. */
  .register-row__inner { grid-template-columns: minmax(0, 1fr); }
}

/* ----- FAQ 2x2 grid ----------------------------------------------------- */
.info-session-faq {
  max-width: 1208px;
  margin: 0 auto var(--spacing-3xl);
  padding: 0 var(--gutter);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-xl) var(--spacing-3xl);
}
.info-session-faq__item h3 { margin: 0 0 var(--spacing-xs); }
.info-session-faq__item p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  margin: 0;
}

@media (max-width: 900px) {
  .info-session-faq { grid-template-columns: 1fr; }
}

/* FAQ accordion wrapper — holds the shared .bills-card / .bill-row accordion
   (same component as the Our Impact bills and the Virginia page FAQ). */
/* Owns its top spacing: with none, it butts against whatever precedes it
   unless the author remembers a divider. */
.faq-accordion { padding: var(--spacing-4xl) var(--page-gutter) var(--spacing-6xl); }


/* ==========================================================================
   Join a Local Chapter (join-chapter.html)
   ========================================================================== */

/* ---- Hero: heading + join form ---- */
.join-local-hero {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-5xl);
  align-items: center;
  padding: var(--spacing-5xl) var(--page-gutter);
}
.join-local-hero__copy { max-width: 520px; }
.join-local-hero__copy .eyebrow-blue { margin-bottom: var(--spacing-sm); }
.join-local-hero__lede {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: var(--ccl-black);
  margin: var(--spacing-lg) 0 0;
}
.join-local-hero__cta { margin-top: var(--spacing-xl); }
/* Offset the fixed-ish gap so the in-page jump to the finder isn't cramped. */
#chapter-finder { scroll-margin-top: var(--spacing-xl); }
.join-local-hero__copy .display { margin: 0 0 var(--spacing-md); }
/* This hero also carried its own .hdr-underline copy (a third set of values,
   16px/0.16em). Removed — the shared utility governs. */
.join-local-hero__sub {
  font-family: var(--font-body);
  font-size: 20px;
  line-height: var(--spacing-xl);
  color: var(--grey-500);
  margin: 0;
}

/* FormAssembly mount / placeholder card */
.join-local-hero__form { justify-self: end; width: 100%; max-width: 590px; position: relative; }
/* Blue offset slot peeking out behind the white form card (same pattern as
   .hero-t1__media::before). */
.join-local-hero__form::before {
  content: '';
  position: absolute;
  inset: -18px -28px -18px 32px;
  background: var(--ccl-blue);
  border-radius: var(--radius-lg);
  z-index: 0;
}
.join-local-hero__form .fa-form-hold { position: relative; z-index: 1; }
.fa-form-hold {
  min-height: 520px;
  border-radius: var(--radius-lg);
  background: var(--ccl-blue);
  background-image: linear-gradient(160deg, var(--c-dec-2), var(--c-dec-1));
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 8px 24px rgba(21, 82, 123, 0.18);
}
.fa-form-hold__note {
  color: rgba(255, 255, 255, 0.85);
  font-family: var(--font-ui);
  font-size: var(--fs-small);
  letter-spacing: 0.02em;
}
/* Once FormAssembly injects the real form, drop the placeholder framing. */
.fa-form-hold.wForm,
.fa-form-hold:has(form) {
  background: var(--grey-0);
  background-image: none;
  padding: var(--spacing-xl);
  align-items: stretch;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}
/* Hide the loading note once the real form is present. */
.fa-form-hold.wForm .fa-form-hold__note,
.fa-form-hold:has(form) .fa-form-hold__note { display: none; }

/* Inline variant — the form already sits inside a framed card (e.g. the
   info-session register card), so the placeholder stays light and the
   loaded form unwraps with no extra card-in-a-card framing. */
.fa-form-hold--inline {
  min-height: 360px;
  border-radius: var(--radius-md);
  background: var(--grey-100);
  background-image: none;
  box-shadow: none;
}
.fa-form-hold--inline .fa-form-hold__note { color: var(--grey-400); }
.fa-form-hold--inline.wForm,
.fa-form-hold--inline:has(form) {
  min-height: 0;
  background: transparent;
  padding: 0;
  box-shadow: none;
}

/* Brand-styled mock join form (sits inside the white .fa-form-hold card) */
.fa-form-hold > .join-mock-form { width: 100%; }
.join-mock-form {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
}
.join-mock-form__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-md);
  border: 0;
  margin: 0;
  padding: 0;
  min-width: 0;
}
.join-mock-form__field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.join-mock-form__label {
  font-family: var(--font-body);
  font-weight: var(--fw-strong-body);
  font-size: 15px;
  color: var(--ccl-black);
}
.join-mock-form__label em { color: var(--ccl-blue); font-style: normal; }
.join-mock-form__field input,
.join-mock-form__field select {
  font-family: var(--font-body);
  font-size: 16px;
  padding: 11px 12px;
  border: 1px solid var(--grey-300);
  border-radius: var(--radius-xs);
  background: var(--grey-0);
  color: var(--ccl-black);
  width: 100%;
}
.join-mock-form__field input:focus,
.join-mock-form__field select:focus {
  outline: none;
  border-color: var(--ccl-blue);
  box-shadow: 0 0 0 3px rgba(0, 129, 199, 0.18);
}
.join-mock-form__check {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1.4;
  color: var(--ccl-black);
}
.join-mock-form__check input { margin-top: 3px; flex: none; }
.join-mock-form__benefits {
  background: var(--ccl-blue-bg);
  border-radius: var(--radius-xs);
  padding: var(--spacing-md) var(--spacing-lg);
}
.join-mock-form__benefits-title {
  font-family: var(--font-body);
  font-weight: var(--fw-strong-body);
  font-size: 15px;
  color: var(--ccl-black);
  margin: 0 0 4px;
}
.join-mock-form__benefits ul { margin: 0; padding-left: var(--spacing-lg); }
.join-mock-form__benefits li {
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1.5;
  color: var(--grey-600);
}
.join-mock-form .btn { align-self: flex-start; margin-top: var(--spacing-xs); }
.join-mock-form__terms {
  font-family: var(--font-body);
  font-size: 13px;
  line-height: 1.5;
  color: var(--grey-500);
  margin: 0;
}
.join-mock-form__terms a { color: var(--ccl-blue); }
.join-mock-form__note { font-family: var(--font-body); font-size: 13px; color: var(--grey-400); margin: 0; }

/* ---- Chapter finder: stat + search + map ---- */
.chapter-finder { background: var(--grey-100); padding: var(--spacing-6xl) var(--page-gutter); }
.chapter-finder__inner { max-width: 1140px; margin: 0 auto; }
.chapter-finder__stat { text-align: center; margin: 0 0 var(--spacing-2xl); }
.chapter-finder__stat-n {
  display: block;
  font-family: var(--font-hand);
  font-weight: 400;
  font-size: 68px;
  line-height: 1;
  letter-spacing: -1px;
  color: var(--ccl-blue);
}
.chapter-finder__stat-l {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 20px;
  line-height: 28px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--grey-400);
  margin-top: var(--spacing-sm);
}
.chapter-finder .section-header-centered { margin-bottom: var(--spacing-lg); }

.chapter-search {
  display: flex;
  gap: var(--spacing-sm);
  justify-content: center;
  max-width: 720px;
  margin: 0 auto var(--spacing-xl);
}
.chapter-search__field { position: relative; flex: 1; max-width: 480px; }
.chapter-search__icon {
  position: absolute;
  left: 16px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--grey-400);
  pointer-events: none;
}
.chapter-search__field input {
  width: 100%;
  height: 48px;
  padding: 0 16px 0 42px;
  border: 1px solid var(--grey-300);
  border-radius: var(--radius-xs);
  font-family: var(--font-body);
  font-size: var(--text-md);
  color: var(--ccl-black);
  background: var(--grey-0);
}
.chapter-search__field input:focus {
  outline: none;
  border-color: var(--ccl-blue);
  box-shadow: 0 0 0 3px rgba(0, 129, 199, 0.18);
}

.chapter-finder__or {
  text-align: center;
  font-family: var(--font-display);
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
}

/* ---- Interactive US map ---- */
.us-map-wrap { position: relative; max-width: 880px; margin: 0 auto; }
.us-map svg { display: block; width: 100%; height: auto; }
.us-map__state { cursor: pointer; transition: filter .12s ease, stroke .12s ease; }
.us-map__state:hover,
.us-map__state:focus-visible {
  filter: brightness(0.9);
  stroke: var(--brand-darkest);
  stroke-width: 1.5;
  outline: none;
}
.us-map__state.is-selected {
  stroke: var(--ccl-blue-dark);
  stroke-width: 2.5;
  paint-order: stroke;
  filter: brightness(0.95);
}
.us-map__tooltip {
  position: absolute;
  transform: translate(-50%, -135%);
  background: var(--brand-darkest);
  color: #fff;
  padding: 4px 10px;
  border-radius: 6px;
  font-family: var(--font-ui);
  font-weight: 500;
  font-size: 14px;
  line-height: 1.2;
  white-space: nowrap;
  pointer-events: none;
  z-index: 5;
}
.us-map__selected {
  text-align: center;
  font-family: var(--font-body);
  font-size: var(--fs-small);
  color: var(--ccl-blue-dark);
  min-height: 1.4em;
  margin: var(--spacing-sm) 0 0;
}

.us-map-legend {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-md);
  margin: var(--spacing-lg) 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-small);
  color: var(--grey-500);
}
.us-map-legend__label { font-weight: var(--fw-strong-body); color: var(--ccl-black); }
.us-map-legend__item { display: inline-flex; align-items: center; gap: var(--spacing-2xs); }
.us-map-legend__swatch {
  width: 18px;
  height: 18px;
  border-radius: 4px;
  border: 1px solid rgba(0, 0, 0, 0.12);
}

/* ---- What do CCL volunteers do? (Volunteer overview) --------------------
   The section sits between two .divider-thick rules, so its own padding is
   the whole gap — and the two shared children it hosts each bring outer
   margin of their own: .section-header-centered adds 48px on top and
   .activity-grid 80px underneath. Stacked on a 96px wrapper that read as
   144px above the heading and 176px below the cards, roughly triple the
   48-64px rhythm the rest of the page keeps. Zeroing the children's outer
   margins here (they're the section's first and last elements — that margin
   is the wrapper's job) and dropping the wrapper to 64px puts both seams at
   an even 64. General shape: a section wrapper's padding double-counts with
   any component that owns its own outer margin. */
.chapter-activities { padding: var(--spacing-4xl) var(--page-gutter); }
.chapter-activities .section-header-centered { margin-top: 0; margin-bottom: var(--spacing-2xl); }
.chapter-activities .activity-grid { margin-bottom: 0; }
/* .chapter-activities__grid / .chapter-activity retired — a photo+caption card
   that described the same five activities as .activity-card on What We Do, in
   less detail and with no way to read further. The section now uses
   .activity-grid / .activity-card directly, so the pages can't drift and the
   copy is maintained once. The wrapper above stays for section padding. */

/* ---- Seam between the group-action video and the group leaders ----------
   A white-on-white seam, so it takes a .divider-thick — and both sides
   arrive carrying their own margin (80px under the video, 48px above the
   next header), which would hang the rule off-centre at 80/48. Same rule as
   the .chapter-activities note above: once something sits at the seam, the
   gap is the seam's to own, so both sides are normalised to 64. The :has()
   scopes this to the video that actually has a divider after it. */
.group-action-video:has(+ .divider-thick) { margin-bottom: var(--spacing-4xl); }
.divider-thick + .group-leaders .section-header-centered { margin-top: var(--spacing-4xl); }

/* ---- Group leaders ---- */
.group-leaders { padding: 0 var(--page-gutter) var(--spacing-6xl); }
.group-leaders .section-header-centered { margin-bottom: var(--spacing-2xl); }
.leader-quote {
  max-width: 1040px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 221px 1fr;
  gap: var(--spacing-2xl);
  align-items: center;
}
.leader-quote__photo {
  width: 221px;
  height: 221px;
  border-radius: var(--radius-md);
  overflow: hidden;
}
.leader-quote__photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Standard pull-quote fills its column instead of self-centering at 750px. */
.leader-quote .conf-quote-block { margin: 0; max-width: none; }
.leader-quote__dots {
  display: flex;
  justify-content: center;
  gap: var(--spacing-xs);
  margin: var(--spacing-xl) 0 0;
}
.leader-quote__dots span {
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--grey-300);
}
.leader-quote__dots span.is-active { background: var(--ccl-green); }

/* .chapter-cta retired — a page-local green CTA band on join-chapter.html that
   did the same job as the shared navy .join-cta every other page closes with.
   The page now uses .join-cta; there is one closing-CTA treatment site-wide. */

/* ---- Responsive ---- */
@media (max-width: 900px) {
  .join-local-hero { grid-template-columns: 1fr; gap: var(--spacing-2xl); }
  .join-local-hero__form { justify-self: stretch; max-width: none; }
  .join-local-hero__form::before { inset: -12px 0 -12px 16px; }
  .fa-form-hold { min-height: 420px; }
  .chapter-search { flex-direction: column; align-items: stretch; }
  .chapter-search__field { max-width: none; }
  .leader-quote { grid-template-columns: 1fr; justify-items: center; gap: var(--spacing-lg); }
}

/* ==========================================================================
   JOIN AN ACTION TEAM (join-action-team.html) — Figma 2470:3230
   Hub page for the Join section. Reuses .hero-t1, .story-card, buttons and
   eyebrows; only the page-specific layout lives here. Namespace: .jat-*
   ========================================================================== */

/* Hand-drawn arrow in the hero's negative space, pointing the eye down to
   the team cards. Decorative — hidden once the hero stacks to one column. */
.jat-hero-arrow {
  width: 120px;
  height: auto;
  margin: var(--spacing-md) 0 0 var(--spacing-4xl);
  transform: rotate(80deg);
}

/* ---- Team cards ("CCLers like you") ---- */
.jat-teams { padding: var(--spacing-2xl) var(--page-gutter) var(--spacing-4xl); }
.jat-teams__inner { max-width: 1192px; margin: 0 auto; }
.jat-teams__header { max-width: 100%; margin-bottom: var(--spacing-2xl); }
.jat-teams__header .eyebrow-green { margin-bottom: var(--spacing-sm); }
.jat-teams__header .body-lead { margin: var(--spacing-md) 0 0; }
.jat-team-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-lg);
}
/* Cards use the .story-card chrome but aren't whole-card links — the
   design's click target is the "Join this team" button. */
.jat-team-card h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
}
.jat-team-card .story-card__body { flex: 1; }
/* Bottom-align the buttons across cards of unequal copy length. */
.jat-team-card .btn { align-self: flex-start; margin-top: auto; }

/* ---- Interest teams panel ("Connect over common interests") ---- */
.jat-interests { padding: 0 var(--page-gutter) var(--spacing-4xl); }
.jat-interests__inner {
  max-width: 1192px;
  margin: 0 auto;
  background: #fff;
  border: 1px solid rgba(0,0,0,0.10);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-card);
  padding: var(--spacing-2xl);
  display: grid;
  grid-template-columns: 1fr auto max-content;
  gap: var(--spacing-2xl);
}
.jat-interests__copy h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-md);
}
.jat-interests__list {
  columns: 2;
  column-gap: var(--spacing-2xl);
  margin: 0;
  padding-left: var(--spacing-lg);
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  max-width: 560px;
}
.jat-interests__list li { break-inside: avoid; }
.jat-interests__divider { width: 1px; background: rgba(0,0,0,0.10); }
.jat-interests__aside {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-lg);
  justify-content: center;
  max-width: 220px;
}
.jat-interests__aside .btn { align-self: flex-start; }
.jat-interests__aside p { margin: 0; }

/* ---- Local-chapters callout ---- */
.jat-local { padding: 0 var(--page-gutter) var(--spacing-6xl); }
.jat-local__inner {
  max-width: 1192px;
  margin: 0 auto;
  background: var(--brand-lightest);
  border: 1px solid var(--ccl-green);
  border-radius: var(--radius-md);
  padding: var(--spacing-2xl) var(--spacing-3xl);
  display: grid;
  grid-template-columns: 280px 1fr;
  gap: var(--spacing-3xl);
  align-items: center;
}
.jat-local__map img { display: block; width: 100%; height: auto; }
.jat-local__copy .body-lead { margin: var(--spacing-sm) 0 var(--spacing-lg); }

/* ---- Responsive ---- */
@media (max-width: 900px) {
  .jat-hero-arrow { display: none; }
  .jat-team-grid { grid-template-columns: 1fr; }
  .jat-interests__inner { grid-template-columns: 1fr; }
  .jat-interests__divider { width: auto; height: 1px; }
  .jat-interests__aside { max-width: none; }
  .jat-local__inner { grid-template-columns: 1fr; }
  .jat-local__map { max-width: 320px; }
}
@media (max-width: 560px) {
  .jat-interests__list { columns: 1; }
}

/* ==========================================================================
   GIVE (give.html) — donate landing rebuilt from citizensclimatelobby.org/donate.
   Reuses the join-chapter split-hero pattern, .tabs, .ccl-stats, .story-card
   and .section-header-centered; only the donate widget and the page-specific
   grids live here. Namespace: .give-*
   (This comment used to claim .chapter-cta too — it never did use it, and
   .chapter-cta has since been retired in favour of the shared .join-cta.)
   ========================================================================== */

/* ---- Hero: T2 flagship (full-bleed photo + white card), per the hero
   system — reserved for marquee pages, and Donate is one. ---- */

/* Fluid T2 modifier — the Give card carries the full hero copy, so it's
   taller than the base 16/7.7 photo crop. Here the section grows with the
   card: the card returns to normal flow and the photo stretches behind it
   as a cover background (same approach as the live donate template). */
.hero-t2--fluid .hero-t2__photo {
  position: absolute;
  top: var(--spacing-3xl);
  bottom: var(--spacing-5xl);
  left: var(--page-gutter);
  right: var(--page-gutter);
  width: auto;
  aspect-ratio: auto;
}
.hero-t2--fluid .hero-t2__card {
  position: relative;
  top: auto;
  left: auto;
  transform: none;
  /* extra bottom margin keeps the card clear of the press strip overlay */
  margin: var(--spacing-4xl) 0 calc(var(--spacing-4xl) + 84px) var(--spacing-5xl);
}
@media (max-width: 700px) {
  .hero-t2--fluid .hero-t2__card { margin-left: 0; margin-right: 0; }
}

/* Widget-in-card flagship variant (give-v5): the T2 card holds the title
   and the live donation grid. Wider rails for the grid, headline drops to
   h1 scale so the card doesn't tower, and the grid keeps skeleton height
   while the Studio SDK loads. */
.hero-t2__card--widget { max-width: 600px; width: 100%; }
/* tighter frame than the base fluid card (Alaina: 3xl all around) */
.hero-t2--fluid .hero-t2__card--widget { margin: var(--spacing-3xl) 0 var(--spacing-3xl) var(--spacing-3xl); }
/* with only 3xl below the card, the photo needs extra depth so the
   "As featured in" strip clears the card's bottom edge */
.hero-t2--tight { padding-bottom: calc(var(--spacing-5xl) + var(--spacing-3xl) + var(--spacing-md)); }
/* Hero flows straight into the stats hook — collapse the stacked hero
   margin + stats margin/padding (~160px) to the page's standard 48px beat. */
.hero-t2--tight { margin-bottom: 0; }
.hero-t2--tight + .ccl-stats { margin-top: 0; padding-top: var(--spacing-3xl); }
.hero-t2__card--widget h1 {
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
}
.hero-t2__card--widget .classy-inline-embed { min-height: 480px; margin-top: var(--spacing-sm); }
.hero-t2__card--widget .give-hero-b__trust { margin-top: var(--spacing-lg); }
/* fine print reads as fine print */
.hero-t2__card--widget .give-hero__tax {
  margin: var(--spacing-md) 0 0;
  font-size: var(--fs-tiny);
  line-height: var(--lh-tiny);
}


/* Donate section under the hero: centered lede + widget card with the blue
   offset slot (same chrome as the join form card). The card is the GoFundMe
   Pro mount; the mock widget inside is swapped out when the real embed goes
   live. */
/* ---- Pattern-B split hero (give-v2.html) — St. Jude pattern from the
   donate-page audit: form column left, full-height photo bleeding to the
   right viewport edge, caption chip, trust seals under the form. ---- */
.give-hero-b {
  display: grid;
  grid-template-columns: minmax(460px, 46%) 1fr;
  min-height: 760px;
}
.give-hero-b__form {
  align-self: center;
  justify-self: end;
  width: 100%;
  max-width: 620px;
  padding: var(--spacing-3xl) var(--spacing-3xl) var(--spacing-3xl) var(--gutter);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-lg);
}
.give-hero-b__form .eyebrow-blue { margin: 0; }
.give-hero-b__form h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
  margin: 0;
}
.give-hero-b__embed .classy-inline-embed {
  border-radius: var(--radius-md);
  overflow: hidden;
  min-height: 480px;
  background: var(--grey-0);
  box-shadow: var(--shadow-card);
  border: 1px solid rgba(0,0,0,0.10);
}
/* Trust block under the form (St. Jude's "give with confidence" move) */
.give-hero-b__trust {
  display: flex;
  align-items: center;
  gap: var(--spacing-md);
  flex-wrap: wrap;
}
.give-hero-b__trust img { display: block; height: 44px; width: auto; }
.give-hero-b__trust p {
  flex: 1;
  min-width: 200px;
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  line-height: var(--lh-tiny);
  color: var(--grey-500);
  margin: 0;
}

/* Band variant of the press strip (give-v3/v4: navy full-width band below
   the hero). Doubled class beats the base .give-press overlay rules that
   appear later in this section regardless of source order. */
.give-press.give-press--band {
  position: static;
  background: var(--gradient-dark-blue);
  border-radius: 0;
  padding: var(--spacing-xl) var(--page-gutter);
}
.give-press.give-press--band .give-press__row { justify-content: center; }

/* "As featured in" — rides the TOP of the photo column (the sky band) on a
   downward scrim, so the logos sit in the first viewport; the hero's bottom
   edge is form-height-driven and lands below the fold. Logos run smaller
   than the give.html band so six fit the half-width column. */
.give-hero-b__press {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  padding: var(--spacing-md) var(--spacing-lg) var(--spacing-2xl);
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
  text-align: center;
}
.give-hero-b__press .give-press__row {
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--spacing-sm) var(--spacing-md);
}
/* max-width: none breaks the global img max-width:100% circularity that
   collapses the wrapped flex items to zero width */
.give-hero-b__press .give-press__row img { height: 18px; max-width: none; }
.give-hero-b__form .give-hero__tax { margin: 0; }
/* Photo column — full-bleed to the right edge, caption chip bottom-right */
.give-hero-b__media { position: relative; min-height: 320px; }
/* direct child only — the overlays (press logos, caption) nest their own imgs */
.give-hero-b__media > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.give-hero-b__caption {
  position: absolute;
  right: 0;
  bottom: 0;
  margin: 0;
  background: rgba(0, 0, 0, 0.6);
  color: #fff;
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  line-height: 1.4;
  padding: var(--spacing-2xs) var(--spacing-md);
  border-top-left-radius: var(--radius-sm);
}
@media (max-width: 980px) {
  .give-hero-b { grid-template-columns: 1fr; min-height: 0; }
  /* photo becomes a banner above the form so the page still opens on imagery */
  .give-hero-b__media { order: -1; min-height: 240px; }
  .give-hero-b__form { justify-self: stretch; max-width: none; padding: var(--spacing-2xl) var(--page-gutter); }
}

/* Stats hook heading (v2) — the lede's hook doubles as the stats section
   heading (replaced the label-y "The impact of giving"). Gradient on the
   org name per the voice rule (gradient-text = brand voice on named
   things). Statement scale, not h1-bold: two sentences need 32px. */
.give-stats-hook {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
}

/* 2×2 icon stat grid (v2) — the live page's arrangement: green icon chip,
   numeral, label reading as one row. Numerals at the 56px hybrid scale
   (impact-page precedent) instead of the 4-up band's 88px, so four stats
   breathe instead of colliding. */
.give-stat-grid {
  max-width: 960px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--spacing-2xl) var(--spacing-4xl);
}
.give-stat {
  display: flex;
  align-items: center;
  gap: var(--spacing-md);
  text-align: left;
}
/* The icon PNGs ship with their own green circle baked in — no CSS chip. */
.give-stat__icon {
  flex: none;
  width: 56px;
  height: 56px;
}
.give-stat__icon img { width: 100%; height: 100%; object-fit: contain; }
.give-stat .ccl-stat-n { font-size: 56px; }
.give-stat .ccl-stat-n-shadow { left: 3px; top: 3px; }
.give-stat__label {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 18px;
  line-height: 1.35;
  color: var(--ccl-black);
}
@media (max-width: 760px) {
  .give-stat-grid { grid-template-columns: 1fr; max-width: 420px; gap: var(--spacing-lg); }
  .give-stat .ccl-stat-n { font-size: 44px; }
}

/* v2 rhythm: the shared .ccl-stats component brings its own bottom margin,
   which made the gap above the first divider bigger than the others. */
#why-ccl.ccl-stats { margin-bottom: 0; }

/* Hope-line kicker closing the stats section (v2) */
.give-stats-kicker {
  max-width: 720px;
  margin: var(--spacing-2xl) auto 0;
  text-align: center;
}
.give-stats-kicker p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}

/* Grey band grouping the giving widget + ways-to-give + legal note,
   mirroring the live page's #f5f4f3 closing section */
.give-bottom { background: var(--grey-100); padding-top: var(--spacing-4xl); }

/* --------------------------------------------------------------------------
   WAYS TO GIVE (ways-to-give.html) — Figma 1532:5405/5518/5549/5580.
   "Types of support" tabbed panel: four donor-type tabs on a grey panel;
   Individual Donors carries the Studio grid + the seven channel cards
   (reusing .give-way). Namespace: .wtg-*
   -------------------------------------------------------------------------- */
.wtg-panel-wrap { padding: 0 var(--page-gutter) var(--spacing-5xl); }
.wtg-panel {
  max-width: 1246px;
  margin: 0 auto;
  background: var(--grey-100);
  border-radius: var(--radius-md);
  padding: var(--spacing-xl) var(--spacing-xl) var(--spacing-2xl);
}
.wtg-panel .tabs { margin-bottom: var(--spacing-xl); }
.wtg-tabpanel[hidden] { display: none; }
.wtg-tabpanel h2 { margin: 0 0 var(--spacing-lg); }

/* Intro split: copy left, donation grid right (Individual Donors tab) */
.wtg-intro {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: var(--spacing-2xl);
  align-items: start;
  margin-bottom: var(--spacing-2xl);
}
.wtg-intro .classy-inline-embed {
  border-radius: var(--radius-md);
  overflow: hidden;
  min-height: 480px;
  background: var(--grey-0);
  box-shadow: var(--shadow-card);
  border: 1px solid rgba(0,0,0,0.10);
}
.wtg-copy p, .wtg-copy li {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
}
.wtg-copy p { margin: 0 0 var(--spacing-md); }
.wtg-copy ul { margin: 0 0 var(--spacing-md); padding-left: var(--spacing-lg); }
.wtg-copy > :last-child { margin-bottom: 0; }
.wtg-h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: var(--spacing-2xl) 0 var(--spacing-sm);
}
/* Channel cards reuse .give-way inside the panel; white-on-grey needs no
   border tweak. Grid mirrors .give-ways__grid but lives on the panel. */
.wtg-cards {
  list-style: none;
  margin: var(--spacing-lg) 0 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-lg);
}
/* Two-column funder list (Foundation Grants tab) */
.wtg-funders {
  columns: 2;
  column-gap: var(--spacing-3xl);
  max-width: 860px;
}
.wtg-funders li { break-inside: avoid; }
/* Corporate tab: copy | conference photo */
.wtg-split {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: var(--spacing-2xl);
  align-items: start;
}
.wtg-split__photo {
  width: 100%;
  border-radius: var(--radius-md);
  object-fit: cover;
  aspect-ratio: 3 / 2;
}
.wtg-download {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 19px;
  color: var(--ccl-blue-dark);
}
@media (max-width: 900px) {
  .wtg-intro, .wtg-split { grid-template-columns: 1fr; }
  .wtg-cards { grid-template-columns: 1fr; }
  .wtg-funders { columns: 1; }
  .wtg-panel { padding: var(--spacing-lg); }
}

/* Why Give to CCL (why-give.html) — Figma 1531:5252 (design in progress).
   Hero reuses .hero-t1 + lite-video; quote reuses .conf-quote-block; the
   unique-role cards reuse .give-story. Page-specific bits: gradient
   divider, stat callout, gradient CTA band, dev-team contact card. */
.divider-thick--gradient { background: var(--gradient-underline); }

/* Split: heading + copy | grey stat tile with offset-shadow numeral */
.wg-split {
  max-width: 1128px;
  margin: 0 auto;
  padding: var(--spacing-3xl) var(--page-gutter);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-3xl);
  align-items: center;
}
.wg-split h2 { margin: 0 0 var(--spacing-md); }
.wg-stat {
  background: var(--grey-100);
  border-radius: var(--radius-md);
  padding: var(--spacing-lg) var(--spacing-xl);
  display: flex;
  align-items: center;
  gap: var(--spacing-lg);
}
.wg-stat .ccl-stat-n { font-size: 78px; flex: none; }
.wg-stat p {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 20px;
  line-height: 1.4;
  color: var(--ccl-black);
  margin: 0;
}

/* Gradient CTA band */
.wg-cta { padding: 0 var(--page-gutter) var(--spacing-2xl); }
.wg-cta__inner {
  max-width: 1128px;
  margin: 0 auto;
  background: var(--gradient-light-blue);
  border-radius: var(--radius-md);
  text-align: center;
  padding: var(--spacing-2xl) var(--spacing-xl);
}
.wg-cta__inner h2 { color: var(--grey-0); margin: 0 0 var(--spacing-2xs); }
.wg-cta__inner p {
  font-family: var(--font-body);
  font-size: 19px;
  color: var(--grey-100);
  margin: 0 0 var(--spacing-lg);
}

/* Development-team contact callout — actionable, so it gets card chrome */
.wg-contact {
  max-width: 640px;
  margin: 0 auto;
  padding: 0 var(--page-gutter) var(--spacing-4xl);
}
.wg-contact__card {
  background: var(--grey-0);
  border: 1px solid rgba(0,0,0,0.10);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-card);
  padding: var(--spacing-xl);
  text-align: center;
}
.wg-contact__card h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  margin: 0 0 var(--spacing-sm);
}
.wg-contact__card p {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.6;
  margin: 0;
}

/* Quote wrapper — centers the canonical conf-quote-block */
.wg-quote { max-width: 900px; margin: 0 auto; padding: var(--spacing-2xl) var(--page-gutter) var(--spacing-3xl); }

@media (max-width: 900px) {
  .wg-split { grid-template-columns: 1fr; gap: var(--spacing-lg); }
  .wg-stat { flex-direction: column; text-align: center; gap: var(--spacing-md); }
}

/* Financial Transparency (financial-transparency.html) — reuses the
   .wtg-panel/.tabs pattern; page-specific bits only. Figma 2223:1609/1675. */
.ft-intro {
  max-width: 1246px;
  margin: 0 auto var(--spacing-2xl);
  padding: 0 var(--page-gutter);
  display: grid;
  grid-template-columns: 1.7fr 1fr;
  gap: var(--spacing-3xl);
  align-items: start;
}
.ft-intro img {
  width: 100%;
  border-radius: var(--radius-md);
  aspect-ratio: 3 / 2;
  object-fit: cover;
}
/* In-panel subheads (Accountability / Funding / Budget / Financial documents) */
.wtg-subhead {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  color: var(--ccl-black);
  margin: var(--spacing-xl) 0 var(--spacing-sm);
}
/* Year-grouped document lists */
.ft-doc-group { margin: 0 0 var(--spacing-md); }
.ft-doc-group h4 {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 19px;
  line-height: 1.5;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-2xs);
}
.ft-doc-group ul { margin: 0; padding-left: var(--spacing-lg); }
@media (max-width: 900px) {
  .ft-intro { grid-template-columns: 1fr; gap: var(--spacing-lg); }
}

.give-donate {
  max-width: 1100px;
  margin: 0 auto;
  padding: 0 var(--gutter) var(--spacing-4xl);
}
.give-donate__cols {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  gap: var(--spacing-3xl);
  align-items: center;
}
.give-donate__aside img { display: block; width: 100%; height: auto; border-radius: var(--radius-md); }
.give-hero__widget { position: relative; }
/* The Classy iframe paints its own white panel; give it a rounded clip so
   it sits on the blue offset like our own cards. */
.give-hero__widget .classy-inline-embed {
  position: relative;
  z-index: 1;
  border-radius: var(--radius-lg);
  overflow: hidden;
  min-height: 480px;
  background: var(--grey-0);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}
.give-hero__widget::before {
  content: '';
  position: absolute;
  inset: -18px -28px -18px 32px;
  background: var(--ccl-blue);
  border-radius: var(--radius-lg);
  z-index: 0;
}
#donate, #why-ccl, #ways-to-give, #financial-transparency { scroll-margin-top: var(--spacing-xl); }

.give-hero__tax {
  font-family: var(--font-body);
  font-size: var(--fs-small);
  line-height: 1.5;
  color: var(--grey-500);
  margin: var(--spacing-lg) 0 0;
}

/* ---- Press strip — overlays the bottom edge of the hero photo on a dark
   scrim, like the live page's hero-bottom "As seen in" band. The outlet
   logos are all white art, so they need the dark surface. ---- */
.give-press {
  position: absolute;
  left: var(--page-gutter);
  right: var(--page-gutter);
  bottom: var(--spacing-5xl);
  padding: var(--spacing-2xl) var(--spacing-lg) var(--spacing-lg);
  background: linear-gradient(to top, rgba(0, 0, 0, 0.72), rgba(0, 0, 0, 0));
  border-radius: 0 0 var(--radius-md) var(--radius-md);
  text-align: center;
}
.give-press__label {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-tiny);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.85);
  margin: 0 0 var(--spacing-md);
}
.give-press__row {
  list-style: none;
  margin: 0 auto;
  padding: 0;
  max-width: 1100px;
  display: flex;
  justify-content: center;
  align-items: center;
  gap: var(--spacing-md) var(--spacing-2xl);
  /* narrow screens: keep one row and let it scroll, like the live swiper */
  overflow-x: auto;
  scrollbar-width: none;
}
.give-press__row::-webkit-scrollbar { display: none; }
.give-press__row li { flex: none; }
.give-press__row img { display: block; height: 26px; width: auto; }
@media (max-width: 900px) {
  .give-press__row { justify-content: flex-start; }
}

/* ---- "How we're making change" icon trio ---- */
.give-how { padding: 0 var(--page-gutter) var(--spacing-4xl); }
.give-how__grid {
  list-style: none;
  max-width: 1100px;
  margin: 0 auto;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-2xl);
}
/* Shared editorial photo item — used by BOTH the "How are we making
   change?" and "What does your gift make possible?" grids so the two
   3-ups read as one system component. Card chrome (.give-way) is reserved
   for actionable items with links. */
.give-story { display: flex; flex-direction: column; gap: var(--spacing-md); }
.give-story__photo {
  width: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  border-radius: var(--radius-md);
  display: block;
}
.give-story h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
  margin: 0;
}
.give-story p {
  font-family: var(--font-body);
  font-size: var(--fs-small);
  line-height: 1.55;
  color: var(--ccl-black);
  margin: 0;
}

/* ---- Transparency section: budget bar + watchdog badges. Sits on white —
   the tri-color bar and seals carry the section; a grey band here also
   competed with the closing .give-bottom band (and the live page keeps
   funding on white). ---- */
.give-money { padding: 0 var(--page-gutter) var(--spacing-4xl); }
.give-money__inner { max-width: 900px; margin: 0 auto; }
.give-money__bar {
  display: flex;
  height: 20px;
  border-radius: 999px;
  overflow: hidden;
  margin: var(--spacing-2xl) 0 var(--spacing-md);
}
/* Segment colors match the live donate page's funding chart:
   navy / blue / light blue (#3fb1ef has no token yet). */
.give-money__bar span:nth-child(1) { background: var(--ccl-blue-dark); }
.give-money__bar span:nth-child(2) { background: var(--ccl-blue); }
.give-money__bar span:nth-child(3) { background: #3fb1ef; }
.give-money__legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-sm) var(--spacing-xl);
  font-family: var(--font-body);
  font-size: var(--fs-small);
  color: var(--ccl-black);
}
.give-money__legend li { display: inline-flex; align-items: center; gap: var(--spacing-2xs); }
.give-money__legend b { font-weight: 700; }
.give-money__swatch { width: 12px; height: 12px; border-radius: 3px; display: inline-block; }
.give-money__note {
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  color: var(--grey-500);
  margin: var(--spacing-sm) 0 0;
}
/* Watchdog seals — the real badge art from the live site. */
.give-money__badges {
  list-style: none;
  margin: var(--spacing-2xl) 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-xl);
}
.give-money__badges img { display: block; width: 100px; height: auto; }

/* ---- "What your gift makes possible" cards + ways to give ---- */
.give-gift { padding: 0 var(--page-gutter) var(--spacing-4xl); }
.give-gift__grid,
.give-ways__grid {
  list-style: none;
  max-width: 1192px;
  margin: 0 auto;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-lg);
}
.give-gift__grid h3,
.give-ways__grid h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h4);
  line-height: var(--lh-h4);
  color: var(--ccl-black);
}
/* Gift grid mirrors the how grid exactly (same width/gap) — both hold
   .give-story items; the wider 1192px track stays with the ways cards. */
.give-gift__grid { max-width: 1100px; gap: var(--spacing-2xl); }
/* Intro line above the gift cards + centered CTA rows under card grids */
.give-gift__intro {
  text-align: center;
  max-width: 780px;
  margin: 0 auto var(--spacing-2xl);
}
.give-gift__cta,
.give-ways__cta { text-align: center; margin: var(--spacing-2xl) 0 0; }

/* Video section ("We can't solve climate change alone") — Vimeo from the
   live donate page. */
.give-video { padding: 0 var(--page-gutter) var(--spacing-4xl); }
.give-video__frame {
  max-width: 860px;
  margin: 0 auto;
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}
.give-video__frame iframe { display: block; width: 100%; height: 100%; border: 0; }
.give-video__cta { text-align: center; margin: var(--spacing-2xl) 0 0; }

.give-ways { padding: 0 var(--page-gutter) var(--spacing-3xl); }
.give-way {
  background: var(--grey-0);
  border: 1px solid rgba(0,0,0,0.10);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-card);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.give-way__image {
  aspect-ratio: 16 / 10;
  background: var(--grey-200);
  border-bottom: 1px solid rgba(0,0,0,0.06);
}
.give-way__image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.give-way__body {
  padding: var(--spacing-xl);
  display: flex;
  flex-direction: column;
  gap: var(--spacing-md);
  flex: 1;
}
.give-way h3 { margin: 0; }
.give-way p {
  font-family: var(--font-body);
  font-size: var(--fs-small);
  line-height: 1.55;
  color: var(--ccl-black);
  margin: 0;
}
.give-way .read-more { margin-top: auto; }
.give-tax-note {
  max-width: 720px;
  margin: 0 auto;
  padding: var(--spacing-lg) var(--gutter) var(--spacing-4xl);
  font-family: var(--font-body);
  font-size: var(--fs-small);
  line-height: 1.5;
  color: var(--grey-500);
  text-align: center;
}

/* ---- Responsive ---- */
@media (max-width: 900px) {
  .give-hero__widget::before { inset: -12px 0 -12px 16px; }
  .give-donate__cols { grid-template-columns: 1fr; gap: var(--spacing-2xl); }
  .give-donate__aside { max-width: 420px; margin: 0 auto; }
  .give-how__grid { grid-template-columns: 1fr; max-width: 560px; }
  .give-gift__grid, .give-ways__grid { grid-template-columns: 1fr; max-width: 560px; }
}

/* ==========================================================================
   Take Action patterns — reusable components for action / campaign pages,
   promoted from the take-action template. Pair with the .hero-t1 hero and
   its .hero-t1__media::before blue offset for the action-card slot.
   ========================================================================== */

/* Urgency strip — slim, time-sensitive banner above the header/hero. */
.urgency-strip { background: var(--c-dec-1); color: #fff; font-family: var(--font-body); font-size: 14px; }
.urgency-strip__inner {
  max-width: 1200px;
  margin: 0 auto;
  padding: 9px var(--gutter);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-sm);
  text-align: center;
}
.urgency-strip__tag {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  background: var(--util-alert-red);
  color: #fff;
  padding: 4px 9px;
  border-radius: var(--radius-xs);
  white-space: nowrap;
}
.urgency-strip span { color: rgba(255, 255, 255, 0.92); }

/* Action progress bar — an "X of goal" momentum signal in an action hero. */
.action-progress { margin: 0 0 var(--spacing-lg); }
.action-progress__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--spacing-md);
  margin-bottom: 9px;
}
.action-progress__count { font-family: var(--font-display); font-weight: 700; font-size: 18px; color: var(--grey-600); white-space: nowrap; }
.action-progress__count b { color: var(--ccl-green-dark); }
.action-progress__goal { font-size: 13.5px; color: var(--grey-400); letter-spacing: 0.02em; }
.action-progress__track { height: 12px; border-radius: var(--radius-pill); background: var(--grey-200); overflow: hidden; }
.action-progress__fill {
  height: 100%;
  width: 0;
  border-radius: var(--radius-pill);
  background: linear-gradient(90deg, var(--brand) 0%, var(--brand-medium) 100%);
  transition: width 1.1s cubic-bezier(.22, .61, .36, 1);
}

/* ==========================================================================
   BLOG ARTICLE — single-post template (blog-post.html).
   Reuses .eyebrow-blue, .callout-blue, the stamped .ccl-stat* numerals, and
   .subscribe-banner; adds the article-specific chrome below. The article is a
   centered ~720px reading measure; hero / stats / quotes / CTAs sit within it.
   ========================================================================== */
.article { max-width: 720px; margin: var(--spacing-2xl) auto var(--spacing-4xl); padding: 0 var(--container-pad); }
.article__title {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.01em;
  color: var(--ccl-black);
  margin: var(--spacing-sm) 0 var(--spacing-lg);
}

/* Byline — author avatar(s) + name + date·read-time + share */
.article-byline { display: flex; align-items: center; gap: var(--spacing-md); padding-bottom: var(--spacing-lg); border-bottom: 1px solid var(--grey-200); margin-bottom: var(--spacing-2xl); }
.article-byline__avatars { display: flex; flex: none; }
.article-byline__avatar {
  width: 44px; height: 44px; border-radius: var(--radius-pill);
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--font-display); font-weight: 700; font-size: var(--fs-tiny);
  color: #fff; border: 2px solid #fff;
}
.article-byline__avatar + .article-byline__avatar { margin-left: -14px; }
.article-byline__meta { flex: 1; min-width: 0; }
.article-byline__name { font-family: var(--font-body); font-weight: 700; font-size: var(--text-md); color: var(--ccl-black); margin: 0; }
.article-byline__detail { font-family: var(--font-body); font-size: var(--fs-tiny); color: var(--grey-500); margin: 2px 0 0; }
.article-byline__share { display: flex; gap: var(--spacing-md); color: var(--grey-400); flex: none; }
.article-byline__share a { color: inherit; display: inline-flex; }
.article-byline__share svg { width: 18px; height: 18px; }

/* Hero + inline figures (image + small italic caption) */
.article-figure { margin: 0 0 var(--spacing-2xl); }
.article-figure img { width: 100%; display: block; border-radius: var(--radius-md); background: var(--grey-200); }
.article-figure figcaption { font-family: var(--font-body); font-style: italic; font-size: var(--fs-tiny); line-height: var(--lh-tiny); color: var(--grey-500); margin-top: var(--spacing-sm); }

/* Body copy + section headings */
.article__body > p { font-family: var(--font-body); font-size: 19px; line-height: 1.5; letter-spacing: -0.285px; color: var(--ccl-black); margin: 0 0 var(--spacing-lg); }
.article__body h2 { font-family: var(--font-display); font-weight: var(--fw-strong-heading); font-size: var(--fs-h3); line-height: var(--lh-h3); color: var(--ccl-black); margin: var(--spacing-2xl) 0 var(--spacing-sm); }
.article__body > p a { color: var(--fg-link-strong); }
.article__body > p a:hover { border-bottom-color: var(--fg-link-strong); }

/* Pull quote — thin blue left rule, the line in Ubuntu, muted attribution */
.pull-quote { border-left: 3px solid var(--ccl-blue); padding-left: var(--spacing-lg); margin: var(--spacing-2xl) 0; }
.pull-quote p { font-family: var(--font-display); font-weight: var(--fw-weak); font-size: var(--fs-h3); line-height: var(--lh-h3); color: var(--ccl-black); margin: 0 0 var(--spacing-sm); }
.pull-quote cite { font-family: var(--font-body); font-style: normal; font-size: var(--fs-tiny); color: var(--grey-500); }

/* Stat block — the design system's stamped numerals (.ccl-stat*) inside a
   contained, tinted reading-width panel. Scaled down from the 88px hero size
   so multi-character values (Mar 16, $3.42) fit the article column. */
.ccl-stats--block { background: transparent; padding: 0; margin: var(--spacing-2xl) 0; max-width: none; }
.ccl-stats--block .ccl-section-inner { grid-template-columns: repeat(3, 1fr); gap: var(--spacing-md); max-width: none; }
.ccl-stats--block .ccl-stat {
  background: var(--grey-100);
  border-radius: var(--radius-md);
  padding: var(--spacing-lg);
  align-items: flex-start;   /* each stat in its own box, left-aligned */
  text-align: left;
  gap: var(--spacing-xs);
}
.ccl-stats--block .ccl-stat-n { font-size: 44px; white-space: nowrap; }
.ccl-stats--block .ccl-stat-n-shadow { left: 3px; top: 3px; }
.ccl-stats--block .ccl-stat-l { font-size: var(--fs-tiny); line-height: var(--lh-tiny); text-align: left; }
@media (max-width: 600px) { .ccl-stats--block .ccl-section-inner { grid-template-columns: 1fr; gap: var(--spacing-lg); } }

/* Inline CTA — a quiet, whole-block link: blue eyebrow + line + arrow */
.article-cta { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: var(--spacing-lg); background: var(--bg-info); border-radius: var(--radius-md); padding: var(--spacing-lg) var(--spacing-xl); margin: var(--spacing-2xl) 0; text-decoration: none; color: inherit; }
.article-cta__eyebrow { font-family: var(--font-display); font-weight: var(--fw-strong-heading); font-size: var(--fs-tiny); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ccl-blue); margin: 0 0 var(--spacing-2xs); }
.article-cta__title { font-family: var(--font-display); font-weight: var(--fw-strong-heading); font-size: var(--fs-h4); line-height: var(--lh-h4); color: var(--ccl-black); margin: 0 0 var(--spacing-2xs); }
.article-cta__sub { font-family: var(--font-body); font-size: var(--fs-tiny); color: var(--grey-500); margin: 0; }
.article-cta__arrow { font-family: var(--font-display); font-size: var(--fs-h2); color: var(--fg-link-strong); line-height: 1; }
.article-cta:hover .article-cta__title { color: var(--fg-link-strong); }

/* Image gallery — photos in a row with a shared caption */
.article-gallery { margin: var(--spacing-2xl) 0; }
.article-gallery__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--spacing-sm); }
.article-gallery__grid img { width: 100%; aspect-ratio: 3 / 2; object-fit: cover; border-radius: var(--radius-xs); display: block; background: var(--grey-200); }
.article-gallery figcaption { font-family: var(--font-body); font-style: italic; font-size: var(--fs-tiny); color: var(--grey-500); margin-top: var(--spacing-sm); }

/* Third-party embed (Instagram / Vimeo / YouTube blockquote embeds) — center it
   in the reading column. The embed keeps its provider's own styling. */
.article-embed { margin: var(--spacing-2xl) 0; display: flex; justify-content: center; }
.article-embed .instagram-media { margin: 0 auto !important; }

/* Tags */
.article-tags { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-sm); padding-top: var(--spacing-xl); border-top: 1px solid var(--grey-200); margin-top: var(--spacing-2xl); }
.article-tags__label { font-family: var(--font-body); font-size: var(--fs-tiny); letter-spacing: 0.1em; text-transform: uppercase; color: var(--grey-400); font-weight: 700; }
/* Content labels — ONE family, two densities (§9). Both link to a listing and
   share the same type treatment (display face, uppercase, tiny, tracked):
     .category-tag — bare text; the kicker above a card or article title.
     .tag          — the same label with pill chrome, for tag clouds where
                     several sit together and need to read as discrete chips.
   Pill chrome is consistent with "fully rounded = action" — tags are links. */
.tag {
  display: inline-block;
  padding: 5px 14px;
  border-radius: var(--radius-pill);
  background: var(--bg-info);
  color: var(--ccl-blue-dark);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-tiny);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-decoration: none;
}
.tag:hover { background: var(--ccl-blue); color: #fff; }

/* Policy-commitment tags — the third member of the label family, and the only
   one that *classifies* rather than files: it says which of our three policy
   commitments a bill advances, and links into that commitment on What We Do.
   Structure mirrors .article-tags (quiet label + pill row).

   Icon-led, using the same bolt / leaf / handshake marks the commitments carry
   on What We Do — a reader who has seen that page recognises the mark faster
   than the words, and it makes the cross-link feel like a pointer at something
   specific rather than a generic "learn more". The glyph does the work colour
   does in .tag: all three marks share one green circle, so tinting the pills
   per commitment would add a second, competing colour signal.

   Label stays sentence case (not .tag's uppercase) because these are the
   commitments' actual names — uppercasing renames them. */
.commitment-tags {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--spacing-sm);
  margin: 0 0 var(--spacing-md);
}
.commitment-tags__label {
  font-family: var(--font-body);
  font-size: var(--fs-tiny);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--grey-400);
  font-weight: 700;
}
/* `.ccl` guard (0,2,0) rather than a bare .commitment-tag (0,1,0). It was
   added to beat `.bill-row__body a` (0,1,1), which repainted the label navy;
   §11 has since retired that rule, so nothing outguns the pill today. Keeping
   the guard anyway — it's the standing convention for a component that renders
   inside a scoped prose container (.ccl .person__name, .ccl .session__title),
   and this container has grown a competing `a` rule once already. */
.ccl .commitment-tag {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  /* Tight on the icon side so the mark sits flush in the pill's round end. */
  padding: 4px 16px 4px 4px;
  border-radius: var(--radius-pill);
  background: var(--ccl-green-bg);
  color: var(--ccl-black);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-tiny);
  line-height: calc(var(--lh-tiny) / var(--fs-tiny));
  text-decoration: none;
  /* Neutralize the global .ccl link underline (see .category-tag). */
  border-bottom: none;
  transition: background .12s ease;
}
.commitment-tag img {
  width: 28px;
  height: 28px;
  object-fit: contain;
  flex-shrink: 0;
}
.ccl .commitment-tag:hover { background: var(--ccl-green-pressed); color: var(--ccl-black); }

/* Related articles */
.related { max-width: 1166px; margin: var(--spacing-4xl) auto var(--spacing-5xl); padding: var(--spacing-3xl) var(--container-pad) 0; border-top: 1px solid var(--grey-200); }
.related__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--spacing-md); margin-bottom: var(--spacing-xl); }
.related__head h2 { font-family: var(--font-display); font-weight: var(--fw-strong-heading); font-size: var(--fs-h2); color: var(--ccl-black); margin: 0; }
.related__head a { font-family: var(--font-body); font-weight: 700; font-size: var(--text-md); color: var(--fg-link-strong); text-decoration: none; white-space: nowrap; }
.related__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--spacing-xl); }
.related-card { display: flex; flex-direction: column; gap: var(--spacing-xs); text-decoration: none; color: inherit; }
.related-card__thumb { aspect-ratio: 16 / 9; border-radius: var(--radius-md); overflow: hidden; background: var(--grey-200); margin-bottom: var(--spacing-2xs); }
.related-card__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.related-card .eyebrow-blue { font-size: var(--fs-tiny); letter-spacing: 0.14em; margin: 0; }
.related-card h3 { font-family: var(--font-display); font-weight: var(--fw-weak); font-size: var(--fs-h4); line-height: var(--lh-h4); color: var(--ccl-black); margin: 0; }
.related-card:hover h3 { color: var(--fg-link-strong); }
.related-card__meta { font-family: var(--font-body); font-size: var(--fs-tiny); color: var(--grey-500); margin: 0; }

/* Whole-block article links shouldn't pick up the global a:hover underline. */
.article-cta:hover, .related-card:hover, .tag:hover, .article-byline__share a:hover { border-bottom-color: transparent; }

@media (max-width: 600px) {
  .related__grid { grid-template-columns: 1fr 1fr; }
  .article-byline__share { display: none; }
}

/* ==========================================================================
   HOMEPAGE (home.html) — Figma 3186:3193 "Top Tier - Header"

   Section spine, top to bottom:
     .hero-t2 (canonical)         full-bleed photo + white overlay card
     .hm-know                     2x2 "Get to know CCL" panels w/ glyph icon
     .hm-approach                 white card overlapping a photo, gradient spine
     .hm-statefinder              tinted panel: state picker | volunteer map
     .action-cards-row (canonical) "Ready to take action?" 3-up
     .hm-voices                   4 volunteer quotes under green rules
     .hm-mosaic                   photo mosaic + .conf-quote-block in-grid
     .join-cta (canonical)        navy closing band

   Only the five .hm-* blocks are new; everything else on the page is an
   existing component. Content blocks sit at the site's 1166px measure rather
   than the design's 1314 — see DEVIATIONS.md D-H1.
   ========================================================================== */

/* The design's section rules run nearly frame-wide, not at the 780px the
   canonical divider uses. Width-only modifier; colour and weight unchanged. */
.divider-thick--wide { max-width: 1087px; }

/* Hero → first section seam. The canonical T2 reserves 80px of padding plus a
   48px margin under the photo for pages whose card overhangs its bottom edge.
   The homepage card sits fully inside the photo, so that reserve just stacks
   with the next section's own 48px top margin — 176px of dead space before
   "Get to know". Zeroed here so the seam is the page's standard 48px beat.
   Desktop only by specificity: the phone rule that puts the card back in flow
   (0,2,0) keeps its own bottom padding, which the card still needs there. */
.hero-t2--flush { padding-bottom: 0; margin-bottom: 0; }

/* General utility, landed here first: a label that screen readers announce and
   the design doesn't draw. The state picker needs one (its visible label is
   the option text). `.event-meta--inline .event-meta__label` open-codes the
   same declarations and should collapse onto this when it's next touched. */
.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* --------------------------------------------------------------------------
   Get to know CCL — 2x2 panels, copy left + 150px glyph icon right.
   -------------------------------------------------------------------------- */
.hm-know {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-xl);
  max-width: 1166px;
  margin: 0 auto var(--spacing-4xl);
  padding: 0 var(--container-pad);
}
.hm-know__card {
  background: #fff;
  border-radius: var(--radius-md);
  box-shadow: 0 2px 10px rgba(0,0,0,0.16);
  padding: var(--spacing-xl);
  display: grid;
  grid-template-columns: minmax(0, 1fr) 130px;
  gap: var(--spacing-lg);
  align-items: center;
}
/* Gap owns the rhythm inside the copy column (§4 STYLING-PRINCIPLES). */
.hm-know__copy {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--spacing-sm);
}
.ccl .hm-know__copy > * { margin: 0; }
/* Matches the icon column exactly. The source glyphs are 150px; sizing them to
   the track keeps them from overflowing it, and both dimensions are set so the
   circle can't go oval. */
.hm-know__icon {
  width: 130px;
  height: 130px;
  display: block;
  object-fit: contain;
}

/* --------------------------------------------------------------------------
   A different approach — copy card overlapping the photo on its left, with a
   blue-to-green spine down the card's rounded left edge. `overflow: hidden`
   is what rounds the spine's ends to the card radius; the shadow is painted
   outside the box so it survives the clip.
   -------------------------------------------------------------------------- */
.hm-approach {
  display: grid;
  grid-template-columns: 693fr 721fr;
  max-width: var(--frame-max);
  margin: 0 auto var(--spacing-5xl);
  /* --gutter, NOT --page-gutter. The latter is edge-inset + gutter, meant for
     full-bleed elements where the inset does the frame-centering; here
     max-width + auto margins already do it, so --page-gutter would inset
     twice. The error is 0 at exactly 1440 and grows either side of it. */
  padding: 0 var(--gutter);
}
.hm-approach__card {
  grid-area: 1 / 1;
  position: relative;
  z-index: 1;
  margin-right: calc(-1 * var(--spacing-3xl));
  background: #fff;
  border-radius: var(--radius-md);
  box-shadow: 0 2px 10px rgba(0,0,0,0.16);
  overflow: hidden;
  /* Roomier left inset than right: the spine eats 14px of it, and the extra
     holds the headline to the design's two-line break. */
  padding: var(--spacing-2xl) var(--spacing-3xl) var(--spacing-3xl) var(--spacing-4xl);
}
.hm-approach__card::before {
  content: '';
  position: absolute;
  inset: 0 auto 0 0;
  width: 14px;
  background: linear-gradient(180deg, var(--ccl-blue) 0%, var(--ccl-green) 100%);
}
/* Above the reflow breakpoint the card is wide enough to hold "bridge-builders"
   whole, so stop the browser breaking it at its hyphen: the underline is a
   per-line background, so a hyphen break splits it into two stubs. Desktop
   only, deliberately — below 900px the card's measure is narrower than the
   word, so forcing it unbreakable there would push it out of the card. */
@media (min-width: 901px) {
  .hm-approach__card h2 .hdr-underline { white-space: nowrap; }
}
.ccl .hm-approach__card h2 {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-h1);
  line-height: 54px;
  letter-spacing: -0.5px;
  color: var(--ccl-black);
  margin: 0 0 var(--spacing-lg);
}
.ccl .hm-approach__card p:last-child { margin-bottom: 0; }
/* The photo takes its height from the card rather than a fixed ratio, so the
   two stay in proportion however long the copy runs; the offsets reproduce the
   design's stagger — it starts below the card's top edge and hangs below its
   bottom one. (The section's own bottom margin absorbs the hang.) */
.hm-approach__photo {
  grid-area: 1 / 2;
  margin: var(--spacing-2xl) 0 calc(-1 * var(--spacing-2xl));
  min-height: 0;
  border-radius: var(--radius-md);
  overflow: hidden;
}
.hm-approach__photo img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* --------------------------------------------------------------------------
   State finder — tinted panel, picker column beside the volunteer map.
   -------------------------------------------------------------------------- */
.hm-statefinder {
  max-width: var(--frame-max);
  margin: 0 auto var(--spacing-5xl);
  /* --gutter for the same reason as .hm-approach above. */
  padding: 0 var(--gutter);
}
.hm-statefinder__panel {
  background: linear-gradient(180deg, var(--ccl-blue-bg) 0%, var(--brand-lightest) 100%);
  border-radius: var(--radius-lg);
  padding: var(--spacing-5xl) var(--spacing-4xl);
  display: grid;
  grid-template-columns: 444fr 743fr;
  gap: var(--spacing-4xl);
  align-items: center;
}
.hm-statefinder__copy {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--spacing-lg);
}
.ccl .hm-statefinder__copy > * { margin: 0; }
.ccl .hm-statefinder__copy h2 {
  font-family: var(--font-display);
  font-weight: var(--fw-strong-heading);
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: -0.5px;
  color: var(--ccl-black);
}
/* Native select styled as the design's field: white, 8px radius, own chevron
   (appearance:none drops the platform arrow along with the platform chrome). */
.hm-statefinder__select {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  max-width: 364px;
  min-height: 48px;
  padding: 0 var(--spacing-2xl) 0 var(--spacing-md);
  background-color: #fff;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right var(--spacing-md) center;
  background-size: 24px 24px;
  border: 1px solid rgba(0,0,0,0.45);
  border-radius: var(--radius-xs);
  font-family: var(--font-body);
  font-size: var(--fs-small);
  line-height: var(--lh-small);
  color: var(--ccl-black);
  cursor: pointer;
}
.hm-statefinder__map { margin: 0; }
.hm-statefinder__map img { width: 100%; height: auto; display: block; }

/* --------------------------------------------------------------------------
   Volunteer voices — four quotes, each under its own green rule. Columns run
   top-aligned and ragged-bottom, as designed: the attribution follows the
   quote rather than sitting on a shared baseline.
   -------------------------------------------------------------------------- */
.hm-voices {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  /* start, not stretch — the attributions are meant to sit under their own
     quote, not on a shared baseline the tallest column dictates. */
  align-items: start;
  gap: var(--spacing-xl);
  max-width: 1166px;
  margin: 0 auto var(--spacing-5xl);
  padding: 0 var(--container-pad);
}
.hm-voice {
  border-top: 4px solid var(--ccl-green);
  padding-top: var(--spacing-lg);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--spacing-md);
}
.ccl .hm-voice > * { margin: 0; }
.hm-voice__quote {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  color: var(--ccl-black);
}
.ccl .hm-voice__name {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.285px;
  color: var(--ccl-black);
  margin: 0;
}
.ccl .hm-voice__meta {
  font-family: var(--font-body);
  font-size: var(--text-md);
  line-height: 1.5;
  letter-spacing: -0.24px;
  color: var(--ccl-black);
  margin: 0;
}

/* --------------------------------------------------------------------------
   Photo mosaic + testimonial — one grid holds the six photos and the
   pull-quote so the quote reads as a tile in the mosaic rather than a section
   after it. Rows are a fixed, viewport-scaled height so the photos keep the
   designed proportions; `minmax(…, auto)` lets a row grow if the quote needs
   more than its two rows rather than spilling out of the grid.
   -------------------------------------------------------------------------- */
.hm-mosaic {
  display: grid;
  grid-template-columns: 353fr 280fr 324fr 282fr;
  grid-auto-rows: minmax(clamp(170px, 17.5vw, 255px), auto);
  gap: var(--spacing-lg);
  max-width: 1166px;
  margin: 0 auto var(--spacing-5xl);
  padding: 0 var(--container-pad);
}
.hm-mosaic figure { margin: 0; }
.hm-mosaic__tile {
  position: relative;
  border-radius: var(--radius-md);
  overflow: hidden;
  min-height: 0;
}
/* Top-anchored, not centred. Four of the seven tiles are wider than their
   source, so `cover` crops them vertically — up to 30% on the wide tile — and
   a centred crop takes half of that off the top, straight through the faces.
   Every photo here is a group shot with heads near the top of the frame, so
   the top edge is the one to hold and the foreground (tables, grass, feet) is
   what can go. Doing this here rather than re-cropping the assets is what
   keeps it correct at every breakpoint: the tiles change ratio at 900px, and
   a baked-in crop would only suit whichever width it was cut for. The value
   is inert on the three tiles that crop horizontally instead. */
.hm-mosaic__tile img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center top;
  display: block;
}
.hm-mosaic__tile--feature { grid-area: 1 / 1 / 3 / 2; }
.hm-mosaic__tile--wide    { grid-area: 2 / 2 / 3 / 4; }
/* Bottom row is its own 50/50 grid rather than two tiles on the parent's
   tracks. The parent's four columns are deliberately unequal (they carry the
   top row's rhythm), so no combination of them splits this row evenly — the
   nested grid is what lets both photos be the same width. */
.hm-mosaic__foot {
  grid-area: 3 / 1 / 4 / 4;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-lg);
  min-height: 0;
}
.hm-mosaic__quote {
  grid-area: 2 / 4 / 4 / 5;
  align-self: center;
  min-width: 0;
}
/* The canonical pull-quote centres itself in a 750px measure; in a grid cell
   it takes the cell's width and its own vertical rhythm from the mosaic. */
.hm-mosaic__quote.conf-quote-block { max-width: none; margin: 0; }
.hm-mosaic__quote .quote-body p {
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
}

/* --------------------------------------------------------------------------
   Homepage responsive — reflow at the site's 900px breakpoint, then again on
   phones where the four-up rows can't hold their measure.
   -------------------------------------------------------------------------- */
@media (max-width: 900px) {
  .hm-know,
  .hm-voices { grid-template-columns: 1fr 1fr; }
  /* Card + photo un-overlap and stack; the spine stays on the card. */
  .hm-approach { grid-template-columns: 1fr; gap: var(--spacing-lg); }
  /* The desktop card's asymmetric inset (64 left / 48 right) is most of a phone
     card's width — it left a 233px measure for 36px headings, about six
     characters a line. Even padding, and the copy gets room to read. */
  .hm-approach__card {
    grid-area: auto;
    margin-right: 0;
    padding: var(--spacing-xl);
  }
  /* Stacked there's no card height to borrow, so the photo carries the
     design's crop ratio itself. */
  .hm-approach__photo { grid-area: auto; margin: 0; aspect-ratio: 721 / 564; }
  .hm-statefinder__panel {
    grid-template-columns: 1fr;
    gap: var(--spacing-xl);
    padding: var(--spacing-2xl) var(--spacing-lg);
  }
  /* Mosaic → two columns; the quote drops below the photos full-width.
     Every desktop grid-area is released here on purpose. Pinning some tiles to
     explicit rows while the rest auto-place strands the unpinned ones after
     the last pinned row — that's what dropped a photo below the quote. Only
     the feature keeps a placement (it's the one tile that spans two rows);
     everything else flows in DOM order and the quote takes the row after. */
  .hm-mosaic { grid-template-columns: 1fr 1fr; grid-auto-rows: minmax(150px, auto); }
  .hm-mosaic__tile--feature { grid-area: 1 / 1 / 3 / 2; }
  .hm-mosaic__tile--wide { grid-area: auto; }
  /* The foot pair keeps its 50/50 split, just across the full width — which
     lands its two tiles on the same column rhythm as the rest of the stack. */
  .hm-mosaic__foot { grid-area: auto; grid-column: 1 / -1; }
  .hm-mosaic__quote { grid-area: auto; grid-column: 1 / -1; }
}
@media (max-width: 620px) {
  .hm-know,
  .hm-voices { grid-template-columns: 1fr; }
  /* Icon under the copy would double the card height for no gain — the copy
     is the card, so the glyph steps down to a lead-in mark instead. */
  .hm-know__card { grid-template-columns: minmax(0, 1fr) 84px; gap: var(--spacing-md); }
  .hm-know__icon { width: 84px; height: 84px; }
}
