/* ═══════════════════════════════════════════════════════════════════════════
   site.css
   ───────────
   Single global stylesheet for the real estate portfolio site.

   Contains:
     1. CSS custom properties (color tokens, spacing scale, typography scale)
     2. Reset + base typography
     3. Pixel cursor system
     4. Page-section patterns (hero, project title bars, meta rows, 2-col text,
        horizontal scroll grids, persona grids, booklet grids, stacked screens,
        flow diagrams, etc.)
     5. Scroll-reveal animation system
     6. Responsive breakpoint scaling

   Naming convention:
     Many class names reference real estate portfolio sections (.bates-, .julie-,
     .ipg-, .ahw-, .stack-) but the underlying CSS patterns are general-purpose
     and reusable. When you build a non-real-estate page, just apply the same
     class names where the pattern fits. Renaming to pattern-first names (e.g.
     .text-2col, .horizontal-scroll, .persona-grid) is a future cleanup.

   To use on a new page:
     <link rel="stylesheet" href="site.css">
═══════════════════════════════════════════════════════════════════════════ */

  /* TOKENS — exact from Figma */
  :root {
    --color-orange-9: #1A1714;
    --color-orange-9-15: rgba(25, 23, 20, 0.15);
    --color-orange-9-25: rgba(25, 23, 20, 0.25);
    --color-orange-9-75: rgba(25, 23, 20, 0.75);
    --color-orange-9-97: rgba(25, 23, 20, 0.97);
    --color-orange-15: #2A2520;
    --color-orange-15-15: rgba(42, 37, 32, 0.15);
    --color-orange-4: #0D0B08;
    --color-orange-54: #F47B20;
    --color-grey-91: #F2ECE0;
    --color-grey-91-35: rgba(242, 236, 224, 0.35);
    --color-grey-91-55: rgba(242, 236, 224, 0.55);
    --color-grey-91-80: rgba(242, 236, 224, 0.80);
    --color-grey-57: #9A9088;
    --color-white-solid: #FFFFFF;
    --LF-Gray: #D9D9D9;

    /* Responsive horizontal padding.
       Desktop default: 85px min, centers content at 1600px on wide screens.
       Tablet override sets min to 48px; mobile to 24px (see media queries). */
    --pad-min: 85px;
    --content-pad-x: max(var(--pad-min), calc((100% - 1600px) / 2 + var(--pad-min)));

    /* Vertical spacing scale (8-point grid).
       Used to establish consistent rhythm between sections, subsections, and content blocks.
       Mobile/tablet overrides scale these down (see media queries). */
    --space-xs: 24px;   /* tight: header to its accompanying image, body to next paragraph */
    --space-s:  40px;   /* related blocks within a subsection */
    --space-m:  64px;   /* between subsections (e.g. Research grid → Personas header) */
    --space-l:  96px;   /* between project sections (Bates → IPG, etc.) */
  }

  * { box-sizing: border-box; margin: 0; padding: 0; }
  html, body { width: 100%; }
  body {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    background: var(--color-grey-91);
    color: var(--color-orange-15);
    -webkit-font-smoothing: antialiased;
    overflow-x: hidden;
    cursor: none;
  }
  img { display: block; max-width: 100%; }

  /* Global body paragraph. Used across every page (real estate, MTBK, future).
     Per-section <p> rules below should only override `color` when the section
     bg requires it — they should NOT redeclare family/size/weight/line-height.
     If you need a non-paragraph 20px text block, use a class (e.g. .brief-text). */
  p {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 20px;
    font-weight: 400;
    line-height: 28px;
    color: var(--color-orange-4);
  }

  /* ============================================================
     PIXEL CURSOR — small orange square that follows the mouse,
     with a fading particle trail rendered to a fullscreen canvas.
     Disabled on touch devices and reduced-motion users.
     ============================================================ */
  #cur {
    position: fixed;
    z-index: 9999;
    pointer-events: none;
    left: -20px;
    top: -20px;
    width: 8px;
    height: 8px;
    background: var(--color-orange-54);
    transform: translate(-50%, -50%);
    transition: background 150ms ease, outline 120ms ease, width 120ms ease, height 120ms ease;
  }
  #cur.big {
    background: var(--color-orange-4);
    outline: 1.5px solid var(--color-orange-54);
    outline-offset: 3px;
  }
  #trail-canvas {
    position: fixed;
    inset: 0;
    z-index: 9990;
    pointer-events: none;
  }

  /* Restore native cursor on touch devices */
  @media (pointer: coarse) {
    body { cursor: auto; }
    #cur, #trail-canvas { display: none; }
  }

  /* Restore native cursor for users who prefer reduced motion */
  @media (prefers-reduced-motion: reduce) {
    body { cursor: auto; }
    #cur, #trail-canvas { display: none; }
  }

  /* Inputs/textareas should hide the custom cursor too */
  input, textarea, select { cursor: none; }

  .page {
    width: 100%;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
  }

  /* PLACEHOLDERS — all red per the new mockup */
  .ph {
    background: #FF0000;
    overflow: hidden;
  }

  /* ============================================================
     IMAGE-AS-PLACEHOLDER
     When you swap a <div class="ph"></div> for a real <img> inside a grid
     container, the image needs to behave like the placeholder did:
       - Fill the cell at its full width
       - Cover the cell area without distorting (object-fit: cover)
       - Inherit the cell's aspect-ratio from the grid's .ph rule
     This block applies that behavior to direct-child <img> tags inside
     each of the project grid containers. The original .ph rules above
     keep working unchanged (so any remaining placeholders still render).
     ============================================================ */
  .research-grid > img,
  .personas-grid > img,
  .booklets-grid > img,
  .booklets-hero > img,
  .ipg-deck-grid > img,
  .ipg-wide > img,
  .website-design-left > img,
  .website-design-right > img,
  .julie-details > img,
  .julie-mobile-strip > img,
  .julie-hero-right > img,
  .stack-screens > img,
  .pdf-grid > img,
  .bates-hero-image > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }
  /* Match the grid cell's aspect-ratio so the image fills exactly the
     same footprint a placeholder would have. The aspect-ratio per grid
     comes from each grid's existing .ph rule (defined later in this file). */
  .research-grid > img        { width: 443px; height: 342px; flex: 0 0 443px; scroll-snap-align: start; }
  .personas-grid > img        { aspect-ratio: 603.25 / 334.08; }
  .booklets-grid > img        { aspect-ratio: 405 / 308; }
  .booklets-hero > img        { aspect-ratio: 1270 / 708.23; }
  .ipg-deck-grid > img        { aspect-ratio: 404.83 / 312.87; }
  .ipg-wide > img             { aspect-ratio: 1270 / 715; }
  .julie-details > img        { aspect-ratio: 615 / 747; }
  .julie-mobile-strip > img   { aspect-ratio: 396 / 808.27; }
  .julie-hero-right > img     { aspect-ratio: 615 / 747; }
  .stack-screens > img        { aspect-ratio: 262 / 431; }
  .pdf-grid > img             { aspect-ratio: 615 / 788.82; }
  .bates-hero-image > img     { aspect-ratio: 1270 / 749.42; }
  /* website-design phones (left) and map (right) — the parent grid cells
     have explicit dimensions, so the image just fills 100% of those cells */
  .website-design-left > img,
  .website-design-right > img { width: 100%; height: 100%; }

  /* ============================================================
     HERO
     ============================================================ */
  .hero {
    align-self: stretch;
    min-height: 100vh;
    padding-top: clamp(120px, 25vh, 267.66px);
    background: var(--color-orange-9);
    border-bottom: 1px solid var(--color-orange-15);
    overflow: hidden;
    position: relative;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
  }
  @media (min-width: 1024px) { .hero { min-height: 848px; } }
  .hero-bg {
    position: absolute;
    inset: 0;
    overflow: hidden;
    /* Fallback gradient — visible while video loads or if it fails to play */
    background: linear-gradient(135deg, #3a2a1f 0%, #1a1410 40%, #0d0b08 100%);
  }
  .hero-video {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /* Cover the hero area while preserving 16:9 aspect ratio */
    min-width: 100%;
    min-height: 100%;
    width: auto;
    height: auto;
    object-fit: cover;
    opacity: 0.65;
    pointer-events: none;
  }
  .hero-overlay {
    position: absolute; inset: 0;
    background: linear-gradient(180deg,
      var(--color-orange-9-15) 0%,
      var(--color-orange-9-25) 40%,
      var(--color-orange-9-75) 70%,
      var(--color-orange-9-97) 100%);
  }
  .hero-content {
    align-self: stretch;
    min-height: clamp(360px, 60vh, 561.34px);
    padding: 48px var(--content-pad-x) 40px;
    position: relative;
    z-index: 2;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    align-items: flex-start;
    gap: 24px;
  }
  .hero-eyebrow {
    align-self: stretch;
    display: flex;
    align-items: center;
    gap: 9.59px;
  }
  .hero-eyebrow-line { width: 20px; height: 0.5px; background: var(--color-orange-54); }
  .hero-eyebrow-text {
    color: var(--color-grey-91-35);
    font-family: "Courier Prime", monospace;
    font-size: 9px;
    font-weight: 400;
    letter-spacing: 1.8px;
    text-transform: uppercase;
  }
  .hero-display {
    align-self: stretch;
    padding-bottom: 0.6px;
    display: flex;
    flex-direction: column;
    gap: 12.89px;
  }
  .hero-title {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(56px, 9vw, 120px);
    line-height: 0.88;
    font-weight: 700;
    max-width: 900px;
  }
  .hero-title .white { color: var(--color-grey-91); }
  .hero-title .orange-italic {
    color: var(--color-orange-54);
    font-style: italic;
    font-weight: 400;
  }
  .hero-sub {
    width: 100%;
    max-width: 395px;
    color: var(--color-grey-91);
    font-size: 20px;
    font-family: "Helvetica Neue";
    font-weight: 400;
    line-height: 28px;
  }
  .hero-spacer { flex: 1; min-height: 16.7px; }

  /* ============================================================
     WHO I HAVE WORKED WITH — tight 4-column row
     ============================================================ */
  .audience {
    width: 100%;
    padding: var(--space-m) var(--content-pad-x);
    background: var(--color-orange-4);
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .audience-headline {
    align-self: stretch;
    padding-bottom: 32px;
  }
  .audience-headline h2 {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.05;
  }
  .audience-headline .white { color: var(--color-grey-91); }
  .audience-headline .orange { color: var(--color-orange-54); }

  .audience-cols {
    align-self: stretch;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    column-gap: 32px;
  }
  .aud-col {
    padding-top: 20px;
    border-top: 1px solid var(--color-orange-54);
    display: flex;
    flex-direction: column;
    gap: 3px;
  }
  .aud-badge {
    width: 32px;
    height: 32px;
    background: var(--color-orange-54);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 11px;
    font-weight: 700;
    line-height: 16.5px;
    letter-spacing: 0.22px;
  }
  .aud-title {
    padding-top: 9px;
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 20px;
    font-weight: 700;
    line-height: 23px;
  }
  .aud-body {
    padding-top: 8px;
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 16px;
    font-weight: 400;
    line-height: 24.8px;
  }

  /* ============================================================
     PROJECT TITLE BAR (with tagline + badge meta row)
     ============================================================ */
  .project-title-bar {
    width: 100%;
    padding: var(--space-l) var(--content-pad-x) var(--space-xs);
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .project-title-bar.bates-bg { background: var(--LF-Gray); }
  .project-title-bar.ipg-bg { background: var(--color-orange-4); }
  .project-title-bar.julie-bg { background: var(--color-grey-91); }
  .project-title-bar.ahw-bg { background: var(--color-orange-9); }
  .project-title {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(40px, 5.5vw, 72px);
    font-weight: 700;
    line-height: 0.92;
  }
  .project-title .ink { color: var(--color-orange-15); }
  .project-title .ink-deep { color: var(--color-orange-4); }
  .project-title .orange { color: var(--color-orange-54); }
  .project-title .cream { color: var(--color-grey-91); }

  /* Meta row: 56px badge + tagline (Figma exact: 24px gap) */
  .meta-row-wrap {
    width: 100%;
    padding: 0 var(--content-pad-x);
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
  .meta-row-wrap.bates-bg { background: var(--LF-Gray); }
  .meta-row-wrap.ipg-bg { background: var(--color-orange-4); }
  .meta-row {
    align-self: stretch;
    padding: var(--space-xs) 0 var(--space-m);
    display: flex;
    align-items: center;
    gap: 24px;
  }
  .badge56 {
    width: 56px;
    height: 56px;
    background: var(--color-orange-54);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 18px;
    font-weight: 700;
    line-height: 27px;
  }
  .tagline {
    flex: 1;
    min-width: 0;
    max-width: 487.83px;
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 18px;
    font-weight: 500;
    line-height: 23.4px;
  }
  .tagline.ink { color: var(--color-orange-4); }
  .tagline.cream { color: var(--color-grey-91); }

  /* ============================================================
     SECTION 48 SUBHEADER (Research, Personas, Printed, etc.)
     ============================================================ */
  .section-48 {
    width: 100%;
    padding: var(--space-m) var(--content-pad-x) var(--space-xs);
    display: flex;
    align-items: center;
  }
  .section-48.bates-bg { background: var(--LF-Gray); }
  .section-48.ipg-bg { background: var(--color-orange-4); }
  .section-48 .h48 {
    padding-top: 13.59px;
    padding-bottom: 1px;
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.2;
  }
  .h48 .orange { color: var(--color-orange-54); }
  .h48 .ink { color: var(--color-orange-4); }
  .h48 .ink-15 { color: var(--color-orange-15); }
  .h48 .cream { color: var(--color-grey-91); }
  .h48 .space { color: var(--color-grey-91); }

  /* Body paragraph rows under the section-48 headers */
  .section-body-row {
    width: 100%;
    padding: 0 var(--content-pad-x) var(--space-s);
    display: flex;
    align-items: center;
  }
  .section-body-row.bates-bg { background: var(--LF-Gray); }
  .section-body-row.ipg-bg { background: var(--color-orange-4); }
  .section-body-row p {
    flex: 1;
  }
  .section-body-row.ipg-bg p { color: var(--color-white-solid); }
  .section-body-row.bates-bg p { color: var(--color-orange-4); }

  /* ============================================================
     BATES — single hero image + 2-col text block
     ============================================================ */
  .bates-section { background: var(--LF-Gray); }

  /* The big hero image area — Figma: 1270×749 */
  .bates-hero-image {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--LF-Gray);
  }
  .bates-hero-image .ph {
    width: 100%;
    aspect-ratio: 1270 / 749.42;
  }

  /* 2-column text block */
  .bates-text-2col {
    width: 100%;
    padding: var(--space-s) var(--content-pad-x) 0;
    background: var(--LF-Gray);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 48px;
  }
  .bates-block {
    display: flex;
    flex-direction: column;
    gap: 16px;
  }
  .bates-block h3 {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    color: var(--color-orange-15);
    font-size: clamp(24px, 2.6vw, 32px);
    font-weight: 700;
    line-height: 1.1;
    padding-top: 0.7px;
  }
  /* .bates-block p: inherits all typography from the global p rule. */

  /* ============================================================
     RESEARCH GRID — horizontal scroll with desktop enhancements
     - Drag-to-scroll on pointer:fine devices
     - Edge fade gradients
     - Arrow buttons that appear on hover
     - Scroll-snap on card edges
     - Subtle scale on hover
     ============================================================ */
  .research-imagery {
    width: 100%;
    padding: 0 0 0;
    background: var(--LF-Gray);
    position: relative;
    overflow: hidden;
  }

  .research-scroll {
    width: 100%;
    overflow-x: auto;
    /* scroll-padding ensures snap targets line up with the content margin */
    scroll-padding-left: var(--content-pad-x);
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    /* Hide native scrollbar on desktop where we have our own affordances */
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  .research-scroll::-webkit-scrollbar { display: none; }

  .research-grid {
    display: grid;
    grid-template-columns: repeat(6, 443px);
    grid-template-rows: 342px 342px;
    column-gap: 36px;
    row-gap: 36px;
    width: max-content;
    /* Padding here (NOT on the scroll container) so the first card starts at the
       content margin and the last card has matching breathing room at the end */
    padding-left: var(--content-pad-x);
    padding-right: var(--content-pad-x);
  }
  .research-grid .ph {
    width: 443px;
    height: 342px;
    scroll-snap-align: start;
    transition: transform 280ms ease, opacity 280ms ease, box-shadow 280ms ease;
  }

  /* Desktop / fine-pointer enhancements only — and only at viewports wide enough
     that the cards aren't getting clipped awkwardly */
  @media (hover: hover) and (pointer: fine) and (min-width: 900px) {
    /* When hovering anywhere in the section, dim non-hovered cards so the
       focused one pops. Applies to both .ph placeholders and real <img>s. */
    .research-imagery:hover .research-grid .ph,
    .research-imagery:hover .research-grid > img {
      opacity: 0.78;
      transform: scale(0.985);
    }
    .research-imagery:hover .research-grid .ph:hover,
    .research-imagery:hover .research-grid > img:hover {
      opacity: 1;
      transform: scale(1);
      box-shadow: 0 12px 40px rgba(13, 11, 8, 0.18);
    }
  }

  /* Arrow buttons — always visible on desktop (only scroll mechanism since
     drag was removed). Hidden via display:none on mobile (touch-swipe instead). */
  .research-arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 56px;
    height: 56px;
    border-radius: 50%;
    background: var(--color-orange-4);
    color: var(--color-grey-91);
    border: none;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 3;
    opacity: 0.85;
    transition: opacity 200ms ease, transform 200ms ease, background 200ms ease;
    box-shadow: 0 4px 16px rgba(13, 11, 8, 0.25);
  }
  .research-arrow:hover {
    background: var(--color-orange-54);
    opacity: 1;
    transform: translateY(-50%) scale(1.06);
  }
  .research-arrow:active {
    transform: translateY(-50%) scale(0.96);
  }
  .research-arrow svg {
    width: 20px;
    height: 20px;
    stroke: currentColor;
    stroke-width: 2;
    fill: none;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
  .research-arrow.prev { left: 24px; }
  .research-arrow.next { right: 24px; }

  /* Below 900px, hide arrow buttons entirely and let native scroll take over */
  @media (max-width: 899px) {
    .research-arrow { display: none; }
    .research-scroll {
      scrollbar-width: thin;
      -ms-overflow-style: auto;
      cursor: auto;
    }
    .research-scroll::-webkit-scrollbar {
      display: block;
      height: 6px;
    }
    .research-scroll::-webkit-scrollbar-thumb {
      background: var(--color-orange-15-15);
      border-radius: 3px;
    }
  }

  /* Disabled state — at start/end of scroll */
  .research-imagery[data-at-start="true"] .research-arrow.prev,
  .research-imagery[data-at-end="true"] .research-arrow.next {
    opacity: 0 !important;
    pointer-events: none;
  }

  /* On touch devices (coarse pointer), restore native scrollbar and disable enhancements */
  @media (pointer: coarse) {
    .research-scroll {
      scrollbar-width: thin;
      -ms-overflow-style: auto;
      cursor: auto;
    }
    .research-scroll::-webkit-scrollbar {
      display: block;
      height: 6px;
    }
    .research-scroll::-webkit-scrollbar-thumb {
      background: var(--color-orange-15-15);
      border-radius: 3px;
    }
    .research-arrow { display: none; }
  }

  /* Reduced motion: disable transitions and snap */
  @media (prefers-reduced-motion: reduce) {
    .research-scroll { scroll-snap-type: none; scroll-behavior: auto; }
    .research-grid .ph,
    .research-grid > img { transition: none; }
    .research-imagery:hover .research-grid .ph,
    .research-imagery:hover .research-grid .ph:hover,
    .research-imagery:hover .research-grid > img,
    .research-imagery:hover .research-grid > img:hover {
      transform: none;
      opacity: 1;
    }
    .research-arrow { transition: opacity 100ms linear; }
  }

  /* ============================================================
     PERSONAS — 2×2 equal cards
     ============================================================ */
  .personas-grid {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--LF-Gray);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-s);
    row-gap: var(--space-s);
  }
  .personas-grid .ph {
    width: 100%;
    aspect-ratio: 603.25 / 334.08;
  }

  /* ============================================================
     PRINTED OFFERING BOOKLETS
     ============================================================ */
  .booklets-hero {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--LF-Gray);
  }
  .booklets-hero .ph {
    width: 100%;
    aspect-ratio: 1270 / 708.23;
  }
  /* Video frame for the booklets hero — 16:9 autoplay loop */
  .booklets-hero .video-frame {
    width: 100%;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: var(--color-orange-15);
    position: relative;
  }
  .booklets-hero .video-frame video,
  .booklets-hero .video-frame img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }
  .booklets-grid {
    width: 100%;
    padding: var(--space-s) var(--content-pad-x) 0;
    background: var(--LF-Gray);
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: var(--space-s);
    row-gap: var(--space-s);
  }
  .booklets-grid .ph {
    width: 100%;
    aspect-ratio: 405 / 308;
  }

  /* ============================================================
     WEBSITE DESIGN — 4 small phones on left + big map on right
     ============================================================ */
  .website-design {
    width: 100%;
    padding: 0 var(--content-pad-x) var(--space-l);
    background: var(--LF-Gray);
    display: grid;
    grid-template-columns: 432px 1fr;
    column-gap: var(--space-s);
  }
  .website-design-left {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 374px 374px;
    column-gap: 25px;
    row-gap: 49px;
  }
  .website-design-left .ph {
    width: 100%;
    aspect-ratio: 182 / 374;
  }
  .website-design-right .ph {
    width: 100%;
    aspect-ratio: 757 / 876.45;
  }

  /* ============================================================
     IPG SECTION
     ============================================================ */
  .ipg-section {
    background: var(--color-orange-4);
    padding-bottom: var(--space-l);
  }

  /* IPG Deck — 3×3 grid */
  .ipg-deck-grid {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--color-orange-4);
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: var(--space-xs);
    row-gap: var(--space-xs);
  }
  .ipg-deck-grid .ph {
    width: 100%;
    aspect-ratio: 404.83 / 312.87;
  }

  /* IPG spacer (kept for legacy markup; now zero height) */
  .ipg-spacer { display: none; }

  /* Custom Pop-Up Card row — text left, image grid right (Figma: 615 + 615, gap 40px) */
  .ipg-popup {
    width: 100%;
    padding: var(--space-m) var(--content-pad-x) 0;
    background: var(--color-orange-4);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-s);
    align-items: flex-start;
  }
  .ipg-popup-left {
    display: flex;
    flex-direction: column;
    gap: var(--space-s);
  }
  .ipg-popup-left .h48 {
    padding-top: 13.59px;
    padding-bottom: 1px;
    font-family: "Helvetica Neue";
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.2;
  }
  .ipg-popup-left p {
    color: var(--color-grey-91);
  }
  .ipg-popup-right {
    display: flex;
    flex-direction: column;
    gap: var(--space-s);
  }
  .ipg-popup-right .grow-logo {
    width: 100%;
    aspect-ratio: 615 / 205;
  }
  .ipg-popup-right .pair {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-s);
  }
  .ipg-popup-right .pair .ph {
    width: 100%;
    aspect-ratio: 290 / 163;
  }

  /* Two wide IPG images */
  .ipg-wide {
    width: 100%;
    padding: var(--space-m) var(--content-pad-x) 0;
    background: var(--color-orange-4);
  }
  .ipg-wide .ph {
    width: 100%;
    aspect-ratio: 1270 / 715;
  }
  .ipg-wide.bottom {
    padding: var(--space-s) var(--content-pad-x) 0;
  }
  .ipg-wide.bottom .ph {
    aspect-ratio: 1270 / 716;
  }
  /* Modifier: when the .ipg-wide pattern is reused outside the IPG section,
     override the dark background. Used in the Bates section for the website
     design wide image. Also adds bottom padding because this is the last
     element in the Bates section (the original .ipg-wide has 0 bottom padding
     because it stacks with .ipg-wide.bottom in the IPG layout). */
  .ipg-wide.bates-bg {
    background: var(--LF-Gray);
    padding-bottom: var(--space-m);
  }
  /* The Bates web-design collage is taller than the IPG section's 16:9 wide
     images. Override the aspect-ratio so the container fits the image's
     natural proportions. The image is 2541×1814 (≈ 1.40 ratio). */
  .ipg-wide.bates-bg > img {
    aspect-ratio: 2541 / 1814;
    height: auto;
  }

  /* ============================================================
     JULIE HOPKINS — cream bg, full custom layout
     ============================================================ */
  .julie-section {
    align-self: stretch;
    padding: var(--space-l) 0;
    background: var(--color-grey-91);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    gap: var(--space-m);
  }

  /* Hero row: 2-col, text left + image right */
  .julie-hero {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--color-grey-91);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-s);
    align-items: flex-start;
  }
  .julie-hero-left {
    display: flex;
    flex-direction: column;
    gap: 40px;
  }
  .julie-name-block {
    display: flex;
    flex-direction: column;
    gap: 24px;
    padding-top: 13.59px;
    padding-bottom: 1px;
  }
  .julie-name-row {
    display: flex;
    align-items: center;
    gap: 24px;
  }
  .julie-content {
    padding-bottom: 102.97px;
    display: flex;
    flex-direction: column;
    gap: 15.3px;
  }
  .julie-content .h48-line {
    font-family: "Helvetica Neue";
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.2;
  }
  .julie-content .h48-line .ink { color: var(--color-orange-4); }
  .julie-content .h48-line .orange { color: var(--color-orange-54); }
  .julie-content p {
    padding-top: 0.69px;
  }
  .julie-hero-right .ph {
    width: 100%;
    aspect-ratio: 615 / 747;
  }

  /* 2-up details */
  .julie-details {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--color-grey-91);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-s);
  }
  .julie-details .ph {
    width: 100%;
    aspect-ratio: 615 / 747;
  }

  /* 6-up mobile strip — Figma: 6 phones at 396×808.27, flex-wrap row.
     With justify-content: center and 40px gap, 3 phones fit per row × 2 rows. */
  .julie-mobile-strip {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--color-grey-91);
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: var(--space-s);
    row-gap: var(--space-s);
  }
  .julie-mobile-strip .ph {
    width: 100%;
    aspect-ratio: 396 / 808.27;
  }

  /* Brief stack — 3 horizontal columns that align exactly to the 3 phone columns above.
     Uses 1fr columns with the same 40px gap as julie-mobile-strip so they share grid lines. */
  .julie-brief-stack {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--color-grey-91);
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: var(--space-s);
    align-items: flex-start;
  }
  .brief-block {
    display: flex;
    flex-direction: column;
    gap: 14.78px;
  }
  .brief-block.bottom {
    padding-bottom: 86.16px;
    gap: 16px;
  }
  .brief-divider {
    padding: 16px 0;
    border-bottom: 1px solid var(--color-orange-54);
  }
  .brief-divider span {
    color: var(--color-orange-54);
    font-family: "Courier Prime", monospace;
    font-size: 14px;
    font-weight: 700;
    text-transform: uppercase;
    line-height: 15px;
    letter-spacing: 1.5px;
  }
  /* .brief-text: inherits all typography from the global p rule. */
  .deliverables {
    height: 93px;
    position: relative;
  }
  .deliverable-tag {
    position: absolute;
    height: 27px;
    padding: 5px 10px;
    border: 1px solid var(--color-orange-15-15);
    color: var(--color-orange-15);
    font-family: "Courier Prime", monospace;
    font-size: 10px;
    font-weight: 400;
    text-transform: uppercase;
    line-height: 15px;
    letter-spacing: 1px;
    display: flex;
    align-items: center;
  }

  /* ============================================================
     ACCLAIMED HOME WARRANTY — dark
     ============================================================ */
  .ahw-section {
    align-self: stretch;
    /* True 16:9 aspect ratio matching the video's native ratio.
       Min-height: 100vw * 9/16 = 56.25vw so the section is exactly 16:9 of the viewport.
       Capped at 900px so on ultra-wide monitors it doesn't get absurdly tall. */
    min-height: min(56.25vw, 900px);
    padding: var(--space-l) var(--content-pad-x);
    background: var(--color-orange-9);
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 12px;
    position: relative;
    overflow: hidden;
  }
  /* Fullbleed background video — fills the section, behind content */
  .ahw-section > .ahw-bg-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    /* object-fit: contain shows the full video without cropping —
       any extra space on top/bottom is filled by the section's bg color. */
    object-fit: cover;
    object-position: center 30%;
    z-index: 0;
    opacity: 0.55;
  }
  /* Gradient overlay — keeps the headline + badge readable over any footage */
  .ahw-section::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(135deg,
      var(--color-orange-9-75) 0%,
      var(--color-orange-9-25) 50%,
      var(--color-orange-9-75) 100%);
    z-index: 1;
    pointer-events: none;
  }
  /* Lift the content above the video + overlay (header content only, not the video) */
  .ahw-section > .ahw-header {
    position: relative;
    z-index: 2;
  }
  .ahw-header {
    align-self: stretch;
    padding-bottom: 48px;
    display: flex;
    flex-direction: column;
    gap: 23.36px;
  }
  .ahw-meta {
    display: flex;
    align-items: center;
    gap: 16px;
  }
  .badge72 {
    width: 72px;
    height: 72px;
    background: var(--color-orange-54);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 18px;
    font-weight: 700;
    line-height: 27px;
  }
  .ahw-meta-text {
    display: flex;
    flex-direction: column;
  }
  .ahw-meta-text .name {
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 13px;
    font-weight: 500;
    line-height: 20.8px;
  }
  .ahw-meta-text .role {
    color: var(--color-grey-91-55);
    font-family: "Courier Prime", monospace;
    font-size: 10px;
    font-weight: 400;
    text-transform: uppercase;
    line-height: 16px;
    letter-spacing: 1.5px;
  }

  /* THE STACK — flow LEFT + screens stack RIGHT */
  .stack-section {
    width: 100%;
    padding: 80px var(--content-pad-x) 60px;
    background: var(--LF-Gray);
    display: flex;
    flex-direction: column;
    gap: 24px;
  }
  .stack-headline {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.05;
  }
  .stack-headline .ink { color: var(--color-orange-15); }
  .stack-headline .orange { color: var(--color-orange-54); }
  /* .stack-body: inherits all typography from the global p rule.
     A second .stack-body rule below adds align-self: stretch for the flex layout. */
  /* THE STACK — matches Figma exactly:
     - Outer: vertical flex
     - .stack-inner: 2-column layout (left text+flow, right screens grid)
     - LEFT column (380px wide): headline + body + flow diagram, stacked with gap: 24px
     - RIGHT column (rest): 3×3 grid of 262×431 screens with 12px gaps */
  .stack-section {
    width: 100%;
    padding: var(--space-l) var(--content-pad-x);
    background: var(--LF-Gray);
    display: flex;
    flex-direction: column;
  }
  .stack-inner {
    align-self: stretch;
    display: grid;
    grid-template-columns: 380px 1fr;
    column-gap: 80px;
    align-items: flex-start;
  }
  .stack-content {
    width: 380px;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-xs);
  }
  .stack-headline {
    align-self: stretch;
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.05;
  }
  .stack-headline .ink { color: var(--color-orange-15); }
  .stack-headline .orange { color: var(--color-orange-54); }
  .stack-body {
    align-self: stretch;
  }
  /* Workflow image — replaces the inline flow diagram. Sized to fill the
     380px stack-content column at the image's natural aspect ratio.
     The max-width matches the original flow diagram's fixed width so the
     image doesn't scale up on mobile (where stack-content goes full-width). */
  .stack-workflow {
    width: 100%;
    max-width: 380px;
    height: auto;
    display: block;
  }

  /* Below: dead CSS for the old inline flow diagram. The flow was replaced
     with a single image (.stack-workflow above). These rules are no longer
     referenced by any HTML on this page but are kept for reference / in case
     the inline approach is ever wanted again. Safe to remove in a future
     cleanup pass. */
  /* Flow diagram — fixed 380×706.8px */
  .flow {
    width: 380px;
    height: 706.8px;
    position: relative;
  }
  .flow-rect {
    position: absolute;
    background: #F1EFE8;
    outline: 0.32px solid #5F5E5A;
    outline-offset: -0.16px;
  }
  .flow-rect.purple { background: #EEEDFE; outline-color: #534AB7; }
  .flow-rect.coral { background: #FAECE7; outline-color: #993C1D; }
  .flow-rect.teal { background: #E1F5EE; outline-color: #0F6E56; }
  .flow-rect.amber { background: #FAEEDA; outline-color: #854F0B; }
  .flow-rect.pink { background: #FBEAF0; outline-color: #993556; }
  .flow-rect.green { background: #EAF3DE; outline-color: #3B6D11; }
  .flow-text {
    position: absolute;
    text-align: center;
    font-family: "Helvetica Neue";
    font-weight: 500;
    white-space: nowrap;
  }
  .flow-title { font-size: 8.87px; }
  .flow-title.gray { color: #2C2C2A; }
  .flow-title.purple { color: #3C3489; }
  .flow-title.coral { color: #712B13; }
  .flow-title.teal { color: #085041; }
  .flow-title.amber { color: #633806; }
  .flow-title.pink { color: #72243E; }
  .flow-title.green { color: #27500A; }
  .flow-body { font-size: 7.6px; color: #2A2520; }

  /* Screens — RIGHT column, 3×3 grid */
  .stack-screens {
    align-self: stretch;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: 12px;
    row-gap: 12px;
  }
  .stack-screens .ph {
    width: 100%;
    aspect-ratio: 262 / 431;
  }

  /* INTERACTIVE PDF DECK — 2×2 grid (4 spreads) */
  .pdf-section {
    width: 100%;
    padding-bottom: var(--space-l);
    background: var(--LF-Gray);
    display: flex;
    flex-direction: column;
  }
  .pdf-section .pdf-text {
    width: 100%;
    padding: 0 var(--content-pad-x) var(--space-s);
    background: var(--LF-Gray);
  }
  /* .pdf-section .pdf-text p: inherits all typography from the global p rule. */
  .pdf-grid {
    width: 100%;
    padding: 0 var(--content-pad-x);
    background: var(--LF-Gray);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-s);
    row-gap: var(--space-s);
  }
  .pdf-grid .ph {
    width: 100%;
    aspect-ratio: 615 / 788.82;
  }

  /* ============================================================
     RESPONSIVE BREAKPOINTS

     - Wide:    ≥ 1600px → content centered at 1600px max
     - Desktop: 1024-1599px → original design (default)
     - Tablet:  641-1023px → 2-column where 3-col was, smaller paddings
     - Mobile:  ≤ 640px   → single-column stack, smaller paddings, fluid type
     ============================================================ */

  /* TABLET */
  @media (max-width: 1023px) {
    :root {
      --pad-min: 48px;
      /* Scale spacing down on tablet (~75%) */
      --space-xs: 20px;
      --space-s:  32px;
      --space-m:  48px;
      --space-l:  72px;
    }

    /* Audience: 4 → 2 columns */
    .audience-cols { grid-template-columns: repeat(2, 1fr); row-gap: 24px; }

    /* 3-col grids → 2 cols */
    .booklets-grid,
    .ipg-deck-grid {
      grid-template-columns: repeat(2, 1fr);
    }

    /* Bates 2-col text stays 2-col but tightens */
    .bates-text-2col { column-gap: 32px; }

    /* Website Design: phones still 2x2, but tighter */
    .website-design { grid-template-columns: 1fr 1.5fr; column-gap: 32px; }

    /* IPG popup tightens */
    .ipg-popup { column-gap: 32px; }

    /* Julie hero tightens */
    .julie-hero { column-gap: 32px; }
    .julie-details { column-gap: 24px; }

    /* Mobile strip: stays 3-col on tablet, fluid widths */
    .julie-mobile-strip {
      grid-template-columns: repeat(3, 1fr);
      column-gap: 24px;
      row-gap: 24px;
    }

    /* Brief stack: become fluid 3-col on tablet (instead of fixed 396px) */
    .julie-brief-stack {
      grid-template-columns: repeat(3, 1fr);
      column-gap: 32px;
    }

    /* PDF grid stays 2-col */
    .pdf-grid { column-gap: var(--space-s); row-gap: var(--space-s); }

    /* AHW + Stack — paddings come from scaled tokens, just the inner gaps */
    .stack-inner { column-gap: var(--space-s); }
    .stack-screens { column-gap: 8px; row-gap: 8px; }
  }

  /* MOBILE — stack to single column */
  @media (max-width: 640px) {
    :root {
      --pad-min: 24px;
      /* Scale spacing further down on mobile (~50% of desktop) */
      --space-xs: 16px;
      --space-s:  24px;
      --space-m:  40px;
      --space-l:  56px;
    }

    /* Hero: tighter top padding, smaller line-height */
    .hero { padding-top: 100px; }
    .hero-content {
      min-height: 480px;
      padding: 32px var(--content-pad-x) 32px;
      gap: 16px;
    }
    .hero-eyebrow-line { width: 16px; }
    .hero-eyebrow-text { font-size: 8px; letter-spacing: 1.4px; }

    /* Audience: stack to 1 col, headline + intro stack */
    .audience-headline { padding-bottom: var(--space-xs); }
    .audience-cols { grid-template-columns: 1fr; row-gap: var(--space-xs); }
    .aud-col { padding-top: 16px; }

    /* Project title bars tighter */
    .project-title-bar { padding: 32px var(--content-pad-x) 24px; }
    .project-title-bar.ipg-bg { padding-top: 40px; }

    /* Meta row stays as flex but allows wrap */
    .meta-row { flex-wrap: wrap; gap: var(--space-xs); }

    /* Bates: stack everything */
    .bates-text-2col {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }

    /* Research wireframes: keep horizontal scroll on mobile, just shrink the cards */
    .research-grid {
      grid-template-columns: repeat(6, 280px);
      grid-template-rows: 216px 216px;
      column-gap: var(--space-xs);
      row-gap: var(--space-xs);
    }
    .research-grid .ph {
      width: 280px;
      height: 216px;
    }

    /* Personas: 2 → 1 col */
    .personas-grid {
      grid-template-columns: 1fr;
      row-gap: var(--space-xs);
    }

    /* Booklets: 3 → 1 col */
    .booklets-grid {
      grid-template-columns: 1fr;
      row-gap: var(--space-xs);
      column-gap: var(--space-xs);
    }

    /* Website Design: stack, phones go 2-col */
    .website-design {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }
    .website-design-left {
      grid-template-rows: auto auto;
      column-gap: var(--space-xs);
      row-gap: var(--space-s);
    }

    /* IPG Deck: 3 → 1 col */
    .ipg-deck-grid {
      grid-template-columns: 1fr;
      row-gap: var(--space-xs);
      column-gap: var(--space-xs);
    }

    /* IPG Popup: stack */
    .ipg-popup {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }
    .ipg-popup-left p { padding-bottom: 0; }
    .ipg-popup-right .pair { column-gap: var(--space-xs); }

    /* Julie: stack hero, details, smaller mobile strip */
    .julie-section { gap: var(--space-s); }
    .julie-hero {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }
    .julie-name-row { gap: 16px; }
    .julie-content { padding-bottom: 0; }
    .julie-details {
      grid-template-columns: 1fr;
      row-gap: var(--space-xs);
    }
    .julie-mobile-strip {
      grid-template-columns: repeat(2, 1fr);
      column-gap: var(--space-xs);
      row-gap: var(--space-xs);
    }

    /* Brief stack collapses to single column on mobile */
    .julie-brief-stack {
      grid-template-columns: 1fr;
      column-gap: 0;
      row-gap: var(--space-xs);
    }
    .brief-block.bottom { padding-bottom: var(--space-s); }
    .brief-text { font-size: 16px; line-height: 24px; }

    /* AHW: tighter header spacing on mobile */
    .ahw-header { padding-bottom: var(--space-xs); gap: 20px; }
    .badge72 { width: 56px; height: 56px; }

    /* THE STACK: 2-col → 1-col on mobile, screens 3×3 → 2×N */
    .stack-inner {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }
    .stack-content {
      width: 100%;
      gap: var(--space-xs);
    }
    .flow {
      width: 100%;
      max-width: 380px;
    }
    /* Screens: 3×3 → 2-col on mobile */
    .stack-screens {
      grid-template-columns: repeat(2, 1fr);
      column-gap: 8px;
      row-gap: 8px;
    }
    .stack-body { font-size: 16px; line-height: 24px; }

    /* PDF deck: 2 → 1 col */
    .pdf-grid {
      grid-template-columns: 1fr;
      row-gap: var(--space-xs);
    }
    .pdf-section .pdf-text p { font-size: 16px; line-height: 24px; }

    /* Body text scales down a bit */
    .bates-block p,
    .julie-content p,
    .ipg-popup-left p,
    .section-body-row p { font-size: 16px; line-height: 24px; }

    /* Audience body text */
    .aud-title { font-size: 18px; line-height: 22px; }
    .aud-body { font-size: 14px; line-height: 22px; }

    /* Tagline tightens */
    .tagline { font-size: 16px; line-height: 22px; }
    .tagline br { display: none; }

    /* Hero sub */
    .hero-sub { font-size: 16px; line-height: 24px; max-width: 100%; }

    /* Brief divider type */
    .brief-divider span { font-size: 12px; }

    /* Deliverables: switch from absolute layout to flex-wrap */
    .deliverables {
      height: auto;
      position: static;
      display: flex;
      flex-wrap: wrap;
      gap: 6px;
    }
    .deliverable-tag {
      position: static;
      left: auto !important;
      top: auto !important;
    }
  }

  /* WIDE — ≥1600px gets centered automatically via --content-pad-x */
  @media (min-width: 1600px) {
    /* Already handled by --content-pad-x. Could add larger paddings if desired. */
  }

  /* ============================================================
     SCROLL REVEAL — subtle "emerge from baseline" on scroll-in
     ============================================================ */
  [data-reveal] {
    opacity: 0;
    transform: translateY(24px);
    filter: blur(2px);
    transition:
      opacity 700ms cubic-bezier(0.22, 1, 0.36, 1),
      transform 700ms cubic-bezier(0.22, 1, 0.36, 1),
      filter 500ms cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: var(--reveal-delay, 0ms);
    /* NOTE: `will-change` was previously declared here for
       performance hinting, but it caused a brief light-bg flash on
       dark sections (Brain Institute, UCGD, hero) when the element
       got promoted to its own compositor layer. The transitions are
       cheap enough without it on modern browsers — leaving it off. */
  }
  [data-reveal].is-revealed {
    opacity: 1;
    transform: translateY(0);
    filter: blur(0);
  }

  /* Stagger children of a [data-reveal-stagger] parent — incremental 80ms delays */
  [data-reveal-stagger] > [data-reveal]:nth-child(1) { --reveal-delay: 0ms; }
  [data-reveal-stagger] > [data-reveal]:nth-child(2) { --reveal-delay: 80ms; }
  [data-reveal-stagger] > [data-reveal]:nth-child(3) { --reveal-delay: 160ms; }
  [data-reveal-stagger] > [data-reveal]:nth-child(4) { --reveal-delay: 240ms; }
  [data-reveal-stagger] > [data-reveal]:nth-child(5) { --reveal-delay: 320ms; }
  [data-reveal-stagger] > [data-reveal]:nth-child(6) { --reveal-delay: 400ms; }

  /* Reduced motion: skip the effect entirely */
  @media (prefers-reduced-motion: reduce) {
    [data-reveal] {
      opacity: 1;
      transform: none;
      filter: none;
      transition: none;
    }
  }
  /* ============================================================
     LIGHTBOX
     A reusable modal for viewing images at full size. Currently
     wired up only to the research grid (see portfolio JS).
     Structure:
       .lightbox                — full-viewport overlay (hidden by default)
         .lightbox__backdrop    — click target for closing
         .lightbox__stage       — centered image + caption + nav buttons
           .lightbox__close
           .lightbox__prev
           .lightbox__next
           .lightbox__image
           .lightbox__caption
           .lightbox__counter   — "3 / 12"
     States:
       .lightbox.is-open        — visible
     Z-index: 8000 (above content, below the pixel cursor at 9999)
     ============================================================ */
  .lightbox {
    position: fixed;
    inset: 0;
    z-index: 8000;
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    visibility: hidden;
    transition: opacity 220ms ease, visibility 0s linear 220ms;
  }
  .lightbox.is-open {
    opacity: 1;
    visibility: visible;
    transition: opacity 220ms ease, visibility 0s linear 0s;
  }
  .lightbox__backdrop {
    position: absolute;
    inset: 0;
    background: rgba(13, 11, 8, 0.92);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    cursor: none;
  }
  .lightbox__stage {
    position: relative;
    width: 100%;
    height: 100%;
    padding: clamp(24px, 5vw, 80px);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--space-xs);
    pointer-events: none;
  }
  .lightbox__image {
    max-width: 100%;
    max-height: calc(100% - 80px);
    width: auto;
    height: auto;
    object-fit: contain;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
    transform: scale(0.96);
    opacity: 1;
    transition:
      transform 320ms cubic-bezier(0.22, 1, 0.36, 1),
      opacity 200ms ease;
    pointer-events: auto;
    will-change: transform, opacity;
  }
  .lightbox.is-open .lightbox__image {
    transform: scale(1);
  }

  /* Navigation transitions — slide current image out, slide new one in from the opposite side.
     States toggled by the JS in the portfolio page:
       .is-leaving-next  → user clicked next; current image slides LEFT and fades out
       .is-leaving-prev  → user clicked prev; current image slides RIGHT and fades out
       .is-entering-next → new image starts off to the RIGHT, slides into place
       .is-entering-prev → new image starts off to the LEFT, slides into place
     The slide distance and timing are tuned to feel responsive but not abrupt. */
  .lightbox__image.is-leaving-next {
    transform: translateX(-32px) scale(0.98);
    opacity: 0;
  }
  .lightbox__image.is-leaving-prev {
    transform: translateX(32px) scale(0.98);
    opacity: 0;
  }
  .lightbox__image.is-entering-next {
    transform: translateX(32px) scale(0.98);
    opacity: 0;
    transition: none;  /* snap to start position before the entering animation */
  }
  .lightbox__image.is-entering-prev {
    transform: translateX(-32px) scale(0.98);
    opacity: 0;
    transition: none;
  }

  /* Caption + counter also slide subtly with the image for cohesion */
  .lightbox__caption,
  .lightbox__counter {
    transition: opacity 200ms ease, transform 200ms ease;
  }
  .lightbox.is-changing .lightbox__caption,
  .lightbox.is-changing .lightbox__counter {
    opacity: 0;
    transform: translateY(4px);
  }
  .lightbox__caption {
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 14px;
    font-weight: 400;
    line-height: 1.5;
    text-align: center;
    max-width: 800px;
    padding: 0 var(--space-s);
    pointer-events: auto;
  }
  .lightbox__counter {
    color: var(--color-grey-91-55);
    font-family: "Courier Prime", monospace;
    font-size: 11px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    margin-bottom: -8px;
    pointer-events: auto;
  }

  /* Close button (top-right) */
  .lightbox__close {
    position: absolute;
    top: clamp(16px, 3vw, 32px);
    right: clamp(16px, 3vw, 32px);
    width: 44px;
    height: 44px;
    background: transparent;
    border: 1px solid var(--color-grey-91-55);
    color: var(--color-grey-91);
    cursor: none;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: auto;
    transition: background 180ms ease, border-color 180ms ease;
  }
  .lightbox__close:hover {
    background: var(--color-orange-54);
    border-color: var(--color-orange-54);
    color: var(--color-orange-4);
  }
  .lightbox__close svg {
    width: 18px;
    height: 18px;
  }

  /* Prev / Next nav buttons (vertically centered, on the sides) */
  .lightbox__prev,
  .lightbox__next {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 56px;
    height: 56px;
    background: transparent;
    border: 1px solid var(--color-grey-91-55);
    color: var(--color-grey-91);
    cursor: none;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: auto;
    transition: background 180ms ease, border-color 180ms ease, transform 180ms ease;
  }
  .lightbox__prev { left: clamp(16px, 3vw, 32px); }
  .lightbox__next { right: clamp(16px, 3vw, 32px); }
  .lightbox__prev:hover,
  .lightbox__next:hover {
    background: var(--color-orange-54);
    border-color: var(--color-orange-54);
    color: var(--color-orange-4);
  }
  .lightbox__prev:hover { transform: translateY(-50%) translateX(-2px); }
  .lightbox__next:hover { transform: translateY(-50%) translateX(2px); }
  .lightbox__prev svg,
  .lightbox__next svg {
    width: 22px;
    height: 22px;
  }

  /* Make grid images that are clickable show a "you can click this" affordance.
     The pixel cursor will already grow on hover, but a subtle treatment helps too. */
  .research-grid > img {
    cursor: none;
    transition: transform 280ms ease, opacity 280ms ease, box-shadow 280ms ease;
  }

  /* When body has the no-scroll lock applied, prevent background scrolling */
  body.lightbox-open {
    overflow: hidden;
  }

  /* Reduced motion: skip the slide animation, use instant swap */
  @media (prefers-reduced-motion: reduce) {
    .lightbox,
    .lightbox__image,
    .lightbox__caption,
    .lightbox__counter {
      transition: none;
    }
    .lightbox__image.is-leaving-next,
    .lightbox__image.is-leaving-prev,
    .lightbox__image.is-entering-next,
    .lightbox__image.is-entering-prev {
      transform: scale(1);
      opacity: 1;
    }
    .lightbox.is-changing .lightbox__caption,
    .lightbox.is-changing .lightbox__counter {
      opacity: 1;
      transform: none;
    }
  }

  /* Mobile: stack nav buttons at bottom for thumb-friendly access */
  @media (max-width: 600px) {
    .lightbox__prev,
    .lightbox__next {
      top: auto;
      bottom: 24px;
      transform: none;
      width: 48px;
      height: 48px;
    }
    .lightbox__prev:hover,
    .lightbox__next:hover {
      transform: none;
    }
    .lightbox__image {
      max-height: calc(100% - 160px);
    }
  }

  /* ════════════════════════════════════════════════════════════════════════
     MTBK — MOUNTAIN BIKING WITH KIDS CASE STUDY
     ────────────────────────────────────────────
     New patterns added for the MTBK page. Reuses the existing token system
     (--color-orange-*, --color-grey-91, --LF-Gray, --space-*, --content-pad-x)
     and is fully responsive via the same tablet/mobile breakpoints.

     All MTBK-specific class names are prefixed `.mtbk-` so they don't clash
     with the existing per-project naming (.bates-, .ipg-, .julie-, .ahw-).

     Section order in this block matches the section order in the HTML:
       1. .mtbk-quote                — image-left + quote-right intro
       2. .mtbk-section-title        — full-width section bands (4 bg variants)
       3. .mtbk-band-title           — the 72px section headline
       4. .mtbk-brand-grid           — 3-column brand identity layout
       5. .mtbk-content-row          — 2-col Evergreen block
       6. .mtbk-rdl-row              — 3-col Reviews / Destinations / Listicles
       7. .mtbk-ai-row               — Athlete Interviews (text + 6-up cards)
       8. .mtbk-icon-square          — 44×44 orange tag (EV / BR / DT / LS / AT)
       9. .mtbk-h48                  — 48px subheading shared across the page
      10. .mtbk-body                 — class hook on body <p> (inherits global p)
      11. .mtbk-eyebrow              — Courier "EXAMPLES" / "RETAILERS" label
      12. .mtbk-list                 — dashed link list (— Article Title)
      13. .mtbk-demo-*               — 2x2 demographic persona grid
      14. .mtbk-website-*            — stacked website mockups, varying widths
      15. .mtbk-social-*             — featured + 4x3 IG grid + 2x2 grid
      16. .mtbk-mon-*                — Monetizing block subheadings + bodies
      17. .mtbk-affiliate-*          — Affiliate Links 2-col + wide image
      18. .mtbk-partners-grid        — 4x3 brand logo grid
      19. .mtbk-shop-*               — Online Bike Shop image + text + retailers
                                      list + wireframe + UX doc + 2-up pair
     ════════════════════════════════════════════════════════════════════════ */

  /* ─── 1. INTRO QUOTE ───────────────────────────────────────────────── */
  .mtbk-quote {
    width: 100%;
    padding: var(--space-l) var(--content-pad-x);
    background: var(--color-grey-91);
    border-bottom: 1px solid var(--color-orange-15);
    display: grid;
    grid-template-columns: 489px 1fr;
    column-gap: 80px;
    align-items: flex-start;
  }
  .mtbk-quote-image {
    width: 100%;
    aspect-ratio: 489 / 326;
    background: var(--LF-Gray);
    overflow: hidden;
  }
  .mtbk-quote-image > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }
  .mtbk-quote-body {
    display: flex;
    flex-direction: column;
    gap: var(--space-s);
    max-width: 660px;
  }
  /* Wrapper around the two body paragraphs in the quote section. The parent
     .mtbk-quote-body uses 40px gap between top-level children (intro, headline,
     text-block); within the text-block, the two paragraphs sit 16px apart. */
  .mtbk-quote-text-block {
    display: flex;
    flex-direction: column;
    gap: 16px;
  }
  /* Small intro line with orange left rule (Figma: 2px solid orange-54) */
  .mtbk-quote-intro {
    padding: 0 20px;
    border-left: 2px solid var(--color-orange-54);
    color: var(--color-grey-57);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 16px;
    font-weight: 500;
    line-height: 20px;
  }
  .mtbk-quote-headline {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(40px, 5.5vw, 72px);
    font-weight: 700;
    line-height: 0.92;
  }
  .mtbk-quote-headline .ink { color: var(--color-orange-15); }
  .mtbk-quote-headline .orange { color: var(--color-orange-54); }
  /* .mtbk-quote-text: inherits all typography from the global p rule. */

  /* ─── 2. SECTION TITLE BANDS ───────────────────────────────────────── */
  /* A full-bleed band with the section name. Five bg variants matching the
     five section backgrounds used in the page. The bottom padding is 0 —
     each section's first content element is responsible for providing the
     gap to the title via its own top padding. This matches the Figma
     rhythm, which varied that gap by section (20px before content rows,
     40px before the Content Creation evergreen block, etc.). */
  .mtbk-section-title {
    width: 100%;
    padding: var(--space-m) var(--content-pad-x) 0;
    display: flex;
    align-items: flex-start;
  }
  .mtbk-section-title--dark    { background: var(--color-orange-4); }     /* Brand & Identity */
  .mtbk-section-title--cream   { background: var(--color-grey-91); }      /* Content Creation, Social Media */
  .mtbk-section-title--darker  { background: var(--color-orange-9); }     /* The Demographic */
  .mtbk-section-title--darkest { background: var(--color-orange-4); }     /* Monetizing (matches its children) */
  .mtbk-section-title--lfgray  { background: var(--LF-Gray); }            /* Website Design */

  /* ─── 3. THE BIG SECTION HEADLINE ──────────────────────────────────── */
  .mtbk-band-title {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(40px, 5.5vw, 72px);
    font-weight: 700;
    line-height: 0.92;
    letter-spacing: 0;
  }
  .mtbk-band-title .ink       { color: var(--color-orange-15); }
  .mtbk-band-title .ink-deep  { color: var(--color-orange-4); }
  .mtbk-band-title .cream     { color: var(--color-grey-91); }
  .mtbk-band-title .orange    { color: var(--color-orange-54); }

  /* ─── 4. BRAND & IDENTITY — 3 INDEPENDENT COLUMNS ──────────────────── */
  /* Three flex columns sit side-by-side. Each column owns its own internal
     vertical stack via flex + row-gap. Columns don't have to be the same
     height — the natural image aspect ratios determine the visual rhythm.
     Layout:
       Column 1 (~390px): logo, hat, business cards (3 landscape stacked)
       Column 2 (~390px): colors, decals, [+1 future asset] (stacked)
       Column 3 (~390px): jersey (1 tall portrait, fills column height)
     Gutter: 50px between columns. Row-gap inside columns: 50px.
     Side margins: var(--content-pad-x) on the section. */
  .mtbk-brand-grid {
    width: 100%;
    padding: 24px var(--content-pad-x) 60px;
    background: var(--color-orange-4);
    display: flex;
    align-items: flex-start;     /* top-align columns; tall jersey extends down naturally */
    gap: 50px;                   /* gutter between columns */
  }
  .bg-col {
    flex: 1 1 0;                 /* equal-width columns */
    min-width: 0;                /* allow shrinking below content size if needed */
    display: flex;
    flex-direction: column;
    gap: 50px;                   /* vertical rhythm between stacked images in the column */
  }
  .bg-col img {
    width: 100%;
    height: auto;                /* let natural aspect ratio drive the height */
    display: block;
  }
  /* The tall column (jersey) has no internal gap — it holds a single image. */
  .bg-col-tall {
    gap: 0;
  }

  /* ─── 5. EVERGREEN — 2-COLUMN CONTENT ROW ──────────────────────────── */
  .mtbk-content-row {
    width: 100%;
    /* Top: 40px gap to the section title (which now has no bottom padding).
       Bottom: 48px before the next element (R/D/L row). */
    padding: 40px var(--content-pad-x) 48px;
    background: var(--color-grey-91);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 48px;
    align-items: flex-start;
  }
  .mtbk-content-col {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    /* 16px vertical rhythm — icon → h48 → body, matches real-estate
       .bates-block. The right (examples) column also uses this. */
    gap: 16px;
  }
  /* The right column has the "EXAMPLES" eyebrow + dashed list */
  .mtbk-examples-col {
    gap: 16px;
  }

  /* ─── 6. REVIEWS / DESTINATIONS / LISTICLES — 3-COL ROW ────────────── */
  /* Figma renders this as 3 equal cards with hairline dividers between them
     and a 1px line across the top. The middle card has 40px padding all
     around; the outer two have 85/40 padding to match the page's content
     edge. To keep responsive behavior clean I'm using a true grid with
     equal columns, top-and-side hairlines that read as the dividers. */
  .mtbk-rdl-row {
    width: 100%;
    background: var(--color-grey-57);   /* shows through as the divider color */
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    column-gap: 1px;
    border-bottom: 1px solid var(--color-grey-57);
  }
  .mtbk-rdl-col {
    background: var(--color-grey-91);
    padding: 40px;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    border-top: 1px solid var(--color-grey-57);
    /* 16px vertical rhythm — icon → h48 → body → eyebrow → list */
    gap: 16px;
  }
  /* The first/last columns extend to the page edge so they align with the
     content padding system, matching Figma's 85px outer padding. */
  .mtbk-rdl-col:first-child { padding-left: var(--content-pad-x); }
  .mtbk-rdl-col:last-child  { padding-right: var(--content-pad-x); }

  /* ─── 7. ATHLETE INTERVIEWS — TEXT LEFT + 6-UP CARD GRID RIGHT ─────── */
  .mtbk-ai-row {
    width: 100%;
    padding: var(--space-m) var(--content-pad-x);
    background: var(--color-grey-91);
    border-bottom: 1px solid var(--color-orange-15);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 48px;
    align-items: flex-start;
  }
  .mtbk-ai-text {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    /* 16px vertical rhythm — icon → h48 → body */
    gap: 16px;
  }
  .mtbk-ai-grid {
    display: flex;
    flex-direction: column;
    gap: 16px;
  }
  .mtbk-ai-eyebrow { /* same as .mtbk-eyebrow but allows row-specific tweak */ }
  /* 6-up card grid: 3 cols × 2 rows (stacks tighter on small screens) */
  .mtbk-ai-cards {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: 18px;
    row-gap: 28px;
  }
  .mtbk-ai-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 20px;
  }
  .mtbk-ai-photo {
    width: 120px;
    height: 120px;
    overflow: hidden;
  }
  .mtbk-ai-photo > img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .mtbk-ai-name {
    color: var(--color-orange-4);
    font-family: "Courier Prime", monospace;
    font-size: 17px;
    font-weight: 400;
    line-height: 1;
    text-decoration: underline;
    text-transform: uppercase;
    text-align: center;
  }

  /* ─── 8. ICON SQUARE (EV / BR / DT / LS / AT) ──────────────────────── */
  .mtbk-icon-square {
    width: 44px;
    height: 44px;
    background: var(--color-orange-54);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--color-grey-91);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 15px;
    font-weight: 700;
    line-height: 1;
    text-align: center;
    flex-shrink: 0;
  }

  /* ─── 9. .mtbk-h48 — 48px SUBHEADING ───────────────────────────────── */
  /* Note: distinct from the existing .h48 (which is a span-based pattern
     used in section-48 wrappers). This one is the subhead used inside
     content blocks like Evergreen, Reviews, etc. */
  .mtbk-h48 {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    color: var(--color-orange-15);
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.2;
  }

  /* ─── 10. .mtbk-body — body paragraphs inherit from the global `p` rule.
     The class is left on markup as a hook for future section-specific
     overrides (e.g. dark-bg color). Currently no styles needed. */

  /* ─── 11. .mtbk-eyebrow — "EXAMPLES" / "RETAILERS" LABEL ───────────── */
  .mtbk-eyebrow {
    color: var(--color-orange-54);
    font-family: "Courier Prime", monospace;
    font-size: 14px;
    font-weight: 700;
    text-transform: uppercase;
    line-height: 15px;
    letter-spacing: 1.5px;
  }
  /* .mtbk-eyebrow--cream: applied in markup as a hook for future styling
     (currently no overrides — eyebrow text is orange on both light and dark
     backgrounds in the Figma). */

  /* ─── 12. .mtbk-list — DASHED LINK LIST ─────────────────────────────── */
  .mtbk-list {
    list-style: none;
    margin: 0;
    padding: 0;
    width: 100%;
  }
  .mtbk-list li {
    padding: 10px 0;
    display: flex;
    align-items: center;
    gap: 8px;
  }
  /* The em dash bullet — using a generated content character for the dash
     so list semantics stay clean. 15.38px width matches Figma. */
  .mtbk-list li::before {
    content: "—";
    flex: 0 0 15.38px;
    width: 15.38px;
    color: var(--color-orange-54);
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 15px;
    font-weight: 200;
    line-height: 25.5px;
  }
  .mtbk-list li a {
    color: var(--color-orange-4);
    font-family: "Courier Prime", monospace;
    font-size: 17px;
    font-weight: 400;
    text-decoration: underline;
    text-transform: uppercase;
    line-height: 1.5;
  }
  .mtbk-list li a:hover {
    color: var(--color-orange-54);
  }
  /* Cream variant (used in the Bike Shop retailers list, on dark bg) —
     the bullets stay orange but the items are cream and not necessarily links */
  .mtbk-list--cream li {
    color: var(--color-grey-91);
    font-family: "Courier Prime", monospace;
    font-size: 17px;
    font-weight: 400;
    text-transform: uppercase;
  }
  .mtbk-list--cream li a { color: var(--color-grey-91); }
  .mtbk-list--cream li a:hover { color: var(--color-orange-54); }

  /* ─── 13. THE DEMOGRAPHIC ──────────────────────────────────────────── */
  .mtbk-demo-intro {
    width: 100%;
    padding: 20px var(--content-pad-x);
    background: var(--color-orange-9);
  }
  .mtbk-demo-intro p {
    color: var(--color-grey-91);
  }
  .mtbk-demo-grid {
    width: 100%;
    padding: 30px var(--content-pad-x) var(--space-l);
    background: var(--color-orange-9);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--space-s);
    row-gap: var(--space-s);
  }
  .mtbk-demo-card {
    width: 100%;
    aspect-ratio: 600 / 375;
    background: var(--LF-Gray);
    border: 0.63px solid #d9d9d9;
    border-radius: 3.75px;
    overflow: hidden;
  }
  .mtbk-demo-card > img { width: 100%; height: 100%; object-fit: cover; display: block; }

  /* ─── 14. WEBSITE DESIGN — STACKED IMAGES, VARYING WIDTHS ──────────── */
  /* Three tiles, all on the LF-Gray bg.
     Tile 1 = full content-width (1238/1270 in Figma — matches content-pad-x)
     Tile 2 = narrower (1077px), centered, capped at ~85% of content width
     Tile 3 = full-bleed, edge-to-edge (no horizontal padding) */
  .mtbk-website-stack {
    width: 100%;
    background: var(--LF-Gray);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 24px;
    /* No bottom padding — Tile 3 is full-bleed and extends to the section
       edge. The next section's top padding owns the gap. */
    padding: 20px 0 0;
  }
  .mtbk-website-1,
  .mtbk-website-2,
  .mtbk-website-3 {
    background: var(--LF-Gray);
    overflow: hidden;
  }
  /* Tile 1: content-width (1238/1270 ≈ matches content-pad-x). */
  .mtbk-website-1 {
    width: calc(100% - 2 * var(--content-pad-x));
    aspect-ratio: 1238 / 752;
  }
  /* Tile 2: narrower (~1077px), centered, capped at the content-width. */
  /* Tile 2: same content-width as Tile 1; natural image aspect ratio
     drives height so it scales cleanly with whatever asset is dropped in. */
  .mtbk-website-2 {
    width: calc(100% - 2 * var(--content-pad-x));
  }
  .mtbk-website-2 > img {
    width: 100%;
    height: auto;
    object-fit: contain;
    display: block;
  }
  /* Tile 3: full-bleed, edge-to-edge (no horizontal padding). */
  .mtbk-website-3 {
    width: 100%;
    aspect-ratio: 1440 / 763;
  }
  .mtbk-website-1 > img,
  .mtbk-website-3 > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }

  /* ─── 15. SOCIAL MEDIA ─────────────────────────────────────────────── */
  /* Top: tall featured poster (336×684) on the left + 4×3 grid (916×685) on
     the right. The 4×3 grid in Figma is rendered with 25px gaps and 210px
     square cells. */
  .mtbk-social-strip {
    width: 100%;
    padding: 40px var(--content-pad-x);
    background: var(--color-grey-91);
    display: grid;
    grid-template-columns: 336px 1fr;
    column-gap: 82px;
    align-items: center;
  }
  .mtbk-social-feature {
    width: 100%;
    aspect-ratio: 336 / 685;
    background: var(--LF-Gray);
    overflow: hidden;
  }
  .mtbk-social-feature > img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .mtbk-social-thumbs {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: repeat(3, auto);
    column-gap: 25px;
    row-gap: 25px;
  }
  .mtbk-social-thumb {
    width: 100%;
    aspect-ratio: 1 / 1;
    background: var(--LF-Gray);
    overflow: hidden;
  }
  .mtbk-social-thumb > img { width: 100%; height: 100%; object-fit: cover; display: block; }

  /* Bottom: 2x2 landscape grid */
  .mtbk-social-2x2 {
    width: 100%;
    padding: 10px 10px var(--space-m);
    background: var(--color-grey-91);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 35px;
    row-gap: 33px;
    max-width: 1376px;
    margin: 0 auto;
  }
  .mtbk-social-tile {
    width: 100%;
    aspect-ratio: 660 / 372;
    background: var(--LF-Gray);
    overflow: hidden;
    position: relative;
  }
  /* The tile contents may be a direct <img> (default) or an <a> wrapping
     an <img> (when the tile links somewhere, e.g. YouTube). Both forms
     fill the tile fully. */
  .mtbk-social-tile > img,
  .mtbk-social-tile > a,
  .mtbk-social-tile > a > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }
  .mtbk-social-tile > a {
    /* Subtle hover affordance for clickable tiles. */
    transition: opacity 200ms ease, transform 280ms ease;
  }
  .mtbk-social-tile > a:hover {
    opacity: 0.92;
  }

  /* ─── 16. MONETIZING — SUBHEADS + BODIES ───────────────────────────── */
  .mtbk-mon-subhead {
    width: 100%;
    padding: var(--space-m) var(--content-pad-x) 20px;
    background: var(--color-orange-4);
  }
  /* The first subhead (Affiliate Links) sits closer to the section title */
  .mtbk-mon-subhead--first {
    padding-top: 20px;
  }
  .mtbk-h48-cream {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: clamp(32px, 4vw, 48px);
    font-weight: 700;
    line-height: 1.2;
  }
  .mtbk-h48-cream .cream  { color: var(--color-grey-91); }
  .mtbk-h48-cream .orange { color: var(--color-orange-54); }
  .mtbk-mon-body {
    width: 100%;
    padding: 0 var(--content-pad-x) var(--space-s);
    background: var(--color-orange-4);
    border-bottom: 1px solid var(--color-orange-15);
  }
  .mtbk-mon-body p {
    color: var(--color-grey-91);
  }

  /* ─── 17. AFFILIATE LINKS — 2-COL ROW + WIDE IMAGE ─────────────────── */
  .mtbk-affiliate-row {
    width: 100%;
    padding: 0 var(--content-pad-x) 48px;
    background: var(--color-orange-4);
    border-bottom: 1px solid var(--color-orange-15);
    display: grid;
    /* minmax(0, 1fr) prevents the text column from blowing out its container
       on narrower desktops (<1300px) where the fixed 660px image doesn't
       leave enough room for an unconstrained 1fr column. */
    grid-template-columns: minmax(0, 1fr) 660px;
    column-gap: 40px;
    align-items: flex-start;
  }
  .mtbk-affiliate-text {
    display: flex;
    flex-direction: column;
    /* 16px vertical rhythm — p → p */
    gap: 16px;
  }
  .mtbk-affiliate-text p {
    color: var(--color-grey-91);
  }
  .mtbk-affiliate-image {
    width: 100%;
    aspect-ratio: 660 / 220;
    background: var(--LF-Gray);
    overflow: hidden;
  }
  .mtbk-affiliate-image > img { width: 100%; height: 100%; object-fit: cover; display: block; }

  .mtbk-affiliate-wide {
    width: 100%;
    padding: 50px var(--content-pad-x);
    background: var(--color-orange-4);
  }
  .mtbk-affiliate-wide::before {
    content: "";
    display: block;
    width: 100%;
    aspect-ratio: 1270 / 665;
    background: var(--LF-Gray);
  }
  /* If a real <img> is dropped in, hide the placeholder */
  .mtbk-affiliate-wide:has(img)::before { display: none; }
  .mtbk-affiliate-wide > img {
    width: 100%;
    height: auto;
    aspect-ratio: 1270 / 665;
    object-fit: cover;
    display: block;
  }

  /* ─── 18. BRAND PARTNERS — 6×2 LOGO GRID ───────────────────────────── */
  .mtbk-partners-grid {
    width: 100%;
    padding: 20px var(--content-pad-x) 50px;
    background: var(--color-orange-4);
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    column-gap: 60px;
    row-gap: 60px;
    justify-items: center;
    align-items: center;
  }
  /* Direct children — both <img> tags (current markup) and any future
     .mtbk-partner-cell wrappers — render at 140px max so logos breathe
     on the wider gutters. */
  .mtbk-partners-grid > img,
  .mtbk-partner-cell {
    width: 100%;
    max-width: 140px;
    height: auto;
    display: block;
  }
  .mtbk-partner-cell {
    aspect-ratio: 1 / 1;
    overflow: hidden;
  }
  .mtbk-partner-cell > img { width: 100%; height: 100%; object-fit: contain; display: block; }

  /* ─── 19. ONLINE BIKE SHOP — IMAGE + TEXT, RETAILERS, WIREFRAME, UX ── */
  .mtbk-shop-row {
    width: 100%;
    padding: 20px var(--content-pad-x) 48px;
    background: var(--color-orange-4);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 48px;
    align-items: flex-start;
  }
  .mtbk-shop-image {
    width: 100%;
    aspect-ratio: 610 / 502;
    background: var(--LF-Gray);
    overflow: hidden;
  }
  .mtbk-shop-image > img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .mtbk-shop-body {
    display: flex;
    flex-direction: column;
    /* 16px vertical rhythm — h48-cream → p → p */
    gap: 16px;
  }
  .mtbk-shop-body p {
    color: var(--color-grey-91);
  }

  /* Three-column detail row: retailers list + wireframe + UX doc */
  .mtbk-shop-detail {
    width: 100%;
    padding: 0 var(--content-pad-x) 48px;
    background: var(--color-orange-4);
    display: grid;
    grid-template-columns: 436fr 259fr 495fr;
    column-gap: 40px;
    align-items: flex-start;
  }
  .mtbk-shop-retailers,
  .mtbk-shop-wireframe,
  .mtbk-shop-uxdoc {
    display: flex;
    flex-direction: column;
    gap: 10px;
  }
  .mtbk-shop-wireframe-img {
    width: 100%;
    aspect-ratio: 259 / 320;
    background: var(--LF-Gray);
    overflow: hidden;
  }
  .mtbk-shop-uxdoc-img {
    width: 100%;
    aspect-ratio: 495 / 320;
    background: var(--LF-Gray);
    overflow: hidden;
  }
  .mtbk-shop-wireframe-img > img,
  .mtbk-shop-uxdoc-img > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }

  /* Final 2-up landscape pair (LF-Gray bg) */
  .mtbk-shop-pair {
    width: 100%;
    padding: 40px var(--content-pad-x) 60px;
    background: var(--LF-Gray);
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 26px;
  }
  .mtbk-shop-pair-img {
    width: 100%;
    aspect-ratio: 1 / 1;
    background: var(--color-grey-91);
    overflow: hidden;
  }
  .mtbk-shop-pair-img > img { width: 100%; height: 100%; object-fit: cover; display: block; }

  /* ════════════════════════════════════════════════════════════════════════
     MTBK — RESPONSIVE BREAKPOINTS
     ════════════════════════════════════════════════════════════════════════ */

  /* TABLET — match the existing site.css tablet breakpoint */
  @media (max-width: 1023px) {
    /* Quote: stack image above text */
    .mtbk-quote {
      grid-template-columns: 1fr;
      column-gap: 0;
      row-gap: var(--space-s);
    }

    /* Brand grid: keep 3 columns at tablet, just tighten gap. The natural
       image stacking holds up well at narrower widths. */
    .mtbk-brand-grid {
      gap: 24px;
    }
    .bg-col {
      gap: 24px;
    }

    /* Content row: stack */
    .mtbk-content-row {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }

    /* RDL: stack the 3 columns */
    .mtbk-rdl-row {
      grid-template-columns: 1fr;
      column-gap: 0;
      row-gap: 1px;
    }
    .mtbk-rdl-col:first-child,
    .mtbk-rdl-col:last-child {
      padding-left: var(--content-pad-x);
      padding-right: var(--content-pad-x);
    }
    .mtbk-rdl-col { padding: var(--space-s) var(--content-pad-x); }

    /* AI: stack text + grid */
    .mtbk-ai-row {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }

    /* Demographic: keep 2 cols, just tighter */
    .mtbk-demo-grid { column-gap: 24px; row-gap: 24px; }

    /* Social: keep featured + 4-col grid relationship but tighten */
    .mtbk-social-strip {
      grid-template-columns: 280px 1fr;
      column-gap: 32px;
    }
    .mtbk-social-thumbs { column-gap: 16px; row-gap: 16px; }
    .mtbk-social-2x2 { column-gap: 16px; row-gap: 16px; }

    /* Affiliate: stack text + image */
    .mtbk-affiliate-row {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }

    /* Partners: 4 cols on tablet */
    .mtbk-partners-grid { grid-template-columns: repeat(4, 1fr); column-gap: 24px; row-gap: 24px; }

    /* Shop row: stack image + body */
    .mtbk-shop-row {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }

    /* Shop detail: stack retailers, wireframe, ux doc */
    .mtbk-shop-detail {
      grid-template-columns: 1fr 1fr;
      row-gap: var(--space-s);
    }
    .mtbk-shop-retailers { grid-column: 1 / -1; }
  }

  /* MOBILE */
  @media (max-width: 640px) {
    /* Brand grid: stack the 3 columns into a single column on mobile.
       All images flow vertically in document order. */
    .mtbk-brand-grid {
      flex-direction: column;
      gap: 16px;
    }
    .bg-col {
      gap: 16px;
    }

    /* AI cards: 2 per row */
    .mtbk-ai-cards {
      grid-template-columns: repeat(2, 1fr);
      column-gap: 16px;
      row-gap: 24px;
    }
    .mtbk-ai-photo { width: 100px; height: 100px; }

    /* Demographic: 1 col */
    .mtbk-demo-grid {
      grid-template-columns: 1fr;
      row-gap: 16px;
    }

    /* Social strip: stack featured + grid (2 cols) */
    .mtbk-social-strip {
      grid-template-columns: 1fr;
      row-gap: var(--space-s);
    }
    .mtbk-social-feature { aspect-ratio: 16 / 9; }
    .mtbk-social-thumbs { grid-template-columns: repeat(3, 1fr); }
    .mtbk-social-2x2 { grid-template-columns: 1fr; row-gap: 16px; }

    /* Partners: 3 cols */
    .mtbk-partners-grid { grid-template-columns: repeat(3, 1fr); column-gap: 16px; row-gap: 16px; }

    /* Shop detail: full stack */
    .mtbk-shop-detail {
      grid-template-columns: 1fr;
    }
    .mtbk-shop-retailers { grid-column: 1; }

    /* Shop pair: 1 col */
    .mtbk-shop-pair {
      grid-template-columns: 1fr;
      row-gap: 16px;
    }

    /* Body text scales down on mobile */
    .mtbk-quote-text,
    .mtbk-body,
    .mtbk-demo-intro p,
    .mtbk-mon-body p,
    .mtbk-affiliate-text p,
    .mtbk-shop-body p { font-size: 16px; line-height: 24px; }

    /* Quote intro stays small */
    .mtbk-quote-intro { font-size: 14px; line-height: 18px; }

    /* List items: smaller type */
    .mtbk-list li a,
    .mtbk-list--cream li { font-size: 15px; }
  }
/* ═══════════════════════════════════════════════════════════════════════════
   HEALTH SCIENCES — page-specific patterns
   ────────────────────────────────────────
   Used by health-sciences-case-study.html. Naming: every new class is
   prefixed `.hs-` to avoid colliding with the bates/julie/ipg/ahw/mtbk
   namespaces above. Background hooks (`.hs-bg-*`) are shared across
   multiple sections — same pattern as `.bates-bg`, `.ipg-bg`.
═══════════════════════════════════════════════════════════════════════════ */

/* ───────────────────────────────────────────────────────────────────────
   1. PAGE-LEVEL BACKGROUND HOOKS
   Three colors used by the page, applied to the same set of sub-section
   wrappers we already have in site.css (.section-48, .section-body-row,
   .meta-row-wrap, .project-title-bar). Adding them here keeps site.css
   untouched.
─────────────────────────────────────────────────────────────────────── */
.hs-bg-ucgd     { background: var(--color-orange-4); }
.hs-bg-ucgd-9   { background: var(--color-orange-9); }
.hs-bg-cream    { background: var(--color-grey-91); }
.hs-bg-lfgray   { background: var(--LF-Gray); }

/* Section bg hooks need to override site.css's per-section bg classes
   when applied to the shared utilities. site.css declares e.g.
     .section-48.bates-bg { background: var(--LF-Gray); }
   but our hs-bg-* classes are unscoped, so the cascade lands on us. */
.section-48.hs-bg-ucgd,
.section-body-row.hs-bg-ucgd,
.meta-row-wrap.hs-bg-ucgd,
.project-title-bar.hs-bg-ucgd     { background: var(--color-orange-4); }
.section-48.hs-bg-ucgd-9,
.section-body-row.hs-bg-ucgd-9    { background: var(--color-orange-9); }
.section-48.hs-bg-cream,
.section-body-row.hs-bg-cream,
.meta-row-wrap.hs-bg-cream,
.project-title-bar.hs-bg-cream    { background: var(--color-grey-91); }
.section-48.hs-bg-lfgray,
.section-body-row.hs-bg-lfgray,
.meta-row-wrap.hs-bg-lfgray,
.project-title-bar.hs-bg-lfgray   { background: var(--LF-Gray); }

/* When a body row sits on a dark bg, switch the paragraph color to cream */
.section-body-row.hs-bg-ucgd p,
.section-body-row.hs-bg-ucgd-9 p { color: var(--color-grey-91); }
.section-body-row.hs-bg-cream p,
.section-body-row.hs-bg-lfgray p { color: var(--color-orange-4); }

/* The project-title-bar by default has a top padding of var(--space-l).
   When we run a numbered eyebrow above it (ERC-CNS), we want the title
   bar tighter to the eyebrow. This variant trims the top. */
.project-title-bar.hs-bg-cream--top,
.project-title-bar.hs-bg-ucgd--top,
.project-title-bar.hs-bg-lfgray--erc-title {
  padding-top: var(--space-m);
}

/* ───────────────────────────────────────────────────────────────────────
   2. HERO — sub paragraph emphasis tail
   The Figma uses two weight tiers inside the hero subtitle:
     • 200-weight light text for the lede (already on .hero-sub via
       site.css; we override the weight to 200 here)
     • 500-weight tail with a slightly higher opacity for emphasis
   Plus an italic emphasis on the word "translating" inside the tail
   (matches the Figma's typographic hand-off).
─────────────────────────────────────────────────────────────────────── */
.hs-hero-sub {
  /* Override site.css's default hero-sub weight (400) and width cap to
     match the Figma layout (520px wide, 200-weight body). */
  max-width: 520px;
  font-weight: 200;
  color: rgba(242, 236, 224, 0.50);
}
.hs-hero-sub__tail {
  font-weight: 500;
  color: rgba(242, 236, 224, 0.80);
}
.hs-hero-sub__tail em {
  font-style: normal;
  font-weight: 200;
  color: rgba(242, 236, 224, 0.50);
}

/* Hero meta block — bottom-right rail of small Courier lines.
   Sits inside .hero-content as a sibling to .hero-spacer, anchored to
   the bottom-right via flex column self-alignment. */
.hs-hero-meta {
  align-self: flex-end;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 5.6px;
  margin-top: -64px; /* visually align with the subtitle baseline */
}
.hs-hero-meta__line {
  text-align: right;
  color: rgba(242, 236, 224, 0.25);
  font-family: "Courier Prime", monospace;
  font-size: 10px;
  font-weight: 400;
  letter-spacing: 1px;
  line-height: 1.3;
}
.hs-hero-meta__line--green {
  color: rgba(58, 153, 85, 0.70);
}

/* ───────────────────────────────────────────────────────────────────────
   3. UCGD INTRO — title + meta + body left, image right
   Figma: 700px text column + 79px gap + 490×326 image, on a dark bg.
   We use the standard .project-title and .meta-row primitives inside,
   so type sizes and badge styles match the rest of the system.
─────────────────────────────────────────────────────────────────────── */
.hs-ucgd-intro {
  width: 100%;
  padding: var(--space-l) var(--content-pad-x) var(--space-m);
  background: var(--color-orange-4);
  display: grid;
  grid-template-columns: 1fr 490px;
  column-gap: 79px;
  align-items: flex-start;
}
.hs-ucgd-intro__text {
  display: flex;
  flex-direction: column;
  gap: 20px;
  max-width: 700px;
}
.hs-ucgd-intro__text .meta-row {
  /* Override the default vertical padding of .meta-row when nested here */
  padding: 0 0 var(--space-xs);
}
.hs-ucgd-intro__body {
  color: var(--color-grey-91);
  max-width: 649px;
  font-size: 18px;
  line-height: 27.9px;
  font-weight: 400;
}
.hs-ucgd-intro__image {
  width: 100%;
  aspect-ratio: 490 / 326;
}
.hs-ucgd-intro__image .ph,
.hs-ucgd-intro__image > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   4. LOGO DESIGN — 2-column composition
   Layout per Frame 184:
     ┌─────────────────────┬──────────────────────────┐
     │ Wordmark            │                          │
     │                     │                          │
     │ ┌─────┐ ┌──────────┐│                          │
     │ │     │ │  UCGD    ││   Office photo           │
     │ │  T  │ │  stack   ││   (full column height)   │
     │ │     │ │          ││                          │
     │ │     │ └──────────┘│                          │
     │ │     │ ┌──┐ ┌──┐   │                          │
     │ │     │ │M │ │M │   │                          │
     │ └─────┘ └──┘ └──┘   │                          │
     └─────────────────────┴──────────────────────────┘
   The left column is a flex column that composes wordmark + a sub-row
   (t-shirt | stack/mugs). The right column is a single tall image.
─────────────────────────────────────────────────────────────────────── */
.hs-ucgd-logo-grid {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-m);
  background: var(--color-orange-4);
  display: grid;
  /* Roughly balanced 50/50 with the photo slightly favored (1.15fr)
     since it's the dominant visual element. minmax(0, ...) prevents
     either column from blowing out on narrow viewports. */
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
  column-gap: var(--space-l);
  align-items: center;
}

/* Left column composition: wordmark spans full width on top; below it,
   a 2-up sub-grid with the t-shirt (wider) on the left and the
   stack+mugs (narrower) on the right. The proportions roughly match
   the Figma: t-shirt ~260px wide, stack ~130px wide. */
.hs-ucgd-logo-compose {
  width: 100%;
  display: grid;
  grid-template-columns: 2fr 1fr;
  column-gap: var(--space-s);
  row-gap: var(--space-s);
  align-items: center;
  justify-items: start;
}
.hs-logo-wordmark {
  grid-column: 1 / -1;
  width: 100%;
}
.hs-logo-wordmark > img {
  width: 100%;
  height: auto;
  display: block;
}
.hs-logo-shirt,
.hs-logo-stack,
.hs-logo-mugs {
  width: 100%;
}
.hs-logo-shirt > img,
.hs-logo-stack > img,
.hs-logo-mugs > img {
  width: 100%;
  height: auto;
  display: block;
}
/* Stack/mugs wrap: stack on top, mugs underneath, both left-aligned
   inside the narrower right sub-column. */
.hs-logo-stack-wrap {
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: var(--space-s);
  align-items: flex-start;
}

/* Right column: office photo fills its track. */
.hs-logo-office {
  width: 100%;
}
.hs-logo-office > img {
  width: 100%;
  height: auto;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   5. AI ILLUSTRATIONS (UCGD) — 3-up portrait tiles
─────────────────────────────────────────────────────────────────────── */
.hs-ucgd-illos {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-m);
  background: var(--color-orange-4);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  column-gap: 36px;
}
.hs-illo-tile {
  aspect-ratio: 375 / 626;
}
.hs-illo-tile .ph,
.hs-illo-tile > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   6. UCGD WEBSITE — 2-up tall desktop screens
─────────────────────────────────────────────────────────────────────── */
.hs-ucgd-web-grid {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-m);
  background: var(--color-orange-4);
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 40px;
}
.hs-web-tile {
  aspect-ratio: 615 / 1224;
}
.hs-web-tile .ph,
.hs-web-tile > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   7. STAT ROW — 3 columns of small COURIER label + body text
   Used twice on this page:
     • UCGD Website: Structure / Signature Module / Voice
     • UCGD Cohort: Left Panel / Right Panel / Why It Works
   Sits on whatever bg the parent supplies (dark in both cases here).
─────────────────────────────────────────────────────────────────────── */
.hs-stat-row {
  width: 100%;
  padding: 0 var(--content-pad-x) var(--space-m);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  /* Visual divider: top hairline plus inner verticals via cell borders */
}
.hs-stat-row--bordered {
  border-top: 1px solid var(--color-orange-15);
  /* Section's own top padding so the rule sits above the cells */
  padding-top: 0;
}
.hs-stat-cell {
  padding: 20px 24px;
  border-right: 1px solid var(--color-orange-15);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.hs-stat-cell:first-child { padding-left: 0; }
.hs-stat-cell:last-child { padding-right: 0; border-right: none; }
.hs-stat-cell__label {
  color: var(--color-orange-54);
  font-family: "Courier Prime", monospace;
  font-size: 10px;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  line-height: 1;
}
.hs-stat-cell__label--strong {
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 1.5px;
  line-height: 19.5px;
}
.hs-stat-cell__body {
  color: var(--color-grey-91);
  font-size: 16px;
  font-weight: 400;
  line-height: 24.8px;
}
/* When a stat row sits on a light bg (we don't currently use this on
   Health Sciences but the hook is here for parity with the rest of
   the system) — bodies flip to ink. */
.hs-bg-cream .hs-stat-cell__body,
.hs-bg-lfgray .hs-stat-cell__body { color: var(--color-orange-4); }

/* ───────────────────────────────────────────────────────────────────────
   8. ICONS & PIPELINE ELEMENTS — 4×4 icon grid + tall image right
─────────────────────────────────────────────────────────────────────── */
.hs-ucgd-icons-row {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-m);
  background: var(--color-orange-4);
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 80px;
  align-items: flex-start;
}
.hs-icon-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 39px;
}
.hs-icon-cell {
  aspect-ratio: 1 / 1;
}
.hs-icon-cell .ph,
.hs-icon-cell > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.hs-pipeline-tall {
  width: 100%;
  /* The Figma's right-side asset is 595×596 — square-ish. Match that
     ratio so the right column ends roughly where the icon grid does. */
  aspect-ratio: 595 / 596;
  border-radius: 5.81px;
  overflow: hidden;
}
.hs-pipeline-tall .ph,
.hs-pipeline-tall > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   9. COHORT EXPANSION — 2-up wide infographics
─────────────────────────────────────────────────────────────────────── */
.hs-cohort-grid {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-m);
  background: var(--color-orange-9);
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 73px; /* matches the Figma's 671 - 598 gap */
}
.hs-cohort-tile {
  aspect-ratio: 598 / 481;
}
.hs-cohort-tile .ph,
.hs-cohort-tile > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   10. YANDELL — intro paragraph + 3-row tabular detail
   Matches the Figma's "scope / audience / signature sections" rows
   stacked under the body paragraph, separated by hairline rules.
─────────────────────────────────────────────────────────────────────── */
.hs-yandell-intro {
  width: 100%;
  padding: 0 var(--content-pad-x) var(--space-m);
  background: var(--color-grey-91);
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: var(--space-m);
  align-items: start;
}
.hs-yandell-intro p {
  /* Sits in the left 50% column. No max-width override — the column
     itself constrains it. */
  font-size: 18px;
  font-weight: 400;
  line-height: 27.9px;
  color: var(--color-orange-4);
  margin: 0;
}
.hs-yandell-detail {
  width: 100%;
  border-top: 1px solid #E0D8C8;
  margin: 0;
  padding: 0;
}
.hs-yandell-detail__row {
  padding: 14px 0;
  border-bottom: 1px solid #E0D8C8;
  /* Vertical stack: label on top, value below. The 50% column is too
     narrow for a side-by-side label+value at long values like the
     "Publications feed · Software directory (WHAM, ...)" row. */
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.hs-yandell-detail__label {
  margin: 0;
  color: var(--color-orange-54);
  font-family: "Courier Prime", monospace;
  font-size: 10px;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  line-height: 1.4;
}
.hs-yandell-detail__value {
  margin: 0;
  color: var(--color-orange-4);
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 16px;
  font-weight: 500;
  line-height: 1.5;
}

/* ───────────────────────────────────────────────────────────────────────
   11. YANDELL AI IMAGES — 2×2 captioned tiles
   Pattern: image area + COURIER caption row with orange kicker + ink tail.
─────────────────────────────────────────────────────────────────────── */
.hs-yandell-ai-grid {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-m);
  background: var(--color-grey-91);
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 40px;
  row-gap: var(--space-s);
}
.hs-ai-tile {
  margin: 0;
  display: flex;
  flex-direction: column;
}
.hs-ai-tile__image {
  width: 100%;
  aspect-ratio: 615 / 344;
}
.hs-ai-tile__image .ph,
.hs-ai-tile__image > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.hs-ai-tile__caption {
  padding: 14px 0;
  font-family: "Courier Prime", monospace;
  font-size: 15px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  line-height: 1;
}
.hs-ai-tile__caption-kicker { color: var(--color-orange-54); }
.hs-ai-tile__caption-text   { color: var(--color-orange-4); }

/* ───────────────────────────────────────────────────────────────────────
   12. YANDELL WEBSITE GRID — 3×2 mobile screens
─────────────────────────────────────────────────────────────────────── */
.hs-yandell-web-grid {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-l);
  background: var(--color-grey-91);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  column-gap: 36px;
  row-gap: var(--space-m);
}
.hs-yandell-web-tile {
  aspect-ratio: 375 / 515;
}
.hs-yandell-web-tile .ph,
.hs-yandell-web-tile > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   13. BRAIN INSTITUTE — 3-up image strip with COURIER captions
   Asymmetric widths from the Figma:
     Annual Report (534) | Logo (284) | Cards/Drive (406)
   Captions on white (cream) text since the bg is dark.
─────────────────────────────────────────────────────────────────────── */
.hs-brain-strip {
  width: 100%;
  padding: var(--space-m) var(--content-pad-x) var(--space-l);
  background: var(--color-orange-4);
  display: grid;
  /* Match the Figma's 534 / 284 / 406 ratio */
  grid-template-columns: 534fr 284fr 406fr;
  column-gap: 20px;
  align-items: flex-start;
}
.hs-brain-tile {
  margin: 0;
  display: flex;
  flex-direction: column;
}
.hs-brain-tile__image {
  width: 100%;
}
.hs-brain-tile--annual .hs-brain-tile__image { aspect-ratio: 534 / 361; }
.hs-brain-tile--logo   .hs-brain-tile__image { aspect-ratio: 284 / 360; }
.hs-brain-tile--cards  .hs-brain-tile__image { aspect-ratio: 406 / 360; }
.hs-brain-tile__image .ph,
.hs-brain-tile__image > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.hs-brain-tile__caption {
  padding: 14px 0;
  font-family: "Courier Prime", monospace;
  font-size: 15px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  line-height: 1;
  color: var(--color-grey-91);
}
.hs-brain-tile__caption--stacked {
  padding: 0;
  display: flex;
  flex-direction: column;
}
.hs-brain-tile__caption-line {
  padding: 14px 0;
}
.hs-brain-tile__caption-kicker { color: var(--color-orange-54); }
.hs-brain-tile__caption-text   { color: var(--color-grey-91); }

/* ───────────────────────────────────────────────────────────────────────
   14. NUMBERED EYEBROW (ERC-CNS) — "05 / ERC-CNS / ─────────"
   Small chapter-marker row. Number in orange, label in grey,
   trailing hairline rule fills remaining width.
─────────────────────────────────────────────────────────────────────── */
.hs-numbered-eyebrow {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) 0;
  display: flex;
  align-items: center;
  gap: 16px;
  background: var(--LF-Gray);
}
.hs-numbered-eyebrow__num {
  color: var(--color-orange-54);
  font-family: "Courier Prime", monospace;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 1.44px;
  line-height: 1;
}
.hs-numbered-eyebrow__label {
  color: var(--color-grey-57);
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  line-height: 1;
}
.hs-numbered-eyebrow__rule {
  flex: 1;
  height: 0.5px;
  background: var(--color-grey-57);
}

/* ───────────────────────────────────────────────────────────────────────
   15. ERC INFOGRAPHIC — single full-width image
   Mirrors the .ipg-wide pattern from the real estate page but keyed to
   the LF-Gray bg. The Figma asset is 1270×834.
─────────────────────────────────────────────────────────────────────── */
.hs-erc-wide {
  width: 100%;
  padding: var(--space-s) var(--content-pad-x) var(--space-l);
  background: var(--LF-Gray);
}
.hs-erc-wide .ph,
.hs-erc-wide > img {
  width: 100%;
  aspect-ratio: 1270 / 834;
  display: block;
}

/* ───────────────────────────────────────────────────────────────────────
   16. RESPONSIVE — collapse multi-col grids at the same breakpoints
   site.css already uses (1023, 640).
─────────────────────────────────────────────────────────────────────── */
@media (max-width: 1023px) {
  .hs-ucgd-intro {
    grid-template-columns: 1fr;
    column-gap: 0;
    row-gap: var(--space-m);
  }
  .hs-ucgd-intro__image {
    max-width: 490px;
  }
  .hs-ucgd-icons-row {
    grid-template-columns: 1fr;
    row-gap: var(--space-m);
  }
  .hs-ucgd-logo-grid {
    grid-template-columns: 1fr;
    row-gap: var(--space-m);
  }
  .hs-pipeline-tall {
    max-width: 595px;
    margin: 0 auto;
  }
  .hs-stat-row {
    grid-template-columns: 1fr;
    row-gap: 0;
  }
  .hs-stat-cell {
    border-right: none;
    border-bottom: 1px solid var(--color-orange-15);
    padding: 20px 0;
  }
  .hs-stat-cell:last-child { border-bottom: none; }
  .hs-cohort-grid {
    grid-template-columns: 1fr;
    row-gap: var(--space-s);
  }
  .hs-yandell-intro {
    grid-template-columns: 1fr;
    row-gap: var(--space-s);
  }
  .hs-yandell-ai-grid {
    grid-template-columns: 1fr;
    row-gap: var(--space-s);
  }
  .hs-yandell-web-grid {
    grid-template-columns: repeat(2, 1fr);
  }
  .hs-brain-strip {
    grid-template-columns: 1fr;
    row-gap: var(--space-m);
  }
  .hs-hero-meta {
    align-self: flex-start;
    align-items: flex-start;
    margin-top: 0;
  }
  .hs-hero-meta__line {
    text-align: left;
  }
}

@media (max-width: 640px) {
  /* Logo grid: collapse the 2-column composition to a single column
     stack at phone widths — left composition first, photo last. */
  .hs-ucgd-logo-grid {
    grid-template-columns: 1fr;
    row-gap: var(--space-m);
  }

  .hs-ucgd-illos {
    grid-template-columns: 1fr;
    row-gap: 24px;
  }
  .hs-ucgd-web-grid {
    grid-template-columns: 1fr;
    row-gap: 24px;
  }
  .hs-icon-grid {
    grid-template-columns: repeat(4, 1fr);
    gap: 16px;
  }
  .hs-yandell-web-grid {
    grid-template-columns: 1fr;
  }
  .hs-hero-sub { font-size: 16px; line-height: 24px; }
}
