/* AI Geek — house styles. The engineering notebook, not the launch keynote.
   Tokens verbatim from brand-kit/brand-kit.md (single source of truth: build-logo.py).
   Neutral ground, violet chrome, category colour = meaning (policy violet, research/data
   phosphor, industry bronze). Mono is the sourcing signature. No gradients, ever. */

@font-face { font-family: "IBM Plex Sans"; src: url("/assets/fonts/plex-sans-400.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Sans"; src: url("/assets/fonts/plex-sans-500.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Sans"; src: url("/assets/fonts/plex-sans-600.woff2") format("woff2"); font-weight: 600; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Sans"; src: url("/assets/fonts/plex-sans-700.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Serif"; src: url("/assets/fonts/plex-serif-400.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Serif"; src: url("/assets/fonts/plex-serif-500.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Serif"; src: url("/assets/fonts/plex-serif-600.woff2") format("woff2"); font-weight: 600; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Mono"; src: url("/assets/fonts/plex-mono-400.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Mono"; src: url("/assets/fonts/plex-mono-500.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: "IBM Plex Mono"; src: url("/assets/fonts/plex-mono-600.woff2") format("woff2"); font-weight: 600; font-style: normal; font-display: swap; }

:root {
  /* brand tokens, verbatim */
  --ink:            oklch(23.5% 0.012 270);
  --ink-2:          oklch(30% 0.014 270);
  --paper:          oklch(97.5% 0.002 250);
  --panel:          oklch(94.5% 0.004 260);
  --hairline:       oklch(88% 0.004 260);
  --graphite:       oklch(45% 0.01 270);
  --graphite-light: oklch(72% 0.008 270);
  --violet:         oklch(45% 0.13 295);
  --violet-deep:    oklch(38% 0.12 295);
  --violet-light:   oklch(78% 0.075 295);
  --violet-wash:    oklch(94.5% 0.018 295);
  --phosphor:       oklch(58% 0.13 155);
  --phosphor-deep:  oklch(46% 0.115 155);
  --phosphor-light: oklch(80% 0.115 155);
  --phosphor-wash:  oklch(94.5% 0.03 155);
  --bronze:         oklch(52% 0.09 65);
  --bronze-deep:    oklch(44% 0.08 63);
  --bronze-light:   oklch(80% 0.065 75);
  --bronze-wash:    oklch(94.5% 0.02 75);
  --font-sans:  "IBM Plex Sans", system-ui, sans-serif;
  --font-serif: "IBM Plex Serif", Georgia, serif;
  --font-mono:  "IBM Plex Mono", ui-monospace, monospace;

  /* semantic (light) */
  --bg: var(--paper);
  --surface: var(--panel);
  --text: var(--ink);
  --muted: var(--graphite);
  --line: var(--hairline);
  --link: var(--violet);
  --link-hover: var(--violet-deep);
  --cat-policy-text: var(--violet);
  --cat-policy-mark: var(--violet);
  --cat-policy-wash: var(--violet-wash);
  --cat-research-text: var(--phosphor-deep);
  --cat-research-mark: var(--phosphor);
  --cat-research-wash: var(--phosphor-wash);
  --cat-industry-text: var(--bronze-deep);
  --cat-industry-mark: var(--bronze);
  --cat-industry-wash: var(--bronze-wash);
}
@media (prefers-color-scheme: dark) {
  :root {
    --bg: var(--ink);
    --surface: var(--ink-2);
    --text: var(--paper);
    --muted: var(--graphite-light);
    --line: oklch(36% 0.014 270);
    --link: var(--violet-light);
    --link-hover: oklch(85% 0.06 295);
    --cat-policy-text: var(--violet-light);
    --cat-policy-mark: var(--violet-light);
    --cat-policy-wash: var(--ink-2);
    --cat-research-text: var(--phosphor-light);
    --cat-research-mark: var(--phosphor-light);
    --cat-research-wash: var(--ink-2);
    --cat-industry-text: var(--bronze-light);
    --cat-industry-mark: var(--bronze-light);
    --cat-industry-wash: var(--ink-2);
  }
}

/* ── base ─────────────────────────────────────────────────────────────────── */
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-serif);
  font-size: 1.125rem;
  line-height: 1.65;
}
[hidden] { display: none !important; }
img, svg { max-width: 100%; height: auto; }
em { font-style: normal; font-weight: 500; } /* no italic cuts shipped, deliberately */
a { color: var(--link); text-decoration-thickness: 1px; text-underline-offset: 0.15em; }
a:hover { color: var(--link-hover); }
table, .data, .figures, .chip, time, .fig { font-variant-numeric: tabular-nums lining-nums; }
.wrap { max-width: 76rem; margin: 0 auto; padding: 0 1.25rem; }
.skip { position: absolute; left: -999px; top: 0; background: var(--surface); color: var(--text); padding: .5rem 1rem; z-index: 10; }
.skip:focus { left: 0; }
:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }

h1, h2, h3, h4 { font-family: var(--font-sans); line-height: 1.2; margin: 0 0 .5em; }
h1 { font-weight: 700; font-size: clamp(1.7rem, 4.2vw, 2.6rem); letter-spacing: -0.01em; }
h2 { font-weight: 600; font-size: 1.35rem; }
h3 { font-weight: 600; font-size: 1.1rem; }

.kicker {
  font-family: var(--font-mono); font-weight: 600; font-size: .78rem;
  letter-spacing: .06em; text-transform: uppercase;
  color: var(--muted); margin: 0 0 .4rem;
}
.cat-policy   .kicker, .kicker.cat-policy   { color: var(--cat-policy-text); }
.cat-research .kicker, .kicker.cat-research { color: var(--cat-research-text); }
.cat-industry .kicker, .kicker.cat-industry { color: var(--cat-industry-text); }

/* ── masthead ─────────────────────────────────────────────────────────────── */
.site-head { border-bottom: 1px solid var(--line); }
.mast {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
  padding: 1.1rem 0 .9rem;
  border-bottom: 1px solid var(--line);
}
.nameplate { display: inline-flex; align-items: center; }
.nameplate img { width: min(430px, 74vw); height: auto; }
.nameplate .plate-light { display: block; }
.nameplate .plate-dark { display: none; }
@media (prefers-color-scheme: dark) {
  .nameplate .plate-light { display: none; }
  .nameplate .plate-dark { display: block; }
}
.mast-works {
  font-family: var(--font-mono); font-size: .74rem; letter-spacing: .05em;
  text-transform: uppercase; white-space: nowrap;
  color: var(--muted); text-decoration-color: var(--line);
}
.mast-works:hover { color: var(--link-hover); }
.site-nav { display: flex; flex-wrap: wrap; gap: 1.6rem; padding: .55rem 0; }
.site-nav a {
  font-family: var(--font-sans); font-weight: 600; font-size: .92rem;
  color: var(--text); text-decoration: none; padding: .1rem 0;
  border-bottom: 2px solid transparent;
}
.site-nav a:hover { color: var(--link-hover); }
body[data-page="home"]     .site-nav a[data-nav="home"],
body[data-page="policy"]   .site-nav a[data-nav="policy"],
body[data-page="research"] .site-nav a[data-nav="research"],
body[data-page="industry"] .site-nav a[data-nav="industry"] {
  color: var(--link); border-bottom-color: var(--link);
}

/* ── front page ───────────────────────────────────────────────────────────── */
.front { padding: 1.6rem 0 2.5rem; }
.front-top {
  display: grid; gap: 2rem;
  grid-template-columns: minmax(0, 7fr) minmax(0, 3fr);
  padding-bottom: 1.6rem; border-bottom: 1px solid var(--line);
}
@media (max-width: 56rem) { .front-top { grid-template-columns: 1fr; } }

.lead-story .kicker { font-size: .82rem; }
.lead-story h2 { font-size: clamp(1.55rem, 3.4vw, 2.3rem); font-weight: 700; letter-spacing: -0.01em; margin-bottom: .5rem; }
.lead-story h2 a, .story-card h3 a, .rail-item h3 a { color: var(--text); text-decoration: none; }
.lead-story h2 a:hover, .story-card h3 a:hover, .rail-item h3 a:hover { color: var(--link-hover); text-decoration: underline; text-decoration-thickness: 2px; }
.lead-story .standfirst { font-size: 1.05rem; color: var(--text); margin: 0 0 .6rem; }
.lead-art { margin: 0 0 1rem; border: 1px solid var(--line); }
.lead-art img { display: block; width: 100%; height: auto; }

.front-rail { border-left: 1px solid var(--line); padding-left: 1.6rem; }
@media (max-width: 56rem) { .front-rail { border-left: 0; padding-left: 0; } }
.rail-title {
  font-family: var(--font-mono); font-weight: 600; font-size: .78rem;
  letter-spacing: .06em; text-transform: uppercase; color: var(--muted);
  border-bottom: 2px solid var(--text); padding-bottom: .4rem; margin: 0 0 1rem;
}
.rail-item { padding: 0 0 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--line); }
.rail-item:last-child { border-bottom: 0; }
.rail-item h3 { font-size: 1.02rem; margin-bottom: .3rem; }

.front-band { padding-top: 1.6rem; }
.band-head {
  display: flex; align-items: baseline; justify-content: space-between;
  margin-bottom: 1.1rem;
}
.band-head h2 {
  font-size: 1rem; font-weight: 700; letter-spacing: .01em; margin: 0;
}
.band-head h2 a { color: var(--text); text-decoration: none; }
.band-head h2 a:hover { color: var(--link-hover); }
.band-head .more { font-family: var(--font-mono); font-size: .74rem; letter-spacing: .04em; text-transform: uppercase; }
.front-cols { display: grid; gap: 2rem; grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 56rem) { .front-cols { grid-template-columns: 1fr; } }

.story-card { border-top: 3px solid var(--muted); padding-top: .7rem; margin-bottom: 1.5rem; }
.story-card.cat-policy   { border-top-color: var(--cat-policy-mark); }
.story-card.cat-research { border-top-color: var(--cat-research-mark); }
.story-card.cat-industry { border-top-color: var(--cat-industry-mark); }
.story-card h3 { font-size: 1.12rem; margin-bottom: .35rem; }
.story-card p { margin: 0 0 .4rem; font-size: .95rem; color: var(--text); }
.meta { font-family: var(--font-mono); font-size: .74rem; color: var(--muted); margin: 0; }

/* ── section fronts ───────────────────────────────────────────────────────── */
.crumbs {
  font-family: var(--font-mono); font-size: .74rem; letter-spacing: .03em;
  text-transform: uppercase; color: var(--muted); margin: 1.4rem 0 1rem;
}
.crumbs .sep { margin: 0 .5rem; color: var(--line); }
.section-art { margin: 0 0 1.2rem; border: 1px solid var(--line); }
.section-art img { display: block; width: 100%; height: auto; }
.page-head { padding-bottom: 1.2rem; border-bottom: 1px solid var(--line); margin-bottom: 1.6rem; }
.page-head .standfirst { font-size: 1.05rem; color: var(--muted); margin: 0; max-width: 46rem; }
.section-list { max-width: 46rem; padding-bottom: 2.5rem; }
.section-list .story-card { margin-bottom: 1.8rem; }
.section-list .story-card h2 { font-size: 1.3rem; margin-bottom: .35rem; }
.section-list .story-card h2 a { color: var(--text); text-decoration: none; }
.section-list .story-card h2 a:hover { color: var(--link-hover); text-decoration: underline; }

/* ── article ──────────────────────────────────────────────────────────────── */
.article { max-width: 46rem; margin: 0 auto; padding: 0 0 2.5rem; }
.article-head { padding: 1.4rem 0 0; }
.article-head h1 { margin-bottom: .6rem; }
.standfirst { font-family: var(--font-serif); font-weight: 500; font-size: 1.16rem; line-height: 1.5; margin: 0 0 .9rem; }
.dateline {
  display: flex; flex-wrap: wrap; align-items: center; gap: .7rem;
  font-family: var(--font-mono); font-size: .78rem; color: var(--muted);
  margin-bottom: 1.1rem;
}
.dateline .byline { letter-spacing: .03em; text-transform: uppercase; }
.chip {
  font-family: var(--font-mono); font-size: .72rem;
  background: var(--surface); border: 1px solid var(--line);
  padding: .1rem .55rem; border-radius: 2px; color: var(--muted);
  text-decoration: none;
}
a.chip:hover { color: var(--link-hover); border-color: var(--muted); }
.lead-graphic { margin: 0 0 1.4rem; border: 1px solid var(--line); }
.lead-graphic img { display: block; width: 100%; height: auto; }

.article-body p { margin: 0 0 1.1rem; }
.article-body h2 { margin: 1.9rem 0 .7rem; }
.article-body ul, .article-body ol { margin: 0 0 1.1rem; padding-left: 1.4rem; }
.article-body li { margin-bottom: .35rem; }
blockquote {
  margin: 1.4rem 0; padding: .2rem 0 .2rem 1.1rem;
  border-left: 3px solid var(--cat-policy-mark);
  font-weight: 500;
}
blockquote p { margin-bottom: .5rem; }
blockquote .attr { font-family: var(--font-mono); font-size: .78rem; color: var(--muted); font-weight: 400; }
.cat-research blockquote { border-left-color: var(--cat-research-mark); }
.cat-industry blockquote { border-left-color: var(--cat-industry-mark); }

/* tables */
.article-body table, .worked table {
  width: 100%; border-collapse: collapse; font-family: var(--font-sans);
  font-size: .9rem; margin: 0 0 .6rem;
}
th, td { text-align: left; padding: .45rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; }
th { font-family: var(--font-mono); font-size: .72rem; letter-spacing: .05em; text-transform: uppercase; color: var(--muted); border-bottom: 2px solid var(--text); }
td.fig, th.fig { text-align: right; }
.table-scroll { overflow-x: auto; margin: 0 0 1.1rem; }
/* Base/methodology note under a data table. Sits tight to the table it belongs to and
   reads as apparatus, not argument - without a rule it inherits body paragraph size and
   competes with the prose it is qualifying. Same tokens as .note. */
.article-body p.table-note {
  font-family: var(--font-mono); font-size: .74rem; line-height: 1.55;
  color: var(--muted); margin: 0 0 1.4rem;
}

/* boxes */
.worked, .chart {
  background: var(--surface); border: 1px solid var(--line);
  padding: 1.1rem 1.2rem 1rem; margin: 1.4rem 0;
}
.worked-title, .chart figcaption {
  font-family: var(--font-mono); font-weight: 600; font-size: .8rem;
  letter-spacing: .04em; text-transform: uppercase; margin: 0 0 .8rem; color: var(--text);
}
.chart { display: block; }
.note, .assumptions {
  font-family: var(--font-mono); font-size: .74rem; line-height: 1.55;
  color: var(--muted); margin: .7rem 0 0;
}

/* html bar chart: label / track / value rows */
.sbars {
  display: grid; grid-template-columns: max-content 1fr max-content;
  gap: .45rem .8rem; align-items: center;
  font-family: var(--font-sans); font-size: .85rem;
}
.sbars .lbl { white-space: nowrap; }
.sbars .track { background: none; height: 1rem; position: relative; }
.sbars .bar { display: block; height: 100%; background: var(--cat-policy-mark); min-width: 2px; }
.sbars .bar.alt { background: var(--muted); }
.cat-research .sbars .bar { background: var(--phosphor); }
.cat-industry .sbars .bar { background: var(--bronze); }
@media (prefers-color-scheme: dark) {
  .cat-research .sbars .bar { background: var(--phosphor-light); }
  .cat-industry .sbars .bar { background: var(--bronze-light); }
}
.sbars .val { font-family: var(--font-mono); font-size: .78rem; color: var(--text); }

/* timeline (the record strip) */
.timeline { list-style: none; margin: 0; padding: 0; }
.timeline li { display: grid; grid-template-columns: 7.2rem 1fr; gap: .9rem; padding: .55rem 0; border-bottom: 1px solid var(--line); font-size: .95rem; font-family: var(--font-sans); }
.timeline li:last-child { border-bottom: 0; }
.timeline .t { font-family: var(--font-mono); font-size: .76rem; color: var(--muted); padding-top: .15rem; white-space: nowrap; }
.timeline .hot { color: var(--cat-policy-text); font-weight: 600; }

/* sources */
.sources {
  margin: 2.2rem 0 0; padding-top: 1.1rem;
  border-top: 2px solid var(--text);
}
.sources h2 {
  font-family: var(--font-mono); font-size: .8rem; font-weight: 600;
  letter-spacing: .06em; text-transform: uppercase; margin-bottom: .8rem;
}
.sources ul { list-style: none; margin: 0; padding: 0; font-family: var(--font-mono); font-size: .8rem; line-height: 1.6; }
.sources li { margin-bottom: .55rem; padding-left: 1.1rem; text-indent: -1.1rem; }
.sources li::before { content: "*"; color: var(--violet); margin-right: .55rem; font-weight: 600; }
@media (prefers-color-scheme: dark) { .sources li::before { color: var(--violet-light); } }
.sources .ad { color: var(--muted); }
.corrections-note { font-family: var(--font-mono); font-size: .76rem; color: var(--muted); margin-top: 1.2rem; }

/* ── forms ────────────────────────────────────────────────────────────────── */
.form-block { margin: 0 0 2.6rem; max-width: 40rem; }
.form-block form { display: grid; gap: .9rem; margin-top: 1rem; }
label { font-family: var(--font-sans); font-weight: 600; font-size: .9rem; display: block; margin-bottom: .3rem; }
input[type="text"], input[type="email"], input[type="tel"], textarea {
  width: 100%; font-family: var(--font-sans); font-size: 1rem;
  color: var(--text); background: var(--bg);
  border: 1px solid var(--muted); border-radius: 2px; padding: .55rem .65rem;
}
input:focus, textarea:focus { outline: 2px solid var(--link); outline-offset: 1px; }
textarea { min-height: 8.5rem; resize: vertical; }
input[type="file"] { font-family: var(--font-sans); font-size: .9rem; }
.btn {
  font-family: var(--font-sans); font-weight: 600; font-size: 1rem;
  background: var(--violet); color: oklch(97.5% 0.002 250);
  border: 0; border-radius: 2px; padding: .65rem 1.4rem; cursor: pointer;
  justify-self: start;
}
.btn:hover { background: var(--violet-deep); }
@media (prefers-color-scheme: dark) {
  .btn { background: var(--violet-light); color: var(--ink); }
  .btn:hover { background: oklch(85% 0.06 295); }
}
.hp { position: absolute; left: -9999px; }
.form-msg { font-family: var(--font-sans); font-weight: 600; }
.form-msg.ok { color: var(--cat-research-text); }
.form-msg.err { color: oklch(45% 0.15 25); }
@media (prefers-color-scheme: dark) { .form-msg.err { color: oklch(75% 0.12 25); } }

/* ── prose pages ──────────────────────────────────────────────────────────── */
.prose { max-width: 46rem; padding-bottom: 2.5rem; }
.prose h2 { margin: 1.9rem 0 .7rem; }

/* ── ad slot ──────────────────────────────────────────────────────────────── */
.ad-slot:not([hidden]) {
  border: 1px dashed var(--line); padding: 1rem; margin: 1.6rem 0;
  font-family: var(--font-mono); font-size: .74rem; color: var(--muted);
}

/* ── footer ───────────────────────────────────────────────────────────────── */
.site-foot { background: var(--ink); color: var(--graphite-light); border-top: 1px solid var(--line); margin-top: 2.5rem; padding: 2.2rem 0 2.6rem; }
.site-foot .foot-plate img { display: block; width: min(340px, 70vw); height: auto; }
.foot-nav { display: flex; flex-wrap: wrap; gap: 1.4rem; margin: 1.4rem 0 1.1rem; }
.foot-nav a { font-family: var(--font-mono); font-size: .78rem; letter-spacing: .04em; text-transform: uppercase; color: var(--paper); text-decoration: none; }
.foot-nav a:hover { color: var(--violet-light); text-decoration: underline; }
.site-foot p { font-family: var(--font-sans); font-size: .86rem; line-height: 1.6; max-width: 46rem; margin: 0 0 .8rem; }
.site-foot a { color: var(--violet-light); }

/* ── ad slot disclosure (fleet convention, added 2026-07-30) ────────────────────
   A visible ad slot MUST carry its label. Tied to :not([hidden]) rather than to a
   [data-filled] attribute on purpose: removing `hidden` is what makes the slot
   visible, so the label cannot be separated from the thing it discloses. The
   earlier [data-filled] pattern needed someone to remember a second attribute,
   and on 2026-07-30 a render test found 12 of 14 mastheads had no label rule at
   all - an advertiser would have rendered as an unlabelled box, which breaches
   both the disclosure rail and Australian Consumer Law.

   Colour is currentColor at reduced opacity, NOT a palette variable: --muted is
   undeclared on 5 mastheads and --hairline on 5, and a hardcoded grey cannot stay
   legible against both the light and dark themes. currentColor tracks whatever the
   theme sets, so the label is guaranteed readable in both without knowing the
   palette. Do not "improve" this into var(--muted) without checking all 14. */
.ad-slot:not([hidden]) {
  border: 1px solid var(--hairline, rgba(128, 128, 128, 0.32));
  padding: 16px;
}
.ad-slot:not([hidden])::before {
  content: "Advertisement";
  display: block;
  font-family: var(--font-sans, var(--font-body, system-ui, sans-serif));
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: currentColor;
  opacity: 0.72;
  margin-bottom: 0.5rem;
}

/* ── sponsored / partner content disclosure (added 2026-07-30) ──────────────────
   Contract: kernel/sponsored-content-convention.md. Empty by default - only a story
   with a real, disclosed commercial arrangement carries this, at the top of the body.

   These 6 staged mastheads had NO disclosure-banner CSS until 2026-07-30, found by
   auditing after the ad-slot label defect. The label text is HTML, not CSS content,
   so a sponsored piece here would still have been textually disclosed - but unstyled
   and visually indistinguishable from editorial, which is not the "clear and
   prominent" the convention and the ACL expect.

   Palette-independent on purpose: token naming across the fleet is genuinely
   inconsistent (3 of these 6 declare none of --accent/--spot/--ink/--paper), and a
   hardcoded colour cannot stay legible against both the light and dark themes.
   currentColor tracks whatever the theme sets, and color-mix against it gives a tint
   that works in both directions. Restyle with this masthead's OWN tokens at launch
   if wanted - the mechanism must not wait on that. */
/* Upgraded 2026-07-31 from the palette-independent currentColor version, after rendering
   the banner on all 14 mastheads side by side. The generic version produced a faint grey
   box whose text inherited the body SERIF at nearly body size, so it read as a pull-quote
   rather than a disclosure - while the 8 token-styled mastheads produced an unmistakable
   coloured block. aigeek went live on 2026-07-31 and can now sell a sponsored piece, so it
   needs the prominent version; the generic one stays correct for the 5 still-staged
   mastheads that have no reliable accent token.

   Two things do the work, and neither is decoration: the violet ground separates the block
   from the page, and --font-sans separates it from the body serif. A disclosure that looks
   like the article is not "clear and prominent" under the ACL, whatever the words say. */
.disclosure-banner {
  border: 1px solid var(--violet);
  border-left: 4px solid var(--violet);
  background: var(--violet-wash);
  color: var(--ink);
  padding: 0.9rem 1.1rem;
  margin: 0 0 1.6rem;
  font-family: var(--font-sans);
  font-size: 0.85rem;
  line-height: 1.55;
}
.disclosure-label {
  display: block;
  font-family: var(--font-sans);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--violet-deep);
  margin-bottom: 0.4rem;
}
.disclosure-banner a { color: var(--violet-deep); font-weight: 600; }
/* Dark theme: --violet-wash is a light tint and would blow out against the dark ground,
   so the block is rebuilt from the dark palette rather than inheriting the light one. */
@media (prefers-color-scheme: dark) {
  .disclosure-banner {
    background: color-mix(in oklab, var(--violet-light) 12%, var(--ink-2));
    border-color: var(--violet-light);
    color: var(--paper);
  }
  .disclosure-label, .disclosure-banner a { color: var(--violet-light); }
}
.disclosure-banner p { margin: 0.3rem 0; }

/* Methodology / sourcing aside. Added 2026-07-31: two stories used .methodology and this
   stylesheet had no method rule of any kind, so the sourcing note rendered as body text.
   Found by scripts/preflight.py. Quiet apparatus - rules above and below, not a box. */
.methodology {
  margin: 1.9rem 0; padding: 1rem 0 1.1rem;
  border-top: 3px solid var(--ink); border-bottom: 1px solid var(--hairline);
  font-family: var(--font-sans); font-size: .86rem; line-height: 1.6;
}
.methodology h2 {
  font-family: var(--font-sans); font-size: .72rem; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase; margin: 0 0 .5rem;
}
.methodology p { margin: .4rem 0; }
