/* ==========================================================================
   gokogsy.com — shared stylesheet

   Replaced the original Specimen system on 2026-07-27. The site is now the
   "Area" layout (paper ground, oversized high-contrast serif, monospace
   micro-labels, hairline structural rules) with the edge gradient device from
   the Dreamy Band EPK reference, in teal.

   Used by: the landing page and the evidence pages. NOT used by the
   calculator, the privacy notice or the Impressum — those three are
   self-contained by design, so a change here can never break a legal page or
   the data capture. That is deliberate. Do not "tidy" it by pointing them here.

   ---------------------------------------------------------------------------
   Contrast, measured against the paper #fdfcfa rather than guessed:
     --ink   #0a0a0a  19.6:1
     --body  #3a3a3a  11.2:1
     --label #6b6b6b   5.3:1
     --acc   #0f766e   5.4:1   white on this is also 5.4:1, so the pill passes
     --deep  #115e59   7.5:1
   --sage #9db8ac is DECORATION ONLY at roughly 1.9:1. No text is set in it.
   An earlier exploration used #d2d2d2 for a ghost grey: that is 1.51:1 and it
   made part of an <h1> unreadable. Do not go lighter than --label for text.
   ---------------------------------------------------------------------------

   Zero third-party requests. One self-hosted font, below. No @import, no CDN,
   no analytics. The privacy notice states this, so breaking it makes a legal
   document untrue, and the acceptance suite asserts it on every page.
   ========================================================================== */

/* Instrument Serif, SIL Open Font License, latin subset, 21KB.
   SELF-HOSTED, NEVER HOTLINKED. A fonts.googleapis.com link would transmit
   every visitor's IP to Google before consent; that was the subject of a 2022
   Munich ruling and HG Connect UG is Munich-registered. OFL requires the
   licence notice to travel with the font if it is ever replaced. */
@font-face{
  font-family:"Instrument Serif";
  src:url("/assets/instrument-serif.woff2") format("woff2");
  font-weight:400;
  font-style:normal;
  font-display:swap;
}

:root{
  --paper:#fdfcfa;
  --ink:#0a0a0a;
  --body:#3a3a3a;
  --label:#6b6b6b;
  --acc:#0f766e;
  --deep:#115e59;
  --hair:#e3e8e6;
  --sage:#9db8ac;
  --wash:#f2f7f5;          /* faintest teal tint, for callouts and code */
  --rule:#0a0a0a;          /* structural rules are ink, not grey */

  --sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
  /* The fallbacks only show during the swap window or if the woff2 fails.
     Didot ships with macOS, Bodoni MT with Office on Windows, Georgia is the
     floor. Instrument Serif is narrower than all three. */
  --serif:"Instrument Serif","Didot","Bodoni MT","Big Caslon",Georgia,"Times New Roman",serif;

  --gut:clamp(1.25rem,5vw,5rem);
  --max:78rem;
  --measure:34rem;
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms !important;transition-duration:.001ms !important}
}

body{
  margin:0;background:var(--paper);color:var(--body);
  font-family:var(--sans);font-size:1rem;line-height:1.6;
  -webkit-font-smoothing:antialiased;overflow-x:hidden;
}
img{max-width:100%;height:auto}

.skip{
  position:absolute;left:-9999px;top:0;background:var(--ink);color:#fff;
  padding:.75rem 1.25rem;z-index:99;text-decoration:none;
}
.skip:focus{left:0;color:#fff}

/* --- the edge gradient --------------------------------------------------
   Every stop fades to a ZERO-ALPHA COPY OF ITS OWN COLOUR, never to the
   `transparent` keyword: `transparent` is rgba(0,0,0,0), so a gradient running
   to it interpolates through transparent black and lays a grey fringe across
   the falloff.

   The colour is not faint, it is pushed to the margins by the paper wash in
   ::after. That is what keeps body text on paper and the ratios above valid. */
.edge{
  position:fixed;inset:0;z-index:-1;pointer-events:none;
  background:
    radial-gradient(62% 46% at 0% -6%,   rgba(157,184,172,1)   0%, rgba(157,184,172,0) 70%),
    radial-gradient(58% 42% at 100% -4%, rgba(139,169,189,.95) 0%, rgba(139,169,189,0) 72%),
    radial-gradient(34% 62% at -6% 52%,  rgba(169,196,180,.85) 0%, rgba(169,196,180,0) 74%),
    radial-gradient(32% 52% at 106% 70%, rgba(157,184,172,.75) 0%, rgba(157,184,172,0) 74%),
    radial-gradient(52% 34% at 28% 106%, rgba(169,196,180,.6)  0%, rgba(169,196,180,0) 72%);
}
.edge::after{
  content:'';position:absolute;inset:0;
  background:radial-gradient(70% 56% at 50% 44%,
    rgba(253,252,250,1) 32%, rgba(253,252,250,0) 100%);
}

/* --- layout ------------------------------------------------------------- */
.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--gut)}
/* Evidence pages are read, not scanned, so they run to a narrower column. */
body.evidence .wrap{max-width:58rem}
.measure{max-width:var(--measure)}
section,.section{padding:clamp(3rem,8vh,5.5rem) 0 0}
.section > .wrap > :last-child{margin-bottom:0}
.rule{border:0;border-top:1px solid var(--rule);margin:0}
.hair{border:0;border-top:1px solid var(--hair);margin:0}

/* --- nav ---------------------------------------------------------------- */
header{padding:2rem 0 0}
nav{display:flex;align-items:center;justify-content:space-between;gap:2rem}
.word{display:inline-flex;align-items:center;gap:.65rem;text-decoration:none}
.word img{width:38px;height:auto;display:block}
.word span{font-size:1rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--ink)}
.navlinks{display:flex;gap:2rem;list-style:none;margin:0;padding:0}
.navlinks a{font-size:.9375rem;color:var(--ink);text-decoration:none;border-bottom:1px solid transparent;padding-bottom:2px}
.navlinks a:hover{border-bottom-color:var(--acc)}
@media (max-width:880px){.navlinks{display:none}}
@media (max-width:480px){.word img{width:32px}.word span{font-size:.875rem;letter-spacing:.12em}}

/* --- buttons ------------------------------------------------------------ */
/* Doubled 2026-07-28, on request. Every value below is exactly 2x what it was:
   .9375rem type, .85rem/1.5rem padding, .5rem gap.

   Two notes for whoever tunes this next.

   The calculator's Continue and Send it buttons are NOT affected. That page is
   self-contained and carries its own .btn, which is the point of the rule that
   the calculator, the privacy notice and the Impressum never load this
   stylesheet: a change here cannot reach the conversion surface or a legal page.

   The doubling is for standalone CTA pills only. The navigation pill shares
   this class and is exempted below, because at 2x it turned an 86px header into
   a 182px one on every evidence page and pushed the h1 down with it. */
.pill,.btn{
  display:inline-flex;align-items:center;gap:.6rem;
  background:var(--acc);color:#fff;text-decoration:none;
  font-size:1.125rem;font-weight:600;padding:1.02rem 1.8rem;
  border-radius:999px;transition:background .15s ease;
}
/* THE HERO PILL KEEPS THE FULL SIZE. Everything else is 0.6x of it.
   Exactly one call to action on this site is allowed to be loud, and it is the
   one under "Nobody bills for the paperwork." Every other pill is a way onward
   from a page somebody is already reading, and at full size they competed with
   the hero instead of supporting it.

   Scoped to .hero-row, which exists only on the landing page. If a second hero
   ever appears, this rule follows it — decide then whether that is what you
   want, because two loud pills is the thing this split exists to prevent. */
.hero-row .pill,.hero-row .btn{
  font-size:1.875rem;padding:1.7rem 3rem;gap:1rem;
}
/* Scoped to `nav` rather than `header` on purpose: on the landing page the hero
   pill sits inside <header> but outside <nav>, so a `header .pill` exemption
   would shrink the one pill this change exists to enlarge. */
nav .pill,nav .btn{
  font-size:.9375rem;padding:.85rem 1.5rem;gap:.5rem;
}
.pill:hover,.btn:hover{background:var(--deep);color:#fff}
.btn-quiet{
  display:inline-block;font-family:var(--mono);font-size:.8125rem;letter-spacing:.08em;
  text-transform:uppercase;color:var(--deep);text-decoration:none;
  border-bottom:1px solid var(--hair);padding-bottom:.2rem;
}
.btn-quiet:hover{border-bottom-color:var(--acc)}
.btn-outline{
  display:inline-flex;align-items:center;gap:.45rem;
  border:1px solid var(--acc);color:var(--deep);text-decoration:none;
  font-size:.9375rem;padding:.7rem 1.35rem;border-radius:999px;background:transparent;
}
.btn-outline:hover{background:var(--acc);color:#fff}
.btn-outline .ext{color:inherit}

/* --- type --------------------------------------------------------------- */
h1{
  font-family:var(--serif);font-size:clamp(2.9rem,10.5vw,9rem);
  line-height:.92;letter-spacing:-.025em;font-weight:400;color:var(--ink);margin:0;
}
h1 .out{color:transparent;-webkit-text-stroke:1.5px var(--acc);paint-order:stroke fill}
h1 .acc{color:var(--acc)}
/* Below 640px the stroke reads spidery against a small cap height. */
@media (max-width:640px){h1 .out{color:var(--acc);-webkit-text-stroke:0}}

/* Evidence headlines are questions somebody typed into a search box, so they
   want to be read rather than admired. At the landing page's display size a
   question-shaped headline ran to six lines and pushed the answer below the
   fold, on the pages most likely to be landed on cold from search. */
body.evidence h1{font-size:clamp(2.2rem,5.6vw,4.2rem);line-height:1.02;margin:0 0 1.25rem;max-width:22ch}

h2{
  font-family:var(--serif);font-weight:400;font-size:clamp(2.1rem,5.4vw,4rem);
  line-height:1.02;letter-spacing:-.02em;color:var(--ink);margin:0 0 1.5rem;
}
body.evidence h2{font-size:clamp(1.75rem,3.6vw,2.6rem);max-width:20ch}
h3{font-family:var(--serif);font-weight:400;font-size:1.375rem;line-height:1.25;color:var(--ink);margin:2rem 0 .65rem}

p{margin:0 0 1.15rem;max-width:var(--measure)}
ul,ol{max-width:var(--measure)}
.lede{
  font-size:clamp(1.0625rem,1.9vw,1.375rem);line-height:1.45;
  color:var(--ink);max-width:var(--measure);margin:0 0 1.15rem;
}
/* The direct answer on a cost-library page. Set apart from the body because it
   is the 40-to-70 words that have to survive being quoted on their own in a
   search result, and a reader who only reads one paragraph should be reading
   this one. Deliberately not .lede: a lede introduces what follows, and this
   answers the question outright. */
.answer{
  font-size:clamp(1.0625rem,1.9vw,1.3125rem);line-height:1.5;
  color:var(--ink);max-width:var(--measure);
  margin:0 0 2rem;padding-left:1.1rem;border-left:3px solid var(--acc);
}
a{color:var(--deep)}
a:hover{color:var(--acc)}

.mark{
  font-family:var(--mono);font-size:.75rem;letter-spacing:.14em;
  text-transform:uppercase;color:var(--acc);margin:0 0 1.25rem;
  display:block;max-width:none;   /* structural: must span the column */
}
.mark b{font-weight:400}

.tick{
  display:flex;flex-wrap:wrap;gap:.5rem 1.5rem;margin:2.5rem 0 1.75rem;
  font-family:var(--mono);font-size:.75rem;letter-spacing:.12em;
  text-transform:uppercase;color:var(--label);max-width:none;
}
.tick .now{color:var(--acc)}
.tick a{color:inherit;text-decoration:none}
.tick a:hover{color:var(--acc)}

.dateline{
  font-family:var(--mono);font-size:.75rem;letter-spacing:.06em;color:var(--label);
  margin:0 0 2.5rem;padding-bottom:1rem;border-bottom:1px solid var(--hair);max-width:none;
}

.hero-row{display:flex;flex-wrap:wrap;align-items:flex-start;gap:1.5rem 3rem;margin:2.5rem 0 0}
.hero-row p{margin:0}

/* --- plates: where the landing page puts its three facts ---------------- */
.plates{
  display:grid;grid-template-columns:repeat(3,1fr);
  margin-top:clamp(3rem,6vw,4.5rem);border-top:1px solid var(--rule);
}
.plates > div{padding:1.75rem 1.5rem 0 0;display:flex;flex-direction:column}
.plates b{
  font-family:var(--mono);font-size:.75rem;font-weight:400;letter-spacing:.06em;
  line-height:1.7;color:var(--label);text-transform:uppercase;order:2;margin-top:.9rem;
}
.plates em{
  font-style:normal;font-family:var(--serif);font-variant-numeric:tabular-nums;
  font-size:clamp(2.6rem,6vw,4.5rem);line-height:1;color:var(--ink);order:1;
}
.plates .is-acc em{color:var(--acc)}
@media (max-width:700px){
  .plates{grid-template-columns:1fr}
  .plates > div{border-bottom:1px solid var(--hair);padding-bottom:1.5rem}
}

/* --- hero device + plate ------------------------------------------------ */
.plate{position:relative;margin-top:clamp(3rem,7vw,5.5rem)}
.plate::before{
  content:'';position:absolute;z-index:0;
  left:clamp(-3rem,-4vw,-1.5rem);right:16%;top:36%;bottom:clamp(-3rem,-4vw,-1.5rem);
  background:var(--sage);border-radius:16px;
}
.device{
  position:relative;z-index:1;background:#141715;
  border-radius:clamp(12px,1.4vw,20px);padding:clamp(.4rem,.75vw,.8rem);
  box-shadow:0 34px 70px -34px rgba(8,48,43,.55);
}
/* 16:10, a real laptop panel ratio. The old 1495/1052 came from a Figma
   mockup and read slightly wrong inside a bezel. */
.device-screen{aspect-ratio:2865/1791;border-radius:clamp(7px,.9vw,12px);overflow:hidden}
.device-screen img{width:100%;height:100%;object-fit:cover;display:block}

/* --- images -------------------------------------------------------------
   Aspect ratios come from each file's own pixel dimensions rather than tidy
   4/5 and 21/7 values. These sources are small; cropping to a nominal ratio
   would throw away pixels there is no spare supply of. */
/* The stock photography replaced the Figma template's on 2026-07-27. Ratios
   below come from the shipped files: ridge is cropped to 2.35:1, stone to the
   portrait the split column wants, and leaf keeps its native 3.57:1 panorama
   because cropping a panorama into a box is what wastes it. */
.shot{border-radius:14px;overflow:hidden;margin-top:clamp(3rem,6vw,4.5rem)}
.shot--wide{aspect-ratio:2208/940}   /* ridge, cinematic crop  */
.shot--tall{aspect-ratio:878/1009;border-radius:12px}  /* stone, portrait */
.shot--band{aspect-ratio:1440/404}   /* leaf, native panorama  */
.shot img{width:100%;height:100%;object-fit:cover;display:block}

.split{
  display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);
  gap:clamp(2rem,5vw,4.5rem);align-items:center;
}
.split .shot{margin-top:0}
@media (max-width:880px){
  .split{grid-template-columns:1fr}
  .split .shot{max-width:22rem}
}

/* --- callouts and blockers ---------------------------------------------- */
.callout{
  background:var(--wash);border-left:3px solid var(--acc);
  padding:1.25rem 1.5rem;margin:0 0 1.6rem;max-width:var(--measure);
  border-radius:0 4px 4px 0;
}
.callout > :last-child{margin-bottom:0}
/* Deliberately ugly. It marks an unfilled blank and must never survive to a
   deploy; the scan page was pulled from production because two of these were
   still visible. */
.todo{
  background:#fff5f0;border-left:3px solid #8a3a12;padding:1rem 1.2rem;
  margin:0 0 1.6rem;color:#8a3a12;font-size:.8125rem;max-width:var(--measure);
}
.todo b{display:block;font-family:var(--mono);text-transform:uppercase;
        letter-spacing:.12em;font-size:.6875rem;margin-bottom:.3rem}

/* --- tables and code ---------------------------------------------------- */
table{width:100%;max-width:44rem;border-collapse:collapse;margin:0 0 1.8rem;
      font-size:.9375rem;border-top:1px solid var(--rule)}
th,td{text-align:left;vertical-align:top;padding:.7rem .9rem .7rem 0;border-bottom:1px solid var(--hair)}
th{font-family:var(--mono);font-size:.6875rem;letter-spacing:.12em;
   text-transform:uppercase;color:var(--label);font-weight:400}
/* Tabular numerals so figures line up column-wise. This site is mostly figures. */
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:600;color:var(--ink)}
caption{text-align:left;color:var(--label);font-size:.8125rem;padding-bottom:.7rem}

pre{
  background:var(--wash);border-left:3px solid var(--sage);
  padding:1.1rem 1.3rem;overflow-x:auto;margin:0 0 1.8rem;max-width:44rem;
  font-family:var(--mono);font-size:.8125rem;line-height:1.7;color:var(--ink);
  border-radius:0 4px 4px 0;
}
code{font-family:var(--mono);font-size:.9em;color:var(--deep)}
pre code{color:inherit;font-size:inherit}

/* A table wide enough to need scrolling must scroll ITSELF. body has
   overflow-x:hidden, which on a narrow screen silently clips an overflowing
   table instead of letting the reader reach the last column. Clipped evidence is
   worse than no table. Wrap any multi-column table in this. */
.table-scroll{overflow-x:auto;margin:0 0 1.8rem;max-width:44rem}
.table-scroll table{margin:0}

/* --- disclosure --------------------------------------------------------- */
/* Used on the scan page for the full search-query list: material that has to be
   published for the page to be checkable, but would bury the argument if it ran
   inline at full length.

   Note for anyone adding one of these: a CLOSED <details> is invisible to
   innerText, so its contents are not swept by the banned-claims check unless
   suite/debug.js adds them explicitly. It does. Do not remove that. */
details{
  border-top:1px solid var(--hair);border-bottom:1px solid var(--hair);
  margin:0 0 1.8rem;max-width:var(--measure);
}
summary{
  cursor:pointer;padding:.9rem 0;font-family:var(--mono);
  font-size:.6875rem;letter-spacing:.12em;text-transform:uppercase;
  color:var(--label);
}
summary:hover{color:var(--acc)}
summary:focus-visible{outline:2px solid var(--acc);outline-offset:3px}
details[open] summary{border-bottom:1px solid var(--hair);margin-bottom:1.1rem}
details ol{font-size:.875rem;line-height:1.65;padding-left:1.6rem}
details ol li{margin-bottom:.45rem;font-family:var(--mono);word-break:break-word}
details > p strong{font-family:var(--sans)}

/* --- the cost-library rail ---------------------------------------------
   A native horizontal scroller for the eight cost pages on the landing page.
   Deliberately NOT a carousel widget: no autoplay, no slide state, no ARIA
   carousel pattern. It is a list that happens to scroll sideways, which is why
   it survives with JavaScript off and why a screen reader just reads eight
   links.

   max-width:none is REQUIRED and is not a tidy-up. styles.css caps `ul` at
   var(--measure) for reading comfort; inherited here it would strangle the
   track to reading width and destroy the peek that tells people it scrolls. */
.rail{
  list-style:none;margin:0;padding:0 0 1.25rem;max-width:none;
  display:grid;grid-auto-flow:column;
  grid-auto-columns:clamp(15rem,72vw,21rem);
  gap:1rem;
  overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x proximity;
  scrollbar-width:thin;
}
.rail > li{scroll-snap-align:start;display:flex}
.rail .cell{width:100%}
/* Doubled from the shared .cell h3 size of 1.375rem, on request. Scoped to the
   rail: the parts-bin cards in the last block keep 1.375rem, because they are a
   dense three-up index rather than the thing the reader is meant to stop on.
   max-width:20ch is dropped here — at this size it computes wider than the card
   itself, so it would do nothing but confuse the next person who reads it. */
.rail .cell h3{font-size:2.75rem;line-height:1.08;max-width:none;margin-bottom:.85rem}
/* No scroll-behavior rule here, deliberately. The first version set smooth
   above 900px and auto under prefers-reduced-motion, and both were dead code:
   the arrow script is the only thing that scrolls this element programmatically
   and it passes an explicit `behavior` to scrollBy, which overrides CSS. The
   script reads prefers-reduced-motion itself.

   Worth knowing if you ever debug this: `html{scroll-behavior:smooth}` above
   means a programmatic scroll is ANIMATED, so reading .scrollLeft back on the
   next line returns the OLD value. That looks exactly like "the rail refuses to
   scroll" and it cost half an hour. Set scrollBehavior:'auto' on the element
   before measuring. */

.rail-foot{
  display:flex;align-items:center;justify-content:space-between;
  gap:1rem 1.25rem;flex-wrap:wrap;max-width:none;
}
.rail-ctrl{display:flex;gap:.5rem}
.rail-ctrl button{
  width:2.75rem;height:2.75rem;border-radius:999px;cursor:pointer;
  border:1px solid var(--acc);background:transparent;color:var(--deep);
  font-size:1rem;line-height:1;display:grid;place-items:center;
  transition:background .15s ease,color .15s ease;
}
.rail-ctrl button:hover:not(:disabled){background:var(--acc);color:#fff}
.rail-ctrl button:disabled{opacity:.3;cursor:default}
.rail-ctrl button:focus-visible{outline:2px solid var(--acc);outline-offset:3px}

/* --- the paid offer, on the sprint page ---------------------------------
   The formal offer name, set apart from the heading. It exists so that the
   string a buyer sees here is character-identical to the one on the Google
   appointment schedule, the Stripe receipt and the calendar invite. */
.offer-name{
  font-family:var(--mono);font-size:.8125rem;letter-spacing:.06em;
  color:var(--acc-ink,var(--deep));margin:0 0 1.4rem;
}
/* Buyer, inputs and the data boundary, immediately above the payment CTA.
   Boxed because it is the block someone scanning for "is this me" needs to
   find without reading the section around it. */
.fitbox{
  background:var(--wash);border-left:3px solid var(--acc);
  padding:1.1rem 1.25rem;margin:0 0 1.8rem;max-width:var(--measure);
  border-radius:0 4px 4px 0;
}
.fitbox p{margin:0 0 .6rem;font-size:.9375rem}
.fitbox p:last-child{margin-bottom:0}

/* --- hairline lists ----------------------------------------------------- */
.sources{list-style:none;padding:0;margin:0 0 1.8rem;max-width:var(--measure);
         border-top:1px solid var(--hair)}
.sources li{padding:.85rem 0;border-bottom:1px solid var(--hair);font-size:.9375rem}
.sources strong{color:var(--ink)}

/* --- FAQ, rendered visibly ----------------------------------------------
   These questions used to exist only inside FAQPage JSON-LD. Google's
   structured data policy prohibits markup-only FAQ content outright, and it is
   a manual-action risk rather than a soft signal. Rendering them was the good
   outcome anyway: they were already written, and they target the exact
   operator queries these pages want to answer.
   KEEP THE VISIBLE TEXT AND THE JSON-LD IN SYNC. If one changes, change both,
   or the markup misrepresents the page again. */
.faq{margin-top:clamp(2rem,4vw,3rem);border-top:1px solid var(--rule)}
.faq > div{border-bottom:1px solid var(--hair);padding:1.5rem 0}
.faq h3{font-size:1.1875rem;line-height:1.3;margin:0 0 .6rem}
.faq p{margin:0;font-size:.9375rem}

/* --- parts bin ---------------------------------------------------------- */
.bin{display:grid;grid-template-columns:repeat(2,1fr);gap:0 2.5rem;margin-top:clamp(2.5rem,5vw,3.5rem)}
.cell{display:flex;flex-direction:column;text-decoration:none;color:inherit;
      border-top:1px solid var(--rule);padding-top:1.5rem}
.cell .lab{font-family:var(--mono);font-size:.75rem;letter-spacing:.1em;
           text-transform:uppercase;color:var(--label);margin:0 0 .9rem}
.cell h3{font-family:var(--serif);font-weight:400;font-size:1.375rem;line-height:1.2;
         color:var(--ink);margin:0 0 .65rem;max-width:20ch}
.cell p{font-size:.9375rem;color:var(--body);margin:0 0 1.1rem}
.cell .go{margin-top:auto;font-family:var(--mono);font-size:.75rem;letter-spacing:.08em;
          text-transform:uppercase;color:var(--deep)}
.cell:hover h3{color:var(--acc)}
.cell:hover .go{color:var(--acc)}
@media (max-width:700px){.bin{grid-template-columns:1fr;gap:2.5rem}}

/* --- footer ------------------------------------------------------------- */
/* Provenance line at the foot of the method page. Quieter than body prose and
   separated by a hairline rather than a structural rule, because it points at
   where the method came from and is not part of the argument the page makes.
   Never a pill: section 07's calculator CTA stays the last thing that asks the
   reader to do anything. */
.kin-note{
  margin-top:clamp(2.25rem,4vw,3rem);padding-top:1.25rem;
  border-top:1px solid var(--hair);
  max-width:44rem;font-size:.9375rem;color:var(--label);
}

.legal{margin-top:clamp(4.5rem,10vh,8rem);border-top:1px solid var(--rule)}
.legal .wrap{
  display:flex;flex-wrap:wrap;gap:.75rem 2rem;justify-content:space-between;align-items:center;
  padding-top:1.75rem;padding-bottom:3rem;
  font-family:var(--mono);font-size:.75rem;letter-spacing:.05em;color:var(--label);
}
.legal a{color:var(--deep);text-decoration:none}
.legal a:hover{color:var(--acc)}

/* The kogsy.ai attribution line. It takes a full-width row of its own beneath
   the legal links rather than joining them: as a flex sibling, a whole sentence
   competes with four short links for horizontal space and wraps raggedly at
   every breakpoint.

   It inherits the footer's family, size, letter-spacing and colour, so it
   cannot read as a call to action. The calculator pill stays the only primary
   action on every page. The link is underlined only because it sits inside a
   sentence: the bare colour shift that works for a row of standalone links is
   not an affordance mid-prose. */
.legal .kin{flex:1 0 100%;margin:.9rem 0 0;max-width:44rem;color:var(--label)}
.legal .kin a{text-decoration:underline;text-underline-offset:.18em}

a:focus-visible,.pill:focus-visible,.btn:focus-visible,.cell:focus-visible{
  outline:2px solid var(--acc);outline-offset:3px;border-radius:2px;
}
