/* ==========================================================================
   don't bin gen z — shared design system
   v3, 2026-08-06. Built from DBGZ Brand Kit v1 + the v3 prototype.

   THIS FILE IS SHARED BY EVERY PAGE. It holds the tokens, the reset, @font-face,
   the header, the footer, buttons, fields, modals, the lightbox, stars, the
   notice primitives and the cookie consent banner — and nothing else. Anything
   page-specific belongs in that page's own stylesheet under public/css/pages/,
   where every class carries the
   page prefix (.home-* .mat-* .opp-* .fund-* .priv-* .nf-*). Shared classes never
   carry a prefix; page stylesheets never define an unprefixed class. That rule is
   what stops two pages quietly redefining .card.

   The prototype styles every element inline and fakes hover with a `style-hover`
   attribute that browsers ignore. Everything below is the real thing: working
   :hover, :focus-visible and prefers-reduced-motion.
   ========================================================================== */


/* --------------------------------------------------------------- @font-face
   Self-hosted. The site used to pull Anton / Space Grotesk / Space Mono from
   Google's CDN, which discloses every visitor's IP to Google — the privacy notice
   says no third-party tracking, and LG München I 3 O 17493/20 held that
   unconsented Google Fonts embedding breaches the GDPR. All three are SIL OFL 1.1.
   Anton is the permanent display face for v3: the kit flags it as a stand-in for
   Paalalabas Condensed, which still is not web-wired. --display is the single swap
   point if that file ever arrives. */

@font-face {
  font-family: 'Anton';
  src: url('/fonts/anton-400.woff2') format('woff2');
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Space Grotesk';
  src: url('/fonts/space-grotesk-var.woff2') format('woff2');
  font-weight: 300 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Space Mono';
  src: url('/fonts/space-mono-400.woff2') format('woff2');
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Space Mono';
  src: url('/fonts/space-mono-400-italic.woff2') format('woff2');
  font-weight: 400; font-style: italic; font-display: swap;
}
@font-face {
  font-family: 'Space Mono';
  src: url('/fonts/space-mono-700.woff2') format('woff2');
  font-weight: 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Pagkaki';
  src: url('/fonts/PAGKAKI-Regular.ttf') format('truetype');
  font-weight: 400; font-style: normal; font-display: swap;
}


/* ------------------------------------------------------------------- tokens
   The ONLY place a colour literal appears. Never set text on rust to --paper:
   rust grounds take --chalk. The two prose greys are a hierarchy, not a rounding
   error — --body-ink for the main argument, --body-ink-2 for anything supporting
   it (standfirsts, card "why" text, list captions). */

:root {
  --ink: #0B0B0B;          /* near-black ground and body text */
  --paper: #FFFFFF;        /* light ground */
  --rust: #C2371F;         /* primary accent, links, rules */
  --flare: #FF3A20;        /* the full stop, focus rings, errors */
  --amber: #FFB600;        /* highlight, primary button on dark */
  --slate: #2E2E39;        /* secondary dark panel */
  --slate-2: #46465A;      /* borders inside slate panels */
  --chalk: #DBDBDB;        /* type on rust grounds */
  --rule: #E5E3DB;         /* hairlines on paper */
  --body-ink: #1F1E1B;     /* primary long-form prose */
  --body-ink-2: #3D3C36;   /* secondary prose */
  --muted: #6B6A61;        /* captions on paper */
  --muted-dark: #C9C8BF;   /* captions on dark */
  --faint: #8F8E9B;        /* legal / imprint */
  --wash: #FAF8F2;         /* hover fill, dashed placeholder ground */
  --dash: #B7B5AB;         /* dashed borders */
  --ink-field: #1B1B22;    /* input ground inside an ink panel */
  --slate-field: #23232D;  /* input ground inside a slate panel */

  --scrim: rgba(11, 11, 11, 0.92);    /* modal backdrop */
  --scrim-2: rgba(11, 11, 11, 0.95);  /* lightbox backdrop */

  --display: Anton, sans-serif;
  --mono: 'Space Mono', monospace;
  --sans: 'Space Grotesk', sans-serif;
  --scrawl: 'Pagkaki', cursive;

  --shell: 1220px;
  --gut: clamp(18px, 4vw, 28px);
  --header-h: 104px;
}


/* -------------------------------------------------------------------- reset */

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-padding-top: var(--header-h);  /* plain anchor jumps clear the sticky header, no JS */
}

body {
  margin: 0;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--sans);
  font-size: 18px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

main#main {
  flex: 1 0 auto;   /* absorbs leftover height so the footer sits at the viewport bottom on short pages */
}

/* .nf-wrap and .adm-login are the only two page panels that paint a
   full-bleed dark background directly inside main — when main's flex-grow
   stretches it on a short page, a plain block child does not grow with it
   (percentage heights don't resolve here). Flexifying main is scoped to just
   these two pages via :has(), so it never touches the homepage's
   margin-collapsing prose flow or any other page. */
main#main:has(> .nf-wrap),
main#main:has(> .adm-login) {
  display: flex;
  flex-direction: column;
}

img, svg, video { max-width: 100%; }
img, video { height: auto; }

a {
  color: inherit;
  text-decoration: underline;
  text-decoration-color: var(--rust);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
a:hover { text-decoration-thickness: 3px; color: var(--rust); }

input, select, button, textarea {
  font-family: var(--mono);
  font-size: 16px;
  color: inherit;
}

fieldset { border: none; margin: 0; padding: 0; min-width: 0; }
legend { padding: 0; }

:focus-visible { outline: 3px solid var(--flare); outline-offset: 2px; }
::selection { background: var(--amber); color: var(--ink); }

[hidden] { display: none !important; }


/* ------------------------------------------------------------------- layout */

/* the page shell. every band that needs the 1220px column wraps its content in it. */
.wrap {
  max-width: var(--shell);
  margin: 0 auto;
  padding: 0 var(--gut);
}

/* skip link — off screen until focused, then pinned top-left over the header */
.skip {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 100;
  background: var(--amber);
  color: var(--ink);
  font-family: var(--mono);
  font-weight: 700;
  font-size: 14px;
  padding: 14px 18px;
  text-decoration: none;
}
.skip:focus { left: 0; }

/* visually hidden, still announced */
.vh {
  position: absolute !important;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}


/* --------------------------------------------------------------------- type */

.eyebrow {
  margin: 0 0 12px;
  font-family: var(--mono);
  font-size: 12.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}
.eyebrow--rust { color: var(--rust); }
.eyebrow--amber { color: var(--amber); }

/* the full stop. it is --flare everywhere it appears, and it is the only place
   --flare is used as type. */
.dot { color: var(--flare); }

.mono { font-family: var(--mono); }

/* the marker-pen voice. one line at a time, real numbers only, never for UI. */
.scrawl {
  font-family: var(--scrawl);
  line-height: 1.08;
  text-transform: uppercase;
}


/* -------------------------------------------------------------------- prose
   The rendered markdown body of an article, and any long-form block that wants
   the same rhythm. Wrap it once: <div class="prose">…</div>. */

.prose { max-width: 68ch; }

.prose p {
  margin: 0 0 22px;
  font-size: 19px;
  line-height: 1.68;
  color: var(--body-ink);
}

.prose-lede {
  font-size: 21px;
  line-height: 1.55;
  font-weight: 500;
  color: var(--body-ink);
  text-wrap: pretty;
}

.prose h2 {
  margin: 42px 0 14px;
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(26px, 3.4vw, 38px);
  line-height: 1;
  letter-spacing: -0.015em;
  text-transform: uppercase;
  color: var(--ink);
}

.prose h3 {
  margin: 30px 0 10px;
  font-family: var(--mono);
  font-weight: 700;
  font-size: 15px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--rust);
}

.prose ul, .prose ol {
  margin: 0 0 22px;
  padding-left: 22px;
  font-size: 18px;
  line-height: 1.65;
  color: var(--body-ink);
}
.prose li { margin: 0 0 10px; }
.prose li::marker { color: var(--rust); }

.prose a { color: var(--rust); }
.prose strong { font-weight: 700; color: var(--ink); }
.prose em { font-style: italic; }

.prose blockquote {
  margin: 26px 0;
  padding: 4px 0 4px 20px;
  border-left: 3px solid var(--rust);
  font-size: 20px;
  line-height: 1.5;
  color: var(--body-ink);
}
.prose blockquote p:last-child { margin-bottom: 0; }

.prose code {
  font-family: var(--mono);
  font-size: 0.88em;
  background: var(--wash);
  border: 1px solid var(--rule);
  border-radius: 3px;
  padding: 2px 5px;
}
.prose pre {
  margin: 0 0 22px;
  padding: 16px;
  overflow-x: auto;
  background: var(--wash);
  border: 1px solid var(--rule);
  border-radius: 3px;
}
.prose pre code { background: none; border: none; padding: 0; }

.prose hr { border: none; border-top: 1px solid var(--rule); margin: 32px 0; }
.prose img { display: block; margin: 0 0 22px; border-radius: 4px; }


/* ------------------------------------------------------------------ buttons
   .btn is the base; add exactly one colour variant, plus --block / --lg as
   needed. Works on <button> and <a> alike. */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 48px;
  padding: 14px 20px;
  border: none;
  border-radius: 3px;
  font-family: var(--mono);
  font-weight: 700;
  font-size: 15px;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

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

/* chalk on rust, never paper on rust */
.btn--rust { background: var(--rust); color: var(--chalk); }
.btn--rust:hover { background: var(--ink); color: var(--paper); }

.btn--ink { background: var(--ink); color: var(--paper); }
.btn--ink:hover { background: var(--rust); color: var(--chalk); }

/* outline buttons. -light sits on paper, -dark sits on ink or slate. */
.btn--ghost-light {
  background: transparent;
  color: var(--ink);
  border: 2px solid var(--ink);
  padding: 12px 20px;
}
.btn--ghost-light:hover { background: var(--ink); color: var(--paper); }

.btn--ghost-dark {
  background: transparent;
  color: var(--paper);
  border: 2px solid var(--paper);
  padding: 12px 20px;
}
.btn--ghost-dark:hover { background: var(--paper); color: var(--ink); }

.btn--block { width: 100%; }

/* the shouting one: Anton, uppercase, full-width submits */
.btn--lg {
  min-height: 52px;
  padding: 19px;
  font-family: var(--display);
  font-weight: 400;
  font-size: 24px;
  letter-spacing: -0.005em;
  text-transform: uppercase;
}

.btn[disabled], .btn[aria-disabled='true'] { opacity: 0.55; cursor: not-allowed; }


/* ------------------------------------------------------------ cookie consent
   Fixed to the viewport bottom. Hidden by default — public/js/site.js decides
   whether to reveal it, based on the dbgz_consent cookie. GA4's script tag is only
   ever injected after an explicit accept; see that file for why. z-index 85 sits
   above the sticky header (40) so the banner is never covered by normal page
   content, but BELOW .modal (90): an open modal traps keyboard focus, so it must
   always take visual and functional precedence over the banner rather than have
   the banner paint over part of it while being keyboard-unreachable underneath. */

.consent {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 85;
  background: var(--slate);
  color: var(--chalk);
  border-top: 1px solid var(--slate-2);
}

.consent-in {
  max-width: var(--shell);
  margin: 0 auto;
  padding: 16px var(--gut);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}

.consent-p {
  margin: 0;
  flex: 1 1 420px;
  font-family: var(--mono);
  font-size: 14px;
  line-height: 1.5;
}

.consent-p a { color: var(--amber); }

.consent-actions {
  display: flex;
  gap: 12px;
  flex: 0 0 auto;
}


/* ------------------------------------------------------------------- fields
   .field wraps one label + control. Put .on-ink or .on-slate on an ancestor to
   move the whole group onto a dark ground — that is the only thing those two
   classes do. */

.field { display: flex; flex-direction: column; gap: 7px; }

.field-label { font-family: var(--mono); font-size: 13px; color: var(--body-ink-2); }

.input, .textarea {
  width: 100%;
  min-height: 48px;
  padding: 14px;
  background: var(--paper);
  border: 1px solid var(--rule);
  border-radius: 3px;
  color: var(--body-ink);
  font-family: var(--mono);
  font-size: 16px;
}
.input:hover, .textarea:hover { border-color: var(--muted); }

.textarea { min-height: 120px; line-height: 1.5; resize: vertical; }

.field-err { margin: 0; font-family: var(--mono); font-size: 13.5px; color: var(--flare); }

.form-note { margin: 0; font-family: var(--mono); font-size: 12.5px; line-height: 1.6; color: var(--muted); }

.on-ink .field-label, .on-slate .field-label { color: var(--muted-dark); }
.on-ink .form-note, .on-slate .form-note { color: var(--faint); }
.on-ink .form-note a, .on-slate .form-note a { color: var(--faint); }

.on-ink .input, .on-ink .textarea {
  background: var(--ink-field);
  border-color: var(--slate);
  color: var(--paper);
}
.on-slate .input, .on-slate .textarea {
  background: var(--slate-field);
  border-color: var(--slate-2);
  color: var(--paper);
}
.on-ink .input:hover, .on-ink .textarea:hover,
.on-slate .input:hover, .on-slate .textarea:hover { border-color: var(--amber); }


/* ------------------------------------------------------------------- modals
   Markup lives in the page (components/modals.js) and is `hidden` until opened —
   these are the styles only. Escape precedence, focus trapping and focus return
   are public/js/site.js's job, once, for all of them. */

.modal {
  position: fixed;
  inset: 0;
  z-index: 90;
  background: var(--scrim);
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding: clamp(12px, 4vw, 48px);
  overflow-y: auto;
}

.modal-panel {
  position: relative;
  width: min(520px, 100%);
  border-radius: 4px;
  padding: clamp(22px, 4vw, 40px);
  color: var(--paper);
}
.modal-panel--ink { background: var(--ink); border: 1px solid var(--slate); }
.modal-panel--slate { width: min(560px, 100%); background: var(--slate); }

.modal-close {
  position: absolute;
  top: 14px;
  right: 14px;
  width: 44px;
  height: 44px;
  background: transparent;
  color: var(--muted-dark);
  border: 1px solid var(--slate);
  border-radius: 3px;
  font-family: var(--mono);
  font-size: 16px;
  cursor: pointer;
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.modal-panel--slate .modal-close { border-color: var(--slate-2); }
.modal-close:hover { background: var(--amber); color: var(--ink); border-color: var(--amber); }

.modal-eyebrow {
  margin: 0 0 12px;
  font-family: var(--mono);
  font-size: 12.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--amber);
}

.modal-title {
  margin: 0 0 10px;
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(28px, 4.4vw, 46px);
  line-height: 0.94;
  letter-spacing: -0.02em;
  text-transform: uppercase;
  color: var(--paper);
  max-width: 20ch;
}

.modal-lede {
  margin: 0 0 26px;
  font-size: 16.5px;
  line-height: 1.55;
  color: var(--muted-dark);
  max-width: 44ch;
}

.modal-fields { display: flex; flex-direction: column; gap: 16px; }

.modal-err { margin: 14px 0 0; font-family: var(--mono); font-size: 13.5px; color: var(--flare); }

/* pair with .btn .btn--amber .btn--lg .btn--block */
.modal-submit { margin-top: 24px; }

.modal-fine {
  margin: 14px 0 0;
  font-family: var(--mono);
  font-size: 12.5px;
  line-height: 1.6;
  color: var(--faint);
}
.modal-fine a { color: var(--faint); }

/* the success panel that replaces the form in place */
.modal-done .modal-title { margin-bottom: 14px; }
.modal-done .modal-lede { font-size: 17px; line-height: 1.6; }

.modal-actions { display: flex; flex-wrap: wrap; gap: 10px; }


/* ----------------------------------------------------------------- lightbox
   Progressive enhancement: each gallery figure is a real <a> to the full-size
   WebP, and JS upgrades the click to this overlay. */

.lb {
  position: fixed;
  inset: 0;
  z-index: 80;
  background: var(--scrim-2);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(12px, 4vw, 40px);
}

.lb-img { max-width: 100%; max-height: 100%; width: auto; object-fit: contain; }

.lb-close {
  position: absolute;
  top: 14px;
  right: 14px;
  background: var(--amber);
  color: var(--ink);
  border: none;
  border-radius: 3px;
  padding: 12px 16px;
  font-family: var(--mono);
  font-weight: 700;
  font-size: 14px;
  cursor: pointer;
}
.lb-close:hover { background: var(--paper); }


/* -------------------------------------------------------------------- stars
   Positioning is the PAGE stylesheet's job: give each star a class and set
   top/right/bottom/left, width and rotate there. Every star's parent needs
   `position: relative; overflow: hidden` in that same file. */

.star {
  position: absolute;
  z-index: 1;
  max-width: none;
  pointer-events: none;
  user-select: none;
}

/* Below 641px only the stars marked .star-sm-keep render — the prototype's
   starsFull / starsAny split. Small screens get one star per ground, not a crowd. */
@media (max-width: 640px) {
  .star:not(.star-sm-keep) { display: none; }
}

.star-ftr { right: -34px; bottom: -38px; width: min(24vw, 132px); transform: rotate(13deg); }


/* ------------------------------------------------------------------- notice
   A full-bleed band. Put a .wrap inside it for the column. The campaign-era
   sitewide banner is retired — real 301s and 404s do that job now — but the
   primitive stays for anything genuinely sitewide later. */

.notice {
  background: var(--rust);
  color: var(--chalk);
  font-family: var(--mono);
  font-size: 13.5px;
  line-height: 1.6;
  padding: 11px 0;
}
.notice a { color: var(--chalk); }
.notice--warn { background: var(--amber); color: var(--ink); }
.notice--warn a { color: var(--ink); }


/* ------------------------------------------------------------------- header */

.hdr {
  position: sticky;
  top: 0;
  z-index: 40;
  background: var(--paper);
  border-bottom: 2px solid var(--ink);
}

.hdr-in {
  max-width: var(--shell);
  margin: 0 auto;
  padding: 13px var(--gut);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px 28px;
}

.hdr-lock { display: flex; align-items: center; gap: 11px; min-width: 0; text-decoration: none; }
.hdr-mark { flex: none; width: 20px; height: 25px; }
.hdr-words { display: flex; flex-direction: column; gap: 1px; min-width: 0; }

.hdr-word {
  font-family: var(--mono);
  font-weight: 700;
  font-size: clamp(15px, 4vw, 17px);
  letter-spacing: -0.03em;
  color: var(--ink);
  white-space: nowrap;
}

.hdr-tag {
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--muted);
  white-space: nowrap;
}

.hdr-nav {
  display: flex;
  align-items: center;
  gap: 8px 22px;
  font-family: var(--mono);
  font-size: 14px;
}

.hdr-link {
  color: var(--ink);
  text-decoration: none;
  white-space: nowrap;
  padding-bottom: 2px;
  border-bottom: 2px solid transparent;
  transition: color 0.15s ease, border-color 0.15s ease;
}
.hdr-link:hover { color: var(--rust); border-bottom-color: var(--rust); }
.hdr-link.is-on { border-bottom-color: var(--ink); }
.hdr-link.is-on:hover { border-bottom-color: var(--rust); }

.hdr-fund {
  background: var(--rust);
  color: var(--chalk);
  font-family: var(--mono);
  font-weight: 700;
  font-size: 14px;
  padding: 11px 16px;
  border-radius: 3px;
  text-decoration: none;
  white-space: nowrap;
  transition: background-color 0.15s ease, color 0.15s ease;
}
.hdr-fund:hover { background: var(--ink); color: var(--paper); }

.hdr-burger {
  display: none;               /* the media query below turns it on at ≤900px */
  flex: none;
  width: 48px;
  height: 48px;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 5px;
  background: var(--ink);
  border: none;
  border-radius: 3px;
  cursor: pointer;
}
.hdr-burger span { display: block; width: 20px; height: 2px; background: var(--paper); }
.hdr-burger span:last-child { background: var(--amber); }

.hdr-menu { border-top: 1px solid var(--rule); background: var(--ink); }

.hdr-menu-in {
  max-width: var(--shell);
  margin: 0 auto;
  padding: 10px var(--gut) 22px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.hdr-mlink {
  display: flex;
  align-items: center;
  min-height: 52px;
  font-family: var(--display);
  font-size: 30px;
  letter-spacing: -0.01em;
  text-transform: uppercase;
  color: var(--paper);
  text-decoration: none;
  border-bottom: 1px solid var(--slate);
}
.hdr-mlink:hover { color: var(--amber); }
.hdr-mlink.is-on { color: var(--amber); }

.hdr-mfund {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 52px;
  margin-top: 14px;
  padding: 17px 18px;
  background: var(--amber);
  color: var(--ink);
  font-family: var(--mono);
  font-weight: 700;
  font-size: 16px;
  border-radius: 3px;
  text-decoration: none;
  text-align: center;
}
.hdr-mfund:hover { background: var(--paper); color: var(--ink); }

/* ≤900px: the horizontal nav goes, the hamburger arrives. */
@media (max-width: 900px) {
  .hdr-nav { display: none; }
  .hdr-burger { display: flex; }
}

/* >900px: the mobile panel can never render, whatever state JS left it in. */
@media (min-width: 901px) {
  .hdr-menu { display: none !important; }
}

/* 901–1079px: the tagline hides in that band ONLY — the wordmark and four nav
   items need the room. It is back at ≥1080px, and at ≤900px where the nav has
   collapsed. */
@media (min-width: 901px) and (max-width: 1079px) {
  .hdr-tag { display: none; }
}


/* ------------------------------------------------------------------- footer */

.ftr { position: relative; overflow: hidden; background: var(--ink); color: var(--paper); }

.ftr-in {
  position: relative;
  z-index: 2;
  max-width: var(--shell);
  margin: 0 auto;
  padding: clamp(44px, 6vw, 84px) var(--gut) clamp(24px, 3vw, 36px);
  display: flex;
  flex-wrap: wrap;
  gap: 36px 48px;
  justify-content: space-between;
}

.ftr-brand { flex: 1 1 340px; min-width: 0; }

.ftr-word {
  margin: 0 0 12px;
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(34px, 7vw, 78px);
  line-height: 0.9;
  letter-spacing: -0.025em;
  text-transform: uppercase;
}

.ftr-tag {
  margin: 0;
  font-family: var(--mono);
  font-size: 13.5px;
  line-height: 1.7;
  color: var(--muted-dark);
  max-width: 40ch;
}

.ftr-nav { display: flex; flex-direction: column; gap: 12px; font-family: var(--mono); font-size: 14px; }

.ftr-link { color: var(--paper); text-decoration: none; transition: color 0.15s ease; }
.ftr-link:hover { color: var(--amber); }
.ftr-link.is-on { color: var(--amber); }

.ftr-link-quiet { color: var(--faint); text-decoration: none; transition: color 0.15s ease; }
.ftr-link-quiet:hover { color: var(--amber); }
.ftr-link-quiet.is-on { color: var(--amber); }

.ftr-imprint {
  position: relative;
  z-index: 2;
  max-width: var(--shell);
  margin: 0 auto;
  padding: 0 var(--gut) clamp(36px, 5vw, 56px);
  font-family: var(--mono);
  font-size: 12.5px;
  color: var(--faint);
}
.ftr-imprint a { color: var(--faint); }
.ftr-imprint a:hover { color: var(--amber); }


/* --------------------------------------------------------- reduced motion
   Last, so it wins. Everything above degrades to no transition, no animation,
   no smooth scroll — including the home rail's smooth-scroll, which drops back
   to the plain anchor jump. */

@media (prefers-reduced-motion: reduce) {
  * {
    animation: none !important;
    transition: none !important;
    scroll-behavior: auto !important;
  }
}
