/* =============================================================================
   styles.css  —  GLOBAL stylesheet: design tokens, header, footer, home page
   -----------------------------------------------------------------------------
   WHAT THIS FILE DOES
   This is the site-wide stylesheet, loaded on every page. It defines:
     - the design "tokens" (colours, fonts, spacing) in :root below — EDIT THESE
       to re-theme the whole site at once;
     - the shared header / navigation and footer (built by layout.js);
     - the homepage (index.html) layout and its shared motion classes.
   Page-specific looks live in the other CSS files (home.css, about.css, etc.).

   HOW CSS VARIABLES WORK HERE
   Anything like  color: var(--color-gold)  reads the value defined once in
   :root. Change the token in one place and every rule using it updates. That's
   the intended way to re-brand the site.

   HOW THIS FILE IS ORGANISED (top to bottom)
     1. :root design tokens          5. Footer
     2. Base resets & helpers        6. Responsive tweaks (@media)
     3. Header / navigation          7. Homepage sections
     4. (skip links, focus)          8. Shared motion classes (bottom)
   ============================================================================= */

/* ---- 1. DESIGN TOKENS -------------------------------------------------------
   The master knobs for the whole site. Change a value here and it applies
   everywhere that token is used. */
:root {
  --color-ink: #111111;                 /* near-black: primary text & dark backgrounds */
  --color-paper: #ffffff;               /* white: page background & light text on dark */
  --color-gold: #cfb87c;                /* CU Boulder gold: the brand accent colour */
  --color-gold-light: #e7d6b1;          /* lighter gold: accents on dark backgrounds */
  --color-muted: #b6b6b6;               /* grey: secondary/quiet text */
  --color-line: rgba(255, 255, 255, 0.2); /* faint white: hairline borders on dark */
  --font-sans: "Helvetica Neue", Helvetica, Arial, sans-serif; /* the site typeface */
  --content-width: 1360px;              /* max width of centred content */
  --page-gutter: clamp(1.25rem, 4vw, 4rem); /* left/right page margin (scales with width) */
  --header-height: 5.5rem;              /* height of the sticky header */
  --transition: 220ms cubic-bezier(0.22, 1, 0.36, 1); /* default hover/animation timing */

  /* Story palette: the warm, cream-coloured system used by the CONTENT pages
     (about, agenda, etc.) as opposed to the black/white home & chrome. */
  --story-ink: #11110f;                 /* warm near-black text */
  --story-paper: #f7f2e8;               /* cream page background */
  --story-white: #fffdf8;               /* off-white card background */
  --story-gold: #cfb87c;                /* gold accent (matches brand gold) */
  --story-gold-deep: #6f5926;           /* darker gold for text on cream */
  --story-line: #d8d0c0;                /* soft border colour on cream */
  --story-muted: #5f594e;               /* muted brown-grey secondary text */

  /* One display type scale, reused deliberately at three sizes. clamp() means
     "min, preferred (scales with viewport), max" so text is fluid but bounded. */
  --size-display: clamp(3rem, 8.4vw, 7.6rem);   /* biggest headlines */
  --size-title: clamp(2.35rem, 5.2vw, 4.4rem);  /* section titles */
  --size-sub: clamp(1.45rem, 2.5vw, 2.15rem);   /* sub-headings */

  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);    /* smooth deceleration curve */
  /* Slight overshoot easing, so an element "pops" into place rather than just
     stopping. */
  --ease-pop: cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* ---- 2. BASE RESETS & HELPERS ----------------------------------------------- */

/* Make width/height include padding & border for EVERY element. This is the
   standard "box-sizing reset" that makes layouts predictable. */
*,
*::before,
*::after {
  box-sizing: border-box;
}

/* The root <html> element: full height and native smooth scrolling as a
   fallback for browsers without the Lenis smooth-scroll library. */
html {
  min-height: 100%;
  scroll-behavior: smooth;
}

/* Lenis owns the scroll when it is active. Native smooth scrolling must step
   aside, or the browser eases on top of Lenis and the two fight — the page
   drags as if it is still loading. These are the library's required styles;
   the smooth fallback above stays in place for readers without Lenis.
   (The .lenis classes are added to <html> automatically by the library.) */
html.lenis,
html.lenis body {
  height: auto;
}

html.lenis {
  scroll-behavior: auto !important;  /* turn off native smoothing while Lenis runs */
}

html.lenis [data-lenis-prevent] {
  overscroll-behavior: contain;      /* let inner scroll areas keep their own scroll */
}

html.lenis.lenis-stopped {
  overflow: hidden;                  /* lock scrolling when Lenis is stopped (e.g. modal) */
}

/* The page <body>: sets the default text colour, background, font and comfy
   line height for the whole site. */
body {
  min-width: 20rem;                  /* don't let the layout collapse below this */
  min-height: 100vh;
  margin: 0;
  color: var(--color-ink);
  background: var(--color-paper);
  font-family: var(--font-sans);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased; /* crisper text on WebKit browsers */
}

/* Remove the grey tap-flash on mobile for buttons and links. */
button,
a {
  -webkit-tap-highlight-color: transparent;
}

button {
  font: inherit;                     /* buttons should use the page font, not the OS default */
}

a {
  color: inherit;                    /* links take surrounding text colour unless overridden */
}

main:focus {
  outline: none;                     /* the <main> gets focus for skip-links; hide its outline */
}

/* .container centres a block of content and caps its width. Used everywhere to
   keep text aligned to a consistent column.
   NOTE: never put a max-width or a margin shorthand on an element that also
   carries .container. Narrowing the box leaves margin-inline:auto centring it in
   the viewport instead of aligning it to the container edge, and `margin: 0`
   cancels the centring outright. Constrain the children instead. */
.container {
  /* Use the full width minus gutters, but never wider than --content-width. */
  width: min(100% - (2 * var(--page-gutter)), var(--content-width));
  margin-inline: auto;               /* centre horizontally */
}

/* .sr-only hides content visually but keeps it for screen readers (used for
   labels like "Open navigation"). Do not change unless you know the pattern. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* The "Skip to content" link: hidden off-screen (translated up) until a
   keyboard user tabs to it, then it slides into view. */
.skip-link {
  position: fixed;
  z-index: 1000;                     /* above everything */
  top: 0.75rem;
  left: 0.75rem;
  padding: 0.75rem 1rem;
  color: var(--color-ink);
  background: var(--color-gold);
  font-weight: 700;
  text-decoration: none;
  transform: translateY(-160%);      /* parked off-screen above the top */
  transition: transform var(--transition);
}

.skip-link:focus {
  transform: translateY(0);          /* slide into view when focused */
}

/* ---- 3. HEADER / NAVIGATION -------------------------------------------------
   The shell wraps the header and handles the "hide on scroll down" slide
   (toggled by layout.js adding/removing .is-hidden). */
.site-header-shell {
  position: sticky;                  /* stays pinned to the top as you scroll */
  z-index: 100;
  top: 0;
  transition: transform 240ms var(--ease-out);
  will-change: transform;            /* hint the browser to prep for the slide */
}

.site-header-shell.is-hidden {
  transform: translateY(calc(-100% - 1px)); /* slide fully out of view (plus 1px for the border) */
}

/* Keyboard focus must never wait for the slide animation to finish before
   the focused navigation control becomes visible — so snap it back instantly. */
.site-header-shell:focus-within {
  transform: none;
  transition: none;
}

/* The dark bar itself. */
.site-header {
  position: relative;
  color: var(--color-paper);
  background: rgba(17, 17, 17, 0.98);   /* near-solid black, slightly translucent */
  border-bottom: 1px solid var(--color-line);
}

/* The flex row inside the header: brand on the left, nav on the right. */
.header__inner {
  min-height: var(--header-height);
  display: flex;
  align-items: center;
  justify-content: space-between;       /* push brand and nav apart */
  gap: 2rem;
}

/* The "RMETA" brand/logo link. */
.brand {
  flex: 0 0 auto;                       /* never shrink or grow */
  display: inline-flex;
  align-items: center;
  min-height: 3rem;
  color: var(--color-paper);
  text-decoration: none;
}

.brand__text {
  display: grid;                        /* stack the name over the tagline */
  gap: 0.05rem;
}

/* The big "RMETA" wordmark. */
.brand__text strong {
  font-size: clamp(1.5rem, 2.2vw, 2rem);
  line-height: 1;
  letter-spacing: -0.045em;             /* tighten the letters */
}

/* The small tagline under the wordmark. */
.brand__text small {
  color: var(--color-gold-light);
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.095em;
  line-height: 1.25;
  text-transform: uppercase;
}

/* The horizontal list of nav links. */
.primary-nav {
  display: flex;
  align-items: center;
  gap: clamp(0.3rem, 1vw, 1rem);        /* spacing scales a little with width */
}

/* Each nav link and the dropdown toggle share this base style. */
.primary-nav > a,
.nav-dropdown__toggle {
  position: relative;                   /* so the underline pseudo-element can position */
  min-height: 2.75rem;
  display: inline-flex;
  align-items: center;
  padding: 0 0.55rem;
  color: #f2f2f2;
  background: transparent;
  border: 0;
  font-size: 0.79rem;
  font-weight: 600;
  letter-spacing: 0.025em;
  text-decoration: none;
  cursor: pointer;
  transition: color var(--transition);
}

/* The gold underline under each nav link — hidden (scaleX 0) until hover. */
.primary-nav > a:not(.register-link)::after,
.nav-dropdown__toggle::after {
  content: "";
  position: absolute;
  right: 0.55rem;
  bottom: 0.28rem;
  left: 0.55rem;
  height: 2px;
  background: var(--color-gold);
  transform: scaleX(0);                 /* collapsed by default */
  transform-origin: right;
  transition: transform var(--transition);
}

/* On hover / focus / current page: turn the link gold. */
.primary-nav > a:hover,
.primary-nav > a:focus-visible,
.primary-nav > a[aria-current="page"],
.nav-dropdown__toggle:hover,
.nav-dropdown__toggle:focus-visible,
.nav-dropdown__toggle.is-current,
.nav-dropdown__toggle[aria-expanded="true"] {
  color: var(--color-gold-light);
}

/* ...and grow the underline out from the left. */
.primary-nav > a:hover::after,
.primary-nav > a:focus-visible::after,
.primary-nav > a[aria-current="page"]::after,
.nav-dropdown__toggle:hover::after,
.nav-dropdown__toggle:focus-visible::after,
.nav-dropdown__toggle.is-current::after,
.nav-dropdown__toggle[aria-expanded="true"]::after {
  transform: scaleX(1);
  transform-origin: left;
}

/* The filled gold "Register" button in the nav. (!important overrides the
   shared nav-link styles above.) */
.register-link {
  margin-left: 0.25rem;
  padding-inline: 1.1rem !important;
  color: var(--color-ink) !important;
  background: var(--color-gold) !important;
  border: 1px solid var(--color-gold);
  transition: color var(--transition), background var(--transition) !important;
}

/* Register button on hover: invert to outline style. */
.register-link:hover,
.register-link:focus-visible {
  color: var(--color-paper) !important;
  background: transparent !important;
}

/* The "ETA Ecosystem" dropdown wrapper (positions the menu below it). */
.nav-dropdown {
  position: relative;
}

.nav-dropdown__toggle {
  gap: 0.35rem;
  touch-action: manipulation;           /* faster tap response, no double-tap zoom */
}

/* The little chevron arrow in the dropdown toggle. */
.nav-dropdown__toggle svg {
  width: 0.75rem;
  transition: transform var(--transition);
}

/* Flip the chevron upside-down when the dropdown is open. */
.nav-dropdown__toggle[aria-expanded="true"] svg {
  transform: rotate(180deg);
}

/* The dropdown panel itself: floats below the toggle, hidden until opened. */
.nav-dropdown__menu {
  position: absolute;
  top: calc(100% + 0.65rem);            /* just below the toggle */
  right: 0;
  width: 16rem;
  padding: 0.55rem;
  margin: 0;
  list-style: none;
  color: var(--color-paper);
  background: var(--color-ink);
  border: 1px solid var(--color-line);
  box-shadow: 0 1.25rem 3rem rgba(0, 0, 0, 0.25);
  opacity: 0;                           /* hidden state... */
  visibility: hidden;
  transform: translateY(-0.4rem);
  transition: opacity var(--transition), transform var(--transition), visibility var(--transition);
}

/* ...shown state (is-open added by layout.js). */
.nav-dropdown__menu.is-open {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

/* Each link inside the dropdown. */
.nav-dropdown__menu a {
  min-height: 2.75rem;
  display: flex;
  align-items: center;
  padding: 0.65rem 0.8rem;
  color: #eeeeee;
  font-size: 0.86rem;
  text-decoration: none;
  touch-action: manipulation;
  transition: color var(--transition), background var(--transition);
}

/* Dropdown link hover/current: gold background, dark text. */
.nav-dropdown__menu a:hover,
.nav-dropdown__menu a:focus-visible,
.nav-dropdown__menu a[aria-current="page"] {
  color: var(--color-ink);
  background: var(--color-gold);
}

/* The mobile hamburger button. Hidden on desktop (display:none), shown at the
   narrow breakpoint further down. Its two <span>s are the bars. */
.menu-toggle {
  width: 3rem;
  height: 3rem;
  display: none;                        /* revealed in the @media (max-width:1180px) block */
  touch-action: manipulation;
  place-content: center;
  gap: 0.4rem;
  padding: 0;
  color: var(--color-paper);
  background: transparent;
  border: 1px solid var(--color-line);
  cursor: pointer;
}

/* The two hamburger bars. */
.menu-toggle span:not(.sr-only) {
  width: 1.25rem;
  height: 1px;
  display: block;
  background: currentColor;
  transition: transform var(--transition);
}

/* When open, cross the two bars into an "X". */
.menu-toggle[aria-expanded="true"] span:nth-child(2) {
  transform: translateY(0.22rem) rotate(45deg);
}

.menu-toggle[aria-expanded="true"] span:nth-child(3) {
  transform: translateY(-0.22rem) rotate(-45deg);
}

/* The main content area of each interior page (min height so short pages still
   fill the screen). */
.page-canvas {
  min-height: clamp(30rem, calc(100dvh - var(--header-height)), 58rem);
  background: var(--color-paper);
  outline: none;
}

/* ---- 5. FOOTER --------------------------------------------------------------
   Dark footer, built by layout.js. */
.site-footer {
  color: var(--color-paper);
  background: var(--color-ink);
}

/* Top part of the footer: identity block + the three link columns, side by side. */
.footer__main {
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 2fr); /* identity | nav */
  gap: clamp(3rem, 8vw, 8rem);
  padding-block: clamp(4rem, 7vw, 7rem);
}

.footer__identity {
  align-self: start;
}

/* The large brand mark in the footer. */
.brand--footer {
  margin-bottom: 2rem;
}

.brand--footer .brand__text strong {
  font-size: clamp(2.75rem, 5vw, 4.75rem);  /* much bigger than the header logo */
}

.brand--footer .brand__text small {
  max-width: 20rem;
  font-size: 0.7rem;
}

/* The "November 7, 2026 / venue address" block. */
.footer__event {
  margin: 0;
  color: var(--color-muted);
  font-size: 0.92rem;
}

/* The little uppercase date label above the address. */
.footer__event strong {
  display: block;
  margin-bottom: 0.35rem;
  color: var(--color-gold-light);
  font-size: 0.72rem;
  letter-spacing: 0.13em;
  text-transform: uppercase;
}

/* The venue name doubles as the map link wherever it appears in a fact list
   or a sentence. Underlined at a distance so it reads as a link inside
   otherwise plain text, and it picks up gold on approach like every other
   link on the site. */
.venue-link {
  color: inherit;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.2em;
  transition: color 260ms var(--ease-out);
}

/* Venue link hover → gold. */
.venue-link:hover,
.venue-link:focus-visible {
  color: var(--story-gold);
}

/* The footer address is also the map link: plain until hovered, then underlined. */
.footer__event a {
  color: inherit;
  text-decoration: none;
  transition: color 260ms var(--ease-out);
}

.footer__event a:hover,
.footer__event a:focus-visible {
  color: var(--color-gold-light);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

/* The three footer link columns. */
.footer__nav {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 2.5rem;
}

/* Each footer column stacks its heading + links. */
.footer__nav section {
  display: grid;
  align-content: start;
  gap: 0.75rem;
}

/* The uppercase heading atop each footer column. */
.footer__nav h2 {
  padding-bottom: 0.8rem;
  margin: 0 0 0.25rem;
  color: var(--color-gold-light);
  border-bottom: 1px solid var(--color-line);
  font-size: 0.7rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* Footer column links. */
.footer__nav a {
  width: fit-content;                   /* underline only spans the text */
  color: #e2e2e2;
  font-size: 0.9rem;
  text-decoration: none;
  transition: color var(--transition);
}

.footer__nav a:hover,
.footer__nav a:focus-visible {
  color: var(--color-gold-light);
}

/* The bottom strip: credit, social icons, legal links. */
.footer__bottom {
  min-height: 5.5rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem;
  padding-block: 1rem;
  border-top: 1px solid var(--color-line);
}

.footer__bottom p {
  margin: 0;
  color: var(--color-muted);
  font-size: 0.75rem;
}

/* Privacy link, the cookie-settings control, and the copyright share the
   closing line (right-aligned). */
.footer__legal {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-end;
  gap: 0.5rem 1.25rem;
}

.footer__legal a,
.footer__legal .footer__linkish {
  color: inherit;
  text-underline-offset: 0.2em;
  transition: color 260ms var(--ease-out);
}

.footer__legal a:hover,
.footer__legal a:focus-visible,
.footer__legal .footer__linkish:hover,
.footer__legal .footer__linkish:focus-visible {
  color: var(--color-gold-light);
}

/* The "Cookie settings" control is a <button> (it opens a dialog rather than
   navigating) but is styled to read like the link next to it. */
.footer__linkish {
  padding: 0;
  color: inherit;
  background: none;
  border: 0;
  font: inherit;
  text-decoration: underline;
  cursor: pointer;
}

/* The row of round social-media icon buttons. */
.footer-social {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

/* Each round icon button. */
.footer-social a {
  position: relative;
  width: 2.75rem;
  height: 2.75rem;
  display: grid;
  place-items: center;
  overflow: hidden;
  color: var(--color-paper);
  border: 1px solid var(--color-line);
  border-radius: 50%;
  transition: color var(--transition), border-color var(--transition), transform var(--transition);
}

/* A gold circle that slides up from below on hover (the fill effect). */
.footer-social a::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--color-gold);
  border-radius: inherit;
  transform: translateY(105%);          /* parked just below the button */
  transition: transform var(--transition);
}

/* Icon hover: dark icon, gold border, lift up. */
.footer-social a:hover,
.footer-social a:focus-visible {
  color: var(--color-ink);
  border-color: var(--color-gold);
  transform: translateY(-2px);
}

/* ...and slide the gold fill up into place. */
.footer-social a:hover::before,
.footer-social a:focus-visible::before {
  transform: translateY(0);
}

/* The icon graphic itself, above the gold fill. */
.footer-social svg {
  position: relative;
  z-index: 1;
  width: 1rem;
  height: 1rem;
  fill: currentColor;
}

/* Global keyboard-focus ring (gold outline). Applies to anything focused via
   keyboard. Keep this visible for accessibility. */
:focus-visible {
  outline: 3px solid var(--color-gold);
  outline-offset: 3px;
}

/* ---- 6. RESPONSIVE: tablet / mobile navigation (≤1180px) --------------------
   Below this width the horizontal nav becomes a hamburger-triggered panel. */
@media (max-width: 1180px) {
  :root {
    --header-height: 5rem;              /* slightly shorter header on small screens */
  }

  .menu-toggle {
    display: grid;                      /* show the hamburger */
  }

  /* The nav becomes a full-width dropdown panel below the header, hidden until
     the hamburger opens it (.is-open). */
  .primary-nav {
    position: absolute;
    z-index: 90;
    inset: 100% 0 auto;                 /* pinned directly below the header */
    display: grid;
    align-content: start;
    gap: 0;
    padding: 1.5rem var(--page-gutter) 3rem;
    max-height: none;
    overflow: visible;
    background: var(--color-ink);
    box-shadow: 0 1.25rem 3rem rgba(0, 0, 0, 0.28);
    opacity: 0;                         /* hidden until opened */
    visibility: hidden;
    transform: translateY(-0.75rem);
    transition: opacity var(--transition), transform var(--transition), visibility var(--transition);
  }

  /* Open state of the mobile nav panel. */
  .primary-nav.is-open {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
  }

  /* On mobile the nav links become full-width stacked rows with dividers. */
  .primary-nav > a,
  .nav-dropdown__toggle {
    width: 100%;
    min-height: 3.5rem;
    justify-content: space-between;
    padding-inline: 0;
    border-bottom: 1px solid var(--color-line);
    font-size: 1rem;
  }

  /* No sliding underline on mobile. */
  .primary-nav > a:not(.register-link)::after,
  .nav-dropdown__toggle::after {
    display: none;
  }

  /* Register button becomes a centred pill at the bottom of the mobile menu. */
  .register-link {
    width: fit-content !important;
    min-height: 3rem !important;
    justify-content: center !important;
    margin: 1.5rem 0 0 !important;
    padding-inline: 1.5rem !important;
  }

  /* On mobile the ecosystem submenu expands inline (accordion) instead of
     floating; max-height animates it open/closed. */
  .nav-dropdown__menu {
    position: static;
    width: 100%;
    max-height: 0;                      /* collapsed */
    padding: 0;
    overflow: hidden;
    border: 0;
    box-shadow: none;
    opacity: 1;
    visibility: visible;
    transform: none;
    transition: max-height 300ms ease;
  }

  .nav-dropdown__menu.is-open {
    max-height: 12rem;                  /* expanded */
  }

  .nav-dropdown__menu a {
    padding-left: 1rem;
    border-bottom: 1px solid var(--color-line);
  }
}

/* Below tablet width, stack the footer's identity + nav into one column. */
@media (max-width: 900px) {
  .footer__main {
    grid-template-columns: 1fr;
    gap: 3rem;
  }
}

/* Phone width: shrink the tagline and fully stack the footer. */
@media (max-width: 760px) {
  .brand__text small {
    max-width: 12rem;
    font-size: 0.55rem;
  }

  .page-canvas {
    min-height: 32rem;
  }

  .footer__main,
  .footer__nav {
    grid-template-columns: 1fr;
  }

  .footer__main {
    gap: 3rem;
  }

  .footer__nav {
    gap: 2rem;
  }

  .footer__bottom {
    align-items: flex-start;
    flex-direction: column;
  }
}

/* When the visitor prefers reduced motion, disable transitions/animations and
   smooth scrolling across the whole site (accessibility). */
@media (prefers-reduced-motion: reduce) {
  .site-header-shell {
    transition: none;
  }

  html {
    scroll-behavior: auto;
  }

  *,
  *::before,
  *::after {
    scroll-behavior: auto !important;
    transition-duration: 0.01ms !important;   /* effectively instant */
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
  }
}

/* ---- 7. HOMEPAGE (index.html) ----------------------------------------------- */

main:focus {
  outline: none;
}

/* The big full-screen hero at the top of the homepage (image + dark overlay
   + headline). "svh" = small viewport height, so it fits mobile browser bars. */
.home-hero {
  position: relative;
  min-height: calc(100svh - var(--header-height));
  display: grid;
  align-items: end;                     /* content sits at the bottom */
  overflow: hidden;
  isolation: isolate;                   /* keep the z-index layers self-contained */
  color: var(--color-paper);
  background: var(--color-ink);
}

/* The background image layer and the dark shade layer both fill the hero. */
.home-hero__media,
.home-hero__shade {
  position: absolute;
  z-index: -2;                          /* behind the content */
  inset: 0;
}

/* The image is slightly oversized top/bottom so it can parallax-shift without
   revealing an edge (--hero-shift is set by JS). */
.home-hero__media {
  top: calc(var(--hero-shift, 0px) * -1);
  bottom: calc(var(--hero-shift, 0px) * -1);
}

/* The hero photo itself: cover the area, focus slightly above centre. */
.home-hero__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 42%;
  transform: scale(1.025);              /* tiny zoom hides any subpixel edges */
}

/* The dark gradient overlay that keeps the headline readable over the photo.
   Three stacked gradients: darker on the left, at the bottom, and at the top. */
.home-hero__shade {
  z-index: -1;
  background:
    linear-gradient(90deg, rgba(9, 9, 9, 0.92) 0%, rgba(9, 9, 9, 0.62) 45%, rgba(9, 9, 9, 0.16) 78%),
    linear-gradient(0deg, rgba(9, 9, 9, 0.92) 0%, transparent 48%),
    linear-gradient(180deg, rgba(9, 9, 9, 0.2) 0%, transparent 24%);
}

/* Two-column layout for the hero text: big copy on the left, a narrower panel
   on the right. */
.home-hero__content {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(18rem, 0.55fr);
  align-items: end;
  gap: clamp(3rem, 7vw, 8rem);
  padding-block: clamp(7rem, 14vh, 11rem) clamp(5.5rem, 10vh, 8rem);
}

.home-hero__copy {
  max-width: 64rem;
}

/* "Eyebrow" = the small uppercase label above a heading, with a short dash. */
.eyebrow {
  display: flex;
  align-items: center;
  gap: 0.65rem;
  margin: 0 0 1.25rem;
  color: #5d513d;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* The little dash line inside an eyebrow. */
.eyebrow > span {
  width: 1.75rem;
  height: 1px;
  display: inline-block;
  background: currentColor;
}

/* Light-coloured eyebrow variant (for dark backgrounds). */
.eyebrow--light {
  color: var(--color-gold-light);
}

/* The giant hero headline. */
.home-hero h1 {
  max-width: 15ch;                      /* keep lines short for impact */
  margin: 0;
  font-size: clamp(3.6rem, 7.8vw, 8.7rem);
  font-weight: 600;
  letter-spacing: -0.065em;
  line-height: 0.88;
  text-wrap: balance;                   /* even line lengths */
}

/* Italic serif accent words inside headlines (the elegant highlighted words). */
.home-hero h1 em,
.home-section h2 em,
.home-cta h2 em {
  color: var(--color-gold);
  font-family: Georgia, "Times New Roman", serif;
  font-weight: 400;
}

/* The intro paragraph under the hero headline. */
.home-hero__lede {
  max-width: 43rem;
  margin: clamp(1.75rem, 4vw, 3rem) 0 0;
  color: #ece9e2;
  font-size: clamp(1rem, 1.5vw, 1.25rem);
  line-height: 1.6;
}

/* Row of hero buttons. */
.home-hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin-top: 2.25rem;
}

/* Base style for the pill-shaped action buttons used across the site. */
.action-button {
  min-height: 3.4rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.85rem;
  padding: 0.85rem 1.35rem;
  border: 1px solid transparent;
  font-size: 0.83rem;
  font-weight: 700;
  letter-spacing: 0.025em;
  text-decoration: none;
  transition: color var(--transition), background var(--transition), border-color var(--transition), transform var(--transition);
}

/* Lift the button slightly on hover. */
.action-button:hover,
.action-button:focus-visible {
  transform: translateY(-2px);
}

/* Gold (primary) button variant. */
.action-button--gold {
  color: var(--color-ink);
  background: var(--color-gold);
  border-color: var(--color-gold);
}

/* Gold button hover: invert to outline. */
.action-button--gold:hover,
.action-button--gold:focus-visible {
  color: var(--color-paper);
  background: transparent;
}

/* Ghost (secondary) button variant: transparent with a light outline. */
.action-button--ghost {
  color: var(--color-paper);
  background: rgba(0, 0, 0, 0.2);
  border-color: rgba(255, 255, 255, 0.45);
}

/* Ghost button hover: fill with white. */
.action-button--ghost:hover,
.action-button--ghost:focus-visible {
  color: var(--color-ink);
  background: var(--color-paper);
  border-color: var(--color-paper);
}

/* The glassy "event snapshot" card in the hero's right column (date/details/
   countdown). backdrop-filter blurs whatever is behind it. */
.event-snapshot {
  align-self: end;
  color: var(--color-paper);
  background: rgba(12, 12, 12, 0.82);
  border: 1px solid rgba(255, 255, 255, 0.25);
  backdrop-filter: blur(14px);
}

/* The date row at the top of the snapshot card. */
.event-snapshot__date {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 0.75rem;
  padding: 1.3rem 1.5rem;
  color: var(--color-gold-light);
  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

/* Right-align the last item in the date row. */
.event-snapshot__date span:last-child {
  text-align: right;
}

/* The big serif day number in the date row. */
.event-snapshot__date strong {
  color: var(--color-paper);
  font-family: Georgia, "Times New Roman", serif;
  font-size: 3.5rem;
  font-weight: 400;
  letter-spacing: -0.05em;
  line-height: 0.9;
}

/* The details list (time, place...) in the middle of the snapshot card. */
.event-snapshot__details {
  display: grid;
  gap: 1rem;
  padding: 1.5rem;
}

/* Each label+value pair. */
.event-snapshot__details p {
  display: grid;
  gap: 0.2rem;
  margin: 0;
}

/* The small uppercase label. */
.event-snapshot__details span {
  color: #aaa59c;
  font-size: 0.64rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

/* The value text. */
.event-snapshot__details strong {
  font-size: 0.9rem;
  font-weight: 500;
}

/* The gold countdown bar at the bottom of the snapshot card. */
.event-snapshot__countdown {
  margin: 0;
  padding: 0.9rem 1.5rem;
  color: var(--color-ink);
  background: var(--color-gold);
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-align: center;
  text-transform: uppercase;
}

/* The countdown numbers. */
.event-snapshot__countdown strong {
  margin-right: 0.25rem;
  font-size: 1rem;
}

/* The little "scroll" hint pinned to the bottom-right of the hero. */
.home-hero__scroll {
  position: absolute;
  right: var(--page-gutter);
  bottom: 1.2rem;
  display: inline-flex;
  align-items: center;
  gap: 0.65rem;
  color: #d7d3cc;
  font-size: 0.67rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-decoration: none;
  text-transform: uppercase;
}

/* The round circle of the scroll hint. */
.home-hero__scroll span {
  width: 1.5rem;
  height: 1.5rem;
  border: 1px solid rgba(255, 255, 255, 0.45);
  border-radius: 50%;
}

/* The little down-chevron inside the scroll circle (a rotated corner). */
.home-hero__scroll span::after {
  content: "";
  width: 0.3rem;
  height: 0.3rem;
  display: block;
  margin: 0.45rem auto 0;
  border-right: 1px solid currentColor;
  border-bottom: 1px solid currentColor;
  transform: rotate(45deg);
}

/* The gold marquee strip that scrolls text sideways forever. */
.momentum-strip {
  overflow: hidden;
  color: var(--color-ink);
  background: var(--color-gold);
}

/* The moving track inside the marquee (animated by @keyframes momentum). */
.momentum-strip__track {
  width: max-content;
  display: flex;
  align-items: center;
  gap: clamp(1.5rem, 4vw, 4rem);
  padding-block: 0.85rem;
  animation: momentum 24s linear infinite;   /* slower = larger seconds value */
}

/* The words in the marquee. */
.momentum-strip__track span {
  font-size: clamp(1rem, 1.7vw, 1.35rem);
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* The dot separators between marquee words. */
.momentum-strip__track i {
  width: 0.36rem;
  height: 0.36rem;
  background: currentColor;
  border-radius: 50%;
}

/* The marquee scroll: slide the (duplicated) track left by half its width. */
@keyframes momentum {
  to { transform: translateX(-50%); }
}

/* Generic vertical padding for a homepage section. */
.home-section {
  padding-block: clamp(5rem, 10vw, 10rem);
}

/* Big section headings on the home + CTA sections. */
.home-section h2,
.home-cta h2 {
  margin: 0;
  color: var(--color-ink);
  font-size: clamp(2.8rem, 6vw, 6.6rem);
  font-weight: 600;
  letter-spacing: -0.06em;
  line-height: 0.95;
  text-wrap: balance;
}

/* The "conference intro" section (warm off-white background). */
.conference-intro {
  background: #f3efe6;
}

/* Its two-column heading area. */
.conference-intro__heading {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(18rem, 0.55fr);
  align-items: end;
  gap: clamp(3rem, 8vw, 9rem);
}

/* Span the eyebrow across both columns, tucked just above the heading. */
.conference-intro__heading .eyebrow {
  grid-column: 1 / -1;
  margin-bottom: -1.5rem;
}

/* Keep the heading text narrow. */
.conference-intro__heading h2 {
  max-width: 12ch;
}

/* A standard intro paragraph ("lede") under a section heading. */
.section-lede {
  max-width: 36rem;
  margin: 0;
  color: #4a4741;
  font-size: clamp(1rem, 1.5vw, 1.2rem);
  line-height: 1.75;
}

/* The 3-across grid of "value" cards. The top/left borders + each card's
   right/bottom border make a clean 1px grid. */
.value-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  margin-top: clamp(3.5rem, 7vw, 7rem);
  border-top: 1px solid #c9c2b5;
  border-left: 1px solid #c9c2b5;
}

/* A single value card. */
.value-card {
  min-height: 31rem;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  padding: clamp(1.5rem, 3vw, 2.5rem);
  overflow: hidden;
  border-right: 1px solid #c9c2b5;
  border-bottom: 1px solid #c9c2b5;
}

/* The small "01 / 02 / 03" number at the top of a card (pushed up by auto margin). */
.value-card__number {
  margin-bottom: auto;
  color: #766b5a;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.12em;
}

/* The card's heading. */
.value-card h3 {
  max-width: 15ch;
  margin: 2rem 0 1rem;
  font-size: clamp(1.7rem, 2.4vw, 2.55rem);
  font-weight: 600;
  letter-spacing: -0.04em;
  line-height: 1.05;
}

/* The card's body text. */
.value-card p {
  max-width: 31rem;
  margin: 0;
  color: #5c574e;
  font-size: 0.95rem;
  line-height: 1.7;
}

/* The underlined "read more" style link used in cards (shared by a few areas).
   The gap grows on hover to nudge the arrow. */
.value-card a,
.audience-explorer__content a,
.collaborators__link a {
  display: inline-flex;
  align-items: center;
  gap: 0.75rem;
  margin-top: 1.5rem;
  padding-bottom: 0.25rem;
  border-bottom: 1px solid currentColor;
  font-size: 0.78rem;
  font-weight: 700;
  text-decoration: none;
  transition: color var(--transition), gap var(--transition);
}

/* Those links on hover: wider gap, deeper gold. */
.value-card a:hover,
.value-card a:focus-visible,
.audience-explorer__content a:hover,
.audience-explorer__content a:focus-visible,
.collaborators__link a:hover,
.collaborators__link a:focus-visible {
  gap: 1rem;
  color: #765f31;
}

/* A photo-backed value card (dark, image behind, text at the bottom). */
.value-card--image {
  position: relative;
  justify-content: flex-end;
  isolation: isolate;
  color: var(--color-paper);
  background: var(--color-ink);
}

/* Dark gradient over the photo for text legibility. */
.value-card--image::after {
  content: "";
  position: absolute;
  z-index: -1;
  inset: 0;
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.84), rgba(0, 0, 0, 0.08) 62%);
}

/* The background photo of the image card. */
.value-card--image img {
  position: absolute;
  z-index: -2;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 650ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* Slow zoom on hover. */
.value-card--image:hover img {
  transform: scale(1.04);
}

/* Lighten the number on the dark image card. */
.value-card--image .value-card__number {
  color: var(--color-gold-light);
}

/* The dark "who it's for" audience section. */
.audience {
  color: var(--color-paper);
  background: var(--color-ink);
}

/* Two-column heading used by the audience + photo-story sections. */
.audience__heading,
.photo-story__heading {
  display: grid;
  grid-template-columns: minmax(0, 1.45fr) minmax(18rem, 0.55fr);
  align-items: end;
  gap: clamp(3rem, 8vw, 8rem);
}

/* Audience section heading. */
.audience__heading h2 {
  max-width: 10ch;
  color: var(--color-paper);
}

/* Intro paragraph beside those headings. */
.audience__heading > p,
.photo-story__heading > p {
  margin: 0;
  color: #bdb9b2;
  line-height: 1.75;
}

/* The tabbed "who is this for" explorer. */
.audience-explorer {
  margin-top: clamp(3.5rem, 7vw, 7rem);
}

/* The row of 4 tab buttons. */
.audience-explorer__tabs {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  border-top: 1px solid rgba(255, 255, 255, 0.22);
  border-left: 1px solid rgba(255, 255, 255, 0.22);
}

/* Each tab button. */
.audience-explorer__tabs button {
  min-height: 4.75rem;
  padding: 0.9rem 1rem;
  color: #aba8a2;
  background: transparent;
  border: 0;
  border-right: 1px solid rgba(255, 255, 255, 0.22);
  border-bottom: 1px solid rgba(255, 255, 255, 0.22);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  cursor: pointer;
  transition: color var(--transition), background var(--transition);
}

/* Active/hovered tab: gold background. (aria-selected is set by JS.) */
.audience-explorer__tabs button:hover,
.audience-explorer__tabs button:focus-visible,
.audience-explorer__tabs button[aria-selected="true"] {
  color: var(--color-ink);
  background: var(--color-gold);
}

/* The panel shown under the tabs: text on the left, image on the right. */
.audience-explorer__panel {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(20rem, 0.6fr);
  min-height: 34rem;
  border-right: 1px solid rgba(255, 255, 255, 0.22);
  border-bottom: 1px solid rgba(255, 255, 255, 0.22);
  border-left: 1px solid rgba(255, 255, 255, 0.22);
}

/* The image side of the panel. */
.audience-explorer__media {
  min-height: 30rem;
  overflow: hidden;
}

.audience-explorer__media img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
  transition: opacity var(--transition), transform 600ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* Gentle zoom when hovering the panel. */
.audience-explorer__panel:hover .audience-explorer__media img {
  transform: scale(1.025);
}

/* The text side of the audience panel. */
.audience-explorer__content {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  padding: clamp(2rem, 4vw, 4rem);
}

/* The "01/02..." index label. */
.audience-explorer__index {
  margin: 0 0 auto;
  color: #85817a;
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.1em;
}

/* Eyebrow spacing inside the panel. */
.audience-explorer__content .eyebrow {
  margin-top: auto;
  margin-bottom: 0.9rem;
}

/* Panel heading. */
.audience-explorer__content h3 {
  max-width: 12ch;
  margin: 0;
  font-size: clamp(2.2rem, 3.8vw, 4.1rem);
  font-weight: 600;
  letter-spacing: -0.055em;
  line-height: 0.98;
}

/* Panel body paragraph (everything that isn't the eyebrow/index). */
.audience-explorer__content > p:not(.eyebrow):not(.audience-explorer__index) {
  margin: 1.25rem 0 0;
  color: #bbb8b1;
  line-height: 1.7;
}

/* Panel link colour. */
.audience-explorer__content a {
  color: var(--color-gold-light);
}

/* The "Boulder film" video section (off-white background). */
.boulder-film {
  background: #f3efe6;
}

/* Its heading row. */
.boulder-film__heading {
  display: grid;
  grid-template-columns: 0.55fr 1.45fr;
  align-items: end;
  gap: 2rem;
}

.boulder-film__heading h2 {
  max-width: 12ch;
}

/* The video frame (fixed aspect ratio, black background). */
.boulder-film__frame {
  position: relative;
  margin-top: clamp(3rem, 6vw, 6rem);
  overflow: hidden;
  aspect-ratio: 16 / 8.2;
  color: var(--color-paper);
  background: #000;
}

/* The video fills the frame. */
.boulder-film video {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
}

/* The caption + play-button overlay on top of the video. */
.boulder-film__overlay {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 2rem;
  padding: clamp(1.5rem, 4vw, 3.5rem);
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.84), rgba(0, 0, 0, 0.08) 65%);
  transition: opacity var(--transition), visibility var(--transition);
}

/* Hide the overlay once the video is playing (is-playing added by video.js). */
.boulder-film__frame.is-playing .boulder-film__overlay {
  opacity: 0;
  visibility: hidden;
}

/* The overlay caption block. */
.boulder-film__overlay p {
  display: grid;
  gap: 0.2rem;
  margin: 0;
}

/* Big serif caption title. */
.boulder-film__overlay strong {
  font-family: Georgia, "Times New Roman", serif;
  font-size: clamp(2.5rem, 5vw, 5.5rem);
  font-weight: 400;
  letter-spacing: -0.04em;
  line-height: 1;
}

/* Small uppercase caption subtitle. */
.boulder-film__overlay span {
  color: #d8d4cd;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.09em;
  text-transform: uppercase;
}

/* The round gold play button (reused wherever a video needs one). */
.play-button {
  width: clamp(4.5rem, 7vw, 6.5rem);
  height: clamp(4.5rem, 7vw, 6.5rem);
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  padding: 0;
  color: var(--color-ink);
  background: var(--color-gold);
  border: 0;
  border-radius: 50%;
  cursor: pointer;
  transition: color var(--transition), background var(--transition), transform var(--transition);
}

/* Play button hover: invert + slight grow. */
.play-button:hover,
.play-button:focus-visible {
  color: var(--color-paper);
  background: var(--color-ink);
  transform: scale(1.04);
}

/* The play triangle icon. */
.play-button svg {
  width: 2rem;
}

/* The "photo story" gallery section. */
.photo-story {
  background: var(--color-paper);
}

.photo-story__heading h2 {
  max-width: 11ch;
}

.photo-story__heading > p {
  color: #5c574e;
}

/* Two-column grid of photo cards. */
.photo-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1rem;
  margin-top: clamp(3.5rem, 7vw, 7rem);
}

/* A clickable photo card (opens the lightbox dialog). */
.photo-card {
  position: relative;
  min-height: clamp(23rem, 38vw, 38rem);
  display: flex;
  align-items: flex-end;
  padding: 0;
  overflow: hidden;
  color: var(--color-paper);
  background: var(--color-ink);
  border: 0;
  text-align: left;
  text-decoration: none;
  cursor: zoom-in;
}

/* A full-width photo card spanning both columns. */
.photo-card--wide {
  grid-column: 1 / -1;
  min-height: clamp(28rem, 55vw, 52rem);
}

/* Dark gradient over each photo so the caption stays readable. */
.photo-card::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.86), transparent 58%);
}

/* The photo itself. */
.photo-card img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 700ms cubic-bezier(0.22, 1, 0.36, 1), filter var(--transition);
}

/* Hover: slight zoom + saturation. */
.photo-card:hover img,
.photo-card:focus-visible img {
  filter: saturate(1.08);
  transform: scale(1.035);
}

/* The caption block on the card, above the gradient. */
.photo-card > span {
  position: relative;
  z-index: 1;
  max-width: 35rem;
  display: grid;
  gap: 0.5rem;
  padding: clamp(1.5rem, 4vw, 3rem);
}

/* Caption title. */
.photo-card strong {
  font-size: clamp(1.6rem, 3vw, 3.3rem);
  font-weight: 600;
  letter-spacing: -0.04em;
}

/* Caption subtitle. */
.photo-card small {
  color: #ddd8d0;
  font-size: 0.9rem;
  line-height: 1.6;
}

/* The partner-logos ("collaborators") section. */
.collaborators {
  background: #f3efe6;
}

/* Its heading row. */
.collaborators__heading {
  display: grid;
  grid-template-columns: 0.55fr 1.45fr;
  align-items: end;
  gap: 2rem;
}

.collaborators__heading h2 {
  max-width: 11ch;
}

/* The 4-across grid of partner logos. */
.logo-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  margin-top: clamp(3.5rem, 7vw, 7rem);
  border-top: 1px solid #c9c2b5;
  border-left: 1px solid #c9c2b5;
}

/* Each logo cell. */
.logo-card {
  min-height: 13rem;
  display: grid;
  place-items: center;
  padding: 1rem;
  overflow: hidden;
  background: rgba(255, 255, 255, 0.52);
  border-right: 1px solid #c9c2b5;
  border-bottom: 1px solid #c9c2b5;
}

.logo-card picture {
  width: 100%;
  height: 100%;
  display: grid;
  place-items: center;
}

/* Logos are scaled up to fill the cell (source images have whitespace).
   The per-brand overrides below tune each logo's zoom individually. */
.logo-card img {
  width: 100%;
  height: 100%;
  max-height: 10rem;
  display: block;
  object-fit: contain;
  transform: scale(1.85);
  transition: filter var(--transition), transform var(--transition);
}

/* Logo hover: slight zoom + saturation. */
.logo-card:hover img {
  filter: saturate(1.15);
  transform: scale(1.92);
}

/* CU Boulder logo needs a bigger zoom. */
.logo-card--cu img {
  transform: scale(2.75);
}

.logo-card--cu:hover img {
  transform: scale(2.85);
}

/* ETA logo zoom. */
.logo-card--eta img {
  transform: scale(1.65);
}

.logo-card--eta:hover img {
  transform: scale(1.72);
}

/* CSU logo zoom. */
.logo-card--csu img {
  transform: scale(1.55);
}

.logo-card--csu:hover img {
  transform: scale(1.62);
}

/* Right-align the "see all" link under the logos. */
.collaborators__link {
  display: flex;
  justify-content: flex-end;
}

/* The big closing call-to-action band (photo background + overlay). */
.home-cta {
  position: relative;
  min-height: 42rem;
  display: grid;
  align-items: center;
  overflow: hidden;
  isolation: isolate;
  color: var(--color-paper);
  background: var(--color-ink);
}

/* Background image + dark shade layers. */
.home-cta__media,
.home-cta__shade {
  position: absolute;
  z-index: -2;
  inset: 0;
}

.home-cta__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

/* Left-to-right dark gradient for text legibility. */
.home-cta__shade {
  z-index: -1;
  background: linear-gradient(90deg, rgba(0, 0, 0, 0.9), rgba(0, 0, 0, 0.34));
}

.home-cta__content {
  padding-block: 6rem;
}

.home-cta h2 {
  max-width: 12ch;
  color: var(--color-paper);
}

.home-cta .action-button {
  margin-top: 2.5rem;
}

/* The full-screen photo lightbox dialog (a native <dialog> opened from a card). */
.photo-dialog {
  width: min(94vw, 92rem);
  max-width: none;
  height: min(92vh, 62rem);
  max-height: none;
  padding: 0;
  overflow: hidden;
  color: var(--color-paper);
  background: #090909;
  border: 1px solid rgba(255, 255, 255, 0.2);
}

/* The dimmed, blurred backdrop behind the lightbox. */
.photo-dialog::backdrop {
  background: rgba(0, 0, 0, 0.88);
  backdrop-filter: blur(6px);
}

/* The lightbox close button (top-right). */
.photo-dialog__close {
  position: absolute;
  z-index: 3;
  top: 1rem;
  right: 1rem;
  min-height: 2.75rem;
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.6rem 0.9rem;
  color: var(--color-paper);
  background: rgba(0, 0, 0, 0.7);
  border: 1px solid rgba(255, 255, 255, 0.35);
  cursor: pointer;
}

.photo-dialog__close span {
  font-size: 1.25rem;
}

/* The lightbox layout: [prev arrow | image | next arrow]. */
.photo-dialog__stage {
  height: 100%;
  display: grid;
  grid-template-columns: 4rem minmax(0, 1fr) 4rem;
  align-items: center;
}

/* The image + caption stack in the middle. */
.photo-dialog figure {
  height: 100%;
  display: grid;
  grid-template-rows: minmax(0, 1fr) auto;
  margin: 0;
  overflow: hidden;
}

/* The lightbox image (fit inside without cropping). */
.photo-dialog figure img {
  width: 100%;
  height: 100%;
  min-height: 0;
  display: block;
  object-fit: contain;
}

/* The lightbox caption bar. */
.photo-dialog figcaption {
  display: grid;
  gap: 0.25rem;
  padding: 1.25rem 1.5rem;
  border-top: 1px solid rgba(255, 255, 255, 0.18);
}

.photo-dialog figcaption strong {
  font-size: 1.1rem;
}

.photo-dialog figcaption span {
  color: #bcb8b1;
  font-size: 0.85rem;
}

/* The prev/next round arrow buttons. */
.photo-dialog__nav {
  width: 3rem;
  height: 3rem;
  display: grid;
  place-items: center;
  justify-self: center;
  padding: 0;
  color: var(--color-paper);
  background: transparent;
  border: 1px solid rgba(255, 255, 255, 0.35);
  border-radius: 50%;
  cursor: pointer;
  transition: color var(--transition), background var(--transition);
}

/* Lightbox nav/close hover: gold fill. */
.photo-dialog__nav:hover,
.photo-dialog__nav:focus-visible,
.photo-dialog__close:hover,
.photo-dialog__close:focus-visible {
  color: var(--color-ink);
  background: var(--color-gold);
  border-color: var(--color-gold);
}

/* ".reveal" fade-up: hidden state (JS adds .is-reveal-ready to the body). */
.is-reveal-ready .reveal {
  opacity: 0;
  transform: translateY(2rem);
  transition: opacity 700ms cubic-bezier(0.22, 1, 0.36, 1), transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* ".reveal" fade-up: revealed state (JS adds .is-visible when it scrolls in). */
.is-reveal-ready .reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Tablet layout: collapse the two-column headings/grids to one column. */
@media (max-width: 1020px) {
  .home-hero__content,
  .conference-intro__heading,
  .audience__heading,
  .photo-story__heading {
    grid-template-columns: 1fr;
  }

  .home-hero__copy {
    max-width: 54rem;
  }

  .event-snapshot {
    width: min(100%, 32rem);
  }

  .conference-intro__heading .eyebrow {
    margin-bottom: 0;
  }

  .value-grid {
    grid-template-columns: 1fr 1fr;
  }

  .value-card:last-child {
    grid-column: 1 / -1;
    min-height: 23rem;
  }

  .audience-explorer__panel {
    grid-template-columns: 1fr;
  }

  .audience-explorer__content {
    min-height: 27rem;
  }

  .audience-explorer__index {
    margin-bottom: 3rem;
  }

  .logo-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* Phone layout: single columns everywhere, larger fluid headings, hide the
   scroll hint, faster marquee, etc. */
@media (max-width: 700px) {
  .home-hero {
    min-height: auto;
  }

  .home-hero__media img {
    object-position: 62% center;
  }

  .home-hero__shade {
    background: linear-gradient(0deg, rgba(8, 8, 8, 0.97) 0%, rgba(8, 8, 8, 0.68) 68%, rgba(8, 8, 8, 0.38));
  }

  .home-hero__content {
    padding-block: 7rem 5rem;
  }

  .home-hero h1 {
    font-size: clamp(3.25rem, 16vw, 5rem);
  }

  .home-hero__actions {
    align-items: stretch;
    flex-direction: column;
  }

  .home-hero__scroll {
    display: none;
  }

  .event-snapshot {
    width: 100%;
  }

  .momentum-strip__track {
    animation-duration: 18s;
  }

  .home-section h2,
  .home-cta h2 {
    font-size: clamp(2.7rem, 13vw, 4.25rem);
  }

  .conference-intro__heading,
  .boulder-film__heading,
  .collaborators__heading {
    grid-template-columns: 1fr;
  }

  .value-grid,
  .photo-grid {
    grid-template-columns: 1fr;
  }

  .value-card,
  .value-card:last-child {
    min-height: 25rem;
    grid-column: auto;
  }

  .audience-explorer__tabs {
    grid-template-columns: 1fr 1fr;
  }

  .audience-explorer__media {
    min-height: 21rem;
  }

  .audience-explorer__content {
    min-height: 29rem;
  }

  .boulder-film__frame {
    min-height: 31rem;
    aspect-ratio: auto;
  }

  .boulder-film video {
    object-fit: contain;
  }

  .boulder-film__overlay {
    align-items: flex-start;
    flex-direction: column;
    justify-content: flex-end;
  }

  .photo-card,
  .photo-card--wide {
    min-height: 29rem;
    grid-column: auto;
  }

  .logo-grid {
    grid-template-columns: 1fr;
  }

  .logo-card {
    min-height: 11rem;
  }

  .home-cta {
    min-height: 38rem;
  }

  .photo-dialog {
    width: 100vw;
    height: 100dvh;
    border: 0;
  }

  .photo-dialog__stage {
    grid-template-columns: 3.5rem minmax(0, 1fr) 3.5rem;
  }

  .photo-dialog__nav {
    width: 2.75rem;
    height: 2.75rem;
  }
}

/* Reduced-motion: stop the marquee, drop its overflow copies, and disable the
   hero parallax + reveal transitions. */
@media (prefers-reduced-motion: reduce) {
  .momentum-strip__track {
    width: 100%;
    justify-content: space-around;
    animation: none;
  }

  .momentum-strip__track span:nth-of-type(n + 5),
  .momentum-strip__track i:nth-of-type(n + 5) {
    display: none;
  }

  .home-hero__media {
    top: 0;
    bottom: 0;
  }

  .is-reveal-ready .reveal {
    opacity: 1;
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   Actions
   -------------------------------------------------------------------------- */

/* The primary gold call-to-action button used on the CONTENT (story) pages. */
.cta {
  display: inline-flex;
  align-items: center;
  gap: 0.7rem;
  padding: 1.05rem 1.7rem;
  color: var(--story-ink);
  background: var(--story-gold);
  border: 1px solid var(--story-gold);
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  text-decoration: none;
  transition: background 260ms var(--ease-out), color 260ms var(--ease-out);
}

/* CTA hover: invert to dark. */
.cta:hover,
.cta:focus-visible {
  color: var(--story-gold);
  background: var(--story-ink);
  border-color: var(--story-ink);
}

/* Larger CTA variant. */
.cta--large {
  padding: 1.35rem 2.4rem;
  font-size: 1.1rem;
}

/* The arrow glyph inside a CTA. */
.cta__mark {
  transition: transform 260ms var(--ease-out);
}

/* Nudge the arrow up-and-right on hover. */
.cta:hover .cta__mark,
.cta:focus-visible .cta__mark {
  transform: translate(0.2rem, -0.2rem);
}

/* --------------------------------------------------------------------------
   Editorial imagery
   Shared across every content page. The photographs are meant to carry the
   page, not decorate it, so these are built to be used at full width and at
   size — a band that interrupts the reading, and a scene that puts the
   heading onto the photograph rather than above it.

   Every photograph on this site is from the inaugural conference. Captions
   say so where it could otherwise be mistaken for the 2026 venue.
   -------------------------------------------------------------------------- */

/* A "band" is a full-width photograph that interrupts the reading flow. */
.band {
  position: relative;
  margin: 0;
  overflow: hidden;
  background: var(--story-ink);
}

/* The ratio goes on the image rather than the figure, so that a figcaption
   can sit underneath without being squeezed into the same box. */
/* height:auto is load-bearing. The width/height attributes on the element —
   which are kept so the browser can reserve space before the file arrives —
   act as a presentational hint, and without this the intrinsic height wins
   over the ratio below and the band renders at full photo height. */
.band > img {
  width: 100%;
  height: auto;
  display: block;
  object-fit: cover;
}

/* Band aspect-ratio variants (widest to least wide). */
.band--cinema > img {
  aspect-ratio: 24 / 9;
}

.band--wide > img {
  aspect-ratio: 21 / 9;
}

.band--half > img {
  aspect-ratio: 16 / 9;
}

/* Caption sits under the image on paper, so it reads as a note rather than
   as something printed onto the photograph. */
.band figcaption,
.caption {
  margin: 0.85rem 0 0;
  color: var(--story-muted);
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  line-height: 1.5;
  text-transform: uppercase;
}

/* A full-bleed band's caption still has to line up with the text column. */
.band figcaption {
  width: min(100% - (2 * var(--page-gutter)), var(--content-width));
  margin-inline: auto;
  padding-bottom: 1.25rem;
}

/* A scene is a chapter opening: the photograph fills the viewport band and
   the heading sits inside it. Used to break a long page into parts. */
/* A "scene" is a chapter opening: a photo band with the heading sitting inside
   it. Used to break long content pages into parts. */
.scene {
  position: relative;
  min-height: clamp(24rem, 56vh, 40rem);
  display: grid;
  align-items: end;
  overflow: hidden;
  isolation: isolate;
  color: var(--story-white);
  background: var(--story-ink);
}

/* The scene's background photo layer. */
.scene__media {
  position: absolute;
  z-index: -2;
  inset: 0;
}

.scene__media img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
}

/* Dark gradient over the scene photo so the heading stays legible. */
.scene__scrim {
  position: absolute;
  z-index: -1;
  inset: 0;
  background:
    linear-gradient(0deg, rgba(10, 10, 9, 0.92) 0%, rgba(10, 10, 9, 0.35) 52%, rgba(10, 10, 9, 0.12) 100%),
    linear-gradient(90deg, rgba(10, 10, 9, 0.55) 0%, transparent 65%);
}

/* The text block inside a scene. */
.scene__body {
  padding-block: clamp(2.5rem, 6vw, 4.5rem);
}

/* The scene's eyebrow label (with a leading dash via ::before). */
.scene__eyebrow {
  display: flex;
  align-items: center;
  gap: 0.65rem;
  margin: 0 0 1rem;
  color: var(--story-gold);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* The dash before the scene eyebrow. */
.scene__eyebrow::before {
  content: "";
  width: 1.75rem;
  height: 1px;
  background: currentColor;
}

/* The scene heading. */
.scene h2 {
  max-width: 20ch;
  margin: 0;
  font-size: clamp(2rem, 4.6vw, 3.9rem);
  font-weight: 700;
  letter-spacing: -0.045em;
  line-height: 0.98;
  text-wrap: balance;
}

/* The scene's supporting paragraph. */
.scene p {
  max-width: 50ch;
  margin: 1.1rem 0 0;
  color: rgba(255, 253, 248, 0.82);
  font-size: clamp(1.02rem, 1.4vw, 1.2rem);
  line-height: 1.6;
}

/* A framed figure for use inside a text column or grid. */
.frame {
  margin: 0;
  overflow: hidden;
  background: #e6ded0;
}

/* The image fills its frame. */
.frame > img,
.frame picture img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
}

/* Frame aspect-ratio variants. */
.frame--portrait {
  aspect-ratio: 4 / 5;
}

.frame--square {
  aspect-ratio: 1 / 1;
}

.frame--landscape {
  aspect-ratio: 3 / 2;
}

/* Two photographs side by side, for a beat that needs a pair rather than
   one image. Stacks on narrow screens (see the @media below). */
.pair {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(0.75rem, 1.5vw, 1.25rem);
}

/* Phone: shorter scenes, less-extreme band ratios, single-column pairs. */
@media (max-width: 760px) {
  .scene {
    min-height: 26rem;
  }

  .band--cinema > img,
  .band--wide > img {
    aspect-ratio: 16 / 10;
  }

  .pair {
    grid-template-columns: 1fr;
  }
}

/* --------------------------------------------------------------------------
   FAQ
   A heading beside a stack of disclosures. Light by default; add
   .faq--on-ink to the section to run it on the dark ground. Each page sets
   its own background, so the section can be slotted into whatever
   alternation that page is already running.
   -------------------------------------------------------------------------- */

/* The FAQ section wrapper. */
.faq {
  padding: clamp(5rem, 11vw, 8.5rem) 0;
}

/* Two columns: heading on the left, the Q&A list on the right. */
.faq__grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr);
  gap: clamp(2rem, 6vw, 5rem);
  align-items: start;
}

/* The FAQ heading. */
.faq h2 {
  margin: 0;
  font-size: clamp(2rem, 3.9vw, 3.4rem);
  font-weight: 700;
  letter-spacing: -0.045em;
  line-height: 1;
  text-wrap: balance;
}

/* Top border above the first question. */
.faq__body {
  border-top: 1px solid var(--story-line);
}

/* Each question is a native <details> element (.qa) — it opens/closes with no
   JavaScript. A divider line separates them. */
.qa {
  border-bottom: 1px solid var(--story-line);
}

/* The clickable question row (the <summary>). */
.qa summary {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1.5rem;
  padding: 1.2rem 0;
  font-size: clamp(1.02rem, 1.5vw, 1.2rem);
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1.35;
  cursor: pointer;
  list-style: none;                     /* hide the default triangle marker */
  transition: color 260ms var(--ease-out);
}

/* Also hide the default marker on WebKit/Safari (so we can use our own arrow). */
.qa summary::-webkit-details-marker {
  display: none;
}

/* Our custom chevron arrow at the end of each question (a rotated corner). */
.qa summary::after {
  content: "";
  width: 0.6rem;
  height: 0.6rem;
  flex: 0 0 auto;
  border-right: 2px solid var(--story-gold);
  border-bottom: 2px solid var(--story-gold);
  transform: translateY(-0.15rem) rotate(45deg);   /* points down */
  transition: transform 260ms var(--ease-out);
}

/* When the question is open, flip the chevron to point up. */
.qa[open] summary::after {
  transform: translateY(0.1rem) rotate(-135deg);
}

/* Question hover colour. */
.qa summary:hover {
  color: var(--story-gold-deep);
}

/* Keyboard focus ring on a question. */
.qa summary:focus-visible {
  outline: 3px solid var(--story-gold);
  outline-offset: 3px;
}

/* The answer paragraph. */
.qa p {
  max-width: 62ch;
  margin: 0 0 1.4rem;
  color: var(--story-muted);
  font-size: 1.02rem;
  line-height: 1.65;
}

/* Dark-background variant: add .faq--on-ink to the FAQ section to run it on a
   dark surface (recolours the borders and text). */
.faq--on-ink {
  color: var(--story-white);
  background: var(--story-ink);
}

.faq--on-ink .faq__body,
.faq--on-ink .qa {
  border-color: rgba(255, 253, 248, 0.18);
}

.faq--on-ink .qa summary:hover {
  color: var(--story-gold);
}

.faq--on-ink .qa p {
  color: rgba(255, 253, 248, 0.7);
}

/* Stack the FAQ into one column on narrow screens. */
@media (max-width: 900px) {
  .faq__grid {
    grid-template-columns: 1fr;
  }

  .faq__grid h2 {
    margin-bottom: 0.5rem;
  }
}

/* "Quiet link": an understated underlined link with an arrow that slides on
   hover. Used throughout the content pages. */
.quiet-link {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  padding-bottom: 0.4rem;
  color: var(--story-ink);
  border-bottom: 1px solid var(--story-line);
  font-size: 1.02rem;
  font-weight: 700;
  letter-spacing: -0.015em;
  text-decoration: none;
  transition: border-color 260ms var(--ease-out), color 260ms var(--ease-out);
}

/* The arrow glyph. */
.quiet-link span {
  transition: transform 260ms var(--ease-out);
}

/* Hover: gold text + border. */
.quiet-link:hover,
.quiet-link:focus-visible {
  color: var(--story-gold-deep);
  border-color: var(--story-gold);
}

/* Slide the arrow right on hover. */
.quiet-link:hover span,
.quiet-link:focus-visible span {
  transform: translateX(0.35rem);
}

/* Light variant for quiet links sitting on a dark (ink) surface. Shared here
   so every page that places one on dark shows it, not just the agenda page. */
.quiet-link--light {
  color: var(--story-white);
  border-color: rgba(255, 253, 248, 0.35);
}

.quiet-link--light:hover,
.quiet-link--light:focus-visible {
  color: var(--story-gold);
  border-color: var(--story-gold);
}

/* Shared keyboard focus ring for the main content-page controls. */
.cta:focus-visible,
.quiet-link:focus-visible,
.stand__tabs button:focus-visible {
  outline: 3px solid var(--story-gold);
  outline-offset: 4px;
}


/* --------------------------------------------------------------------------
   Analytics consent

   Anchored to the bottom of the viewport rather than covering the page: the
   question is worth asking, but it is not worth blocking the site behind.
   -------------------------------------------------------------------------- */

/* The cookie-consent banner (created by consent.js). Pinned to the bottom-left,
   deliberately small so it never blocks the page. */
.consent {
  position: fixed;
  z-index: 200;
  right: auto;
  bottom: 1rem;
  left: 1rem;
  width: min(calc(100% - 2rem), 24rem);
  color: var(--story-white);
  background: rgba(17, 17, 15, 0.97);
  border: 1px solid rgba(255, 253, 248, 0.18);
  border-radius: 4px;
  box-shadow: 0 0.8rem 2.2rem rgba(0, 0, 0, 0.22);
}

/* Inner padding/stack of the banner. */
.consent__inner {
  display: grid;
  gap: 0.85rem;
  padding: 1rem;
}

/* The banner message text. */
.consent__copy p {
  margin: 0;
  color: rgba(255, 253, 248, 0.72);
  font-size: 0.92rem;
  line-height: 1.55;
}

/* The little "Cookies" title. */
.consent__title {
  margin: 0 0 0.25rem !important;
  color: var(--story-white) !important;
  font-size: 0.72rem !important;
  font-weight: 700;
  letter-spacing: 0.13em;
  text-transform: uppercase;
}

/* The "Learn more" link. */
.consent__copy a {
  color: var(--story-gold);
  text-underline-offset: 0.2em;
}

/* The row of Accept / No-thanks buttons. */
.consent__actions {
  display: flex;
  gap: 0.6rem;
}

/* Both answers get equal visual weight — a decline styled as an afterthought is
   not really a free choice. */
.consent__button {
  padding: 0.58rem 0.9rem;
  color: var(--story-white);
  background: transparent;
  border: 1px solid rgba(255, 253, 248, 0.45);
  border-radius: 2px;
  font-size: 0.92rem;
  font-weight: 700;
  cursor: pointer;
  transition: background 260ms var(--ease-out), color 260ms var(--ease-out), border-color 260ms var(--ease-out);
}

/* Button hover. */
.consent__button:hover,
.consent__button:focus-visible {
  border-color: var(--story-white);
}

/* The "Accept" button is filled gold. */
.consent__button--accept {
  color: var(--story-ink);
  background: var(--story-gold);
  border-color: var(--story-gold);
}

.consent__button--accept:hover,
.consent__button--accept:focus-visible {
  background: var(--story-white);
  border-color: var(--story-white);
}

/* Widen the banner to nearly full-width on small phones. */
@media (max-width: 700px) {
  .consent {
    right: 0.75rem;
    bottom: 0.75rem;
    left: 0.75rem;
    width: auto;
  }

  .consent__button {
    flex: 1 1 0;
  }
}

/* --------------------------------------------------------------------------
   Scroll-driven sequences

   Shared by every page with one. Two variants off the same mechanism: with
   a sticky photograph that follows the steps, or with a progress rail for
   sequences that have no picture to give each step. See scrolly.js.
   -------------------------------------------------------------------------- */

/* A scroll-telling section: sticky media/aside column + the steps column. */
.scrolly {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
  gap: clamp(2rem, 6vw, 5rem);
  align-items: start;
}

/* Held below the site header, which is sticky and opaque, rather than at
   the top of the viewport. */
.scrolly__aside {
  position: sticky;
  top: calc(var(--header-height) + clamp(1.5rem, 4vw, 3rem));
}

/* The sticky photo frame. */
.scrolly__media {
  position: relative;
  margin: 0;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--story-ink);
}

/* The photo. */
.scrolly__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: opacity 620ms var(--ease-out), transform 1200ms var(--ease-out);
}

/* Mid-swap state (scrolly.js adds .is-swapping): fade+zoom while the src changes. */
.scrolly__media.is-swapping img {
  opacity: 0.25;
  transform: scale(1.04);
}

/* The rail fills as the sequence advances. --scrolly-progress is a 0-1
   fraction written by the script. */
.scrolly__progress {
  position: relative;
  height: 2px;
  margin-top: clamp(1.5rem, 3vw, 2.25rem);
  background: var(--story-line);
}

/* The filled portion of the rail (width driven by --scrolly-progress). */
.scrolly__progress::after {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: calc(var(--scrolly-progress, 0) * 100%);
  background: var(--story-gold-deep);
  transition: width 520ms var(--ease-out);
}

/* The list of steps. */
.scrolly__steps {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Muting is applied only once the script confirms it can undo it again. */
.has-scrolly .scrolly__step {
  opacity: 0.32;
  transition: opacity 620ms var(--ease-out);
}

.has-scrolly .scrolly__step.is-active {
  opacity: 1;
}

@media (max-width: 900px) {
  /* A sticky aside cannot earn its space here: it sits under an opaque
     header and leaves too little room to read the step beside it. Below
     this width the sequence is simply a list, and the photograph leads it. */
  .scrolly {
    grid-template-columns: 1fr;
  }

  .scrolly__aside {
    position: static;
  }

  .has-scrolly .scrolly__step {
    opacity: 1;
  }
}

/* --------------------------------------------------------------------------
   Motion — differentiated by element type, not one fade for everything.
   Text rises. Photographs unveil. Nothing else animates.
   -------------------------------------------------------------------------- */

/* ===== MOTION LAYER (see motion.js) =========================================
   Elements carrying data-rise / data-unveil / data-drift start hidden and
   animate in when motion.js adds the class .is-in as they scroll into view.
   The `body.is-motion-ready` prefix means these hidden states ONLY apply once
   JS has confirmed it can reveal them — so no-JS visitors see everything.
   There are two layers: this base layer, then a richer "kinetic" override
   layer further down that adds blur/direction per element type. ===== */

/* data-rise (base): start faded + shifted down, then rise into place. */
body.is-motion-ready [data-rise] {
  opacity: 0;
  transform: translateY(1.5rem);
  transition: opacity 720ms var(--ease-out), transform 720ms var(--ease-out);
}

/* data-rise revealed. */
body.is-motion-ready [data-rise].is-in {
  opacity: 1;
  transform: none;
}

/* data-unveil (base): the image is clipped to nothing, then wipes open. */
body.is-motion-ready [data-unveil] img {
  clip-path: inset(0 0 100% 0);
  transform: scale(1.08);
  transition: clip-path 1100ms var(--ease-out), transform 1400ms var(--ease-out);
}

/* data-unveil revealed. */
body.is-motion-ready [data-unveil].is-in img {
  clip-path: inset(0 0 0 0);
  transform: none;
}

/* A full-bleed backdrop sits behind type for as long as the reader is in
   front of it, so it gets a slow drift rather than an entrance. The range is
   deliberately small — at this duration the movement should register as the
   photograph breathing, not as a pan. It holds still until the scene is in
   view, so nothing is animating off screen before it has been reached. */
@keyframes scene-drift {
  from { transform: scale(1.03) translate3d(0, 0, 0); }
  to { transform: scale(1.09) translate3d(0, -1.2%, 0); }
}

/* data-drift: a slow, endless breathing zoom on backdrop photos. Paused until
   the element is in view (then .is-in sets it running). */
body.is-motion-ready [data-drift] img {
  transform: scale(1.03);
  animation: scene-drift 28s ease-in-out infinite alternate;
  animation-play-state: paused;
  will-change: transform;
}

/* Start the drift once the scene is in view. */
body.is-motion-ready [data-drift].is-in img {
  animation-play-state: running;
}

/* Kinetic motion layer: the existing hooks now reveal with more depth and
   direction while preserving every page's current grid and content order. */
body.is-motion-ready [data-rise] {
  --motion-order: 0;
  opacity: 0.001;
  transition-delay: calc(var(--motion-order) * 55ms);
}

/* Headings (motion.js tags them .motion-title): rise through a clip-path mask
   with a soft blur, staggered by --motion-order. NOTE: the blur here is the
   most GPU-costly part of the reveals — reduce/remove the `filter: blur` lines
   if you ever need to lighten the animation load. */
body.is-motion-ready [data-rise].motion-title {
  clip-path: inset(0 0 100% 0);
  filter: blur(4px);
  transform: translate3d(0, 5.5rem, 0) scale(0.985);
  transform-origin: left bottom;
  transition:
    opacity 720ms var(--ease-out),
    clip-path 900ms var(--ease-out),
    filter 700ms var(--ease-out),
    transform 900ms var(--ease-out);
  transition-delay: calc(var(--motion-order) * 55ms);
}

/* Paragraph/copy (.motion-copy): a quieter rise with a slight blur. */
body.is-motion-ready [data-rise].motion-copy {
  filter: blur(2px);
  transform: translate3d(0, 2.75rem, 0);
  transition:
    opacity 620ms var(--ease-out),
    filter 620ms var(--ease-out),
    transform 760ms var(--ease-out);
  transition-delay: calc(var(--motion-order) * 55ms);
}

/* Cards/figures (.motion-surface): rise + slight scale, no blur. */
body.is-motion-ready [data-rise].motion-surface {
  transform: translate3d(0, 3.25rem, 0) scale(0.975);
  transform-origin: center bottom;
  transition:
    opacity 620ms var(--ease-out),
    transform 850ms var(--ease-out);
  transition-delay: calc(var(--motion-order) * 55ms);
}

/* The shared "revealed" end-state for all kinetic rises. */
body.is-motion-ready [data-rise].is-in {
  clip-path: inset(0);
  filter: none;
  opacity: 1;
  transform: none;
}

/* Kinetic image unveil: desaturated + zoomed, wiping in from one side. */
body.is-motion-ready [data-unveil] img {
  filter: saturate(0.72) contrast(1.05);
  transform: scale(1.12) translate3d(-3%, 0, 0);
  transform-origin: left center;
  transition:
    clip-path 1050ms var(--ease-out),
    filter 900ms var(--ease-out),
    transform 1350ms var(--ease-out);
}

/* Wipe direction is set per-image by motion.js (alternating left/right). */
body.is-motion-ready [data-unveil][data-motion-direction="left"] img {
  clip-path: inset(0 100% 0 0);
}

body.is-motion-ready [data-unveil][data-motion-direction="right"] img {
  clip-path: inset(0 0 0 100%);
  transform: scale(1.12) translate3d(3%, 0, 0);
  transform-origin: right center;
}

/* Unveil revealed end-state. */
body.is-motion-ready [data-unveil].is-in img {
  clip-path: inset(0);
  filter: none;
  transform: none;
}

/* PAGE-OPEN INTRO (the first section of each content page, set up by motion.js).
   Hidden starting states while is-intro-ready is on the body... */
body.is-intro-ready .motion-intro-title,
body.is-intro-ready .motion-intro-item {
  opacity: 0.001;
}

/* The intro heading: masked + blurred + shifted, animating in. */
body.is-intro-ready .motion-intro-title {
  clip-path: inset(0 0 100% 0);
  filter: blur(5px);
  transform: translate3d(0, 7rem, 0) scale(0.98);
  transform-origin: left bottom;
  transition:
    opacity 700ms var(--ease-out),
    clip-path 1000ms var(--ease-out),
    filter 800ms var(--ease-out),
    transform 1000ms var(--ease-out);
}

/* The intro supporting items, staggered after the heading. */
body.is-intro-ready .motion-intro-item {
  filter: blur(2px);
  transform: translate3d(0, 3rem, 0);
  transition:
    opacity 620ms var(--ease-out),
    filter 700ms var(--ease-out),
    transform 820ms var(--ease-out);
  transition-delay: calc((var(--motion-order, 0) * 80ms) + 160ms);
}

/* ...revealed once motion.js swaps is-intro-ready for is-intro-entered. */
body.is-intro-entered .motion-intro-title,
body.is-intro-entered .motion-intro-item {
  clip-path: inset(0);
  filter: none;
  opacity: 1;
  transform: none;
}

/* MAGNETIC BUTTONS: the --magnet-x/y variables are set by motion.js from the
   cursor position; `translate` nudges the button toward the pointer. */
.motion-magnetic {
  --magnet-x: 0px;
  --magnet-y: 0px;
  translate: var(--magnet-x) var(--magnet-y);
  transition: translate 180ms var(--ease-out);
}

/* Promote to its own layer only while the pointer is engaged, so idle
   buttons don't each hold a compositor layer for the life of the page. */
.motion-magnetic.is-magnet-active {
  will-change: translate;
}

/* The header slides down + fades in once on page load. */
@keyframes header-arrive {
  from { opacity: 0.001; transform: translate3d(0, -1.25rem, 0); }
  to { opacity: 1; transform: none; }
}

.site-header {
  animation: header-arrive 620ms var(--ease-out) both;
}

/* Reduced motion: cancel the header entrance, the magnet, and all intro
   animations (show everything in its final state immediately). */
@media (prefers-reduced-motion: reduce) {
  .site-header { animation: none; }

  .motion-magnetic {
    translate: 0 0;
    will-change: auto;
  }

  body.is-intro-ready .motion-intro-title,
  body.is-intro-ready .motion-intro-item {
    clip-path: none;
    filter: none;
    opacity: 1;
    transform: none;
  }
}
