/* ==========================================================================
   COLiBRI — Design tokens (source: docs/visual-identity.pdf v1.1)
   ========================================================================== */
:root {
    --c-forest: #0E3113;
    --c-forest-tint: rgba(14, 49, 19, 0.2);
    --c-moss: #559827;
    --c-moss-tint: rgba(85, 152, 39, 0.2);
    --c-gold: #FFC502;
    --c-gold-tint: rgba(255, 197, 2, 0.2);
    --c-espresso: #4F2F27;
    --c-espresso-tint: rgba(79, 47, 39, 0.2);
    --c-burnt: #FA613A;
    --c-burnt-tint: rgba(250, 97, 58, 0.2);
    --c-black: #000000;
    --c-white: #FFFFFF;
    --c-moss-deep: #335B17;
    --c-burnt-deep: #B42805;
    --surface-brand: var(--c-forest);
    --font-body: Georgia, 'Times New Roman', Times, serif;
    --font-heading: Arial, Helvetica, sans-serif;
    --header-height: 84px;
    --bg-page: #FCFAF4;
    --bg-surface: #FFFEFA;
    --bg-tinted: #F7F6F1;
    --text-primary: #0E3113;
    --text-muted: #4F2F27;
    --border-subtle: rgba(14, 49, 19, 0.2);
    --header-bg: rgba(252, 250, 244, 0.96);
}

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
        --bg-page: #0A130C;
        --bg-surface: #142218;
        --bg-tinted: #101C13;
        --text-primary: #F0EEE2;
        --text-muted: #C9C2B0;
        --border-subtle: rgba(255, 255, 255, 0.14);
        --header-bg: rgba(10, 19, 12, 0.88);
        --surface-brand: var(--c-moss-deep);
    }
}
:root[data-theme="dark"] {
    --bg-page: #0A130C;
    --bg-surface: #142218;
    --bg-tinted: #101C13;
    --text-primary: #F0EEE2;
    --text-muted: #C9C2B0;
    --border-subtle: rgba(255, 255, 255, 0.14);
    --header-bg: rgba(10, 19, 12, 0.88);
    --surface-brand: var(--c-moss-deep);
}

/* ==========================================================================
   Base
   ========================================================================== */
/* Also on <html>, not just <body> below: iOS Safari's elastic overscroll
   bounce is driven by the document/html scroller, and overflow-x:hidden on
   body alone doesn't reliably suppress it there - real phones could still
   rubber-band sideways and reveal blank space past the edge even though a
   desktop scrollbar never appeared. */
html { overflow-x: hidden; }

body {
    font-family: var(--font-body);
    color: var(--text-primary);
    background-color: var(--bg-page);
    transition: background-color .2s ease, color .2s ease;
    /* Bootstrap's .row sets its negative side margins from --bs-gutter-x,
       which a wider gutter utility (.row.g-5, used in several sections -
       stakeholder map, objectives, roadmap...) overrides locally without
       the ancestor .container's own padding following suit, leaving a
       12px+ mismatch that bled past the viewport into real horizontal
       scroll on mobile (first caught on the stakeholder map section).
       This is a safety net for any .row.g-5 instance that still ends up
       mismatched - the stakeholder map's own row is fixed properly at the
       source below (see .stakeholder-bleed .container), since leaving an
       oversized row merely clipped rather than actually resized was
       throwing off Leaflet's own container-size measurement. */
    overflow-x: hidden;
}

h1, h2, h3, h4, h5, h6,
.navbar, .btn, .badge {
    font-family: var(--font-heading);
}

h1 { font-size: 35.84px; font-weight: 700; }
h2 { font-size: 29.86px; font-weight: 700; }
h3 { font-size: 24.89px; font-weight: 700; }
h4 { font-size: 20.74px; font-weight: 700; }

a { color: var(--c-moss); }
a:hover { color: var(--text-primary); }

.btn-colibri,
.btn-colibri-outline, .btn-colibri-g {
    display: inline-flex;
    align-items: center;
    gap: .55rem;
    font-weight: 700;
    letter-spacing: 0.02em;
    border-radius: 4px 16px 4px 16px;
    transition: background-color .2s ease, color .2s ease, transform .2s ease, border-color .2s ease;
}
.btn-colibri-g{
    background-color: var(--c-forest);
    color: var(--c-gold);
    transform: translateY(-1px);
     padding: 0.65rem 1.75rem;
}
.btn-colibri-g:hover{
    background-color: var(--c-gold);
    color: var(--c-forest);
     border-color: var(--c-forest);
    transform: translateY(-1px);
}
.btn-arrow {
    width: 14px;
    height: 14px;
    flex-shrink: 0;
    transition: transform .2s ease;
}
.btn-colibri:hover .btn-arrow,
.btn-colibri-outline:hover .btn-arrow {
    transform: translateX(3px);
}

.btn-colibri {
    background-color: var(--c-gold);
    border-color: var(--c-gold);
    color: var(--c-forest);
    padding: 0.65rem 1.75rem;
}
.btn-colibri:hover {
    background-color: var(--c-forest);
    color: var(--c-white);
    transform: translateY(-1px);
}

.btn-colibri-outline {
    background-color: transparent;
    border: 2px solid var(--c-white);
    color: var(--c-white);
    padding: 0.6rem 1.75rem;
}
.btn-colibri-outline:hover {
    background-color: var(--c-white);
    color: var(--c-forest);
    transform: translateY(-1px);
}

/* ==========================================================================
   Header / Navigation
   ========================================================================== */
.colibri-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 1030;
    height: var(--header-height);
    display: flex;
    align-items: center;
    background: var(--header-bg);
    backdrop-filter: blur(6px);
    border-bottom: 1px solid var(--border-subtle);
    transition: background-color .2s ease, border-color .2s ease;
}

.colibri-header__brand img { height: 40px; }
.colibri-header__brand .logo-neg { display: none; }
:root[data-theme="dark"] .colibri-header__brand .logo-pos { display: none; }
:root[data-theme="dark"] .colibri-header__brand .logo-neg { display: block; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .colibri-header__brand .logo-pos { display: none; }
    :root:not([data-theme="light"]) .colibri-header__brand .logo-neg { display: block; }
}

.colibri-header__actions { margin-left: auto; display: flex; align-items: center; gap: .5rem; }

.colibri-theme-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--text-primary);
    cursor: pointer;
    flex-shrink: 0;
}
.colibri-theme-toggle svg { width: 20px; height: 20px; }
.colibri-theme-toggle .icon-moon { display: none; }
:root[data-theme="dark"] .colibri-theme-toggle .icon-sun { display: none; }
:root[data-theme="dark"] .colibri-theme-toggle .icon-moon { display: block; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .colibri-theme-toggle .icon-sun { display: none; }
    :root:not([data-theme="light"]) .colibri-theme-toggle .icon-moon { display: block; }
}

/* ==========================================================================
   Breadcrumb
   ========================================================================== */
.colibri-breadcrumb {
    display: flex;
    align-items: center;
    gap: .35rem;
    min-width: 0;
    flex: 1 1 auto;
    margin: 0 2rem;
    overflow: hidden;
    white-space: nowrap;
    font-family: var(--font-heading);
    font-size: 1.05rem;
}
.colibri-breadcrumb__item {
    display: flex;
    align-items: center;
    gap: .35rem;
    min-width: 0;
    transition: opacity .2s ease, transform .2s ease;
}
.colibri-breadcrumb__item[data-anim='out'] {
    opacity: 0;
    transform: translateX(-8px);
}
.colibri-breadcrumb__link,
.colibri-breadcrumb__current {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.colibri-breadcrumb__link {
    color: var(--text-primary);
    opacity: .55;
    font-weight: 600;
    text-decoration: none;
}
.colibri-breadcrumb__link:hover { opacity: 1; color: var(--c-moss); }
.colibri-breadcrumb__current { color: var(--text-primary); font-weight: 700; }
.colibri-breadcrumb__sep { color: var(--text-primary); opacity: .3; font-size: .95em; }
@media (max-width: 991.98px) {
    .colibri-breadcrumb { display: none; }
}

/* ==========================================================================
   Hamburger (header + menu fullscreen)
   ========================================================================== */
.colibri-hamburger {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--text-primary);
    cursor: pointer;
    flex-shrink: 0;
}
.colibri-hamburger__icon {
    display: flex;
    width: 20px;
    height: 16px;
    flex-direction: column;
    justify-content: space-between;
}
.colibri-hamburger__icon span {
    display: block;
    height: 2px;
    width: 100%;
    background-color: currentColor;
    transition: transform .3s ease, opacity .3s ease;
}
.colibri-hamburger__icon.is-open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.colibri-hamburger__icon.is-open span:nth-child(2) { opacity: 0; }
.colibri-hamburger__icon.is-open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* ==========================================================================
   Menu fullscreen
   ========================================================================== */
html.colibri-menu-open,
html.colibri-menu-open body { overflow: hidden; }

/* overflow:hidden qui sopra fa sparire la scrollbar, allargando la viewport
   di quei pixel: .colibri-header e .colibri-menu (entrambi fixed, con un
   .container centrato dentro) si ricentrano di conseguenza, spostando logo
   e pulsante hamburger/chiudi di qualche px. nav-menu.js misura la larghezza
   della scrollbar prima di applicare overflow:hidden e la scrive in questa
   custom property: riservare lo stesso spazio come padding-right sui box
   fixed tiene ferma la larghezza disponibile per il loro contenuto centrato,
   senza toccare la viewport globale (a differenza di scrollbar-gutter, che
   lascerebbe quello spazio bianco/non dipinto quando non c'è più nulla da
   scrollare). */
html.colibri-menu-open .colibri-header,
html.colibri-menu-open .colibri-menu {
    padding-right: var(--colibri-scrollbar-width, 0px);
}

/* Separate from the variable above (which is only meaningful, and frozen,
   for the open-menu instant): position:fixed's containing block resolves
   against the viewport including any reserved-space scrollbar track
   (matching window.innerWidth), not document.documentElement.clientWidth -
   so whenever a page has a classic (non-overlay) scrollbar, these fixed,
   full-bleed elements render a few px wider than the actually visible/
   usable width, even with the menu closed. Only shows up with a
   space-reserving scrollbar (e.g. testing with a mouse on macOS, or
   Windows by default) - real phones use overlay scrollbars, so
   innerWidth === clientWidth there and this never applies. --colibri-
   viewport-gap is kept continuously in sync by nav-menu.js (page load,
   window resize, and explicitly zeroed/restored across the open/close
   transition above, since toggling overflow:hidden changes clientWidth
   without firing a resize event). */
.colibri-header,
.colibri-menu {
    width: calc(100% - var(--colibri-viewport-gap, 0px));
}

.colibri-menu {
    position: fixed;
    inset: 0;
    z-index: 1040;
    display: flex;
    flex-direction: column;
    overflow-y: auto;
    background: linear-gradient(160deg, var(--surface-brand) 0%, #184a20 60%, var(--c-moss) 130%);
    color: var(--c-white);
    opacity: 0;
    pointer-events: none;
    transition: opacity .35s ease;
}
.colibri-menu.is-open { opacity: 1; pointer-events: auto; }

/* .colibri-menu__bar/__body are also .container, which on its own only
   gives them Bootstrap's standard 0.75rem content-column gutter - too
   tight for a full-bleed fullscreen menu, where it read as no margin at
   all against the edge-to-edge background. */
.colibri-menu__bar {
    display: flex;
    align-items: center;
    height: var(--header-height);
    flex-shrink: 0;
    padding-left: 1.5rem;
    padding-right: 1.5rem;
}
.colibri-menu__bar img { height: 40px; }
.colibri-menu__close { margin-left: auto; color: var(--c-white); }

.colibri-menu__body {
    display: flex;
    flex: 1;
    flex-direction: column;
    gap: 2rem;
    padding: 2rem 1.5rem 4rem;
}
@media (min-width: 992px) {
    .colibri-menu__body { flex-direction: row; align-items: flex-start; gap: 4rem; padding-top: 4rem; }
}

.colibri-menu-nav { display: flex; flex-direction: column; gap: .25rem; }
@media (min-width: 992px) {
    .colibri-menu-nav { width: 320px; flex-shrink: 0; }
}

.colibri-menu-link {
    border-bottom: 1px solid rgba(255, 255, 255, .15);
    opacity: 0;
    transform: translateY(14px);
    transition: opacity .35s ease, transform .35s ease;
}
.colibri-menu.is-open .colibri-menu-link { opacity: 1; transform: translateY(0); }
.colibri-menu-link > a {
    display: block;
    padding: .85rem 0;
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: 1.5rem;
    color: var(--c-white);
    text-decoration: none;
    transition: color .2s ease;
}
.colibri-menu-link > a:hover,
.colibri-menu-link > a.active { color: var(--c-gold); }

.colibri-menu-eyebrow {
    margin: 0 0 .5rem;
    font-family: var(--font-heading);
    text-transform: uppercase;
    letter-spacing: .1em;
    font-size: .7rem;
    font-weight: 700;
    color: rgba(255, 255, 255, .4);
}

.colibri-menu-children {
    display: flex;
    flex-direction: column;
    padding: 0 0 1rem;
}
/* Redundant here specifically: the parent link right above (e.g. "About")
   already says the same thing this eyebrow repeats - kept on
   .colibri-menu-panel (the desktop hover panel), which isn't right next
   to the link that opens it and benefits from the reminder. */
.colibri-menu-children .colibri-menu-eyebrow { display: none; }
/* display:block + padding (was inline text with only a .6rem flex gap
   between links) so each sub-link gets its own full-width, adequately
   tall tap target instead of relying on the text's own tight bounding
   box - on mobile, with several of these stacked under "About" etc.,
   that made it easy to miss and tap the wrong one. */
.colibri-menu-children a { display: block; padding: .5rem 0; color: rgba(255, 255, 255, .75); font-size: 1.1rem; text-decoration: none; }
.colibri-menu-children a:hover { color: var(--c-gold); }
@media (min-width: 992px) {
    .colibri-menu-children { display: none; }
}

.colibri-menu-panels { display: none; }
@media (min-width: 992px) {
    .colibri-menu-panels { display: block; flex: 1; padding-top: .4rem; }
}
.colibri-menu-panel {
    display: none;
    flex-direction: column;
    gap: .85rem;
}
.colibri-menu-panel.is-active { display: flex; }
.colibri-menu-panel a { color: rgba(255, 255, 255, .8); font-size: 1.3rem; text-decoration: none; }
.colibri-menu-panel a:hover { color: var(--c-gold); }

.colibri-menu-cta { margin-top: auto; }
@media (min-width: 992px) {
    .colibri-menu-cta { display: none; }
}

/* ==========================================================================
   Hero
   ========================================================================== */
.hero {
    padding-top: calc(var(--header-height) + 5rem);
    padding-bottom: 5rem;
    background: var(--surface-brand);
    color: var(--c-white);
    overflow: hidden;
    position: relative;
    border-bottom: 8px solid var(--c-gold);
}

.hero h1 { color: var(--c-white); font-size: 3rem; line-height: 1.15; }
.hero .lede { font-size: 1.15rem; max-width: 46rem; opacity: 0.95; }
.hero .eu-badge,
.maintenance-panel--info .eu-badge {
    display: inline-flex;
    gap: .75rem;
    align-items: center;
    background: rgba(255,255,255,0.08);
    border: 1px solid rgba(255,255,255,0.25);
    border-radius: 3px 14px 3px 14px;
    padding: .5rem 1.1rem;
    font-family: var(--font-heading);
    font-size: .8rem;
}
.hero > .container { position: relative; z-index: 1; }

.hero--compact {
    padding-top: calc(var(--header-height) + 4.5rem);
    padding-bottom: 4.5rem;
    min-height: 560px;
    display: flex;
    align-items: center;
    border-bottom: none;
}
.hero--compact h1 { font-size: 2.4rem; }
.hero-title-watermark {
    position: absolute;
    z-index: 0;
    right: -0.4rem;
    /* .section-wave (a fixed 72px band, bottom:-1px) is meant to be
       bled into a bit, by design - not sit fully clear of it - but its
       curve isn't a straight line, so too deep an overlap gets bitten
       unevenly by its dips instead of just gently touching a crest.
       Flush with the hero's own bottom edge (was -1.6rem originally;
       earlier attempts at lifting it higher - fully clearing the band
       at 130px, then 20px, then 4px - all overshot). */
    bottom: 0;
    margin: 0;
    font-family: var(--font-heading);
    font-weight: 700;
    /* This is the "default/large" size - a short or medium title (most of
       them) is shown at exactly this. A long one (e.g. "Background
       materials") would overflow the viewport at this size and get
       sliced off by .hero's own overflow:hidden (right:-0.4rem anchors
       this to the right with no `left`, so its box is shrink-to-fit and
       grows leftward with the text, uncapped) - initHeroWatermark in
       main.js measures the real rendered width on load/resize and, only
       when it doesn't fit, scales font-size down just enough to make it
       fit exactly, rather than clipping it or shrinking every title to a
       fixed smaller ceiling regardless of length. */
    font-size: clamp(3.5rem, 12vw, 11rem);
    line-height: 1;
    letter-spacing: -.01em;
    white-space: nowrap;
    color: transparent;
    -webkit-text-stroke: 1.5px rgba(255, 255, 255, 0.16);
    pointer-events: none;
    user-select: none;
}
@media (max-width: 600px) {
    .hero-title-watermark { display: none; }
}
@media (min-width: 1200px) {
    .hero-title-watermark { right: calc((100% - 1140px) / 2 - 0.4rem); }
}
@media (min-width: 1400px) {
    .hero-title-watermark { right: calc((100% - 1320px) / 2 - 0.4rem); }
}

/* ==========================================================================
   Challenge / Approach split-screen
   ========================================================================== */
.challenge-header h3 {
    font-family: var(--font-heading);
    text-transform: uppercase;
    letter-spacing: .08em;
    font-size: .95rem;
    margin-bottom: 1.5rem;
}
.challenge-header .col-md-6:first-child h3 { color: var(--text-primary); opacity: .6; }
.challenge-header .col-md-6:last-child h3 { color: var(--text-primary); }

.challenge-row { border-top: 1px solid var(--border-subtle); padding: 1.75rem 0; }
.challenge-row:last-of-type { border-bottom: 1px solid var(--border-subtle); }

.challenge-side,
.approach-side {
    display: flex;
    gap: 1rem;
    align-items: flex-start;
}
.challenge-side .icon-badge,
.approach-side .icon-badge {
    width: 44px;
    height: 44px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.challenge-side .icon-badge svg,
.approach-side .icon-badge svg { width: 22px; height: 22px; }

.challenge-side { opacity: .7; }
.challenge-side .icon-badge { background: var(--border-subtle); color: var(--text-primary); }
.challenge-side h4 { font-size: 1rem; margin-bottom: .25rem; }

.approach-side { border-left: 2px solid var(--c-gold-tint); padding-left: 1.5rem; }
.approach-side .icon-badge { background: var(--c-gold-tint); color: var(--c-espresso); }
.approach-side h4 { font-size: 1rem; margin-bottom: .25rem; color: var(--text-primary); }
@media (max-width: 767.98px) {
    .approach-side { border-left: none; padding-left: 0; margin-top: 1rem; }
}


/* ==========================================================================
   Slim CTA (lighter than .stakeholder-cta)
   ========================================================================== */
.cta-slim {
    border: 1px solid var(--border-subtle);
    border-radius: 12px 40px 12px 40px;
    padding: 2.5rem;
}
.cta-slim--gold {
    border: none;
    background: var(--c-gold);
    color: var(--c-forest);
}
.cta-slim--gold h2,
.cta-slim--gold .section-eyebrow {
    color: var(--c-forest);
}
#get-involved {
    padding-top: 2.5rem;
    padding-bottom: 6rem;
}

/* ==========================================================================
   Maintenance / "under construction" page
   ========================================================================== */
.maintenance-page {
    position: relative;
    height: 100vh;
    height: 100dvh;
    display: flex;
    overflow: hidden;
}
.maintenance-panel {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 3rem 2rem;
}
.maintenance-panel--info {
    flex: 0 0 0;
    min-width: 0;
    min-height: 0;
    padding: 0;
    opacity: 0;
    background: linear-gradient(160deg, var(--c-forest) 0%, #184a20 60%, var(--c-moss) 130%);
    color: var(--c-white);
    z-index: 2;
    box-shadow: 6px 0 16px rgba(0, 0, 0, 0.4);
}
.maintenance-panel--brand {
    flex: 1 1 auto;
    background-color: var(--bg-tinted);
    color: var(--text-primary);
}

.maintenance-badge { margin-bottom: 1.75rem; }
.maintenance-title { color: var(--c-white); font-size: 2.4rem; line-height: 1.2; max-width: 32rem; margin-bottom: 1rem; }
.maintenance-lede { font-size: 1.1rem; max-width: 28rem; opacity: 0.9; margin-bottom: 0; }

.maintenance-logo { height: 84px; margin-bottom: 1.75rem; opacity: 0; }
/* .maintenance-panel--brand uses the theme-adaptive --bg-tinted (goes
   near-black in dark mode), but the logo was hardcoded to the pos/dark-ink
   variant meant for light backgrounds — ~1.2:1 contrast, effectively
   invisible in dark mode. Same pos/neg swap already used for the header
   logo, scoped to .maintenance-logo instead of .colibri-header__brand. */
.maintenance-logo.logo-neg { display: none; }
:root[data-theme="dark"] .maintenance-logo.logo-pos { display: none; }
:root[data-theme="dark"] .maintenance-logo.logo-neg { display: block; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .maintenance-logo.logo-pos { display: none; }
    :root:not([data-theme="light"]) .maintenance-logo.logo-neg { display: block; }
}
.maintenance-tagline { font-size: 1rem; max-width: 24rem; opacity: 0.85; margin-bottom: 0; }
.maintenance-eu-badge { height: 48px; margin-top: 2.5rem; }
/* funded-by-eu-pos.png is the coloured/dark-ink version (light backgrounds);
   funded-by-eu.png (already used as-is in the always-dark footer) turns out
   to be an all-white version made for dark backgrounds, despite the plain
   filename — same pos/neg swap as the logo above. */
.maintenance-eu-badge.logo-neg { display: none; }
:root[data-theme="dark"] .maintenance-eu-badge.logo-pos { display: none; }
:root[data-theme="dark"] .maintenance-eu-badge.logo-neg { display: block; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .maintenance-eu-badge.logo-pos { display: none; }
    :root:not([data-theme="light"]) .maintenance-eu-badge.logo-neg { display: block; }
}

[data-maintenance-reveal] { opacity: 0; transform: translateY(24px); }

@media (max-width: 900px) {
    /* Desktop pins .maintenance-page to a fixed 100vh with overflow:hidden and
       lets JS animate .maintenance-panel--info to a 60% flex-basis, which works
       side-by-side. Stacked in a column that math breaks: 60% of the viewport
       height is often shorter than the info panel's own text, and the fixed
       height + overflow:hidden meant the overflow spilled visually into the
       brand panel instead of scrolling. Let the page grow with its content on
       mobile and give the info panel a content-sized (not vh-based) height. */
    .maintenance-page {
        flex-direction: column;
        height: auto;
        min-height: 100vh;
        min-height: 100dvh;
        overflow: visible;
    }
    .maintenance-panel--info {
        order: 2;
        box-shadow: 0 -6px 16px rgba(0, 0, 0, 0.4);
        flex-basis: auto !important;
        flex-grow: 0;
        flex-shrink: 0;
    }
    .maintenance-panel--brand { order: 1; flex: 0 0 auto; }
    .desktop-break { display: none; }
}

.section-wave {
    position: absolute;
    bottom: -1px;
    left: 0;
    width: 100%;
    height: 72px;
    display: block;
    line-height: 0;
    pointer-events: none;
    transform-origin: bottom;
    transform: scaleY(0);
}

.eyebrow-leaf {
    width: 14px;
    height: 14px;
    fill: currentColor;
    margin-right: .3rem;
    transform: rotate(-15deg) translateY(-1px);
}

/* ==========================================================================
   Sections
   ========================================================================== */
.section { padding: 5rem 0; position: relative; }
.section-tinted { background-color: var(--bg-tinted); }

.section > .container > h2,
.section .roadmap-panel h2,
.section .stakeholder-cta h2,
.section .cta-slim h2 {
    position: relative;
    padding-bottom: 1.1rem;
}
.section > .container > h2::after,
.section .roadmap-panel h2::after,
.section .stakeholder-cta h2::after,
.section .cta-slim h2::after {
    content: '';
    position: absolute;
    left: 0;
    bottom: 0;
    width: 64px;
    height: 6px;
    background: var(--c-gold);
}
.roadmap-panel h2::after { background: var(--c-gold); }

.section-eyebrow {
    font-family: var(--font-heading);
    text-transform: uppercase;
    letter-spacing: .12em;
    font-size: .8rem;
    font-weight: 700;
    color: var(--c-moss);
}
/*
.focus-card {
    background: var(--c-white);
    border: 1px solid var(--c-forest-tint);
    border-left: 6px solid var(--c-forest);
    border-radius: 0;
    padding: 2rem;
    height: 100%;
    transition: border-color .2s ease, transform .2s ease;
}
.focus-card:hover {
    transform: translateX(4px);
    border-left-color: var(--c-gold);
}
.focus-card .icon-badge {
    width: 60px;
    height: 60px;
    border-radius: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--c-forest);
    color: var(--c-white);
    margin-bottom: 1.25rem;
}
.focus-card .icon-badge svg {
    width: 28px;
    height: 28px;
}
#focus-areas .row > div:nth-child(2) .icon-badge { background: var(--c-moss); }
#focus-areas .row > div:nth-child(3) .icon-badge { background: var(--c-burnt); }
*/
.roadmap-panel {
    background-color: var(--surface-brand);
    color: var(--c-white);
    border-radius: 12px 56px 12px 56px;
    padding: 3rem;
}
.roadmap-panel h2 { color: var(--c-white); }
.roadmap-step {
    position: relative;
    padding-left: 2.25rem;
    margin-bottom: 1.75rem;
}
.roadmap-step-leaf {
    position: absolute;
    left: 0;
    top: .2rem;
    width: 20px;
    height: 20px;
    fill: var(--c-gold);
}

.stakeholder-cta {
    background: linear-gradient(120deg, var(--c-burnt-tint), var(--c-gold-tint));
    border-radius: 56px 12px 56px 12px;
    padding: 3rem;
}

#stakeholder-map {
    height: 360px;
    width: 100%;
    border-radius: 8px 24px 8px 24px;
    border: 1px solid var(--border-subtle);
}
.stakeholder-map-popup__link {
    display: block;
    margin-top: .5rem;
    font-weight: 700;
    font-size: .85rem;
}

.news-card {
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: 6px 28px 6px 28px;
    overflow: hidden;
    height: 100%;
    transition: transform .25s ease, box-shadow .25s ease, background-color .2s ease, border-color .2s ease;
}
.frame-layout-1 {
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: 6px 28px 6px 28px;
    overflow: hidden;
    transition: transform .25s ease, box-shadow .25s ease, background-color .2s ease, border-color .2s ease;
}
.news-card:hover, .frame-layout-1:hover {
    transform: translateY(-4px);
    box-shadow: 0 1rem 2rem rgba(14, 49, 19, 0.12);
}
.news-card .news-thumb {
    height: 160px;
    background: var(--c-moss-tint);
    color: var(--c-moss);
    display: flex;
    align-items: center;
    justify-content: center;
}
.news-thumb-icon { width: 34px; height: 34px; opacity: .55; }
.news-card .news-body,.frame-layout-1  { padding: 1.25rem; }
.news-card .news-meta {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: .6rem;
    font-family: var(--font-heading);
    font-size: .72rem;
    text-transform: uppercase;
    letter-spacing: .06em;
}
.news-card .news-tag { font-weight: 700; color: var(--c-moss); }
.news-card .news-date { opacity: .55; }
.news-card .news-abstract { color: var(--text-muted); font-size: .9rem; }

/* The right-hand column wraps whatever the News plugin renders for it, and
   that's several levels deeper than it looks: TYPO3's own content-element
   frame (#c<uid>.frame...), then the plugin's own <div class="news">, then
   — for the two-item layout — a <div class="row" id="news-container-<uid>">
   around the .news-card tiles (the single-item feature layout skips that
   last .row). That nested content only takes its natural (shorter) height,
   leaving a gap below it: the parent .row only stretches the two
   .col-md-6 *columns* to equal height, it doesn't hand that height down
   through every wrapper in between, so the existing "height:100%" on
   .news-card two rules below has nothing to resolve against. Turn each
   link in that chain into a flex column so the .news-card tiles actually
   fill the stretched height instead of leaving it empty. */
#latest-news .row > .col-md-6 { display: flex; }
#latest-news .row > .col-md-6 > * { flex: 1; display: flex; flex-direction: column; }
#latest-news .row > .col-md-6 .news { flex: 1; display: flex; flex-direction: column; }
/* 1.5rem to match the gy-4 gap the outer .row now uses between this
   column and the feature card next to it (see Homecolibri.html) - was
   10px, a leftover plugin default that read as a different, smaller
   gap once cards from both rows stack in the same column on mobile. */
#latest-news .row > .col-md-6 .news > .row { flex: 1; display: flex; flex-direction: column; margin: 0; gap: 1.5rem; }
/* The plugin also inlines its own "margin-bottom: 10px" on every tile
   (including the last one) for spacing between them — replaced here by
   the gap above, and cancelled with !important (the only way to beat an
   inline style) so the last tile's own border actually touches the
   bottom instead of stopping 10px short of it. Scoped to #latest-news so
   the plugin's own spacing is untouched anywhere else it's used. */
#latest-news .row > .col-md-6 .news-card { flex: 1; margin-bottom: 0 !important; }

#latest-news .row > div:nth-child(2) .news-thumb { background: var(--c-gold-tint); color: #9C7600; }
#latest-news .row > div:nth-child(2) .news-tag { color: #9C7600; }
#latest-news .row > div:nth-child(2) .news-card { border-radius: 28px 6px 28px 6px; }
#latest-news .row > div:nth-child(3) .news-thumb { background: var(--c-burnt-tint); color: var(--c-burnt); }
#latest-news .row > div:nth-child(3) .news-tag { color: var(--c-burnt); }

#news-grid .row > div:nth-child(3n+2) .news-thumb { background: var(--c-gold-tint); color: #9C7600; }
#news-grid .row > div:nth-child(3n+2) .news-tag { color: #9C7600; }
#news-grid .row > div:nth-child(3n+2) .news-card { border-radius: 28px 6px 28px 6px; }
#news-grid .row > div:nth-child(3n+3) .news-thumb { background: var(--c-burnt-tint); color: var(--c-burnt); }
#news-grid .row > div:nth-child(3n+3) .news-tag { color: var(--c-burnt); }

/* ==========================================================================
   News filter bar + pagination
   ========================================================================== */
.news-filter-bar {
    display: flex;
    flex-wrap: wrap;
    gap: .6rem;
    margin-bottom: 2.5rem;
}
.news-filter-pill {
    font-family: var(--font-heading);
    font-size: .8rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--text-primary);
    background: transparent;
    border: 1px solid var(--border-subtle);
    border-radius: 999px;
    padding: .5rem 1.1rem;
    transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
.news-filter-pill:hover { border-color: var(--text-primary); }
.news-filter-pill.is-active {
    background: var(--c-forest);
    border-color: var(--c-forest);
    color: var(--c-white);
}

/* Stakeholder categories in "A collaborative approach" — card treatment
   matching .vision-card/.partner-logo (colour-cycled icon circle,
   alternating corner rounding) instead of a flat label. */
.stakeholder-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1.25rem;
    margin-bottom: 3rem;
}
@media (max-width: 991.98px) {
    .stakeholder-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 575.98px) {
    .stakeholder-grid { grid-template-columns: 1fr; }
}
.stakeholder-card {
    display: flex;
    align-items: center;
    gap: 1rem;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: 6px 24px 6px 24px;
    padding: 1.25rem 1.5rem;
    transition: transform .25s ease, box-shadow .25s ease;
}
.stakeholder-card:nth-child(2n) { border-radius: 24px 6px 24px 6px; }
.stakeholder-card:hover {
    transform: translateY(-3px);
    box-shadow: 0 1rem 2rem rgba(14, 49, 19, 0.1);
}
.stakeholder-card__icon {
    width: 48px;
    height: 48px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.stakeholder-card__icon svg { width: 24px; height: 24px; }
.stakeholder-card p { margin-bottom: 0; font-weight: 600; font-size: .95rem; }
.stakeholder-card:nth-child(3n+1) .stakeholder-card__icon { background: var(--c-moss-tint); color: var(--c-moss); }
.stakeholder-card:nth-child(3n+2) .stakeholder-card__icon { background: var(--c-gold-tint); color: var(--text-primary); }
.stakeholder-card:nth-child(3n+3) .stakeholder-card__icon { background: var(--c-burnt-tint); color: var(--c-burnt); }

/* ==========================================================================
   Work package interaction flow (About > Focus areas). Built from the
   site's own card component (.wp-flow-card — same cut-corner/border-accent
   language as .stakeholder-card/.partner-logo) inside colour-washed phase
   zones, full container width. Each card/the .wp-flow__coord band opens
   the matching .wp-detail card, zooming out of that exact spot via a
   manual FLIP transform animation (see initFocusAreaDiagram in main.js —
   transform only, never opacity, so it reads as a zoom and not a
   cross-fade) — no separate list duplicating the same content underneath.
   ========================================================================== */
.wp-flow {
    border: 1.5px dashed var(--c-espresso);
    border-radius: 16px 48px 16px 48px;
    opacity: .9;
    padding: 1.75rem;
}
@media (min-width: 768px) { .wp-flow { padding: 2.25rem; } }

.wp-flow__coord {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .3rem;
    background: var(--c-espresso);
    color: var(--c-white);
    border-radius: 6px 24px 6px 24px;
    padding: 1rem 1.5rem;
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: .95rem;
    text-align: center;
    cursor: pointer;
    border: 0;
    width: 100%;
    transition: transform .2s ease, box-shadow .2s ease;
}
.wp-flow__coord:hover { transform: translateY(-2px); box-shadow: 0 .75rem 1.5rem rgba(0, 0, 0, .2); }
.wp-flow__coord:focus-visible { outline: 2px solid var(--c-gold); outline-offset: 2px; }
/* WP4 and WP6+7 are also standalone .wp-flow__coord bands now (not just
   WP8, .wp-flow's original first child) — give every one after the first
   the same 1rem rhythm .wp-zone already uses between siblings. */
.wp-flow > .wp-flow__coord:not(:first-child) { margin-top: 1rem; }
/* Communication and coordination are "ongoing throughout the project" like
   Stakeholders, but common to any project rather than specific to this one
   — per client feedback they keep this compact band shape (unlike
   .wp-stakeholders below) but lose the solid fill so they don't outweigh
   the analysis/strategy/stakeholders zones, which use the same tint
   language. */
.wp-flow__coord--tint { background: var(--c-espresso-tint); color: var(--text-primary); }
.wp-flow__coord-note { font-weight: 400; font-style: italic; font-size: .78rem; opacity: .75; }

/* Stakeholder engagement is project-specific and called out (per client
   feedback) with the same tinted-zone + white-card language as
   .wp-zone/.wp-flow-card, sized as its own hero band rather than the plain
   .wp-flow__coord bar the other "ongoing throughout" work packages use. */
.wp-stakeholders {
    all: unset;
    display: block;
    box-sizing: border-box;
    width: 100%;
    cursor: pointer;
    background: var(--c-burnt-tint);
    border-radius: 16px 48px 16px 48px;
    padding: 1.5rem;
    transition: transform .2s ease, box-shadow .2s ease;
}
@media (min-width: 768px) { .wp-stakeholders { padding: 2rem; } }
.wp-stakeholders:hover { transform: translateY(-2px); box-shadow: 0 .75rem 1.5rem rgba(0, 0, 0, .12); }
.wp-stakeholders:focus-visible { outline: 2px solid var(--c-burnt); outline-offset: 2px; }

.wp-stakeholders__label {
    display: block;
    font-family: var(--font-heading);
    text-transform: uppercase;
    letter-spacing: .1em;
    font-size: .72rem;
    font-weight: 700;
    color: var(--c-burnt);
    margin: 0 0 1.1rem;
}

.wp-stakeholders__inner {
    display: block;
    text-align: left;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-left: 6px solid var(--c-burnt);
    border-radius: 6px 24px 6px 24px;
    padding: 1.25rem 1.5rem;
}

.wp-stakeholders__heading {
    display: block;
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: 1rem;
    color: var(--text-primary);
}

.wp-stakeholders__note {
    display: block;
    margin-top: .3rem;
    font-size: .82rem;
    font-style: italic;
    font-weight: 400;
    color: var(--text-muted);
}

.wp-connector { display: flex; justify-content: center; margin: 1rem 0; }
.wp-connector svg { width: 22px; height: 22px; color: var(--text-muted); opacity: .6; }

.wp-zone { border-radius: 16px 48px 16px 48px; padding: 1.5rem; margin-top: 1rem; position: relative; }
@media (min-width: 768px) { .wp-zone { padding: 2rem; } }
.wp-zone--analysis { background: var(--c-moss-tint); }
.wp-zone--strategy { background: var(--c-gold-tint); }
.wp-zone--outcomes { background: rgba(255, 197, 2, .08); }
.wp-zone--support { background: rgba(14, 49, 19, .05); }

/* Side arrows flanking Analysis phase (see the HTML comment on
   .wp-side-arrow in Focusareas.html for why). Same stroke/color/opacity
   as .wp-connector svg — the stem is a <line> stretched to fill the flex
   space (preserveAspectRatio="none" + vector-effect="non-scaling-stroke"
   keeps it a crisp constant-width round-capped line instead of a plain
   filled rectangle), capped by the connector's own chevron tip cropped to
   its actual stroke bounds, in the margin the zone gives up on each side. */
.wp-zone--analysis { margin-left: 2.5rem; margin-right: 2.5rem; }
.wp-side-arrow {
    position: absolute;
    top: 0;
    /* .wp-connector below the zone is 1rem margin + a 22px arrow, so its
       tip sits 38px past the zone's own bottom edge — but the connector's
       own ink stops a few px short of its 22px box (empty margin below
       the chevron in the original icon), so matching box-to-box at -38px
       actually renders the tip ~4px lower than the connector's. -34px is
       what lines the two arrowheads up in practice (checked pixel-by-
       pixel). */
    bottom: -34px;
    display: flex;
    flex-direction: column;
    align-items: center;
    color: var(--text-muted);
    opacity: .6;
    pointer-events: none;
}
.wp-side-arrow__stem { flex: 1; width: 22px; display: block; overflow: visible; }
.wp-side-arrow__tip { width: 22px; height: 13.75px; flex-shrink: 0; display: block; overflow: visible; }
.wp-side-arrow--left { right: 100%; margin-right: .4rem; }
.wp-side-arrow--right { left: 100%; margin-left: .4rem; }
/* Below 560px there's not enough margin left for a 22px arrow — shrink
   the zone's margin and the arrows together instead of hiding them, so
   WP4's continuous-involvement arrows stay visible at every width. */
@media (max-width: 560px) {
    .wp-zone--analysis { margin-left: 1.25rem; margin-right: 1.25rem; }
    .wp-side-arrow__stem { width: 16px; }
    .wp-side-arrow__tip { width: 16px; height: 10px; }
    .wp-side-arrow--left { margin-right: .3rem; }
    .wp-side-arrow--right { margin-left: .3rem; }
}

.wp-zone__label {
    font-family: var(--font-heading);
    text-transform: uppercase;
    letter-spacing: .1em;
    font-size: .72rem;
    font-weight: 700;
    margin: 0 0 1.1rem;
}
.wp-zone--analysis .wp-zone__label { color: var(--c-moss); }
.wp-zone--strategy .wp-zone__label { color: #9C7600; }
.wp-zone--outcomes .wp-zone__label,
.wp-zone--support .wp-zone__label { color: var(--c-espresso); }
:root[data-theme="dark"] .wp-zone--strategy .wp-zone__label { color: var(--c-gold); }
:root[data-theme="dark"] .wp-zone--outcomes .wp-zone__label,
:root[data-theme="dark"] .wp-zone--support .wp-zone__label { color: var(--text-muted); }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .wp-zone--strategy .wp-zone__label { color: var(--c-gold); }
    :root:not([data-theme="light"]) .wp-zone--outcomes .wp-zone__label,
    :root:not([data-theme="light"]) .wp-zone--support .wp-zone__label { color: var(--text-muted); }
}

.wp-row--3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.1rem; }
@media (max-width: 991.98px) { .wp-row--3 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 575.98px) { .wp-row--3 { grid-template-columns: 1fr; } }
.wp-row--2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.1rem; }
@media (max-width: 575.98px) { .wp-row--2 { grid-template-columns: 1fr; } }

.wp-flow-card {
    all: unset;
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-left: 6px solid var(--c-moss);
    border-radius: 6px 24px 6px 24px;
    padding: 1.5rem 1.75rem;
    cursor: pointer;
    box-sizing: border-box;
    width: 100%;
    transition: transform .25s ease, box-shadow .25s ease;
}
.wp-flow-card:nth-child(2n) { border-radius: 24px 6px 24px 6px; }
.wp-flow-card:hover { transform: translateY(-3px); box-shadow: 0 1rem 2rem rgba(14, 49, 19, 0.1); }
.wp-flow-card:focus-visible { outline: 2px solid var(--c-forest); outline-offset: 2px; }
/* Made invisible (not just repositioned) for the duration of the open/close
   animation — visibility:hidden keeps its layout space (nothing reflows)
   while the expanded .wp-detail zooms to/from that spot. Also used on
   .wp-flow__coord, which isn't a .wp-flow-card but shares this state. */
.wp-flow-card--hidden { visibility: hidden; }
.wp-flow-card[data-accent="engage"] { border-left-color: var(--c-burnt); }
.wp-flow-card[data-accent="strategy"] { border-left-color: var(--c-gold); }
.wp-flow-card[data-accent="support"] { border-left-color: var(--border-subtle); }

.wp-flow-card__heading { flex: 1; min-width: 0; }
.wp-flow-card__phase {
    display: block;
    font-family: var(--font-heading);
    font-size: .66rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--text-muted);
    margin-bottom: .25rem;
}
.wp-flow-card__heading h3 { font-family: var(--font-heading); font-size: 1rem; margin: 0; line-height: 1.3; }

.wp-outcome {
    all: unset;
    display: block;
    box-sizing: border-box;
    width: 100%;
    text-align: left;
    cursor: pointer;
    background: var(--c-gold);
    color: var(--c-forest);
    border-radius: 6px 24px 6px 24px;
    padding: 1.5rem 1.75rem;
    transition: transform .25s ease, box-shadow .25s ease;
}
.wp-outcome:hover { transform: translateY(-3px); box-shadow: 0 1rem 2rem rgba(14, 49, 19, 0.1); }
.wp-outcome:focus-visible { outline: 2px solid var(--c-forest); outline-offset: 2px; }
.wp-outcome h3 { font-family: var(--font-heading); font-size: 1.1rem; margin: 0; }

.wp-scrim {
    position: fixed;
    inset: 0;
    background: rgba(14, 20, 15, 0.55);
    opacity: 0;
    pointer-events: none;
    transition: opacity .25s ease;
    z-index: 1035;
}
.wp-scrim.is-visible { opacity: 1; pointer-events: auto; }
body.wp-lock-scroll { overflow: hidden; }

.wp-detail {
    position: fixed;
    inset: 0;
    margin: auto;
    width: min(560px, 90vw);
    max-height: min(75vh, 560px);
    overflow-y: auto;
    z-index: 1036;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-left: 6px solid var(--c-moss);
    border-radius: 6px 24px 6px 24px;
    box-shadow: 0 2rem 4rem rgba(0, 0, 0, .35);
    padding: 1.5rem 3rem 1.75rem 1.5rem;
}
.wp-detail[hidden] { display: none; }
/* Same fix as .partner-modal.is-animating: hide overflow while the FLIP
   zoom is resizing the box, so the fixed-size content inside doesn't
   flash a scrollbar (both axes — overflow-y other than visible forces
   overflow-x to auto too) before settling at its final size. */
.wp-detail.is-animating { overflow: hidden; }
.wp-detail[data-accent="engage"] { border-left-color: var(--c-burnt); }
.wp-detail[data-accent="strategy"] { border-left-color: var(--c-gold); }
.wp-detail[data-accent="support"] { border-left-color: var(--border-subtle); }
.wp-detail[data-accent="coord"] { border-left-color: var(--c-espresso); }

.wp-detail__phase {
    display: block;
    font-family: var(--font-heading);
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--text-muted);
    margin-bottom: .3rem;
}
.wp-detail h3 { margin: 0 0 .7rem; font-size: 1.05rem; line-height: 1.3; }
.wp-detail p.lead {
    font-family: var(--font-heading);
    font-size: .76rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--text-muted);
    margin: 0 0 .6rem;
}
.wp-detail p.body { color: var(--text-muted); }
.wp-detail__close {
    all: unset;
    position: absolute;
    top: .9rem;
    right: 1rem;
    width: 30px;
    height: 30px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    cursor: pointer;
    color: var(--text-muted);
    font-size: 1.1rem;
    line-height: 1;
}
.wp-detail__close:hover { background: var(--bg-tinted); }

.news-pagination {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    margin-top: 3rem;
}
.news-pagination-page,
.news-pagination-arrow {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 1px solid var(--border-subtle);
    color: var(--text-primary);
    font-family: var(--font-heading);
    font-weight: 700;
    text-decoration: none;
    transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
.news-pagination-arrow svg { width: 16px; height: 16px; }
.news-pagination-page:hover,
.news-pagination-arrow:hover { border-color: var(--text-primary); }
.news-pagination-page.is-active {
    background: var(--c-forest);
    border-color: var(--c-forest);
    color: var(--c-white);
}
.news-pagination-ellipsis { color: var(--text-muted); padding: 0 .25rem; }

/* ==========================================================================
   News — tag chip shared by cards and the detail page, and the
   EXT:news markup that turns .news-card into a whole-card <a> (the
   homepage mock only ever used it on a plain div, so these resets
   weren't needed until List/Item.html and List/ItemFeatured.html
   started rendering real, linked news items).
   ========================================================================== */
.news-tag { font-weight: 700; color: var(--c-moss); text-decoration: none; }
.news-tags { display: inline-flex; flex-wrap: wrap; gap: .4rem; }
.news-card { display: block; color: inherit; text-decoration: none; }
.news-list-empty { text-align: center; color: var(--text-muted); padding: 3rem 0; }

/* ==========================================================================
   News detail (EXT:news single view) — header/teaser/body/pager/backlink
   are capped to a readable column; the related-news grid below stays
   full container width so its cards can sit 3-up like the list page.
   ========================================================================== */
.news-detail__header,
.news-detail__teaser,
.news-detail__body,
.news-detail__pager,
.news-detail__backlink,
.news-detail__share,
.news-detail__image,
.news-detail__video,
.news-detail__audio,
.news-img-wrap {
    max-width: 48rem;
    margin-left: auto;
    margin-right: auto;
}
.news-detail__header { margin-bottom: 2rem; }
.news-detail__header h1 { margin-bottom: .75rem; }
.news-detail__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .75rem;
    font-family: var(--font-heading);
    font-size: .8rem;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--text-muted);
}
.news-detail__teaser { margin-bottom: 2rem; color: var(--text-primary); }
.news-detail__body { margin-bottom: 2.5rem; }
.news-detail__body p:last-child { margin-bottom: 0; }
.news-detail__image,
.news-detail__video,
.news-detail__audio {
    display: block;
    width: 100%;
    height: auto;
    border-radius: 6px 28px 6px 28px;
    margin-bottom: 2rem;
}
.news-img-wrap img,
.mediaelement-image img { width: 100%; height: auto; border-radius: 6px 28px 6px 28px; }
.news-img-wrap { margin-bottom: 2rem; }
.news-img-caption { margin-top: .5rem; font-size: .85rem; color: var(--text-muted); }

.news-detail__pager {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
    padding: 1.5rem 0;
    margin-bottom: 2rem;
    border-top: 1px solid var(--border-subtle);
    border-bottom: 1px solid var(--border-subtle);
}
.news-detail__pager-link {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    font-weight: 600;
    color: var(--text-primary);
    text-decoration: none;
}
.news-detail__pager-link--next { margin-left: auto; }
.news-detail__pager-link:hover { color: var(--c-moss); }

.news-detail__backlink { margin-bottom: 2rem; }
.news-detail__backlink a {
    color: var(--text-primary);
    text-decoration: none;
    font-weight: 600;
}
.news-detail__backlink a:hover { color: var(--c-moss); }
.news-detail__backlink .btn-arrow { transform: rotate(180deg); }

.news-detail__share { margin-bottom: 2.5rem; }

.news-related-wrap { margin-top: 3rem; }
.news-related { margin-bottom: 2.5rem; }
.news-related h4,
.news-related .section-eyebrow { margin-bottom: 1.25rem; }
.news-related-list { list-style: none; padding: 0; margin: 0; }
.news-related-list li {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: .75rem;
    padding: .6rem 0;
    border-bottom: 1px solid var(--border-subtle);
}
.news-related-list a { color: var(--text-primary); font-weight: 600; text-decoration: none; }
.news-related-list a:hover { color: var(--c-moss); }
.news-related-list__size,
.news-related-list__desc { color: var(--text-muted); font-size: .85rem; }

/* ==========================================================================
   Footer
   ========================================================================== */
.colibri-footer {
    background-color: var(--surface-brand);
    color: var(--c-white);
    padding: 3.5rem 0 2rem;
}
.colibri-footer a { color: var(--c-white); opacity: .85; }
.colibri-footer a:hover { opacity: 1; }
.colibri-footer .footer-meta {
    border-top: 1px solid rgba(255,255,255,0.15);
    margin-top: 2rem;
    padding-top: 1.5rem;
    font-size: .8rem;
    opacity: .75;
}
.footer-eu-badge {
    display: inline-flex;
    align-items: center;
    line-height: 0;
}

/* ==========================================================================
   Concept B — bold graphic system (split panels, big numerals, zigzag)
   ========================================================================== */
.hero-split {
    display: flex;
    align-items: stretch;
    min-height: 100vh;
    overflow: hidden;
    border-bottom: none;
    background: none;
    padding: 0;
}
.hero-split__panel--text {
    flex: 0 0 60%;
    background: var(--surface-brand);
    color: var(--c-white);
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: calc(var(--header-height) + 3rem) 4rem 4rem;
}
.hero-split__panel--text h1 { color: var(--c-white); font-size: clamp(2.6rem, 5vw, 3rem); line-height: 1.05; }
.hero-split__panel--text .lede { font-size: 1.15rem; max-width: 34rem; opacity: .95; }
.hero-split__panel--mark {
    flex: 1;
    position: relative;
    background: var(--surface-brand);
    overflow: hidden;
}
.hero-split__photo {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
/* Grayscale/color-blend treatment is a Home-only effect — internal pages
   (About, Focus Areas, Partners, ...) use .hero-split--compact and show
   their photo as-is, no filter/overlay. */
.hero-split:not(.hero-split--compact) .hero-split__photo {
    filter: grayscale(1) contrast(1.1);
}
.hero-split:not(.hero-split--compact) .hero-split__panel--mark::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(135deg, var(--c-forest) 10%, var(--c-gold) 110%);
    mix-blend-mode: color;
}
.hero-split:not(.hero-split--compact) .hero-split__panel--mark::before {
    content: '';
    position: absolute;
    inset: 0;
    /*background: var(--c-forest);*/
    opacity: .2;
    z-index: 1;
}
/* Compact variant for internal-page heroes (About, Focus Areas) — the
   plain .hero-split is sized for the Home landing hero (100vh) which
   is too tall once it's just a page title + a couple of paragraphs. */
.hero-split--compact { min-height: 500px; }
.hero-split--compact .hero-split__panel--text { padding: calc(var(--header-height) + 2.5rem) 3rem 2.5rem; }
.hero-split--compact .hero-split__panel--text h1 { font-size: clamp(2.2rem, 4vw, 2.8rem); }

@media (max-width: 991.98px) {
    .hero-split { flex-direction: column; min-height: auto; }
    .hero-split__panel--text { flex: none; padding: calc(var(--header-height) + 2.5rem) 1.5rem 2.5rem; }
    .hero-split__panel--mark { flex: none; height: 220px; }
}

.numbered-row {
    display: flex;
    align-items: center;
    gap: 3rem;
    border-top: 3px solid var(--c-forest);
    padding: 3.5rem 0;
}
.numbered-row:last-of-type { border-bottom: 3px solid var(--c-forest); }
.numbered-row__index {
    flex: 0 0 auto;
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: 6rem;
    line-height: 1;
    color: transparent;
    -webkit-text-stroke: 2px var(--c-forest);
}
.numbered-row:nth-child(2) .numbered-row__index { -webkit-text-stroke-color: var(--c-moss); }
.numbered-row:nth-child(3) .numbered-row__index { -webkit-text-stroke-color: var(--c-burnt); }
.numbered-row__body h3 { margin-bottom: .5rem; }
.numbered-row__body p { max-width: 40rem; margin-bottom: 0; }
@media (max-width: 767.98px) {
    .numbered-row { gap: 1.5rem; padding: 2rem 0; }
    .numbered-row__index { font-size: 3.2rem; }
}

.timeline-zigzag { background: var(--surface-brand); }
.timeline-zigzag h2, .timeline-zigzag .section-eyebrow { color: var(--c-white); }
.timeline-zigzag h2::after { background: var(--c-gold); }
/* Body copy sitting directly in a .timeline-zigzag section (not inside a
   .roadmap-card, which sets its own white) — e.g. the intro paragraph
   above the cards — needs an explicit light colour on the dark forest
   background instead of the default (dark-on-light) --text-muted. */
.timeline-zigzag > .container > .row p, .timeline-zigzag .lede { color: rgba(255, 255, 255, 0.85); }
.text-white a{color:#fff}
.roadmap-stagger { position: relative; margin-top: 1rem; }
.roadmap-card {
    position: relative;
    padding: 1.75rem 2.25rem;
    color: var(--c-white);
    border-radius: 6px 28px 6px 28px;
    box-shadow: 0 0.75rem 1.5rem rgba(0, 0, 0, 0.18);
    transition: transform .25s ease, box-shadow .25s ease;
}
.roadmap-card:hover {
    transform: translateY(-6px);
    box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.28);
}
.roadmap-card__icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 88px;
    height: 88px;
    border-radius: 63% 37% 54% 46% / 55% 45% 55% 45%;
    background: rgba(255, 255, 255, 0.18);
    color: var(--c-white);
    margin-bottom: 1.25rem;
    transition: transform .25s ease, background-color .25s ease;
}
.roadmap-card__icon svg { width: 44px; height: 44px; }
.roadmap-card:hover .roadmap-card__icon {
    transform: scale(1.08);
    background: rgba(255, 255, 255, 0.3);
}
.roadmap-card:nth-child(2) { border-radius: 28px 6px 28px 6px; }
.roadmap-card:nth-child(2) .roadmap-card__icon { border-radius: 46% 54% 37% 63% / 45% 55% 45% 55%; }
.roadmap-card:nth-child(3) .roadmap-card__icon { border-radius: 54% 46% 63% 37% / 63% 37% 63% 37%; }
.roadmap-card:nth-child(4) .roadmap-card__icon { border-radius: 37% 63% 46% 54% / 54% 46% 63% 37%; }
.roadmap-card__body h3 { color: var(--c-white); margin-bottom: .5rem; }
.roadmap-card__body p { opacity: .9; margin-bottom: 0; max-width: 28rem; }

.roadmap-card:nth-child(1) { background: var(--c-forest); border: 1px solid rgba(255,255,255,.25); width: 68%; }

.roadmap-card:nth-child(2) {
    background: var(--c-moss-deep);
    width: 56%;
    margin-left: auto;
    margin-top: -2rem;
    z-index: 1;
}

.roadmap-card:nth-child(3) {
    background: var(--c-burnt);
    width: 80%;
    margin-top: -2rem;
}

/* 4th card — only appears in staggers with 4 items (e.g. About > "Shared
   vision"); the Home roadmap-teaser only ever renders 3 cards, so this
   rule simply never matches there. Gold background instead of another
   dark tone, so the last card reads as an accent rather than blending
   into the three dark cards before it — paired with the same dark-text-
   on-gold combination already used on .btn-colibri, since white text on
   gold fails contrast (~1.6:1). */
.roadmap-card:nth-child(4) {
    background: var(--c-gold);
    color: var(--c-forest);
    width: 60%;
    margin-left: auto;
    margin-top: -2rem;
    z-index: 1;
}
.roadmap-card:nth-child(4) .roadmap-card__body h3 { color: var(--c-forest); }
.roadmap-card:nth-child(4) .roadmap-card__icon { }
.roadmap-card:nth-child(4):hover .roadmap-card__icon { background: rgba(14, 49, 19, 0.22); }

@media (max-width: 767.98px) {
    .roadmap-card,
    .roadmap-card:nth-child(2),
    .roadmap-card:nth-child(3),
    .roadmap-card:nth-child(4) { width: 100%; margin-left: 0; margin-top: 1rem; padding: 1.5rem; }
}

/*FOCUS*/
.focus-stagger { position: relative; margin-top: 1rem; }
.focus-card {
    display: block;
    text-decoration: none;
    border: 1px solid rgba(255,255,255,.25);
    /*color: var(--c-white);*/
    color: var(--c-forest);
    /*text-shadow: 0 1px 3px rgba(14, 49, 19, .7), 0 0 14px rgba(14, 49, 19, .4);*/
    border-radius: 6px 28px 6px 28px;
    overflow: hidden;
    position: relative;
    box-shadow: 0 0.75rem 1.5rem rgba(14, 49, 19, 0.12);
    transition: transform .25s ease, box-shadow .25s ease, background-color .2s ease, border-color .2s ease;
}
.focus-card a{color: var(--c-forest);text-decoration:none}
.focus-card:nth-child(1) { background-color: var(--c-gold); }
.focus-card:nth-child(2) { border-radius: 28px 6px 28px 6px; border: none; background-color: var(--c-burnt); }
.focus-card:nth-child(3) { border: none; background-color: var(--c-moss); }
.focus-card:hover {
    transform: translateY(-6px);
    box-shadow: 0 1.5rem 3rem rgba(14, 49, 19, 0.22);
}
.focus-card:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; }
.focus-card__arrow {
    position: absolute;
    right: 1.5rem;
    bottom: 1.5rem;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(255, 255, 255, 0.2);
    transition: transform .25s ease, background-color .25s ease;
}
.focus-card__arrow svg { width: 18px; height: 18px; }
.focus-card:hover .focus-card__arrow { transform: translateX(4px); background: rgba(255, 255, 255, 0.32); }
.focus-card:nth-child(2) .focus-card__arrow { background: var(--c-burnt); border: 1px solid rgba(255, 255, 255, .4); }
.focus-card:nth-child(2):hover .focus-card__arrow { background: var(--c-burnt); border-color: rgba(255, 255, 255, .7); }
.focus-card__index {
    display: block;
    font-family: var(--font-heading);
    font-weight: 700;
    line-height: .9;
    opacity: .5;
    margin-bottom: .75rem;
}
.focus-card__body{padding: 2.5rem 3rem;}
.focus-card__body h3 { margin-bottom: .5rem; }
.focus-card__body p { opacity: .9; margin-bottom: 0; max-width: 28rem; }
.focus-card .row { --bs-gutter-x: 0; margin: 0; }
.focus-card .row > [class*="col-"] { padding: 0; }
.focus-card .row img.img-fluid { display: block; width: 100%; height: 100%; object-fit: cover; }

.focus-card:nth-child(1) {  width: 68%; }
.focus-card:nth-child(1) .focus-card__index { font-size: 7rem; }

.focus-card:nth-child(2),.focus-card:nth-child(4) {

    width: 68%;
    margin-left: auto;
    margin-top: -2rem;
    z-index: 1;
}
.focus-card:nth-child(2) .focus-card__index, .focus-card:nth-child(3) .focus-card__index { font-size: 5rem; }

.focus-card:nth-child(3) {

    width: 80%;
    margin-top: -2rem;
}
.focus-card:nth-child(3) .focus-card__index { font-size: 6rem; }

@media (max-width: 767.98px) {
    /* Below md, the desktop side-by-side image+text row and its offset
       stagger both lose their reason to exist (no room for a row, no room
       to shift cards sideways), which previously left three flat, uniform,
       full-width blocks stacked directly on each other - hence "shopping
       list". Recreating the desktop cascade's energy at this width instead
       of just going full-width: cards keep overlapping, alternate their
       horizontal inset and pick up a slight alternating rotation; each
       card's image becomes a full-bleed background (same technique as
       .news-card--feature) with the text in a bottom scrim, rather than a
       stacked photo-then-solid-colour-block. */
    .focus-stagger { padding: .5rem 0 1.5rem; }

    .focus-card:nth-child(1) {
        width: 96%;
        margin: 0 4% 0 0;
        padding: 0;
        /* Unlike the other two cards, the first card never had its base
           1px border overridden to none - invisible next to a small inset
           photo, but a visible ring around the edge now that the photo
           fills the whole card. */
        border: none;
        transform: rotate(-0.8deg);
        position: relative;
        z-index: 3;
    }
    .focus-card:nth-child(2) {
        width: 92%;
        margin: -1.5rem 0 0 8%;
        padding: 0;
        transform: rotate(0.9deg);
        position: relative;
        z-index: 2;
    }
    .focus-card:nth-child(3) {
        width: 96%;
        margin: -1.5rem 4% 0 0;
        padding: 0;
        transform: rotate(-0.5deg);
        position: relative;
        z-index: 1;
    }

    .focus-card .row { position: relative; min-height: 420px; margin: 0; }
    /* The second card has its text column before the image column in
       source order (desktop puts the photo on the right there) - without
       an explicit z-index the image, painted later, would sit on top of
       and hide the text scrim. */
    .focus-card .col-md-4 { position: absolute; inset: 0; height: 100%; padding: 0; z-index: 1; }
    .focus-card .col-md-4 img.img-fluid { width: 100%; height: 100%; object-fit: cover; }
    .focus-card .col-md-8 {
        position: absolute;
        left: 0;
        right: 0;
        bottom: 0;
        /* !important: needed to beat the higher-specificity
           ".focus-card .row > [class*='col-']{ padding: 0 }" reset above. */
        padding: 2rem 1.5rem 2rem !important;
        z-index: 2;
    }
    /* Overrides the inline style="margin-top:2rem" on the third card's
       body (a desktop-only nudge to line up with its offset image row). */
    .focus-card .focus-card__body { padding: 0; margin-top: 0 !important; }
    .focus-card__body h3 { color: var(--c-white); }
    .focus-card__body p { color: rgba(255, 255, 255, .85); opacity: 1; max-width: none; }

    /* Scrim tinted to each card's own "-deep" partner colour (rather than
       one shared neutral tone) so the cards keep their gold/burnt/moss
       identity even once they're photo-led instead of solid colour. */
    .focus-card:nth-child(1) .col-md-8 { background: linear-gradient(180deg, rgba(79, 47, 39, 0) 0%, rgba(79, 47, 39, .72) 45%, rgba(79, 47, 39, .94) 100%); }
    .focus-card:nth-child(2) .col-md-8 { background: linear-gradient(180deg, rgba(180, 40, 5, 0) 0%, rgba(180, 40, 5, .72) 45%, rgba(180, 40, 5, .94) 100%); }
    .focus-card:nth-child(3) .col-md-8 { background: linear-gradient(180deg, rgba(51, 91, 23, 0) 0%, rgba(51, 91, 23, .72) 45%, rgba(51, 91, 23, .94) 100%); }
}
/**/

.stagger-cards { position: relative; margin-top: 2.5rem; }
.stagger-card {
    position: relative;
    padding: 2.5rem 3rem;
    color: var(--c-white);
    margin-top: -1.5rem;
}
.stagger-cards > .stagger-card:first-child { margin-top: 0; }
.stagger-card__index {
    display: block;
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: 4.5rem;
    line-height: .9;
    opacity: .5;
    margin-bottom: .75rem;
}
.stagger-card__body h3 { color: var(--c-white); margin-bottom: .5rem; }
.stagger-card__body p { opacity: .9; margin-bottom: 0; max-width: 30rem; }
.stagger-card:nth-child(odd) { width: 72%; }
.stagger-card:nth-child(even) { width: 60%; margin-left: auto; }
.stagger-card:nth-child(4n+1) { background: var(--c-forest); border: 1px solid rgba(255,255,255,.25); }
.stagger-card:nth-child(4n+2) { background: var(--c-moss); }
.stagger-card:nth-child(4n+3) { background: var(--c-burnt); }
.stagger-card:nth-child(4n+4) { background: var(--c-espresso); }
@media (max-width: 767.98px) {
    .stagger-card { width: 100% !important; margin-left: 0 !important; margin-top: 1rem; padding: 2rem; }
    .stagger-cards > .stagger-card:first-child { margin-top: 0; }
    .stagger-card__index { font-size: 3rem; }
}

.glance-row { display: flex; flex-wrap: wrap; gap: 2.5rem; }
.glance-stat { flex: 1 1 240px; border-left: 4px solid var(--c-gold); padding-left: 1.25rem; }

/* One icon per "Project at a glance" stat (client-requested — flag/euro/
   clock/partners), sourced from Lucide (ISC license, lucide.dev) — its
   stroke-icon style already matches the site's own inline SVGs
   (btn-arrow, theme toggle). */
.glance-stat__icon { display: block; width: 40px; height: 40px; color: var(--c-gold); margin-bottom: 1rem; }

.glance-stat__value { font-family: var(--font-heading); font-weight: 700; font-size: 3.5rem; line-height: 3.5rem; color: var(--text-primary); }
#project-glance .glance-stat__value--text { font-size: 2rem; line-height: 2rem; }

.glance-stat__value--compact { font-size: 2.85rem; }
.glance-stat p { color: var(--text-muted); }
.glance-stat__detail { font-size: .85rem; line-height: 1.4; margin-top: .35rem; margin-bottom: 0; opacity: .75; }
.photo-placeholder {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .6rem;
    aspect-ratio: 4 / 3;
    width: 100%;
    background: var(--bg-tinted);
    border: 1px dashed var(--border-subtle);
    border-radius: 6px 32px 6px 32px;
    color: var(--text-muted);
    text-align: center;
    padding: 1.5rem;
    box-sizing: border-box;
}
.img-fluid{ border-radius: 6px 32px 6px 32px;}
.photo-placeholder svg { width: 40px; height: 40px; opacity: .5; }
.photo-placeholder span {
    font-family: var(--font-heading);
    font-size: .78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    opacity: .7;
}
.photo-placeholder--wide { aspect-ratio: 21 / 7; border-radius: 12px 56px 12px 56px; }

/* Consortium partner logo placeholders (see About.html comment) —
   auto-scrolling marquee, card-style tiles colour-cycled like
   .vision-card, until the real logo images are provided. */
.partners-marquee {
    /* Clip only horizontally (hides the looping track's off-screen half) —
       overflow-y stays visible so the .partner-logo hover shadow/lift
       isn't cut off at the top/bottom of the strip. */
    overflow-x: hidden;
    overflow-y: visible;
    padding: .5rem 0 1.25rem;
    -webkit-mask-image: linear-gradient(to right, transparent, black 4%, black 96%, transparent);
    mask-image: linear-gradient(to right, transparent, black 4%, black 96%, transparent);
}
.partners-track {
    display: flex;
    gap: 1.5rem;
    width: max-content;
    animation: partners-scroll 40s linear infinite;
}
.partners-marquee:hover .partners-track,
.partners-track.is-modal-open {
    animation-play-state: paused;
}

.partners-marquee:has(:focus-visible) .partners-track {
    animation-play-state: paused;
}
.partners-set { display: flex; gap: 1.5rem; }
@keyframes partners-scroll {
    to { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
    .partners-track { animation: none; }
    .partners-marquee { overflow-x: auto; }
    .partners-set[aria-hidden="true"] { display: none; }
}
.partner-logo {
    /* Intrinsic width, not a fixed 150px: real logos range from
       near-square marks to wide lockups, and forcing them all into the
       same width box was squeezing wide ones down to fit — see
       .partner-logo__icon below. min/max keep the marquee's rhythm from
       swinging too far either way.
       Fixed white background regardless of theme, matching the logo
       chip inside it — in dark mode a themed (dark) tile around a
       fixed-white chip left a jarring seam between the two. */
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 110px;
    max-width: 220px;
    min-height: 130px;
    background: #fff;
    /* Fixed, not var(--border-subtle): that token turns near-white in
       dark mode, which would vanish against this now-always-white tile. */
    border: 1px solid rgba(14, 49, 19, 0.15);
    border-radius: 6px 24px 6px 24px;
    transition: transform .25s ease, box-shadow .25s ease;
    /* The interactive copy of this tile is a <button>; reset the UA
       button chrome the aria-hidden <div> copy never had. */
    padding: 16px 20px;
    box-sizing: border-box;
    margin: 0;
    font: inherit;
    color: inherit;
    cursor: pointer;
}
.partner-logo:nth-child(2n) { border-radius: 24px 6px 24px 6px; }
.partner-logo:hover {
    transform: translateY(-4px);
    box-shadow: 0 1rem 2rem rgba(14, 49, 19, 0.12);
}
.partner-logo:focus-visible { outline: 2px solid var(--c-forest); outline-offset: 2px; }
/* Made invisible (not removed) while its pop-up is open, matching
   .wp-flow-card--hidden: keeps its layout space in the track so nothing
   reflows, while #partner-modal zooms to/from that exact spot. */
.partner-logo--hidden { visibility: hidden; }

.partner-logo__icon {
    height: 72px;
    min-width: 90px;
    max-width: 220px;
    padding: .5rem .75rem;
    box-sizing: border-box;
    border-radius: 8px;
    background: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
}
.partner-logo__icon img { height: 100%; width: auto; max-width: 100%; object-fit: contain; }

/* ==========================================================================
   Partner pop-up cross-page view transition (About teaser -> Partners
   detail pop-up)
   Browsers that support the View Transitions API's cross-document mode
   (Chrome/Edge, Safari — not yet Firefox) morph the teaser pop-up into
   the detail pop-up when the "See full profile" link navigates between
   the two pages, instead of a hard page swap. Both pop-ups share the
   view-transition-name below — they never exist on the same page at
   once, so there's no name collision. The early <head> script in
   page.typoscript populates and reveals #partner-detail-modal in its
   final position before Partners' first paint, giving the browser a
   real "new" state to morph into; initPartnerGrid() in main.js then
   adopts that already-open state instead of re-opening/re-animating it.
   Unsupported browsers just ignore this unknown at-rule/properties and
   fall back to today's plain navigation + FLIP-zoom-on-arrival. */
@view-transition {
    navigation: auto;
}
/* An instant (0s) swap of everything else was tried first, so only the
   named pop-up below would animate — but that made the whole page
   behind it hard-cut to the new page the instant the morph started,
   which reads as a jump-cut, not a fluid transition. Giving the page
   itself the same short, matching cross-fade instead makes the pop-up's
   morph feel like one continuous motion. This applies to every
   same-origin navigation on the site (not just the two pop-ups), which
   is an intentional, subtle site-wide polish, not scope creep specific
   to the pop-up work. */
::view-transition-group(root),
::view-transition-old(root),
::view-transition-new(root) {
    animation-duration: 320ms;
    animation-timing-function: cubic-bezier(.22, .8, .2, 1);
}
#partner-modal, #partner-detail-modal {
    view-transition-name: partner-popup;
}
::view-transition-group(partner-popup),
::view-transition-old(partner-popup),
::view-transition-new(partner-popup) {
    animation-duration: 380ms;
    animation-timing-function: cubic-bezier(.22, .8, .2, 1);
}
@media (prefers-reduced-motion: reduce) {
    ::view-transition-group(root),
    ::view-transition-old(root),
    ::view-transition-new(root),
    ::view-transition-group(partner-popup),
    ::view-transition-old(partner-popup),
    ::view-transition-new(partner-popup) {
        animation: none;
    }
}

/* Partner detail pop-up — see the #partner-modal markup in About.html
   and initPartnerModal in main.js. Same FLIP-zoom technique and visual
   language as .wp-detail/.wp-scrim (Focus Areas): the clicked tile
   becomes invisible (.partner-logo--hidden) and the modal zooms out of
   its exact spot, reversing on close. The scrolling track is paused
   (.partners-track.is-modal-open) for the pop-up's whole lifetime so the
   tile's position stays put for the reverse zoom. No border-left accent
   here, unlike .wp-detail — the partner tiles it zooms from/to don't
   have one either. */
.partner-modal-scrim {
    position: fixed;
    inset: 0;
    background: rgba(14, 20, 15, 0.55);
    opacity: 0;
    pointer-events: none;
    transition: opacity .25s ease;
    z-index: 1035;
}
.partner-modal-scrim.is-visible { opacity: 1; pointer-events: auto; }

.partner-modal {
    position: fixed;
    inset: 0;
    margin: auto;
    width: min(420px, 90vw);
    max-height: min(70vh, 420px);
    overflow-y: auto;
    z-index: 1036;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: 6px 24px 6px 24px;
    box-shadow: 0 2rem 4rem rgba(0, 0, 0, .35);
    padding: 2rem;
}
.partner-modal[hidden] { display: none; }
/* While the FLIP zoom is shrinking/growing the box, its fixed-size
   content (icon, name, description) doesn't resize along with it, so it
   briefly overflows and flashes the overflow-y:auto scrollbar (and, per
   the CSS rule that a non-visible overflow-y forces overflow-x to auto
   too, a horizontal one). Force both hidden for the animation's
   duration; the real overflow-y:auto still applies once settled, in
   case a genuinely long description needs it at rest. */
.partner-modal.is-animating { overflow: hidden; }
.partner-modal__close {
    all: unset;
    position: absolute;
    top: .9rem;
    right: 1rem;
    width: 30px;
    height: 30px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    cursor: pointer;
    color: var(--text-muted);
    font-size: 1.1rem;
    line-height: 1;
}
.partner-modal__close:hover { background: var(--bg-tinted); }
/* Fixed white chip, not a themed circle — see .partner-logo__icon. Sized
   for a logo's aspect ratio rather than cropped into a circle. */
.partner-modal__icon {
    height: 110px;
    min-width: 140px;
    max-width: 100%;
    padding: .75rem 1rem;
    box-sizing: border-box;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 0 auto 1rem;
    background: #fff;
}
.partner-modal__icon img { height: 100%; width: auto; max-width: 100%; object-fit: contain; }
.partner-modal__name { margin: 0 0 .6rem; font-size: 1.15rem; }
.partner-modal__desc { color: var(--text-muted); margin: 0; }
.partner-modal__more {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    margin-top: 1rem;
    font-family: var(--font-heading);
    font-size: .82rem;
    font-weight: 700;
}

/* ==========================================================================
   Partners directory (About > Partners) — repeatable per category
   ========================================================================== */
/* One .partners-category per category (title + .partners-grid). Meant to
   be authored as a Mask content element and duplicated as many times as
   needed — see the comment in Partners.html. Nothing here or in
   initPartnerGrid (main.js) assumes a fixed number of these blocks or
   cards: triggers are queried globally, so adding/removing a category is
   just adding/removing one of these blocks. */
.partners-category { margin-bottom: 3rem; }
.partners-category:last-child { margin-bottom: 0; }
.partners-category__title { margin-bottom: 1.5rem; }
.partners-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: 1.5rem;
}
/* No visible name here any more (see .partner-card__icon comment) — just
   the logo, centered. */
.partner-card {
    /* Fixed white background regardless of theme, matching the logo
       chip inside it — see the identical comment on .partner-logo. */
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem 1rem;
    background: #fff;
    /* Fixed, not var(--border-subtle) — see the identical comment on
       .partner-logo. */
    border: 1px solid rgba(14, 49, 19, 0.15);
    border-radius: 6px 24px 6px 24px;
    transition: transform .25s ease, box-shadow .25s ease;
    /* <button> reset — see the identical comment on .partner-logo. */
    margin: 0;
    font: inherit;
    color: inherit;
    cursor: pointer;
}
.partner-card:nth-child(2n) { border-radius: 24px 6px 24px 6px; }
.partner-card:hover { transform: translateY(-4px); box-shadow: 0 1rem 2rem rgba(14, 49, 19, 0.12); }
.partner-card:focus-visible { outline: 2px solid var(--c-forest); outline-offset: 2px; }
.partner-card--hidden { visibility: hidden; }
/* Fixed white chip regardless of site theme — see the identical comment
   on .partner-logo__icon for why (real logos, not a generic icon, so no
   more tinted background cycling).
   The partner's name used to sit below the logo here, but long official
   names (e.g. "European Cooperative Programme for Plant Genetic
   Resources (ECPGR)") wrapped to several lines and made cards wildly
   uneven — names now show only in the pop-up (data-partner-name still
   carries it, as this button's accessible name via the image's alt
   text and a title tooltip). Height is fixed, width intrinsic to the
   logo — see .partner-logo__icon for why. */
.partner-card__icon {
    height: 84px;
    min-width: 110px;
    max-width: 100%;
    padding: .5rem .75rem;
    box-sizing: border-box;
    border-radius: 8px;
    background: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
}
.partner-card__icon img { height: 100%; width: auto; max-width: 100%; object-fit: contain; }

/* Detail pop-up shared by every .partner-card on the page — same FLIP
   zoom as .partner-modal (About) and .wp-detail (Focus Areas), just
   bigger/richer since it's this page's main content rather than a
   marquee teaser. */
.partner-detail-scrim {
    position: fixed;
    inset: 0;
    background: rgba(14, 20, 15, 0.55);
    opacity: 0;
    pointer-events: none;
    transition: opacity .25s ease;
    z-index: 1035;
}
.partner-detail-scrim.is-visible { opacity: 1; pointer-events: auto; }
.partner-detail-modal {
    position: fixed;
    inset: 0;
    margin: auto;
    width: min(640px, 90vw);
    max-height: min(80vh, 640px);
    overflow-y: auto;
    z-index: 1036;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: 8px 32px 8px 32px;
    box-shadow: 0 2rem 4rem rgba(0, 0, 0, .35);
    padding: 2.5rem;
}
.partner-detail-modal[hidden] { display: none; }
.partner-detail-modal.is-animating { overflow: hidden; }
.partner-detail-modal__close {
    all: unset;
    position: absolute;
    top: 1rem;
    right: 1.1rem;
    width: 34px;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    cursor: pointer;
    color: var(--text-muted);
    font-size: 1.2rem;
    line-height: 1;
}
.partner-detail-modal__close:hover { background: var(--bg-tinted); }
/* Fixed white chip, not a themed circle — see .partner-logo__icon. Sized
   for a logo's aspect ratio rather than cropped into a circle. */
.partner-detail-modal__icon {
    height: 150px;
    min-width: 160px;
    max-width: 100%;
    padding: 1rem 1.25rem;
    box-sizing: border-box;
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 0 auto 1.25rem;
    background: #fff;
}
.partner-detail-modal__icon img { height: 100%; width: auto; max-width: 100%; object-fit: contain; }
.partner-detail-modal__name { margin: 0 0 .9rem; font-size: 1.4rem; }
.partner-detail-modal__desc { color: var(--text-muted); margin: 0 0 1.5rem; max-width: 34rem; }
.partner-detail-modal__website {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    font-family: var(--font-heading);
    font-weight: 700;
    color: var(--c-moss);
}

.stakeholder-bleed {
    position: relative;
    background: var(--c-gold);
    padding: 4rem 0;
}
/* The row inside (.row.g-5, for extra breathing room between the text and
   map columns) sets --bs-gutter-x: 3rem on itself, giving it -1.5rem side
   margins - but .container's own padding above it still uses the site-wide
   default --bs-gutter-x (1.5rem, i.e. 0.75rem padding), a smaller value
   that doesn't cancel that margin out. The 0.75rem shortfall on each side
   bled the row 12px past the container's own edge (clipped rather than
   truly resized by body's overflow-x:hidden, which threw off Leaflet's own
   container-size measurement for the map inside). Setting the same
   --bs-gutter-x here makes .container's padding match what the row
   actually needs, so the row lands flush instead of overflowing. */
.stakeholder-bleed .container { --bs-gutter-x: 3rem; }
.stakeholder-bleed__map {
    position: relative;
    margin-top: -6rem;
    box-shadow: 0 1.5rem 3rem rgba(14, 49, 19, 0.25);
    border-radius: 8px 24px 8px 24px;
}
#stakeholder-map { border-radius: 8px 24px 8px 24px; border: none; }
@media (max-width: 991.98px) {
    .stakeholder-bleed__map { margin-top: 2rem; }
}
@media (max-width: 767.98px) {
    /* Below md the map stacks under the text with nothing to bleed into
       above it, just a flat gold-to-cream handoff. Recover some of that
       dead space by letting the map bleed down into the next section
       instead - the same overlap trick already used between the
       focus-area cards, and echoing the map's own desktop-only rise
       above this section's own top padding. #latest-news gets matching
       extra top padding so its heading/button clear the overlap instead
       of sitting under the map. */
    .stakeholder-bleed__map { position: relative; z-index: 2; margin-bottom: -7rem; }
    #latest-news { padding-top: 8rem; }
}

/* Stakeholders page: the map is the whole point of the page, not a
   teaser next to other content, so it runs full-width and taller than
   the homepage's side-by-side .stakeholder-bleed__map version — same
   #stakeholder-map element/markers (see initStakeholderMap in main.js). */
.stakeholder-map-full {
    box-shadow: 0 1.5rem 3rem rgba(14, 49, 19, 0.12);
    border-radius: 8px 24px 8px 24px;
}
.stakeholder-map-full #stakeholder-map { height: 620px; }
@media (max-width: 767.98px) {
    .stakeholder-map-full #stakeholder-map { height: 420px; }
}

.news-feature-grid { display: grid; grid-template-columns: 1.4fr 1fr; grid-template-rows: 1fr 1fr; gap: 1.5rem; }
.news-feature-grid .news-card--feature { grid-row: 1 / 3; }
.news-card--feature {
    position: relative;
    min-height: 340px;
    color: var(--c-white);
}
.news-card--feature .news-thumb {
    position: absolute;
    inset: 0;
    height: 100%;
    min-height: 260px;
    background: linear-gradient(160deg, var(--c-forest) 0%, #184a20 60%, var(--c-moss) 130%);
}
.news-card--feature .news-thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.news-card--feature .news-thumb:has(img) { background: none; }
.news-card--feature .news-thumb-icon--mark {
    width: 220px;
    height: 220px;
    opacity: 1;
    fill: rgba(255, 255, 255, .14);
}
.news-card--feature .news-body {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: 2rem 1.5rem 1.5rem;
    background: linear-gradient(180deg, rgba(14, 49, 19, 0) 0%, rgb(14 49 19 / 67%) 45%, rgba(14, 49, 19, .92) 100%);
}
.news-card--feature .news-tag { color: var(--c-gold); }
.news-card--feature .news-date { color: rgba(255, 255, 255, .75); opacity: 1; }
.news-card--feature .news-body h3 { color: var(--c-white); }
.news-card--feature .news-abstract { color: rgba(255, 255, 255, .85); }
@media (max-width: 767.98px) {
    .news-feature-grid { grid-template-columns: 1fr; grid-template-rows: none; }
    .news-feature-grid .news-card--feature { grid-row: auto; }
}
/* ==========================================================================
   404 / Not found page (rendered standalone via the site's Fluid error
   handler, config/sites/main/config.yaml — no header/nav/footer wrapper,
   so this stylesheet is linked directly from NotFound.html's own <head>)
   ========================================================================== */
.notfound-page {
    min-height: 100vh;
    min-height: 100dvh;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    /* Asymmetric padding biases the vertically-centered content upward a
       bit, so the logo sits higher than dead-center instead of directly
       in the middle of the viewport. */
    padding: 2.5rem 1.5rem 9rem;
}
.notfound-content { max-width: 34rem; }
.notfound-page a { text-decoration: none; }

.notfound-brand { display: inline-block; margin-bottom: 3rem; }
.notfound-brand img { height: 56px; }
.notfound-brand .logo-neg { display: none; }
:root[data-theme="dark"] .notfound-brand .logo-pos { display: none; }
:root[data-theme="dark"] .notfound-brand .logo-neg { display: block; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .notfound-brand .logo-pos { display: none; }
    :root:not([data-theme="light"]) .notfound-brand .logo-neg { display: block; }
}

.notfound-figure { position: relative; display: flex; align-items: center; justify-content: center; margin-bottom: 1.5rem; }
.notfound-mark {
    position: absolute;
    width: 220px;
    height: 220px;
    fill: var(--c-moss-tint);
}
.notfound-code {
    position: relative;
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: 6rem;
    line-height: 1;
    color: var(--c-forest);
    letter-spacing: -.02em;
    margin: 0;
}
:root[data-theme="dark"] .notfound-code { color: var(--c-gold); }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .notfound-code { color: var(--c-gold); }
}

.notfound-title {
    position: relative;
    display: inline-block;
    padding-bottom: 1.1rem;
    margin-bottom: 1rem;
}
.notfound-title::after {
    content: '';
    position: absolute;
    left: 50%;
    bottom: 0;
    transform: translateX(-50%);
    width: 64px;
    height: 6px;
    background: var(--c-gold);
}

.notfound-lede { font-size: 1.1rem; color: var(--text-muted); margin-bottom: 2.5rem; }

.notfound-actions { display: flex; flex-direction: column; align-items: center; gap: 1.1rem; }

/* ==========================================================================
   Resources / Knowledge Hub — one .resource-card per document (title,
   abstract, file type, size, and a cover that's either a real image or,
   like .news-thumb's own icon fallback, a tinted placeholder with a
   centered file icon). Same rounded-card shell and moss/gold/burnt
   nth-child rotation as .stakeholder-card/#news-grid, so a new card type
   still reads as part of the same system instead of a one-off.
   ========================================================================== */
.resource-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.75rem; }
@media (max-width: 991.98px) { .resource-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 575.98px) { .resource-grid { grid-template-columns: 1fr; } }

.resource-card {
    display: block;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: 6px 28px 6px 28px;
    overflow: hidden;
    color: inherit;
    text-decoration: none;
    transition: transform .25s ease, box-shadow .25s ease;
}
.resource-card:hover { transform: translateY(-4px); box-shadow: 0 1rem 2rem rgba(14, 49, 19, 0.12); }
.resource-card:focus-visible { outline: 2px solid var(--c-forest); outline-offset: 2px; }
.resource-card:nth-child(3n+2) { border-radius: 28px 6px 28px 6px; }

.resource-card__cover {
    position: relative;
    height: 180px;
    background-size: cover;
    background-position: center;
}
.resource-card__cover--default {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--c-moss-tint);
    color: var(--c-moss);
}
.resource-card:nth-child(3n+2) .resource-card__cover--default { background: var(--c-gold-tint); color: #9C7600; }
.resource-card:nth-child(3n+3) .resource-card__cover--default { background: var(--c-burnt-tint); color: var(--c-burnt); }
.resource-card__cover-icon { width: 44px; height: 44px; opacity: .6; }

.resource-card__filetype {
    position: absolute;
    top: .85rem;
    left: .85rem;
    background: var(--c-moss);
    color: var(--c-white);
    font-family: var(--font-heading);
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    padding: .3rem .6rem;
    border-radius: 4px 12px 4px 12px;
}
.resource-card:nth-child(3n+2) .resource-card__filetype { background: var(--c-gold); color: var(--c-espresso); }
.resource-card:nth-child(3n+3) .resource-card__filetype { background: var(--c-burnt); }

.resource-card__body { padding: 1.25rem; }
.resource-card__title { font-family: var(--font-heading); font-size: 1.05rem; margin: 0 0 .5rem; color: var(--text-primary); }
.resource-card__abstract { color: var(--text-muted); font-size: .9rem; margin: 0 0 1rem; }
.resource-card__meta {
    display: flex;
    align-items: center;
    gap: .4rem;
    font-family: var(--font-heading);
    font-size: .78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--text-muted);
    padding-top: .85rem;
    border-top: 1px solid var(--border-subtle);
}
.resource-card__meta svg { width: 14px; height: 14px; opacity: .6; flex-shrink: 0; }

/* ==========================================================================
   Reveal-on-scroll (GSAP hook)
   ========================================================================== */
[data-reveal] { opacity: 0; transform: translateY(24px); }
.n-mr-20 {margin-right: 20px;}
.n-mr-10{margin-right: 10px;}