/* masthead.css — gf.cx portfolio editorial-masthead primitive
 *
 * A full-bleed gradient band carrying an oversized Newsreader serif title, an
 * uppercase kicker, a subtitle, and an optional row of stat "barometers".
 * Distilled from home.gf.cx's Almanac masthead into a STATIC, reusable form —
 * no weather, no day/night paint JS, no countdown logic. Any surface that wants
 * the "front-page" editorial treatment (vs the plain page-header) uses this.
 *
 * It composes with the rest of the house system: it sets no fonts or colours of
 * its own beyond the band, reading the design-system tokens (each with a hex
 * fallback) so it inherits whatever :root the surface already defines.
 *
 * ── Markup ──────────────────────────────────────────────────────────────
 *   <header class="masthead">
 *     <div class="masthead__inner">
 *       <div class="masthead__kicker">
 *         <span>surface.gf.cx</span><span class="where">center of excellence</span>
 *       </div>
 *       <h1 class="masthead__title">SEO — a Center of <em>Excellence</em></h1>
 *       <p class="masthead__sub">The playbooks we actually run — used, not admired.</p>
 *       <div class="masthead__stats">
 *         <div class="stat"><span class="stat__val">3</span>
 *              <span class="stat__lbl">domains tracked</span></div>
 *         <div class="stat"><span class="stat__val">1</span>
 *              <span class="stat__lbl">playbook live</span></div>
 *         <div class="stat"><span class="stat__val">4</span>
 *              <span class="stat__lbl">pillars</span></div>
 *       </div>
 *     </div>
 *   </header>
 *
 *   .masthead            the full-bleed gradient band
 *   .masthead__inner     the centred column (matches the page's measure)
 *   .masthead__kicker    uppercase letterspaced label; .where = muted 2nd clause
 *   .masthead__title     oversized Newsreader serif; <em> = italic accent
 *   .masthead__sub       one muted subtitle line
 *   .masthead__stats     the "barometer" row — flex-wrap of .stat
 *   .stat__val / __lbl   big serif number · uppercase label
 *
 * ── Variants ────────────────────────────────────────────────────────────
 *   .masthead--warm      sage→paper gradient (default is the cool Almanac sky)
 *   .masthead--dark      for DARK surfaces: top stop is a subtle cool lift off --bg (no light wash)
 *   .masthead--tight     smaller title clamp for shorter surfaces
 *   .masthead--compact   slim band (height + title) for 2nd-level record pages
 *   .masthead__title.upright   serif UPRIGHT (not italic) — restrained voice
 *
 * ── Tokens referenced (hex fallbacks baked in) ──────────────────────────
 *   --serif --sans --accent --ink --ink-soft --line --bg
 *   --mh-top / --mh-bot   band gradient stops (override per surface)
 *   --mh-min-h            min band height (default 0) — a blunt band-height floor
 *   --mh-sub-lines        reserve the subtitle to N lines (default 0) — the BETTER
 *                         way to equalise a SET of mastheads: it equalises the
 *                         CONTENT height, so bands match AND content fills each
 *                         band (no page floats high with a gap below the stats)
 *   --mh-title-lines      reserve the TITLE to N lines (default 0) — the sibling
 *                         of --mh-sub-lines for when titles ALSO vary in wrap
 *                         across the set (a 1-line title page vs a 2-line one).
 *                         Set both to the set's max; together they equalise the
 *                         whole content column so the rail aligns page-to-page.
 */

.masthead {
  --mh-serif:    var(--serif, 'Newsreader', 'Times New Roman', Georgia, serif);
  --mh-sans:     var(--sans, 'Atkinson Hyperlegible', Verdana, Tahoma, sans-serif);
  --mh-ink:      var(--ink, #1a1816);
  --mh-ink-soft: var(--ink-soft, #5a544d);
  --mh-accent:   var(--accent, #2c4a3a);
  --mh-line:     var(--line, rgba(26, 24, 22, 0.12));
  --mh-top:      #cdd9df;              /* cool Almanac sky by default */
  --mh-bot:      var(--bg, #f7f3ec);   /* melt into the page */

  position: relative;
  /* Full-bleed: a 100vw band centred on the viewport. The gutter lives on
   * .masthead__inner, so the band needs NO horizontal padding. (v0.2.0 — was
   * `margin:0 -100vw` + `padding:… 100vw …`, which laid the box out at ~300vw;
   * overflow-x:clip hid it for viewers, but full-page capture tools that ignore
   * `clip` saw the 3×-viewport box as phantom width. 100vw lays out at exactly
   * one viewport.) Host still needs overflow-x:clip (the 100vw ignores the
   * scrollbar gutter). */
  width: 100vw;
  margin: 0 calc(50% - 50vw) 2.2rem;
  padding: 2.4rem 0 2rem;
  background: linear-gradient(180deg, var(--mh-top) 0%, var(--mh-bot) 100%);
  border-bottom: 1px solid var(--mh-line);
  /* --mh-min-h: floor the band height so a SET of mastheads (e.g. a pillar
   * group) stays the same height whatever the title line-count — otherwise a
   * shorter title makes a shorter band and anything below it (a sticky left
   * rail) lands at a different Y page-to-page. Default 0 = off (no-op). */
  min-height: var(--mh-min-h, 0);
}

/* ── rail variant — v0.5.0 (2026-11-12) — masthead INSIDE a rail content column ─
 * For surfaces with a fixed LEFT RAIL (assets.gf.cx/rail) where the masthead
 * lives INSIDE .rail-main (directly above <main>), NOT before the rail. The
 * base band's `width:100vw; margin:0 calc(50% - 50vw)` breaks out to the
 * VIEWPORT centre — wrong in a rail column: under a 196px rail it starts
 * mid-rail and overflows the viewport to the right. This variant drops the
 * viewport breakout so the band fills its CONTAINER (.rail-main) instead:
 *   · desktop (rail is a flex sibling) → band is full-bleed to the RIGHT of
 *     the rail, flush to the viewport's right edge;
 *   · mobile <900px (rail is a sticky top sheet, .rail-layout is block) →
 *     .rail-main is full width, so the band is full-bleed to the viewport.
 * No 100vw, so NO horizontal overflow at any width.
 *
 * ALIGNMENT: the band fills .rail-main and its .masthead__inner centres on
 * --mh-measure, exactly as <main class="page"> centres on its own max-width in
 * the SAME .rail-main. Set --mh-measure to the page's .page max-width (e.g.
 * style="--mh-measure:820px") and the title/kicker/lede left-edge lands on the
 * content column's left-edge. Composes with --compact / --warm (they touch only
 * band height, padding, colour — not width or side margins).
 * Born brand.gf.cx (rail-masthead misalignment + per-page rail-Y jump fix). */
.masthead--rail {
  width: auto;
  margin-left: 0;
  margin-right: 0;
}

/* warm sage variant — distinct from home's cool sky */
.masthead--warm { --mh-top: #dbe3da; }

/* solid variant — for SPARSE mastheads (kicker + a short title, no stat row).
 * The base gradient melts --mh-top → --mh-bot across the FULL band height, which
 * assumes rich content filling the band; on a sparse band the title floats in
 * the faded lower half under a top-concentrated colour stripe (reads "weird").
 * --solid holds the tint for the upper two-thirds, then melts only at the foot,
 * so the (short) content sits ON the colour and the band reads as one cohesive
 * tinted panel. Tune the hold-point here once; every sparse surface inherits it.
 * NB: a bare-% interpolation HINT (not a second colour stop) biases the melt
 * low with a SMOOTH curve — the old two-stop form kinked at 64% and Mach-banded
 * a visible horizontal seam across wide bands (data.gf.cx, 2026-11-11). */
.masthead.masthead--solid {
  background: linear-gradient(180deg,
    var(--mh-top) 0%, 70%, var(--mh-bot) 100%);
  /* The band already melts to --bg; a crisp 1px bottom rule cutting across that
   * fade reads as a visible header seam (data.gf.cx, 2026-11-11). On the melt
   * variant the dissolve IS the edge — drop the line. (Rich editorial mastheads
   * with a stat row keep the base border to separate band from content.) */
  border-bottom: 0;
}

/* bare variant — title typography on PAPER, NO tinted band. For a bespoke title
 * page whose masthead IS the page heading (data.gf.cx) and where ANY coloured
 * band reads as an unwanted header bar bolted over the content. Keeps the
 * masthead type treatment + --mh-measure alignment; drops the wash and the rule
 * entirely. The structural header/band markers still resolve via .masthead, so
 * the surface stays almanac-done on its typography, not a decorative strip.
 * (Born 2026-11-11: Dan — the sage band "reads as a visible header", REMOVE it.) */
.masthead.masthead--bare {
  background: none;
  border-bottom: 0;
}

/* dark variant — for surfaces whose --bg is dark. The default --mh-top is a
 * LIGHT sky stop; over a dark page that paints a pale wash. Here the top stop
 * is the page bg lifted toward a cool slate, so the band reads as a gentle
 * glow that melts into --bg. Inks adapt via the surface's own tokens. */
.masthead--dark {
  --mh-top: color-mix(in srgb, var(--bg, #0f1211) 78%, #4a5d66);
  --mh-line: rgba(255, 255, 255, 0.10);
}

.masthead__inner {
  max-width: var(--mh-measure, 760px);
  margin: 0 auto;
  padding: 0 1.5rem;
}

.masthead__kicker {
  font-family: var(--mh-sans);
  font-size: 12px; letter-spacing: 2.4px; text-transform: uppercase;
  font-weight: 700; color: var(--mh-accent);
  margin-bottom: 1.1rem;
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .55rem;
}
.masthead__kicker .where { color: var(--mh-ink-soft); letter-spacing: 1.6px; font-weight: 700; }
.masthead__kicker .where::before { content: "·"; margin-right: .55rem; color: var(--mh-ink-soft); }

.masthead__title {
  font-family: var(--mh-serif); font-weight: 400;
  line-height: 1.02; letter-spacing: -0.6px;
  font-size: clamp(2.3rem, 6.2vw, 4rem);
  color: var(--mh-ink);
  /* reserve N title lines so a SET of mastheads whose titles wrap differently
   * (1-line vs 2-line) still fills to equal height; 0 = off. 1lh honours the
   * title's own line-height (1.02). Sibling of --mh-sub-lines. */
  min-height: calc(var(--mh-title-lines, 0) * 1lh);
}
.masthead--tight .masthead__title { font-size: clamp(2rem, 5vw, 3rem); }
.masthead__title em { font-family: var(--mh-serif); font-style: italic; color: var(--mh-accent); font-weight: 400; }
.masthead__title.upright { font-style: normal; }
.masthead__title.upright em { font-style: normal; }

/* compact — slim band for second-level RECORD pages: pulls in the band height
 * and title so a deep page gets a titled header without a landing's full weight
 * (you page through many records; the big band belongs to the landing). Composes
 * with --warm. */
.masthead--compact { margin-bottom: 1.4rem; padding-top: 1.3rem; padding-bottom: 1.1rem; }
.masthead--compact .masthead__kicker { margin-bottom: .55rem; }
.masthead--compact .masthead__title { font-size: clamp(1.65rem, 4vw, 2.4rem); }
.masthead--compact .masthead__sub { margin-top: .45rem; font-size: 14px; }

.masthead__sub {
  margin-top: .6rem; max-width: 46ch;
  font-family: var(--mh-sans); font-size: 15px; line-height: 1.5;
  color: var(--mh-ink-soft);
  /* reserve N subtitle lines so a SET of mastheads fills to equal height; 0 = off */
  min-height: calc(var(--mh-sub-lines, 0) * 1lh);
}

/* stat "barometer" row */
.masthead__stats {
  margin-top: 1.6rem;
  display: flex; flex-wrap: wrap; gap: 1.4rem 2.2rem; align-items: flex-end;
}
.masthead__stats .stat { display: flex; flex-direction: column; gap: .3rem; min-width: 92px; }
.stat__val {
  font-family: var(--mh-serif); font-size: 2rem; line-height: 1;
  font-variant-numeric: tabular-nums lining-nums; letter-spacing: -1px;
  color: var(--mh-ink);
}
.stat__val .u { font-size: .9rem; color: var(--mh-ink-soft); margin-left: 2px; font-family: var(--mh-sans); letter-spacing: 0; }
.stat__lbl {
  font-family: var(--mh-sans);
  font-size: 11px; letter-spacing: 1.4px; text-transform: uppercase;
  color: var(--mh-ink-soft); font-weight: 700;
}
/* a stat can carry the accent (e.g. the one that's "live") */
.stat--accent .stat__val { color: var(--mh-accent); }
/* a stat can be a link — v0.1.1 (e.g. the "live specimens" count on assets.gf.cx) */
a.stat, a.stat:visited { text-decoration: none; color: inherit; cursor: pointer; }
a.stat:hover .stat__lbl, a.stat:focus-visible .stat__lbl { color: var(--mh-accent); text-decoration: underline; text-underline-offset: 3px; }

@media (max-width: 480px) {
  .masthead { padding-top: 1.8rem; padding-bottom: 1.5rem; }
  .masthead--compact { padding-top: 1rem; padding-bottom: .9rem; }
  .masthead__stats { gap: 1.1rem 1.6rem; }
  .masthead__stats .stat { min-width: 78px; }
}

/* ── specimen variant — v0.3.0 (2026-11-09) ───────────────────────────────
 * The "specimen-book" identity header (patterns.gf.cx idiom; used by etf.gf.cx
 * and the by-example pattern): a volume mark over a bordered identity CARD —
 * a heraldic icon beside an uppercase kicker, an oversized serif-ITALIC name,
 * and a standfirst. NOT a full-bleed band: --specimen neutralises the band and
 * lays the header out as a card inside the page column, so a surface that wears
 * the publication idiom still passes the `masthead` marker from one shared
 * source (no page-local identity CSS).
 *
 *   <header class="masthead masthead--specimen" style="--mh-measure:1100px">
 *     <div class="masthead__volmark">Vol. 01 · Issue 01 · Spring 2026</div>
 *     <div class="masthead__inner">
 *       <div class="masthead__icon"><img src="…/heraldic/x.svg" width="72" height="72" alt=""></div>
 *       <div class="masthead__body">
 *         <div class="masthead__kicker">personal records · ledger</div>
 *         <h1 class="masthead__title">An ETF cockpit <em>that travels</em></h1>
 *         <p class="masthead__sub">standfirst…</p>
 *       </div>
 *     </div>
 *   </header>
 */
.masthead--specimen {
  width: auto; margin: 0 0 1.75rem; padding: 0;
  background: none; border-bottom: 0; min-height: 0;
}
.masthead--specimen .masthead__volmark {
  font-family: var(--mono, ui-monospace, 'SF Mono', monospace);
  font-size: 10.5px; letter-spacing: 0.3em; text-transform: uppercase;
  color: var(--mh-ink-soft); opacity: .75;
  display: inline-block; padding-bottom: 6px; margin-bottom: 18px;
  border-bottom: 1px solid var(--mh-line);
}
.masthead--specimen .masthead__inner {
  max-width: var(--mh-measure, 1100px); margin: 0 auto; padding: 28px 30px 24px;
  background: var(--bg-card, rgba(255, 255, 255, 0.6));
  border: 1px solid var(--line-strong, rgba(26, 24, 22, 0.32));
  border-radius: 8px;
  display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap;
}
.masthead--specimen .masthead__icon { width: 72px; height: 72px; flex-shrink: 0; color: var(--mh-accent); }
.masthead--specimen .masthead__icon img { width: 100%; height: 100%; display: block; }
.masthead--specimen .masthead__body { flex: 1; min-width: 250px; }
.masthead--specimen .masthead__kicker { margin-bottom: 0.5rem; font-size: 13px; letter-spacing: 1.4px; }
.masthead--specimen .masthead__title {
  font-style: italic; font-size: clamp(2.4rem, 6vw, 3.75rem);
  line-height: 1.0; letter-spacing: -0.8px;
}
.masthead--specimen .masthead__sub { margin-top: 0.85rem; max-width: 65ch; font-size: 18px; }

@media (max-width: 600px) {
  .masthead--specimen .masthead__inner { padding: 22px 22px 20px; }
  .masthead--specimen .masthead__title { font-size: 2.3rem; }
}

/* ── growth variant — v0.4.0 (2026-11-09) — editorial record header ─────────
 * growth.gf.cx swipe-file / teardown / series / story RECORD pages wear a
 * CONTAINED two-column editorial header — an uppercase mono kicker (clay dot)
 * + oversized serif title left, a right-aligned editorial meta column
 * (SOURCE / FORMAT / FILED / STATUS), on a hairline rule — NOT a full-bleed
 * band. Like --specimen, --growth neutralises the band so the bespoke editorial
 * look passes the `masthead` marker from the ONE shared shelf (kills the
 * page-local header CSS it replaces). Maps growth's palette tokens.
 *
 *   <header class="masthead masthead--growth">
 *     <div class="masthead__inner">
 *       <div class="masthead__body">
 *         <div class="masthead__kicker"><span class="dot"></span><span>Swipe file · …</span></div>
 *         <h1 class="masthead__title">25 AI “audit” offers you can <em>steal</em>…</h1>
 *         <p class="masthead__sub">standfirst…</p>
 *       </div>
 *       <div class="masthead__meta">
 *         <div><b>SOURCE</b> AI INNER CIRCLE</div> … <div class="kept"><b>STATUS</b> KEPT</div>
 *       </div>
 *     </div>
 *   </header>
 */
.masthead--growth {
  width: auto; margin: 0; padding: 0 0 28px;
  background: none; min-height: 0;
  border-bottom: 1px solid var(--mh-line);
  /* growth palette → shelf tokens */
  --mh-serif:    var(--display, 'Newsreader', Georgia, serif);
  --mh-sans:     var(--sans, 'Atkinson Hyperlegible', system-ui, sans-serif);
  --mh-ink:      var(--ink, #211e1a);
  --mh-ink-soft: var(--ink-2, #5a554d);
  --mh-accent:   var(--accent, #2c4a3a);
  --mh-line:     var(--line, rgba(33, 30, 26, 0.12));
}
.masthead--growth .masthead__inner {
  max-width: none; margin: 0; padding: 0;
  display: flex; justify-content: space-between; align-items: flex-start; gap: 32px;
}
.masthead--growth .masthead__body { flex: 1; min-width: 0; }
.masthead--growth .masthead__kicker {
  font-family: var(--mono, ui-monospace, 'SF Mono', Menlo, monospace);
  font-size: 11.5px; letter-spacing: 0.14em; text-transform: uppercase;
  font-weight: 500; color: var(--mh-ink-soft);
  margin-bottom: 0; display: inline-flex; align-items: center; gap: 11px;
}
.masthead--growth .masthead__kicker .dot {
  width: 9px; height: 9px; border-radius: 50%; flex: none;
  background: var(--clay, #b06a3a); display: inline-block;
}
.masthead--growth .masthead__title {
  font-family: var(--mh-serif); font-weight: 600;
  font-size: clamp(2rem, 4.4vw, 2.625rem); line-height: 1.05; letter-spacing: -0.015em;
  color: var(--mh-ink); margin: 14px 0 0; max-width: 24ch;
}
.masthead--growth .masthead__title em,
.masthead--growth .masthead__title .accent {
  color: var(--mh-accent); font-style: normal; font-weight: 600;
}
.masthead--growth .masthead__sub {
  font-family: var(--mh-sans); font-size: 17px; line-height: 1.5;
  color: var(--mh-ink-soft); max-width: 70ch; margin-top: 16px;
}
.masthead--growth .masthead__sub em { color: var(--mh-accent); }
.masthead--growth .masthead__meta {
  flex: none; margin-top: 4px; text-align: right;
  font-family: var(--mono, ui-monospace, Menlo, monospace);
  font-size: 11.5px; letter-spacing: 0.06em; color: var(--ink-3, #8a8479);
  line-height: 1.9; white-space: nowrap;
}
.masthead--growth .masthead__meta b { color: var(--mh-ink-soft); font-weight: 500; }
.masthead--growth .masthead__meta .kept { color: var(--mh-accent); }
@media (max-width: 640px) {
  .masthead--growth .masthead__inner { flex-direction: column; gap: 16px; }
  .masthead--growth .masthead__meta { text-align: left; white-space: normal; }
}

/* series / video-teardown kicker carries a № marker */
.masthead--growth .masthead__kicker .num { color: var(--ink-3, #8a8479); }

/* playbook / digital-skills carry a 3-col "rail" explainer below the sub —
 * a growth editorial extra the variant accommodates (kept, not a shelf primitive) */
.masthead--growth .rail {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 0;
  margin-top: 30px; border-top: 1px solid var(--line-soft, rgba(33, 30, 26, 0.07));
}
.masthead--growth .rcol { padding: 18px 24px 4px 0; }
.masthead--growth .rcol + .rcol { padding-left: 24px; border-left: 1px solid var(--line-soft, rgba(33, 30, 26, 0.07)); }
.masthead--growth .rcol .rk {
  font-family: var(--mono, ui-monospace, Menlo, monospace);
  font-size: 11.5px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--mh-accent); margin-bottom: 7px;
}
.masthead--growth .rcol p { margin: 0; font-size: 13.5px; color: var(--mh-ink-soft); line-height: 1.5; }
@media (max-width: 820px) {
  .masthead--growth .rail { grid-template-columns: 1fr; }
  .masthead--growth .rcol + .rcol { padding-left: 0; border-left: none; border-top: 1px solid var(--line-soft, rgba(33, 30, 26, 0.07)); }
}

/* ── duo variant — v0.6.0 (2026-11-13) — the TWO-COLOUR almanac band ─────────
 * Promotes the single-colour band (--mh-top → --mh-bot) to a cool→warm wash:
 * a LIGHT cool sky on the left melting to a LIGHT warm glow on the right, both
 * dissolving DOWN into the page. Same spirit as status.gf.cx/triage/latest and
 * the sibling `.sky-wash--duo` (almanac.css) — shipped first on
 * abbeyroad.gf.cx/future/ (2026-11-13). The warm is a BAND glow only; keep text
 * ink pine and carry any wayfinding accent in a readable gold (#b8862a) — the
 * honey is too light to ink (fails AA). Pairs with --mh-ink / --mh-accent.
 *
 * Both legs are mixed INTO --mh-bot so the band stays triage-light, never dark
 * (deriving the cool leg from the DARK --mh-accent/pine was the muddy-corner
 * trap — use the LIGHT --duo-cool). SHARED `--duo-*` token family with
 * `.sky-wash--duo` (almanac.css): set these ONCE on a surface and BOTH bands
 * re-skin together. Re-skin via the four knobs:
 *   --duo-cool   left sky   (default #cdd9df, triage cool — NO green)
 *   --duo-warm   right glow (default #ffe4af, triage honey)
 *   --duo-angle  blend tilt (default 98deg; steepens on mobile)
 *   --duo-grain  paper-grain opacity over the band (default 0 = off)
 * The melt uses a bare-% interpolation HINT (not a 3rd stop) — a kinked stop
 * Mach-bands a seam on wide bands (the masthead--solid lesson). */
.masthead.masthead--duo {
  --duo-cool: #cdd9df;
  --duo-warm: #ffe4af;
  --duo-angle: 98deg;
  --duo-grain: 0;
  --duo-cool-mix: 60%;
  --duo-warm-mix: 62%;
  --duo-cool-wash: color-mix(in oklab, var(--duo-cool) var(--duo-cool-mix), var(--mh-bot));
  --duo-warm-wash: color-mix(in oklab, var(--duo-warm) var(--duo-warm-mix), var(--mh-bot));
  background:
    linear-gradient(180deg, transparent 0%, 58%, var(--mh-bot) 100%),
    linear-gradient(var(--duo-angle),
      var(--duo-cool-wash) 0%, var(--duo-warm-wash) 100%);
  border-bottom: 0;              /* the melt IS the edge (cf. masthead--solid) */
}
/* paper grain over the band — opt-in (default off). Text rides above via the
 * inner's lifted stacking context, so the grain never buries the title. */
.masthead.masthead--duo > .masthead__inner { position: relative; z-index: 1; }
.masthead.masthead--duo::after {
  content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  opacity: var(--duo-grain, 0);
  background: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/></svg>") repeat;
  background-size: 140px 140px; mix-blend-mode: soft-light;
  -webkit-mask-image: linear-gradient(180deg, #000 0%, rgba(0,0,0,0) 100%);
          mask-image: linear-gradient(180deg, #000 0%, rgba(0,0,0,0) 100%);
}
/* a near-horizontal blend on a narrow band shows only a sliver of each colour —
 * steepen it on mobile so both legs still read */
@media (max-width: 560px) { .masthead.masthead--duo { --duo-angle: 125deg; } }
