/* Design quality is 46.1% of credibility judgements (Stanford, n=2,684) — more
   than twice the next factor. For a premium product it does double duty: trust
   and price positioning are the same asset. */
:root{
  --paper:#F0EEE8;--surface:#FFFFFF;--hair:#DFDBD2;--hair-strong:#C6C1B5;
  --ink:#101F35;--ink-2:#3A4C64;--muted:#78828F;--faint:#A3ABB4;
  --green:#14563A;--green-soft:#E2EAE3;--signal:#A3302A;--cognac:#A9764B;--cream:#E7E4DC;
  --label:#5E6875;
  /* One family, five weights, a width axis for the wordmark. A grotesque
     rather than a serif because Meridian is an instrument, not a publication:
     the pace number and the headline should speak in the same voice, since
     the number IS the headline. Archivo is the closest open face to Suisse
     Int'l — if that licence is ever bought it drops into these same two
     slots and nothing else on the site has to change. */
  --font-display:"Archivo","Helvetica Neue",Helvetica,Arial,sans-serif;
  --font-ui:"Archivo","Helvetica Neue",Helvetica,Arial,sans-serif;
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--font-ui);font-size:16px;line-height:1.5;
  -webkit-font-smoothing:antialiased;
}
body::after{
  content:'';position:fixed;inset:0;pointer-events:none;z-index:9;opacity:.05;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='140' height='140' filter='url(%23n)' opacity='0.5'/></svg>");
}
.wrap{max-width:560px;margin:0 auto;padding:0 22px 80px}

/* ---------- masthead ---------- */
/* A solid green field, edge to edge, no rounded corners. This is signage
   rather than a web section — the thing a club paints on a wall. Everything
   below it stays paper and hairlines, which is what stops it reading as loud
   instead of confident. */
/* One green band across the top of every page. The home page extends it
   downward so the calculator can overlap the seam; other pages stop short. */
.band{background:var(--green);color:var(--paper)}
.band .wrap{padding-bottom:0}
.hero{background:var(--green);color:var(--paper);padding:0 0 96px;margin-bottom:-70px}
.hero .wrap{padding-bottom:0}
.masthead{
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:22px 0 18px;border-bottom:1px solid rgba(240,238,232,.22);
}
.brandlink{display:flex;align-items:center;gap:11px;text-decoration:none;padding:8px 0}
/* Three links is a navigation, not a menu. A hamburger here would hide the
   whole site behind a tap to save thirty pixels. */
.nav{display:flex;gap:18px}
.nav a{
  color:rgba(240,238,232,.72);text-decoration:none;
  font-size:11px;font-weight:700;letter-spacing:.13em;text-transform:uppercase;
  padding:14px 0 12px;border-bottom:2px solid transparent;
}
.nav a:hover{color:var(--paper)}
.nav a[aria-current="page"]{color:var(--paper);border-bottom-color:var(--paper)}
.nav a:focus-visible{outline:2px solid var(--paper);outline-offset:3px}

/* Interior pages: a shorter green head, no overlap trick. */
.pagehead{padding:34px 0 40px}
.pagehead h1{
  font-family:var(--font-display);font-weight:800;
  font-size:clamp(34px,8.5vw,52px);letter-spacing:-.036em;line-height:.96;
  margin:0;color:var(--paper);text-wrap:balance;
}
.pagehead .stand{
  font-size:16.5px;line-height:1.45;color:rgba(240,238,232,.76);
  margin:16px 0 0;max-width:32em;
}
.after-band{padding-top:34px}
.fline{margin-top:8px}
.logomark{flex:none;color:var(--paper)}
.logomark circle,.logomark ellipse,.logomark line{
  stroke:currentColor;fill:none;stroke-width:6;stroke-linecap:round;
}
.logomark .heavy{stroke-width:10}
.logomark .fill{fill:currentColor;stroke:none}
.wordmark{
  font-family:var(--font-display);font-weight:700;font-size:17px;
  font-stretch:112%;letter-spacing:.17em;text-transform:uppercase;color:var(--paper);
}

/* ---------- hero ----------
   The first two words carry the scan. NNG's test: a concrete opening gave 85%
   correct prediction of a page's purpose from 11 characters; a generic opener
   ("Introducing…") gave 0%. So the headline opens on "Running pace", not on a
   slogan. The slogan is still here — it just isn't doing the identifying. */
/* The page read like an essay: airy, mid-sized, evenly grey. The fix is not
   more decoration, it is contrast — one enormous voice at the top and
   everything else quiet and tight underneath. Scale does the shouting so the
   colours don't have to. */
h1{
  font-family:var(--font-display);font-weight:800;
  font-size:clamp(40px,10.8vw,68px);letter-spacing:-.038em;line-height:.94;
  margin:30px 0 0;text-wrap:balance;color:var(--paper);
}
.sub{
  font-size:16.5px;line-height:1.45;color:rgba(240,238,232,.78);
  margin:20px 0 0;max-width:27em;
}

/* ---------- the live calculator ----------
   The page used to show a photograph of the idea: two numbers and an arrow.
   Nobody believes a screenshot of a claim. This is the real engine — the same
   code that will ship in the app — running in the visitor's browser, on their
   own pace, before they have given anything up.

   Banner-blindness research says decorative imagery gets pattern-matched as
   advertising and skipped; working product does not. A thing you can operate
   is the strongest version of that. */
/* Overlapping the boundary is an editorial move, not an ornament: it makes
   the card the object the page is built around instead of the next thing in a
   stack, and it puts the product's own interface across the seam. */
.demo{
  background:var(--surface);border:1px solid var(--hair-strong);border-radius:4px;
  padding:0;margin:0;overflow:hidden;position:relative;z-index:2;
  box-shadow:0 14px 40px rgba(16,31,53,.16);
}
.demo-head{
  display:flex;justify-content:space-between;align-items:center;gap:10px;
  padding:12px 18px;background:var(--ink);color:var(--paper);
}
.demo-head span{
  font-size:9px;letter-spacing:.13em;white-space:nowrap;text-transform:uppercase;font-weight:700;
}
.demo-head .live{color:rgba(240,238,232,.52)}
.demo-body{padding:20px 18px}

.demo .out{
  display:grid;grid-template-columns:1fr auto 1fr;gap:10px;align-items:end;
}
.demo .out > div:last-child{text-align:right}
.demo .lbl{
  font-size:9px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--label);font-weight:700;margin-bottom:7px;
}
.demo .val{
  font-family:var(--font-display);font-size:clamp(26px,6.6vw,34px);font-weight:700;
  letter-spacing:-.04em;line-height:1;font-variant-numeric:tabular-nums;
}
.demo .val small{
  font-family:var(--font-ui);font-size:13px;font-weight:400;color:var(--label);
}
.demo .arrow{color:var(--label);font-size:17px;padding-bottom:5px}
.demo .why{
  margin:17px 0 0;padding-top:15px;border-top:1px solid var(--hair);
  color:var(--ink-2);font-size:15px;line-height:1.5;
}

.controls{
  margin-top:18px;padding-top:17px;border-top:1px solid var(--hair);
  display:grid;gap:15px;
}
.ctl label{
  display:flex;justify-content:space-between;align-items:baseline;gap:10px;
  font-size:10px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--label);font-weight:700;margin-bottom:8px;
}
.ctl label b{
  font-family:var(--font-ui);font-size:13px;font-weight:700;color:var(--ink);
  letter-spacing:0;text-transform:none;font-variant-numeric:tabular-nums;
}
.ctl input[type=text]{
  width:100%;background:var(--paper);border:1px solid var(--hair-strong);
  border-radius:4px;color:var(--ink);font-family:inherit;
  font-size:16px;font-weight:600;padding:12px 13px;min-height:48px;
  font-variant-numeric:tabular-nums;
}
.ctl input[type=text]:focus{outline:none;border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.ctl input[type=range]{
  -webkit-appearance:none;appearance:none;width:100%;
  /* 44px of hit area, 3px of visible track. Measuring the element rather
     than the drawing found 0.8 mm here, against a 9.2 mm research floor. */
  height:44px;background:transparent;margin:0;cursor:pointer;
}
.ctl input[type=range]::-webkit-slider-runnable-track{
  height:3px;background:var(--hair-strong);border-radius:2px;
}
.ctl input[type=range]::-moz-range-track{
  height:3px;background:var(--hair-strong);border-radius:2px;
}
.ctl input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none;width:26px;height:26px;border-radius:50%;
  background:var(--surface);border:2px solid var(--green);
  box-shadow:0 1px 3px rgba(16,31,53,.22);margin-top:-11.5px;
}
.ctl input[type=range]::-moz-range-thumb{
  width:26px;height:26px;border-radius:50%;background:var(--surface);
  border:2px solid var(--green);
}
.ctl input[type=range]:focus-visible{outline:2px solid var(--green);outline-offset:5px}
.presets{display:flex;flex-wrap:wrap;gap:7px}
.presets button{
  background:var(--paper);border:1px solid var(--hair-strong);color:var(--label);
  font-family:inherit;font-size:12.5px;font-weight:600;
  padding:9px 12px;min-height:44px;border-radius:4px;cursor:pointer;
}
.presets button[aria-pressed="true"]{border-color:var(--green);color:var(--green);background:var(--green-soft)}
.presets button:focus-visible{outline:2px solid var(--green);outline-offset:2px}


/* ---------- the atom ----------
   Max's idea, and it earns its place: the product's whole claim is that
   several independent things orbit one answer. A bar chart would say the same
   thing and say it flatly.

   One hue throughout. Size does the encoding — orbit weight and electron
   radius scale with what each factor costs — so there is no colour-blindness
   problem to validate and no rainbow to apologise for. It also happens to be
   the logo's own geometry: a sphere with lines through it. */
.atom{
  margin:26px 0 0;padding:26px 18px 20px;background:var(--surface);
  border:1px solid var(--hair);border-radius:6px;
}

/* The number is the answer, so it gets to be typography rather than a label
   crammed inside a drawing. It sits above the diagram at full display weight;
   the diagram underneath explains where it came from. */
.atom-read{text-align:center;margin-bottom:6px}
.atom-lbl{
  font-family:var(--font-ui);font-weight:700;font-size:10px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--label);
}
.atom-pace{
  font-family:var(--font-display);font-weight:800;
  font-size:clamp(48px,13.5vw,68px);line-height:1;letter-spacing:-.045em;
  color:var(--green);margin-top:4px;font-variant-numeric:tabular-nums;
}
.atom-pace small{
  display:block;font-family:var(--font-ui);font-weight:700;font-size:10px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--label);
  margin-top:6px;
}

.atom svg{
  display:block;width:100%;max-width:380px;margin:0 auto;height:auto;
  overflow:visible;shape-rendering:geometricPrecision;
}
.orbit{fill:none;stroke:var(--green);opacity:.45;vector-effect:non-scaling-stroke}
.electron{fill:var(--green);stroke:var(--surface);stroke-width:3}
/* A plate, not a ring: the rings pass behind the nucleus instead of through
   the middle of it, which is what made the old figure read as clutter. */
.nucleus-plate{fill:var(--surface)}
/* Seven packed circles, each cut out of its neighbour by a paper-coloured
   stroke, so the cluster reads as distinct particles instead of a blob. */
.nucleus circle{fill:var(--green);stroke:var(--surface);stroke-width:2.4}
.nucleus circle:first-child{fill:#0E4530}

.legend{
  display:grid;grid-template-columns:repeat(3,1fr);gap:10px;
  margin-top:10px;padding-top:16px;border-top:1px solid var(--hair);
}
.leg{text-align:center}
.leg .dot{display:block;margin:0 auto 8px;border-radius:50%;background:var(--green)}
.leg .amt{
  font-family:var(--font-display);font-size:20px;font-weight:700;
  color:var(--ink);letter-spacing:-.03em;font-variant-numeric:tabular-nums;
}
.leg .nm{
  font-size:9px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--label);font-weight:700;margin-top:5px;
}
/* The diagram is still by design. Sizes carry the information; nothing needs
   to move for it to be read, and a spinning graphic on a page about pacing
   yourself would be a small joke at its own expense. */
.electron{transition:r .22s ease}
.orbit{transition:stroke-width .22s ease}

/* Smallest phones: three legend columns stop fitting long before the diagram
   does, so the legend becomes rows and keeps its numbers legible. */
@media (max-width:360px){
  .legend{grid-template-columns:1fr;gap:0;text-align:left}
  .leg{
    display:grid;grid-template-columns:22px 1fr auto;align-items:center;
    gap:10px;text-align:left;padding:9px 0;border-bottom:1px solid var(--hair);
  }
  .leg:last-child{border-bottom:0}
  .leg .dot{margin:0}
  .leg .nm{margin-top:0;order:2}
  .leg .amt{order:3}
}

/* ---------- signup ----------
   Above the fold, because the value proposition is simple — that's the
   condition where an above-fold CTA wins. Repeated at the end regardless. */
.signup{margin:26px 0 0}
.signup label{
  display:block;font-size:10px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--label);font-weight:700;margin-bottom:8px;
}
.signup .fields{display:flex;gap:9px;flex-wrap:wrap}
.signup input{
  flex:1;min-width:200px;background:var(--surface);
  border:1px solid var(--hair-strong);border-radius:5px;
  color:var(--ink);font-family:inherit;
  /* 16px minimum: below this, iOS Safari auto-zooms the page on focus. */
  font-size:16px;padding:15px 15px;min-height:52px;
}
.signup input:focus{outline:none;border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.signup button{
  background:var(--green);color:#fff;border:none;border-radius:5px;
  padding:0 26px;min-height:52px;font-family:inherit;
  font-size:16px;font-weight:700;cursor:pointer;letter-spacing:.01em;
}
.signup button:hover{background:#0F4831}
.signup button:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.note{font-size:13px;color:var(--label);margin-top:11px}

/* ---------- what it does ---------- */
/* Rules do the separating, not white space. An essay breathes; a programme
   or a scorecard rules a line and moves on. */
h2{
  font-family:var(--font-display);font-weight:700;font-size:clamp(26px,6.6vw,32px);
  letter-spacing:-.028em;line-height:1.06;margin:44px 0 0;
  padding-top:18px;border-top:2px solid var(--ink);
}
ul{margin:14px 0 0;padding:0;list-style:none}
li{padding:14px 0;border-bottom:1px solid var(--hair);color:var(--ink-2);font-size:15.5px;line-height:1.45}
li:last-child{border-bottom:none}
li b{
  color:var(--ink);font-weight:700;display:block;margin-bottom:4px;
  font-size:11px;letter-spacing:.13em;text-transform:uppercase;
}
p{color:var(--ink-2);margin:13px 0 0;max-width:31em;font-size:16px;line-height:1.5}
.lead{
  font-family:var(--font-display);font-weight:600;
  font-size:clamp(21px,5.4vw,26px);letter-spacing:-.028em;line-height:1.18;
  color:var(--ink);margin:16px 0 0;max-width:17em;
}
.lead + p{margin-top:14px}

.closing{
  margin-top:46px;padding:26px 22px;background:var(--surface);
  border:1px solid var(--hair);border-radius:6px;
}
.closing h2{margin-top:0}

footer{
  margin-top:44px;padding-top:22px;border-top:1px solid var(--hair);padding-bottom:70px;
  font-size:11px;color:var(--label);letter-spacing:.1em;text-transform:uppercase;font-weight:700;
}
footer a{color:var(--green);text-decoration:none;display:inline-block;padding:14px 3px}
footer a:hover{text-decoration:underline}
.fline{margin-top:9px;color:var(--label)}

/* Post-submit states. The form redirects back here rather than leaving the
   person on a bare JSON page — a signup that ends on a blank screen reads as
   broken even when it worked. */
.flash{
  margin:26px 0 0;padding:15px 17px;border-radius:6px;font-size:16px;
  border:1px solid var(--hair);background:var(--surface);
}
.flash.good{border-left:3px solid var(--green);background:var(--green-soft);color:var(--ink)}
.flash.bad{border-left:3px solid var(--signal);color:var(--ink)}
.flash b{display:block;margin-bottom:3px}
/* Once someone has joined, asking again is noise. Hide the forms and let the
   confirmation stand on its own. */
body.joined .signup{display:none}
body.joined .closing{display:none}


/* ---------- tables, used on Science and Races ---------- */
.tablewrap{overflow-x:auto;margin:18px 0 0;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;width:100%;font-size:14.5px;min-width:520px}
th,td{text-align:left;padding:11px 10px 11px 0;border-bottom:1px solid var(--hair);vertical-align:top}
th{
  font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--label);
  font-weight:700;border-bottom:1px solid var(--hair-strong);white-space:nowrap;
}
td{color:var(--ink-2)}
td:first-child{color:var(--ink);font-weight:600}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums;padding-right:0}
.pass{color:var(--green);font-weight:700}
.tension{color:var(--signal);font-weight:700}

/* ---------- a cited claim ---------- */
.finding{
  margin:20px 0 0;padding:18px 20px;background:var(--surface);
  border:1px solid var(--hair);border-left:3px solid var(--green);border-radius:0 6px 6px 0;
}
.finding h3{font-family:var(--font-ui);font-size:16px;font-weight:700;margin:0;color:var(--ink)}
.finding p{margin:9px 0 0;font-size:15.5px}
.cite{
  display:block;margin-top:11px;font-size:12px;color:var(--label);
  font-style:normal;letter-spacing:.01em;
}
.finding.against{border-left-color:var(--signal)}

/* ---------- race list ---------- */
.racefilter{margin:20px 0 0}
.racefilter input{
  width:100%;background:var(--surface);border:1px solid var(--hair-strong);
  border-radius:5px;color:var(--ink);font-family:inherit;
  font-size:16px;padding:14px 15px;min-height:52px;
}
.racefilter input:focus{outline:none;border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.racecount{font-size:13px;color:var(--label);margin-top:10px}
.race{
  display:grid;grid-template-columns:1fr auto;gap:4px 14px;
  padding:15px 0;border-bottom:1px solid var(--hair);
}
.race .nm{font-weight:700;color:var(--ink);font-size:16px}
.race:has(.nm a){align-items:center}
.race .where{font-size:13px;color:var(--label);margin-top:3px}
.race .cond{
  grid-column:2;grid-row:1 / span 2;text-align:right;white-space:nowrap;
  font-size:13px;color:var(--ink-2);font-variant-numeric:tabular-nums;
}
.race .cond b{display:block;font-family:var(--font-display);font-size:20px;color:var(--ink);font-weight:600}
.race .note{grid-column:1 / -1;font-size:13px;color:var(--label);margin-top:7px;line-height:1.45}

/* ---------- charts ----------
   Drawn as plain SVG from the engine's own numbers at build time, so a chart
   can never drift away from the model it claims to depict. No library: these
   are lines, and a library would be 60 kB of someone else's opinions. */
.figure{
  margin:24px 0 8px;padding:20px 16px 14px;background:var(--surface);
  border:1px solid var(--hair);border-radius:6px;
}
.figure .chart{display:block;width:100%;height:auto;overflow:visible}
.figure figcaption{
  margin-top:12px;padding-top:12px;border-top:1px solid var(--hair);
  font-size:14px;line-height:1.55;color:var(--ink-2);
}
.figure figcaption b{color:var(--ink);font-weight:700}
.gl{stroke:var(--hair);stroke-width:1}
.gl.base{stroke:var(--hair-strong);stroke-width:1.2}
.ax{
  font-family:var(--font-ui);font-size:11px;font-weight:600;
  fill:var(--label);letter-spacing:.02em;
}
.curve{fill:none;stroke:var(--green);stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}
.pt{fill:var(--green);stroke:var(--surface);stroke-width:2.5}
.chart-note{
  font-family:var(--font-ui);font-size:11px;font-weight:700;
  fill:var(--ink);letter-spacing:.01em;
}
.ci-band{fill:var(--signal);opacity:.13}
.meas{fill:none;stroke:var(--signal);stroke-width:2.6;stroke-linecap:round}
.key{font-family:var(--font-ui);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}
.key.model{fill:var(--green)}
.key.measured{fill:var(--signal)}
.bar{fill:var(--green);opacity:.82}
.bar.hot{fill:var(--signal);opacity:.86}
.barlbl{
  font-family:var(--font-ui);font-size:13px;font-weight:700;
  fill:var(--ink);letter-spacing:.01em;
}
.barval{
  font-family:var(--font-display);font-size:15px;font-weight:700;
  fill:var(--ink);font-variant-numeric:tabular-nums;
}

/* Smallest phones: the wordmark and three nav links stop fitting on one line
   at about 340px. Rather than shrink the type until it is unreadable, the
   masthead becomes two rows — brand above, navigation below, still one tap
   from anywhere. */
@media (max-width:374px){
  .masthead{flex-wrap:wrap;gap:2px 12px}
  .nav{width:100%;gap:0;justify-content:space-between;padding-bottom:2px}
  .wordmark{font-size:16px;letter-spacing:.12em}
}

/* The first heading after the green band already has the band as its rule, so
   it does not need 44px of air and a second one on top of it. */
.after-band > h2:first-child{margin-top:6px}

/* ---------- the hero, rebuilt ----------
   The old hero described the product and made you scroll to meet it. This one
   puts the working thing next to the sentence that claims it. On a phone the
   claim comes first and the instrument directly under it; on a laptop they sit
   side by side and the card hangs off the bottom of the green, which is the
   one editorial move on the page. */
.herogrid{display:grid;gap:26px;padding-bottom:0}
.herotext{min-width:0}
.heroctas{display:flex;flex-wrap:wrap;gap:10px;margin-top:26px}
.cta{
  display:inline-block;text-decoration:none;border-radius:3px;
  padding:14px 22px;font-size:13.5px;font-weight:700;letter-spacing:.01em;
  background:var(--paper);color:var(--green);border:1px solid var(--paper);
}
.cta.ghost{background:transparent;color:var(--paper);border-color:rgba(240,238,232,.42)}
.cta:hover{background:#fff;border-color:#fff;color:var(--green)}
.cta.ghost:hover{background:rgba(240,238,232,.12);color:var(--paper);border-color:var(--paper)}
.cta:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
.herogrid .demo{margin-bottom:-62px}
.after-hero{padding-top:88px}

/* ---------- desktop ----------
   Below 900px the site is one column, which is correct for a phone and was
   being served to laptops as well: a 560px ribbon down the middle of a 1440px
   screen. Above 900px the page becomes a real grid — prose stays at a
   readable measure, and the things that carry information (the instrument,
   the charts, the race list) get the width they were drawn for. */
@media (min-width:900px){
  .wrap{
    max-width:1160px;padding-left:40px;padding-right:40px;
    display:grid;column-gap:48px;
    grid-template-columns:
      [full-start] minmax(0,1fr)
      [text-start] minmax(0,680px) [text-end]
      minmax(0,1fr) [full-end];
  }
  .wrap > *{grid-column:text}
  .masthead,.herogrid,.pagehead,footer,
  .wrap > .figure,.wrap > .atom,.wrap > .tablewrap,.wrap > #raceList,
  .wrap > .racefilter,.wrap > .closing{grid-column:full}

  .herogrid{
    grid-template-columns:minmax(0,1fr) 430px;gap:56px;align-items:end;
    padding:6px 0 46px;
  }
  /* Both columns bottom-align, so the headline column stops clear of the seam
     and only the instrument is allowed to cross it. */
  .herogrid .demo{margin-bottom:-108px}
  .heroctas{margin-top:32px}
  .after-hero{padding-top:104px}
  .pagehead{padding:52px 0 60px}
  .pagehead .stand{font-size:18px}
  .sub{font-size:18px;max-width:24em}

  /* The instrument and the charts stop being phone-width. */
  .figure{padding:28px 32px 22px}
  .figure figcaption{font-size:15px;max-width:72ch}

  /* Two race cards abreast; the list was the longest page on the site. */
  #raceList{display:grid;grid-template-columns:1fr 1fr;gap:0 32px}
}

@media (min-width:1200px){
  .atom{
    display:grid;grid-template-columns:minmax(0,1fr) minmax(0,420px);
    gap:40px;align-items:center;padding:32px 34px;
  }
  /* The diagram spans both rows, so the readout and the legend are pulled
     toward each other rather than left stranded at the far ends of it. */
  .atom-read{grid-column:1;grid-row:1;align-self:end;text-align:left;margin:0}
  .atom svg{grid-column:2;grid-row:1 / span 2;max-width:460px}
  .legend{
    grid-column:1;grid-row:2;align-self:start;
    margin-top:28px;padding-top:22px;border-top:1px solid var(--hair);
    text-align:left;
  }
  /* Beside the diagram the legend has half the width it had, so three
     columns stop fitting. It becomes three rows: dot, name, number — which
     also puts the numbers in a column you can compare down. */
  .legend{grid-template-columns:1fr;gap:0}
  .leg{
    display:grid;grid-template-columns:26px 1fr auto;align-items:center;gap:12px;
    text-align:left;padding:10px 0;border-bottom:1px solid var(--hair);
  }
  .leg:last-child{border-bottom:0}
  .leg .dot{margin:0;justify-self:center}
  .leg .nm{margin-top:0;order:2}
  .leg .amt{order:3;font-size:21px}
  .wrap{column-gap:64px}
  .herogrid{grid-template-columns:minmax(0,1fr) 470px;gap:72px}
}

/* Motion, where it exists, is information — a number recalculating, a ring
   resizing. Someone who has asked their phone to stop moving things gets the
   same numbers without the transition. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;animation-iteration-count:1 !important;
    transition-duration:.001ms !important;scroll-behavior:auto !important;
  }
}
.fillband{fill:var(--green);opacity:.10}
.tier{stroke:var(--hair-strong);stroke-width:1;stroke-dasharray:3 4}
.tierlbl{
  font-family:var(--font-ui);font-size:10px;font-weight:700;
  letter-spacing:.11em;text-transform:uppercase;fill:var(--label);
}

/* Race-day table: the terrain column is the point of it, so it carries the
   only colour — one direction costs you, the other gives back. */
td.up{color:var(--signal);font-weight:700}
td.down{color:var(--green);font-weight:700}
.race .nm a{
  display:inline-block;padding:13px 0;color:var(--ink);text-decoration:none;
  border-bottom:1px solid var(--hair-strong);
}
.race .nm a:hover{border-bottom-color:var(--green);color:var(--green)}

/* Chart labels sit in a reserved band above the plot and are nudged apart
   until none of them collides. A leader line runs from each label back down
   to the point it names, so a nudged label is still unambiguous. */
.leader{fill:none;stroke:var(--hair-strong);stroke-width:1}

/* ---------- sections ----------
   Each h2 and everything under it is one object. On a phone it reads exactly
   as before. On a laptop the heading and its standfirst move into a left rail
   and stay put while the prose and figures scroll past them, which is what
   makes the width structural rather than decorative. */
.sec{margin-top:44px;padding-top:18px;border-top:2px solid var(--ink)}
.sec h2{margin:0;padding-top:0;border-top:0}
.sec .lead{margin-top:10px}
.after-hero > .sec:first-of-type,
.after-band > .sec:first-of-type{margin-top:26px}

@media (min-width:900px){
  .sec{
    grid-column:full;display:grid;gap:0 56px;
    grid-template-columns:290px minmax(0,1fr);
    margin-top:64px;padding-top:22px;
  }
  .sec-head{position:sticky;top:26px;align-self:start}
  .sec-head h2{font-size:30px}
  .sec-body{min-width:0}
  .sec-body > p{max-width:68ch}
  .sec-body > p:first-child{margin-top:0}
  /* Figures already had the page's full width; inside a section they take the
     body column, which is still far wider than the old 560px ribbon. */
  .sec-body .figure,.sec-body .atom{margin-top:22px}
}
@media (min-width:1200px){
  .sec{grid-template-columns:340px minmax(0,1fr);gap:0 72px}
}

/* ---------- fuelling ----------
   Three columns because there are three moments, and the runner is looking
   for one of them. Not a card each: one object with two rules through it, so
   it reads as a single plan rather than three unrelated tips. */
.fuel{
  margin:24px 0 0;background:var(--surface);border:1px solid var(--hair);
  border-radius:6px;display:grid;grid-template-columns:1fr;
}
.fuelcol{padding:20px 20px 18px;border-bottom:1px solid var(--hair)}
.fuelcol:last-child{border-bottom:0}
.fuelhd{
  font-size:10px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
  color:var(--green);margin-bottom:12px;
}
.fuellist{margin:0;padding:0;list-style:none}
.fuellist li{
  padding:0 0 12px;border-bottom:0;color:var(--ink-2);
  font-size:15px;line-height:1.5;
}
.fuellist li:last-child{padding-bottom:0}
/* The safety note is a different kind of thing and has to look like one. */
.caution{
  margin-top:14px;background:#FBF3F2;border:1px solid #E4C9C6;
  border-left:3px solid var(--signal);border-radius:0 6px 6px 0;padding:18px 20px;
}
.caution .fuelhd{color:var(--signal)}
.caution .fuellist li{color:#6B2B27}
@media (min-width:760px){
  .fuel{grid-template-columns:repeat(3,1fr)}
  .fuelcol{border-bottom:0;border-right:1px solid var(--hair)}
  .fuelcol:last-child{border-right:0}
}

/* Links inside running prose stay inline. Padding them into a 44px target
   inflates the line box and wrecks the paragraph's leading, which is a worse
   outcome than the thing it fixes — and inline links in a block of text are
   exempt from the target-size rule precisely because of this. Standalone
   links, which are really buttons wearing a link's clothes, do get a target. */
.sec-body p a,.after-hero > p a{
  color:var(--green);text-decoration:none;
  border-bottom:1px solid var(--hair-strong);
}
.sec-body p a:hover,.after-hero > p a:hover{border-bottom-color:var(--green)}
.sec-body p a.more,.after-hero > p a.more{
  display:inline-block;padding:13px 1px;line-height:1.1;border-bottom-width:1px;
  font-weight:700;
}

/* ---------- spacing ----------
   The page had grown a dozen different gaps — 13, 14, 18, 20, 22, 24, 26 —
   each one reasonable where it was written and none of them agreeing with the
   others. Vertical rhythm is a system or it is nothing, so here is the system,
   in one place, applied last.

   Three steps, and one rule about headings: the space ABOVE a heading is
   always larger than the space below it, because that gap is what tells the
   eye which paragraph the heading belongs to. Every ambiguous heading on the
   web is a heading with equal space on both sides. */
:root{
  --s-tight:10px;   /* inside one thought */
  --s-text:18px;    /* between paragraphs */
  --s-block:30px;   /* between a paragraph and an object */
  --s-group:46px;   /* between distinct groups inside a section */
}

p{margin-top:var(--s-text)}
.lead{margin-top:var(--s-tight)}
.sec-body > p:first-child,.sec-body > *:first-child{margin-top:0}

/* Objects — anything that is a thing rather than a sentence — get more air
   than a paragraph does, above and below. */
.figure,.atom,.tablewrap,.fuel,.racefilter,.caution,
.sec-body > ul,.sec-body > ol{margin-top:var(--s-block)}
.tablewrap + p,.figure + p,.atom + p,.fuel + p,.caution + p{margin-top:var(--s-block)}
.caution{margin-top:16px}          /* stays close to the plan it qualifies */
.fuel + p{margin-top:var(--s-block)}

/* Sub-headings. The privacy page had none of these styled at all and was
   running on browser defaults, which is why it read as a different website. */
.sec-body h3{
  font-family:var(--font-display);font-weight:700;font-size:18px;
  letter-spacing:-.015em;color:var(--ink);
  margin:var(--s-group) 0 0;
}
.sec-body h3 + p{margin-top:var(--s-tight)}
.sec-body h3:first-child{margin-top:0}

/* Ordered lists on the privacy page: numbers as data, not decoration. */
.sec-body ol{padding-left:0;list-style:none;counter-reset:c}
.sec-body ol > li{
  counter-increment:c;position:relative;padding:14px 0 14px 34px;
  border-bottom:1px solid var(--hair);color:var(--ink-2);
  font-size:15.5px;line-height:1.45;
}
.sec-body ol > li:last-child{border-bottom:0}
.sec-body ol > li::before{
  content:counter(c);position:absolute;left:0;top:15px;
  font-size:11px;font-weight:700;letter-spacing:.06em;color:var(--green);
  font-variant-numeric:tabular-nums;
}

/* A callout is a paragraph the page wants you to actually read. */
.sec-body .callout{
  margin-top:var(--s-block);padding:18px 20px;background:var(--surface);
  border:1px solid var(--hair);border-left:3px solid var(--green);
  border-radius:0 6px 6px 0;
}
.sec-body .callout > *:first-child{margin-top:0}

/* The race list sat flush against its own search box. */
#raceList{margin-top:22px}

@media (min-width:900px){
  :root{--s-text:19px;--s-block:34px;--s-group:52px}
  /* This was 22px, which put a chart closer to its own paragraph than two
     paragraphs are to each other. */
  .sec-body .figure,.sec-body .atom{margin-top:var(--s-block)}
}

.fuellist{margin-top:0}
/* The mile number and the note beside it were touching. */
table td:first-child,table th:first-child{padding-right:16px}
