/* ═══════════════════════════════════════════════════════════
   EDS BRANDING WEBSITE - STANDARD STYLES
   ═══════════════════════════════════════════════════════════ */

/* Self-hosted replacements for the three Google Fonts previously
   loaded from fonts.googleapis.com — same families/weight ranges as
   that request, latin subset only (no cyrillic/greek/vietnamese
   glyphs needed on this site), pulled directly from Google's own CDN
   files rather than re-exported. Testing whether removing the
   Google-CDN round-trip alone is enough to stop the Georgia→serif
   swap from being visible, before adding a font-loading gate. */
@font-face {
    font-family: 'Source Serif 4';
    src: url('fonts/SourceSerif4-Variable.woff2') format('woff2-variations'),
         url('fonts/SourceSerif4-Variable.woff2') format('woff2');
    font-weight: 200 500;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Source Serif 4';
    src: url('fonts/SourceSerif4-Variable-Italic.woff2') format('woff2-variations'),
         url('fonts/SourceSerif4-Variable-Italic.woff2') format('woff2');
    font-weight: 200 500;
    font-style: italic;
    font-display: swap;
}
@font-face {
    font-family: 'Hanken Grotesk';
    src: url('fonts/HankenGrotesk-Variable.woff2') format('woff2-variations'),
         url('fonts/HankenGrotesk-Variable.woff2') format('woff2');
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Hanken Grotesk';
    src: url('fonts/HankenGrotesk-Variable-Italic.woff2') format('woff2-variations'),
         url('fonts/HankenGrotesk-Variable-Italic.woff2') format('woff2');
    font-weight: 100 900;
    font-style: italic;
    font-display: swap;
}
@font-face {
    font-family: 'Overpass';
    src: url('fonts/Overpass-Variable.woff2') format('woff2-variations'),
         url('fonts/Overpass-Variable.woff2') format('woff2');
    font-weight: 400 700;
    font-style: normal;
    font-display: swap;
}

/* ═══ FONT-LOAD GATE ═══
   Shown once per session, on whichever page a visitor lands on first
   (gated by sessionStorage — see the inline script at the top of each
   page's <head>). The opaque cover is a pure CSS pseudo-element, no
   markup needed for it; the wordmark reveal itself (built by that
   same script, once <body> exists) is real per-letter DOM so each
   character can be masked and staggered independently — not
   something a pseudo-element can do. Hides the Georgia→serif swap
   until webfonts are confirmed loaded (a fixed minimum duration +
   document.fonts.ready, capped by a hard timeout so a stalled font
   load can never hang the page). Deliberately not Datum — Datum's
   whole identity is wandering to an unpredictable spot on the page,
   so pinning him centered in a loader would read as a different,
   incongruent character. */
html.eds-gate body::before {
    content: '';
    position: fixed; top: 0; left: 0; right: 0;
    /* height, not inset:0's implicit bottom:0 — on iOS Safari, inset:0
       sizes a fixed element against the viewport's "large" (toolbars
       collapsed) state, which can be taller than what's actually on
       screen right at page load before Safari settles the address bar,
       leaving a sliver top/bottom that shows body's own cream
       background through instead of this cover. 100dvh tracks the
       real visible area directly; 100vh is only the fallback for
       browsers without dvh support. */
    height: 100vh;
    height: 100dvh;
    background: #12100D;
    z-index: 999999;
    opacity: 1;
    transition: opacity 0.5s ease;
}
html.eds-gate.eds-gate--done body::before {
    opacity: 0;
    pointer-events: none;
}

#eds-gate-word {
    position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);
    z-index: 1000000;
    font-family: var(--serif);
    font-size: clamp(1.75rem, 4.5vw, 2.75rem);
    color: #FFF5EC;
    white-space: nowrap;
    text-transform: lowercase;
    letter-spacing: 0.01em;
    pointer-events: none;
}
/* Each letter is its own overflow:hidden mask around an inner span —
   the inner span is what actually translates, sliding up from below
   the mask's bottom edge (in) or back down through it (out), so it
   reads as emerging from / receding into a line just beneath the
   word rather than fading in from nowhere. */
.eds-gl { display: inline-block; overflow: hidden; vertical-align: bottom; }
.eds-gl > span { display: inline-block; transform: translateY(115%); transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1); }
.eds-gl--accent > span { color: #CC9762; font-style: italic; }
.eds-gl--space { width: 0.32em; }
#eds-gate-word.eds-in .eds-gl > span { transform: translateY(0); }
#eds-gate-word.eds-out .eds-gl > span { transform: translateY(115%); }

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
    --bg:        #FFF5EC;
    --ink:       #12100D;
    --ink-mid:   #12100D;
    --ink-dim:   #8c7f6e;
    --heritage:     #8C5A3C;
    --serif:     'Source Serif 4', Georgia, serif;
    --mono:      'Overpass', sans-serif;
    --body:      'Hanken Grotesk', sans-serif;
    /* Hero grid mask-image percentages for different page layouts */
    --hero-mask-h-left: 18%;
    --hero-mask-h-left-narrow: 5%;
    --hero-mask-h-right-std: 82%;
    --hero-mask-h-right-alt: 92%;
    --hero-mask-v-top: 18%;
    --hero-mask-v-bottom-std: 88%;
    --hero-mask-v-bottom-narrow: 95%;
}

html { font-size: 16px; scroll-behavior: smooth; color-scheme: light; scrollbar-color: var(--ink-dim) transparent; }

/* Sitewide reduced-motion baseline — collapses every plain CSS
   transition/animation (the .reveal fade-ins, hover states, nav
   dropdown transitions, etc.) to near-instant for anyone with the OS
   "reduce motion" preference set, and drops the smooth-scroll above
   back to instant jumps. This does NOT reach the JS-driven scroll-
   jacking/pinned sections (COE/LP/AMC's "our approach" animations,
   the homepage "staying rooted" pin, the homepage datum's parallax) —
   those set transform/opacity directly from scroll position in JS
   rather than through a CSS transition, so this rule has nothing to
   intercept there. Making those respect reduced-motion needs each one
   checking matchMedia('(prefers-reduced-motion: reduce)') and falling
   back to a static, non-scroll-jacked presentation — a bigger, more
   involved change than this blanket CSS reset covers. */
@media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

body {
    background: var(--bg);
    color: var(--ink);
    font-family: var(--body);
    line-height: 1.65;
    overflow-x: hidden;
}

a { color: inherit; text-decoration: none; }

/* ═══ HERO GRID BACKGROUND (shared across pages with variable mask-image) ═══ */
.hero-grid-bg {
    position: absolute; top: 0; right: 0; bottom: 0; left: 0;
    mask-image: linear-gradient(to right, transparent 0%, black var(--hero-mask-h-left), black var(--hero-mask-h-right-std), transparent 100%), linear-gradient(to bottom, transparent 0%, black var(--hero-mask-v-top), black var(--hero-mask-v-bottom-std), transparent 100%);
    mask-composite: intersect;
    -webkit-mask-image: linear-gradient(to right, transparent 0%, black var(--hero-mask-h-left), black var(--hero-mask-h-right-std), transparent 100%), linear-gradient(to bottom, transparent 0%, black var(--hero-mask-v-top), black var(--hero-mask-v-bottom-std), transparent 100%);
    /* Two values, not one — older WebKit composites its bottom mask
       layer against an assumed fully-transparent layer beneath it, and
       "source-in" (this property's old, non-spec name for "intersect")
       against nothing is nothing, so a single source-in here masks the
       whole element out completely (this is what hid the grid entirely
       on iOS 14). The top layer keeps source-in (intersecting normally
       against the accumulator); the bottom layer uses xor instead,
       which sidesteps that "against nothing" case while still landing
       on the same net intersect result. */
    -webkit-mask-composite: source-in, xor;
    pointer-events: none;
}

/* ═══ SVG BACKGROUND CONTAINER ═══ */
.svg-bg-container { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; }

/* ═══ OPACITY UTILITIES ═══ */
.opacity-0 { opacity: 0; }

/* ═══ REVEAL ═══
   Scroll-triggered fade-in utility, previously copy-pasted independently
   in many pages' own <style> blocks. */
.reveal { opacity: 0; transform: translateY(18px); transition: opacity 0.7s ease, transform 0.7s ease; }
.reveal.visible { opacity: 1; transform: none; }
.reveal--d1 { transition-delay: 0.1s; }
.reveal--d2 { transition-delay: 0.2s; }

/* ─── TYPOGRAPHY STYLES ─── */

.title {
    font-family: var(--serif);
    font-size: clamp(4rem, 8.4vw, 7.5rem);
    font-weight: 400;
    line-height: 1.2;
    color: var(--ink);
    letter-spacing: -0.01em;
    text-transform: lowercase;
    margin-bottom: 3.5rem;
}

.title--light {
    color: #FFF5EC;
}

.title em {
    font-style: italic;
    color: #CC9762;
}

.article-header__title em,
.contact-heading em,
.cause-card__title em {
    color: #CC9762;
}

.title--secondary em {
    color: #12100D;
}

.h1 {
    font-family: var(--serif);
    font-size: clamp(2rem, 3.5vw, 2.75rem);
    font-weight: 350;
    color: var(--ink);
    margin-bottom: 3rem;
    line-height: 1.2;
    letter-spacing: -0.01em;
    text-transform: lowercase;
}

.section { padding: 6rem 10vw; }

/* Full-width image band between content sections — previously
   copy-pasted identically into index.html, community-owned-evaluation.html,
   learning-partnerships.html, and for-artists-and-movements.html. */
.full-bleed { width: 100%; height: 60vh; background: #1e1c18; display: flex; align-items: center; justify-content: center; position: relative; }
@media (max-width: 900px) {
    /* 60vh crops to a tall portrait sliver on phones; force landscape
       instead. padding-top (not aspect-ratio, unsupported until Safari
       15) establishes the actual height here — the image switches from
       flex-filled to absolutely positioned so it still fills that
       padding-defined box correctly. */
    .full-bleed { height: auto; padding-top: 75%; }
    .full-bleed img { position: absolute; top: 0; right: 0; bottom: 0; left: 0; }
}

.section--cream,
.section--light {
    background: #FFF5EC;
}

.section--cream .h1,
.section--light .h1 {
    color: #12100D;
}

.h1--dark {
    color: #12100D;
}

.h1--italic {
    font-style: italic;
}

/* Removes the default bottom margin/border when an .h1 is immediately
   followed by other content instead of standing alone — used by the
   "our approach" section heading on CoE/LP/AMC. Compound selector
   (not just .h1--no-rule alone) so it reliably beats a plain .h1 on
   margin-bottom regardless of cascade order — LP has its own local
   .h1 redeclaration that loads after this stylesheet, which would
   otherwise win the conflict since both are single-class selectors. */
.h1.h1--no-rule {
    margin-bottom: 0;
    padding-bottom: 0;
    border-bottom: none;
}

.h2 {
    font-family: var(--serif);
    font-size: clamp(1.5rem, 2.5vw, 2rem);
    font-weight: 350;
    color: var(--ink);
    margin-bottom: 2rem;
    line-height: 1.2;
    letter-spacing: -0.01em;
    text-transform: lowercase;
}

.h2--caps {
    text-transform: none;
}

.h2--light {
    color: #12100D;
}

.h2--heritage,
.section--light .h2.h2--heritage,
.section--cream .h2.h2--heritage {
    color: var(--heritage);
}

.h2 em {
    font-style: italic;
    color: #CC9762;
}

.section--cream .h2,
.section--light .h2 {
    color: #12100D;
}

.section--cream .h2 em,
.section--light .h2 em {
    color: #8C5A3C;
}

/* ═══ ARTICLE TEMPLATE ═══
   Shared across article/blog pages — previously copy-pasted independently
   in each page's own <style> block. */
.label { font-family: var(--mono); font-size: 0.8125rem; letter-spacing: 0.2em; text-transform: uppercase; color: var(--ink-dim); }
.label--heritage { color: var(--heritage); }

.article-header { padding: 10rem 3rem 5rem; max-width: 820px; margin: 0 auto; overflow: hidden; }
/* Symmetric margin on every child + matching negative margin on the
   container, same fix as .article-header__byline/.footer-links__group
   above — the old margin-right/margin-bottom on :not(:last-child) only
   ever looked fine here because every page happens to put a single item
   in this row (so the asymmetry never had a second item to skew against),
   but it's the same latent bug: with flex-wrap:wrap and align-items:
   center, two-plus items sharing a row would center-align by their full
   margin box, and the non-last one's extra margin-bottom would shift its
   visible content upward relative to the last child. Hardened now so it
   can't bite later. margin-bottom is re-declared after the shorthand to
   preserve this container's own real 2.5rem space before the title
   (the shorthand's -0.75rem would otherwise eat into it). */
.article-header__meta { display: flex; align-items: center; flex-wrap: wrap; margin: -0.75rem; margin-bottom: 2.5rem; }
.article-header__meta > * { margin: 0.75rem; }
.article-header__kicker { display: flex; align-items: center; }
.article-header__kicker > *:not(:last-child) { margin-right: 1rem; }
.article-header__title { font-family: var(--serif); font-size: clamp(2.25rem, 5vw, 3.5rem); font-weight: 400; line-height: 1.12; color: var(--ink); margin-bottom: 1.75rem; letter-spacing: -0.01em; }
.article-header__title em { font-style: italic; color: var(--heritage); }
/* Trailing margin on every child but the last (not the negative-
   margin/leading-margin trick used above) — this one already has its
   own padding-top for real external spacing, and a leading negative
   margin-top would eat into that. :not(:last-child) means no unwanted
   trailing space is added below/after the row as a whole; a wrapped
   (not truly last) item keeps an unused trailing margin that a wrap
   just absorbs, harmlessly. */
/* Symmetric margin on every child + matching negative margin on the
   container (not the old margin-right/margin-bottom on :not(:last-child)
   trick) — with flex-wrap:wrap and align-items:center, an asymmetric
   bottom margin only on non-last children shifts their visible text
   upward relative to a same-line sibling with no bottom margin (see
   the identical .footer-links__group fix), which was the cause of
   "VISUALS" sitting lower than "ENTERED"/"WORDS" whenever all three
   landed on one row. */
.article-header__byline { display: flex; align-items: center; padding-top: 1.5rem; flex-wrap: wrap; margin: -1rem; }
.article-header__byline > * { margin: 1rem; }
.article-header__byline-block { display: flex; flex-direction: column; }
.article-header__byline-block > *:not(:last-child) { margin-bottom: 0.2rem; }
.article-details { font-family: var(--mono); font-size: 0.5625rem; letter-spacing: 0.2em; text-transform: uppercase; color: #8C5A3C; }
.article-header__byline-value { font-family: var(--body); font-size: clamp(0.75rem, 1.2vw, 0.9rem); font-weight: 250; line-height: 1.75; color: var(--ink); }

/* Sits between .article-header and .article-body — same 820px column,
   same horizontal padding, so it lines up with both rather than reading
   as its own separate section. */
.article-featured-image { max-width: 820px; margin: 0 auto; padding: 0 3rem; }
/* Frame + absolutely-positioned image, not aspect-ratio directly on the
   <img> — unsupported until Safari 15, and falls back to native photo
   dimensions without it. padding-top's percentage (resolved against
   the frame's own width — a long-standing CSS2.1 behavior) reaches the
   same 4:3 box on every browser. The frame has to be a separate
   element from .article-featured-image itself: percentage padding-top
   resolves against the CONTAINING block's width, not the padded
   element's own (already 820px-constrained) width. */
.article-featured-image__frame { position: relative; width: 100%; padding-top: 75%; overflow: hidden; }
.article-featured-image img { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; object-fit: cover; display: block; }

/* overflow:hidden here (and on the other max-width text blocks
   flagged the same way below) works around a Safari-only bug: a block
   sized only by max-width, with no block-formatting-context of its
   own, gets its multi-line text-selection highlight painted out to
   the edge of its wider ancestor instead of its own box. overflow:
   hidden gives it that BFC so Safari bounds the highlight correctly —
   no visual change otherwise (display:flow-root would be the more
   "honest" way to trigger a BFC, but it's silently dropped by some
   engines, so overflow:hidden is the safer universal choice). */
.article-body { max-width: 820px; margin: 0 auto; padding: 4rem 3rem 7rem; overflow: hidden; }
.article-body p:last-child { margin-bottom: 0; }
.article-body .h2 { margin-top: 3rem; margin-bottom: 1.5rem; }

/* ═══ ARTICLE TABLE ═══
   Reusable data-table style for article bodies (introduced for
   two-steps-forward.html's disruption table). Header uses the header
   font, colored with the site's accent; body copy uses the body font,
   with the first column echoing the header font as a row label. Default
   is the light-background treatment, matching every current article page;
   .article-table--dark is a guard for a future dark-background article. */
.article-table { width: 100%; border-collapse: collapse; margin: 2.5rem 0; font-size: 1rem; }
.article-table th {
    text-align: center;
    padding: 0.75rem 1rem 0.75rem 0;
    font-family: var(--serif);
    font-size: 1.05rem;
    font-weight: 400;
    letter-spacing: normal;
    text-transform: none;
    color: var(--heritage);
}
.article-table td {
    padding: 1rem 1rem 1rem 0;
    border-bottom: 1px solid #d6d0c0;
    vertical-align: top;
    font-family: var(--body);
    font-size: clamp(0.75rem, 1.2vw, 0.9rem);
    font-weight: 250;
    line-height: 1.75;
    color: #12100D;
}
.article-table td:first-child {
    font-family: var(--serif);
    font-size: 1.05rem;
    font-weight: 400;
    color: #12100D;
    white-space: nowrap;
}

.article-table--dark th { color: #CC9762; }
.article-table--dark td,
.article-table--dark td:first-child { color: #FFF5EC; }

@media (max-width: 800px) {
    .article-table { display: block; overflow-x: auto; }
}

.related { padding: 5rem 3rem; border-top: 1px solid #d6d0c0; }
.related__inner { max-width: 820px; margin: 0 auto; overflow: hidden; }
.related__grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0; }
.related__card { padding: 2rem 2rem 2rem 0; border-right: 1px solid rgba(214, 208, 192, 0.3); display: flex; flex-direction: column; text-decoration: none; }
.related__card > *:not(:last-child) { margin-bottom: 0.75rem; }
.related__card:last-child { border-right: none; padding-left: 2rem; padding-right: 0; }
.related__card-label { display: block; }
.related__card-title { font-family: var(--serif); font-size: 1.25rem; font-weight: 300; line-height: 1.3; color: var(--ink); transition: color 0.2s; }
.related__card:hover .related__card-title { color: var(--heritage); }

/* ═══ FAQ / Q&A ═══
   Shared between sprints.html/issue-area-networks.html (FAQ) and
   issue-area-networks.html/creative-collaborations.html (Q&A). */
.faq-list { display: flex; flex-direction: column; }
.faq-item { border-bottom: 1px solid var(--rule); }
.faq-trigger { width: 100%; background: none; border: none; padding: 2rem 0; display: grid; grid-template-columns: 1fr auto; gap: 2rem; align-items: center; cursor: pointer; text-align: left; -webkit-tap-highlight-color: transparent; outline: none; appearance: none; -webkit-appearance: none; }
.faq-trigger:focus, .faq-trigger:active { background: none; outline: none; }
/* outline:none above only suppresses the (often clipped/misaligned)
   default mouse-click ring — :focus-visible restores a real indicator
   for keyboard users, who were otherwise given nothing to see which
   question was focused before pressing Enter/Space. */
.faq-trigger:focus-visible { outline: 2px solid var(--heritage); outline-offset: 2px; }
/* .faq-trigger__icon is a <span> wrapping the actual <svg> chevron, not
   the <svg> itself — this engine silently no-ops `transform` on an SVG
   root element that's a grid/flex item (confirmed: width/opacity
   changes apply fine, only transform is ignored), so the rotate-on-open
   below targets this wrapper instead. */
.faq-trigger__icon { display: flex; align-items: center; justify-content: center; width: 1.75rem; height: 1.75rem; color: var(--heritage); transition: transform 0.3s; flex-shrink: 0; }
.faq-trigger__icon svg { width: 100%; height: 100%; }
.faq-item.open .faq-trigger__icon { transform: rotate(45deg); }
.faq-body { display: none; padding-bottom: 2rem; }
.faq-item.open .faq-body { display: block; }

/* Opt-in modifier for a multi-column FAQ layout (e.g. 6 questions as
   2 rows x 3 columns) instead of the default single stacked column.
   Only items in the bottom row go border-free; collapses back to the
   default single-column stack (with only the true last item
   border-free) below the sitewide 900px breakpoint. */
.faq-list--grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: 3rem;
}
.faq-list--grid .faq-item:nth-child(n+4) {
    border-bottom: none;
}
/* .h2's default clamp is sized for a full-width question (sprints.html's
   single-column FAQ); squeezed into a third of the row here it reads
   too large. Scoped to this grid context only — sprints.html's .h2
   FAQ questions are untouched. */
.faq-list--grid .h2 {
    font-size: clamp(1rem, 1.4vw, 1.25rem);
}
@media (max-width: 900px) {
    .faq-list--grid {
        grid-template-columns: 1fr;
    }
    .faq-list--grid .faq-item:nth-child(n+4) {
        border-bottom: 1px solid var(--rule);
    }
    .faq-list--grid .faq-item:last-child {
        border-bottom: none;
    }
}

/* ═══ FIT GRID ═══
   Shared between learning-partnerships.html, community-owned-evaluation.html,
   for-artists-and-movements.html. Mobile column-collapse stays page-local
   (gap value differs slightly between pages). */
.fit-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 5rem; align-items: start; }
.fit-note { min-height: 200px; margin-bottom: 2rem; }

.qa-list { display: flex; flex-direction: column; }
.qa-item { display: grid; grid-template-columns: 1fr 1fr; gap: 6rem; padding: 3rem 0; border-bottom: 1px solid var(--rule); align-items: start; }
.qa-item:last-child { border-bottom: none; }

/* Same as .h2, but weight 300 instead of .h2's 350 — kept as its own
   class (rather than bumping with .h2) so FAQ/Q&A questions can be
   tuned independently of section headings sitewide. Still an <h3> for
   document outline/SEO; this only changes the visual styling. */
.qa-question {
    font-family: var(--serif);
    font-size: clamp(1.5rem, 2.5vw, 2rem);
    font-weight: 300;
    color: var(--ink);
    margin-bottom: 2rem;
    line-height: 1.2;
    letter-spacing: -0.01em;
    text-transform: lowercase;
}

/* Inline exception for an acronym that needs to stay capitalized inside
   an otherwise-lowercased heading (.h1/.h2/.qa-question, etc.) — wrap
   just that word, not the whole heading. */
.caps { text-transform: none; }


@media (max-width: 900px) {
    .qa-item { grid-template-columns: 1fr; gap: 1.5rem; }
}

@media (max-width: 800px) {
    .article-header, .article-body, .article-featured-image { padding-left: 1.5rem; padding-right: 1.5rem; }
    .related { padding: 3rem 1.5rem; }
    .related__grid { grid-template-columns: 1fr; }
    .related__card { border-right: none; border-bottom: 1px solid rgba(214, 208, 192, 0.3); padding: 2rem 0; }
    .related__card:last-child { padding-left: 0; border-bottom: none; }
}

/* ═══ ARTICLE COMPONENTS (shared across article pages) ═══ */
.article-body .pullquote { border-left: 2px solid var(--heritage); padding: 0.25rem 0 0.25rem 2rem; margin: 3rem 0; }
.article-body .pullquote p { font-family: var(--serif); font-size: 1.5rem; font-style: italic; line-height: 1.4; color: var(--ink); margin-bottom: 0; letter-spacing: 0.03em; }

.game-cards { display: flex; flex-wrap: wrap; justify-content: center; margin: 2rem 0; }
.game-cards > *:not(:last-child) { margin-right: 1rem; margin-bottom: 1rem; }
.game-card { border: 1px solid #8C5A3C; padding: 1rem; min-width: 140px; text-align: center; font-family: var(--body); font-size: clamp(0.75rem, 1.2vw, 0.9rem); font-weight: 250; line-height: 1.4; color: var(--ink); }

.featured__title {
    font-family: var(--serif);
    font-size: clamp(1.75rem, 3vw, 2.5rem);
    font-weight: 300;
    line-height: 1.15;
    color: var(--ink);
    margin-bottom: 1.25rem;
    text-decoration: none;
    display: block;
    transition: transform 0.2s;
}

.featured__title:hover {
    transform: translateY(-4px);
}

.featured__title em {
    font-style: italic;
    color: #CC9762;
}

.section--cream .featured__title em,
.section--light .featured__title em {
    color: #8C5A3C;
}

.written-work-title {
    font-family: var(--serif);
    font-size: clamp(1.25rem, 2vw, 1.7rem);
    font-weight: 300;
    color: var(--ink);
    margin-bottom: 2rem;
    line-height: 1.2;
    letter-spacing: -0.01em;
    text-transform: none;
    transition: transform 0.2s;
}

.writing-card:hover .written-work-title,
.post-card:hover .written-work-title {
    transform: translateY(-4px);
}

.written-work-title--light {
    color: #12100D;
}

.written-work-title--dark {
    color: #FFF5EC;
}

.written-work-title--heritage {
    color: var(--heritage);
}

.written-work-title--accent {
    color: #CC9762;
}

.h3 {
    font-family: var(--serif);
    font-size: clamp(1.1rem, 1.5vw, 1.4rem);
    font-weight: 350;
    line-height: 1.2;
    color: var(--heritage);
    margin-bottom: 0.5rem;
    margin-top: 0.5rem;
    letter-spacing: -0.01em;
    text-transform: lowercase;
}

.h3--italic {
    font-style: italic;
    color: var(--ink);
    transition: color 0.2s;
}

.writing-card:hover .h3--italic {
    color: var(--heritage);
}

.services-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem; }
.service-card { position: relative; padding: 2rem; display: flex; flex-direction: column; }
.service-card > *:not(:last-child) { margin-bottom: 1rem; }

.service-card::after {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    width: 18px;
    height: 18px;
    border-top: 1px solid #CC9762;
    border-right: 1px solid #CC9762;
}

.section--light .service-card::after {
    border-top-color: #8C5A3C;
    border-right-color: #8C5A3C;
}

/* ═══ CONTACT SECTION ═══ */
.contact-left { padding: 6rem 4rem 6rem 10vw; display: flex; flex-direction: column; justify-content: center; }
.contact-left > *:not(:last-child) { margin-bottom: 2.5rem; }
.contact-right { padding: 6rem 10vw 6rem 4rem; display: flex; flex-direction: column; }
.contact-field { padding: 1.5rem 0; border-bottom: 1px solid var(--rule); display: flex; flex-direction: column; }
.contact-field > *:not(:last-child) { margin-bottom: 0.4rem; }
.contact-field:first-child { padding-top: 0; }
.contact-field:last-child { border-bottom: none; }

/* ═══ FOOTER LINKS ═══ */
/* The socials cluster — the only .footer-links group left now that
   Privacy Policy is its own centered item directly in <footer> (see
   below) and Creative Collaborations was dropped from the footer
   entirely. justify-self: end pins it to the right edge of footer's
   own grid column instead of drifting toward the middle. */
.footer-links { display: flex; align-items: center; justify-self: end; }
.footer-links > *:not(:last-child) { margin-right: 1.5rem; }

.contact-heading {
    font-family: var(--serif);
    font-size: clamp(2rem, 3.5vw, 3.2rem);
    font-weight: 300;
    line-height: 1.15;
    color: var(--ink);
    text-transform: lowercase;
    margin-bottom: 1.5rem;
}

.contact-heading em,
.contact-heading span {
    font-style: italic;
    color: #CC9762;
    font-family: var(--serif);
}

.section--light .contact-heading em,
.section--light .contact-heading span {
    color: var(--heritage);
}

.cta-eyebrow {
    font-family: var(--mono);
    font-size: 0.75rem;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: #CC9762;
}

.section--light .cta-eyebrow {
    color: var(--heritage);
}

.cta-details {
    font-family: var(--serif);
    font-size: 1.35rem;
    font-weight: 300;
    color: var(--ink);
    line-height: 1.3;
    margin-bottom: 0.5rem;
    margin-top: 0.5rem;
}

a.cta-details {
    text-decoration: none;
}

.cta-list {
    list-style: none;
    margin-top: 0.75rem;
    display: flex;
    flex-direction: column;
}
.cta-list > *:not(:last-child) { margin-bottom: 0.6rem; }

.cta-list li {
    font-family: var(--body);
    font-size: 0.9rem;
    font-weight: 250;
    letter-spacing: 0;
    line-height: 1.75;
    color: var(--ink-mid);
    padding-left: 1.25rem;
    position: relative;
}

.cta-list li::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0.6em;
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: #CC9762;
}

.section--light .cta-list li::before {
    background: var(--heritage);
}

.body {
    font-family: var(--body);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1rem);
    font-weight: 300;
    line-height: 1.75;
    color: #12100D;
    margin-bottom: 1.5rem;
}

/* Originally a smaller, non-viewport-scaled variant of .body for the
   studio dashboard's dense chrome — after review, font-size was matched
   back to .body's own clamp (dashboard text reads better at the site's
   normal body size after all). Kept as a distinct class rather than
   reverting every .body-sm reference back to .body, since the two may
   diverge again later. */
.body-sm {
    font-family: var(--body);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1rem);
    font-weight: 300;
    line-height: 1.75;
    color: #12100D;
    margin-bottom: 1.5rem;
}

.body--light { color: #FFF5EC; }

.body--dark { color: #12100D; }

/* ═══ PAGE HERO ═══
   Shared scaffolding for the full-bleed grid-marker hero section.
   Previously copy-pasted independently in each page's own <style>
   block. .hero-grid-bg itself (the mask wrapper) and .go-rows'/.go-col's
   mobile stacking stay page-specific — their mask-fade stops and marker
   sizing differ slightly page to page. */
.page-hero {
    position: relative;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    padding: 0 0 5rem;
    overflow: hidden;
}
/* Heritage/tan hero variant — reinvented independently on sprints.html,
   issue-area-networks.html, creative-collaborations.html, mel.html. */
.page-hero--heritage { background: #8C5A3C; color: #FFF5EC; }

.hero-grid-bg__line { position: absolute; background: var(--grid); }
.go-cols {
    position: absolute; top: calc(var(--grid-size, 96px) / 2 + 10px); left: 0; right: 0; height: 30px;
    display: flex; align-items: flex-end;
    padding-left: calc(var(--grid-size, 96px) / 2 + 8px); padding-bottom: 4px; pointer-events: none;
}
.go-col { width: var(--grid-size, 96px); text-align: center; flex-shrink: 0; }
/* flex-shrink:0 matches .go-col — without it, flexbox proportionally
   shrinks every row below grid-size whenever the generated row count
   overflows the container's actual height, and that per-row shortfall
   compounds going down (same bug class as .star-map-row). */
.go-row { height: var(--grid-size, 96px); flex-shrink: 0; display: flex; align-items: center; justify-content: flex-end; padding-right: 4px; }
.hero-inner { position: relative; padding: 0 10vw; z-index: 1; }

.page-hero .body,
.secondary-hero .body {
    color: #FFF5EC !important;
    max-width: 420px;
    margin-top: 3rem;
    overflow: hidden;
}

.page-hero .title { color: #FFF5EC; }

.page-hero .title em { color: #CC9762; font-style: italic; }

.page-hero .title--secondary em { color: #12100D; }

.annotation {
    font-family: var(--mono);
    font-size: 0.85rem;
    font-weight: normal;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #CC9762;
    display: block;
    margin-bottom: 0.5rem;
}

.annotation--light {
    color: #8C5A3C;
}

/* For a "label: value" annotation line where the label prefix (e.g.
   "Element 1:") stays the standard gold and the payload after it
   reads as plain off-white instead — wrap the payload in this span. */
.annotation__value {
    color: #FFF5EC;
}

.section--light .annotation {
    color: #8C5A3C;
}

/* ═══ SUB-SERVICE CARDS ═══
   The "how we can work together" grid cards on COE, AMC, and LP —
   previously three page-local copies under two different names
   (COE/AMC's .work-item, LP's .service-item), byte-identical except
   LP hardcoding the corner-bracket color instead of using
   var(--heritage). Unified here under one name/one definition since
   it's the same component everywhere; each page's own <style> block
   no longer defines this. */
/* The wrapping grid itself — same story: COE/AMC called it .work-list,
   LP called it .service-grid, identical CSS in both. */
.sub-service-list { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem; }
.sub-service { position: relative; padding: 2rem; display: flex; flex-direction: column; }
.sub-service > *:not(:last-child) { margin-bottom: 1rem; }
.sub-service::after { content: ''; position: absolute; top: 0; right: 0; width: 18px; height: 18px; border-top: 1px solid var(--heritage); border-right: 1px solid var(--heritage); }
/* LP-only modifier, carried over unused (no current markup applies
   it) — kept per this site's own policy of not stripping
   plausible/on-brand unused variants. */
.sub-service--wide { grid-column: 1; }

@media (max-width: 900px) {
    .sub-service-list { grid-template-columns: 1fr; }
    .sub-service, .sub-service:nth-child(even) { padding: 2.5rem 0; border-right: none; }
}

/* ═══ PHASE LABEL ═══
   The floating phase/element number + name + body copy shown beside
   the scroll-pinned "our approach"-style animations (LP, AMC, and
   CoE's "nautilus" section). Previously copy-pasted independently in
   each page's own <style> block — CoE's copy had already drifted
   (different body font-size, a hardcoded color instead of the shared
   ink token) before this was centralized here. Page-specific pieces
   (CoE's __outcome line, LP's --summary grid) stay local to their
   own pages since they don't apply everywhere this component is used. */
.approach-label {
    position: absolute;
    top: 50%;
    left: 10vw;
    transition: opacity 0.3s ease;
    max-width: 380px;
    z-index: 2;
    opacity: 0;
    /* Flex column so .approach-nav (margin-top: auto, below) can pin
       itself to the bottom of this box — paired with a JS-measured
       fixed height (lockLabelHeight/lockTextColHeight) so the nav sits
       at the same spot regardless of which phase's text is showing,
       instead of following the text's own varying length. */
    display: flex;
    flex-direction: column;
}

/* Wraps just the stage/name/body/outcome text — .approach-nav (a sibling,
   below) fades on its own schedule (i.e. not at all, once revealed) so
   Back/Next/the counter stay put and only the copy crossfades between
   phases. */
.approach-label__text {
    transition: opacity 0.3s ease;
    /* Forces this whole block onto a single GPU compositing layer before
       the transition starts. Without it, Safari can tile a multi-line
       text block into separate layers for an opacity transition, and one
       tile's repaint lands a frame behind the other — visible as one half
       of the text (reliably the same half) fading a beat later than the
       rest. */
    will-change: opacity;
}

.approach-label__stage {
    display: block;
    font-family: var(--mono);
    font-size: 0.75rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: #CC9762;
    margin-bottom: 0.5rem;
}

.approach-label__name {
    display: block;
    font-family: var(--serif);
    font-size: 1.4rem;
    font-weight: 300;
    color: var(--ink);
    margin-bottom: 0.75rem;
}

/* overflow: hidden on .approach-label__body/__outcome below is the
   same Safari-only text-selection BFC fix as .article-body and the
   other max-width-only text blocks elsewhere in this file (see that
   comment) — missed here when this component was centralized, since
   it predates that fix. */
.approach-label__body {
    display: block;
    font-family: var(--body);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1rem);
    font-weight: 300;
    line-height: 1.75;
    color: var(--ink-mid);
    max-width: 340px;
    margin: 0 0 0.5rem;
    overflow: hidden;
}

/* Impact statement under each phase (LP's "What you get:", COE's
   "Outcome:", AMC's "Why it matters:") — same mono/gold treatment as
   .annotation. Was duplicated identically in LP's and COE's own local
   <style> blocks before AMC needed it too; centralized here instead of
   adding a third copy. */
.approach-label__outcome {
    display: block;
    font-family: var(--mono);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1rem);
    letter-spacing: 0.03em;
    line-height: 1.8;
    color: #CC9762;
    max-width: 340px;
    margin: 2em 0 0;
    transition: opacity 0.3s ease;
    overflow: hidden;
}

.approach-label__outcome span {
    text-transform: uppercase;
    letter-spacing: 0.1em;
    margin-right: 0.4em;
}

/* Rewatch control for the "our approach" scroll animations (LP/COE) —
   those play once and stay in their completed state regardless of
   further scrolling by design, so this is the only way to see the
   sequence again without a page refresh. */
.approach-rewatch {
    display: inline-flex; align-items: center; gap: 0.5em;
    margin-top: 1.75rem;
    padding-top: 1rem;
    border: none;
    border-top: 1px solid rgba(255,245,236,0.9);
    background: none;
    font-family: var(--mono);
    font-size: 0.7rem;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: rgba(255,245,236,0.9);
    cursor: pointer;
    opacity: 0;
    pointer-events: none;
    transition: color 0.2s ease, opacity 0.5s ease;
}
.approach-rewatch.is-visible { opacity: 1; pointer-events: auto; }
.approach-rewatch:hover { color: #CC9762; }

/* Step nav (LP/AMC/COE "our approach" animations) — replaces the old
   end-of-sequence-only rewatch control with persistent Back/Next
   navigation, visible from the first phase. Back jumps instantly to
   the end state of the previous phase (no reverse animation — the
   point is landing where that phase left off, not watching it
   undraw); Next plays the following phase's draw-in animation, or
   relabels to "Restart" on the final phase to replay from the top. */
.approach-nav {
    margin-top: auto;
}
/* The divider is a border on the row itself rather than a separately
   sized element — a row is only as wide as its own content (Back …
   Next), so the border-top automatically matches that width exactly,
   not the full label column. */
.approach-nav__row {
    display: flex;
    align-items: center;
    padding-top: 1rem;
    /* No divider above this — tried it (both full-width and shrunk to
       just this row's own width), read as visual clutter either way.
       Left-aligned (not centered in the label column) — the column's
       right edge is empty air on every phase, since the body/outcome
       text is ragged-right and rarely reaches it, so centering-in-box
       read as the nav sitting well right of the text's real visual
       mass. The left edge, on the other hand, is the one line every
       phase's text already shares. */
    width: fit-content;
}
/* margin, not the row's own gap: 1.25rem — flexbox gap isn't supported
   until Safari 14.1 (iOS 14.5); without it Back/counter/Next had zero
   spacing and read as one squished string ("BACK1 / 4NEXT"). */
.approach-nav__row > *:not(:last-child) { margin-right: 1.25rem; }
.approach-nav__btn {
    display: inline-flex; align-items: center; gap: 0.4em;
    border: none;
    background: none;
    padding: 0;
    font-family: var(--mono);
    font-size: 0.7rem;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: #FFF5EC;
    cursor: pointer;
    transition: color 0.2s ease, opacity 0.2s ease;
}
.approach-nav__btn:hover:not(:disabled) { color: #CC9762; }
.approach-nav__btn:disabled { opacity: 0.35; cursor: default; }
/* Nudges Next if it's sat unclicked a few seconds (see the JS idle-pulse
   timer) — cycles up to gold and back to the resting white, with a soft
   glow at the peak so the "illuminated" beat still reads clearly even
   though it's no longer rising from a dim resting color. */
@keyframes approach-nav-pulse {
    0%, 100% { color: #FFF5EC; text-shadow: none; }
    50% { color: #CC9762; text-shadow: 0 0 10px rgba(204,151,98,0.6); }
}
.approach-nav__btn--pulse { animation: approach-nav-pulse 1.8s ease-in-out infinite; }
.approach-nav__counter {
    font-family: var(--mono);
    font-size: 0.7rem;
    letter-spacing: 0.1em;
    color: rgba(255,245,236,0.55);
}

.call-out-box {
    padding: 1.5rem 2rem;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}

.call-out-box :last-child {
    margin-bottom: 0;
}

/* .btn-primary's sitewide align-self: flex-start (correct for its many
   other flex-container uses) would otherwise override this box's own
   centering just for its own button. */
.call-out-box .btn-primary {
    align-self: center;
}

.call-out-box .annotation {
    margin-bottom: 1.25rem;
    text-align: center;
}

/* Only the title and button are centered — under align-items:center
   the body text would otherwise also shrink-wrap into a narrow,
   centered column instead of reading as ordinary left-aligned copy. */
.call-out-box p {
    align-self: stretch;
    text-align: left;
}

.mel-item__letter {
    font-family: var(--serif);
    font-size: clamp(4rem, 8vw, 7rem);
    font-weight: 300;
    font-style: italic;
    line-height: 1;
    color: var(--heritage);
    display: block;
    margin-bottom: 0.5rem;
}

.mel-item__letter--inline {
    display: inline-block;
    font-size: clamp(4rem, 8vw, 7rem);
    line-height: 0.7;
    vertical-align: -0.22em;
    margin-bottom: 0;
    margin-right: 0.02em;
}

.call-out-box--light {
    background: #F9E9DB;
}

.call-out-box--dark {
    background: var(--ink-faint);
}

.call-out-box--dark .body {
    color: var(--ink-mid);
}

.stat-note {
    color: var(--ink-mid);
}

.section--light .stat-note {
    color: #1a1815;
}

.quote {
    font-family: var(--serif);
    font-size: clamp(1.4rem, 2.2vw, 1.85rem);
    font-style: italic;
    font-weight: 250;
    line-height: 1.4;
    color: #FFF5EC;
    border-left: 1.5px solid #CC9762;
    padding-left: 1.5rem;
}

.quote--light {
    color: #12100D;
    border-left-color: #8C5A3C;
}

.quote--dark {
    color: #FFF5EC;
    border-left-color: #CC9762;
}

.key-statement {
    font-family: var(--serif);
    font-size: clamp(1.4rem, 2.2vw, 1.85rem);
    font-style: italic;
    font-weight: 250;
    line-height: 1.4;
}

.key-statement--light {
    color: #8C5A3C;
}

.key-statement--dark {
    color: #CC9762;
}

.key-statement--ink {
    color: #12100D;
}

.bulleted-list {
    list-style: none;
    margin-top: 0.75rem;
    margin-bottom: 1.5rem;
    display: flex;
    flex-direction: column;
    padding-left: 3rem;
}
.bulleted-list > *:not(:last-child) { margin-bottom: 0.6rem; }

.bulleted-list li {
    font-family: var(--body);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1rem);
    font-weight: 250;
    letter-spacing: 0;
    line-height: 1.75;
    color: var(--ink);
    padding-left: 1.25rem;
    position: relative;
}

.bulleted-list li::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0.6em;
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: var(--heritage);
}

.bulleted-list--dark-bg li::before {
    background: #CC9762;
}

.grid-marker {
    font-family: var(--mono);
    font-size: 0.4375rem;
    letter-spacing: 0.1em;
    color: #FFF5EC;
    opacity: 0.2;
}

.grid-marker--zero { color: #CC9762 !important; opacity: 1; }

/* Separate opacity lever for grid markers on the heritage/rust hero
   variant (sprints, IAN, creative-collaborations, mel) — the same
   off-white against a lighter, warmer background reads differently
   than it does against the near-black hero background, so this is
   tuned independently from the plain .grid-marker rule above. */
.page-hero--heritage .grid-marker { opacity: 0.4; }

.go-col {
    width: var(--grid-size, 96px);
    text-align: center;
    flex-shrink: 0;
}

strong { color: #8C5A3C; }

/* ─── NAVIGATION STYLES ─── */

/* .nav-wordmark is the pre-unification class name, still used by most
   pages' nav markup; aliased here rather than renamed sitewide. */
.wordmark,
.nav-wordmark {
    font-family: var(--serif);
    font-size: clamp(0.9375rem, calc(1.3vw + 2.2px), 1.125rem);
    font-weight: 250;
    letter-spacing: 0.01em;
    text-transform: lowercase;
    color: #FFF5EC;
    line-height: 1.5;
}

.wordmark--light { color: #12100D; }

nav.nav--light .wordmark,
nav.nav--light .nav-wordmark {
    color: #12100D;
}

/* "Studio" in the wordmark picks up the same accent used everywhere
   else on the page: gold on a dark nav, heritage tan once the nav
   crosses into a light section — mirrors nav.nav--light above rather
   than introducing a new color. */
.wordmark__studio { color: #CC9762; font-style: italic; }

.wordmark--light .wordmark__studio,
nav.nav--light .wordmark__studio {
    color: var(--heritage);
}

/* Nav sitting over the heritage/tan hero variant (sprints/IAN/creative-
   collaborations/mel) is a third case, distinct from both states above
   — it's not nav--light (that's only added once scrolled past the
   hero), so the wordmark falls back to its plain gold accent, which
   reads too close to the hero's own tan (#8C5A3C) background to stay
   legible. Toggled by each page's own updateNavStyling(). */
nav.nav--heritage .wordmark__studio {
    color: #12100D;
}

.nav,
.nav-link,
.nav__links a {
    font-family: var(--body);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1.025rem);
    font-weight: 250;
    letter-spacing: 0.01em;
    text-transform: lowercase;
    color: #FFF5EC;
    text-decoration: none;
    transition: color 0.15s;
}

.nav:hover, .nav:focus,
.nav-link:hover, .nav-link:focus,
.nav__links a:hover, .nav__links a:focus { color: #CC9762; }

.nav-link[aria-current="page"] { color: #12100D; }

nav.nav--light .nav,
nav.nav--light .nav-link,
nav.nav--light .nav__links a {
    color: #12100D;
}

nav.nav--light .nav:hover,
nav.nav--light .nav:focus,
nav.nav--light .nav-link:hover,
nav.nav--light .nav-link:focus,
nav.nav--light .nav__links a:hover,
nav.nav--light .nav__links a:focus {
    color: #8C5A3C;
}

.nav--light { color: #12100D; }

.nav--light:hover, .nav--light:focus { color: #8C5A3C; }

/* ═══ NAV STRUCTURE ═══
   Layout/behavior for the primary nav bar, its dropdown submenus, and the
   mobile hamburger panel. Previously copy-pasted verbatim in CoE, LP, and
   AMC's own <style> blocks. */
nav { position: fixed; top: 0; left: 0; right: 0; z-index: 200; padding: 1.5rem 3rem; display: flex; align-items: center; justify-content: space-between; }
nav::before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; background: #12100D; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); pointer-events: none; transition: background 0.15s; }
nav.nav--light::before { background: #FFF5EC; }
.nav__logo { display: flex; align-items: center; text-decoration: none; position: relative; }
.nav__logo > *:not(:last-child) { margin-right: 0.875rem; }
.nav__links { display: flex; align-items: center; list-style: none; position: relative; }
.nav__links > *:not(:last-child) { margin-right: 2rem; }
.has-dropdown { position: relative; }
.nav__dropdown {
    display: block;
    position: absolute;
    top: calc(100% + 0.75rem);
    left: 0;
    transform: none;
    background: #12100D;
    padding: 1.5rem 1rem;
    min-width: 220px;
    list-style: none;
    z-index: 300;
    pointer-events: none;
    opacity: 0;
    transition: opacity 0.25s ease, background 0.15s;
    -webkit-backdrop-filter: blur(2px);
    backdrop-filter: blur(2px);
}
nav.nav--light .nav__dropdown { background: #FFF5EC; }
.nav__dropdown li { position: relative; opacity: 0; transform: translateY(-6px); transition: opacity 0.2s ease, transform 0.2s ease; padding: 0.5rem 0; }
.nav__dropdown a { line-height: 1; }
.has-dropdown:hover .nav__dropdown,
.has-dropdown:focus-within .nav__dropdown { opacity: 1; pointer-events: auto; }
.has-dropdown:hover .nav__dropdown li,
.has-dropdown:focus-within .nav__dropdown li { opacity: 1; transform: translateY(0); }
.has-dropdown:hover .nav__dropdown li:nth-child(1),
.has-dropdown:focus-within .nav__dropdown li:nth-child(1) { transition-delay: 0s; }
.has-dropdown:hover .nav__dropdown li:nth-child(2),
.has-dropdown:focus-within .nav__dropdown li:nth-child(2) { transition-delay: 0.05s; }
.has-dropdown:hover .nav__dropdown li:nth-child(3),
.has-dropdown:focus-within .nav__dropdown li:nth-child(3) { transition-delay: 0.1s; }
.has-dropdown:hover .nav__dropdown li:nth-child(4),
.has-dropdown:focus-within .nav__dropdown li:nth-child(4) { transition-delay: 0.15s; }
.has-dropdown:hover .nav__dropdown li:nth-child(5),
.has-dropdown:focus-within .nav__dropdown li:nth-child(5) { transition-delay: 0.2s; }
.nav__dropdown::before { content: ''; position: absolute; top: -0.75rem; left: 0; right: 0; height: 0.75rem; }

.nav__burger {
    display: none;
    flex-direction: column;
    justify-content: center;
    width: 28px;
    height: 22px;
    background: none;
    border: none;
    cursor: pointer;
    padding: 0;
    position: relative;
    z-index: 250;
}
.nav__burger span {
    display: block;
    width: 100%;
    height: 1.5px;
    background: #FFF5EC;
    transition: transform 0.25s ease, opacity 0.2s ease;
}
/* margin, not the parent's gap: 5px — flexbox gap isn't supported
   until Safari 14.1 (iOS 14.5); without it the three bars had zero
   spacing and rendered as one solid bar instead of a hamburger icon. */
.nav__burger span:not(:last-child) { margin-bottom: 5px; }
nav.nav--light .nav__burger span { background: #12100D; }
.nav__burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
.nav__burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav__burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }

nav.nav--secondary::before { background: #8C5A3C; }

nav.nav--secondary.nav--light::before { background: #FFF5EC; }

nav.nav--secondary .nav-wordmark { color: #FFF5EC; }

nav.nav--secondary .nav-link { color: #FFF5EC; }

nav.nav--secondary .nav-link:hover, nav.nav--secondary .nav-link:focus { color: #12100D; }

nav.nav--secondary .nav__dropdown { background: #8C5A3C; }

nav.nav--secondary.nav--light .nav__dropdown { background: #FFF5EC; }

nav.nav--secondary .nav-submenu { color: #FFF5EC; }

nav.nav--secondary .nav-submenu:hover, nav.nav--secondary .nav-submenu:focus { color: #12100D; }

nav.nav--secondary .nav__dropdown .nav-link { color: #FFF5EC; }

nav.nav--secondary .nav__dropdown .nav-link:hover, nav.nav--secondary .nav__dropdown .nav-link:focus { color: #12100D; }

nav.nav--secondary.nav--light .nav-wordmark { color: #12100D; }

nav.nav--secondary.nav--light .nav-link { color: #12100D; }

nav.nav--secondary.nav--light .nav-link:hover, nav.nav--secondary.nav--light .nav-link:focus { color: #8C5A3C; }

nav.nav--secondary.nav--light .nav-submenu { color: #12100D; }

nav.nav--secondary.nav--light .nav-submenu:hover, nav.nav--secondary.nav--light .nav-submenu:focus { color: #8C5A3C; }

nav.nav--secondary.nav--light .nav__dropdown .nav-link { color: #12100D; }

nav.nav--secondary.nav--light .nav__dropdown .nav-link:hover, nav.nav--secondary.nav--light .nav__dropdown .nav-link:focus { color: #8C5A3C; }

/* Grid, not flex — three genuinely distinct positions (copyright far
   left, Privacy Policy centered in the FULL footer width, socials far
   right), and flexbox's justify-content:space-between only guarantees
   even gaps between items, not a true center for the middle one once
   the two outer items are unequal widths (copyright's text is longer
   than "LinkedIn Instagram"). The two 1fr side columns stay equal
   regardless of that imbalance, so the auto-sized middle column
   always lands on the true center line. */
footer {
    border-top: 1px solid var(--rule);
    padding: 1.5rem 10vw;
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    align-items: center;
}

footer .has-dropdown {
    position: relative;
}

footer .nav__dropdown {
    position: absolute;
    bottom: calc(100% + 0.25rem) !important;
    top: auto !important;
    right: 0 !important;
    left: auto !important;
    background: #12100D;
    list-style: none;
    padding: 0.5rem 0;
    margin: 0;
    min-width: 200px;
    z-index: 100;
    opacity: 0;
    pointer-events: auto;
    transform: translateY(-4px) !important;
    transition: opacity 0.2s, transform 0.2s;
}

footer .nav__dropdown::before {
    content: '';
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    height: 0.25rem;
}

footer .nav__dropdown li {
    display: block;
}

footer .nav__dropdown a {
    display: block;
    padding: 0.5rem 1rem;
    font-size: 0.65rem;
}

footer .has-dropdown:hover .nav__dropdown,
footer .nav__dropdown:hover {
    opacity: 1;
    pointer-events: auto;
    transform: translateY(0);
}

.nav-submenu {
    font-family: var(--body);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1.025rem);
    font-weight: 250;
    letter-spacing: 0.01em;
    text-transform: lowercase;
    color: #FFF5EC;
    text-decoration: none;
    line-height: 1;
    transition: color 0.15s;
}

/* Expands the clickable area to the full li (including the gap between
   two wrapped lines) without touching the link's own text/line-height —
   same idea as the star-map's separate invisible hit rect on about.html.
   ::after is still part of this <a>, so clicking anywhere in that filled
   box activates the link itself; needs .nav__dropdown li's own
   position:relative to size against that li specifically. */
.nav-submenu::after { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; }

.nav-submenu:hover, .nav-submenu:focus { color: #CC9762; }

.nav-submenu--light { color: #12100D; }

.nav-submenu--light:hover, .nav-submenu--light:focus { color: #8C5A3C; }

nav.nav--light .nav-submenu {
    color: #12100D;
}

nav.nav--light .nav-submenu:hover,
nav.nav--light .nav-submenu:focus {
    color: #8C5A3C;
}

.btn-primary {
    font-family: var(--mono);
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    background: var(--ink);
    color: var(--bg);
    /* Uppercase mono text has no true descenders, but the font still
       reserves descender space in its line box — with symmetric padding
       that leaves visibly more room below the letters than above. Tuned
       against real Safari rendering (font-metrics math undershot badly),
       landing at 0.18em. */
    padding: calc(0.6rem + 0.18em) 1.25rem calc(0.6rem - 0.18em);
    text-decoration: none;
    display: inline-block;
    transition: background 0.2s, color 0.2s;
    align-self: flex-start;
    border: none;
    cursor: pointer;
}

.btn-primary:hover {
    background: var(--heritage);
    color: var(--ink);
}

.btn-ghost {
    display: inline-block;
    font-family: var(--mono);
    font-size: 0.6rem;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--ink-mid);
    border: 1px solid var(--rule);
    /* Same descender-reservation fix as .btn-primary above — measured via
       canvas actualBoundingBoxAscent/Descent on this font (Overpass) at
       button scale: ~13% of font-size sits unused below all-caps text,
       split here as a 0.065em shift each way. */
    padding: calc(0.75rem + 0.065em) 1.75rem calc(0.75rem - 0.065em);
    text-decoration: none;
    transition: color 0.2s, border-color 0.2s;
}

.btn-ghost:hover {
    color: var(--ink);
    border-color: var(--ink-mid);
}

.btn-primary--light {
    font-family: var(--mono);
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    background: #12100D;
    color: #FFF5EC;
    padding: calc(0.6rem + 0.18em) 1.25rem calc(0.6rem - 0.18em);
    text-decoration: none;
    display: inline-block;
    transition: background 0.2s, color 0.2s;
    border: none;
    cursor: pointer;
}

.btn-primary--light:hover {
    background: var(--heritage);
    color: #FFF5EC;
}

.btn-primary--dark {
    font-family: var(--mono);
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    background: #12100D;
    color: #FFF5EC;
    padding: calc(0.6rem + 0.18em) 1.25rem calc(0.6rem - 0.18em);
    text-decoration: none;
    display: inline-block;
    transition: background 0.2s, color 0.2s;
    border: none;
    cursor: pointer;
}

.btn-primary--dark:hover {
    background: #FFF5EC;
    color: #12100D;
}

.cause-card {
    text-align: center;
}

.cause-card .btn-primary--light {
    margin-top: auto;
}

/* ═══ HERITAGE CTA (article end banner) ═══ */
.article-end { background: #8C5A3C; padding: 4rem 3rem; }
.article-end__inner { max-width: 820px; margin: 0 auto; display: grid; grid-template-columns: 1fr auto; gap: 2rem; align-items: center; overflow: hidden; }
.article-end__label { display: block; margin-bottom: 0.75rem; color: #FFF5EC; }
.article-end h2 { font-family: var(--serif); font-size: clamp(1.5rem, 3vw, 2.25rem); font-weight: 200; color: #FFF5EC; margin-top: 0; margin-bottom: 1.5rem; line-height: 1.2; letter-spacing: -0.01em; text-transform: lowercase; }
.article-end__text { font-family: var(--serif); font-size: 1.35rem; font-style: italic; color: #FFF5EC; line-height: 1.4; max-width: 520px; overflow: hidden; }
.article-end__actions { display: flex; flex-direction: column; align-items: stretch; flex-shrink: 0; }
.article-end__actions > *:not(:last-child) { margin-bottom: 0.75rem; }
.article-end .btn-ghost { background: transparent; color: #FFF5EC; border: 1px solid #FFF5EC; text-align: center; font-size: 0.55rem; letter-spacing: 0.18em; padding: calc(0.6rem - 1px + 0.065em) 1.25rem calc(0.6rem - 1px - 0.065em); }
.article-end .btn-ghost:hover { background: #0F0D0A; border-color: #0F0D0A; color: #FFF5EC; }
.article-end .btn-primary--light { background: #FFF5EC; color: #0F0D0A; font-size: 0.625rem; text-align: center; }
.article-end .btn-primary--light:hover { background: #0F0D0A; color: #FFF5EC; }

@media (max-width: 800px) {
    .article-end { padding: 3rem 1.5rem; }
    .article-end__inner { grid-template-columns: 1fr; }
    .article-end__actions { align-items: stretch; width: fit-content; justify-self: center; }
}

/* ═══ HERITAGE HERO DARK BUTTON (issue-area-networks, creative-collaborations) ═══ */
.hero-inner .btn-primary--dark { margin-top: 1rem; background: #FFF5EC; color: #0F0D0A; }
.hero-inner .btn-primary--dark:hover { background: #0F0D0A; color: #FFF5EC; }

.read-more {
    font-family: var(--mono);
    font-size: 0.625rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: #FFF5EC;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
    transition: color 0.2s;
    margin-top: auto;
}

.read-more::before {
    content: '';
    display: block;
    width: 16px;
    height: 1px;
    background: currentColor;
    transition: width 0.2s;
}

.read-more:hover {
    color: #CC9762;
}

.read-more:hover::before {
    width: 28px;
}

.read-more--light {
    color: #12100D;
}

.read-more--light:hover {
    color: #8C5A3C;
}

.section--light .read-more,
.section--cream .read-more {
    color: #12100D;
}

.section--light .read-more:hover,
.section--cream .read-more:hover {
    color: #8C5A3C;
}

.copyright {
    font-family: var(--body);
    font-size: clamp(0.875rem, calc(1.2vw + 2px), 1.025rem);
    font-weight: 250;
    letter-spacing: 0.01em;
    text-transform: lowercase;
    color: #FFF5EC;
}

footer.footer--light .copyright {
    color: #12100D;
}

footer.footer--light .nav,
footer.footer--light .footer-links a {
    color: #12100D;
}

footer.footer--light .nav:hover,
footer.footer--light .nav:focus,
footer.footer--light .footer-links a:hover,
footer.footer--light .footer-links a:focus {
    color: #8C5A3C;
}

.star-value {
    font-family: var(--mono);
    font-size: 10px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    fill: rgba(240, 236, 223, 0.9);
    pointer-events: auto;
    cursor: pointer;
    transition: fill 0.3s ease, letter-spacing 0.3s ease;
}

.star-value.active {
    fill: #CC9762;
    letter-spacing: 0.2em;
}

@media (max-width: 768px) {
    .star-value {
        font-size: 9px;
    }
}

@media (max-width: 480px) {
    .star-value {
        font-size: 8px;
        letter-spacing: 0.1em;
    }
}

/* ─── INTEREST FORM (shared: creative-collaborations.html, issue-area-networks.html) ─── */
.interest-form { display: flex; flex-direction: column; }
.interest-form .form-field { display: flex; flex-direction: column; padding: 1.1rem 0; }
.interest-form .form-field > *:not(:last-child) { margin-bottom: 0.5rem; }
.interest-form .form-field:first-child { padding-top: 0; }
.interest-form .form-field:last-of-type { border-bottom: none; }
.interest-form .form-field label:not(.check-item):not(.radio-item), .interest-form .form-field .field-label {
    font-family: var(--body); font-size: clamp(0.875rem, calc(1.2vw + 2px), 1rem); font-weight: 300; line-height: 1.75;
    letter-spacing: normal; color: var(--ink); display: block; margin-bottom: 0.5rem;
}
.interest-form .req-mark { color: #5B3A27; margin-left: 0.15em; }
.interest-form .form-field input[type="text"], .interest-form .form-field input[type="email"], .interest-form .form-field input[type="url"], .interest-form .form-field select {
    background: transparent; border: none; border-bottom: 1px solid var(--rule);
    color: var(--ink); font-family: var(--body); font-weight: 250; line-height: 1.75;
    /* 1rem (16px, html's root is a fixed 16px) not 0.9rem — iOS Safari
       auto-zooms the whole page in on focus for any input under 16px,
       and that zoom never gets undone on blur, so IAN/creative-
       collaborations (the two forms using .interest-form) stayed
       zoomed in for the rest of the visit. */
    font-size: 1rem;
    letter-spacing: normal; padding: 0.5rem 0; width: 100%; outline: none;
    transition: border-color 0.2s;
}
.interest-form .form-field input:focus, .interest-form .form-field select:focus { border-color: var(--heritage); }
.interest-form .form-field input::placeholder { color: var(--ink-dim); text-transform: none; font-family: var(--body); font-weight: 250; line-height: 1.75; }
.interest-form .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; }

.interest-form .check-group { display: grid; grid-template-columns: 1fr 1fr; column-gap: 2rem; row-gap: 0; }
.interest-form .check-item { display: flex; align-items: center; padding: 0.6rem 0; cursor: pointer; position: relative; }
.interest-form .check-item > *:not(:last-child) { margin-right: 0.875rem; }
/* Visually hidden, not display:none — the real input still needs to be
   reachable by keyboard (Tab) and toggleable with Space. display:none
   pulls it out of both the tab order and the accessibility tree, so a
   keyboard-only user could never check this box at all. Absolute +
   inset:0 covers the same clickable footprint as the label (which
   already toggles the input on click natively) without adding to the
   flex layout's flow. */
.interest-form .check-item input[type="checkbox"] { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
.interest-form .check-box { width: 14px; height: 14px; border: 1px solid var(--rule); flex-shrink: 0; position: relative; transition: border-color 0.15s; }
.interest-form .check-item input[type="checkbox"]:checked + .check-box { border-color: var(--heritage); }
.interest-form .check-item input[type="checkbox"]:checked + .check-box::after { content: ''; position: absolute; top: 3px; right: 3px; bottom: 3px; left: 3px; background: var(--heritage); }
.interest-form .check-item input[type="checkbox"]:focus + .check-box { outline: 2px solid var(--heritage); outline-offset: 2px; }
.interest-form .check-item span, .interest-form .radio-item span { font-family: var(--body); font-size: clamp(0.875rem, calc(1.2vw + 2px), 1rem); font-weight: 300; line-height: 1.75; letter-spacing: normal; color: var(--ink); transition: color 0.15s; }
.interest-form .check-item:hover span, .interest-form .radio-item:hover span { color: var(--ink); }
.interest-form .check-item input[type="checkbox"]:checked ~ span, .interest-form .radio-item input[type="radio"]:checked ~ span { color: var(--ink); }

.interest-form .form-conditional { overflow: hidden; max-height: 0; transition: max-height 0.35s ease; }

.interest-form .form-submit-row { padding-top: 1.5rem; display: flex; flex-direction: column; align-items: flex-start; }
.interest-form .form-submit-row > *:not(:last-child) { margin-bottom: 0.75rem; }
/* Standalone (not scoped to .interest-form) so any form/feedback
   context sitewide can reuse it. */
.form-message { font-family: var(--body); font-size: clamp(0.75rem, 1.2vw, 0.9rem); font-weight: 250; line-height: 1.75; letter-spacing: normal; padding: 0.75rem 1rem; }
.form-message--success { background: rgba(107,124,66,0.15); border: 1px solid rgba(107,124,66,0.4); color: #a8bc78; }
.form-message--error { background: rgba(184,71,42,0.12); border: 1px solid rgba(184,71,42,0.35); color: var(--heritage); }

/* ═══ UTILITY CLASSES ═══ */
.hidden { display: none; }
.opacity-50 { opacity: 0.5; }
.mb-1-5 { margin-bottom: 1.5rem; }
.mb-xl { margin-bottom: 1.5rem; }
.label-mono { font-family: var(--mono); font-size: 0.45rem; letter-spacing: 0.15em; text-transform: uppercase; color: var(--ink-dim); }
.text-hint { font-size: 0.9rem; color: var(--ink-dim); font-style: italic; }
.img-cover { width: 100%; height: 100%; object-fit: cover; }
.absolute-fill { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; pointer-events: none; }
.divider { display: flex; align-items: center; }
.divider > *:not(:last-child) { margin-right: 1rem; }
.divider span { flex: 1; height: 1px; background: var(--rule); display: block; }
.divider-text { font-family: var(--mono); font-size: 0.75rem; letter-spacing: 0.18em; text-transform: uppercase; color: #8C5A3C; display: inline; margin: 0; }

@media (max-width: 900px) {
    nav { padding: 1.25rem 5vw; }
    .go-cols { display: none; }
    /* Row markers are right-aligned by default, ending just before their
       gridline — fine on desktop, but on narrow viewports a long label
       (e.g. "9°58' N") overflows LEFT past the row's own box, off the
       edge of the screen and clipped. Left-aligning instead makes any
       overflow grow rightward into the visible grid, matching the AMC
       page's markers, which shift right instead of clipping. The small
       upward nudge sits the label just above its gridline instead of
       the line bisecting it, also matching AMC's mobile treatment. */
    .go-row { justify-content: flex-start; padding-left: 4px; padding-right: 0; transform: translateY(-8px); }
    .hero-inner { padding: 0 max(8vw, 4rem); }
    .section { padding: 4rem 5vw; }

    .contact-left { padding: 4rem 5vw 0; }
    .contact-right { padding: 4rem 5vw; }
    .contact-field { border-bottom: none; }

    /* ═══ FOOTER: stack on mobile ═══ */
    /* row/column-gap adapts automatically to flex-direction; margin
       doesn't, so each direction-changing breakpoint needs its own
       explicit override (see styles.css's main flex-gap-to-margin note
       near .article-header__meta for why margin, not gap, at all). */
    footer { display: flex; flex-direction: column; align-items: flex-start; padding: 2rem 5vw; }
    footer > *:not(:last-child) { margin-right: 0; margin-bottom: 1.5rem; }
    .footer-links { justify-self: unset; flex-direction: column; align-items: flex-start; }
    .footer-links > *:not(:last-child) { margin-right: 0; margin-bottom: 0.75rem; }

    /* Mobile-only type bumps — independent of each class's desktop clamp()
       above so mobile and desktop can be tuned separately. Proportional to
       the .body increase (12px -> 14px, +17%); nothing else on the page
       changed size. */
    .body,
    .approach-label__body,
    .article-table td,
    .article-header__byline-value,
    .interest-form .form-field label:not(.check-item):not(.radio-item),
    .interest-form .form-field .field-label,
    .interest-form .check-item span,
    .interest-form .radio-item span {
        font-size: 1rem;
        font-weight: 275;
    }
    /* .approach-label__outcome was left out of the bump above — its
       desktop clamp() bottoms out at 0.875rem on mobile, same as
       .body's did before this rule existed, so the outcome line was
       reading visibly smaller than the surrounding body copy. Matching
       .body's mobile size here, but not its font-weight: outcome uses
       --mono (Overpass), a different family than .body's --body font,
       and isn't tuned for a fractional weight the way .body is. */
    .approach-label__outcome {
        font-size: 1rem;
    }
    .bulleted-list {
        padding-left: 1.5rem;
    }
    .bulleted-list li {
        font-size: 1rem;
        font-weight: 275;
    }
    .cta-list li {
        font-size: 1rem;
        font-weight: 275;
    }
    .annotation {
        font-size: 0.875rem;
    }
    .wordmark,
    .nav-wordmark,
    .nav,
    .nav-link,
    .nav__links a,
    .nav-submenu,
    .copyright {
        font-size: 1.125rem;
    }
    /* clamp, not a flat 4.5rem — the fixed size didn't yield at all
       below ~480px, and several pages' longest headline word (e.g.
       index's "knowledge", atheneum's "atheneum") needed more width
       than was left in the text column at narrower phone widths,
       overflowing off the right edge of the screen instead of
       wrapping. The clamp keeps 4.5rem from ~480px up (unchanged from
       before) and scales down smoothly below that. overflow-wrap is a
       second, independent safety net: even if some future headline's
       longest word still doesn't fit at the clamp's floor, this makes
       it break mid-word onto another line instead of overflowing —
       exactly the failure mode being fixed here. */
    .title {
        font-size: clamp(2.75rem, 14vw, 4.5rem);
        overflow-wrap: break-word;
    }
    .h1 {
        font-size: 2.25rem;
    }
    .h2 {
        font-size: 1.75rem;
    }
    .h3 {
        font-size: 1.25rem;
    }
    .featured__title {
        font-size: 2rem;
    }
    .written-work-title {
        font-size: 1.4rem;
    }
    .contact-heading {
        font-size: 2.25rem;
    }
    .mel-item__letter,
    .mel-item__letter--inline {
        font-size: 4.5rem;
    }
    .cta-details {
        font-size: 1.5rem;
    }
    .read-more {
        font-size: 0.625rem;
    }
    .btn-primary,
    .btn-primary--light,
    .btn-primary--dark {
        font-size: 0.625rem;
    }
    .btn-ghost {
        font-size: 0.6875rem;
    }
    .interest-form .check-group {
        grid-template-columns: 1fr;
    }

    /* ═══ NAV: hamburger panel ═══ */
    .nav__burger { display: flex; }
    .nav__logo { z-index: 250; }
    .nav__links {
        position: fixed;
        top: 0;
        right: 0;
        width: min(320px, 85vw);
        height: 100vh;
        background: #12100D;
        flex-direction: column;
        align-items: flex-start;
        justify-content: flex-start;
        padding: 6rem 2rem 2rem;
        margin: 0;
        transform: translateX(100%);
        transition: transform 0.3s ease;
        overflow-y: auto;
        z-index: 240;
    }
    .nav__links > *:not(:last-child) { margin-right: 0; }
    .nav__links.open { transform: translateX(0); }
    .nav__links > li {
        width: 100%;
        border-bottom: 1px solid var(--rule);
    }
    .nav__links > li:last-child { border-bottom: none; }
    .nav__links > li > a { display: block; padding: 0.9rem 0; }
    .has-dropdown { width: 100%; }
    .nav__dropdown {
        position: static;
        display: none;
        opacity: 1;
        pointer-events: auto;
        transform: none;
        background: none;
        backdrop-filter: none;
        padding: 0 0 0.5rem 1rem;
        min-width: 0;
    }
    .has-dropdown.open .nav__dropdown { display: block; }
    .nav__dropdown::before { display: none; }
    .nav__dropdown li { opacity: 1; transform: none; padding: 0.4rem 0; }

    nav.nav--secondary .nav__links {
        background: #8C5A3C;
    }

    /* Mobile menu panel mirrors nav--light so its background pairs
       correctly with the existing light-state text/hover colors. */
    nav.nav--light .nav__links {
        background: #FFF5EC;
    }
    nav.nav--light .nav__links > li {
        border-bottom-color: rgba(15,13,10,0.11);
    }
}
