/* ============================================================
   MyRISK — site styles
   Palette: MyRISK brand — navy #163B6D ground, turquoise #56BBAF accent,
   aqua for data, cool mist for light sections.
   Type: Archivo (display) / IBM Plex Sans (body) / IBM Plex Mono (utility)
   ============================================================ */

:root{
  /* ---- MyRISK primary brand colours ---- */
  --turquoise:#56BBAF;        /* primary accent */
  --navy:#163B6D;             /* primary dark */
  --aqua:#0C80B5;             /* graphics only - fails as text on both grounds */
  --ocean:#074BAD;            /* secondary action, gradients */

  /* ---- derived steps (not brand colours - shades/tints for contrast) ---- */
  --navy-deep:#0C2445;        /* deepest ground: topbar, strip, footer */
  --navy-mid:#1F4E8C;         /* raised dark surface, hover on dark */
  --aqua-light:#9AD0EA;       /* data text on dark - 6.69:1 on navy */
  --turquoise-bright:#8FD8CE; /* hover on fills, accent text on deepest ground */
  --turquoise-ink:#0B5A50;    /* accent TEXT on light - 8.1:1 on white */

  /* ---- semantic aliases: components reference these, never the brand names ---- */
  --ink:var(--navy);
  --ink-deep:var(--navy-deep);
  --slate:var(--navy-mid);
  --accent:var(--turquoise);
  --accent-ink:var(--turquoise-ink);
  --accent-bright:var(--turquoise-bright);
  --steel:var(--aqua-light);

  --mist:#F1F4F8;
  --mist-2:#E4EAF1;
  --paper:#FFFFFF;
  --body:#42536B;
  --line-dark:rgba(255,255,255,.15);
  --line-light:#DCE3EC;

  --display:"Archivo","Helvetica Neue",Arial,sans-serif;
  --sans:"IBM Plex Sans","Segoe UI",system-ui,sans-serif;
  --mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;

  /* Semantic status. Carried over from the application style guide, whose pairs are measured:
     each ink clears AA on white and on its own tint. Marketing never needed these; the check
     result screens and the boundary blocks do, and sharing them with the product means a
     "review due" looks the same on the website as it does inside Trace. */
  --ok:#1B7A45;      --ok-tint:#E7F5EC;
  --warn:#8A5B00;    --warn-tint:#FCF3DF;
  --danger:#B3261E;  --danger-tint:#FBEBEA;
  --info:#075D84;    --info-tint:#E8F3F9;
  --warn-bright:#E3B04A;   /* the amber that survives a navy ground, as --accent-bright does */

  /* Heading scale. Four roles, and a heading takes its size from the role it plays rather than
     from the tag it happens to use. Before this there were four h3 sizes (16/17/22/24px) and two
     label sizes 0.3px apart -- differences nobody chose, which is what made the page feel
     unsettled. The application style guide's idea, not its numbers: one size per role. */
  --fs-page:clamp(2.3rem,4.6vw,3.7rem);      /* h1 -- one per page */
  --fs-section:clamp(1.85rem,3.2vw,2.6rem);  /* h2 -- section openers */
  --fs-block:clamp(1.15rem,1.7vw,1.35rem);   /* h3 -- a block within a section */
  --fs-card:1.06rem;                          /* titles inside cards, steps, Q&A */
  --fs-label:.7rem;                          /* every small caps label: eyebrow, crumb, kicker, column head */
  --ls-label:.14em;                          /* and its tracking, which had drifted across .10-.16em */
  --fs-record:.68rem;                        /* mono record data: IDs, timestamps, counts */
  --fs-small:.78rem;                         /* small body text: legal lines, status words */

  --wrap:1200px;
  --pad:clamp(20px,5vw,40px);
  --r:14px;
}

*,*::before,*::after{box-sizing:border-box}

html{scroll-behavior:smooth}

body{
  margin:0;
  background:var(--paper);
  color:var(--body);
  font-family:var(--sans);
  font-size:17px;
  line-height:1.65;
  -webkit-font-smoothing:antialiased;
}

/* `height:auto` belongs here rather than on 18 inline style attributes in one article: with no
   width/height attributes on those images it was already the default, so every one of them was
   restating a global. Stating it once makes that visible. */
img{max-width:100%;height:auto;display:block}
a{color:inherit}

h1,h2,h3,h4{
  font-family:var(--display);
  color:var(--ink);
  font-weight:700;
  letter-spacing:-.022em;
  line-height:1.1;
  margin:0 0 .5em;
  /* Balance the lines rather than filling the first and orphaning the last. "Two signals that send
     you somewhere else" is 39 characters; at the 2.6rem ceiling that is about 843px inside a 780px
     .section__head, so it wrapped with one word alone on line two. `balance` splits the two lines
     evenly instead. It applies to headings only -- the algorithm is capped at a few lines and is
     the wrong tool for body copy, which uses `pretty` below. */
  text-wrap:balance;
}

h1{font-size:var(--fs-page)}
h2{font-size:var(--fs-section)}
h3{font-size:var(--fs-block);letter-spacing:-.012em}
h4{font-size:var(--fs-card);letter-spacing:-.005em}
/* `pretty` only prevents the last-line orphan; unlike `balance` it does not reflow the whole
   paragraph, so it is safe on long copy. */
p{margin:0 0 1.1em;text-wrap:pretty}
ul{margin:0;padding:0;list-style:none}

.wrap{width:100%;max-width:var(--wrap);margin:0 auto;padding-left:var(--pad);padding-right:var(--pad)}
.narrow{max-width:820px}

/* ---------- utility type ---------- */
.eyebrow{
  font-family:var(--display);
  font-size:var(--fs-label);
  letter-spacing:var(--ls-label);
  text-transform:uppercase;
  color:var(--accent-ink);
  display:flex;
  align-items:center;
  gap:.7em;
  margin:0 0 1.1rem;
  font-weight:600;
}
.eyebrow::before{
  content:"";
  width:26px;height:1px;
  background:var(--accent);
  flex:none;
}
.lede{font-size:clamp(1.05rem,1.55vw,1.22rem);line-height:1.6}
/* The sentence that states the point, at the end of a passage that has been building to it.
   A role like `.intro` and `.note`, not a utility -- it was inline 11 times before it was named. */
.point{font-weight:600;color:var(--ink)}
.section--ink .point,.cta .point,.on-ink .point{color:#fff}
.mono{font-family:var(--mono);font-size:.8rem;letter-spacing:.04em}

/* ---------- buttons ---------- */
.btn{
  display:inline-flex;align-items:center;gap:.55em;
  font-family:var(--sans);font-weight:600;font-size:.96rem;
  padding:.85em 1.5em;border-radius:8px;border:1px solid transparent;
  text-decoration:none;cursor:pointer;
  transition:background .18s ease,color .18s ease,border-color .18s ease,transform .18s ease;
}
.btn:hover{transform:translateY(-1px)}
.btn--accent{background:var(--accent);color:var(--navy-deep)}
.btn--accent:hover{background:var(--accent-bright)}
.btn--ink{background:var(--ocean);color:#fff}
.btn--ink:hover{background:var(--navy)}
.btn--ghost{border-color:rgba(255,255,255,.28);color:#fff}
.btn--ghost:hover{border-color:#fff;background:rgba(255,255,255,.07)}
.btn--outline{border-color:var(--line-light);color:var(--ink);background:#fff}
.btn--outline:hover{border-color:var(--ink)}
.btn__arrow{transition:transform .18s ease}
.btn:hover .btn__arrow{transform:translateX(3px)}

.textlink{
  font-family:var(--sans);font-weight:600;font-size:.94rem;
  color:var(--ink);text-decoration:none;
  display:inline-flex;align-items:center;gap:.45em;
  border-bottom:1px solid var(--accent);padding-bottom:2px;
}
.textlink:hover{color:var(--accent-ink)}
.on-ink .textlink{color:#fff}

/* ---------- announcement + header ---------- */
.topbar{
  background:var(--ink-deep);color:rgba(255,255,255,.82);
  font-size:.85rem;text-align:center;padding:.6rem var(--pad);
}
.topbar a{color:#fff;text-decoration:none;border-bottom:1px solid var(--accent)}
.topbar strong{color:var(--accent-bright);font-weight:600}

.nav{
  position:sticky;top:0;z-index:60;
  background:rgba(22,59,109,.92);
  backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line-dark);
}
.nav__inner{
  display:flex;align-items:center;gap:2rem;
  height:72px;
}
.brand{
  font-family:var(--display);font-weight:700;font-size:1.32rem;
  color:#fff;text-decoration:none;letter-spacing:-.02em;flex:none;
}
.brand span{color:var(--accent)}
.brand sup{font-size:.5em;top:-.7em;position:relative;color:rgba(255,255,255,.5)}

.nav__links{display:flex;align-items:center;gap:.35rem;margin-left:auto}
.nav__item{position:relative}
.nav__link{
  position:relative;
  background:transparent;border:0;cursor:pointer;font-family:var(--sans);
  display:inline-flex;align-items:center;gap:.35em;
  color:rgba(255,255,255,.82);text-decoration:none;
  font-size:.95rem;font-weight:500;
  padding:.6em .85em;border-radius:7px;
  transition:color .15s ease,background .15s ease;
}
.nav__link:hover,.nav__link[aria-expanded="true"]{color:#fff;background:rgba(255,255,255,.08)}
.nav__link.is-current{color:#fff}
.nav__link.is-current::after{
  content:"";position:absolute;left:.85em;right:.85em;bottom:.15em;height:2px;background:var(--accent);
}
.caret{width:9px;height:9px;opacity:.6}

.mega{
  position:absolute;top:calc(100% + 10px);right:0;
  width:min(620px,80vw);
  background:#fff;border-radius:var(--r);
  border:1px solid var(--line-light);
  box-shadow:0 24px 60px rgba(12,36,69,.30);
  padding:1.6rem;
  display:none;grid-template-columns:1fr 1fr;gap:1.6rem;
}
.mega.is-open{display:grid}
.mega__col h4{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent-ink);font-weight:500;margin-bottom:.9rem;
}
.mega__link{
  display:block;text-decoration:none;padding:.5rem .6rem;border-radius:8px;margin-left:-.6rem;
}
.mega__link:hover{background:var(--mist)}
.mega__link strong{display:block;color:var(--ink);font-size:.95rem;font-weight:600}
.mega__link span:not(.chip):not(.example):not(.pill){display:block;color:var(--body);font-size:.83rem;line-height:1.45}

.nav__cta{margin-left:1rem;flex:none}
.menu-btn{
  display:none;margin-left:auto;background:none;border:1px solid var(--line-dark);
  color:#fff;border-radius:8px;padding:.55em .8em;font-family:var(--sans);font-size:.9rem;cursor:pointer;
}

.drawer{
  display:none;background:var(--ink);border-bottom:1px solid var(--line-dark);
  padding:1rem var(--pad) 1.6rem;
}
.drawer.is-open{display:block}
.drawer a{
  display:block;color:rgba(255,255,255,.85);text-decoration:none;
  padding:.75rem 0;border-bottom:1px solid var(--line-dark);font-size:1.02rem;
}
.drawer .btn{margin-top:1.2rem;width:100%;justify-content:center}

/* ---------- hero ---------- */
.hero{
  position:relative;overflow:hidden;
  background:var(--ink);
  color:#fff;
}
.hero > .wrap{position:relative;z-index:1}
.hero h1,.hero h2,.hero h3{color:#fff}
.hero p{color:rgba(255,255,255,.78)}

.hero--home .wrap{
  display:grid;grid-template-columns:1.02fr .98fr;gap:clamp(2rem,5vw,4.5rem);
  align-items:center;padding-top:clamp(3.5rem,7vw,5.5rem);padding-bottom:clamp(3.5rem,7vw,5.5rem);
}
.hero__actions{display:flex;flex-wrap:wrap;gap:.7rem;margin-top:2rem}
.hero__meta{
  display:flex;flex-wrap:wrap;gap:1.4rem;margin-top:2.4rem;
  padding-top:1.4rem;border-top:1px solid var(--line-dark);
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.08em;text-transform:uppercase;
  color:rgba(255,255,255,.55);
}

.hero--page .wrap{padding-top:clamp(2.6rem,5vw,4rem);padding-bottom:clamp(2.6rem,5vw,4rem)}
.hero--page .lede{color:rgba(255,255,255,.8);max-width:760px}
.crumbs{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:var(--ls-label);text-transform:uppercase;
  color:rgba(255,255,255,.62);margin-bottom:1.6rem;
}
.crumbs a{text-decoration:none;color:rgba(255,255,255,.6)}
.crumbs a:hover{color:#fff}

/* ---------- signature: the decision record ---------- */
.record{
  background:linear-gradient(180deg,rgba(255,255,255,.07),rgba(255,255,255,.03));
  border:1px solid var(--line-dark);
  border-radius:18px;
  box-shadow:0 30px 70px rgba(6,20,40,.5);
  overflow:hidden;
}
.record__tabs{display:flex;border-bottom:1px solid var(--line-dark);background:rgba(0,0,0,.18)}
.record__tab{
  flex:1;background:none;border:0;border-bottom:2px solid transparent;
  color:rgba(255,255,255,.55);
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.12em;text-transform:uppercase;
  padding:.95rem .4rem;cursor:pointer;transition:color .2s ease,border-color .2s ease;
}
.record__tab:hover{color:#fff}
.record__tab[aria-selected="true"]{color:var(--accent-bright);border-bottom-color:var(--accent)}
.record__panel{padding:1.5rem 1.6rem 1.7rem;display:none}
.record__panel.is-active{display:block;animation:fade .35s ease}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

.record__head{display:flex;justify-content:space-between;align-items:center;gap:1rem;margin-bottom:1rem}
.record__id{font-family:var(--mono);font-size:var(--fs-record);letter-spacing:.1em;color:var(--steel)}
.pill{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.1em;text-transform:uppercase;
  padding:.35em .7em;border-radius:999px;border:1px solid rgba(86,187,175,.5);
  color:var(--accent-bright);background:rgba(86,187,175,.14);white-space:nowrap;
}
.record__title{
  font-family:var(--display);font-weight:600;font-size:1.12rem;color:#fff;
  letter-spacing:-.01em;line-height:1.35;margin:0 0 1.3rem;
}
.trail{position:relative;padding-left:1.5rem}
.trail::before{content:"";position:absolute;left:4px;top:6px;bottom:14px;width:1px;background:var(--line-dark)}
.trail li{position:relative;padding:0 0 1.05rem}
.trail li::before{
  content:"";position:absolute;left:-1.5rem;top:6px;width:9px;height:9px;border-radius:50%;
  background:var(--ink);border:1.5px solid var(--aqua);
}
/* Three node types, after the application style guide's record spine. The distinction is the
   point of the component: an event, an authority moment, and a future obligation are not the
   same thing and must not look the same.

   This previously keyed off :last-child, which put the "approved" treatment on whichever node
   happened to be last -- and on both panels that node is a *review due*, the one thing it is
   not. Position is not meaning. */
.trail li.is-key::before{border-color:var(--accent);background:var(--accent)}      /* authority: approval, sign-off */
.trail li.is-open::before{border-color:var(--warn-bright);background:transparent}  /* obligation: review due, expiry */
.trail li.is-open strong{color:var(--warn-bright)}
.trail time{
  display:block;font-family:var(--mono);font-size:var(--fs-record);letter-spacing:.08em;
  color:rgba(255,255,255,.42);margin-bottom:.15rem;
}
.trail strong{display:block;color:#fff;font-size:.93rem;font-weight:600;line-height:1.35}
.trail span:not(.chip):not(.example):not(.pill){display:block;color:rgba(255,255,255,.62);font-size:.85rem;line-height:1.45}
.record__foot{
  display:flex;flex-wrap:wrap;gap:.45rem;align-items:center;
  margin-top:.4rem;padding-top:1rem;border-top:1px solid var(--line-dark);
}
.chip{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.06em;
  color:rgba(255,255,255,.7);border:1px solid var(--line-dark);
  border-radius:6px;padding:.35em .6em;
}

/* ---------- sector strip ---------- */
.strip{background:var(--ink-deep);color:rgba(255,255,255,.7);padding:1.5rem 0}
.strip .wrap{display:flex;flex-wrap:wrap;align-items:center;gap:.9rem 2rem;justify-content:center}
.strip__label{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:var(--ls-label);text-transform:uppercase;
  color:rgba(255,255,255,.58);
}
.strip__item{font-size:.92rem;font-weight:500;color:rgba(255,255,255,.82)}

/* ---------- sections ---------- */
.section{padding:clamp(3.5rem,7vw,6rem) 0}
.section--mist{background:var(--mist)}
.section--ink{background:var(--ink);color:rgba(255,255,255,.78)}
.section--ink h2,.section--ink h3,.section--ink h4{color:#fff}
.section--tight{padding-top:clamp(2.5rem,4vw,3.5rem)}
.section__head{max-width:780px;margin-bottom:clamp(2rem,4vw,3rem)}
.section__head p:not(.eyebrow):not(.note):not(.intro){font-size:clamp(1.02rem,1.4vw,1.15rem)}

/* ---------- route cards ---------- */
.routes{display:grid;grid-template-columns:repeat(3,1fr);gap:1.2rem}
.route{
  position:relative;background:#fff;border:1px solid var(--line-light);border-radius:var(--r);
  padding:2rem 1.7rem 1.7rem;display:flex;flex-direction:column;
  text-decoration:none;transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;
}
.route::before{content:"";position:absolute;left:1.7rem;right:1.7rem;top:0;height:3px;background:var(--accent);border-radius:0 0 3px 3px}
.route:hover{border-color:var(--ink);box-shadow:0 4px 10px rgba(22,59,109,.12)}
.route__kicker{font-family:var(--display);font-size:var(--fs-label);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--accent-ink);margin-bottom:.9rem}
.route h3{margin-bottom:.35rem}
.route__for{font-size:.9rem;color:var(--body);border-top:1px dashed var(--line-light);padding-top:.9rem;margin-top:auto}
.route__for b{color:var(--ink);font-weight:600;display:block;font-family:var(--display);font-size:var(--fs-label);letter-spacing:.12em;text-transform:uppercase;margin-bottom:.35rem}
.route .textlink{margin-top:1.2rem;align-self:flex-start}

/* ---------- generic card grids ---------- */
.grid{display:grid;gap:1.1rem}
.grid--3{grid-template-columns:repeat(3,1fr)}
.grid--2{grid-template-columns:repeat(2,1fr)}
.grid--4{grid-template-columns:repeat(4,1fr)}
/* A two-column row of unequal blocks -- prose beside a panel -- should top-align rather than
   centre, or the panel floats against a longer neighbour. It was written inline 40 times before
   it was a class, and every inline style= is a reason the CSP still needs 'unsafe-inline'. */
.grid--top{align-items:start}

/* `.card` and `.chooser` are used as whole-block links -- <a class="card"> wrapping an
   eyebrow, a heading and a paragraph. Without this reset the browser underlines every
   line of that content, which is what "excessive underlining" on the insights index was.
   Any block component that becomes a link needs the same line; inline links in body copy
   keep their underline, because there a underline is the only thing distinguishing them. */
.card,.chooser{text-decoration:none}
.card{
  background:#fff;border:1px solid var(--line-light);border-radius:var(--r);
  padding:1.6rem;transition:border-color .2s ease,transform .2s ease;
}
.card:hover{border-color:var(--steel)}
.card h3:not(.intro){font-size:var(--fs-card);margin-bottom:.4rem}
.card p:not(.eyebrow):not(.note):not(.intro){font-size:.94rem;margin:0}
.card__num{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;color:var(--accent-ink);
  display:block;margin-bottom:.8rem;
}
.section--mist .card{background:#fff}
.section--ink .card{background:rgba(255,255,255,.05);border-color:var(--line-dark)}
.section--ink .card p{color:rgba(255,255,255,.7)}
.section--ink .card:hover{border-color:rgba(86,187,175,.55)}

/* ---------- product screenshots ---------- */
/* Wide UI crops lifted from the product data sheets. Unlike `.prose figure img` -- journal
   diagrams at a fixed resolution, which must never be scaled up -- these are 1600px captures
   of a screen, so filling the column is right rather than centring at natural width.
   The caption carries the data sheet's own wording: seeded example, not customer data. */
.shot{margin:1.4rem 0 0}
/* The views are 820px wide by design. Scaled to a 360px phone their labels are unreadable, so
   below that the frame scrolls instead of shrinking -- the figure scrolls, never the page. */
.shot__frame{overflow-x:auto}
.shot img{width:100%;min-width:560px;border:1px solid var(--line-light);border-radius:8px;background:#fff}
.shot figcaption{font-size:var(--fs-small);color:var(--ink-soft);margin-top:.6rem;line-height:1.6}
.section--ink .shot img{border-color:var(--line-dark)}
.section--ink .shot figcaption{color:rgba(255,255,255,.7)}

/* ---------- signal chips (symptom lists) ---------- */
.signals{display:grid;grid-template-columns:repeat(4,1fr);gap:.7rem}
.signal{
  border:1px solid var(--line-light);border-radius:10px;background:#fff;
  padding:.95rem 1.05rem;font-size:.92rem;color:var(--ink);font-weight:500;line-height:1.4;
  display:flex;gap:.6rem;align-items:flex-start;
}
.signal::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--accent);margin-top:.55em;flex:none}

/* ---------- process steps ---------- */
.steps{counter-reset:step;display:grid;grid-template-columns:repeat(4,1fr);gap:1.1rem}
.steps--5{grid-template-columns:repeat(5,1fr)}
.step{position:relative;padding-top:2.6rem}
.step::before{
  counter-increment:step;content:counter(step,decimal-leading-zero);
  position:absolute;top:0;left:0;
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.1em;color:var(--accent-ink);
}
.step::after{content:"";position:absolute;top:1.55rem;left:0;right:0;height:1px;background:var(--line-light)}
.section--ink .step::after{background:var(--line-dark)}
.step h3:not(.intro){font-size:var(--fs-card);margin-bottom:.35rem}
.step p:not(.eyebrow):not(.note):not(.intro){font-size:.92rem;margin:0}

/* ---------- split feature ---------- */
.split{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2rem,5vw,4rem);align-items:center}
.panel{
  background:#fff;border:1px solid var(--line-light);border-radius:var(--r);padding:1.8rem;
}
.section--ink .panel{background:rgba(255,255,255,.05);border-color:var(--line-dark)}
.panel h4{margin-bottom:1rem}
.checks li{
  display:flex;gap:.7rem;align-items:flex-start;padding:.5rem 0;font-size:.95rem;color:var(--ink);
}
.section--ink .checks li{color:rgba(255,255,255,.85)}
.checks li::before{
  content:"";flex:none;width:16px;height:16px;border-radius:4px;margin-top:.28em;
  background:rgba(86,187,175,.18);border:1px solid var(--accent);
}
.compare{display:grid;grid-template-columns:1fr 1fr;gap:1.1rem}
.compare__side{border:1px solid var(--line-light);border-radius:var(--r);padding:1.5rem;background:#fff}
.compare__side--with{border-color:var(--accent);box-shadow:0 12px 34px rgba(86,187,175,.18)}
.compare__side h4{font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;text-transform:uppercase;color:var(--accent-ink);margin-bottom:.9rem}
.compare__side p:not(.eyebrow):not(.note):not(.intro){font-size:.94rem;margin:0;color:var(--body)}

/* ---------- quotes ---------- */
.quotes{display:grid;grid-template-columns:1fr 1fr;gap:1.2rem}
.quote{
  background:rgba(255,255,255,.05);border:1px solid var(--line-dark);
  border-radius:var(--r);padding:1.9rem;
}
.quote blockquote{
  margin:0 0 1.2rem;font-family:var(--display);font-weight:500;font-size:1.14rem;
  line-height:1.45;color:#fff;letter-spacing:-.01em;
}
.quote figcaption{font-family:var(--display);font-size:var(--fs-label);letter-spacing:.1em;text-transform:uppercase;color:var(--steel)}

/* ---------- CTA band ---------- */
.cta{
  position:relative;
  background:var(--ink-deep);
  color:#fff;padding:clamp(3rem,6vw,4.5rem) 0;
}
.cta::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--accent)}
.cta .wrap{display:flex;flex-wrap:wrap;gap:2rem;align-items:center;justify-content:space-between}
.cta .wrap > div:first-child{flex:1 1 440px;max-width:660px}
.cta h2{color:#fff;margin-bottom:.4rem;max-width:24ch}
.cta p{color:rgba(255,255,255,.75);margin:0;max-width:52ch}
.cta__actions{display:flex;flex-wrap:wrap;gap:.7rem}

/* ---------- forms ---------- */
.form{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
.field{display:flex;flex-direction:column;gap:.4rem}
.field--full{grid-column:1/-1}
.field label{font-size:.85rem;font-weight:600;color:var(--ink)}
.field input,.field select,.field textarea{
  font-family:var(--sans);font-size:.97rem;color:var(--ink);
  border:1px solid var(--line-light);border-radius:9px;padding:.75em .9em;background:#fff;
}
.field input:focus,.field select:focus,.field textarea:focus{outline:2px solid var(--aqua);outline-offset:2px;border-color:var(--aqua)}
.field textarea{min-height:130px;resize:vertical}
/* A status badge always carries a dot AND a word. A reader who cannot separate the hues loses
   nothing, which is the rule the application layer states and the reason the dot is not optional. */
.status{
  display:inline-flex;align-items:center;gap:.45em;
  font-family:var(--sans);font-weight:600;font-size:var(--fs-small);
  padding:.3em .7em;border-radius:6px;border:1px solid currentColor;
}
.status::before{content:"";width:.5em;height:.5em;border-radius:50%;background:currentColor;flex:none}
.status--ok{color:var(--ok);background:var(--ok-tint)}
.status--warn{color:var(--warn);background:var(--warn-tint)}
.status--danger{color:var(--danger);background:var(--danger-tint)}
.status--info{color:var(--info);background:var(--info-tint)}

/* Set inline in ten places at two sizes (.92 and .95rem) that were never a decision. One class,
   one size. A size typed into markup is a size nobody can find later. */
/* An opening paragraph that sits a notch above body copy. Was typed inline as 1.05rem in four
   places; a size used four times is a role, and a role gets a name. */
.intro{font-size:1.05rem;line-height:1.6}
/* Emphasis inside copy on a dark ground. Was `style="color:#fff"`, which is the one colour that
   looks harmless inline and still breaks the moment a ground changes. */
.on-ink strong,.section--ink strong,.cta strong{color:#fff}

.note{font-size:.94rem;color:var(--body);line-height:1.6}
.note--spaced{margin-top:1.6rem}
/* `.note` sets colour on the element itself, so it beats the inherited on-ink colour no matter how
   specific the section rule is. Slate #42536B on navy #163B6D is ~1.4:1 - the about page carried it
   for weeks. Every other on-ink element already has its pair; these were the two missing. */
.section--ink .note,.cta .note,.on-ink .note,
.section--ink .form__note,.cta .form__note,.on-ink .form__note{color:rgba(255,255,255,.72)}

.form__note{grid-column:1/-1;font-size:.85rem;color:var(--body);margin:0}
/* Hints live beside the field, not inside its label. A label is the field's *name*; anything
   folded into it gets announced before the user can type, which is how a helpful sentence turns
   into an obstacle for a screen reader. aria-describedby puts it after the name instead. */
.field__hint{font-weight:400;color:var(--body);font-size:.82rem;margin:0 0 .1rem;line-height:1.45}
.form__consent{grid-column:1/-1;font-size:.85rem;color:var(--body);margin:.4rem 0 0;line-height:1.55}
.form__consent strong{color:var(--ink)}
/* The honeypot: out of sight, out of the accessibility tree, out of tab order. Not display:none,
   because some fillers skip what is not rendered. */
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

.contact-list li{padding:1.1rem 0;border-bottom:1px solid var(--line-light)}
.contact-list li:first-child{padding-top:0}
.contact-list dt,.contact-list b{
  display:block;font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;
  text-transform:uppercase;color:var(--accent-ink);margin-bottom:.3rem;font-weight:500;
}
.contact-list a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--line-light)}
.contact-list a:hover{border-color:var(--ink)}

/* ---------- facts ---------- */
.facts{display:grid;grid-template-columns:repeat(4,1fr);gap:1.1rem}
.fact{border-top:2px solid var(--accent);padding-top:1rem}
.fact b{display:block;font-family:var(--display);font-size:1.7rem;color:var(--ink);line-height:1.1;margin-bottom:.3rem}
.section--ink .fact b{color:#fff}
.fact span:not(.chip):not(.example):not(.pill){font-size:.9rem;line-height:1.45;display:block}

/* ---------- footer ---------- */
.footer{background:var(--ink-deep);color:rgba(255,255,255,.62);padding:clamp(3rem,6vw,4.5rem) 0 2rem;font-size:.92rem}
.footer h4{
  color:#fff;font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;
  text-transform:uppercase;font-weight:500;margin-bottom:1rem;
}
.footer__top{display:grid;grid-template-columns:1.4fr 1fr 1fr 1.2fr;gap:2rem}
.footer a{color:rgba(255,255,255,.68);text-decoration:none}
.footer a:hover{color:var(--accent-bright)}
.footer li{padding:.3rem 0}
.footer__brand p:not(.eyebrow):not(.note):not(.intro){max-width:34ch;font-size:.92rem;margin-top:1rem}
.footer__legal{
  margin-top:3rem;padding-top:1.5rem;border-top:1px solid var(--line-dark);
  font-size:var(--fs-small);color:rgba(255,255,255,.4);line-height:1.6;
}
.footer__legal .row{display:flex;flex-wrap:wrap;gap:1.2rem;justify-content:space-between;margin-bottom:1rem}

/* ---------- accent text: dark contexts use the full-strength turquoise ---------- */
.hero .eyebrow,.section--ink .eyebrow,.cta .eyebrow,.on-ink .eyebrow,
.hero .card__num,.section--ink .card__num,
.hero .step::before,.section--ink .step::before,
.on-ink .textlink:hover,.section--ink .textlink:hover{color:var(--accent)}

/* ---------- brand logo ---------- */
.brand-logo{height:34px;width:auto;display:block}
.footer .brand-logo{height:30px}
@media (max-width:640px){.brand-logo{height:28px}}

/* ---------- motion ---------- */
/* reveal is progressive enhancement: without JS everything stays visible */
.js .reveal{opacity:0;transition:opacity .35s ease}
.reveal.is-in{opacity:1}

/* Focus ring. WCAG 1.4.11 wants 3:1 against the adjacent colour, and no single value in this
   palette clears that on both grounds: --aqua is 4.40 on white and 2.54 on --ink, --accent-bright
   is 6.85 on --ink and 1.63 on white. So the ring takes the ground it sits on, the same way
   `.note` does. Measured, not estimated -- the dark half was failing on every hero, CTA band and
   footer, which is exactly where the primary buttons are. */
:focus-visible{outline:2px solid var(--aqua);outline-offset:2px;border-radius:4px}
.hero :focus-visible,.section--ink :focus-visible,.cta :focus-visible,
.footer :focus-visible,.on-ink :focus-visible,.nav :focus-visible,
.drawer :focus-visible{outline-color:var(--accent-bright)}

.skip{position:absolute;left:-9999px;top:0;background:var(--accent);color:var(--ink-deep);padding:.7em 1.2em;z-index:99}
.skip:focus{left:12px;top:12px}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms!important;transition-duration:.001ms!important}
  .js .reveal{opacity:1;transform:none}
}

/* ---------- responsive ---------- */
@media (max-width:1040px){
  .nav__links{display:none}
  .nav__cta{display:none}
  .menu-btn{display:block}
  .hero--home .wrap{grid-template-columns:1fr}
  .routes,.grid--3,.grid--4,.steps,.steps--5,.signals,.facts{grid-template-columns:repeat(2,1fr)}
  .split,.quotes,.footer__top{grid-template-columns:1fr}
  .footer__top{gap:2.4rem}
  .step::after{display:none}
}
@media (max-width:640px){
  body{font-size:16px}
  .routes,.grid--2,.grid--3,.grid--4,.steps,.steps--5,.signals,.facts,.compare,.form{grid-template-columns:1fr}
  .cta .wrap{flex-direction:column;align-items:flex-start}
  .strip .wrap{justify-content:flex-start}
  .record__tab{font-size:var(--fs-label);letter-spacing:.08em}
}

/* ============================================================
   D19 route architecture components
   Added for the R1 build: route chooser, fit blocks, boundaries,
   reader questions, proof objects and the public check instrument.
   ============================================================ */

/* ---------- home route chooser ---------- */
.chooser{display:grid;grid-template-columns:repeat(2,1fr);gap:1.1rem}
.chooser__item{
  position:relative;background:#fff;border:1px solid var(--line-light);border-radius:var(--r);
  padding:1.8rem 1.7rem;display:flex;flex-direction:column;text-decoration:none;
  transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;
}
.chooser__item::before{content:"";position:absolute;left:1.7rem;right:1.7rem;top:0;height:3px;background:var(--accent);border-radius:0 0 3px 3px}
.chooser__item:hover{border-color:var(--ink);box-shadow:0 18px 44px rgba(22,59,109,.16);transform:translateY(-3px)}
.chooser__when{font-size:1.05rem;color:var(--ink);font-weight:500;line-height:1.45;margin:0 0 1rem}
.chooser__route{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:var(--ls-label);text-transform:uppercase;
  color:var(--accent-ink);margin:0 0 .5rem;
}
.chooser__step{
  margin-top:auto;padding-top:1rem;border-top:1px dashed var(--line-light);
  font-size:.9rem;color:var(--body);
}
.chooser__step b{
  display:block;font-family:var(--display);font-size:var(--fs-label);letter-spacing:var(--ls-label);
  text-transform:uppercase;color:var(--ink);margin-bottom:.3rem;
}
.chooser__item .textlink{margin-top:1.1rem;align-self:flex-start}

/* ---------- fit / not fit ---------- */
.fit{display:grid;grid-template-columns:1fr 1fr;gap:1.1rem}
.fit__side{border:1px solid var(--line-light);border-radius:var(--r);padding:1.6rem;background:#fff}
.fit__side--no{border-style:dashed;background:transparent}
.fit__side h4{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;text-transform:uppercase;
  margin-bottom:.9rem;color:var(--accent-ink);
}
.fit__side--no h4{color:var(--body)}
.fit__side li{padding:.4rem 0;font-size:.94rem;color:var(--body);padding-left:1.1rem;position:relative}
.fit__side li::before{content:"";position:absolute;left:0;top:.85em;width:6px;height:1.5px;background:var(--accent)}
.fit__side--no li::before{background:var(--line-light)}
.section--ink .fit__side{background:rgba(255,255,255,.05);border-color:var(--line-dark)}
.section--ink .fit__side--no{background:transparent}
.section--ink .fit__side li{color:rgba(255,255,255,.82)}
.section--ink .fit__side h4{color:var(--accent)}
.section--ink .fit__side--no h4{color:var(--aqua-light)}

/* ---------- boundary: what this is not ---------- */
.boundary{
  border:1px solid var(--line-light);border-left:3px solid var(--ink);
  border-radius:0 var(--r) var(--r) 0;padding:1.5rem 1.7rem;background:var(--mist);
}
.boundary h4{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;text-transform:uppercase;
  color:var(--ink);margin-bottom:.9rem;
}
.boundary li{padding:.35rem 0 .35rem 1.3rem;position:relative;font-size:.94rem;color:var(--body)}
.boundary li::before{content:"\2014";position:absolute;left:0;color:var(--ink);opacity:.5}
.section--ink .boundary{background:rgba(0,0,0,.18);border-color:var(--line-dark);border-left-color:var(--accent)}
.section--ink .boundary h4{color:var(--accent)}
.section--ink .boundary li{color:rgba(255,255,255,.78)}
.section--ink .boundary li::before{color:var(--accent)}

/* ---------- reader questions ---------- */
.qa{border-top:1px solid var(--line-light)}
.qa__item{border-bottom:1px solid var(--line-light);padding:1.2rem 0}
.qa__item h4{margin-bottom:.35rem;font-family:var(--display);font-size:var(--fs-card)}
.qa__item p:not(.eyebrow):not(.note):not(.intro){margin:0;font-size:.95rem}
.section--ink .qa,.section--ink .qa__item{border-color:var(--line-dark)}
.section--ink .qa__item p{color:rgba(255,255,255,.75)}

/* ---------- proof object ---------- */
.proof{
  border:1px solid var(--line-light);border-radius:var(--r);overflow:hidden;background:#fff;
}
.proof__bar{
  display:flex;justify-content:space-between;align-items:center;gap:1rem;
  padding:.8rem 1.3rem;background:var(--mist);border-bottom:1px solid var(--line-light);
}
.proof__bar span:not(.chip):not(.example):not(.pill){font-family:var(--display);font-size:var(--fs-label);letter-spacing:.1em;color:var(--body)}
.example{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.18em;text-transform:uppercase;
  border:1px solid var(--ink);color:var(--ink);padding:.25em .6em;border-radius:4px;
}
.proof__body{padding:1.5rem 1.7rem}
.proof__body li{padding:.4rem 0 .4rem 1.4rem;position:relative;font-size:.94rem;color:var(--body)}
.proof__body li::before{
  content:"";position:absolute;left:0;top:.72em;width:8px;height:8px;border-radius:2px;
  border:1.5px solid var(--aqua);
}

/* ---------- public check instrument ---------- */
.check{
  border:1px solid var(--line-light);border-radius:18px;background:#fff;
  box-shadow:0 18px 44px rgba(22,59,109,.10);overflow:hidden;
}
.check__head{
  display:flex;justify-content:space-between;align-items:center;gap:1rem;
  padding:1rem 1.6rem;border-bottom:1px solid var(--line-light);background:var(--mist);
}
.check__name{font-family:var(--display);font-size:var(--fs-label);letter-spacing:.13em;text-transform:uppercase;color:var(--accent-ink)}
.check__dots{display:flex;gap:.35rem}
.check__dot{width:8px;height:8px;border-radius:50%;background:var(--line-light)}
.check__dot.is-done{background:var(--aqua)}
.check__dot.is-now{background:var(--accent);transform:scale(1.25)}
.check__body{padding:2rem 1.8rem}
.check__q{font-family:var(--display);font-weight:700;font-size:1.25rem;color:var(--ink);letter-spacing:-.015em;line-height:1.25;margin:0 0 .4rem}
.check__hint{font-size:.92rem;margin:0 0 1.4rem}
.check__opts{display:grid;gap:.6rem}
.check__opt{
  text-align:left;font-family:var(--sans);font-size:.98rem;color:var(--ink);
  background:#fff;border:1px solid var(--line-light);border-radius:10px;
  padding:.9em 1.1em;cursor:pointer;transition:border-color .15s ease,background .15s ease,transform .15s ease;
}
.check__opt:hover{border-color:var(--accent);background:rgba(86,187,175,.07);transform:translateX(2px)}
.check__foot{
  display:flex;justify-content:space-between;align-items:center;gap:1rem;
  padding:.9rem 1.6rem;border-top:1px solid var(--line-light);
}
.check__back{
  background:none;border:0;cursor:pointer;font-family:var(--sans);font-size:.88rem;
  color:var(--body);padding:.3em 0;
}
.check__back:hover{color:var(--ink)}
.check__count{font-family:var(--mono);font-size:var(--fs-record);letter-spacing:.1em;color:var(--body)}
.check__result h3:not(.intro){font-size:var(--fs-block);margin-bottom:.6rem}
.check__pattern{
  font-family:var(--display);font-size:var(--fs-label);letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent-ink);margin-bottom:.7rem;
}
.check__next{
  margin-top:1.4rem;padding:1.3rem 1.4rem;border-radius:12px;
  background:var(--mist);border:1px solid var(--line-light);
}
.check__next h4{margin-bottom:.4rem}
.check__next p:not(.eyebrow):not(.note):not(.intro){font-size:.94rem;margin:0 0 1.1rem}
.check__capture{margin-top:1.4rem;padding-top:1.4rem;border-top:1px dashed var(--line-light)}
.check__capture p:not(.eyebrow):not(.note):not(.intro){font-size:.9rem}
/* Font size is deliberately left to the .check__capture p rule above: it carries four classes of
   specificity and a single class here would lose to it silently. Only untouched properties. */
.check__capture-note{margin-top:.8rem}
.check__capture-done{margin:0;color:var(--accent-ink);font-weight:600}
.check__row{display:flex;flex-wrap:wrap;gap:.6rem}
.check__row input{
  flex:1 1 220px;font-family:var(--sans);font-size:.95rem;color:var(--ink);
  border:1px solid var(--line-light);border-radius:9px;padding:.7em .9em;
}
.check__row input:focus{outline:2px solid var(--aqua);outline-offset:2px}
.check__noscript{padding:1.8rem;font-size:.95rem}

@media (max-width:640px){
  .chooser,.fit{grid-template-columns:1fr}
  .check__body{padding:1.5rem 1.2rem}
  .check__q{font-size:1.1rem}
}

/* steps inside a split column stack rather than squeezing into narrow columns */
.split .steps,.split .steps--5{grid-template-columns:1fr;gap:0}
.split .step{padding-top:0;padding-left:2.6rem;padding-bottom:1.3rem}
.split .step::before{top:.15rem}
.split .step::after{display:none}

/* ============================================================
   R1.1 — booking forms and dual-path CTAs (post-STORM rebuild)
   ============================================================ */
.hero__actions .btn + .btn{margin-left:0}
.persona-row{display:grid;grid-template-columns:repeat(2,1fr);gap:.7rem}
.persona{
  border:1px solid var(--line-light);border-radius:10px;background:#fff;padding:1rem 1.1rem;
}
.persona b{display:block;color:var(--ink);font-size:.95rem;margin-bottom:.2rem}
.persona span:not(.chip):not(.example):not(.pill){font-size:.88rem;color:var(--body);line-height:1.45}
.section--ink .persona{background:rgba(255,255,255,.05);border-color:var(--line-dark)}
.section--ink .persona b{color:#fff}
.section--ink .persona span{color:rgba(255,255,255,.72)}

.book{max-width:760px}
.book__aside{
  border:1px dashed var(--line-light);border-radius:10px;padding:1rem 1.2rem;
  font-size:.88rem;color:var(--body);margin-top:1.2rem;
}
.chooser--quote .chooser__when{font-family:var(--display);font-weight:500;letter-spacing:-.01em}
.chooser--quote .chooser__when::before{content:"\201C";color:var(--accent-ink);font-size:1.4em;line-height:0;margin-right:.05em}
.chooser--quote .chooser__when::after{content:"\201D";color:var(--accent-ink);font-size:1.4em;line-height:0;margin-left:.05em}
@media (max-width:640px){.persona-row{grid-template-columns:1fr}}

/* Long-form article body. `.prose` had no rules at all, so links inside it fell
   back to the browser default and rendered underlined -- the one place on the
   site where that happened. Underline replaced with the same hairline rule
   `.contact-list a` already uses, so links stay findable without striping a
   page of prose. */
.prose a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--line-light)}
.prose a:hover{border-bottom-color:var(--accent)}
.prose .crumbs a,.prose .btn,.prose .textlink{border-bottom:0}
.fineprint{font-size:var(--fs-small);color:var(--ink-soft);line-height:1.7}
/* The prose column inherited the 1200px site wrap, which is roughly 150 characters a
   line and far past a readable measure. It also meant the article figures -- 400 to
   900px natural -- were being stretched to 1200 and going soft. Both problems are the
   one problem. 820px is the width `.narrow` already establishes, so no new number. */
.wrap.prose{max-width:820px}
.prose figure{margin:2.2rem 0}
/* width:auto, never 100%. These are journal diagrams at a fixed resolution; scaling one
   up past its natural size makes it larger and worse. Shrinking to fit is fine. */
.prose figure img{
  display:block;width:auto;max-width:100%;height:auto;margin:0 auto;
  border:1px solid var(--line-light);border-radius:8px;
}
.prose figcaption{font-size:var(--fs-small);color:var(--ink-soft);margin-top:.6rem;line-height:1.6}
/* Republication provenance. Sits above a reprinted article and must not read as the
   article's opening paragraph -- the article's own first line does that job. `.intro`
   was doing the opposite: 1.05rem, larger than body, so the byline read as the lede.
   Smaller and boxed, so the eye steps over it on the way in and can still find it. */
.provenance{
  font-size:var(--fs-small);color:var(--ink-soft);line-height:1.7;
  background:#fff;border:1px solid var(--line-light);border-left:3px solid var(--accent);
  border-radius:0 var(--r) var(--r) 0;padding:1rem 1.2rem;margin:0 0 2.2rem;
}
/* Log in sits outside the section nav and before the CTA. It is a destination, not a
   part of the site, so it gets a separator rather than another accent button -- the
   header already has one and two competing buttons is how neither gets pressed. */
/* The hours were meant to sit UNDER the label -- `.nav__hours` sets display:block to say so. It
   never did: `.nav__link` is inline-flex, and display:block on a flex child does nothing to stack
   it, so the span became a second flex item and rendered beside "Log in" as one wide nav entry.
   The column direction is what actually delivers the intent. The row is 72px, so two lines fit. */
/* It now has a resting state. Until 10 September it was a text link whose only affordance was the
   hover background, so there was nothing to see until the pointer was already on it -- the
   separator was rgba(255,255,255,.15), which is 1.55:1 on the navy and invisible as a boundary.
   A full outline at .42 gives 3.30:1 and clears WCAG 1.4.11's 3:1 for a UI component boundary.
   Outline rather than fill, so the accent CTA is still the only filled button in the header. */
.nav__login{
  margin-left:.6rem;padding:.4em .8em;
  border:1px solid rgba(255,255,255,.42);border-radius:7px;
  flex-direction:column;align-items:flex-start;gap:0;line-height:1.25;
}
.nav__login:hover{border-color:rgba(255,255,255,.7)}
/* Lettered and roman sub-clauses in the licence agreement. Indented so the clause
   structure survives, which is most of what makes a legal document readable. */
.eula-sub{margin-left:1.6rem}
/* Required-field marker. Uses the semantic danger red rather than a new one -- it is the only
   red in the system and it already clears AA on white. aria-hidden on the asterisk itself:
   the input's `required` attribute is what a screen reader announces, and a literal "star"
   read out before every value is noise. */
.req{color:var(--danger);margin-left:.15em;font-weight:600}
/* The platform is switched off overnight, so the Log in link says when it answers. A door that
   is locked half the time should say so on the door, not after the handle turns. */
/* MEASURED 10 September 2026: this line failed WCAG 1.4.3. `opacity` MULTIPLIES with the alpha it
   inherits -- .nav__link is white at .82, so opacity:.62 rendered the hours at an effective .508,
   which is 4.12:1 on the navy nav and AA needs 4.5:1 at 11.2px. Setting the colour directly stops
   the compounding and lands at 5.33:1. The 9 September contrast sweep measured 34 palette pairs
   and could not have caught this: it is not a pair, it is two alphas multiplying. */
.nav__hours{display:block;font-size:var(--fs-label);letter-spacing:.06em;color:rgba(255,255,255,.62);font-weight:400}
.drawer .nav__hours{display:inline;margin-left:.35em}

/* ---------- reprinted journal tables ---------- */
/* Four of the six figures in the CCM article are tables of text rather than diagrams. Reproducing
   them the way the two drawn figures are reproduced -- as page crops -- would have put about 1,800
   words of control names, assertions and pass conditions inside images: unreadable to a screen
   reader, unselectable, and invisible to search on the subject the site has the most demand for.
   So they are marked up as tables, and this is what a table costs: no rules existed for one
   anywhere in the stylesheet before. The wrapper scrolls rather than the page, which is the rule
   `.shot` already follows for wide product crops -- the figure scrolls, never the page. */
.tablefig{overflow-x:auto}
.tablefig table{border-collapse:collapse;width:100%;min-width:620px;font-size:var(--fs-small);line-height:1.55;color:var(--body)}
.tablefig th,.tablefig td{border:1px solid var(--line-light);padding:.55rem .65rem;text-align:left;vertical-align:top}
.tablefig thead th,.tablefig tbody th{background:var(--mist);color:var(--ink);font-weight:600}
.tablefig td p{margin:0 0 .45rem}
.tablefig td p:last-child{margin-bottom:0}
/* Figure 2 marked its candidates and its roadblocks by colour alone. The tints are the measured
   semantic pairs, so the meaning survives on screen; `.vh` beside each one is what carries it to
   a reader who never sees the colour, which is 1.4.1 rather than a nicety. */
.cell--ok{background:var(--ok-tint);color:var(--ok)}
.cell--stop{background:var(--danger-tint);color:var(--danger)}
/* Visually hidden, still announced. `clip-path` rather than the old `clip` rect, and no
   `display:none` -- that would remove it from the accessibility tree, which is the one thing
   this class exists to avoid. */
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;white-space:nowrap;clip-path:inset(50%);border:0}
/* Spacing that was reaching for an inline `style=` attribute. The budget in check_styles.py only
   goes down, so a block that needs a gap gets a class. */
.panel--spaced{margin-top:2.4rem}
.fineprint--spaced{margin-top:2rem}

/* ---------- lists inside an article ---------- */
/* `ul{list-style:none;padding:0}` at the top of this file is right for the nav, the cards and
   every signal list on the site, and wrong for a page of prose: it strips the marker AND the
   indent, so a five-item list renders as five unmarked lines that run straight into the paragraph
   below. Found on the CCM article the hour it deployed. Restored for `.prose` only, so the reset
   keeps doing its job everywhere else. `ol` was never reset and is here for the matching indent
   and rhythm, not to fix anything. */
.prose ul{list-style:disc;margin:0 0 1.1em;padding-left:1.5rem}
.prose ol{margin:0 0 1.1em;padding-left:1.7rem}
.prose li{margin-bottom:.45em}
.prose li:last-child{margin-bottom:0}
