/* One stylesheet, no framework, no build step. The page is a static file a stranger can read,
   and its stylesheet should be too.

   The palette, the type and the 3px rule over the page are peterparker.ca's, shared with the
   other project pages (privacy, forms, fraud, gate and the rest), because this page is part of
   that site even though a separate host serves it. The two fonts are copied into this folder
   rather than linked: the page makes no off-origin request, and a font is a request. Both are
   SIL Open Font License; fonts/LICENSE.txt says where they came from. */

@font-face {
  font-family: "Newsreader";
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url(fonts/newsreader-latin.woff2) format("woff2");
}

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 400 600;
  font-display: swap;
  src: url(fonts/inter-latin.woff2) format("woff2");
}

:root {
  color-scheme: light dark;
  --paper: #f5f3ee;
  --paper-soft: #fdfcf9;
  --ink: #16181d;
  --ink-soft: #3c4048;
  --ink-faint: #6b7079;
  --line: #e3dfd6;
  --line-2: #cfc9bd;
  --line-soft: #eeebe4;
  --accent: #0f5c6e;
  --accent-ink: #0b4653;
  --accent-soft: #e4eff1;
  --warn: #c0392b;
  --good: #1e7a4c;
  --alt: #6d3f9e;
  --shift: rgba(192, 57, 43, 0.09);
  /* An ordered set in one hue, darkest first: the three percentiles. */
  --lv0: #0b4653;
  --lv1: #2f8294;
  --lv2: #7bb3c0;
  --serif: "Newsreader", Georgia, "Times New Roman", serif;
  --sans: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --mono: ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace;
  --radius: 10px;
  --shadow: 0 6px 24px -18px rgba(0, 0, 0, 0.35);
  --column: 66rem;
}

@media (prefers-color-scheme: dark) {
  :root {
    --paper: #0e1013;
    --paper-soft: #15181d;
    --ink: #ece9e2;
    --ink-soft: #c9c6bf;
    --ink-faint: #969ba5;
    --line: #262a31;
    --line-2: #363b44;
    --line-soft: #1c2026;
    --accent: #7cc7d6;
    --accent-ink: #a9dde7;
    --accent-soft: #14262b;
    --warn: #f0736a;
    --good: #58c286;
    --alt: #b191e0;
    --shift: rgba(240, 115, 106, 0.13);
    --lv0: #cbeaf2;
    --lv1: #7cc7d6;
    --lv2: #3d8ea1;
    --shadow: 0 6px 24px -14px rgba(0, 0, 0, 0.6);
  }
}

* { box-sizing: border-box; }

html { font-size: 18px; -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--sans);
  font-size: 1rem;
  line-height: 1.72;
  overflow-x: clip;
  border-top: 3px solid var(--accent);
  font-feature-settings: "cv11", "ss01";
}

main {
  max-width: var(--column);
  margin: 0 auto;
  padding: 0 1.5rem 5rem;
}

h1, h2, h3 {
  font-family: var(--serif);
  font-weight: 500;
  letter-spacing: -0.012em;
}

h1 { font-size: clamp(2.1rem, 4.6vw, 3rem); line-height: 1.1; margin: 0 0 1rem; }
h2 { font-size: clamp(1.55rem, 2.6vw, 2rem); line-height: 1.2; margin: 0 0 0.7rem; }
h3 { font-size: 1.2rem; line-height: 1.25; margin: 0 0 0.45rem; }
p { margin: 0 0 0.85rem; }

a { color: var(--accent); text-decoration: none; text-underline-offset: 0.15em; }
a:hover, a:focus-visible { text-decoration: underline; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

code { font-family: var(--mono); font-size: 0.9em; }

strong { font-weight: 600; }

/* ---------------------------------------------------------------- the way back */

.top { border-bottom: 1px solid var(--line); background: var(--paper); }

.top-inner {
  max-width: var(--column);
  margin: 0 auto;
  padding: 0 1.5rem;
  height: 4rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
}

.brand {
  display: inline-flex;
  align-items: center;
  gap: 0.7rem;
  color: var(--ink);
  font-weight: 600;
  letter-spacing: -0.01em;
}

.brand:hover { text-decoration: none; color: var(--accent-ink); }

.mono-mark {
  width: 1.9rem;
  height: 1.9rem;
  border-radius: 6px;
  background: var(--accent);
  color: #fdfcf9;
  font-family: var(--serif);
  font-weight: 500;
  font-size: 1.15rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

@media (prefers-color-scheme: dark) { .mono-mark { color: #0e1013; } }

.top-nav { font-size: 0.92rem; color: var(--ink-soft); text-align: right; margin: 0; }
.top-nav a { color: var(--ink-soft); }
.top-nav a:hover { color: var(--accent-ink); }

/* ---------------------------------------------------------------- hero */

.hero { position: relative; padding: 2rem 0 2.25rem; border-bottom: 1px solid var(--line); }


/* The first screen as on gate.peterparker.ca: a wash of the accent behind it, full width,
   fading into the page, and figure cards with a coloured rule across the top. */
.hero::before {
  content: "";
  position: absolute;
  z-index: -1;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 100vw;
  margin-left: -50vw;
  background:
    radial-gradient(60rem 22rem at 85% 0%, color-mix(in srgb, var(--alt) 14%, transparent), transparent 70%),
    linear-gradient(180deg, var(--accent-soft), var(--paper) 85%);
}

.hero h1 .hl { color: var(--accent); }
.hero .eyebrow { color: var(--accent-ink); }
.hero .point { border-top: 3px solid var(--accent); box-shadow: var(--shadow); }
.hero .point.good { border-top-color: var(--good); }
.hero .point.violet { border-top-color: var(--alt); }
.hero .point .point-figure { color: var(--accent-ink); }
.hero .point.good .point-figure { color: var(--good); }
.hero .point.violet .point-figure { color: var(--alt); }
.hero .point .point-figure.down { color: var(--warn); }

.eyebrow {
  text-transform: uppercase;
  letter-spacing: 0.12em;
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--ink-faint);
  margin: 0 0 0.6rem;
}

.lead { font-size: 1.05rem; color: var(--ink-soft); }

.hero-points {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 0.9rem;
  margin: 1.75rem 0 1.1rem;
}

/* Five across, or the count of tables on its own row above two pairs: never four and one. */
@media (max-width: 60rem) {
  .hero-points { grid-template-columns: repeat(2, 1fr); }
  .hero-points > :first-child { grid-column: 1 / -1; }
}

@media (max-width: 34rem) {
  .hero-points { grid-template-columns: 1fr; }
}

.point {
  background: var(--paper-soft);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1rem 1.1rem;
}

.point-figure {
  display: block;
  font-family: var(--serif);
  font-size: 1.9rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--ink);
}

.point-figure.up { color: var(--good); }
.point-figure.down { color: var(--warn); }

.point-unit {
  display: block;
  margin-top: 0.2rem;
  font-size: 0.84rem;
  font-weight: 600;
  color: var(--ink-soft);
  line-height: 1.35;
}

.point-label {
  display: block;
  margin-top: 0.4rem;
  padding-top: 0.4rem;
  border-top: 1px solid var(--line);
  font-size: 0.82rem;
  color: var(--ink-faint);
  line-height: 1.4;
}

.point-extra {
  display: block;
  margin-top: 0.25rem;
  font-size: 0.8rem;
  color: var(--ink-faint);
  line-height: 1.35;
  font-variant-numeric: tabular-nums;
}

.hero-models {
  position: relative;
  font-size: 0.86rem;
  color: var(--ink-soft);
  margin: 0 0 0.6rem;
}

/* A term that explains itself. The bubble hangs from the paragraph rather than
   from the word, because the paragraph is the one box that is always inside the page: a
   bubble anchored to a name at the end of a line would run off the right edge. It opens on
   focus as well as hover, so a keyboard reaches it and a tap on a phone opens it. */
.term {
  border-bottom: 1px dotted var(--ink-faint);
  cursor: help;
}

.term:hover, .term:focus { color: var(--accent-ink); border-bottom-color: var(--accent); }

.term::after {
  content: attr(data-note);
  position: absolute;
  left: 0;
  top: calc(100% + 0.4rem);
  width: min(32rem, 100%);
  padding: 0.7rem 0.85rem;
  background: var(--paper-soft);
  color: var(--ink-soft);
  border: 1px solid var(--line-2);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  font-size: 0.84rem;
  font-weight: 400;
  line-height: 1.5;
  z-index: 10;
  pointer-events: none;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.12s ease;
}

.term:hover::after, .term:focus::after { opacity: 1; visibility: visible; }

/* Read by a screen reader, drawn for nobody: the notes the bubbles show, as descriptions. */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.hero-note { font-size: 0.88rem; color: var(--ink-faint); margin: 0; }

/* ---------------------------------------------------------------- sections */

.section { padding: 2.75rem 0; border-bottom: 1px solid var(--line); }
.section:last-of-type { border-bottom: 0; }
.section-lead { color: var(--ink-soft); }
.note { font-size: 0.86rem; color: var(--ink-faint); }

.warning {
  max-width: var(--column);
  margin: 1.25rem auto;
  padding: 0.9rem 1.1rem;
  border-left: 3px solid var(--warn);
  border-radius: 0 var(--radius) var(--radius) 0;
  background: color-mix(in srgb, var(--warn) 9%, transparent);
}

/* The callout a section's finding goes in, and the one an assumption goes in. Same shape,
   different weight: a finding is the point of the section, an assumption is the fine print
   that stops the finding being overread. */
.verdict {
  margin: 1.1rem 0 0;
  padding: 1rem 1.1rem;
  border-radius: 0 var(--radius) var(--radius) 0;
  background: var(--accent-soft);
  border-left: 3px solid var(--accent);
  font-size: 0.98rem;
}

.verdict p:last-child { margin-bottom: 0; }

.assumption {
  margin: 1.1rem 0 0;
  padding: 0.9rem 1.1rem;
  border: 1px solid var(--line);
  border-left: 3px solid var(--line-2);
  border-radius: 0 var(--radius) var(--radius) 0;
  background: var(--paper-soft);
  font-size: 0.88rem;
  color: var(--ink-soft);
}

.assumption p:last-child { margin-bottom: 0; }

/* ---------------------------------------------------------------- controls */

.controls {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: 1rem;
  margin: 1.25rem 0;
  padding: 1rem;
  background: var(--paper-soft);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}

.control { display: flex; flex-direction: column; gap: 0.4rem; min-width: 0; }
.control.wide { grid-column: 1 / -1; }

/* Labels on one line, the inputs level with each other, the hints underneath. */
.controls.inline { align-items: start; }
@media (min-width: 46rem) {
  .controls.inline label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
}
.controls.inline .hint { margin-top: 0; }
.range-wrap { display: flex; align-items: center; height: 2.45rem; }
.controls.single { max-width: 30rem; }

/* The plain-words glossaries in the basics section. */
.glossary { display: grid; grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr)); gap: 0.75rem; margin: 0.4rem 0 0.75rem; }
.tag {
  display: inline-block;
  margin-left: 0.35rem;
  padding: 0.05rem 0.45rem;
  border-radius: 999px;
  font-size: 0.7rem;
  font-weight: 600;
  vertical-align: 0.1em;
}
.tag.open { background: color-mix(in srgb, var(--ink-faint) 16%, transparent); color: var(--ink-soft); }
.tag.dp { background: color-mix(in srgb, var(--good) 16%, transparent); color: var(--good); }

label { font-size: 0.85rem; font-weight: 600; color: var(--ink-soft); }

.hint {
  display: block;
  font-weight: 400;
  font-size: 0.78rem;
  color: var(--ink-faint);
  margin-top: 0.1rem;
}

select, input[type="range"] { width: 100%; font: inherit; accent-color: var(--accent); }

select {
  padding: 0.5rem 0.6rem;
  border: 1px solid var(--line-2);
  border-radius: 8px;
  background: var(--paper-soft);
  color: var(--ink);
  font-size: 0.9rem;
}

input[type="range"] { height: 1.6rem; }

output { font-variant-numeric: tabular-nums; color: var(--accent-ink); font-weight: 600; }

/* ---------------------------------------------------------------- charts */

.chart-figure { margin: 1.1rem 0; }
.chart { width: 100%; }
.chart svg { width: 100%; height: auto; display: block; touch-action: pan-y; }

/* A chart whose labels are words rather than ticks cannot be shrunk to a phone's width and
   still be read, so it keeps its size and scrolls sideways instead. */
.wide-chart { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.wide-chart svg { min-width: 40rem; }

figcaption { font-size: 0.83rem; color: var(--ink-faint); margin-top: 0.5rem; }

.gridline { stroke: var(--line); stroke-width: 1; }
.axis-line { stroke: var(--line-2); stroke-width: 1; }
.tick { fill: var(--ink-faint); font-size: 11px; }
.axis-title { fill: var(--ink-faint); font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; }
.series { fill: none; stroke-linejoin: round; stroke-linecap: round; stroke-width: 1.5; }
.band { fill: var(--accent); stroke: none; }

/* Series colours and their swatches, set here rather than on the element so that both
   follow the palette into dark mode. */
.m0 { stroke: var(--accent); }
.m1 { stroke: var(--warn); }
.m2 { stroke: var(--alt); }
.sw0 { background: var(--accent); }
.sw1 { background: var(--warn); }
.sw2 { background: var(--alt); }
.sw-ink { background: var(--ink); }
.sw-accent { background: var(--accent); }
.sw-band { background: var(--accent); }
.sw-warn { background: var(--warn); color: var(--warn); }
.sw-faint { background: var(--ink-faint); color: var(--ink-faint); }
.nominal { stroke: var(--ink-faint); stroke-width: 1; stroke-dasharray: 5 4; fill: none; }
.actual-line { fill: none; stroke: var(--ink); stroke-width: 1.5; stroke-linejoin: round; }
.median { fill: none; stroke: var(--accent); stroke-width: 1.75; stroke-linejoin: round; }
/* Thinner lines, for a view with many points in the same width. */
.actual-line.thin, .median.thin { stroke-width: 0.8; }

.service { fill: none; stroke: var(--warn); stroke-width: 1.5; stroke-dasharray: 6 4; }
.shift-span { fill: var(--shift); }
.shift-label { fill: var(--ink-faint); font-size: 10.5px; letter-spacing: 0.06em; text-transform: uppercase; }
.cursor { stroke: var(--ink-faint); stroke-width: 1; stroke-dasharray: 3 3; }
.dot { stroke: var(--paper-soft); stroke-width: 1.5; fill: var(--ink); }
.dot.median { fill: var(--accent); }
.dot.m0 { fill: var(--accent); }
.dot.m1 { fill: var(--warn); }
.dot.m2 { fill: var(--alt); }
.catcher { cursor: crosshair; }

/* A bar is a length, so it gets a fill and no outline; its interval is a hairline in ink,
   because it is not another series. */
.bar { stroke: none; }
.bar.lv0 { fill: var(--lv0); }
.bar.lv1 { fill: var(--lv1); }
.bar.lv2 { fill: var(--lv2); }
.bar.own { fill-opacity: 0.7; stroke: var(--ink-faint); stroke-width: 1; stroke-dasharray: 3 2; }
.sw-lv0 { background: var(--lv0); }
.sw-lv1 { background: var(--lv1); }
.sw-lv2 { background: var(--lv2); }
.whisker { stroke: var(--ink-soft); stroke-width: 1; }
.zero { stroke: var(--ink-faint); stroke-width: 1.25; }
.zero-label { fill: var(--ink-faint); font-size: 10.5px; }
.bar-value { fill: var(--ink-soft); font-size: 11px; font-variant-numeric: tabular-nums; }
.row-label { fill: var(--ink); font-size: 12px; font-weight: 600; }
.row-note { fill: var(--ink-faint); font-size: 10.5px; }
.divider { stroke: var(--line-2); stroke-width: 1; stroke-dasharray: 4 3; }
.divider-label { fill: var(--ink-faint); font-size: 10.5px; letter-spacing: 0.04em; text-transform: uppercase; }

.legend { display: flex; flex-wrap: wrap; gap: 0.45rem; margin: 0.25rem 0 0.5rem; }

.legend-item {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.82rem;
  padding: 0.3rem 0.7rem;
  border: 1px solid var(--line-2);
  border-radius: 999px;
  background: var(--paper-soft);
  color: var(--ink-soft);
}

.swatch { width: 14px; height: 3px; border-radius: 2px; display: inline-block; flex: none; }
.swatch.dashed { background: repeating-linear-gradient(90deg, currentColor 0 4px, transparent 4px 7px); }
.swatch.block { height: 11px; border-radius: 3px; opacity: 0.3; }
/* A bar's swatch is the bar's colour at full strength: it names a series, not a band. */
.swatch.solid { height: 11px; border-radius: 3px; }

/* The hover readout. One row per series, values right-aligned so they line up as a column. */
.readout {
  min-height: 1.6rem;
  margin: 0.3rem 0 0;
  font-size: 0.84rem;
  color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
}

.readout .when { font-weight: 600; color: var(--ink); margin-right: 0.6rem; }
.readout .pair { margin-right: 0.9rem; white-space: nowrap; }
.readout .key { color: var(--ink-faint); }

/* ---------------------------------------------------------------- tables */

.table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }

table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }

th, td {
  text-align: left;
  padding: 0.5rem 0.75rem;
  border-bottom: 1px solid var(--line);
  white-space: nowrap;
}

th {
  font-weight: 600;
  color: var(--ink);
  font-size: 0.82rem;
  background: var(--line-soft);
  border-bottom-color: var(--line-2);
  vertical-align: bottom;
}

tbody th { background: transparent; font-size: 0.9rem; }
/* A long row label is the one cell allowed to wrap, so that it does not push the whole
   table out of its column. */
tbody th.wrap { white-space: normal; max-width: 14rem; }

td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }

/* Narrower gutters for a table that only just fits the column. */
.tight th, .tight td { padding-left: 0.55rem; padding-right: 0.55rem; }

caption { caption-side: bottom; text-align: left; color: var(--ink-faint); font-size: 0.83rem; padding-top: 0.6rem; }

tbody tr.reference { background: var(--accent-soft); }

.interval { color: var(--ink-faint); font-size: 0.82em; }

.better { color: var(--good); font-weight: 600; }
.worse { color: var(--warn); font-weight: 600; }

/* ---------------------------------------------------------------- headline stats */

.headline {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
  gap: 0.9rem;
  margin: 1.25rem 0;
}

.stat {
  background: var(--paper-soft);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1rem 1.1rem;
}

.figure {
  display: block;
  font-family: var(--serif);
  font-size: 1.75rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
  line-height: 1.15;
}

.stat.up .figure { color: var(--good); }
.stat.down .figure { color: var(--warn); }

.caption { display: block; margin-top: 0.3rem; font-size: 0.82rem; color: var(--ink-faint); line-height: 1.4; }

.range { display: block; font-size: 0.78rem; color: var(--ink-faint); font-variant-numeric: tabular-nums; }

/* ---------------------------------------------------------------- disclosure */

.disclose {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 0 1.1rem;
  margin: 1.1rem 0;
  background: var(--paper-soft);
}

.disclose summary {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  cursor: pointer;
  padding: 0.8rem 0 0.8rem 0.25rem;
  font-weight: 600;
  font-size: 0.94rem;
  list-style: none;
}

.disclose summary::-webkit-details-marker { display: none; }

.disclose summary::before {
  content: "\203A";
  flex: none;
  width: 0.6em;
  text-align: center;
  font-size: 1.2em;
  line-height: 1;
  color: var(--ink-faint);
  transform: rotate(90deg);
  transition: transform 0.12s ease;
}

.disclose[open] summary::before { transform: rotate(270deg); }
.disclose summary:hover { color: var(--accent-ink); }
.disclose[open] summary { border-bottom: 1px solid var(--line); margin-bottom: 0.75rem; }
.disclose > *:last-child { margin-bottom: 0.85rem; }

@media (prefers-reduced-motion: reduce) {
  .disclose summary::before { transition: none; }
  .term::after { transition: none; }
}

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

.foot {
  border-top: 1px solid var(--line);
  background: var(--paper-soft);
  margin-top: 2rem;
}

.foot-inner {
  max-width: var(--column);
  margin: 0 auto;
  padding: 2rem 1.5rem 2.5rem;
  font-size: 0.88rem;
  color: var(--ink-faint);
}

.foot-inner p { margin: 0 0 0.5rem; }

.foot-inner ul { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 0.5rem 1.5rem; }

@media (max-width: 34rem) {
  html { font-size: 17px; }
  main { padding: 0 1rem 3rem; }
  .top-inner { padding: 0 1rem; height: auto; min-height: 4rem; flex-wrap: wrap; gap: 0.25rem 1rem; padding-top: 0.6rem; padding-bottom: 0.6rem; }
  .top-nav { text-align: left; }
  .controls { padding: 0.85rem; }
  .foot-inner { padding: 1.5rem 1rem 2rem; }
}

.cta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem 0.75rem;
  margin: 0 0 2.25rem;
}

.button {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.62rem 1.1rem;
  border: 1px solid var(--line-2);
  border-radius: 8px;
  background: var(--paper-soft);
  color: var(--ink);
  font-weight: 600;
  font-size: 0.93rem;
  line-height: 1.2;
}

.button:hover, .button:focus-visible { text-decoration: none; border-color: var(--accent); color: var(--accent-ink); }

.button.primary { background: var(--accent); border-color: var(--accent); color: #fdfcf9; }
.button.primary::after { content: "\2197"; font-weight: 400; }
.button.primary:hover, .button.primary:focus-visible { background: var(--accent-ink); border-color: var(--accent-ink); color: #fdfcf9; }

@media (prefers-color-scheme: dark) {
  .button.primary, .button.primary:hover, .button.primary:focus-visible { color: #0e1013; }
}

.cta-note { font-size: 0.84rem; color: var(--ink-faint); }

.subhead { margin-top: 2rem; }
.steps { list-style: none; margin: 0.75rem 0 1rem; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr)); gap: 0.7rem; }

.steps li {
  display: flex;
  gap: 0.75rem;
  align-items: flex-start;
  background: var(--paper-soft);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 0.8rem 0.95rem;
  font-size: 0.88rem;
  line-height: 1.5;
  color: var(--ink-soft);
}

.step-n {
  flex: none;
  width: 1.6rem;
  height: 1.6rem;
  border-radius: 50%;
  background: var(--accent-soft);
  color: var(--accent-ink);
  font-weight: 600;
  font-size: 0.8rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

.steps li:last-child .step-n { background: var(--accent); color: #fdfcf9; }
@media (prefers-color-scheme: dark) { .steps li:last-child .step-n { color: #0e1013; } }

.guide { display: grid; grid-template-columns: repeat(auto-fit, minmax(19rem, 1fr)); gap: 0.9rem; margin-top: 1.1rem; }
.guide-card { background: var(--paper-soft); border: 1px solid var(--line); border-radius: var(--radius); padding: 1rem 1.1rem 0.4rem; }
.guide-card h3 { font-family: var(--sans); font-size: 0.95rem; font-weight: 600; letter-spacing: 0; }
.guide-card p { font-size: 0.88rem; color: var(--ink-soft); line-height: 1.55; }

.hash { font-family: var(--mono); font-size: 0.78rem; white-space: normal; word-break: break-all; }

#honesty ul { padding-left: 1.1rem; }
#honesty li { margin-bottom: 0.7rem; color: var(--ink-soft); }
#honesty li strong { color: var(--ink); }

/* ---------------------------------------------------------------- the menu */

/* The page's sections and the architecture page, as pills, as on the other project pages. */
.tabs { border-bottom: 1px solid var(--line); background: var(--paper-soft); }

.tabs-inner {
  max-width: var(--column);
  margin: 0 auto;
  padding: 0.55rem 1.5rem;
  display: flex;
  flex-wrap: wrap;
  gap: 0.2rem;
}

.tabs a {
  font-size: 0.83rem;
  padding: 0.2rem 0.55rem;
  border-radius: 999px;
  border: 1px solid transparent;
  color: var(--ink-soft);
}

.tabs a:hover { text-decoration: none; border-color: var(--line-2); color: var(--accent-ink); }

.tabs a[aria-current] {
  border-color: var(--accent);
  background: var(--accent-soft);
  color: var(--ink);
  font-weight: 600;
}

@media (max-width: 46rem) {
  /* One row that scrolls sideways, rather than rows of pills above the page. */
  .tabs-inner { padding: 0.5rem 1.1rem; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
  .tabs a { flex: none; }
}

/* ---------------------------------------------------------------- the architecture page */

/* The diagrams are white-ground SVGs generated from a specification, so they sit on their own
   card in both themes, and each opens full size for narrow screens. */
.arch-figure { margin: 1.1rem 0 1.4rem; }
.arch-figure a { display: block; }
.arch-figure img {
  display: block;
  width: 100%;
  height: auto;
  background: #ffffff;
  border: 1px solid var(--line);
  border-radius: 8px;
}
.prose .where { font-size: 0.86rem; color: var(--ink-faint); }
.arch-back { margin: 0; font-size: 0.95rem; }


/* ---------------------------------------------------------------- this page's own */

/* One hue per model, fixed everywhere on the page: the row model is the neutral baseline in
   slate, graph features the accent, the graph neural network violet, the foundation model
   amber on the row and rose on the graph features. */
:root {
  --a-R: #6b7383;
  --a-G: #0f5c6e;
  --a-N: #6d3f9e;
  --a-TR: #b7791f;
  --a-TG: #b03a73;
  --miss: #c9c3b6;
}

@media (prefers-color-scheme: dark) {
  :root {
    --a-R: #a3abb9;
    --a-G: #7cc7d6;
    --a-N: #b191e0;
    --a-TR: #e6b25c;
    --a-TG: #e98bb8;
    --miss: #3a3f48;
  }
}

.a-R { --c: var(--a-R); }
.a-G { --c: var(--a-G); }
.a-N { --c: var(--a-N); }
.a-TabFM-R, .a-R-retrain, .a-TabFM-R-swap { --c: var(--a-TR); }
.a-R-retrain { --c: var(--a-R); }
.a-TabFM-G { --c: var(--a-TG); }

.dot { fill: var(--c, var(--ink)); stroke: var(--paper); stroke-width: 2; }
.whisker { stroke: var(--c, var(--ink-soft)); stroke-width: 2; stroke-linecap: round; stroke-opacity: 0.55; }
.series { stroke: var(--c, var(--ink)); stroke-width: 2.25; }
.series.dashed { stroke-dasharray: 6 5; }
.band { fill: var(--c, var(--accent)); fill-opacity: 0.12; }
.swatch.a-sw, .chip, .a-sw-on { background: var(--c, var(--accent)); }
.sw-miss { background: var(--miss); }
.sw-violet { background: var(--alt); }
.value { fill: var(--ink-soft); font-size: 11.5px; font-variant-numeric: tabular-nums; }
.value.strong { fill: var(--ink); font-weight: 600; }
.ref-tick { stroke: var(--ink-faint); stroke-width: 2.5; stroke-linecap: round; opacity: 0.55; }
.group-label { fill: var(--ink); font-size: 13px; font-weight: 600; }
.group-note { fill: var(--ink-faint); font-size: 10.5px; letter-spacing: 0.04em; text-transform: uppercase; }
.arm-label { fill: var(--ink-soft); font-size: 12px; }
.hit { fill: transparent; cursor: default; }
.hit:hover { fill: color-mix(in srgb, var(--accent) 6%, transparent); }
.gain { stroke: var(--a-G); stroke-width: 7; stroke-linecap: round; stroke-opacity: 0.2; }
.inflate { stroke: var(--warn); stroke-width: 7; stroke-linecap: round; stroke-opacity: 0.15; }
.dot.split-t { fill: var(--accent); }
.dot.split-r { fill: var(--warn); }
.dot.split-w { fill: var(--alt); }
.dot.rand { fill: var(--ink-faint); }
.whisker.rand { stroke: var(--ink-faint); }
.dot.pick { fill: var(--accent); }
.whisker.pick { stroke: var(--accent); }
.bar.cost { fill: var(--a-G); fill-opacity: 0.85; }
.bar.cost.h2 { fill-opacity: 0.42; }
.whisker.cost { stroke: var(--ink-soft); stroke-opacity: 0.8; stroke-width: 1.25; }
.budget { stroke: var(--warn); stroke-width: 1.25; stroke-dasharray: 6 4; }
.budget-label { fill: var(--warn); font-size: 10.5px; font-weight: 600; letter-spacing: 0.04em; }
.bar.gate { fill: var(--c); fill-opacity: 0.85; }
.verdict-label { font-size: 12px; font-weight: 600; }
.verdict-label.pass { fill: var(--good); }
.verdict-label.block { fill: var(--warn); }

/* The chip that names a model in running text: its hue, light letters. */
.chip {
  display: inline-block;
  padding: 0 0.45rem;
  border-radius: 999px;
  color: #fdfcf9;
  font-size: 0.76rem;
  font-weight: 600;
  line-height: 1.45rem;
  vertical-align: 0.05em;
}
@media (prefers-color-scheme: dark) { .chip { color: #0e1013; } }

.tag.real { background: color-mix(in srgb, var(--good) 16%, transparent); color: var(--good); }
.tag.synth { background: color-mix(in srgb, var(--alt) 16%, transparent); color: var(--alt); }

/* The segmented control the charts switch with, in the tabs' pill style. */
.seg { display: flex; flex-wrap: wrap; gap: 0.35rem; margin: 1rem 0 0.6rem; }
.seg button {
  font: inherit;
  font-size: 0.84rem;
  padding: 0.3rem 0.85rem;
  border-radius: 999px;
  border: 1px solid var(--line-2);
  background: var(--paper-soft);
  color: var(--ink-soft);
  cursor: pointer;
}
.seg button:hover { border-color: var(--accent); color: var(--accent-ink); }
.seg button[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: #fdfcf9; font-weight: 600; }
@media (prefers-color-scheme: dark) { .seg button[aria-pressed="true"] { color: #0e1013; } }

/* The hover card: one per page, placed by the script. */
.tip {
  position: fixed;
  z-index: 20;
  display: none;
  max-width: 19rem;
  padding: 0.6rem 0.75rem;
  background: var(--paper-soft);
  border: 1px solid var(--line-2);
  border-radius: var(--radius);
  box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.35);
  font-size: 0.8rem;
  line-height: 1.45;
  color: var(--ink-soft);
  pointer-events: none;
  font-variant-numeric: tabular-nums;
}
.tip b { color: var(--ink); }
.tip.on { display: block; }

/* The ring: the graph on a card, the selected transfer and its case file beside it. */
.ring-layout { display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr); gap: 1rem; margin-top: 1rem; }
@media (max-width: 52rem) { .ring-layout { grid-template-columns: 1fr; } }
.ring-card, .ring-side {
  background: var(--paper-soft);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 0.6rem 1rem 0.8rem;
  box-shadow: var(--shadow);
  min-width: 0;
}
.ring-card .seg { margin-top: 0.4rem; }
.ring-side h3 { margin-top: 0.5rem; }
.ring-side .eyebrow { margin: 0.6rem 0 0.1rem; }
.ring-side p { font-size: 0.9rem; }
.edge { fill: none; stroke: var(--miss); stroke-width: 2; }
.edge.unscored { stroke: var(--line-2); stroke-width: 1.2; stroke-dasharray: 4 4; }
.edge.on { stroke: var(--c); stroke-width: 2.6; }
.edge.sel { stroke-width: 5; }
.edge-hit { fill: none; stroke: transparent; stroke-width: 14; cursor: pointer; }
.edge-hit:focus-visible { outline: none; stroke: color-mix(in srgb, var(--accent) 25%, transparent); }
.node { fill: var(--paper-soft); stroke: var(--ink-soft); stroke-width: 1.5; }
.node.hub { fill: var(--accent-soft); stroke: var(--accent); stroke-width: 2; }
.node-label { fill: var(--ink); font-size: 10px; font-weight: 600; text-anchor: middle; pointer-events: none; }
.arrow-on { fill: var(--c); }
.arrow-off { fill: var(--miss); }
.arrow-un { fill: var(--line-2); }
.score-row { display: grid; grid-template-columns: 7.5rem 1fr 3.4rem; align-items: center; gap: 0.6rem; font-size: 0.84rem; margin: 0.35rem 0; }
.score-bar { height: 0.55rem; border-radius: 999px; background: var(--line-soft); overflow: hidden; }
.score-bar > span { display: block; height: 100%; border-radius: 999px; background: var(--c); }
.score-row .num { text-align: right; font-variant-numeric: tabular-nums; color: var(--ink); font-weight: 600; }
.flag-pill { display: inline-block; font-size: 0.7rem; font-weight: 600; padding: 0 0.45rem; border-radius: 999px; background: color-mix(in srgb, var(--warn) 14%, transparent); color: var(--warn); margin-left: 0.3rem; line-height: 1.3rem; }
.caught { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.5rem; margin: 0.4rem 0 0.4rem; }
.caught .stat { padding: 0.5rem 0.65rem; }
.caught .figure { font-size: 1.4rem; color: var(--c); }
.caught .caption { font-size: 0.74rem; margin-top: 0.1rem; }
.case-row { display: flex; justify-content: space-between; align-items: baseline; gap: 0.6rem; font-size: 0.84rem; padding: 0.35rem 0; border-bottom: 1px solid var(--line); }
.case-row .who { color: var(--ink); font-weight: 600; }
.case-row .why { display: block; color: var(--ink-faint); font-size: 0.76rem; font-weight: 400; }
.case-row .num { font-variant-numeric: tabular-nums; font-weight: 600; white-space: nowrap; color: var(--ink-soft); }

.leak-card {
  margin: 1.4rem 0 0;
  padding: 1.1rem 1.25rem 0.5rem;
  border: 1px solid color-mix(in srgb, var(--warn) 30%, var(--line));
  border-left: 4px solid var(--warn);
  border-radius: 0 var(--radius) var(--radius) 0;
  background: color-mix(in srgb, var(--warn) 5%, var(--paper-soft));
}
.leak-card .eyebrow { color: var(--warn); margin-bottom: 0.2rem; display: block; }
.leak-card h3 { font-size: 1.3rem; }
.leak-card p { color: var(--ink-soft); }

.point.warnline { border-top-color: var(--warn); }
.hero .point.warnline .point-figure { color: var(--warn); }
.guide-card h3 .tag { margin-left: 0.25rem; }
.guide-card.limit { border-left: 3px solid var(--line-2); }
#explorer td.arm { white-space: normal; min-width: 12rem; }
#explorer tr.group-start td, #explorer tr.group-start th { border-top: 2px solid var(--line-2); }
.foot-credit { margin-top: 0.9rem !important; font-size: 0.82rem; max-width: 52rem; }

/* The score bars in the ring's side panel, sized by class: the policy refuses style attributes. */
.score-bar > span.w-0 { width: 0%; }
.score-bar > span.w-5 { width: 5%; }
.score-bar > span.w-10 { width: 10%; }
.score-bar > span.w-15 { width: 15%; }
.score-bar > span.w-20 { width: 20%; }
.score-bar > span.w-25 { width: 25%; }
.score-bar > span.w-30 { width: 30%; }
.score-bar > span.w-35 { width: 35%; }
.score-bar > span.w-40 { width: 40%; }
.score-bar > span.w-45 { width: 45%; }
.score-bar > span.w-50 { width: 50%; }
.score-bar > span.w-55 { width: 55%; }
.score-bar > span.w-60 { width: 60%; }
.score-bar > span.w-65 { width: 65%; }
.score-bar > span.w-70 { width: 70%; }
.score-bar > span.w-75 { width: 75%; }
.score-bar > span.w-80 { width: 80%; }
.score-bar > span.w-85 { width: 85%; }
.score-bar > span.w-90 { width: 90%; }
.score-bar > span.w-95 { width: 95%; }
.score-bar > span.w-100 { width: 100%; }

.guide.two { grid-template-columns: repeat(auto-fit, minmax(min(100%, 24rem), 1fr)); }
.swatch.dot { border-radius: 50%; width: 0.65rem; height: 0.65rem; }
.hero .point-figure { font-size: 1.6rem; }
.ref-tick { opacity: 0.35; }
#all-table th, #all-table td { white-space: normal; }
#all-table td.num { white-space: nowrap; }

/* The line under the headline: the measured result the headline promises, a size between
   the headline and the lead. */
.hero-sub { font-family: var(--serif); font-size: clamp(1.25rem, 2.2vw, 1.5rem); line-height: 1.4; color: var(--ink); margin: 0 0 1.1rem; max-width: 46rem; }
.hero-sub strong { color: var(--accent-ink); font-weight: 600; }

/* The film: square, so it is kept to a readable size rather than the column's width. */
.demo-video { display: block; width: 100%; max-width: 40rem; aspect-ratio: 1; margin: 1rem auto 0; border-radius: var(--radius); background: #0a111c; box-shadow: var(--shadow); }
