/* Tool pages: /tools and the six calculators.

   This was seven near-identical copies of the same stylesheet, one inline in
   each page. They had already drifted, which is the reason for the file: a
   value fixed on one calculator stayed wrong on the other five, and nothing
   made that visible.

   Linked by tools.html, rpe-calculator.html, attempt-calculator.html,
   plate-calculator.html, strength-standards.html, qualifying-total.html and
   weightlifting-qualifying-total.html, after /tokens.css.

   The palette comes from /tokens.css. Nothing here redefines a brand colour,
   and scripts/audit.js fails the build if anything does.

   Versioned in the link, the same as site.css and coach/coach.css. Bump
   tool.css?vN in all seven pages together.

   One page still differs on purpose: attempt-calculator was built before the
   others and its copy drifted on about a dozen values. Those are kept exactly
   as they render today, in the block at the bottom of this file. */

/* The marketing site draws its red hairlines softer than the app does.
   /tokens.css carries both, this one as --line-red-soft. Renaming every use
   below would be a bigger change than this one line, so the soft value is
   bound to --line-red here and the pages are untouched. */
:root{
  --line-red:rgba(192,57,43,.32);
}

*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html{scroll-behavior:smooth}
body{background:var(--ink); color:var(--bone); font-family:'Barlow',system-ui,sans-serif;
  line-height:1.55; -webkit-font-smoothing:antialiased; overflow-x:hidden}
::selection{background:var(--red); color:var(--white)}
a{color:inherit; text-decoration:none}
.wrap{max-width:1140px; margin:0 auto; padding:0 clamp(20px,5vw,48px)}
.narrow{max-width:820px}
/* Intentionally in three places: site.css, tool.css and guides/guide.css each
   carry this rule and they must stay identical. There is no shared stylesheet
   that all three reach except tokens.css, and tokens.css says in its own header
   that it holds no component or layout rules, which this is. A fourth file for
   one pseudo-element would be worse than a duplicate with a note on it.
   If you change it here, change it in the other two. */
body::before{content:""; position:fixed; inset:0; pointer-events:none; z-index:0;
  background-image:linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size:clamp(60px,9vw,110px) 100%; background-position:center; opacity:.5;
  -webkit-mask-image:linear-gradient(180deg, transparent, #000 20%, #000 80%, transparent);
          mask-image:linear-gradient(180deg, transparent, #000 20%, #000 80%, transparent)}
/* What sits ABOVE the lines. The pseudo-element is fixed at z-index:0, so
   anything not lifted here is painted over rather than behind, and this list
   was a different set of elements in each of the three files. The breadcrumb
   was in none of them: it is a bare <div class="wrap"> between the topbar and
   the hero, so on fourteen pages the motif was drawn on top of it. Faint, but
   it is the one place on the site where the texture was in front of the words. */
header,section,footer,.crumb{position:relative; z-index:1}

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

.topbar{position:sticky; top:0; z-index:60; background:rgba(12,12,14,.9); backdrop-filter:blur(16px);
  border-bottom:1px solid var(--line)}
.topbar .wrap{display:flex; align-items:center; justify-content:space-between; height:68px}
.logo{display:flex; align-items:center; gap:12px}
.logo .mark{width:40px; height:40px; background:linear-gradient(145deg,var(--red-hot),var(--red-deep));
  display:grid; place-items:center; clip-path:polygon(0 0,100% 0,100% 72%,72% 100%,0 100%)}
.logo .mark span{font-family:'Oswald'; font-weight:700; font-size:19px; color:#fff; letter-spacing:.02em}
.logo b{font-family:'Oswald'; font-weight:600; letter-spacing:.06em; font-size:17px; text-transform:uppercase; line-height:1}
.logo small{display:block; font-family:'JetBrains Mono'; font-size:8px; color:var(--grey); letter-spacing:.22em; margin-top:6px; line-height:1}
.btn{font-family:'Oswald'; font-weight:600; font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  padding:12px 20px; cursor:pointer; border:1px solid transparent; display:inline-block; transition:.16s}
.btn-red{background:var(--red); color:#fff}
.btn-red:hover{background:var(--red-hot)}
/* .btn-ghost was here and is gone, 22 August 2026. Every header "Work with DQ"
   on a tool or guide page went from the outline to btn-red on DQ's call, so no
   page linking THIS stylesheet uses it any more. The rule still lives in
   site.css, where 404, assessment, faq, health-screening, index, privacy and
   terms do still use it, which is why this is a deletion from two copies and
   not from three. */

/* Skip link. Every page starts with a logo and five nav links, so without
   this a keyboard or screen reader user tabs through the whole header on
   every single page before reaching anything they came for. Positioned off
   screen rather than display:none, because display:none also removes it from
   the tab order. */
.skip{position:absolute; left:-9999px; top:0; z-index:100;
  background:var(--red); color:#fff; padding:14px 20px; min-height:44px;
  font-family:'Oswald',sans-serif; font-weight:600; font-size:13px;
  letter-spacing:.08em; text-transform:uppercase; text-decoration:none}
.skip:focus{left:0}

.crumb{font-family:'JetBrains Mono'; font-size:10px; letter-spacing:.16em; text-transform:uppercase;
  color:var(--grey); padding-top:26px}
.crumb a:hover{color:var(--red-hot)}

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

.hero{padding:clamp(28px,4vw,48px) 0 clamp(24px,3.5vw,40px)}
.eyebrow{font-family:'JetBrains Mono'; font-size:11px; letter-spacing:.3em; text-transform:uppercase;
  color:var(--red-hot); display:flex; align-items:center; gap:12px; margin-bottom:20px}
.eyebrow::before{content:""; width:30px; height:2px; background:var(--red); flex:none}
h1{font-family:'Oswald'; font-weight:700; text-transform:uppercase; line-height:.94;
  font-size:clamp(36px,6.6vw,72px); letter-spacing:.003em; margin-bottom:20px}
h1 .stroke{color:var(--red-hot); display:inline-block}
.lead{font-size:clamp(16px,2.1vw,19px); color:var(--bone); max-width:56ch; margin-bottom:14px}
.free-tag{display:inline-flex; align-items:center; gap:9px; margin-top:16px; border:1px solid var(--line);
  padding:9px 14px; font-family:'JetBrains Mono'; font-size:10px; letter-spacing:.13em;
  text-transform:uppercase; color:var(--gold)}

/* ---------- section furniture ---------- */

section{padding:clamp(34px,4.5vw,60px) 0; border-top:1px solid var(--line)}
section,header{scroll-margin-top:84px}
.sec-eyebrow{font-family:'JetBrains Mono'; font-size:11px; letter-spacing:.28em; text-transform:uppercase;
  color:var(--red-hot); margin-bottom:14px; display:inline-flex; align-items:center; gap:11px}
.sec-eyebrow::before{content:""; width:24px; height:2px; background:var(--red); flex:none}
.sec-title{font-family:'Oswald'; font-weight:600; text-transform:uppercase; letter-spacing:.02em;
  font-size:clamp(25px,3.8vw,42px); line-height:.99; margin-bottom:16px}
.sec-lede{font-size:16px; line-height:1.72; color:#A7A4A0; max-width:66ch}
.sec-lede + .sec-lede{margin-top:14px}

/* ---------- the /tools hub ---------- */

/* Four tools. A three-up grid orphans the fourth on its own row, so two up. */
/* minmax(min(330px,100%)) rather than minmax(330px). A 330px minimum column
   cannot fit a 320px viewport, so every tool card was 330px wide inside a
   320px window and /tools scrolled sideways by 30px. Measured at 320 against
   origin/main before changing anything, so it is pre-existing rather than a
   regression, and it is invisible from 360px up which is why nobody saw it.
   The min() caps the track at the container instead of overflowing it. */
/* 1120, was 860. DQ, 29 August: use the browser's width. The wrap went from
   1140 to 1400 and this grid kept an 860 cap, so the tool cards stopped 180px
   short of the tab strip directly above them, which reads as a broken column
   rather than a measure. Three across on a wide screen, two on a laptop, one
   on a phone, all from the same auto-fit. */
.tools{display:grid; grid-template-columns:repeat(auto-fit,minmax(min(330px,100%),1fr)); gap:16px; margin-top:26px; max-width:1120px}
/* A hidden panel has to actually hide. display:grid above beats the browser's
   own [hidden]{display:none}, so the tab switcher on /tools was setting hidden
   on the other two panels and every discipline's tools carried on rendering
   underneath the active one. The element's .hidden property read true the whole
   time, which is why only a screenshot caught it. */
.tools[hidden]{display:none}

/* THE NO-SCRIPT FALLBACK /tools ALREADY CLAIMED TO HAVE. Its own comment said
   every tool is in the markup and "with no script the page is the full list".
   The first half was true and the second half never was: two of the three
   panels carry `hidden` in the markup so nothing flashes open before the tab
   script runs, and with no script to un-hide them a reader saw five tools out
   of seventeen. Measured against origin/main before this was written, so it is
   a pre-existing fault rather than a regression.

   IT MATTERS MORE SINCE 20 AUGUST, when the AI crawlers were deliberately let
   back in. Plenty of crawlers do not execute JavaScript, and twelve of the
   seventeen tools were invisible to exactly the readers that decision admitted.

   Gated on html.js, which tools.html sets in its head, the same way site.css
   gates its reveal-on-scroll. Two rules rather than one because `.tools` sets
   display:grid, which is why the rule above it has to exist at all, while the
   S&C wrapper is a plain div. */
html:not(.js) .tools[hidden]{display:grid}
html:not(.js) [data-panel][hidden]{display:block}

/* "S&C" IS NOT UNDERSTOOD BY THE PUBLIC, which is directly observable rather
   than inferred: `s&c coach meaning` is the second autocomplete suggestion for
   `s&c coach`, and `what is s&c` collides with a rebate scheme and an electric
   company. DQ said the same thing in his own words on 21 August.

   Spelling it out costs nothing on a desktop and wrecks the tablist on a
   phone. Measured before choosing: at 320px the full label wraps the row from
   47px to 66px AND pushes the page into horizontal scroll, and it wraps at
   every phone width up to 430. It fits on one row from 560px, so that is the
   breakpoint, taken from the measurement rather than from a round number.

   The panel itself opens with a full explanation either way, and S&C is the
   tab that loads, so a phone reader gets the words immediately below the
   abbreviation rather than instead of it. */
.ds .wide{display:none}
@media(min-width:560px){
  .ds .wide{display:inline}
  .ds .narrow{display:none}
}
/* All gold, name and one line. DQ wanted the page to be a list of doors
   rather than three banded sections with headers competing for attention. */
.tool{border:1px solid rgba(255,210,31,.75); background:rgba(255,255,255,.035);
  padding:22px; display:flex; flex-direction:column; transition:.2s}
.tool:hover{border-color:var(--gold); background:rgba(255,255,255,.06)}
/* Every .tool card on /tools uses an h2, never an h3: the h3 half of this
   selector matches nothing in the current markup. Kept combined rather than
   dropped, in case a future card ever does use one, but the weight is what
   was actually wrong. This h2 is a card heading, one tier down from a page's
   own .sec-title, and it was set to the section-title weight instead. */
.tool h2,.tool h3{font-family:'Oswald'; font-weight:500; text-transform:uppercase; letter-spacing:.03em;
  font-size:19px; margin:0 0 8px; line-height:1.15; color:var(--gold)}
.tool p{font-size:14px; line-height:1.55; color:#A7A4A0}
/* .soon and .jump are gone. Both styled parts of the /tools hub that the
   flatten described in docs/backlog.md removed: "/tools is four calculators as
   a plain gold list, with no discipline bands and no cross-links", and the
   later split by discipline did not bring either back. No page linking this
   file carries a .soon or a .jump. Removed rather than reweighted, because
   .soon b and .jump h2 both declare Oswald and would otherwise have been
   "fixed" into rules that still match nothing. */

/* A band per discipline, so it is obvious which calculator is for which sport. */
.band{margin-top:38px}
.band .bh{display:flex; align-items:baseline; gap:12px; flex-wrap:wrap;
  border-bottom:1px solid var(--line); padding-bottom:10px; margin-bottom:18px}
.band .bh h3{font-family:'Oswald'; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; font-size:19px; color:var(--bone)}
.band .bh span{font-size:13.5px; color:var(--grey)}

/* ---------- the next step, inside the answer ----------

   Every tool page already ends with a written call to action and they are
   good, specific to the tool rather than boilerplate. Two things were wrong
   with relying on them alone, and neither is fixed by writing more copy.

   IT SITS BELOW THE SOURCE NOTE. The reader got their answer in the panel at
   the top; the call to action is past a collapsed note at the bottom. On a
   phone that is a deliberate scroll AFTER the question has been answered.

   IT SAYS THE SAME THING TO EVERYBODY. Somebody 2kg under a qualifying total
   and somebody 78kg under read an identical sentence, on a page that has just
   calculated the exact number that would make it personal.

   So this goes at the foot of the RESULT, and it uses the figure the page
   already worked out.

   THE COPY STATES A DISTANCE AND NEVER PREDICTS, which is the athlete lane's
   rule reaching this surface. "12.5kg to the standard" is a fact about a gap.
   "12.5kg in twelve weeks" is a coaching claim the website invented, which
   CLAUDE.md forbids on an athlete's screen and which is worse on a sales page,
   because in the app DQ might at least have said it.

   AND IT NAMES NO TIMESCALE AT ALL. An earlier draft said "12.5kg is a block",
   which reads as a distance and is not one: a block is ten weeks for Daoued
   and varies by athlete, so naming one is predicting with extra steps.

   TWO TONES. Red asks for the tiers. Gold points at another free tool, and
   gold means free here exactly as it does in tokens.css. Somebody a long way
   from a standard is not ready to buy twelve weeks of coaching, and selling to
   them anyway is how a page stops being trusted. */
.nextstep{
  margin:18px -18px -20px; padding:16px 18px;
  border-top:1px solid var(--line-red); background:rgba(192,57,43,.07);
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
}
.nextstep .txt{flex:1 1 240px; min-width:0}
.nextstep .txt b{display:block; font-family:'Oswald'; font-weight:600; text-transform:uppercase;
  letter-spacing:.03em; font-size:14.5px; color:var(--bone); margin-bottom:3px}
.nextstep .txt span{font-size:13.5px; color:#A7A4A0; line-height:1.55; display:block}
.nextstep a{
  flex:0 0 auto; font-family:'Oswald'; font-weight:600; text-transform:uppercase;
  letter-spacing:.05em; font-size:12.5px; padding:11px 16px; text-decoration:none;
  background:var(--red); color:#fff; border:1px solid var(--red);
}
.nextstep a:focus-visible{outline:2px solid var(--bone); outline-offset:3px}
.nextstep.free{background:rgba(255,255,255,.035); border-top-color:rgba(255,210,31,.75)}
.nextstep.free a{background:transparent; color:var(--bone); border-color:var(--line-red)}

/* ---------- the calculator frame ---------- */

.calc{display:grid; grid-template-columns:320px 1fr; gap:clamp(20px,3vw,34px); align-items:start; margin-top:22px}
@media(max-width:860px){.calc{grid-template-columns:1fr}}
.panel{background:var(--coal); border:1px solid var(--line-red); padding:24px}
.panel h2{font-family:'Oswald'; font-weight:600; text-transform:uppercase; letter-spacing:.03em;
  font-size:17px; margin-bottom:18px}
.field{margin-bottom:15px}
.field label{display:block; font-family:'JetBrains Mono'; font-size:10px; letter-spacing:.1em;
  text-transform:uppercase; color:var(--grey); margin-bottom:7px}
.field input,.field select{width:100%; background:var(--ink); border:1px solid var(--line);
  color:var(--bone); padding:12px 14px; font-family:'JetBrains Mono'; font-size:16px}
.field input:focus,.field select:focus{outline:none; border-color:var(--red); box-shadow:0 0 0 3px rgba(192,57,43,.16)}
.field .hint{font-size:12.5px; color:var(--grey); margin-top:6px; line-height:1.5; font-family:'Barlow'}
.panel .btn{width:100%; padding:14px; font-size:13px; margin-top:6px}
.reset{background:none; border:none; color:var(--grey); font-family:'JetBrains Mono',monospace;
  font-size:10px; letter-spacing:.12em; text-transform:uppercase; cursor:pointer;
  padding:12px 0 0; width:100%; text-align:center; min-height:44px}
.reset:hover{color:var(--red-hot)}
.out{min-width:0}
.empty{border:1px dashed var(--line); padding:40px 24px; text-align:center; color:var(--grey); font-size:15px}
.nowt{border:1px dashed var(--line); padding:22px; color:var(--grey); font-size:14px; line-height:1.6}

/* Two sports, two pages. The switch is links rather than a script toggle:
   the datasets come from different governing bodies and rank on different
   search terms, so merging them onto one URL would cost a page for no gain
   to the reader. One tap either way is the same result. */
.disc-switch{display:grid; grid-template-columns:1fr 1fr; margin:0 0 20px; border:1px solid var(--line-red)}
/* Two sports on a calculator, three disciplines on the /tools hub. Without this
   the third tab wraps onto its own row and the control stops reading as a
   control. */
.disc-switch.three{grid-template-columns:1fr 1fr 1fr}
/* FOUR. The personal training tab, DQ's call 26 August. At four columns the
   longest label, Strength & Conditioning, has no room left, so below 760px the
   grid becomes two rows of two rather than four squeezed columns: the .narrow
   span each button already carries handles the label, and this handles the
   box. */
.disc-switch.four{grid-template-columns:repeat(4,1fr)}
@media(max-width:760px){
  .disc-switch.four{grid-template-columns:1fr 1fr}
  .disc-switch.four .ds:nth-child(3){border-left:0}
  .disc-switch.four .ds:nth-child(n+3){border-top:1px solid var(--line-red)}
}
.disc-switch .ds{display:flex; align-items:center; justify-content:center; text-align:center;
  font-family:'Oswald',sans-serif; font-weight:500; text-transform:uppercase; letter-spacing:.05em;
  font-size:12.5px; color:var(--grey); padding:13px 8px; min-height:44px; transition:.18s}
.disc-switch .ds + .ds{border-left:1px solid var(--line-red)}
.disc-switch .ds.on{background:var(--red); color:#fff}
/* :not(.on), and that is the whole fix for "the selected tab is the wrong shade
   of red". `.disc-switch a.ds:hover` is one pseudo-class heavier than
   `.disc-switch .ds.on`, so hovering the SELECTED tab replaced its solid --red
   with a 7% wash of the same colour. On a phone that is not a hover you can
   move off: a tap leaves the state stuck until you touch something else, so the
   tab you just chose sat there looking half-lit, which is exactly how it was
   reported. */
.disc-switch a.ds:not(.on):hover{color:var(--bone); background:rgba(192,57,43,.07)}
/* Two of the pages switch sport on the page rather than by link, so their
   tabs are buttons and need the UA button styling taken off. Scoped to the
   element rather than to a page, because that is what actually differs: the
   link pages must keep the plain focus ring and no pointer on the current
   tab, which is a <span>. */
/* `background:none` here is the other half of the same bug. It is one class
   heavier than `.disc-switch .ds.on`, so on the pages whose tabs are buttons,
   which is /tools and the two calculators that switch sport in place, the
   selected tab had no red at all until the .on rule below re-asserts it. */
.disc-switch button.ds{appearance:none; background:none; border:0; cursor:pointer; width:100%}
.disc-switch button.ds:not(.on):hover{color:var(--bone); background:rgba(192,57,43,.07)}
.disc-switch button.ds.on{background:var(--red); color:#fff}
/* Inset, because these tabs sit flush inside the switch border and an outward
   ring would be drawn over the neighbouring tab. --bone rather than --red-hot:
   the active tab's own background is --red, where --red-hot measured 1.42:1. */
.disc-switch button.ds:focus-visible{outline:2px solid var(--bone); outline-offset:-2px}

/* ---------- shared result furniture ---------- */

.res{border:1px solid var(--line); background:linear-gradient(180deg,var(--coal2),var(--coal))}
.res-h{background:var(--red); padding:11px 18px; display:flex; justify-content:space-between; align-items:baseline; gap:12px}
.res-h b{font-family:'Oswald'; font-weight:600; letter-spacing:.06em; text-transform:uppercase; font-size:22px; color:#fff}
/* Solid white, not 85%. Over #C0392B at 10px, 0.85 computes to 4.34 and
   fails WCAG AA; solid white gives 5.44. */
.res-h span{font-family:'JetBrains Mono'; font-size:10px; color:#fff; letter-spacing:.08em}
.res-body{padding:20px 18px}
/* Scoped to the result body on purpose. /plate-calculator draws its chips as a
   <div class="plates"> here, but /attempt-calculator has a <span class="plates">
   inside each attempt row that is a line of text, not a chip tray. Unscoped,
   this rule turned that span into a flex box with a 16px bottom margin and grew
   the page by 101px. */
/* ---------- the bar, drawn ----------
   The plate colours are the same values the .pl chips below use. Declared once
   as custom properties so a chip and the plate it labels cannot drift apart,
   which is the entire reason two of these ended up being different reds in the
   first place. Not brand tokens, so they stay out of tokens.css: nothing but
   this page and its weightlifting twin has any use for the colour of a 15.

   The SVG is drawn in millimetres and scaled by the viewBox, so a plate's width
   on screen is its real thickness. That is deliberate: a calibrated 25 at 27mm
   and a weightlifting bumper at 58mm are the difference between the two tools,
   and a schematic would flatten it. */
:root{
  --plate-25:#C0392B; --plate-20:#2D6BB5; --plate-15:#C9A227;
  --plate-10:#3C8C4A; --plate-5:#E4E4E4; --plate-2:#B8B8B8; --plate-1:#9A9A9A;
}
.barfig{margin:0 0 18px; padding:0}
.barfig svg{display:block; width:100%; height:auto; overflow:visible}
/* A steel bar reads as steel in both themes, so these are fixed rather than
   tokenised. They sit on the panel background in both and were measured there. */
.bar-sleeve{fill:#8C8F94}
.bar-shaft{fill:#6F7276}
.bar-flange{fill:#5A5D61}
.bar-break{stroke:var(--coal); stroke-width:5; fill:none; stroke-linecap:round}
.bar-plate{stroke:rgba(0,0,0,.45); stroke-width:1.5}
/* The collar. Lighter than the sleeve so it reads as a separate object sitting
   on it rather than as more bar, and drawn at its real 60mm like everything
   else here. */
.bar-collar{fill:#B9BCC1; stroke:rgba(0,0,0,.45); stroke-width:1.5}
.bar-plate.p25{fill:var(--plate-25)}
.bar-plate.p20{fill:var(--plate-20)}
.bar-plate.p15{fill:var(--plate-15)}
.bar-plate.p10{fill:var(--plate-10)}
.bar-plate.p5{fill:var(--plate-5)}
.bar-plate.p2{fill:var(--plate-2)}
.bar-plate.p1{fill:var(--plate-1)}
/* Black iron, for a pound plate and for any kilo plate outside the IPF colour
   set. The colours above are a KILO standard, so painting a 45lb plate red
   would claim a standard that does not exist. */
.bar-plate.plain{fill:#2A2C30}

/* A yes/no question in a form of number boxes. The whole label is the target,
   not the 16px box inside it, which is the thing scripts/smoke.js was already
   caught measuring the wrong way round once: it read a checkbox rather than the
   <label> wrapping it, which is what a thumb actually hits. 44px, the same
   floor as every other control here. */
.field .check{display:flex; align-items:center; gap:11px; min-height:44px; cursor:pointer;
  font-family:'Barlow',system-ui,sans-serif; font-size:15px; color:var(--bone);
  text-transform:none; letter-spacing:0}
.field .check input{width:20px; height:20px; flex:none; accent-color:var(--red); cursor:pointer}
.field .check:hover{color:var(--white)}
.field .check input:focus-visible{outline:2px solid var(--bone); outline-offset:3px}

.res-body .plates{display:flex; gap:8px; flex-wrap:wrap; margin-bottom:16px}
.pl{font-family:'JetBrains Mono'; font-size:13px; color:var(--ink); padding:9px 13px; font-weight:700; border-radius:2px}
.pl.p25{background:var(--plate-25); color:#fff}
.pl.p20{background:var(--plate-20); color:#fff}
.pl.p15{background:var(--plate-15); color:#1a1a1a}
.pl.p10{background:var(--plate-10); color:#fff}
.pl.p5{background:var(--plate-5); color:#1a1a1a}
.pl.p2{background:var(--plate-2); color:#1a1a1a}
.pl.p1{background:var(--plate-1); color:#1a1a1a}
/* A pound plate has no IPF colour, because the IPF colours are a kilo
   standard. Commercial lb plates are usually black iron, so they get a neutral
   chip rather than a colour that would claim a standard that does not exist.
   Without this they inherit .pl's dark ink on a dark panel and are invisible,
   which is what the first screenshot of /weight-calculator showed. */
.pl.plain{background:var(--coal2); color:var(--bone); border:1px solid var(--line)}
.row{display:flex; justify-content:space-between; gap:14px; padding:10px 0; border-top:1px solid var(--line); font-size:14.5px}
.row:first-of-type{border-top:none}
.row .k{font-family:'JetBrains Mono'; font-size:10px; letter-spacing:.08em; color:var(--grey); text-transform:uppercase}
.row .v{font-family:'JetBrains Mono'; color:var(--bone); text-align:right}

.egnote{display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; margin:0 0 12px;
  border:1px solid rgba(255,210,31,.75); background:rgba(255,255,255,.035); padding:10px 14px}
.egnote b{font-family:'JetBrains Mono'; font-size:9.5px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--gold)}
.egnote span{font-size:13.5px; color:#A7A4A0; line-height:1.5}
.qbar{height:8px; background:var(--coal2); overflow:hidden; margin-bottom:18px}
.qbar i{display:block; height:100%; background:var(--red); transition:width .35s ease}
.src-note{margin-top:24px; border-left:2px solid var(--coal3); padding-left:14px; max-width:640px;
  font-family:'JetBrains Mono'; font-size:11.5px; color:var(--grey); line-height:1.75}
.src-note a{color:var(--bone); border-bottom:1px solid var(--line-red)}

/* COLLAPSED BY DEFAULT. DQ's call, 21 August: these notes run to five or six
   paragraphs and were taking most of a phone screen before anybody had asked
   for them. They are worth having and they are not worth reading first.

   <details> rather than a script, so the note opens with JavaScript off, is a
   real tab stop, and announces its own state to a screen reader without any
   aria plumbing. The one thing it does need is a focus ring: a <summary> on
   /faq once fell through to the browser default, which measures 1.03:1 on a
   near-black page, and that is exactly the bug scripts/focusrings.js exists
   for.

   44px minimum, the same tap target as every other control here. */
.src-note > summary{cursor:pointer; list-style:none; display:flex; align-items:center;
  gap:10px; min-height:44px; margin-left:-14px; padding:0 0 0 14px;
  font-family:'JetBrains Mono'; font-size:11px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--gold)}
.src-note > summary::-webkit-details-marker{display:none}
/* The chevron is drawn rather than a character, so it cannot arrive as tofu on
   a device without the glyph, and it turns to point down when open. */
.src-note > summary::before{content:''; width:7px; height:7px; flex:none;
  border-right:1.5px solid var(--gold); border-bottom:1.5px solid var(--gold);
  transform:rotate(-45deg); transition:transform .15s}
.src-note[open] > summary::before{transform:rotate(45deg)}
.src-note > summary:hover{color:var(--white)}
.src-note > summary:hover::before{border-color:var(--white)}
.src-note > summary:focus-visible{outline:2px solid var(--bone); outline-offset:3px}
.src-note .src-body{padding-top:10px}
/* The only collapsed note that is a WARNING rather than a source: the IWF
   category change on the two weightlifting pages. Same mechanism as every
   other src-note so the focus ring, the chevron and collapsed.js all apply
   unchanged; only the colour says it is a caveat rather than provenance. */
.src-note.note-gold{border-left-color:var(--gold)}
.src-note.note-gold .src-body{color:var(--gold)}
.src-note .src-body p:first-child{margin-top:0}
.warn{font-family:'JetBrains Mono'; font-size:12px; color:var(--gold); border-left:2px solid var(--gold);
  padding-left:12px; margin-top:14px; line-height:1.6}
.notes{margin-top:24px; border-left:2px solid var(--coal3); padding-left:14px; max-width:640px;
  font-size:13.5px; color:var(--grey); line-height:1.75}
.notes b{color:var(--bone)}

/* ---------- /rpe-calculator ---------- */

.e1{border:1px solid var(--line-red); background:linear-gradient(180deg,rgba(192,57,43,.10),rgba(192,57,43,.02));
  padding:18px 20px; margin-bottom:18px; display:flex; flex-wrap:wrap; gap:24px; align-items:baseline}
.e1 .k{display:block; font-family:'JetBrains Mono',monospace; font-size:9.5px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--red-hot); margin-bottom:6px}
.e1 .big{font-family:'Oswald',sans-serif; font-weight:700; font-size:36px; color:var(--white); line-height:1}
.e1 .big em{font-style:normal; font-size:15px; color:var(--grey); margin-left:3px}
.e1 .sub{font-size:13px; color:#A7A4A0; line-height:1.5; max-width:34ch}
/* The grid is the point of the page: the load for a rep count at an effort.
   It scrolls sideways on a phone rather than shrinking to unreadable. */
.gridwrap{border:1px solid var(--line); overflow-x:auto; -webkit-overflow-scrolling:touch}
table.rpe{border-collapse:collapse; width:100%; min-width:420px}
table.rpe th, table.rpe td{padding:11px 10px; text-align:center; border-bottom:1px solid var(--line);
  font-family:'JetBrains Mono',monospace; font-size:13px; white-space:nowrap}
table.rpe thead th{background:var(--coal2); color:var(--red-hot); font-size:10.5px;
  letter-spacing:.12em; text-transform:uppercase; border-bottom:1px solid var(--line-red)}
table.rpe tbody th{background:var(--coal); color:var(--bone); text-align:left;
  font-size:11px; letter-spacing:.1em; text-transform:uppercase; position:sticky; left:0}
table.rpe td{color:var(--bone); background:var(--coal)}
table.rpe tr:last-child th, table.rpe tr:last-child td{border-bottom:none}
table.rpe td.hot{color:var(--red-hot); font-weight:500}
.gridnote{margin-top:12px; font-size:12px; color:var(--grey); line-height:1.7}
.method{margin-top:34px; border-top:1px solid var(--line); padding-top:26px}
.method h2{font-family:'Oswald',sans-serif; font-weight:600; text-transform:uppercase;
  letter-spacing:.03em; font-size:20px; margin-bottom:14px}
.method p{font-size:14.5px; line-height:1.75; color:#A7A4A0; max-width:70ch; margin-bottom:12px}
.method code{font-family:'JetBrains Mono',monospace; font-size:13px; color:var(--bone);
  background:rgba(255,255,255,.05); padding:2px 6px}
.refs{margin-top:16px; padding-left:0; list-style:none}
.refs li{font-size:12.5px; line-height:1.65; color:var(--grey); padding:7px 0 7px 18px;
  position:relative; border-bottom:1px solid var(--line)}
.refs li:last-child{border-bottom:none}
.refs li::before{content:""; position:absolute; left:0; top:14px; width:5px; height:5px;
  background:var(--red); transform:rotate(45deg)}
.refs a{color:var(--bone); border-bottom:1px solid var(--line-red)}
.refs a:hover{color:var(--red-hot)}

/* ---------- /strength-standards ---------- */

.yours{border:1px solid var(--line-red); background:linear-gradient(180deg,rgba(192,57,43,.10),rgba(192,57,43,.02));
  padding:18px 20px; margin-bottom:18px; display:flex; flex-wrap:wrap; gap:22px; align-items:baseline}
.yours .big{font-family:'Oswald',sans-serif; font-weight:700; font-size:34px; color:var(--white); line-height:1}
.yours .big em{font-style:normal; font-size:15px; color:var(--grey); margin-left:3px}
.yours .k{display:block; font-family:'JetBrains Mono',monospace; font-size:9.5px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--red-hot); margin-bottom:6px}
.yours .sub{font-size:13px; color:#A7A4A0; line-height:1.5}
/* The ladder. One row per standard, cheapest first, so the next rung up is
   always the row under the last one that is met. */
.lad{border:1px solid var(--line); border-bottom:0}
.lad .lr{display:grid; grid-template-columns:1fr auto auto; gap:14px; align-items:center;
  padding:13px 16px; border-bottom:1px solid var(--line); background:var(--coal)}
.lad .lr.met{background:linear-gradient(90deg,rgba(60,140,74,.16),rgba(60,140,74,.03))}
.lad .nm{font-family:'Oswald',sans-serif; font-weight:500; text-transform:uppercase;
  letter-spacing:.02em; font-size:14px; color:var(--bone); line-height:1.25}
.lad .nm small{display:block; font-family:'Barlow',sans-serif; font-weight:400; text-transform:none;
  letter-spacing:0; font-size:11.5px; color:var(--grey); margin-top:3px; line-height:1.4}
.lad .req{font-family:'JetBrains Mono',monospace; font-size:14px; color:var(--bone); white-space:nowrap}
.lad .gap{font-family:'JetBrains Mono',monospace; font-size:11.5px; white-space:nowrap; text-align:right; min-width:92px}
.lad .gap.ok{color:#6FBF7F}
.lad .gap.no{color:var(--grey)}
/* A standard that does not apply to this lifter is knocked back by colour, not
   by opacity. opacity fades the text as well as the ground, so the requirement
   figure was rendering at rgb(85,85,90) on rgb(16,16,19), which is 2.55:1
   against a 4.5:1 minimum, on six rows of this page. Dropping the opacity and
   greying the two text nodes gives the same "this one is not yours" reading at
   5.36:1.

   Worth knowing why nothing caught it: scripts/smoke.js composites background
   colours correctly but does not model an ancestor's opacity, so it measured the
   declared --grey against the declared ground and saw a pass. A row can fail AA
   without a single colour in the stylesheet being wrong. */
.lad .lr.na .nm,.lad .lr.na .req{color:var(--grey)}
@media(max-width:520px){
  .lad .lr{grid-template-columns:1fr auto; row-gap:6px}
  .lad .gap{grid-column:2; text-align:right}
  .lad .req{grid-column:2; grid-row:1}
}
.srcnote{margin-top:18px; font-size:12px; color:var(--grey); line-height:1.7}
.srcnote a{color:var(--bone); border-bottom:1px solid var(--line-red)}
.srcnote a:hover{color:var(--red-hot)}

/* ---------- /weightlifting-qualifying-total ---------- */

.seg{display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px}
.seg button{flex:1 1 auto; min-width:96px; min-height:44px; background:var(--ink);
  border:1px solid var(--line); color:var(--grey); font-family:'Oswald'; font-weight:500;
  font-size:12px; letter-spacing:.06em; text-transform:uppercase; cursor:pointer; padding:11px 10px}
.seg button[aria-pressed="true"]{background:var(--red); border-color:var(--red); color:#fff}
.lifts{display:grid; grid-template-columns:1fr 1fr; gap:12px}
.gate{border-left:2px solid var(--gold); padding:12px 0 12px 14px; margin-top:16px;
  font-size:14px; line-height:1.65; color:var(--bone)}
.gate b{display:block; font-family:'Oswald'; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; font-size:12.5px; color:var(--gold); margin-bottom:6px}
.gate a{color:var(--bone); border-bottom:1px solid var(--line-red)}
.invite{margin-top:14px; border:1px solid var(--line); padding:14px 16px}
.invite .lab{font-family:'JetBrains Mono'; font-size:9.5px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--grey); margin-bottom:9px}
.invite .qbar{margin-bottom:10px}
.invite .qbar i{background:var(--gold)}
.invite p{font-size:13.5px; line-height:1.6; color:var(--grey)}
.invite p b{color:var(--bone)}
.notes ul{list-style:none; margin-top:8px}
.notes li{padding-left:16px; position:relative; margin-bottom:7px}
.notes li::before{content:""; position:absolute; left:0; top:9px; width:7px; height:2px; background:var(--coal3)}

/* ---------- /attempt-calculator ---------- */

.lift{border:1px solid var(--line); background:linear-gradient(180deg,var(--coal2),var(--coal)); margin-bottom:16px}
.lift-h{background:var(--red); padding:9px 16px; display:flex; justify-content:space-between; align-items:center; gap:12px}
.lift-h b{font-family:'Oswald'; font-weight:300; letter-spacing:.14em; text-transform:uppercase; font-size:13px; color:#fff}
.lift-h span{font-family:'JetBrains Mono'; font-size:10px; color:#fff; letter-spacing:.08em}
.att{display:grid; grid-template-columns:74px 1fr auto; gap:12px; align-items:center;
  padding:13px 16px; border-top:1px solid var(--line)}
.att:first-of-type{border-top:none}
.att .n{font-family:'JetBrains Mono'; font-size:10px; letter-spacing:.1em; text-transform:uppercase; color:var(--grey)}
.att .kg{font-family:'Oswald'; font-weight:600; font-size:25px; letter-spacing:.01em; line-height:1}
.att .kg em{font-style:normal; font-size:13px; color:var(--grey); font-weight:400; margin-left:3px}
.att .plates{font-family:'JetBrains Mono'; font-size:11px; color:var(--gold); text-align:right; line-height:1.5; max-width:210px}
.att.third .kg{color:var(--red-hot)}
.ramp{border-top:1px solid var(--line); padding:14px 16px; background:rgba(0,0,0,.25)}
.ramp .rh{font-family:'JetBrains Mono'; font-size:9.5px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--grey); margin-bottom:10px}
.ramp ol{list-style:none; display:flex; flex-wrap:wrap; gap:7px}
.ramp li{font-family:'JetBrains Mono'; font-size:11.5px; color:#A7A4A0; border:1px solid var(--line);
  padding:6px 10px; white-space:nowrap}
.ramp li b{color:var(--bone); font-weight:500}
.totals{border:1px solid var(--line-red); background:linear-gradient(180deg,rgba(192,57,43,.08),rgba(192,57,43,.02));
  padding:18px 20px; display:flex; gap:28px; flex-wrap:wrap; margin-bottom:16px}
.totals div{min-width:110px}
.totals .k{display:block; font-family:'JetBrains Mono'; font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--grey)}
.totals .v{display:block; font-family:'Oswald'; font-weight:600; font-size:29px; margin-top:5px; line-height:1}
.totals .v em{font-style:normal; font-size:13px; color:var(--grey); font-weight:400}

.faq{max-width:800px; margin-top:22px; border-top:1px solid var(--line)}
.faq details{border-bottom:1px solid var(--line)}
.faq summary{list-style:none; cursor:pointer; padding:18px 40px 18px 0; position:relative;
  font-family:'Oswald'; font-weight:500; text-transform:uppercase; letter-spacing:.02em;
  font-size:15.5px; color:var(--bone)}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:""; position:absolute; right:6px; top:50%; width:11px; height:11px;
  margin-top:-7px; border-right:2px solid var(--red); border-bottom:2px solid var(--red);
  transform:rotate(45deg); transition:transform .2s}
.faq details[open] summary::after{transform:rotate(-135deg); margin-top:-3px}
.faq details[open] summary{color:var(--red-hot)}
.faq .a{padding:0 0 20px; color:#A7A4A0; font-size:15px; line-height:1.7}
.faq .a p{margin-bottom:11px}
.faq .a p:last-child{margin-bottom:0}

/* ---------- call to action, footer ---------- */

.cta-strip{margin-top:32px; border:1px solid var(--line-red);
  background:linear-gradient(180deg,rgba(192,57,43,.07),rgba(192,57,43,.02));
  padding:22px 24px; display:flex; align-items:center; justify-content:space-between; gap:18px; flex-wrap:wrap}
.cta-strip p{margin:0; font-size:15px; color:var(--bone); max-width:52ch; line-height:1.55}
.cta-strip .btn{flex:none; padding:13px 24px}
@media(max-width:560px){.cta-strip{flex-direction:column; align-items:stretch}.cta-strip .btn{text-align:center}}

footer{border-top:1px solid var(--line); padding:36px 0 calc(36px + var(--safe-b))}
footer .wrap{display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:16px}
footer .flink{color:var(--white); text-decoration:underline; text-underline-offset:3px; display:inline-block; padding:8px 2px}
footer .flink:hover{color:var(--red-hot)}
footer small{font-family:'JetBrains Mono'; font-size:11px; color:var(--grey)}
footer .discs{font-family:'Oswald'; font-weight:300; font-size:11px; letter-spacing:.16em; text-transform:uppercase;
  color:var(--red-hot); display:flex; gap:14px; flex-wrap:wrap}
/* Bare text links sit under the 24px WCAG AA minimum, so each gets its own
   padding rather than the whole row being made taller. */
footer .discs a{display:inline-block; padding:8px 0}

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

/* ---------- attempt-calculator, the page that differs ----------

   /attempt-calculator was the first of these pages and the others were copied
   from it and then adjusted. It never got the adjustments back, so its type is
   a size larger, its sections are roomier and its input column is 20px wider.

   None of that is a bug and none of it is deliberate design either. It is kept
   exactly as it renders today so that extracting this file moved no pixel.
   Deciding whether the page should join the other six is a separate change with
   a screenshot in front of DQ, not something to slip into a refactor.

   Everything here is a value this page already had. Nothing new. */

body[data-tool="attempt"] h1{font-size:clamp(36px,7vw,76px)}
body[data-tool="attempt"] .hero{padding:clamp(28px,4vw,48px) 0 clamp(28px,4vw,44px)}
body[data-tool="attempt"] .lead{margin-bottom:8px}
body[data-tool="attempt"] .free-tag{margin-top:18px}
body[data-tool="attempt"] section{padding:clamp(38px,5vw,64px) 0}
body[data-tool="attempt"] .sec-title{font-size:clamp(26px,4vw,42px); margin-bottom:18px}
/* .88 against .9 everywhere else. Invisible, and kept only because the rule
   here is that this refactor changes nothing. */
body[data-tool="attempt"] .topbar{background:rgba(12,12,14,.88)}
body[data-tool="attempt"] .calc{grid-template-columns:340px 1fr; gap:clamp(20px,3vw,36px)}
/* The other six drop to one column at 860px. This one does it at 900px,
   because its input column is wider and collides sooner. */
@media(max-width:900px){body[data-tool="attempt"] .calc{grid-template-columns:1fr}}
body[data-tool="attempt"] .field .hint{font-size:12px}
body[data-tool="attempt"] .notes{margin-top:26px}
body[data-tool="attempt"] .cta-strip{margin-top:30px}
body[data-tool="attempt"] .cta-strip p{max-width:54ch}
/* The only functional difference in this block. This page hides its warning
   until the script has something to warn about; the others render theirs from
   the markup. */
body[data-tool="attempt"] .warn{font-size:11px; display:none}
body[data-tool="attempt"] .warn.show{display:block}
/* Its sport tabs are buttons but were never given the flex centring the other
   pages' tabs have. The text lands in the same place either way, because the
   padding already exceeds the 44px minimum, so this is here for the record
   rather than for the pixels. */
body[data-tool="attempt"] .disc-switch{gap:0}
body[data-tool="attempt"] .disc-switch .ds{display:block; align-items:normal; justify-content:normal}
/* This page names a fallback for Oswald and a monospace where the others name
   only the webfont, and the other way round on .reset. Nothing renders
   differently while the fonts load, which they do on every page here. Kept
   because the point of this block is that the page is left exactly as it was. */
body[data-tool="attempt"] .btn{font-family:'Oswald',sans-serif}
body[data-tool="attempt"] footer .discs{font-family:'Oswald',sans-serif}
body[data-tool="attempt"] footer .discs a:hover{color:var(--bone)}
body[data-tool="attempt"] .reset{font-family:'JetBrains Mono'}

/* ---------- sideways rails ----------

   Anything that scrolls sideways gets a bar you can see. Measured rather than
   picked: --red-hot on a --coal2 track is 4.41:1, comfortably past the 3:1 that
   WCAG 2.1 SC 1.4.11 asks of a UI component. Brand --red on the same track is
   3.10:1, which passes and no more, so the hotter red is the one that survives
   an 8px bar on a phone.

   What was here before measured 1.75:1: a 60% red thumb over a 6% white track,
   both composited down onto a near-black section, which is a scrollbar you can
   only find if you already know it is there.

   Both syntaxes are set on purpose. scrollbar-width and scrollbar-color are
   what Firefox reads; the ::-webkit- pseudo-elements are what Chrome, Edge and
   Safari read. Set one and the other browser draws its own default, which on
   macOS is a near-invisible overlay and in Chrome is a light-scheme grey bar on
   a black page.

   Never display:none. These rails are the only affordance that there is more to
   the right, and only one of them has copy saying so. */
.gridwrap{scrollbar-width:thin; scrollbar-color:var(--red-hot) var(--coal2)}
.gridwrap::-webkit-scrollbar{height:8px; width:8px}
.gridwrap::-webkit-scrollbar-track{background:var(--coal2)}
.gridwrap::-webkit-scrollbar-thumb{background:var(--red-hot)}
.gridwrap::-webkit-scrollbar-thumb:hover{background:var(--red)}
/* ---------- the keyboard focus ring ----------

   One ring, every interactive thing, all three stylesheets. Before this,
   site.css had no blanket rule at all, so index.html, privacy and terms gave a
   keyboard user nothing on any link or button, while tool.css and guide.css
   each had their own and the two did not match.

   --bone, and that is measurement rather than taste. The ring has to land on
   four grounds: --ink 16.16:1, --coal 15.20:1, --coal2 13.93:1, and --red
   4.50:1, which is the one that matters because every "Work with DQ" button and
   every active discipline tab is solid --red. The old --red ring measured 1.00:1
   there, and --red-hot 1.42:1. Both were invisible on exactly the controls
   somebody tabbing the page is heading for. 3:1 is what WCAG 2.1 SC 1.4.11 asks
   of a focus indicator.

   :focus-visible, not :focus, so a mouse click does not leave a ring behind.

   Text inputs are deliberately not in this list. .field input:focus already
   swaps the border to --red and adds a 16% halo, it beats this rule on
   specificity anyway, and it is a better indicator for a box you are typing in
   than an outline around it. */
a:focus-visible, button:focus-visible, summary:focus-visible,
[tabindex]:focus-visible, [role="tab"]:focus-visible{
  outline:2px solid var(--bone);
  outline-offset:3px;
}

/* The skip link is the one thing that sits flush against the page edge: it
   parks at left:0 when focused, and body{overflow-x:hidden} would clip an
   outward ring off the left of the viewport. Inset instead. */
.skip:focus-visible{outline-offset:-3px}

/* ---------- the mark ----------

   The badge, the letters and the corner cut are all inside logo-mark.svg now, so
   the only thing CSS still owns is the box it sits in. Three things changed in
   the drawing: the Q tail lengthened so it clears the ring, which is the whole
   point (at header sizes the old mark read as DO); stroke weight 24 to 28 units
   so the letters hold at 32 and 40px; and a deeper corner cut.

   The letters are paths, so the header no longer waits for Oswald. On a cold
   load on gym signal it used to show two fallback-font letters in a red box.

   The gradient is kept as a SECOND background layer under the SVG, and that is
   deliberate rather than tidy. The patch as written used the background
   shorthand, which resets background-color as well as background-image, so if
   this CSS reached the edge before the SVG did the mark would not degrade to a
   red badge, it would be a transparent box with its letters already hidden by
   the rule below: a header with no logo at all. Layered, a missing SVG leaves
   exactly the badge that is live today. Found by the app lane, worth having.

   No !important anywhere. This block is appended after the rule it overrides in
   every file it goes into, so equal specificity and later position is enough,
   and an override that can itself be overridden is the kinder thing to leave. */
.logo .mark,.mark{
  background-image:url("/logo-mark.svg"),linear-gradient(145deg,var(--red-hot),var(--red-deep));
  background-position:center;
  background-size:100% 100%;
  background-repeat:no-repeat;
  clip-path:polygon(0 0,100% 0,100% 58%,58% 100%,0 100%);
  display:block;
  position:relative;
}

/* The inner <span>DQ</span> is drawn inside the SVG now, so the live text node is
   duplicate content. Hidden rather than deleted: no markup changes, and it stays
   available to a screen reader that ignores background images. Kept in the flow
   at 1px rather than display:none, which some readers skip entirely. */
.logo .mark span,.mark span{
  position:absolute;
  width:1px;height:1px;
  overflow:hidden;
  clip:rect(0 0 0 0);
  white-space:nowrap;
}


/* ---------- no sub-header on the marketing site ----------

   The STRENGTH & CONDITIONING line comes off. The page underneath already says
   what the business does, in a headline and then a paragraph, so a tracked
   caption under the wordmark is the third time in one screen. It also puts the
   mark and the wordmark on one line, which quietens the strip and leaves the
   mark as the only red thing in it besides the button that earns money.

   Hidden, not deleted from the markup, so this stays a CSS-only change and the
   words are still in the DOM for a crawler.

   This rule is the marketing site's alone. The portal surfaces keep their
   sub-header, in gold, naming which hub you are on, and the athlete hub's is
   deliberately 10px and bold. That is the app lane's file and their call. */
.topbar .logo small{display:none}

/* A link in prose is marked with a hairline, not with a colour. The guide links
   inside the CTA strip carry an inline color:var(--bone) inside a var(--bone)
   paragraph, with the reset suppressing the underline, so they read as plain
   text: nine of them across the six calculators and the same shape here.

   This is the third time this exact bug has been found on this site. The backlog
   already records "How that works" shipping as an <a> that inherited its
   paragraph's colour with the underline off, and the smoke sweep passes all of
   them, because legible text that is not identifiably a link is still legible
   text. Matching .src-note a and .refs a, which have always been right. */
.cta-strip p a{border-bottom:1px solid var(--line-red)}
.cta-strip p a:hover{color:var(--red-hot); border-bottom-color:var(--red-hot)}

/* FOOTER MATCHES THE HEADER. DQ, 26 August: About, Q&A, Free Tools in gold,
   Guides in red, "matching header". The header has coloured those two since it
   was built and the footer never did, so the same two links read as two
   different kinds of thing depending which end of the page you were at.

   The rule lives in three stylesheets because the footer does, which is the
   thirteen-inline-stylesheets problem this repo already carries. Written
   identically in all three ON PURPOSE and noted here, so the next person
   changing one knows there are two more. */
footer .discs a.ft-tools{color:var(--gold)}
footer .discs a.ft-tools:hover{color:#FFE066}
footer .discs a.ft-guides{color:var(--red-hot)}
footer .discs a.ft-guides:hover{color:#F0685A}

/* ===========================================================================
   THE FOOTER, ONE TREATMENT. 28 August 2026.

   DQ: "make that white font similar to the header font, otherwise it looks a
   bit confusing", and "a bit more synchrony throughout".

   MEASURED BEFORE IT WAS CHANGED, and the confusion was not the white row. It
   was that the SAME LINK WAS A DIFFERENT COLOUR ON DIFFERENT PAGES:

                index      guides     tools
     About      gold       red        red
     Q&A        gold       red        red
     Free tools gold       gold       gold
     Guides     red        red        red

   footer .discs is declared in three stylesheets AND THREE TIMES INSIDE
   site.css: red-hot at :401, gold at :938, then per-link overrides at :1169.
   site.css is the only file carrying the gold container rule, so About and Q&A
   went gold on the two pages that link it and stayed red on the twenty-nine
   that do not. Nobody wrote that; it is what three copies of one rule do.

   ONE TREATMENT NOW, AND IT IS THE HEADER'S: JetBrains Mono, 11px, .14em,
   uppercase, --grey, hover --bone. Identical in site.css, tool.css and
   guides/guide.css.

   GOLD IS GONE FROM THE FOOTER RATHER THAN APPLIED CONSISTENTLY. Gold means
   free in this codebase and the footer row is navigation, so colouring two of
   four links was signalling a category to somebody reading a nav. The free
   things are still gold where a reader is choosing them, in the Free tools box
   on the home page.

   IF YOU CHANGE IT HERE, CHANGE IT IN THE OTHER TWO. There is no shared
   stylesheet these three reach, and tokens.css holds no component rules by its
   own rule. Same standing note as the measure-lines motif.
   =========================================================================== */
footer .discs{font-family:'JetBrains Mono',monospace; font-weight:500; font-size:11px;
  letter-spacing:.14em; text-transform:uppercase; color:var(--grey);
  display:flex; gap:14px; flex-wrap:wrap}
footer .discs a{display:inline-block; padding:8px 0; color:inherit}
footer .discs a:hover{color:var(--bone)}
footer .discs a.ft-tools,footer .discs a.ft-guides{color:inherit}
footer .discs a.ft-tools:hover,footer .discs a.ft-guides:hover{color:var(--bone)}
/* The white underlined row shouted louder than the nav above it. Same family,
   same colour, same hover; sentence case, because an email address is not a
   label and uppercasing one makes it harder to read. */
footer .flink{color:var(--grey); text-decoration:none;
  display:inline-block; padding:8px 2px}
footer .flink:hover{color:var(--bone)}

/* ---- CARD HEADERS CARRY IT ALONE, 28 August 2026 --------------------------
   DQ: "remove all the description... just keep the header. Let's keep it nice
   and concise, and just make the header a bit bigger." With the sentence gone
   the title is the whole card, so it gets the size the sentence was taking. */
.tool b{font-size:clamp(17px,2vw,21px); line-height:1.2}
.tool{padding:22px 22px 24px}

/* ---- A SYMBOL PER JOB, 26 September 2026 ----------------------------------
   DQ: "make them easier to identify via symbols and also remove all
   unnecessary text". One line icon per job, the same on the /tools card and
   on the tool's own heading: every plate calculator is the barbell, every
   standards page the ladder, whichever sport. On a phone the cards go two
   across, because an icon and a title no longer need a full row. */
.tool .ti{width:30px; height:30px; color:var(--gold); margin-bottom:12px; flex:none}
.tool h2{margin:0}
@media (max-width:640px){
  .tools{grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px}
  .tool{padding:16px 14px 18px}
  .tool h2{font-size:15px; overflow-wrap:anywhere}
}
.hero h1 .hi{display:block; width:44px; height:44px; color:var(--gold-hi); margin-bottom:14px}


/* ---- ONE SCREEN ON A PHONE, 26 September 2026 --------------------------------
   DQ: "really focus on correct rendering, especially on mobile for the free
   tools: very easy, as much as possible, all within one view without needing
   to scroll." Measured before this at 390x664, the visible part of an iPhone 13
   in Safari: the Calculate button sat 838 to 1553px down, one to two and a
   third screens. So on a phone the header shrinks to a title line, the form
   runs two fields to a row where both are short, the card heading goes (the
   fields say what they are), and a field's explanation shows while that field
   is being filled rather than all the time. Nothing is removed: a hint is one
   tap away and states the same rule. */
@media(max-width:640px){
  body:has(.calc) .crumb{display:none}
  body:has(.calc) .hero{padding:10px 0 4px}
  body:has(.calc) .hero h1{display:flex; align-items:center; flex-wrap:wrap; gap:0 .28em;
    font-size:30px; line-height:1; margin-bottom:6px}
  body:has(.calc) .hero h1 br{display:none}
  body:has(.calc) .hero h1 .hi{width:30px; height:30px; margin:0 6px 0 0}
  body:has(.calc) .hero .lead{font-size:14px; line-height:1.35; margin-bottom:0; color:#bdb8b0}
  body:has(.calc) .hero .free-tag{display:none}
  body:has(.calc) section#calc,body:has(.calc) section:has(.calc){padding-top:10px}
  .calc{margin-top:0; gap:14px}
  .panel{padding:12px 12px 14px; display:grid; grid-template-columns:repeat(6,minmax(0,1fr)); column-gap:10px; align-items:end}
  .panel > *{grid-column:1 / -1}
  .panel > .field{grid-column:span 3; margin-bottom:8px; min-width:0}
  /* squat, bench and deadlift three across wherever they sit loose in the card */
  .panel > .field:has(#sq),.panel > .field:has(#bp),.panel > .field:has(#dl){grid-column:span 2}
  .panel > .field.wide,.panel > .field:has(.lifts),
  .panel > .field:has(input[type=text]),.panel > .field:has(textarea){grid-column:1 / -1}
  .panel > .field:has(.seg){grid-column:1 / -1}
  .panel .seg{display:grid; grid-template-columns:1fr 1fr; gap:4px}
  .panel .seg button{min-height:44px; padding-top:6px; padding-bottom:6px}
  /* A group of fields in its own wrapper, squat, bench and deadlift, sits on
     one row. Hidden ones take no slot, so bench-only is one wide box. */
  .panel > div:not(.field):has(> .field){display:grid; grid-auto-flow:column; grid-auto-columns:1fr; column-gap:10px}
  .panel h2{display:none}
  .field label{font-size:10px; margin-bottom:4px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
  .field input,.field select{padding:10px 10px; min-height:44px}
  .field .check{font-size:14px; line-height:1.25; min-height:44px}
  /* The hint shows while the field has focus, OVER the card rather than in
     it. In the flow it collapsed on blur, the button jumped up under the
     thumb and the tap missed: eight tools, 26 September. pointer-events:none
     so a tap on whatever it covers lands on that thing. */
  .field{position:relative}
  .field .hint{display:none}
  .field:focus-within .hint{display:block; position:absolute; left:0; right:0; top:100%; z-index:5;
    margin-top:4px; padding:6px 8px; font-size:12.5px; background:var(--coal2); border:1px solid var(--line);
    pointer-events:none}
  .panel .btn{margin-top:4px; min-height:48px}
  .disc-switch{margin-bottom:12px}
  .disc-switch .ds{min-height:44px; padding-top:8px; padding-bottom:8px}
}

/* ---- keep the result, and put the tool on a home screen (tool.js) ---- */
.keep{display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:14px}
.keep .btn{width:100%; min-height:48px; padding:12px 10px; font-size:13px; text-align:center}
.keep .keep-2{background:var(--gold-hi); border:0; color:#141417; font-weight:600; box-shadow:0 0 18px rgba(255,210,31,.35)}
.keep .keep-2:focus-visible{outline:3px solid #141417; outline-offset:-6px}
.homebtn{display:none}
@media(max-width:640px){
  /* SOLID GOLD, DQ 26 September: "it needs to pop out ... reverse the gold
     colour versus the use of white, so it stands out more as a button". */
  .homebtn{display:inline-flex; align-items:center; gap:8px; margin-top:8px; min-height:44px; padding:6px 14px;
    background:var(--gold-hi); border:0; color:#141417; font-family:'Oswald',sans-serif; font-weight:600;
    font-size:14px; letter-spacing:.06em; text-transform:uppercase; cursor:pointer;
    box-shadow:0 0 18px rgba(255,210,31,.35)}
  .homebtn::before{content:'+'; font-size:18px; line-height:1; font-weight:700}
}
.homedlg{border:1px solid var(--line-red); background:var(--coal); color:var(--bone); padding:22px 20px; max-width:360px; width:calc(100% - 32px); margin:auto}
.homedlg::backdrop{background:rgba(0,0,0,.7)}
.homedlg h2{font-family:'Oswald'; font-weight:600; text-transform:uppercase; font-size:22px; margin:0 0 12px}
.homedlg ol{margin:0 0 12px 20px; padding:0; font-size:16px; line-height:1.6}
.homedlg p{color:var(--grey); font-size:14px; margin:0 0 16px}
.homedlg .btn{width:100%; min-height:48px}
.keep-app{grid-column:1 / -1; display:block; margin-top:4px; padding:12px 14px; border-left:3px solid var(--gold-hi);
  background:rgba(255,255,255,.035); color:var(--bone); font-size:14px; line-height:1.45; text-decoration:none}
.keep-app b{color:var(--gold-hi); font-weight:600}
.keep-app span{color:var(--gold-hi); text-decoration:underline; white-space:nowrap}
@media(max-width:640px){
  /* the categories notice above a form: one short line, still a tap to open */
  .hero ~ section details.src-note.note-gold,.calc ~ details.note-gold,details.src-note.note-gold{margin:0 0 10px}
  details.src-note.note-gold > summary{padding-top:6px; padding-bottom:6px; min-height:40px}
}

/* A brighter gold for what should catch the eye, DQ 26 September 2026: the
   house gold "is not like a gold that's like, 'Wow, that's amazing.'" The
   house --gold stays for everything else. */
:root{--gold-hi:var(--gold)}

/* ---- FULL RED TILES on /tools, DQ's C, 26 September 2026 ---- */
.tools .tool{background:var(--red); border:0; position:relative; padding-bottom:40px}
.tools .tool:hover{background:var(--red-hot)}
.tools .tool .ti{color:#fff}
.tools .tool h2{color:#fff}
.tools .tool::after{content:'Open \2192'; position:absolute; right:16px; bottom:14px; font-family:'JetBrains Mono',monospace;
  font-size:11px; letter-spacing:.1em; color:rgba(255,255,255,.85); text-transform:uppercase}
@media(max-width:640px){.tools .tool{padding-bottom:36px}}

/* ---- A GOLD THAT IS ALIVE, AND A BUTTON THAT BREATHES, 26 September 2026 ----
   DQ: the gold "needs to be maybe like a neon colour ... something that pops
   and feels alive, and even Register Interest pulsates." The marketing pages
   only: tokens.css keeps the house gold for the app and the coach hub. */
:root{--gold-hi:var(--gold)}
@keyframes dq-pulse{
  0%{box-shadow:0 0 0 0 rgba(231,76,60,.55)}
  70%{box-shadow:0 0 0 14px rgba(231,76,60,0)}
  100%{box-shadow:0 0 0 0 rgba(231,76,60,0)}
}
a.btn-red[href$="#enquire"]{animation:dq-pulse 2.2s ease-out infinite}
@media (prefers-reduced-motion: reduce){a.btn-red[href$="#enquire"]{animation:none}}

/* ---- the "?" beside a tool's title, and what it opens (tool.js) ---- */
/* 44px to press, 32px to see: the ring is drawn inside the tap area. */
.qhelp{position:relative; display:inline-grid; place-items:center; width:44px; height:44px; margin-left:4px; vertical-align:middle;
  border:0; background:transparent; color:var(--gold-hi); font-family:'Oswald',sans-serif; font-weight:700; font-size:18px;
  line-height:1; cursor:pointer; flex:none}
.qhelp::before{content:''; position:absolute; inset:6px; border-radius:50%; border:2px solid var(--gold-hi)}
.qhelp:hover::before{background:var(--gold-hi)}
.qhelp:hover{color:#141417}
.qhelp{z-index:0}.qhelp::before{z-index:-1}
.qdlg{max-height:82vh; overflow:auto; max-width:520px}
.qdlg .qbody{font-size:15px; line-height:1.55; color:#cfcac2}
.qdlg .qbody > *{margin:0 0 12px}
.qdlg .qbody .lead{font-size:16px; color:var(--bone); max-width:none}
.qdlg .qbody details > summary{display:none}
.qdlg .qbody p,.qdlg .qbody details{border:0; padding:0; background:none}
.qdlg .qbody,.qdlg .qbody *{font-family:'Barlow',system-ui,sans-serif; font-size:15px; line-height:1.55; letter-spacing:0; text-transform:none}
.qdlg .qbody .lead{font-size:16px; color:var(--bone)}
.qdlg .qbody a{color:var(--gold-hi)}


/* ---- ONE READABLE SIZE FOR A RESULT, 26 September 2026 ----------------------
   DQ: "weight class, category, division, qualifying total ... the font is too
   small. Can you have some consistency in terms of legibility?" The labels
   inside results ran from 9 to 11px, tool by tool. Every result label is
   12.5px now and every row value 16px, whichever tool drew it. */
#out .k{font-size:12.5px; letter-spacing:.06em}
#out .row{font-size:16px; padding:11px 0; align-items:baseline}
#out .row .v{font-size:16px}
#out .res-h span{font-size:12.5px}
/* The next step is its heading and its button: the sentence between them
   said the heading again. */
.nextstep .txt span{display:none}
/* the rest of the small print inside results, raised to the same floor */
#out .warn,#out .gridnote,#out .srcnote,#out p,#out li,#out li b,#out td,#out th,
#out .lad .gap,#out .lad small,#out .lift-h span,#out .att .n,#out .att .plates,#out .ramp .rh{font-size:12.5px}
#out .res-body > div:not([class]){font-size:12.5px}
@keyframes dq-pulse-light{
  0%{box-shadow:0 0 0 0 rgba(237,233,227,.5)}
  70%{box-shadow:0 0 0 14px rgba(237,233,227,0)}
  100%{box-shadow:0 0 0 0 rgba(237,233,227,0)}
}
a.btn:not(.btn-red)[href$="#enquire"]{animation:dq-pulse-light 2.2s ease-out infinite}
@media (prefers-reduced-motion: reduce){a.btn[href$="#enquire"]{animation:none}}

/* ---- the second Add to home screen, at the end of a tool (tool.js) ---- */
.homeend{display:none}
@media(max-width:640px){
  .homeend{display:block; text-align:center; padding:26px 0 30px}
  .homeend p{font-family:'Oswald',sans-serif; font-weight:600; text-transform:uppercase; font-size:20px; color:var(--bone); margin:0 0 12px}
  .homeend .homebtn{display:flex; justify-content:center; width:100%; min-height:52px; font-size:16px; margin:0}
}

/* ---- the standards-by-weight-class table (scripts/bwstandards.js) ---- */
.bwt{width:100%; border-collapse:collapse; margin-top:14px; font-family:'JetBrains Mono',monospace; font-variant-numeric:tabular-nums}
.bwt th{font-size:12.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--grey); font-weight:500; text-align:right; padding:8px 4px; border-bottom:1px solid var(--line)}
.bwt th:first-child,.bwt td:first-child{text-align:left}
.bwt td{font-size:15px; color:var(--bone); text-align:right; padding:10px 4px; border-bottom:1px solid var(--line)}
.bwt tr.me td{background:rgba(255,210,31,.12); color:var(--gold); font-weight:700}
.homebtn:focus-visible{outline:3px solid #141417; outline-offset:-6px}

/* ---- the tier ramp, DQ 26 September 2026 ----
   "Top 25%, top 10% and top 1% need some gradient of colour where it's like,
   whoa, if I'm top 1%, then it really stands out." Brighter as it gets rarer:
   amber, gold, then solid gold with a glow. One ramp for the percentile pages
   and the standards-by-weight-class table, so a colour means the same tier on
   every page. */
.bwt .t25,.row.t25 .k,.row.t25 .v{color:var(--amber)}
.bwt .t10,.row.t10 .k,.row.t10 .v{color:var(--gold); font-weight:700}
.bwt td.t1{color:var(--gold); font-weight:700; background:rgba(255,210,31,.1)}
.bwt th.t1{background:var(--gold); color:#141417; font-weight:700}
.row.t1 .k{color:var(--gold); font-weight:700}
.row.t1 .v{background:var(--gold); color:#141417; font-weight:700; padding:2px 10px; box-shadow:0 0 18px rgba(255,210,31,.45)}
.bwt tr.me td{background:rgba(255,255,255,.07); font-weight:700; color:var(--bone)}
.bwt tr.me td.t25{color:var(--amber)}
.bwt tr.me td.t10{color:var(--gold)}
.bwt tr.me td.t1{background:var(--gold); color:#141417}
.bwt tr.me td:first-child{box-shadow:inset 3px 0 0 var(--gold); padding-left:10px}
.lad tr.t25 td:first-child{color:var(--amber) !important}
.lad tr.t10 td:first-child,.lad tr.t5 td:first-child{color:var(--gold) !important; font-weight:700}
.lad tr.t1 td{background:rgba(255,210,31,.1)}
.lad tr.t1 td:first-child{color:var(--gold) !important; font-weight:700; padding-left:8px !important}
.lad tr.t1.mine td{background:var(--gold); color:#141417 !important}
.lad tr.t1.mine td span{color:#141417 !important}
.res.t25 .res-h{background:var(--amber)}
.res.t10 .res-h{background:var(--gold)}
.res.t1 .res-h{background:var(--gold); box-shadow:0 0 30px rgba(255,210,31,.55)}
.res.t25 .res-h b,.res.t25 .res-h span,.res.t10 .res-h b,.res.t10 .res-h span,
.res.t1 .res-h b,.res.t1 .res-h span{color:#141417}
.res.t1 .res-h b::after{content:' \2605'}
/* Cleared rungs below the tiers stay white rather than gold, and so does the
   word "cleared", or every rung turns gold and the ramp above means nothing. */
.lad tr.mine:not(.t1):not(.t5):not(.t10):not(.t25) td:first-child{color:var(--bone) !important}
.lad tr.mine td span{color:var(--bone) !important}
