/* ------------------------------------------------------------------
   Margret Miller ... landing and checkout.

   Section shapes are ported from the Frank Miller build (hero, stats
   bar, offer, dark "what is inside" band, about, FAQ, closing CTA) with
   the Angus refinements on top: the offer detail is one bordered
   container, the main book leads inside it as a card, and the two free
   books carry a solid green FREE badge and a tick.

   Still absent by rule: star ratings, reader counts and countdowns. If a
   class for one of those is not here, that is why. Per-book prices and a
   struck total ARE here: they were added on request and deliberately
   reverse the earlier no-anchor rule.

   Loads on top of styles.css, which holds the palette.
------------------------------------------------------------------ */

/* ---------- image slots ---------- */
/* The photographs are not shot yet. Each frame carries a visible slot
   underneath naming the file it wants; the <img> sits on top and
   removes itself if the file is missing,so the slot shows through and
   the page cannot quietly ship with a broken image. */
.shot{position:relative;background:var(--deep);overflow:hidden;border-radius:3px}.shot img{width:100%;height:100%;object-fit:cover;display:block;position:relative;z-index:2}.shot .slot{
  position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;padding:1rem;
  border:2px dashed var(--line-strong);color:var(--ink-mute);
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.1em;font-size:.68rem;
}.shot .slot code{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:none;letter-spacing:0;
  font-size:.72rem;color:var(--ink-soft);margin-top:.4rem;
}


/* ---------- masthead ----------
   A 8.48:1 strip cut from the 3840x1648 render, centered on the baked
   wordmark, then scaled to 2240x264. Band height is derived, not picked:
   170px is exactly the strip's own height at a 1440px viewport, so at that
   width `cover` shows the full strip with no crop and the wordmark renders
   at ~41px. Wider viewports crop top and bottom only, and the wordmark is
   vertically centered, so it always survives.

   The mobile height is per-site: below the strip's natural width `cover`
   crops horizontally instead, so the band has to stay short enough that the
   wordmark's right edge is still on screen at 360px. That limit differs per
   render because each wordmark is a different length.

   Lettering is part of the artwork; the accessible name is the hidden span
   in the link. No radius, no shadow. */
/* SET BAND,not a placeholder. There is no photograph for this shop,so the
   band is set instead: deep ink ground with a soft off-center bloom,the
   wordmark centered,a thin accent rule beneath it. NOTHING IS DRAWN IN IT.

   An earlier revision put a line-art illustration here - luggage tags,boarding passes,aircraft,tiled and then composed. It is gone,markup and
   all. Elias's dark fields carry no motif; the depth comes from blurred
   discs bleeding in from the corners,and that is what is here now. See the
   bloom block directly below .masthead.

   --ink rather than --ink-deep on purpose. The urgency strip directly above
   is --sage-dark (#0A1D31) and --ink-deep is the same value,so the two would
   read as one dark mass; --ink (#14304F) is one step up and the band reads as
   its own. Cream on it is 11.89 : 1.

   --accent-lift for the rule,not --accent: --accent is the oxblood #7A1F0E
   and measures 1.30 : 1 on #14304F. --accent-lift is the palette's own answer
   to "the accent on a dark band" - the brass #E0B458 here, not the reference
   shop's teal - and is 6.92 : 1 there. The conclusion is the reference's own;
   only the two hexes and the two figures are this shop's.

   TO SWAP IN THE REAL IMAGE (2240 x 264) LATER,WITHOUT TOUCHING THE LAYOUT:
   add background-image/background-size:cover here,set .masthead-mark to
   display:none and drop the two ::before/::after blooms. Height,full bleed
   and the whole-band home link do not move,so nothing below the band shifts
   by a pixel. */
.masthead{
  position:relative;
  width:100%;
  height:170px;
  /* The urgency strip is a fixed overlay and takes no layout space, so it
     lands on the top of this band. Reserving its height here keeps the
     wordmark centered in what is actually visible. Global box-sizing is
     border-box, so the band is still exactly 170px tall and nothing
     below it moves. */
  padding-top:var(--urg-h,0px);
  background:var(--ink);
  display:flex;align-items:center;justify-content:center;
  overflow:hidden;
}
/* ---------- the bloom, on both dark fields ----------
   The line-art illustration that used to sit here is gone - markup, symbols,
   <use> references, scrim and mask, all of it. Elias's dark fields carry no
   motif at all; his .order is a near-black ground with two blurred discs
   bleeding in from opposite corners, and that soft depth is what makes the
   field read as finished rather than flat.

   His structure, measured on his live page and identical at 1440 and 390:

     .order::before, .order::after
        700 x 700, border-radius 50%, filter blur(80px), opacity .4
     .order::before   his oxblood, top -200px, left -200px
     .order::after    his sage-dark, bottom -300px, right -200px

   Ported at those exact values on .lastcall, and scaled to the band on
   .masthead - see there. Every position, size, radius, blur and opacity is
   his. Only the colors are ours: the warm corner where his oxblood sits,
   the cool one where his sage-dark sits.

   THE WARM DISC IS MIXED, NOT RAW --signal, AND THAT IS THE CONVERSION.
   His oxblood #7A1F0E is a dark brick; at .4 over his #15110B it lifts the
   ground by +40 red and almost nothing else. Our --signal #C63328 is a much
   brighter red, and at the same .4 over our lighter ground it lifts by +75 -
   nearly twice his, and it reads as a red wash across a third of the field
   rather than a bloom. color-mix(--signal 45%, --ink-deep) = #5D4313, which
   at his .4 lifts by +34: his effect, our token, his opacity untouched.

   The cool disc needs no such correction - --accent at .4 lifts by
   [2,19,20] against his sage-dark's [10,17,11], near enough.

   Both hosts already carry position:relative and overflow:hidden, which is
   what keeps the discs from spilling out of the field. */
.lastcall::before,.lastcall::after{
  content:"";position:absolute;border-radius:50%;pointer-events:none;
  opacity:.4;width:700px;height:700px;filter:blur(80px);
  background:color-mix(in srgb,var(--signal) 45%,var(--ink-deep));
}
@supports not (background:color-mix(in srgb,red 45%,blue)){
  /* the same mix, flattened */
  .lastcall::before{background:#5D4313}
}.lastcall::before{top:-200px;left:-200px}.lastcall::after{background:var(--accent);bottom:-300px;right:-200px}

/* THE MASTHEAD HAS NO BLOOM. It had one for exactly one revision and it was
   the wrong answer: Margret's band is a rendered illustration served as an
   image file, and this shop needs the same. What sits here now is the
   placeholder for it, in the same .ph treatment styles.css already gives the
   hero image placeholder. The Last Call keeps its bloom - that block is
   Elias's field, not a picture. */
/* The band image: full bleed at inset 0,cover-cropped,under the wordmark. */
.masthead-img{position:absolute;inset:0;z-index:1;display:block}.masthead-img img{width:100%;height:100%;object-fit:cover;display:block}

/* The wordmark sits above whichever of the two is present. */
.masthead-mark{z-index:2}.masthead-mark{
  position:relative;z-index:2;pointer-events:none;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:.7rem;
}.masthead-word{
  font-family:var(--display);font-weight:600;text-transform:uppercase;
  font-size:2.1rem;line-height:1;letter-spacing:.34em;color:var(--paper);
  /* the tracking adds a trailing gap after the last letter; pull it back so
     the wordmark is optically centered rather than mathematically centered */
  margin-right:-.34em;
}
/* Short rule, not a full-width one: it belongs to the wordmark. */
.masthead-mark::after{
  content:"";display:block;width:5.5rem;height:2px;background:var(--accent-lift);
}
@media (max-width:767.98px){.masthead-mark{gap:.5rem}.masthead-word{font-size:1.15rem;letter-spacing:.26em;margin-right:-.26em}.masthead-mark::after{width:3.5rem}
}
/* The band itself is the home link. */
.masthead-home{position:absolute;inset:0;z-index:1;display:block}.masthead-home:focus-visible{outline:3px solid #F5F2EA;outline-offset:-6px}.visually-hidden{
  position:absolute;width:1px;height:1px;margin:-1px;padding:0;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);
  white-space:nowrap;border:0;
}
@media (max-width:767.98px){
  /* The band was 80px here and the mobile strip is 65px, so reserving the
     overlay out of 80 leaves 15px and clips the wordmark. The 80px is the
     VISIBLE band, so the strip's height is added rather than taken out of
     it. Desktop is different on purpose: there the 170px is the whole
     band, overlay included, and 110px of it stays visible. */
  .masthead{height:calc(80px + var(--urg-h,0px))}
}


/* ---------- hero ---------- */
.hero{padding:2.8rem 0 1.6rem}.hero-in{display:grid;grid-template-columns:56fr 44fr;grid-template-areas:"text img";column-gap:2.6rem;align-items:start}.hero-text{grid-area:text;display:flex;flex-direction:column;align-items:flex-start}.hero-media{grid-area:img;justify-self:center;width:100%;max-width:24rem}
/* The hero is a photograph again, so the frame comes back: tile behind, a
   hairline rule and a little padding, which is what stops a rectangular
   photo from looking pasted onto the paper. No fixed aspect ratio, the
   width/height attributes reserve the space instead. */
/* THE HERO IMAGE HAD TWO EDGES AND NOW HAS ONE.
   `.hero-frame` was a card: a --tile ground, a 1px --line border, a 3px
   radius and a .7rem mat, with the photograph sitting inside it. On a
   --paper page that mat is six units off the ground it sits on, so it never
   read as a mat - it read as a second frame drawn just inside the first,
   with the photograph's own hard edge as a third line.

   THE IMAGE IS THE CARD, which is the principle section 04's page strip
   already states in this file and applies to its own five tiles. The
   ground, the border and the mat come off .hero-frame, which is now a
   pass-through, and the one edge that remains is on the image: the same
   1px --line rule and the frame's own 3px radius, so the silhouette does
   not move. Nothing else about the hero changes - the column, the cap and
   the three grid ratios are untouched. */
.hero-frame{background:none;border:0;border-radius:0;padding:0}.hero-photo{display:block}.hero-photo img{width:100%;height:auto;display:block;border:1px solid var(--line);border-radius:3px}.hero h1{max-width:16ch;margin-bottom:.9rem}.best{font-family:"Lora",Georgia,serif;font-weight:400;font-size:1.06rem;line-height:1.62;color:var(--ink-soft);max-width:42ch;margin:1.1rem 0 1.6rem}.hero-points{list-style:none;margin:.2rem 0 1.3rem;padding:0;max-width:36ch}.hero-points li{
  position:relative;padding:.42rem 0 .42rem 2rem;
  font-family:"Lora",Georgia,serif;font-size:1.06rem;line-height:1.4;color:var(--ink);
}
/* Filled disc with a knocked-out tick, the shape the Angus Douglas hero
   uses. Green rather than oxblood on purpose: this is a "you get this"
   mark, not a second call to action. */
.hero-points li::before{
  content:"";position:absolute;left:0;top:.5rem;
  width:1.2rem;height:1.2rem;border-radius:50%;background:var(--free-green);
}.hero-points li::after{
  content:"";position:absolute;left:.35rem;top:.85rem;
  width:.48rem;height:.25rem;
  border-left:2px solid var(--paper);border-bottom:2px solid var(--paper);
  transform:rotate(-45deg);
}
/* In the hero the pill sits on paper, so it takes the tile fill to separate.
   In the offer column it already sits on tile and keeps the paper fill. */
.top-cta{margin-top:0}.cta-note{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.14em;
  font-size:.62rem;color:var(--ink-mute);margin:.9rem 0 0;
}

/* guarantee badge */
.assure{margin-top:1rem;display:flex;flex-direction:column;align-items:flex-start;gap:.5rem}.badge{
  display:inline-flex;align-items:center;gap:.6rem;
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.09em;font-size:.72rem;
  color:var(--sage);border:2px solid var(--sage);border-radius:999px;
  padding:.6rem 1.2rem;background:rgba(154,111,31,.06);
}.badge svg{width:1.15rem;height:1.15rem;flex:none;fill:currentColor}.badge svg .tick{stroke:var(--paper);fill:none}.assure-sub{font-size:.85rem;color:var(--ink-mute);margin:0}

/* ---------- stats bar ---------- */
.statsbar{padding:0 0 1.6rem}.hero-stats{
  display:grid;grid-template-columns:repeat(3,1fr);
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:.75rem 0;
}.hs{padding:0 1rem;text-align:center}.hs + .hs{border-left:1px solid var(--line)}.hs b{display:block;font-family:var(--display);font-weight:700;font-size:1.65rem;line-height:1;color:var(--accent)}.hs span{
  display:block;font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.12em;
  font-size:.53rem;color:var(--ink-mute);margin-top:.35rem;
}

/* ---------- offer ---------- */
.offer{border-top:1px solid var(--line);padding-top:2.6rem}.offer-top{display:flex;gap:2rem;align-items:flex-start;margin-bottom:1.8rem}
@media (max-width:620px){.offer-top{gap:1.1rem}
  }.offer-h{font-size:2.7rem;line-height:1.05;margin-bottom:.8rem}.offer-lede{font-size:1.02rem;color:var(--ink-soft);max-width:46ch}.offer-grid{display:grid;grid-template-columns:1fr 1fr;gap:2.6rem;align-items:start}
/* Same cutout in the offer block. No frame here either, and the drop shadow
   is what makes it read as standing on the page rather than pasted onto it. */
.offer-shot picture{display:block}.offer-shot img{
  width:100%;height:auto;display:block;
  filter:drop-shadow(0 16px 24px rgba(8,14,29,.26));
}

/* The whole right column is one bordered container: the three books, the
   price and the guarantee all inside the same rule, which is the Angus
   arrangement. */
.offer-detail h3{font-size:1.9rem;margin-bottom:.6rem}.offer-detail > p{font-size:1rem;color:var(--ink-soft)}

/* ---------- order block ----------
   Values lifted from the live frankmillerbutcher.com stylesheet so the two
   blocks are identical apart from the words. His --oxblood/--steel/--money/
   --line/--ink resolve to the same hexes as her --accent/--ink-mute/
   --free-green/--line/--ink, and his "Oswald" is her --ui, so the mapping is
   one-to-one. No wrapping box, no lead card, hairline rules between rows. */
.price-row{
  display:flex;align-items:baseline;gap:.9rem;flex-wrap:wrap;
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  padding:.7rem 0;margin:.9rem 0;
}.offer-detail .btn-row{margin-top:.6rem}.p-now{font-family:var(--ui);font-size:2.8rem;line-height:1;color:var(--accent)}.p-was{font-size:1.05rem;color:var(--ink-mute);text-decoration:line-through}.stack-head{
  font-family:var(--ui);text-transform:uppercase;letter-spacing:.16em;
  font-size:.68rem;color:var(--accent);margin-bottom:.25rem;
}.stack{list-style:none;padding:0;margin:0}.stack li{
  display:flex;justify-content:space-between;gap:1.5rem;
  padding:.42rem 0;border-bottom:1px solid var(--line);
  font-size:.95rem;line-height:1.35;
}.stack li b{font-weight:700}.stack li em{font-style:normal;font-family:var(--ui);color:var(--ink-mute);white-space:nowrap}.stack li em.free s{color:var(--ink-mute);opacity:.7;margin-right:.5rem}.stack li em.free i{
  font-style:normal;display:inline-block;background:var(--free-green);color:#fff;
  text-transform:uppercase;letter-spacing:.1em;font-size:.8rem;font-weight:600;
  padding:.2rem .6rem;border-radius:3px;
}.stack li .lead-tag{
  display:inline-block;background:var(--accent);color:#fff;font-family:var(--ui);
  text-transform:uppercase;letter-spacing:.1em;font-size:.56rem;
  padding:.14rem .45rem;border-radius:2px;margin-right:.5rem;vertical-align:.1em;
}
/* The .row-tag / .row-tag-main / .row-tag-part rules lived here. Deleted in
   the seventh revision set together with the THE MAIN BOOK pill: Elias has no
   row badges at all, and PART ONE went with its row in the fifth set. Nothing
   else used them, so they are gone rather than left inert. --signal is still
   in use - the strip's timer plate and pulse dot. */
/* Green tick per included item,so the block reads as a list of things you
   get rather than a price table. Same green as the FREE pill and the same
   circle as the hero bullets. The total row is not an item,so no tick. */


.stack li.total{padding-left:0}.stack li.total::before,.stack li.total::after{content:none}.stack li.total{
  border-bottom:none;border-top:2px solid var(--ink);margin-top:.2rem;padding-top:.65rem;
  font-family:var(--ui);text-transform:uppercase;letter-spacing:.06em;
}.stack li.total em{color:var(--ink)}

/* ---------- bonus rows ----------
   The live Senior Flyer's treatment, ported to palette A: a badge, the
   name, the value in italic. Grid rather than flex so the badge column,
   the name column and the value column line up between the two rows the
   way they do on the live site, and dashed rules rather than solid so the
   block reads as an addendum to the stack rather than more of it. */
.bonus-rows{
  margin-top:.55rem;padding-top:.55rem;
  border-top:1px dashed var(--line-strong);
}.bonus-row{
  display:grid;grid-template-columns:auto 1fr auto;gap:.7rem;
  align-items:center;padding:.5rem 0;
  font-size:.95rem;line-height:1.35;
}.bonus-row + .bonus-row{border-top:1px dashed var(--line)}.bonus-tag{
  display:inline-block;background:var(--gold);color:var(--ink-deep);
  font-family:var(--ui);font-weight:700;text-transform:uppercase;
  letter-spacing:.08em;font-size:.6rem;line-height:1;
  padding:.32rem .5rem;border-radius:4px;white-space:nowrap;
}.bonus-nm b{font-weight:700}
/* Italic, and the same ink as every other figure in the stack, so the
   bonus value does not out-shout the three real prices above it. */
.bonus-vl{
  font-style:italic;font-family:var(--body);
  color:var(--ink-mute);white-space:nowrap;font-size:.9rem;
}
@media (max-width:900px){.bonus-row{grid-template-columns:auto 1fr;row-gap:.2rem}.bonus-vl{grid-column:2;justify-self:start}
}

/* The second divider of the offer box: bonuses above, the four checkmarks
   below. Same dashed hairline as the one over the bonuses, so the three
   blocks read as three blocks. Overrides the plain margin in styles.css. */
.offer-detail .offer-checks{
  margin-top:.75rem;padding-top:.85rem;
  border-top:1px dashed var(--line-strong);
}

/* ---------- total value ----------
   Lifted out of the stack, because the order now puts it after the
   checkmarks. Same rule, same type, same weight as .stack li.total was. */
.stack-total{
  display:flex;justify-content:space-between;align-items:baseline;gap:1.5rem;
  max-width:none;margin:.9rem 0 0;padding-top:.65rem;
  border-top:2px solid var(--ink);
  font-family:var(--ui);text-transform:uppercase;letter-spacing:.06em;
  font-size:.95rem;line-height:1.35;
}.stack-total em{font-style:normal;font-family:var(--ui);white-space:nowrap;color:var(--ink)}
@media (max-width:900px){.p-now{font-size:2.2rem}.stack li{flex-direction:column;gap:.1rem;padding:.45rem 0}.stack li em{align-self:flex-start}
}.lead-tag{
  display:inline-block;background:var(--accent);color:#F5F2EA;
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.1em;
  font-size:.56rem;padding:.18rem .5rem;border-radius:2px;vertical-align:.1em;
}
/* Solid green, with the tick beside it. Everything else on the row is
   terracotta or ink, so FREE is the only green thing and reads as a
   giveaway rather than as a second button. */
.free-tag{
  display:inline-block;background:var(--free-green);color:#fff;
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.1em;
  font-size:.54rem;padding:.14rem .45rem;border-radius:2px;margin-right:.5rem;vertical-align:.12em;
}.guarantee-inline{
  display:flex;gap:.8rem;align-items:flex-start;
  background:var(--paper);border:1px solid var(--line);border-left:4px solid var(--sage);
  border-radius:3px;padding:.8rem .9rem;margin:.7rem 0 .2rem;
}.guarantee-inline .seal{
  flex:none;width:2.9rem;height:2.9rem;border-radius:50%;background:var(--sage);color:#fff;
  display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1;text-align:center;
}.guarantee-inline .seal b{font-family:var(--display);font-size:1rem}.guarantee-inline .seal span{font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.04em;font-size:.36rem;margin-top:.12rem}.guarantee-inline h3{font-size:.95rem;line-height:1.25;margin:0 0 .2rem}.guarantee-inline p{font-size:.82rem;line-height:1.45;color:var(--ink-soft);margin:0;max-width:none}.trustline{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.14em;
  font-size:.6rem;color:var(--ink-mute);margin:.6rem 0 0;
}

/* payment strip under the offer */
.paybar{margin:2.6rem 0 0;padding-top:1.5rem;border-top:1px solid var(--line);text-align:center}.lockline{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.14em;
  font-size:.62rem;color:var(--ink-mute);margin:0 0 .7rem;max-width:none;
}.pays{display:flex;flex-wrap:wrap;gap:.45rem;align-items:center;justify-content:center}.pay-mark{
  display:inline-flex;align-items:center;justify-content:center;height:1.9rem;min-width:3rem;padding:0 .5rem;
  background:#fff;border:1px solid var(--line);border-radius:2px;
}.pay-mark svg{height:1.05rem;width:auto;display:block}.pay-label{font-family:var(--ui);font-weight:700;font-size:.66rem;letter-spacing:.06em;color:#1A1F6B}.pay-label.ap{display:inline-flex;align-items:center;gap:.12rem;color:#111;letter-spacing:0}.helpbar{text-align:center;font-size:.8rem;color:var(--ink-mute);margin:.9rem auto 0;max-width:none}

/* ---------- promise band ---------- */
.aside-in{display:flex;flex-direction:column;align-items:flex-start}.promise{
  font-family:var(--display);font-weight:700;font-size:1.5rem;line-height:1.35;color:var(--ink);
  max-width:32ch;margin:0 0 1rem;padding-left:1.1rem;border-left:5px solid var(--accent);
}p.lede{font-size:1.08rem;color:var(--ink-soft);max-width:44ch}

/* ---------- positioning strip ---------- */
.strip{background:var(--ink);color:#fff;padding:1.4rem 0}.strip-in{display:flex;justify-content:space-between;align-items:center;gap:1.4rem;flex-wrap:wrap}.strip p{
  margin:0;max-width:none;color:#fff;
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.06em;font-size:1rem;
}.strip span{color:#93A0B4;font-size:.95rem}

/* ---------- the three books ---------- */
.section-head{margin-bottom:2rem;max-width:52ch}.books{display:grid;grid-template-columns:repeat(3,1fr);gap:1.4rem}.bk{
  background:var(--tile);border:1px solid var(--line);border-top:5px solid var(--sage);
  border-radius:4px;padding:1.4rem;
  transition:transform .18s ease,box-shadow .18s ease;
  box-shadow:0 1px 2px rgba(8,14,29,.04),0 6px 16px -12px rgba(8,14,29,.3);
}.bk:hover{transform:translateY(-3px);box-shadow:0 2px 4px rgba(8,14,29,.06),0 14px 24px -14px rgba(8,14,29,.4)}.bk.main{border-top-color:var(--accent)}.bk h3{font-size:1.1rem;margin-bottom:.2rem}.bk-sub{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.09em;
  font-size:.6rem;color:var(--sage);margin:0 0 .8rem;
}.bk p{font-size:.92rem;color:var(--ink-soft);margin:0;max-width:none}.bk-tag{
  display:inline-block;font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.1em;
  font-size:.54rem;padding:.14rem .45rem;border-radius:2px;margin-left:.4rem;vertical-align:.2em;
}.bk-tag.free{background:var(--free-green);color:#fff}.bk-tag.main-tag{background:var(--accent);color:#F5F2EA}.getlist{display:grid;grid-template-columns:repeat(2,1fr);gap:0 2.4rem;margin-top:2rem}.gi{display:flex;gap:1rem;align-items:baseline;padding:.85rem .5rem;border-bottom:1px solid var(--line)}.gi b{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.07em;
  font-size:.72rem;color:var(--accent);flex:none;width:8.5rem;
}.gi span{font-size:.94rem;color:var(--ink-soft)}

/* ---------- what is inside (dark) ---------- */
.inside-head{max-width:46ch;margin-bottom:1.8rem}.tally{
  display:grid;grid-template-columns:repeat(4,1fr);
  border-top:1px solid #1B2437;border-bottom:1px solid #1B2437;margin-bottom:2rem;
}.ty{padding:1rem .8rem;text-align:center}.ty + .ty{border-left:1px solid #1B2437}.ty b{display:block;font-family:var(--display);font-weight:700;font-size:1.8rem;line-height:1;color:var(--accent-lift)}.ty span{
  display:block;font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.14em;
  font-size:.56rem;color:#93A0B4;margin-top:.35rem;
}.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}.card{
  position:relative;overflow:hidden;background:#0F1930;border:1px solid #1B2437;border-radius:4px;
  padding:1.2rem 1.2rem 1.3rem;transition:transform .18s ease,border-color .18s ease,background .18s ease;
}.card:hover{transform:translateY(-4px);border-color:var(--sage);background:#101A2C}.card-no{
  position:absolute;top:.15rem;right:.6rem;font-family:var(--display);font-weight:700;font-size:3rem;line-height:1;
  color:transparent;-webkit-text-stroke:1px #26314A;
}.card:hover .card-no{-webkit-text-stroke-color:#4A5568}.card h3{color:#fff;font-size:1.02rem;margin:0 2.6rem .5rem 0;line-height:1.25}.card p{font-size:.86rem;color:#93A0B4;margin:0;max-width:none}.inside-cta{margin-top:2rem;padding-top:1.8rem;border-top:1px solid #1B2437;text-align:center}.inside-cta .btn{margin-inline:auto}.inside-cta p{font-size:.84rem;color:#93A0B4;margin:.9rem auto 0}

/* ---------- how a recipe is written ---------- */
.recipe{
  background:var(--paper);border:2px solid var(--line-strong);border-radius:4px;
  padding:1.6rem 1.7rem;max-width:34rem;
}.recipe-kicker{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.18em;
  font-size:.58rem;color:var(--sage);margin:0 0 .3rem;
}.recipe h3{font-size:1.4rem;margin-bottom:.7rem}.ratio{
  display:flex;align-items:baseline;gap:.7rem;flex-wrap:wrap;
  background:rgba(154,111,31,.09);border:1px solid var(--line);border-radius:3px;
  padding:.55rem .8rem;margin:0 0 1rem;
}.ratio span{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.14em;
  font-size:.56rem;color:var(--sage);
}.ratio b{font-family:var(--display);font-weight:700;font-size:1.05rem;color:var(--ink)}.recipe ol{margin:0;padding-left:1.3rem}.recipe li{margin-bottom:.5rem;font-size:.94rem;color:var(--ink-soft)}.recipe li:last-child{margin-bottom:0}.recipe-note{font-size:.84rem;color:var(--ink-mute);margin:1rem 0 0;max-width:none;font-style:italic}.howgrid{display:grid;grid-template-columns:1fr 1fr;gap:2.4rem;align-items:start}

/* ---------- the method (three rules) ---------- */
.tricks{display:grid;grid-template-columns:repeat(3,1fr);gap:1.3rem}.trick{
  background:var(--paper);border:1px solid var(--line);border-left:5px solid var(--sage);
  border-radius:3px;padding:1.3rem;
}.trick h3{font-size:1.02rem;margin-bottom:.35rem}.trick p{font-size:.92rem;margin:0;color:var(--ink-soft);max-width:none}

/* ---------- about ---------- */
.about{display:grid;grid-template-columns:.85fr 1.15fr;gap:3rem;align-items:start}.about .shot{aspect-ratio:1/1}.pull{
  font-family:var(--display);font-weight:700;font-size:1.2rem;line-height:1.4;
  border-left:5px solid var(--accent);padding-left:1.2rem;margin:1.6rem 0;max-width:38ch;
}

/* ---------- faq ---------- */
.faq{display:grid;grid-template-columns:repeat(2,1fr);gap:1.6rem 2.4rem}.faq h3{font-size:1.05rem;margin-bottom:.25rem}.faq p{font-size:.94rem;margin:0;color:var(--ink-soft)}

/* ---------- closing ---------- */
.closing-cta{text-align:center}.closing-cta h2{font-size:2.3rem;max-width:22ch;margin-inline:auto}.closing-cta p{margin-inline:auto}.closing-cta .btn-row{justify-content:center}.reassure{font-size:.88rem;color:var(--ink-mute);margin:.9rem 0 0}

/* ---------- exit intent ---------- */
/* ==================================================================
   EXIT MODAL - ELIAS YODER'S .modal

   His structure,spacing and type scale,read off his stylesheet:

     .modal        fixed,inset 0,flex centered,padding 24px
     .modal__bd    his ink at .72 alpha,backdrop-filter blur(6px)
     .modal__card  padding 50px 42px 36px,max-width 480px,width 100%,text-align center,1px border,page shadow,animation riseIn .4s cubic-bezier(.16,.84,.27,1) both
     .modal__close top 14px,right 18px,serif 1.8rem,--ink-mute
     .modal__cover width 120px,margin 0 auto 22px
     .eyebrow      .74rem / .24em / uppercase / 500,margin 0 0 18px
     h2            1.9rem,margin-bottom 14px; its em italic + accent
     p             1rem,margin-bottom 22px
     .btn          btn--block btn--big: full width,20px 34px,.84rem
     .modal__small mono .72rem / .18em / uppercase,--ink-mute,margin-top 16px,its link in his accent

   TWO DELIBERATE DEPARTURES,both stated rather than silent:

   1. THE BACKDROP STAYS THE OUTER ELEMENT. His is a child,.modal__bd.
      landing.js closes on `e.target === modal`,so a child backdrop would
      swallow that click and break closing. Trigger,timing and suppression
      were to stay untouched,so the backdrop model stays too - it takes his
      alpha and his blur,on our ink.

   2. THE CLOSE BUTTON KEEPS A 44px MINIMUM TARGET. His is a bare glyph with
      no minimum. This audience is 65+ and 44px is the touch-target floor;
      it sits at his 14/18 offsets and reads the same.
   ================================================================== */
.xi{
  position:fixed;inset:0;z-index:9998;display:none;
  align-items:center;justify-content:center;padding:24px;
  background:rgba(11,19,38,.72);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
}.xi.open{display:flex}.xi-box{
  position:relative;background:var(--paper);border:1px solid var(--line);
  padding:50px 42px 36px;max-width:480px;width:100%;text-align:center;
  box-shadow:0 22px 60px -10px rgba(0,0,0,.25);
  animation:xi-rise .4s cubic-bezier(.16,.84,.27,1) both;
}
@keyframes xi-rise{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}
}
@media (prefers-reduced-motion:reduce){.xi-box{animation:none}
}.xi-cover{width:120px;margin:0 auto 22px}.xi-cover img{width:100%;height:auto;display:block}/* Scoped to .xi: `.xi p{font-size:1rem;margin:0 0 22px;color:var(--ink-soft)}`
   is 0,2,0 and outranks a bare class on these two, which are both <p>. Same
   trap the offer box hit with `.offer-detail > p`. */
.xi .xi-eyebrow{
  display:block;margin:0 0 18px;max-width:none;
  font-family:var(--ui);font-size:.74rem;font-weight:600;
  letter-spacing:.24em;text-transform:uppercase;color:var(--accent);
}
/* SENTENCE CASE, the same switch #reviews h2 takes in styles.css and for the
   same reason: this heading is a sentence and ends in a full stop. It is the
   only declaration added here - size, line-height and spacing are unchanged,
   and the $27's <em> keeps his italic-and-accent treatment below. */
.xi h2{text-transform:none}
.xi h2{font-size:1.9rem;line-height:1.14;margin:0 0 14px;padding-right:1.4rem}.xi h2 em{font-style:italic;color:var(--accent)}.xi p{font-size:1rem;line-height:1.5;color:var(--ink-soft);margin:0 0 22px;max-width:none}.xi .xi-small{
  font-family:var(--ui);font-size:.72rem;letter-spacing:.18em;
  text-transform:uppercase;color:var(--ink-mute);margin:16px 0 0;max-width:none;
}.xi .xi-small a{color:var(--accent);text-decoration:none}.xi .xi-small a:hover{color:var(--accent-dark);text-decoration:underline}.xi-close{
  position:absolute;top:14px;right:18px;background:none;border:0;
  font-family:var(--serif);font-size:1.8rem;line-height:1;
  color:var(--ink-mute);cursor:pointer;
  /* our floor, not his - see the note above */
  display:flex;align-items:center;justify-content:center;
  min-width:44px;min-height:44px;padding:0;
}.xi-close:hover{color:var(--ink)}
/* NO MOBILE OVERRIDE, on purpose - restored 2026-09-10 with the button.
   Checked: his .modal__card appears in none of his six breakpoints, and his
   live page renders 50px 42px 36px and a 1.9rem headline at 390 exactly as
   it does at 1440. He does not shrink this card on a phone, so neither does
   this one.

   The 24px step that briefly stood here existed only because the Otis
   button was 17px on a phone against a 255px card. The button is 13.44px
   again, so the card does not need the room and his figure stands. */

/* His modal button is btn--block: full width. A modifier on .ep-btn,the same
   way .ep-btn--invert is - the padding,type,arrow and hover all come from
   there. Scoped to .xi so it outranks .ep-btn,which is declared later in this
   file and would otherwise win on source order at equal specificity. */
.xi .ep-btn--block{display:flex;width:100%;justify-content:center}

/* ==================================================================
   FAQ CASING - THE UPPERCASE WAS IN CSS, NOT IN THE MARKUP.

   Both strings are typed sentence case in index.html and were being
   transformed on the way to the screen by two separate rules:

     the H2         styles.css:86  h1,h2,h3,h4{...text-transform:uppercase}
                    a GLOBAL heading rule - every heading on the page
     the questions  landing.css    .drop > summary{...text-transform:uppercase}

   Neither can be edited where it sits. The global one carries the other
   headings on the page and the summary one carries the .drop component,
   which is not FAQ-only. So both are overridden here, scoped to #faq and
   to nothing else, and only the transform is touched - family, size,
   weight and tracking all stay exactly as they were.

   THE EYEBROW IS DELIBERATELY NOT IN THIS RULE. `COMMON QUESTIONS` gets
   its capitals from .eyebrow's own text-transform in styles.css and
   stays uppercase, as asked.
   ================================================================== */
/* DOWN 10% FROM WHAT IT WAS, AT EVERY WIDTH, ladder preserved.
   The global h2 ladder is 2.15rem with a 1.75rem step under 900px, which
   rendered 38.70 / 31.50 / 29.75px. x0.9 gives 1.935rem and 1.575rem, so
   34.83 / 28.35 / 26.78px. Stated in rem, not px, because the ask was a
   proportional reduction of the existing ladder rather than a match to a
   figure of his - this heading has no counterpart on his page. */
#faq h2{text-transform:none;font-size:1.935rem}
@media (max-width:900px){#faq h2{font-size:1.575rem}}
#faq .drop > summary{text-transform:none}

/* THE OFFER HEADLINE, SCOPED THE SAME WAY AND FOR THE SAME REASON.
   `.offer-h` is typed sentence case in index.html; its capitals came from the
   same global styles.css:86 `h1,h2,h3,h4{...text-transform:uppercase}` rule.
   Scoped to #buy so it moves this heading and nothing else - the family, the
   2.35rem/2.1rem/1.55rem size ladder, the weight and the .02em tracking are
   all left exactly where they were. */
/* 06 REPEATS 01, SO IT TAKES 01'S CASING TOO. The rule was scoped to
   #buy alone and left 06's H2 rendering in the site-wide capitals. */
#buy .offer-h,#order .offer-h{text-transform:none}
/* `#whatyouget h2{text-transform:none}` WAS HERE AND IS TOMBSTONED.
   It was the third of the same kind - the "$27 once. No subscription. Yours
   forever." headline, typed sentence case and un-uppercased by a scoped
   override. That section was deleted whole on this revision; its four
   checkmarks are in 04 and its own line is covered by the offer box's foot
   line. Nothing else ever selected #whatyouget, so this is the only rule the
   deletion orphaned. Recorded rather than silently dropped. */

/* ---------- responsive ---------- */
@media (max-width:960px){.offer-h{font-size:2.1rem}.offer-grid{grid-template-columns:1fr;gap:1.8rem}.cards{grid-template-columns:repeat(2,1fr)}.howgrid{grid-template-columns:1fr;gap:1.8rem}.about,.faq{grid-template-columns:1fr;gap:2rem}.books,.tricks,.getlist{grid-template-columns:1fr;gap:1.2rem}.gi{flex-direction:column;gap:.2rem}.gi b{width:auto}
}
@media (max-width:820px){.hero-in{grid-template-columns:1fr;grid-template-areas:"img" "text";row-gap:1.6rem;text-align:center}
  /* Smaller than the desktop cap: stacked above the headline on a phone,
     24rem of photo filled the screen before a word had been read. */
  .hero-media{max-width:16.8rem}.hero-text{align-items:center}.hero h1{max-width:none}.best,.hero-points,p.lede,.offer-lede{margin-inline:auto}
  /* .best JOINS .hero-points IN STAYING LEFT-ALIGNED.
     .hero-in above sets text-align:center for the stacked hero, and .best
     inherited it. With a floated ::first-letter that is what broke the wrap:
     each line was centred inside its own shortened line box, so no two lines
     below the cap began at the same x. Measured at 390 before this rule, the
     six line starts read 15.59 / 67.80 / 69.45 / 17.48 / 27.58 / 23.72.
     Elias's .hero__sub is text-align:start at every one of his breakpoints -
     he never centres the hero column - and his line starts read
     22 / 72.75 / 72.75 / 72.75 / 22 / 22: three lines flush to the cap, then
     back to the paragraph edge. The ::first-letter block itself is already his
     value for value (float, 8px 12px -2px 0 margin, .85 line-height, 3.4em,
     no text-indent on either side); alignment was the only thing left. */
  .best,.hero-points{text-align:left}.btn-row{justify-content:center}.assure{align-items:center}.promise{margin-inline:auto}.aside-in{align-items:center;text-align:center}body{padding-bottom:4.6rem}
}
@media (max-width:620px){.cards{grid-template-columns:1fr}.tally{grid-template-columns:repeat(2,1fr)}.ty:nth-child(3){border-left:0}.ty:nth-child(n+3){border-top:1px solid #1B2437}.hs{padding:0 .4rem}.hs b{font-size:1.35rem}.hs span{font-size:.48rem;letter-spacing:.07em}.strip-in{flex-direction:column;align-items:flex-start;gap:.4rem}.closing-cta h2{font-size:1.8rem}
}

/* ---------- audiobook chip ---------- */
/* Outlined rather than solid so it reads as a format label and never competes
   with a price or a button. */
.audio-tag{
  display:inline-flex;align-items:center;gap:.35em;
  background:transparent;color:var(--accent);
  border:1px solid var(--accent);border-radius:2px;
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.1em;
  font-size:.54rem;padding:.12rem .45rem;margin-right:.5rem;vertical-align:.12em;
}.audio-tag svg{width:.95em;height:.95em;flex:none}

/* ---------- graceful gaps where art is still missing ---------- */
/* Each frame holds an <img> that deletes itself when the file is absent.
   :empty is no use here because the whitespace between the tags counts as a
   child node,so the test is "has no img" instead. A missing asset then
   costs a layout column rather than showing a broken box on a live page. */
.about-shot:not(:has(img)){display:none}.about:has(.about-shot:not(:has(img))){grid-template-columns:1fr}

/* ---------- reviews ---------- */
/* Five cards. Flex rather than grid so the last row of two centers itself
   instead of hanging off to the left,which is what a three column grid does
   with an odd count. */
.reviews{display:flex;flex-wrap:wrap;gap:1.3rem;justify-content:center}.review{
  flex:1 1 19rem;max-width:22rem;
  background:var(--paper);border:1px solid var(--line);border-top:5px solid var(--sage);
  border-radius:4px;padding:1.4rem;
  box-shadow:0 1px 2px rgba(8,14,29,.04),0 6px 16px -12px rgba(8,14,29,.3);
  transition:transform .18s ease,box-shadow .18s ease;
}.review:hover{transform:translateY(-3px);box-shadow:0 2px 4px rgba(8,14,29,.06),0 14px 24px -14px rgba(8,14,29,.4)}.review-head{display:flex;align-items:center;gap:.8rem;margin-bottom:.9rem}.review-head b{
  font-family:var(--ui);font-weight:700;text-transform:uppercase;letter-spacing:.08em;
  font-size:.76rem;color:var(--ink-soft);
}.review h3{font-size:1.05rem;line-height:1.3;margin:0 0 .5rem;color:var(--ink)}.review p{font-size:.92rem;line-height:1.6;color:var(--ink-soft);margin:0;max-width:none}

@media (max-width:620px){.review{flex:1 1 100%;max-width:none}
}

/* ---------- headline figure, claim basis ---------- */
.money{color:var(--free-green)}.hero h1{max-width:19ch}.claim-basis{
  font-size:.78rem;line-height:1.5;color:var(--ink-mute);
  max-width:44ch;margin:-.6rem 0 1.3rem;
}

/* ---------- proof pill ---------- */
/* Faces, stars and the figure, sitting under the buy button. Wraps to two
   rows in the narrow offer column rather than squeezing the faces. */
/* The portrait ring is present but EMPTY, by decision: no stock photography
   and no generated faces, real buyers or nothing. One circle rather than the
   source's overlapping five - five empty circles read as broken images.
   .face already carries the ground, the border and the outer ring, so the
   empty state needs nothing except to not be mistaken for a missing image. */

@media (max-width:520px){
}

/* ---------- the pot on the buttons ---------- */
/* A stockpot with the lid ajar pops out of the corner on hover and lets three
   wisps of steam go. Injected by landing.js so every .btn gets one without
   the markup repeating it. Purely decorative,hence aria-hidden. */
.btn{position:relative;overflow:visible}@media (prefers-reduced-motion:reduce){}@media (prefers-reduced-motion:reduce){}

/* ---------- the arithmetic ---------- */
/* The weekly figure is the working; the annual column is the result. Keeping
   the working visible is the whole point of the section. */

@media (max-width:620px){
}

/* ---------- masthead line above the headline ----------
   HIS .hero__mark, MEASURED ON THE LIVE PAGE AT 1920 AND 390 - the two widths
   return identical values, so there is no responsive step and none is
   invented here either:

     display flex | align-items center | gap 16px | margin 0 0 36px
     --mono | 11.84px | uppercase | letter-spacing 3.7888px | line-height 1.62
     first span   weight 700, his accent
     hr           flex 1, height 1px, border-top 1px solid his hairline
     second span  weight 400, his muted

   THE NUMBERS ARE PX AND THAT IS DELIBERATE. His 11.84px is .74rem against a
   16px root; ours is 18px, so .74rem here would render 13.32px and miss him by
   1.5px. The build already writes this exact figure as px for the same reason
   at #ledger .eyebrow. 3.7888px / 11.84px is .32em, and that is written as an
   em so it tracks the size if the size ever moves.

   COLOURS ARE OURS, NOT HIS, and that is the same conversion the rest of this
   port makes: his oxblood accent -> --accent, his warm taupe -> --ink-mute,
   his hairline -> --line-strong. The rule itself is non-text. Both label
   colours are checked against paper by tools/contrast.py. */
.hero-mark{
  /* .hero-text is a flex column at align-items:flex-start, so without this the
     mark shrink-wraps its own two labels and the rule between them - a flex
     item at flex:1 inside a box with no spare width - resolves to 0px. His
     .hero__copy is a block, where full width is the default. */
  align-self:stretch;
  display:flex;align-items:center;gap:16px;margin:0 0 36px;
  font-family:var(--mono);font-size:11.84px;line-height:1.62;
  letter-spacing:.32em;text-transform:uppercase;color:var(--ink-mute);
}
.hero-mark span{font-weight:400}
.hero-mark span:first-child{font-weight:700;color:var(--accent)}
.hero-mark hr{
  flex:1;height:1px;margin:0;
  border:0;border-top:1px solid var(--line-strong);
}
/* BELOW 420px THE TRACKING COMES IN, AND ONLY THE TRACKING.
   His two labels are 21 characters (Elias Yoder / An Almanac); ours are 34
   (Thomas Ashford / The Seasoned Cruiser), so at his .32em they stop fitting one row
   before he would ever notice. Left at .32em both labels wrap and the rule
   between them - a flex:1 item with nothing left to take - resolves to 0px,
   which loses the one thing the line is for. .20em is the same step the
   reference build measured for its own longer pair. Size, weights, gap,
   colour and the rule itself are untouched, so this is his line at a shorter
   step, not a different line. */
@media (max-width:419.98px){
  .hero-mark{letter-spacing:.20em}
}

/* ---------- long-form hero headline ----------
   The short 19ch headline is replaced by a full-width one, laid out the way
   the Frank Miller hero does it. Same display face as the rest of this site;
   only the measure, size and case change. */
/* SIZE, LINE-HEIGHT AND TRACKING ARE HIS, READ OFF THE LIVE PAGE.
   Sampled at thirteen widths from 1920 down to 360, his .hero__headline is one
   clamp with two constants either side of it: 57.6px at 1920/1600/1440,
   4.4vw through the middle, a 35.2px floor from 760 down - so
   clamp(35.2px, 4.4vw, 57.6px) - with lh 1.05 and ls -0.022em at every width.
   Written here as the clamp rather than as breakpoints, which is both what he
   does and the shape #ledger h2 already uses. The two @media steps this
   replaces were ours and are gone with it.

   WEIGHT FIRST, THEN SIZE - AND THE ORDER IS THE WHOLE POINT.
   His .hero__headline is Fraunces at weight 400. This ran Libre Baskerville at
   700, and a 700 serif eats more width per character than a 400 one, so
   matching his size on top of the bolder weight was never going to reproduce
   his line count. The weight is his now, and the size is then the largest that
   still breaks the way his does in the column we actually have.

   THE COLUMN IS NOT WIDENED. .hero-in and the hero image track are untouched.

   THE SIZES ARE MEASURED IN THE LIVE COLUMN, not derived, in 0.1px steps
   against the real rendered line count, by tools/_h1_fit.py:

     1920 and 1440   column 476.92px   28.4px is the largest holding 2 lines
                                       (28.5px breaks to 3)
      390            column 358.80px   28.4px holds 3 lines
                                       (31.3px breaks to 4)

   DEVIATION, RECORDED: HIS CLAMP COLLAPSES TO ONE SIZE IN THIS COLUMN, and
   this is written as the single size rather than dressed up as a clamp that
   does nothing. His floor is 35.2px and cannot be used: at 390 in our column
   35.2px sets FOUR lines, not three. Worse, the two ends invert. The largest
   size holding two lines at desktop is 28.4px; the largest holding three at
   390 is 31.2px - so the mobile limit sits ABOVE the desktop cap, and any
   clamp(min, 4.4vw, max) honouring both would need min > max, which CSS
   resolves by returning min and would set three lines on a 1920 screen.
   28.4px satisfies both targets on its own - two lines at 1920 and 1440,
   three at 390 - so that is what is written. His 4.4vw slope goes with the
   clamp: between the cap and the floor there is no room left for a slope.
   The reference build kept his clamp because its own headline is 52
   characters against our 68 and its numbers did not invert (cap 38.8px,
   390 limit 40.4px). Ours are measured, not derived, by tools/_h1_fit.py.

   The font request moved with the weight rather than in addition to it:
   Libre Baskerville was requested at ital,wght@0,700;1,700 and is now
   0,400;1,400 - the same two files, the roman and a true italic, both real
   cut faces on gstatic, so nothing is synthesised. */
.hero h1.long{
  font-family:"Libre Baskerville",Georgia,serif;font-weight:400;
  max-width:none;text-transform:none;
  font-size:28.4px;line-height:1.05;letter-spacing:-.022em;
}

/* ---------- order-block ticks, structural ----------
   The tick used to be an absolutely positioned ::before with the space held
   open by padding-left. Every mobile rule that set `padding` as a shorthand
   silently reset that padding-left to 0, so the disc landed on top of the
   first characters. It is now a real grid column: it reserves its own width
   and cannot overlap text at any viewport.

   col 1 = tick, col 2 = text, col 3 = price. No absolute positioning, no
   negative margins, no text-indent. The disc carries the check as a
   background image so the whole mark is one grid item. */
.stack li{
  display:grid;
  /* Two columns now, not three: the per-row prices are gone. */
  grid-template-columns:.85rem minmax(0,1fr);
  column-gap:.6rem;row-gap:.15rem;
  align-items:start;
  padding:.42rem 0;
  border-bottom:1px solid var(--line);
  font-size:.95rem;line-height:1.35;
}
/* THE LIVE SITE'S ARROW, NOT A GREEN TICK.
   theseniorflyer.com marks these rows with <span class="d">&#9656;</span> at
   .7rem in its accent. Same glyph, same size, palette A's accent - and the
   green tick is retired from this list so that the four benefit bullets
   below are the only place on the page it appears. */
.stack li::before{
  content:"\25B8";
  grid-column:1;grid-row:1;position:static;
  width:auto;height:auto;border-radius:0;background:none;
  color:var(--accent);font-size:.7rem;line-height:1;
  justify-self:end;
  margin-top:.42rem;            /* optical: level with the first text line */
}.stack li::after{content:none}   /* the old separate check mark */
.stack li > span{grid-column:2;grid-row:1;min-width:0}.stack li > em{grid-column:3;grid-row:1;justify-self:end}
/* The total is not an item: no tick, text and figure only. */
.stack li.total{grid-template-columns:minmax(0,1fr) auto;padding-left:0}.stack li.total::before{content:none}.stack li.total > span{grid-column:1}.stack li.total > em{grid-column:2}

/* Narrow: the price drops under the text for EVERY row, aligned to the text
   column so the tick column stays clear. Consistent across all rows. */
@media (max-width:560px){.stack li{grid-template-columns:1.1rem minmax(0,1fr);}.stack li > em{grid-column:2;grid-row:2;justify-self:end}.stack li.total{grid-template-columns:minmax(0,1fr)}.stack li.total > em{grid-column:1;grid-row:2;justify-self:end}
}

/* ---------- hero sizing, matched to the Frank build ----------
   On mobile the photo fills the column instead of being capped at 16.8rem. */
@media (max-width:820px){.hero-media{width:100%;max-width:none}
}

/* ---------- desktop hero sizing, matched to the Frank build ----------
   Her image column was 44fr but the photo was capped at 24rem, which is
   narrower than the column it sits in, so it never filled it. Frank's cap
   (25rem) sits above his column width, so his photo fills the column and
   the cap never binds. Same three values here: column ratio, cap, frame
   padding. Scoped to min-width:821px so the mobile sizing is untouched. */
@media (min-width:821px){
  /* Her photo is landscape where Frank's is portrait, so matching his column
     ratio left it short. The image column takes 48fr and the cap sits just
     above it, so the photo fills the column and the cap never binds. */
  .hero-in{grid-template-columns:52fr 48fr}.hero-media{max-width:28rem}/* `.hero-frame{padding:.8rem}` was here and went with the mat. */
}
/* Star row above the reviewer name, matching the sites' shared treatment. */
.review .stars{font-size:1.05rem;margin-bottom:.15rem}

/* ---------- per-review star ratings ----------
   Partial fills via a gradient clipped to the glyphs, so a rating between
   whole stars renders honestly. letter-spacing is zeroed on these so each
   star is exactly one fifth of the width and --pct maps 1:1 to the rating
   (4.5 -> 90%, 4.9 -> 98%). Aggregate pills elsewhere are untouched. */
.review .stars{
  letter-spacing:0;
  background-image:linear-gradient(90deg,var(--accent) var(--pct,100%),#D9D2C0 var(--pct,100%));
  -webkit-background-clip:text;background-clip:text;
  color:transparent;
}

/* ---------- drop-downs: FAQ and contents ---------- */
.drop{border-top:1px solid var(--line);margin:0}.drop:last-of-type{border-bottom:1px solid var(--line)}.drop > summary{list-style:none;cursor:pointer;padding:.9rem 2rem .9rem 0;position:relative;
  font-family:var(--ui);text-transform:uppercase;letter-spacing:.04em;font-size:.9rem;color:var(--ink)}.drop > summary::-webkit-details-marker{display:none}.drop > summary::after{content:"";position:absolute;right:.35rem;top:1.2rem;width:.6rem;height:.6rem;
  border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);
  transform:rotate(45deg);transition:transform .18s ease}.drop[open] > summary::after{transform:rotate(-135deg)}.drop-body{padding:0 0 1rem}.drop-body p{font-size:.95rem;line-height:1.5;color:var(--ink-soft);margin:0 0 .7rem;max-width:none}.drop-body h3{font-size:1rem;margin:.9rem 0 .25rem}.tag-main,.tag-free{font-family:var(--ui);text-transform:uppercase;letter-spacing:.1em;font-size:.56rem;
  padding:.14rem .45rem;border-radius:2px;margin-left:.4rem;vertical-align:.15em;color:#fff}.tag-main{background:var(--accent)}.tag-free{background:var(--free-green)}.origin-strip{padding:2rem 0 0}.origin-strip p{font-family:"Lora",Georgia,serif;font-size:1.02rem;line-height:1.55;color:var(--ink-soft);margin:0 0 .5rem;max-width:52ch}
@media (prefers-reduced-motion:reduce){.drop > summary::after{transition:none}}

/* ---------- guarantee seal ----------
   An insignia, not a caption: solid shield, heavy border, no gradient,
   no glow, no shine. Same mark and same position on all three sites. */
.seal-badge{
  display:inline-flex;align-items:center;gap:.85rem;
  border:3px solid var(--accent);background:var(--tile);
  padding:.75rem 1.15rem;border-radius:2px;max-width:31rem;
}.seal-shield{width:2.5rem;height:3rem;flex:none;fill:var(--accent)}.seal-shield .tick{stroke:var(--tile)}.seal-text b{display:block;font-family:var(--ui);text-transform:uppercase;letter-spacing:.06em;
  font-size:.95rem;line-height:1.1;color:var(--accent)}.seal-text > span{display:block;font-size:.82rem;line-height:1.35;color:var(--ink-soft);margin-top:.22rem}
@media (max-width:560px){.seal-badge{gap:.65rem;padding:.6rem .8rem}.seal-shield{width:2rem;height:2.4rem}.seal-text b{font-size:.85rem}.seal-text > span{font-size:.76rem}
}

/* ---------- review rating: 4.5 stars plus the number ---------- */
.rating{display:inline-flex;align-items:center;gap:.42rem}.rating .stars{display:inline-block;letter-spacing:0;
  background-image:linear-gradient(90deg,var(--accent) var(--pct,90%),#D9D2C0 var(--pct,90%));
  -webkit-background-clip:text;background-clip:text;color:transparent}.rating-num{font-family:var(--ui);font-size:.82rem;letter-spacing:.04em;color:var(--ink)}
/* ---------- guarantee seal, tightened ---------- */
.seal-badge{gap:.6rem;padding:.5rem .8rem;max-width:26rem;border-width:2px}.seal-shield{width:1.7rem;height:2rem}.seal-text b{font-size:.78rem;letter-spacing:.05em}.seal-text > span{font-size:.74rem;line-height:1.3;margin-top:.15rem}
@media (max-width:560px){.seal-badge{gap:.5rem;padding:.45rem .65rem}.seal-shield{width:1.45rem;height:1.75rem}.seal-text b{font-size:.72rem}.seal-text > span{font-size:.7rem}
}.guarantee-inline{padding:.55rem .7rem;gap:.6rem}.guarantee-inline h3{font-size:.82rem}.guarantee-inline p{font-size:.75rem;line-height:1.3}

/* ==================================================================
   Round four corrections. Appended last so these win the cascade.
   ================================================================== */

/* 1. Decorative rules removed. The hairline that ran out to the right of
   every eyebrow label,and the divider rules between blocks,carried no
   information. White space separates the sections instead. */
.eyebrow::after,.band.ink .eyebrow::after{content:none;display:none}.eyebrow{gap:0}.buy-block{border-top:0;padding-top:0}.paybar{border-top:0}

/* 2. Proof pill reduced to a compact badge: smaller faces, tighter padding,
   less height. Same size on all three sites. */
.rating-num{font-size:.75rem}

/* 3. The lock line and the card marks are one row, on one baseline, rather
   than two centered blocks at different heights. */
.paybar{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:.5rem .8rem;margin-top:1.6rem;padding-top:1.1rem;text-align:center}.paybar .lockline,.lockline{margin:0;max-width:none;display:inline-flex;align-items:center;gap:.3rem}.paybar .pays,.pays{margin:0;align-items:center}

/* 4. The guarantee seal sits clear of the hero buttons at every width.
   It was flush against them, so a wrapped button clipped it. */
/* HERO PAIR ONLY. The hero text column is 477px and the two buttons at the
   page's 2.2rem side padding need 271 + 234 + 16 = 521px,so they wrapped to
   two rows at every desktop width. 1.55rem takes 11.7px off each side,which
   is 46.8px off the pair - 458px,inside the column with the 16px gap intact.
   Height is untouched (min-height stays 74px) and neither label wraps.
   Scoped to .top-cta: every other .btn on the page keeps 2.2rem. */
.hero .btn-row.top-cta .btn{padding-inline:1.24rem}.hero .btn-row.top-cta{margin-bottom:0}.assure,.top-assure,.hero .assure,.hero .top-assure{margin-top:1.15rem;position:static;clear:both}.seal-badge{position:static;float:none;transform:none;margin:0}
@media (max-width:768px){.hero .btn-row.top-cta{margin-top:1.2rem}.assure,.top-assure,.hero .assure,.hero .top-assure{margin-top:1rem}
}

/* ------------------------------------------------------------------
   Review card details, made unconditional.
   The partial-fill stars were drawn with background-clip:text over a
   gradient and color:transparent. When the clip does not take effect
   the glyphs stay transparent and the card loses its stars entirely,
   which is what happened. The solid color is now the base state and
   the gradient only replaces it where the clip is actually supported.
   ------------------------------------------------------------------ */
.rating{display:inline-flex;align-items:center;gap:.42rem;visibility:visible}
@supports ((-webkit-background-clip:text) or (background-clip:text)){.rating .stars,.review .stars{
    background-image:linear-gradient(90deg,var(--star-gold,var(--accent)) var(--pct,95%),var(--star-dim,#D9D2C0) var(--pct,95%));
    -webkit-background-clip:text;background-clip:text;
    color:transparent;-webkit-text-fill-color:transparent}
}.rating-num{font-size:.78rem;color:var(--ink);opacity:1;white-space:nowrap}.review .rating-num{color:var(--ink)}.review .review-head{display:flex;align-items:center;gap:.85rem}.review .review-head > div{min-width:0;display:flex;flex-direction:column;gap:.12rem}.review b{display:block;white-space:normal}

/* ==================================================================
   One spacing scale for every section break, every page, all three
   sites. Sections were running 130-266px of dead space between them:
   band padding stacked on top of the previous block's own bottom
   margin, plus body/footer padding still reserving room for a sticky
   bar that no longer exists.
   ================================================================== */
:root{--sec:2.2rem;--sec-in:1.15rem}
@media (max-width:768px){:root{--sec:1.4rem;--sec-in:.85rem}}

/* Every section break is the same value, top and bottom. */
.band{padding-top:var(--sec);padding-bottom:var(--sec)}

/* Stacked margins: the section padding is the gap, so the first and
   last child inside a section do not add their own on top of it. */
.band > .wrap > *:last-child,.band > *:last-child,.band > .wrap > *:last-child > *:last-child{margin-bottom:0}.band > .wrap > *:first-child,.band > *:first-child{margin-top:0}

/* Inside sections: heading to body, block to block. */
.section-head{margin-bottom:var(--sec-in)}.band h2{margin-bottom:.5rem}.band .eyebrow{margin-bottom:.6rem}.offer-top{margin-bottom:var(--sec-in)}.paybar{margin-top:var(--sec-in);padding-top:var(--sec-in)}.inside-cta{margin-top:var(--sec-in)}.tally{margin-bottom:var(--sec-in)}.buy-block{margin-top:var(--sec-in);padding-top:var(--sec-in)}.assure,.top-assure,.hero .assure,.hero .top-assure{margin-top:1rem}

/* Room reserved for sticky bars that are no longer on the page. */
body{padding-bottom:0}.foot{padding:1.6rem 0}

/* The legal and thank-you pages do not use .band; they wrap content in
   main / .doc / .sec. Same scale applied there so every page on the site
   breaks its sections at the same distance. */
.doc,.sec,.sec-downloads{padding-top:var(--sec);padding-bottom:var(--sec)}body > main{padding-top:var(--sec);padding-bottom:var(--sec)}.doc h2,.sec h2,main > .wrap > h2{margin-top:var(--sec-in);margin-bottom:.4rem}.doc > *:first-child,.sec > *:first-child,main > .wrap > *:first-child{margin-top:0}.doc > *:last-child,.sec > *:last-child,main > .wrap > *:last-child{margin-bottom:0}.updated{margin-top:var(--sec-in)}.card{margin-bottom:var(--sec-in)}

/* ==================================================================
   Narrow-phone fit. Nothing crosses a container edge at 430, 390
   or 360: long titles wrap instead of running into the price, the
   card marks wrap instead of pushing off the right edge, and the
   three-column stats bar steps down rather than clipping.
   ================================================================== */
@media (max-width:480px){.card,.quote,.bump-wrap,.seal-badge,.paybar,.pay-head,.card *,.quote *,.bump-wrap *,.seal-badge *,.review *,.stack li *{overflow-wrap:anywhere}

  /* Product box: title wraps, price and save chip keep their own line. */
  .sum-row{flex-wrap:wrap;align-items:flex-start;gap:.45rem}.sum-name{min-width:0;flex:1 1 55%}.sum-right{flex:0 0 auto;margin-left:auto;text-align:right;white-space:nowrap}

  /* One time offer: text stays inside the dashed border. */
  .bump-wrap{overflow:hidden}.bump-wrap p,.bump-wrap h3,.bump-wrap b{max-width:100%}

  /* Card marks wrap onto a second row rather than off the edge. */
  .paybar{flex-wrap:wrap}.pays{flex-wrap:wrap;max-width:100%;justify-content:center}

  /* One compact reassurance row. */
  .pay-head{flex-wrap:wrap;justify-content:center;text-align:center;
    gap:.2rem .55rem;font-size:.7rem}

  /* Front page: stats bar, order rows, pill, review cards. */
  .statsbar .hs{padding:0 .3rem}.statsbar .hs b{font-size:1.15rem}.statsbar .hs span{font-size:.5rem;letter-spacing:.05em}.stack li{grid-template-columns:1rem minmax(0,1fr)}.stack li > em{grid-column:2;grid-row:2;justify-self:end}.review,.review p,.review b{max-width:100%}
}
@media (max-width:380px){.statsbar .hs b{font-size:1rem}.statsbar .hs span{font-size:.46rem}.pay-head{font-size:.66rem;gap:.18rem .45rem}.paybar .lockline{font-size:.52rem}.pay-label{font-size:.52rem}.pay-mark svg{height:.72rem}.pay-mark{padding:.08rem .24rem}
}

/* ==================================================================
   Stats bar on a phone. The three columns were `1fr`, which floors at
   the min-content width of the longest value ("5 generations",
   "53 years"), so the third stat ran outside its cell and off the
   card. minmax(0,1fr) lets the cells shrink and the value wrap.
   ================================================================== */
@media (max-width:560px){.statsbar .hero-stats,.hero-stats{grid-template-columns:repeat(3,minmax(0,1fr))}.hs{min-width:0;padding:0 .3rem;text-align:center}.hs b{font-size:1.05rem;line-height:1.1;overflow-wrap:break-word;hyphens:none;display:block}.hs span{font-size:.48rem;letter-spacing:.04em;line-height:1.25;display:block;overflow-wrap:break-word}
}
@media (max-width:400px){.hs b{font-size:.95rem}.hs span{font-size:.44rem}.hs{padding:0 .22rem}
}

/* The value now fits its cell instead of being hyphen-free broken
   mid-word ("generati / ons"): words stay whole and the type steps
   down at each width. */
@media (max-width:560px){.hs b{font-size:.92rem;overflow-wrap:normal;word-break:normal;line-height:1.15}.hs span{overflow-wrap:normal;word-break:normal}
}
@media (max-width:400px){.hs b{font-size:.82rem}.hs span{font-size:.42rem}
}

/* ==================================================================
   The hero guarantee goes back to a pill. It had grown into a full
   bordered block with a heading and a paragraph; this is the compact
   rounded badge it was before, sitting the same way the proof pill
   below it does. It is now the only guarantee on the page.
   ================================================================== */
.seal-badge{
  display:inline-flex;align-items:center;gap:.55rem;
  padding:.34rem .95rem .34rem .55rem;
  border:1px solid var(--line);border-radius:999px;
  background:var(--tile);box-shadow:none;max-width:100%;
  align-self:flex-start}.seal-badge .seal-shield{width:1.1rem;height:1.35rem;flex:none}.seal-badge .seal-text{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:.05rem .4rem;min-width:0}.seal-badge b{
  font-size:.7rem;letter-spacing:.07em;text-transform:uppercase;line-height:1.3}.seal-badge .seal-text > span{
  display:inline;font-size:.8rem;line-height:1.35;margin:0}
@media (max-width:560px){.seal-badge{padding:.3rem .8rem .3rem .5rem;gap:.45rem}.seal-badge b{font-size:.66rem}.seal-badge .seal-text > span{font-size:.76rem}
}

/* The offer-block guarantee is the same pill as the hero one, sitting
   under "Pay once - Yours forever" and above the proof pill, centered
   with the rest of that column. */
.offer-seal{margin:.7rem auto 0;align-self:center}.offer-detail .offer-seal,.buy-left .offer-seal{align-self:center}
@media (max-width:560px){.offer-seal{margin-top:.55rem}}

/* ------------------------------------------------------------------
   Offer column, tidied.
   - "Pay once - Yours forever" was left aligned in a centered column.
   - The proof pill and the guarantee pill were sized for a tight
     phone layout and read as small on a desktop offer block.
   - The support line now sits after the reviews, so it takes its own
     centered rule rather than hanging off the pay row.
   ------------------------------------------------------------------ */
.offer-detail .trustline,.trustline{
  text-align:center;display:block;width:100%;margin-left:auto;margin-right:auto}.offer-seal{padding:.44rem 1.05rem .44rem .6rem;gap:.6rem}.offer-seal .seal-shield{width:1.3rem;height:1.6rem}.offer-seal b{font-size:.78rem}.offer-seal .seal-text > span{font-size:.86rem}.helpbar{text-align:center;max-width:56ch;margin:1.1rem auto 0;font-size:.88rem}
@media (max-width:560px){.offer-seal b{font-size:.74rem}.offer-seal .seal-text > span{font-size:.8rem}
}

/* ==================================================================
   Matching the Frank Miller build.
   ================================================================== */

/* Bridge line between the h1 and the lede: reading serif,sized between
   the two,muted so it supports the headline rather than competing. */
.hero-sub{
  font-family:"Lora",Georgia,serif;font-weight:400;
  font-size:1.35rem;line-height:1.45;color:#5A6273;
  max-width:44ch;margin:.55rem 0 0;
}.hero-sub + .best{margin-top:1.05rem}
@media (max-width:900px){.hero-sub{font-size:1.2rem;max-width:none;margin-top:.5rem}}
@media (max-width:560px){.hero-sub{font-size:1.1rem;line-height:1.42}.hero-sub + .best{margin-top:.9rem}}

/* The savings figure is one unit and must never break across lines. */
.hero h1 .money{white-space:nowrap}

/* Total value row aligned to the price column. The item rows are a three
   column grid (tick / name / price); the total was two columns, so its
   figure sat out of line with the prices above it. */
.stack li.total{
  grid-template-columns:1.1rem minmax(0,1fr) auto;
  column-gap:.75rem;align-items:baseline;
}.stack li.total > span{grid-column:1 / 3}.stack li.total > em{grid-column:3;grid-row:1;justify-self:end;white-space:nowrap}.stack li.total em s{opacity:.55;margin-right:.4rem;font-weight:400}
@media (max-width:560px){.stack li.total{grid-template-columns:1rem minmax(0,1fr) auto}.stack li.total > em{grid-column:3;grid-row:1}
}

/* Hero photo takes the larger share of the row, as on Frank. */
@media (min-width:821px){.hero-in{grid-template-columns:46fr 54fr;column-gap:2.4rem}.hero-media{max-width:none;justify-self:stretch}
}

/* ==================================================================
   OFFER BOX - ELIAS YODER'S STRUCTURE

   Ported from eliasyoder.com's .single-product / .includes block: the
   eyebrow, headline and lede in the copy column beside the cover, a
   ruled price row, a labeled value list closing on a shaded "you pay
   today" band, a full-width button and a small-caps foot line.

   Every measurement below is his, unchanged - 18px price-row padding,
   16px gap, 3.2rem price, .24em/.22em/.2em tracking on the three
   small-caps lines, 14px list padding, the 6% tint on the today band,
   20px 34px on the button. Only the palette moves:

     his --oxblood  -> --accent
     his --rule     -> --line
     his --serif    -> --serif   (Lora, already loaded)
     his --mono     -> --ui      (Oswald, our small-caps face)
   ================================================================== */
/* Not .eyebrow: that class is a flex row with a rule drawn by ::after,and
   Elias's tag is a plain line of tracked small caps with nothing beside it. */
/* Scoped to .offer-detail: an existing `.offer-detail > p{font-size:1rem}`
   outranks a bare class on these four, and silently flattened all three
   small-caps lines and the lede to body size. */
.offer-detail .ep-tag{
  display:block;font-family:var(--ui);font-size:.74rem;letter-spacing:.24em;
  text-transform:uppercase;color:var(--accent);font-weight:600;
  margin:0 0 18px;max-width:none;
}.offer-detail .ep-tag::after{content:none}.offer-detail .offer-h{
  font-family:var(--display);font-size:1.9rem;line-height:1.14;
  margin:0 0 10px;letter-spacing:.01em;
}.offer-detail .ep-lede{font-size:1.06rem;color:var(--ink-soft);line-height:1.55;margin:0 0 22px;max-width:none}.ep-price-row{
  display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;
  padding:18px 0;margin-bottom:26px;
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);
}/* THE PRICE IS SET IN PX, AND THAT IS THE POINT.
   Elias declares .single-product__price at 3.2rem on a 16px root, so his $47
   renders 51.2px at 1920, 1440 and 390 alike - his root never moves and he has
   no responsive step on it. Our root is 18px, dropping to 17px under 560px, so
   the same 3.2rem rendered 57.6px on desktop and a 2.6rem override took it to
   44.2px on a phone. Neither figure was his. A rem value cannot land 51.2px at
   both of our roots, so this is stated in px and the 2.6rem step below is gone.
   Weight, style and letterspacing were already his: 500, italic on the em, and
   normal tracking.
   FAMILY IS A DELIBERATE DIVERGENCE, decided 2026-08-28. His is Fraunces with
   font-variation-settings "SOFT" 100, "opsz" 144; ours stays Lora because
   --serif is the palette A decision that governs every other serif on the page,
   and Fraunces would be a whole family loaded for one element. Recorded in
   HANDOFF. The struck price is deliberately NOT touched - his is mono, ours is
   not, and that was left alone on the same call. */
.ep-price{font-family:var(--serif);font-size:51.2px;font-weight:500;color:var(--ink);line-height:1}.ep-price em{font-style:italic;color:var(--accent)}.ep-strike{font-family:var(--ui);font-size:.94rem;color:var(--ink-mute);text-decoration:line-through}.offer-detail .ep-tag-inline{margin:0}.offer-detail .ep-head{
  font-family:var(--ui);font-size:.72rem;letter-spacing:.22em;text-transform:uppercase;
  color:var(--accent);font-weight:700;margin:28px 0 14px;max-width:none;
}.ep-includes{list-style:none;padding:0;margin:0 0 24px;border-top:1px solid var(--line)}.ep-includes li{
  display:flex;justify-content:space-between;align-items:flex-start;gap:18px;
  padding:14px 0;border-bottom:1px solid var(--line);
}.ep-name{flex:1;font-family:var(--serif);font-size:.98rem;line-height:1.45;color:var(--ink);min-width:0}.ep-name b{font-weight:700;color:var(--ink)}.ep-value{
  font-family:var(--ui);font-size:.9rem;color:var(--ink-mute);font-weight:500;
  white-space:nowrap;padding-top:2px;
}.ep-includes .ep-total{padding-top:18px;padding-bottom:18px}.ep-includes .ep-total .ep-value b{color:var(--ink);font-size:1.05rem}
/* His today band bleeds 14px past the list on both sides and drops its
   bottom rule, so the list ends on a block of color rather than a line. */
.ep-includes .ep-today{
  background-color:color-mix(in srgb,var(--accent) 6%,transparent);
  margin:0 -14px;padding:18px 14px;border-bottom:none;
}
@supports not (background-color:color-mix(in srgb,red 6%,transparent)){.ep-includes .ep-today{background-color:var(--deep)}
}.ep-includes .ep-today .ep-value b{
  font-family:var(--serif);font-style:italic;font-size:1.25rem;color:var(--accent);
}

/* ---------- the CTA, Elias's button ----------
   Read off eliasyoder.com's stylesheet, not off a screenshot. His offer CTA
   is .btn.btn--ox.btn--big - NO .btn--block. That was the error: .btn--block
   is display:flex/width:100%/justify-content:center and it is used elsewhere
   on his page, not here. His offer button is an inline-flex box sized to its
   own label and sitting left in the copy column. Measured on his live page it
   is 318px wide at 1920, 1440 and 390 alike, with max-width:none and its left
   edge flush with the column. Composed:

     .btn        inline-flex, align-items center, gap 10px, 16px 28px,
                 var(--mono) .78rem / .22em / uppercase / 500,
                 1.5px solid border, no border-radius, white-space nowrap,
                 transition background .25s, color .25s, transform .15s,
                 box-shadow .25s
     .btn--big   padding 20px 34px, font-size .84rem
     .btn--ox    ground and border = --oxblood
     hover       ground and border -> --oxblood-dk, translateY(-1px),
                 box-shadow 0 8px 18px -6px rgba(oxblood,.5)
     ::after     content "→", var(--serif), 1.1rem, letter-spacing 0,
                 transition transform .25s
     hover::after translateX(4px)

   THERE IS NO :active RULE ANYWHERE IN HIS STYLESHEET - checked, zero
   matches. The press state is the hover transform releasing. Nothing was
   invented to fill the gap.

   Palette A: --oxblood -> --accent, --oxblood-dk -> --accent-dark,
   his --paper -> our --paper, --mono -> --ui, --serif -> --serif. The
   4px radius is ours and is kept; his button is square, so this is the
   one line to change if you want it exact.

   min-height:0 matters: our own .btn carries min-height:74px, which would
   override his padding-derived height. */
/* ==================================================================
   THE PRIMARY BUTTON IS BACK ON ITS OWN BOX, 2026-09-10 (THIRD SET).

   For one set every primary CTA carried otisgranger.com's `.cta` - a 10px
   radius, 19px/48px of padding, 23px at weight 700 and a soft outer glow.
   That was applied without being asked for and it is reverted here whole:
   the rule below is the file's own, byte for byte as it stood before, and
   the four things that only existed to carry the bigger box are gone with
   it:

     .ep-btn's 640 and 420 steps          (his two responsive steps)
     .xi .ep-btn's 19px / 16px overrides  (the modal card is 394px wide)
     .xi-box's 24px padding under 420     (that box against a 274px label)
     .ep-btn--jump's white-space handling (see the jump link below)

   So the radius is `.btn`'s inherited 4px again, the label is 13.44px at
   .22em in --ui at weight 500, the padding is 20px/34px, the arrow is
   17.6px on a 28.512px line box, and the hover is a 1px lift under
   `0 8px 18px -6px` of the accent at 50%. Every figure in it is Elias
   Yoder's `.btn.btn--big`, which is where this button came from and where
   the comments below explain it from.

   ONE THING FROM THE OTIS SET STAYS, because it was asked for separately:
   04's jump link still sits in his `.lookcta` slot. It uses this button.
   ================================================================== */
.ep-btn-row{margin-top:0;display:block}.ep-btn{
  display:inline-flex;width:auto;max-width:none;align-items:center;gap:10px;
  min-height:0;padding:20px 34px;
  /* 13.44px, NOT .84rem. His .btn--big is .84rem on a 16px root, which
     renders 13.44px at every width he has. Ours resolved against 18px
     (17px under 560) and rendered 15.12px / 14.28px, which is where the
     whole last-call button mismatch came from - measured at eleven widths
     from 360 to 1024, his 13.44 flat against our 14.28/15.12 and his
     70.5px box against our 72.86/74.66. The padding either side was
     already px and already his. .22em tracking is left alone and now
     resolves to his 2.9568px on its own.
     THIS RULE IS SHARED by the offer CTA, the last-call button and the
     modal button - all three are the same port of his .btn.btn--big and
     all three carried the same leak, so it is fixed here rather than
     scoped to one of them. Decided 2026-08-28. */
  font-family:var(--ui);font-size:13.44px;letter-spacing:.22em;
  text-transform:uppercase;font-weight:500;white-space:nowrap;
  border:1.5px solid var(--accent);background:var(--accent);color:var(--paper);
  position:relative;
  transition:background .25s ease,color .25s ease,transform .15s ease,box-shadow .25s ease;
}.ep-btn::after{
  content:"→";   /* his glyph, written literally - a CSS
     escape got mangled on the way in and rendered U+0011 followed by "92" */
  /* 17.6px for the same reason as the label above: his .btn::after is
     1.1rem on a 16px root. The arrow is the tallest thing in the line box,
     so it - not the label - is what was holding the box off his 70.5px. */
  font-family:var(--serif);font-size:17.6px;letter-spacing:0;
  /* 28.512px, which is HIS RENDERED line box, not a number of ours.
     Neither stylesheet declares a line-height here - his arrow inherits
     `normal` from Fraunces and lands 28.512px, ours inherits `normal` from
     Lora and lands 29.04px. The arrow is the tallest thing in the button,
     so that 0.528px of face metrics was the whole of the residual box
     difference: his 70.5px against our 71.02px, at every width. Every
     declared value already matched; only the faces differ, and the family
     divergence is deliberate. Stating his rendered leading closes it. */
  line-height:28.512px;
  transition:transform .25s ease;
}.ep-btn:hover{
  background:var(--accent-dark);border-color:var(--accent-dark);color:var(--paper);
  transform:translateY(-1px);
  box-shadow:0 8px 18px -6px color-mix(in srgb,var(--accent) 50%,transparent);
}
@supports not (box-shadow:0 0 0 color-mix(in srgb,red 50%,transparent)){.ep-btn:hover{box-shadow:0 8px 18px -6px rgba(93,67,19,.5)}
}.ep-btn:hover::after{transform:translateX(4px)}
@media (prefers-reduced-motion:reduce){.ep-btn,.ep-btn::after{transition:none}.ep-btn:hover{transform:none}.ep-btn:hover::after{transform:none}
}.offer-detail .ep-foot{
  margin:14px 0 0;font-family:var(--ui);font-size:.7rem;letter-spacing:.2em;
  text-transform:uppercase;color:var(--ink-mute);text-align:center;max-width:none;
}

/* The trust block under the button, in a fixed order: guarantee, proof,
   payment. The paybar used to sit outside the grid at the foot of the
   whole section; it belongs with the other two. */
.offer-detail .paybar{margin-top:1.1rem;padding-top:1.1rem;border-top:1px solid var(--line)}

@media (max-width:900px){.offer-detail .offer-h{font-size:1.55rem}.ep-includes li{gap:12px}.offer-detail .ep-tag{letter-spacing:.18em}
}

/* THE FOUR BENEFIT BULLETS - GONE FROM THE PAGE, 2026-09-10 (fifth set).

   They were the last four bullets of the deleted "$27 once. No
   subscription. Yours forever." block and they moved four times: into 04,
   into 06's Otis card, into 06's repeat of 01, back into 04. They are
   deleted from both sections now, with their four highlights, because they
   never had a home - 06 carries the labelled stack and 04 carries the page
   images, and neither needed a third summary of the same four facts.

   NEITHER RULE SURVIVES. `.wyg-checks{max-width:52ch;margin:1.1rem 0 0}`
   was the original, and it is worth recording that it never governed
   anything: `#inside .wyg-checks` at 0,1,1 beat it from the Seasoned
   Cruiser set onwards, which is why re-adding the base rule in the fourth
   set put a 2rem margin in the file that computed to 0px on the page. The
   specific rule is tombstoned at section 6 below.

   `.hero-points` STAYS. The hero's own three bullets still use it, and the
   green disc and knocked-out tick are its drawing. */

/* The proof pill in the testimonials section, above the first card. It was in
   the offer box until the sixth revision set, where .offer-detail centered it;
   here it had to center itself. The pill itself is gone and so is its rule;
   this comment is the record of where it sat. */

/* Nothing between the small-caps line and the payment row now that the
   guarantee box is gone,so the paybar loses the rule it used to need. */
.offer-detail .paybar{margin-top:.9rem;padding-top:0;border-top:0}


/* ==================================================================
   THE COVER - ELIAS YODER'S PROPORTIONS

   His .single-product__cover-frame is width:100% with max-width:480px and
   14px of padding, sitting in the first grid track; .book-cover-real fills
   what is left. Measured on his live page:

                     frame     image    % of grid
     1920 / 1440    469.2px   441.2px     39.9 / 37.5
     390            320px     292px       92.5 / 84.4

   Ported as the same two rules. Our first track is 516.6px against his
   469.2 - our .offer-grid is 1fr 1fr where his is 0.85fr 1.15fr - so the
   480px cap governs on desktop and the image renders 452px. The grid ratio
   was not changed: that would move the whole offer box and was not asked
   for. His 320px mobile cap lands in our 960px breakpoint, his own is 980px.

   NO PAPER MAT. His frame carries background:var(--paper) and a page
   shadow behind the cover. Geometry only was ported; the mat is a visual
   addition nobody asked for.
   ================================================================== */
.offer-shot{width:100%;max-width:480px;padding:14px;margin-inline:auto}.offer-shot img{width:100%;max-width:none}

/* His hover, copied from his stylesheet:
     transition: transform .45s cubic-bezier(.2,.8,.3,1), box-shadow .4s ease
     :hover     transform: translateY(-6px)
   THERE IS NO SCALE IN IT - checked, his hover is a lift and a shadow swap
   and nothing else. Nothing was invented to fill the gap.

   The shadow is a filter, not a box-shadow, and that is deliberate: it
   follows the art's alpha rather than its box. The cover was RGBA with
   transparent corners when this was written; the 2026-09-06 art is a flat
   opaque 2:3 rectangle, so drop-shadow now traces that rectangle - correct
   either way, and it stays a filter so swapping the art back is free.
   Same durations and the same easing curve regardless. */
.offer-shot img{
  transition:transform .45s cubic-bezier(.2,.8,.3,1),filter .4s ease;
}.offer-shot img:hover{
  transform:translateY(-6px);
  filter:drop-shadow(0 40px 70px rgba(8,14,29,.5)) drop-shadow(0 14px 24px rgba(8,14,29,.35));
}
@media (prefers-reduced-motion:reduce){.offer-shot img{transition:none}.offer-shot img:hover{transform:none}
}
@media (max-width:960px){.offer-shot{max-width:320px}
}


/* ==================================================================
   LAST CALL

   Geometry, spacing and type scale are eliasyoder.com's .order block,
   value for value. Color is not: this takes our own footer ground so
   the two close the page as one dark field.
   ================================================================== */
.lastcall{
  position:relative;overflow:hidden;
  /* the footer's ground exactly - no lift, no boundary */
  background:var(--ink-deep);
  color:var(--paper);
  text-align:center;
  padding:130px 0 110px;
}
/* The type sits above the bloom. There is nothing to scrim any more - the
   ground under the headline is plain --ink-deep, so the 13.47 : 1 the
   wordmark and the headline measure is the real figure, not a figure that
   depends on a gradient landing in the right place. */
.lc-in{position:relative;z-index:2}/* 1.16rem / .24em / uppercase / 500,margin-bottom 40px.
   THIS IS HIS RENDERED SIZE,NOT HIS .eyebrow DECLARATION. His .eyebrow rule
   says .74rem with 18px below it,but the eyebrow is a <p> inside .order and
   his own `.order p{font-size:1.16rem;margin:0 auto 40px}` outranks it at
   0,2,0 against 0,1,0. Measured on his live page at 1440 and 390 it renders
   1.16rem with 40px below, so that is what "match his type scale exactly"
   means here. If you want his .eyebrow declaration instead it is .74rem and
   18px - one line.

   THE SIZE IS NOW IN PX, 2026-08-28. 1.16rem was his DECLARATION, not his
   rendered size: his root is 16px so it lands 18.56px, ours is 18px (17px
   under 560px) so the same rem landed 20.88px on desktop and 19.72px at 390.
   Measured against his live .order at all three widths, his eyebrow is
   18.56px flat. Stated in px for the same reason .ep-price and #ledger h2
   are. The .24em tracking is left alone and now resolves to his 4.4544px on
   its own. .lastcall h2 already matched - 70.4 / 70.4 / 41.6 against his
   70.4 / 70.4 / 41.6 - and is untouched.

   "In the accent" has to mean --accent-lift on a ground this dark: --accent
   is 1.92 : 1 here and unreadable. --accent-lift is the palette's own answer
   to the accent on a dark band, and lands at 8.88 : 1. */
.lc-eyebrow{
  display:block;margin:0 auto 40px;max-width:none;
  font-family:var(--ui);font-size:18.56px;font-weight:500;
  letter-spacing:.24em;text-transform:uppercase;
  color:var(--accent-lift);
}.lc-eyebrow::after{content:none}.lastcall h2{
  color:var(--paper);
  /* his clamp(2.6rem, 5vw, 4.4rem) at a 16px root = these pixels */
  font-size:clamp(41.6px,5vw,70.4px);
  max-width:18ch;margin:0 auto 20px;
}.lc-sub{
  font-size:18.56px;line-height:1.55;
  max-width:52ch;margin:0 auto 40px;
  /* cream at 82% over the ground = #CBCDC7, 9.47 : 1 */
  color:rgba(245,242,234,.82);
}

/* THE INVERTED BUTTON.
   A modifier on the existing .ep-btn, not a second component: the padding,
   type, tracking, arrow and the whole hover animation come from there
   untouched. His .order .btn is paper fill / ink label / paper border, and
   his hover goes to the FULL oxblood, not the dark step the button uses
   higher up his page - so ours goes to --accent, not --accent-dark.
     label on fill   13.47 : 1
     hover label     7.02 : 1  */
.ep-btn--invert{
  background:var(--paper);color:var(--ink-deep);border-color:var(--paper);
}.ep-btn--invert:hover{
  background:var(--accent);color:var(--paper);border-color:var(--accent);
  box-shadow:0 8px 18px -6px rgba(0,0,0,.45);
}

/* NO MOBILE OVERRIDE HERE, on purpose. Measured on his live page at 390, his
   .order keeps 130px / 110px of padding and its 1.16rem paragraph unchanged -
   he does not shrink this block on a phone, so neither does this one. The
   headline is the only thing that moves, and it moves through his own clamp. */

/* The only separation between the Last Call field and the footer. His thin
   rule sits above his nav row; ours sits on top of the footer. Cream at 10%
   is the hairline this build already uses on dark grounds - the urgency
   strip's border-bottom is the same value at the same weight. */
.foot{border-top:1px solid rgba(245,242,234,.10)}


/* ==================================================================
   HERO HEADLINE AND DROP CAP - ELIAS YODER'S TREATMENTS
   ================================================================== */

/* His .hero__headline em is `font-style:italic; color:var(--oxblood)` - the
   second half of the line goes italic and takes the accent,at essentially
   the same weight as the roman half (his roman is wght 400,his italic 380).
   Ours holds 700 for both,which needs a real bold italic: Libre Baskerville
   serves one at ital,wght@1,700 and it is a distinct file on gstatic,not a
   synthesised oblique - checked. --accent on paper is 7.02 : 1. */
.hero h1.long em{
  font-style:italic;
  /* 400, with the roman half. It was 700 when the headline was; the parity
     revision took the whole line to his weight and the italic follows it, so
     this is still one weight across the line and still a real cut face -
     Libre Baskerville ital,wght@1,400 - and not a synthesised oblique. */
  font-weight:400;
  color:var(--accent);
}

/* His .hero__sub::first-letter, value for value:
     font-family var(--serif) | weight 500 | italic
     font-size 3.4em | line-height .85 | float left
     margin 8px 12px -2px 0 | color his accent
   Ours takes --serif (Lora, which has a real 500 and a real 500 italic - both
   added to the font request for this) and --accent. On .best at 1.06rem the
   3.4em cap renders about 65px. */
.best::first-letter{
  font-family:var(--serif);
  font-weight:500;
  font-style:italic;
  font-size:3.4em;
  line-height:.85;
  float:left;
  margin:8px 12px -2px 0;
  color:var(--accent);
}


/* ==================================================================
   HERO BUTTONS - ELIAS'S TREATMENT

   His base .btn, which is what his own hero pair uses (btn / btn--ghost,
   no --big): uppercase, letter-spacing .22em, font-size .78rem, gap 10px,
   and the ::after arrow in var(--serif) at 1.1rem with letter-spacing 0.
   Ours takes all of that. The fills stay ours - accent and ghost - and the
   labels stay ours.

   PADDING IS NOT HIS, and it had to move again. His is 16px 28px. Ours was
   1.55rem, set earlier so the pair fits the 477px hero column side by side.
   His tracking and the new arrow add ~16px to each button, which pushed the
   pair to 492px and broke that fit, so the side padding comes down to 1.24rem
   - the pair is 470px in a 477px column. The earlier decision stands; only
   the number that serves it moved.
   ================================================================== */
.hero .btn-row.top-cta .btn{
  display:inline-flex;align-items:center;gap:10px;
  font-size:.78rem;letter-spacing:.22em;text-transform:uppercase;
  white-space:nowrap;
}.hero .btn-row.top-cta .btn::after{
  content:"\2192";
  /* 17.6px - the third arrow on the page, converted with the other two so
     every arrow is one size. His base .btn::after is 1.1rem at his 16px
     root, so this is his rendered value too. It makes the hero pair ~4px
     narrower, which only adds slack to the 470-in-477px column fit noted
     above. */
  font-family:var(--serif);font-size:17.6px;letter-spacing:0;
  transition:transform .25s ease;
}.hero .btn-row.top-cta .btn:hover::after{transform:translateX(4px)}
@media (prefers-reduced-motion:reduce){.hero .btn-row.top-cta .btn::after{transition:none}.hero .btn-row.top-cta .btn:hover::after{transform:none}
}

/* ==================================================================
   THE COVER FRAME - ELIAS'S TREATMENT

   His .single-product__cover-frame is a light mat, not a border: no border
   property at all, no radius, 14px of padding, background var(--paper) and
   box-shadow var(--shadow-page) = 0 22px 60px -10px of his ink at 25%. The
   cover inside carries border-radius 2px. On his own --paper page the mat is
   the same color as the ground, so it is the shadow that lifts it - and the
   same is true here, which is why this is a faithful port rather than a
   different effect.

   The cover's own shadow stays a filter: drop-shadow, not his box-shadow,
   so it follows the art's alpha and not its box. The current art is a flat
   opaque 2:3 rectangle, so the two coincide today. The hover is untouched.
   ================================================================== */
.offer-shot{
  background:var(--paper);
  box-shadow:0 22px 60px -10px rgba(0,0,0,.25);
}.offer-shot img{border-radius:2px}

/* ==================================================================
   MONEY

   Every dollar figure on the page in one face. His $47 is
   .single-product__price - var(--serif), weight 500 - with its em set
   font-style:italic, and he uses var(--serif) at 500 for every other figure
   on the page too (.hero__stat-num, .book__price, .math__col figures,
   .math__total .num, .tier__price em, .includes__today).

   FONT ONLY. Family and style, nothing else: no size, no color, no weight.
   Every figure keeps whatever its context gives it, and the .highlight spans
   the figures sit inside keep their color and their 700.

   Our --serif is Lora, and Lora's 400 and 500 italics are both real cuts
   already in the font request - they were added for the drop cap. Nothing is
   synthesised and nothing new had to be requested.

   NOT .money: that class already exists in this stylesheet, inherited from
   the source build, and it carries color:var(--free-green). Reusing it would
   have turned every figure on the page green.
   ================================================================== */
.fig{font-family:var(--serif);font-style:italic}



/* ==================================================================
   THE ARITHMETIC - ELIAS YODER'S TWO-COLUMN BLOCK

   His .math__grid / .math__col / .math__total / .math__note / .math__delta,
   value for value:

     grid          two columns, gap 56px; one column and gap 48px on his
                   mobile breakpoint
     h3            1.6rem, margin-bottom 28px, flex baseline, gap 16px,
                   padding-bottom 18px, border-bottom 1px solid
     h3 span       .7rem / .24em / uppercase, in his gold
     li            flex space-between, baseline, padding 14px 0,
                   border-bottom 1px DASHED, font-size 1.02rem
     li figure     var(--serif), weight 500, 1.15rem
     total         margin-top 24px, padding 22px 0 4px, border-top 2px solid
     total .lab    .78rem / .22em / uppercase
     total .num    var(--serif), 2.6rem, weight 500; the "after" column's
                   number italic, the "before" column's not
     note          margin-top 18px, .7rem / .1em
     delta         max-width 760px, margin 48px auto 0, padding 22px 28px,
                   border-left 4px solid the accent, var(--serif) 1.05rem,
                   centered

   His block is light-on-dark; ours keeps its tile band, so the mapping is the
   one this build has used throughout: his --paper -> --ink, --paper-deep ->
   --ink-soft, --ink-mid -> --line-strong, --gold / --gold-soft -> --accent.

   His .math__delta names background:var(--paper-2), a token that is never
   defined anywhere in his stylesheet - so it renders transparent on his own
   page, and it is transparent here. The 4px bar is the whole treatment.

   The section container widens from .narrow to .wrap: two columns will not
   sit in a 680px measure. The head keeps .narrow so the reading line does
   not blow out with it.
   ================================================================== */
.ledger-head{margin-inline:0}.mx-grid{display:grid;grid-template-columns:1fr 1fr;gap:56px;margin-top:2.2rem}.mx-col h3{
  font-size:25.6px;color:var(--ink);
  margin:0 0 28px;padding-bottom:18px;
  /* No flex-wrap: his h3 has none, so a long title wraps inside its own flex
     item and the small-caps unit stays beside it on the first line. With wrap
     on, the unit dropped to a line of its own and made the head a step taller
     than it needs to be. */
  display:flex;align-items:baseline;gap:16px;
  border-bottom:1px solid var(--line-strong);
}/* "One trip, two travelers" - his .math__col h3 span, value for value:
   --mono (our --ui), .7rem = 11.2px rendered, .24em, uppercase. His IS
   uppercase, so this one keeps its caps; the head beside it does not. */
.mx-col h3 span{
  font-family:var(--mono);font-size:11.2px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--accent);font-weight:600;
  line-height:1.04;
}.mx-col ul{list-style:none;padding:0;margin:0}.mx-col li{
  display:flex;justify-content:space-between;align-items:baseline;gap:1.2rem;
  padding:14px 0;border-bottom:1px dashed var(--line-strong);
  /* his 1.02rem at a 16px root = 16.32px rendered; 26.4384 / 16.32 = 1.62 */
  font-size:16.32px;line-height:1.62;color:var(--ink-soft);
}.mx-col li span:last-child{
  /* his 1.15rem = 18.4px rendered; 29.808 / 18.4 = 1.62 */
  font-family:var(--serif);font-weight:500;font-size:18.4px;line-height:1.62;
  color:var(--ink);white-space:nowrap;
}.mx-total{
  margin-top:24px;padding:22px 0 4px;
  display:flex;justify-content:space-between;align-items:baseline;gap:1rem;
  border-top:2px solid var(--accent);
}.mx-total .lab{
  /* his .math__total .lab: --mono, .78rem = 12.48px rendered, .22em, and
     weight 400 - it inherits his body weight, it is not bolded. Ours ran
     Oswald 600 at 14.04px, which read heavier and narrower than his. */
  font-family:var(--mono);font-size:12.48px;letter-spacing:.22em;
  text-transform:uppercase;color:var(--accent);font-weight:400;
  line-height:1.62;
}.mx-total .num{
  /* his 2.6rem = 41.6px rendered, line-height 1 */
  font-family:var(--serif);font-size:41.6px;line-height:1;font-weight:500;
  white-space:nowrap;
}.mx-col--before .mx-total .num{color:var(--ink-mute)}.mx-col--after  .mx-total .num{color:var(--accent);font-style:italic}/* ============================================================
   HIS HEADING TREATMENT, on the four heads that were asked for.

   His global rule is  h1,h2,h3,h4{ font-family:var(--serif); font-weight:600;
   line-height:1.04; letter-spacing:-.022em }  and NO text-transform - his
   heads are a serif in mixed case with the tracking pulled tight.

   Ours is the opposite by default: --display (Oswald), uppercase, line-height
   1.12, letter-spacing +.02em. That is why these read nothing like his even
   when the pixel size matched - the size was right and the face, the case and
   the tracking were all wrong.

   Scoped to these heads only. The rest of the page keeps its own heading
   treatment; only the four that were named move. Our colours stay.

   Sizes are in px for the same reason everything else in this block is: they
   are HIS rendered sizes at his 16px root, and a rem here resolves against 18.
   ============================================================ */
#ledger h2,
.mx-col h3,
.lastcall h2{
  font-family:var(--serif);
  font-weight:600;
  text-transform:none;
  line-height:1.04;
}
/* His h1..h4 run -.022em and his h3 rule pulls it back to -.015em. Split
   here rather than set in .mx-col h3 above: this block is later in the file,
   so a value there would lose to this one at equal specificity. */
#ledger h2,.lastcall h2{letter-spacing:-.022em}
.mx-col h3{letter-spacing:-.015em}

/* HIS .math__note, measured off his page and copied value for value. The
   small caps this used to run are gone: his is mixed case, and the ask was
   for his treatment, not a variation on it.

   font-size is in px on purpose, the same reason #ledger h2 is: 11.2px is his
   RENDERED size (.7rem at his 16px root), and .7rem here would be 12.6px
   against our 18. "Same size as his" means the same pixels. */
.mx-note{
  margin:18px 0 11.2px;max-width:none;
  font-family:var(--mono);font-size:11.2px;font-weight:400;letter-spacing:.1em;
  text-transform:none;line-height:1.62;text-align:start;
}/* HIS .math__delta, value for value. His paragraph is 400 and the figure
   inside it is a <strong> at 700; our line IS that strong end to end, with no
   trailing sentence, so it carries the 700.

   16.8px, again in px: it is his rendered size (1.05rem at his 16px root).
   26.04 / 16.8 = 1.55 leading, centered, 760 wide, 48 above, 22/28 padding,
   and the 4px left rule - all his. */
.mx-delta{
  /* HIS BOX IS TWO LINES TALL AND OURS IS ONE, so his 4px rule ran 96px and
     ours ran 70. His second line is the trailing sentence after the <strong>,
     which we do not have and cannot invent - copy is final. The rule is given
     his length directly instead: 2 x 26.04 leading + 22 + 22 padding = 96.08.
     Block, not flex: flex turns the text node and the <span class="fig"> into
     separate anonymous items and eats the space between them, which printed
     "date:$3,782". It also has to stay block to sit the line at the TOP of the
     box, which is where his sits - his second line is the one that is
     invisible, not his first. */
  min-height:96px;box-sizing:border-box;
  max-width:760px;margin:48px auto 0;padding:22px 28px;
  border-left:4px solid var(--accent);
  font-family:var(--serif);font-size:16.8px;font-weight:700;line-height:1.55;
  color:var(--ink);text-align:center;
}
/* HIS ONLY MOBILE OVERRIDE FOR THIS BLOCK, and it is the whole of it:
   `@media (max-width:1040px){.math__grid{grid-template-columns:1fr;gap:48px} }`.
   Checked across his whole stylesheet - he does not shrink the heads or the
   figures on a phone, so neither does this. The 1040px is his too; our
   container is 1080px against his 1240px, so ours would have held two columns
   a little longer, but the breakpoint is part of what was asked for. */
@media (max-width:1040px){.mx-grid{grid-template-columns:1fr;gap:48px}
}


/* ==================================================================
   THE ARITHMETIC ON A DARK FIELD - HIS COLOR RELATIONSHIPS

   His block is the one dark band in the middle of his page, and every
   element in it is recoloured for that ground. Measured off his live page:

     section       #15110B   his --ink, full bleed
     h2 / h3 / row figure   --paper       brightest
     lede / row label       --paper-deep  one step down
     eyebrow / unit / total label / "good" number   --gold-soft   his accent
     total rule             --gold        the accent, heavier
     hairlines              --ink-mid
     note                   --ink-mute    dimmest
     "bad" number           #E8C5A6       its own warm, brighter than the body

   Mapped to ours on --ink-deep, the same token the Last Call and the
   footer use. One accent (teal) plus one alert red on the net line, which
   is his structure:

     brightest              --paper                       13.47 : 1  AAA
     muted body             cream at 82%                   9.47 : 1  AAA
     accent                 --accent-lift                  8.88 : 1  AAA
     note                   cream at 68%                   6.93 : 1  AA
     net line               --signal-lift lifted to 4.75   4.75 : 1  AA
     hairlines              cream at 16%                   non-text

   TWO OF HIS OWN VALUES WERE NOT COPIED, because they fail on his own
   page: his note is #786B53 on #15110B, 3.61 : 1, and his delta text is
   #15110B on #15110B, 1.0 : 1 - invisible. Ours are 6.93 and 4.75.

   The "bad" number takes --paper rather than a fourth hue: his #E8C5A6 is
   a warm that has no equivalent here, and the brightest tone does the same
   job of making the costly column's total the loudest thing in it.
   ================================================================== */
#ledger{background:var(--ink-deep);border-block:0;color:var(--paper)}#ledger .eyebrow{color:var(--accent-lift)}#ledger .eyebrow::after{background:rgba(245,242,234,.16)}/* His .math h2 is clamp(2.2rem, 4.6vw, 3.8rem) at a 16px root, which is
   clamp(35.2px, 4.6vw, 60.8px) rendered. Written in px here on purpose: the
   target is his RENDERED size, not his rem, and px is immune to our root
   being 18 to his 16. Only this section's h2 - every other h2 on the page
   keeps the page's 2.15rem.

   Line-height comes with it. His is 1.04 against our heading default of 1.12;
   at 60px that is a 5px difference per line and the head would otherwise sit
   loose against his. */
#ledger h2{
  color:var(--paper);
  font-size:clamp(35.2px,4.6vw,60.8px);
  margin:0 0 18px;          /* his .sec__title h2 */
}
/* The eyebrow and the lede, the last two in the block that were still on our
   own values. His .eyebrow is --mono .74rem weight 500 at .24em; ours ran
   --ui (Oswald) weight 700 at .2em, which is the same "condensed and heavy
   against his even monospace" difference the note had. His .sec__lede is
   1.15rem = 18.4px rendered.

   The hairline after the eyebrow is OURS and stays: his eyebrow has none, but
   every other eyebrow on this page does, and dropping it here only would make
   this section the odd one out. */
#ledger .eyebrow{
  font-family:var(--mono);font-size:11.84px;font-weight:500;
  letter-spacing:.24em;line-height:1.62;margin:0 0 18px;
}
.ledger-head p:not(.eyebrow){font-size:18.4px;line-height:1.62}
.ledger-head p{color:rgba(245,242,234,.82)}.mx-col h3{color:var(--paper);border-bottom-color:rgba(245,242,234,.16)}.mx-col h3 span{color:var(--accent-lift)}.mx-col li{color:rgba(245,242,234,.82);border-bottom-color:rgba(245,242,234,.16)}.mx-col li span:last-child{color:var(--paper)}.mx-total{border-top-color:var(--accent-lift)}.mx-total .lab{color:var(--accent-lift)}.mx-col--before .mx-total .num{color:var(--paper)}.mx-col--after  .mx-total .num{color:var(--accent-lift)}/* HIS note grey, hue and saturation untouched, lightness raised until it
   clears AA on OUR ground. His #786B53 is hsl(38.9, 18.2%, 39.8%); it reads
   3.61 on his near-black and only 2.91 on this teal, which is lighter. Same
   hue, same saturation, lightness 39.8% -> 51.4% = #93A0B4, 4.50 : 1. It is
   his warm taupe, not a neutral: the cream-at-68% this replaces was a
   different colour family and read far brighter than his. */
.mx-note{color:#93A0B4}

/* HIS OXBLOOD, LITERALLY. --oxblood: #7A1F0E off his :root, on the text and
   on the 4px rule, exactly as .math__delta strong and .math__delta's
   border-left carry it.

   Asked for by name after a lifted version was rejected. It is 1.47 : 1 on
   this ground and 1.82 : 1 on his own, so it is quiet on both pages - see the
   --paper-2 note in HANDOFF for the panel that was meant to sit behind it.

   SUPERSEDED 2026-09-06, AND THE EARLIER DECISION IS RECORDED, NOT DROPPED.
   That decision was made when this line was a cost caption. The parity
   revision changed what it says: it now carries the page's headline net
   figure, the same $3,000 the hero, the offer H2 and the last call all
   repeat. A figure that load-bearing cannot sit at 1.47 : 1.

   THE LIFT IS THE ONE .mx-note ALREADY USES, twenty lines up: same hue, same
   saturation, lightness raised until it clears AA on OUR ground and no
   further. --signal-lift is #E8584F = hsl(3.5, 76.9%, 61%) and reads 4.29 : 1
   here, which is under the bar; lightness 61% -> 64% gives #E8584F at
   4.71 : 1. Same hue, same saturation, same signal family - that token at the
   step this ground needs, not a different colour.

   GEOMETRY IS UNTOUCHED. Only the two colour declarations move; the 4px rule,
   the 760 max-width, the 96px min-height, the padding and the centring are
   all still his. */
.mx-delta{color:#E8584F;border-left-color:#E8584F}


/* ==================================================================
   THE SEASONED CRUISER REVISION, PORTED 2026-09-09.

   Everything below this line is lifted off the cruise build component
   by component, with only this shop's own tokens substituted. Where a
   figure is a colour it is recomputed against this palette and the
   ratio is written beside it; where a figure is geometry it is the
   cruise build's own and is not re-derived.

   IT SITS AT THE FOOT OF THE FILE ON PURPOSE. The two overrides that
   have to win - `#ledger .sec-num` and the ledger's own head colours -
   are scoped to a section whose dark block is declared 600 lines up,
   and sitting last is what makes them win without touching it.
   ================================================================== */


/* ---------- 1. THE SECTION HEAD AND ITS NUMERAL ----------
   SIX NUMBERED SECTIONS: 01 the offer, 02 how it works, 03 the honest
   math, 04 look inside, 05 reader results, 06 questions. Last Call is
   unnumbered.

   THE HEAD, HIS VALUES, read off the cruise build and confirmed against
   a live render at 1920 and 390. That build's root is 18px and its
   figures are written in px - the same convention .ep-price and
   .hero-mark in this file already follow:

     h2      font-size:38px (30px at the 640 step); margin-bottom:12px;
             text-align:center. The serif at weight 700, line-height 1.6 -
             so --serif here, and NOT the global uppercase Oswald.
     .lead   font-size:20px (18px at 640); text-align:center;
             max-width:60ch; margin:0 auto; colour --ink-soft.

   THE NUMBER LINE has one type and two placements.

   The type is 14px --mono, weight 500, .24em, uppercase, on the accent,
   and it is the same in both. --mono is this page's own face for a small
   tracked mark and has been since the arithmetic block was built.

   IN 02 AND 04 it is a centred block line above the H2, which is what
   those two sections were asked for.

   IN 01, 03, 05 AND 06 it is its own line directly above the eyebrow,
   sharing the eyebrow's left edge - not hung in the margin. The cruise
   build tried the margin at Elias Yoder's own 168px offset (his
   .sec__head is `grid-template-columns:120px 1fr; gap:48px`) and it read
   as a figure floating off on its own rather than as part of the head it
   numbers, so the stacked shape is the only shape.

   Contrast: --accent on --paper 9.18 : 1, on --tile 9.75 : 1. 03 sits on
   the arithmetic's dark ground where --accent measures 1.47 : 1 and
   disappears, so it takes --accent-lift-red at 4.70 : 1 - see the token's
   own note in styles.css. */
.sec-head{text-align:center;margin:0 auto var(--sec-in);max-width:none}
.sec-num{
  display:block;max-width:none;
  font-family:var(--mono);font-weight:500;font-size:14px;line-height:1.6;
  letter-spacing:.24em;text-transform:uppercase;color:var(--accent);
  margin:0 0 10px;
}
.sec-head .sec-num{text-align:center}
.ledger-head,.section-head,#faq > .wrap,.offer-detail{position:relative}
.sec-head h2{
  font-family:var(--serif);font-weight:700;text-transform:none;
  font-size:38px;line-height:1.6;letter-spacing:normal;
  text-align:center;color:var(--ink);margin:0 0 12px;max-width:none;
}
.sec-head .lead{
  font-size:20px;line-height:1.6;text-align:center;color:var(--ink-soft);
  max-width:60ch;margin:0 auto;
}
/* The arithmetic is the one head on a dark ground, and it is the one
   section the accent change deliberately did not touch. Its numeral takes
   the hue-preserving lift; its ground, its totals and its net line are
   untouched. */
#ledger .sec-num{color:var(--accent-lift-red)}
@media (max-width:640px){
  .sec-head h2{font-size:30px}
  .sec-head .lead{font-size:18px}
}


/* ---------- 2. THE HERO PULL-QUOTE - REMOVED ----------
   `.hero-media{position:relative}`, `.hero-pull`, `.hero-pull small` and the
   three media queries that went with them - the .18em byline step under
   420px, the 1.6rem top margin at 820 and the left axis inside the centred
   mobile column - were deleted on instruction.

   What they styled: the book's own field-note device, a 2px --line-strong
   hairline down the left edge, a 20px indent, 16.64px serif italic, and a
   10.56px --mono byline at .22em beneath it. Ported off the cruise build,
   whose own geometry those two figures are, and checked against a real
   plate: flyer-preview-1-bumped.png sets its "THE OFFICIAL SOURCE" aside as
   a 3px #F6C335 rule with the first ink at x108.

   `position:relative` on .hero-media went with them and is not kept: it
   existed only so an absolutely-positioned card could hang off it, and no
   card was ever positioned there once the device was the hairline. The four
   other rules that select .hero-media set the grid area, the column cap and
   the mobile width, and none of them needs a containing block - checked,
   not assumed.

   Recorded rather than silently dropped, the way this build records its
   other removals. If it ever comes back, the measurement is in HANDOFF 23.3
   and the markup tombstone is in index.html. */


/* ---------- 3. HOW IT WORKS - HIS .step ----------
   A filled circle beside the text, not a numeral over a hairline. His
   declarations, verbatim:

     .steps   display:flex; gap:26px; justify-content:center;
              flex-wrap:wrap; max-width:940px; margin:0 auto
              (column, gap 16px, at his 640 step)
     .step    flex:1 1 250px; max-width:300px; display:flex; gap:14px;
              align-items:flex-start; text-align:left
     .step>b  flex:none; 42x42; border-radius:50%;
              background:linear-gradient(180deg,#d99a45,#B5772C);
              color:#fff; font-size:19px; flex-centred;
              box-shadow:0 4px 12px rgba(181,119,44,.3)
     .st      font-size:19px; font-weight:bold; margin-bottom:3px
     .sd      font-size:16px; line-height:1.5; colour --ink2
     .hownote text-align:center; margin-top:30px; font-size:19px

   HIS GRADIENT IS TWO STEPS OF HIS OWN GOLD, light to dark. Ours is the
   two accent tokens this palette already has, in the same order and the
   same direction - no colour is invented for it. White on --accent is
   10.35 : 1 and on --accent-dark 13.71 : 1, so the numeral clears AAA
   against either end of the sweep. The shadow follows the accent too. */
.steps{
  display:flex;gap:26px;justify-content:center;flex-wrap:wrap;
  max-width:940px;margin:0 auto;text-align:left;
}
.step{
  flex:1 1 250px;max-width:300px;display:flex;gap:14px;
  align-items:flex-start;text-align:left;
}
.step > b{
  flex:none;width:42px;height:42px;border-radius:50%;
  background:linear-gradient(180deg,var(--accent),var(--accent-dark));
  color:#fff;font-family:var(--serif);font-size:19px;font-weight:700;
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 4px 12px rgba(119,86,24,.3);
}
.step .st{
  font-family:var(--serif);font-size:19px;font-weight:700;
  text-transform:none;line-height:1.6;color:var(--ink);margin:0 0 3px;
}
.step .sd{font-size:16px;line-height:1.5;color:var(--ink-soft);max-width:none}
.hownote{
  text-align:center;margin:30px 0 0;font-size:19px;color:var(--ink);
  max-width:none;
}
@media (max-width:640px){
  .steps{flex-direction:column;align-items:center;gap:16px}
  .step{max-width:100%;flex:0 0 auto}
}


/* ---------- 4. THE PAGE STRIP - HIS .scroller / .pgfig ----------
   THE IMAGE IS THE CARD. No mat, no tile ground, no page shadow behind a
   frame: a 1px rule, an 8px radius and a drop shadow, straight on the
   image. His declarations, verbatim:

     .scroller  display:flex; gap:18px; overflow-x:auto;
                padding:6px 4px 18px; scroll-snap-type:x mandatory;
                -webkit-overflow-scrolling:touch
     .pgfig     flex:none; width:300px; scroll-snap-align:center
                @media(max-width:640px){ width:86vw }
     .pgfig img width:100%; height:auto; border:1px solid var(--line);
                border-radius:8px; box-shadow:0 12px 30px rgba(0,0,0,.16);
                display:block; background:#fff
     .zoom      position:absolute; right:9px; bottom:9px;
                background:rgba(0,0,0,.72); color:#fff; font-size:12px;
                letter-spacing:.04em; padding:6px 10px; border-radius:20px
     .pgcap     font-size:15px; margin-top:10px; line-height:1.45
     .scrollhint text-align:center; font-size:15px; margin-top:4px

   TWO CONVERSIONS, both the cruise build's standing ones. His
   aspect-ratio is 662/1000, his own plate shape; ours is 320/414, which
   is US Letter and is what our plates are - 1100 x 1424 measured, ratio
   0.7725 against Letter's 0.7727. And his .zoom is Arial at 12px - he
   has no mono anywhere - where this page's face for a small tracked mark
   is --mono. The pill's ground is his near-black at his opacity, recast
   onto this page's own ink: rgba(11,19,38,.78), which is --ink-deep.
   Over the plates' own cream, sampled at #F9F4EC in the bottom-right
   corner of all five, that composites to #3F5658, and white on it
   measures 7.83 : 1.

   TOUCH-HANDLING, AND THIS IS THE FIX THAT MATTERS ON A PHONE. The tile
   is a <button>, so without these two declarations a horizontal drag
   starting on a tile is claimed by the button and the strip does not
   move - the swipe is swallowed by the lightbox trigger. touch-action:
   pan-x hands the horizontal axis to the scroller before the button sees
   it, and overscroll-behavior-x:contain stops a drag past the last tile
   turning into a page-level back-swipe. The lightbox still opens on a
   tap, because the binding is a click and a drag is not one. */
.pages{margin:0}
.scroller{
  display:flex;gap:18px;overflow-x:auto;overscroll-behavior-x:contain;
  padding:6px 4px 18px;margin:0;list-style:none;
  scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
  touch-action:pan-x;
}
.pgfig{flex:none;width:300px;scroll-snap-align:center;margin:0}
.page-btn{
  display:block;width:100%;position:relative;padding:0;margin:0;
  border:0;background:none;cursor:zoom-in;font:inherit;color:inherit;
  transition:transform .45s cubic-bezier(.2,.8,.3,1);
}
.page-btn:hover{transform:translateY(-4px)}
.pgfig img{
  display:block;width:100%;height:auto;aspect-ratio:320/414;
  border:1px solid var(--line);border-radius:8px;background:#fff;
  box-shadow:0 12px 30px rgba(0,0,0,.16);
}
.zoom{
  position:absolute;right:9px;bottom:9px;
  background:rgba(11,19,38,.78);color:#fff;
  font-family:var(--mono);font-size:12px;letter-spacing:.04em;
  padding:6px 10px;border-radius:20px;
}
/* THE CAPTION HAS TO NAME ITS FACE. His inherits Georgia from <body>,
   because his whole page is set in a serif; ours would inherit Atkinson
   Hyperlegible, which is this page's body sans, and the caption would be
   the one part of the card that was not his. */
.pgcap{
  font-family:var(--serif);font-size:15px;line-height:1.45;color:var(--ink-soft);
  margin:10px 0 0;max-width:none;text-align:left;
}
.scrollhint{
  text-align:center;font-size:15px;color:var(--ink-soft);
  margin:4px 0 var(--sec-in);max-width:none;
}
@media (max-width:640px){.pgfig{width:86vw}}


/* ---------- 5. THE LIGHTBOX ----------
   The point of this control is to let someone read a page of the book, so
   the page gets the viewport:

     - the image takes the full height less a small margin, centred
     - a CIRCULAR close button top right, 48px, which is a thumb target
       rather than a mouse target
     - a "pinch to zoom" hint top left, small and quiet, because the
       affordance that matters on a phone is the one the browser gives you
       and nothing else on the overlay says so
     - the caption in --serif under the image, centred, at 56ch rather
       than the image's width

   Escape and a backdrop click both close it.

   THE BACKDROP IS THIS PALETTE'S OWN. It is #06121F against this shop's
   --ink-deep #0A1D31 - each channel at .600 / .621 / .633 of the token.
   The reference build carries the same three factors on its own teal
   --ink-deep and lands on #061A1D; the construction is shared and only the
   ground under it differs. Paper on ours is 16.70 : 1, the caption at .92
   is 14.15 : 1 and the hint at .62 is 6.83 : 1. */
.pv{
  position:fixed;inset:0;z-index:9997;display:none;
  align-items:center;justify-content:center;
  padding:3.4rem 1rem 1rem;
  background:rgba(8,14,29,.94);
}
.pv.open{display:flex}
.pv-fig{
  margin:0;display:flex;flex-direction:column;align-items:center;
  max-width:100%;max-height:100%;
}
.pv-fig picture{display:block;min-height:0}
.pv-fig img{
  display:block;width:auto;height:auto;
  max-width:100%;max-height:calc(100vh - 11rem);
  background:var(--tile);
  box-shadow:0 26px 70px -12px rgba(0,0,0,.6);
}
.pv-cap{
  margin:1.1rem auto 0;max-width:56ch;
  font-family:var(--serif);font-size:1rem;line-height:1.5;
  color:rgba(245,242,234,.92);text-align:center;
}
.pv-hint{
  position:absolute;top:1.1rem;left:1.1rem;
  font-family:var(--mono);font-size:.64rem;letter-spacing:.18em;
  text-transform:uppercase;color:rgba(245,242,234,.62);
}
.pv-close{
  position:absolute;top:.9rem;right:.9rem;
  width:48px;height:48px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:rgba(245,242,234,.12);border:1px solid rgba(245,242,234,.34);
  color:var(--paper);font-family:var(--serif);font-size:1.7rem;line-height:1;
  cursor:pointer;padding:0;
}
.pv-close:hover{background:var(--accent);border-color:var(--accent);color:#fff}
.pv-close:focus-visible{outline:3px solid var(--paper);outline-offset:3px}
@media (max-width:560px){
  .pv{padding:3.4rem .6rem .6rem}
  .pv-fig img{max-height:calc(100vh - 12rem)}
  .pv-cap{font-size:.92rem;margin-top:.9rem}
}


/* ---------- 6. 04's CHECKMARKS - REMOVED, fifth set ----------
   `#inside .wyg-checks{margin:2rem auto 0;max-width:46ch;text-align:left}`
   stood here. It was the rule that actually governed the four checkmarks -
   0,1,1, beating the bare class - and it set their centred column, their
   46ch cap and their left-set text. The bullets are gone from the page and
   so is it. Nothing else selected the class. */


/* ==================================================================
   THE SET OF 2026-09-10 - 06 ORDER THE RULE BOOK, 07 STILL DECIDING,
   AND THE EXIT MODAL'S EMAIL CAPTURE.

   Two new sections and one replaced line inside the modal. The shapes
   are otisgranger.com's, read off his live stylesheet on 2026-09-10;
   the colours are this shop's tokens and every ratio below was computed
   by tools/contrast.py, not estimated.

   THIS BLOCK SITS AT THE FOOT OF THE FILE for the same reason the
   Seasoned Cruiser block above it does: the two rules that have to win
   - `.shopbuy` over `.ep-btn`, and `.xi .xi-cap-go` over `.btn` - are
   at equal specificity with declarations six hundred lines up, and
   sitting last is what settles them without touching either.
   ================================================================== */


/* ---------- 1. 06's PRODUCT CARD - REMOVED, 2026-09-10 ----------
   Otis Granger's `.shopcard` stood here for one set. 06 is now a repeat of
   section 01 on Elias Yoder's closing offer block, at 01's own geometry,
   so every rule that drew that card is gone: `.shopcard`, `.shoptop`,
   `.shopcov`, `.shopinfo`, `.shopname`, `.shopprice`, `.shopbuy`,
   `.shopfoot`, `.shopfoot span`, the middle-dot `::before` and the 640px
   step that stacked the cover. Tombstoned rather than deleted quietly,
   which is how this build records its removals.

   What they were, for the record: a 980px box at a 20px radius under
   `0 24px 70px rgba(0,0,0,.10)`, 38px of padding at a 38px gap, a 240px
   cover tilted -1.5deg, a 33px serif product name, and a 1px-ruled centred
   trust row at 13.5px.

   `.shopbul` SURVIVED ONE MORE SET AND IS NOW GONE TOO. It capped the four
   checkmarks while they sat in 06's copy column; they are back in 04 and
   `.wyg-checks` caps them there, which is the rule they had before any of
   this. Nothing selects `.shopbul` any more and no rule is orphaned by its
   removal. */


/* ---------- 2. 09's FORM - HIS `.cform` ----------
   His declarations, verbatim on the geometry:

     .cform            max-width:520px; margin:0 auto; text-align:left
     label             block; 15px; bold; margin:14px 0 5px
     input, textarea   100%; padding:13px 14px; 16px; font-family:inherit;
                       1px border; 10px radius; box-sizing:border-box
     textarea          min-height:120px; resize:vertical
     button            width:100%; margin-top:14px
     .cmsg             16px; margin-top:12px; min-height:1px

   THE 16px ON THE FIELDS IS LOAD-BEARING. Under 16px, iOS Safari zooms
   the viewport on focus and does not zoom back out, which is how a
   form on a fixed-width page ends up scrolled sideways under an open
   keyboard. His figure, and the same reason.

   THE FIELD GROUND IS --paper ON A --tile BAND, so a field reads as a
   well rather than as a shape the same colour as the band behind it.
   His is #fff on his own #FBF6EE box, which is the same relationship.

   Contrast, computed: label and typed value --ink on --paper 10.25 : 1;
   the placeholder at --ink-mute on --paper 4.77 : 1, which clears AA at
   this size; the error and success lines below both clear AA on --tile.
   ---------------------------------------------------------------- */
.cform{max-width:520px;margin:0 auto;text-align:left}
.cform label{
  display:block;font-family:var(--body);font-size:15px;font-weight:700;
  color:var(--ink);margin:14px 0 5px;
}
/* #fff, NOT --paper. His fields are white on his tinted box and ours were
   --paper on --tile, which is a six-unit difference and reads as a border
   rather than as somewhere to type. White is his, and against the band it
   is the only ground on the page that says "type here" without a fill.
   --ink on #fff is 11.42 : 1 and the placeholder at --ink-mute is 5.31 : 1;
   both are in tools/contrast.py. */
.cform input,.cform textarea{
  width:100%;padding:13px 14px;font-size:16px;font-family:inherit;
  line-height:1.5;border:1px solid var(--line-strong);border-radius:10px;
  box-sizing:border-box;background:#fff;color:var(--ink);
}
.cform input::placeholder,.cform textarea::placeholder{color:var(--ink-mute);opacity:1}
.cform textarea{min-height:120px;resize:vertical}
/* His button is full width with 14px above it. The fill and the type are
   `.ep-btn` again, so the three buttons on the page that are not the
   sticky bar all read as one control. */
/* HIS BUTTON'S SIZE, OUR FILL AND OUR FACE. Read off his `.cform button`:
     width:100%; margin-top:14px; padding:15px; font-size:18px;
     border-radius:10px; font-weight:bold; border:0
   Taken: the width, the margin, the padding, the size, the radius and the
   weight. NOT taken: `background:linear-gradient(180deg,var(--gold3),
   var(--gold2))`, which is his gold, and `font-family:inherit`, which on
   his page is a serif body face. This button keeps the oxblood and Oswald
   every other button on the page carries.

   IT IS DELIBERATELY BIGGER THAN `.ep-btn`, which is 13.44px. His form
   button is 18px because it is the only control in a 520px column and has
   no price beside it to share the line with; his inline CTAs are a
   different size on his page too. */
.cform-go{
  display:flex;width:100%;justify-content:center;margin-top:14px;
  padding:15px;font-size:18px;border-radius:10px;font-weight:700;
  /* SENTENCE CASE, same reasoning as the jump link above: .14em of tracking
     was drawn for capitals and reads as gaps under lowercase. */
  text-transform:none;letter-spacing:.04em;white-space:normal;
}
.cform-go::after{font-size:15px}
/* The inline result line, his `.cmsg`. It is a live region in the markup,
   so it is announced without moving focus. min-height keeps the button
   from stepping down the page when the first message arrives. */
.cmsg{
  font-size:16px;line-height:1.5;margin:12px 0 0;min-height:1px;
  max-width:none;color:var(--ink-soft);
}
.cmsg.is-ok{color:var(--free-green);font-weight:700}
.cmsg.is-bad{color:var(--signal-text);font-weight:700}
/* A disabled control has to LOOK disabled to a 65+ reader, not just
   refuse the tap. This is the state the page is in until the owner's
   Kit form id and public key land in landing.js.

   --ink-soft, NOT --ink-mute. WCAG exempts a disabled control from the
   contrast minimum, and this build does not take the exemption: on
   --deep, --ink-mute measures 4.21 : 1 and fails the file's own zero-
   failure rule, while --ink-soft measures 7.01 : 1. The greyed GROUND is
   what says disabled here, not a greyed ink an older reader cannot
   read - and after a successful send these same fields carry the address
   the reader just typed, which they have to be able to check. */
.cform input:disabled,.cform textarea:disabled{background:var(--deep);color:var(--ink-soft)}
.cform-go:disabled,.xi-cap-go:disabled{opacity:.55;cursor:not-allowed}
.cform-go:disabled:hover,.xi-cap-go:disabled:hover{
  background:var(--accent);border-color:var(--accent);transform:none;box-shadow:none;
}


/* ---------- 3. THE EXIT MODAL'S EMAIL CAPTURE ----------
   It stands exactly where `.xi-small` stood - 16px under the primary
   button, inside the same 480px card at the same 50/42/36 padding. The
   card's geometry, its copy above the button and the trigger in
   landing.js are all untouched.

   THE ROW WRAPS RATHER THAN SHRINKS. At 1920 and 1440 the field and the
   button sit side by side; inside the 390px card the button drops under
   the field, because a 13.44px tracked label in a 110px box is not a
   target this audience can hit.

   THE MODAL SCROLLS NOW, AND THAT IS THE KEYBOARD FIX. `.xi` was
   `align-items:center` on a fixed, non-scrolling flex box: with a
   software keyboard open the viewport is about 400px tall, the card is
   taller than that, and the overflow went off both ends with no way to
   reach it - the "Send it to me" button among it. `align-items:flex-start`
   plus `margin:auto` on the card centres it exactly as before whenever
   there is room, and lets it scroll when there is not. Measured at 390
   with the viewport cut to 390x400: card fully reachable, both buttons
   scrollable into view, 0px horizontal overflow.
   ---------------------------------------------------------------- */
.xi{overflow-y:auto;align-items:flex-start}
.xi-box{margin:auto}
.xi .xi-cap{margin:16px 0 0;text-align:left}
/* His `.modal__small` type, kept: the line that replaced the link keeps
   the line the link had. Sentence case rather than small caps, because
   it is a sentence and the address field under it is not a label. */
.xi .xi-cap-copy{
  font-size:.86rem;line-height:1.45;color:var(--ink-soft);
  margin:0 0 10px;max-width:none;text-align:left;
}
.xi-cap-row{display:flex;flex-wrap:wrap;gap:10px;align-items:stretch}
/* --tile, not --paper. The card itself is --paper, so a --paper field is
   a rectangle drawn in the same colour as the thing behind it and reads
   as a border rather than as somewhere to type. His own field is #fff on
   his #FBF6EE card, which is this relationship. --ink on --tile is
   10.87 : 1 and the placeholder at --ink-mute is 5.06 : 1. */
.xi-cap-row input{
  flex:1 1 190px;min-width:0;
  padding:13px 14px;font-size:16px;font-family:inherit;line-height:1.5;
  border:1px solid var(--line-strong);border-radius:4px;
  box-sizing:border-box;background:var(--tile);color:var(--ink);
}
.xi-cap-row input::placeholder{color:var(--ink-mute);opacity:1}
.xi-cap-row input:disabled{background:var(--deep);color:var(--ink-soft)}
/* The secondary control on the card, and it must not out-shout the
   primary one above it: the same accent, at the modal's own small-caps
   scale rather than the button's 13.44px/.22em. */
.xi-cap-go{
  flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  min-height:0;padding:13px 18px;border-radius:4px;cursor:pointer;
  font-family:var(--ui);font-size:12.6px;letter-spacing:.16em;
  text-transform:uppercase;font-weight:600;white-space:nowrap;
  border:1.5px solid var(--accent);background:var(--accent);color:var(--paper);
  transition:background .16s ease,border-color .16s ease;
}
.xi-cap-go:hover{background:var(--accent-dark);border-color:var(--accent-dark)}
.xi .cmsg{font-size:.9rem;margin-top:10px}
@media (max-width:480px){
  .xi-cap-go{flex:1 1 100%}
}


/* ==================================================================
   THE SET OF 2026-09-10 (SECOND) - 04's JUMP LINK, 06 AS A REPEAT OF 01,
   THE FOOTER LINE, AND THE MODAL'S TWO STEPS.
   ================================================================== */


/* ---------- 04's JUMP LINK - his `.lookcta` ----------
   `text-align:center; margin-top:34px`, his figures. The button inside it
   is `.ep-btn`, so it is the page's primary button and not a second one,
   and at his 640 step it goes full width inside a 340px cap the way his
   does. It carries a down arrow instead of `.ep-btn`'s right arrow,
   because it points down the page. */
.lookcta{text-align:center;margin-top:34px}
/* NO CAP AT DESKTOP, which is his own arrangement: his `.cta` is an
   inline-block that takes the width of its label, and the 340px cap lives
   only in his 640 step.

   `white-space:normal` IS THE ONE DEPARTURE FROM `.ep-btn`, and only here.
   The shared button is `nowrap`, which is right for a five-word buy label
   and wrong for a nine-word sentence: at 360 this label is 330px of
   unbreakable line inside a 331px column, and one more character would put
   it off the screen. Letting this one wrap inside his own 340px cap is
   what he does with it too. Measured at 360: 0px horizontal overflow. */
.ep-btn--jump{justify-content:center;white-space:normal}
/* SENTENCE CASE, and the tracking comes down with it. `.ep-btn` sets
   `text-transform:uppercase` at .22em, which is drawn for a five-word label
   in capitals; the same .22em under lowercase letters opens the word spaces
   wider than the letter spaces and the line stops reading as a sentence.
   .06em is the smallest step that keeps the label looking set rather than
   typed, and it is the only figure here that is not `.ep-btn`'s own. */
.ep-btn--jump{text-transform:none;letter-spacing:.06em;font-size:15px}
.ep-btn--jump::after{content:none}
@media (max-width:640px){
  .lookcta .ep-btn--jump{display:flex;max-width:340px;margin-inline:auto}
}


/* ---------- 06's LEAD ----------
   Directly under the H2, which the reference has in this block and 01 does
   not: 01's `.ep-lede` sells the book and this one sells the delivery and
   the guarantee.

   ITS OWN CLASS, NOT A SECOND `.ep-lede`. The product paragraph below keeps
   that class, so the two stay separately addressable and every check
   written against "06's paragraph" still means the product paragraph. The
   type is `.ep-lede`'s, figure for figure, because they are the same voice
   at the same measure. */
.ep-intro{
  font-size:1.06rem;color:var(--ink-soft);line-height:1.55;
  margin:0 0 22px;max-width:none;
}


/* ---------- 06's SHORT PRODUCT BLOCK - REMOVED, sixth set ----------
   `.ep-prod` set the product name in --serif at 1.12rem over an `.ep-lede`
   paragraph, between the lead and the price row. Both are gone from 06: the
   lead above says what arrives and on what terms, the five rows below name
   the five things, and the block was the third description of the same
   product inside one column.

   `.ep-lede` IS NOT TOMBSTONED WITH IT - 01's own lede uses that rule and
   is untouched. Only `.ep-prod` and its bold child came out. */


/* ---------- 06's SHORTENED VALUE ROWS ----------
   BACK, fifth set. It was tombstoned for one set while 06's rows carried
   01's full-length descriptions; they are one clause each again, which is
   what the reference does in its closing block, so the name column no
   longer wraps and the row can close up. `.ep-includes` still draws the
   rules, the padding and the two shaded bands - this only tightens the
   row. 01's own list is untouched. */
.ep-includes--short li{padding:11px 0}
.ep-includes--short .ep-name{align-self:center}


/* ---------- THE FOOTER LINE ----------
   His footer opens on a bold question and a plain link, above the legal
   text. Ours takes that position and that weight; the copy is ours and it
   promises no reply. */
.foot-ask{
  font-size:1rem;line-height:1.55;color:var(--foot-body,#93A0B4);
  margin-bottom:.9rem;
}
.foot-ask a{color:#C6D0DE;text-decoration:underline;text-underline-offset:.2em}
.foot-ask a:hover{color:#fff}


/* ---------- THE EXIT MODAL'S TWO STEPS ----------
   ONE ASK AT A TIME. The card used to carry the buy button AND an email
   field at once, which is two offers competing inside a 480px box. It now
   shows one: the offer, with a plain text link under it that swaps the
   card's body for the capture. The cover and the close button belong to
   the card rather than to either step and stay put across the swap.

   The buy CTA is GONE at the capture step, not dimmed and not scrolled
   past - a reader who has just said "no thanks" is not being sold to
   again in the same box.

   `hidden` is the mechanism, and `.xi-step[hidden]` is declared explicitly
   because `.xi-step` sets a display and would otherwise beat the
   attribute's own UA rule. */
.xi-step{display:block}
.xi-step[hidden]{display:none}

/* The swap link. It is a <button>, not an <a>, because it performs an
   action inside the dialog and navigates nowhere - an href="#" here would
   put a junk entry in the reader's history on the way out of the page.
   Styled as the plain text link the instruction asks for, at `.xi-small`'s
   own size and position so it sits where his small line sat. */
.xi-swap{
  display:inline;margin:0;padding:0;border:0;background:none;
  font-family:var(--body);font-size:.92rem;line-height:1.5;
  color:var(--ink-soft);text-decoration:underline;text-underline-offset:.22em;
  text-decoration-thickness:.06em;cursor:pointer;
}
.xi-swap:hover{color:var(--accent)}
/* SCOPED TO .xi. `.xi p{margin:0 0 22px}` is 0,2,0 and beats a bare
   class on this element, which is a <p> - the same trap `.xi-eyebrow`
   and `.xi-small` both hit before it. It has to keep his 16px, because
   16px under the button is the position his `.modal__small` had and
   the one thing about that slot this set did not change. */
.xi .xi-smallrow{margin:16px 0 0;max-width:none;text-align:center}

/* The capture step. One line of copy, one field, one button - the field
   and the button stacked, both full width, because at the moment a reader
   commits to typing an address there is nothing else on the card to
   balance against. */
.xi-cap{margin:0;text-align:left}
.xi .xi-cap-copy{
  font-size:1rem;line-height:1.5;color:var(--ink-soft);
  margin:0 0 16px;max-width:none;text-align:center;
}
.xi-cap input{
  display:block;width:100%;
  padding:15px 16px;font-size:16px;font-family:inherit;line-height:1.5;
  border:1px solid var(--line-strong);border-radius:10px;
  box-sizing:border-box;background:var(--tile);color:var(--ink);
}
.xi-cap input::placeholder{color:var(--ink-mute);opacity:1}
.xi-cap input:disabled{background:var(--deep);color:var(--ink-soft)}
.xi-cap .ep-btn{margin-top:12px}
.xi .cmsg{font-size:1rem;margin-top:14px;text-align:center}

/* ------------------------------------------------------------------
   03, THE MATH TABLE - the 2026-09-11 rebuild

   Appended; nothing above this line was edited. Both columns carry real
   dollar figures now, so two things the old four-row "$0" column never
   needed have to exist: a row that reads as money IN, and one source
   line under the whole table instead of one note per column.

   `.mx-note` above is NOT deleted - it is simply unused from this set on.
   The per-column notes went when the single source line arrived; the
   rules stay so a later set can put them back without re-deriving the
   greys that were measured for this dark ground.
------------------------------------------------------------------ */
/* The source line, in .mx-note's own measured grey on this ground - same
   hue, same lift - centred under the grid rather than under a column. */
/* HIS `.math__note`, VALUE FOR VALUE - which is what item 12 asked for and
   what the first version of this rule missed: it invented 12.8px in the body
   face and broke five parity measurements that had been passing. His is mono
   at 11.2px, .1em of tracking, an 18.14px line and 18px of top margin. The
   colour is the lift `.mx-note` already measured for this dark ground.
   ONLY THE ALIGNMENT IS OURS: his sits under each column, this sits under the
   whole table, because the brief puts one source line there. */
.mx-src{
  max-width:760px;margin:18px auto 0;text-align:center;
  font-family:var(--mono);font-size:11.2px;letter-spacing:.1em;
  line-height:18.14px;color:#93A0B4;
}

/* ---- 03's NET LINE: ONE CALLOUT, 2026-09-11 (correction pass) ----
   THE CAUSE, MEASURED. His `.math__delta` carries `background:var(--paper-2)`
   - a visible panel - and ours carried none, so on the dark ground the only
   thing that rendered was the 4px rule at the far left edge of an invisible
   760px box, with the centred text stranded in the middle of it. It read as
   a floating rule, which is exactly what it was.
   Two changes and no more: the box gets a panel so the rule has something to
   be attached to, and it shrinks to its own content so the rule sits beside
   the line instead of beside a 760px void.
   THE PANEL IS DARKER THAN THE GROUND, NOT LIGHTER. Lifting it to `--ink`
   would have taken the net line's own red from 4.71 : 1 to 3.58 and failed
   AA; 18% black over the ground gives a panel you can see AND lifts the text
   to 5.14 : 1. Measured both ways before choosing. */
.mx-delta{
  min-height:0;
  width:fit-content;max-width:min(760px,100%);
  background:#0B1326;
  text-align:left;
}
@media (max-width:560px){
  /* At 390 the line wraps, and a fit-content box would go ragged. Full width
     with the text left against the rule keeps them one unit. */
  .mx-delta{width:auto}
}
/* ------------------------------------------------------------------
   TOMBSTONED 2026-09-12 (third set): `.mx-credit`, `.num-credit` and the
   two fixes below them are NO LONGER USED BY ANY ELEMENT ON THE PAGE.

   03 had one money-IN row - "Shareholder onboard credit - claimed, and paid
   to you", rendering "- $250" - and it is gone. Measured against both
   reference shops on 2026-09-12: Elias Yoder's six rows and Otis Granger's
   three are each ONE COST SEEN TWICE, and neither carries a deduction row
   or a $0 cell anywhere. The credit is the difference inside 03's
   onboard-account row now: $1,400 on the left, $1,400 less the $250 on the
   right. Same figure, same citation, same net.

   THE RULES STAY, AND SO DO THEIR TWO NOTES, because each records a real
   trap that cost a set to find - the `flex-direction:column` stacking and
   the `justify-content` alignment. A later set that wants a deduction row
   back gets both for nothing instead of re-deriving them.
   Nothing selects these classes today; deleting them changes no pixel.
------------------------------------------------------------------ */
/* THE ONE ROW THAT IS MONEY IN. The minus sign alone is not enough on a
   column of costs - a reader skimming figures reads every number as
   another thing they paid - so the row also says "paid to you" in words,
   and the figure takes the lift red rather than the column's paper. */
/* THE REAL CAUSE OF THE TWO-LINE FIGURE, and it was not `.fig`.
   This rule used to target a WRAPPER span with `.num-credit` and a
   `paid to you` label inside it, and it stacked them with
   `flex-direction:column`. The correction pass moved "paid to you" into
   the row's description and deleted that label - which left `.num-credit`
   ITSELF as the `span:last-child` this rule matches. So the column
   direction was being applied to the minus sign and the figure, and they
   stacked. `white-space:nowrap` could not help: they were flex items on
   separate flex lines, not wrapped text.
   It is a row now, and the minus, a thin space and the figure are one
   unbreakable unit. */
/* A FIGURE INSIDE A ROW LABEL TAKES THE LABEL'S FACE, 2026-09-12 (third set).
   `.fig` is the page's money treatment - Lora, the serif - and it is right
   for the figure CELL at the end of the row, which is what it was written
   for. Row three also carries a figure inside its description ("$996 each"),
   and there `.fig` switched face in the middle of a sentence: Lora inside a
   line otherwise set in Atkinson Hyperlegible.

   MEASURED AGAINST BOTH REFERENCES ON 2026-09-12, and neither does that.
   Elias Yoder has no figure inside a label at all - his labels are plain
   nouns and every number is in the cell. Otis Granger puts his figures at the
   end of the row, but in Georgia, the same face as the label beside them.
   Neither of them changes typeface inside one line.

   So: scoped to the LABEL cell only. The figure cell is untouched and still
   Lora, here and everywhere else on the page. Weight goes with it - the
   label's own 400 rather than `.fig`'s 500 - because a bolder run in the same
   face would reintroduce the break this removes. */
.mx-col li > span:first-child .fig{
  font-family:var(--body);font-weight:inherit;
}

/* `justify-content:flex-end` IS THE ALIGNMENT FIX, 2026-09-12 (second set).
   `.mx-col li > span:last-child` gives every figure cell `min-width:64px;
   text-align:right`, and text-align is what pushes the other seven figures
   against the column's right edge. THIS cell is `display:flex`, and
   text-align does nothing to flex items - they pack at flex-start - so the
   minus and the figure sat at the LEFT of a 64px box while every figure above
   them sat at the right. It read as a typo in the table.
   The row still has to be a row (see the note below), so the fix is to pack
   it to the end rather than to stop it being flex. */
.mx-col li.mx-credit span:last-child{
  display:flex;flex-direction:row;align-items:baseline;gap:0;
  justify-content:flex-end;
  flex:none;white-space:nowrap;
}
/* THE MINUS AND THE FIGURE ARE ONE ROW, and it is laid out rather than
   left to text wrapping. `.fig` is display:flex site-wide, so inside this
   span it was a block-level box on its own line and `white-space:nowrap`
   could not help - the break was a box break, not a text break, and
   switching .fig to inline-flex was not enough on its own. The span is a
   flex row now, so the two can only sit side by side. `.fig` itself is
   untouched everywhere else on the page. */
.num-credit{
  display:inline-flex;flex-direction:row;align-items:baseline;gap:0;
  white-space:nowrap;color:var(--accent-lift);
}
/* `.fig` is display:flex site-wide, which makes it a block-level box on its
   own line inside an inline run. Scoped to this one figure; `.fig` itself is
   untouched everywhere else. */
.num-credit .fig{display:inline-flex}
/* THE FIGURE COLUMN HOLDS ONE WIDTH IN BOTH COLUMNS. Without it the cell is
   shrink-to-fit, the four widths differ per row, and the credit row - the
   widest at 63px - was the one that decided whether the row grew a second
   line. Measured widest single-line figure across both columns is 63px, so
   the floor is 68px and every row clears it at every width. */
/* 64px IS THE WIDEST FIGURE, measured: the credit row's
   "minus + thin space + $1,075" renders 64px on one line and nothing else in
   either column is wider. The floor is exactly that and not a pixel more -
   every pixel here is taken from the description beside it, and one
   description needs all of them (see the gap note below). */
.mx-col li > span:last-child{min-width:64px;text-align:right;flex:none}
/* THE TWO COLUMNS ARE LEVELLED BY ROW HEIGHT, NOT BY WORD COUNT.
   The figure floor costs the description beside it up to 26px, and one
   description - the left "Bumped on the way home" row - needs those pixels
   to stay on one line. Buying them back from the row gap was tried and is
   the wrong fix: it wins by about three pixels, which is a rendering
   accident waiting to happen the next time a word changes.
   The rows are given ONE HEIGHT instead, taken from the tallest of the
   eight. Whatever wraps and whatever does not, row n in the left column and
   row n in the right column are the same height, their dashed rules land on
   the same y, and the two totals share a baseline - by construction rather
   than by luck.
   SCOPED TO THE TWO-COLUMN LAYOUT. Below 1041px the grid collapses to one
   column, the columns are stacked and there is nothing to level, so the
   floor is lifted and every row is its natural height again. */
@media (min-width:1041px){
  /* 85, not 84. The tallest row's own content measures 84.x, so a floor of
     84 left it a fraction taller than its opposite number and the totals
     landed one pixel apart. 85 clears the fraction. */
  .mx-col li{min-height:85px}
}
/* (0,3,1). `.mx-col li span:last-child` is (0,2,2) and it matches THIS
   span too - `.mx-in` is the last span child of the figure cell - so a
   bare `.mx-in` lost the cascade and the label came out in Lora at
   18.4px instead of mono at 10.4. Measured, not guessed. */
.mx-col li.mx-credit .mx-in{
  font-family:var(--mono);font-size:10.4px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--accent-lift);line-height:1;
}
@media (max-width:560px){
  .mx-col li.mx-credit .mx-in{font-size:9.6px}
}

/* ------------------------------------------------------------------
   THE 2026-09-11 REVISION PASS - 01's rule list, 05's quote cards,
   the countdown label, and the eyebrow size.

   Appended; nothing above this line was edited. Everything here is
   later in the file than the rules it overrides, so it wins on order.
------------------------------------------------------------------ */

/* ---- 01's RULE LIST - DELETED 2026-09-11 (correction pass) ----
   `.ep-rules`, `.ep-rules li`, `.ep-rules li:last-child`, `.ep-rules b` and
   `.ep-rules-foot` stood here for one set. 01 carries its original prose
   paragraph in `.ep-lede` again, so the rules had nothing left to style and
   are cut rather than left dead - they were new in the previous set and
   nothing else ever used them. */

/* ---- 05: ELIAS YODER'S CARD, OTIS GRANGER'S STARS AND CAPTION ----
   The card shell stays Elias's - the mark hung off the top edge, the italic
   body. The stars and the name line are Otis's, measured off his live page
   on 2026-09-11 rather than eyeballed. */
.review{
  border-top:1px solid var(--line);
  padding:48px 1.4rem 1.4rem;
  position:relative;
}
.review::before{
  content:"\201C";
  position:absolute;top:-10px;left:22px;
  font-family:var(--display);font-style:italic;
  font-size:6rem;line-height:.6;color:var(--accent);
  background:var(--paper);padding:0 10px;
}
/* OTIS'S STARS, VALUE FOR VALUE, AND THE CAUSE OF THE OLD MISMATCH.
   Measured on his page: Georgia 14px/700, #B0791C, 2px of tracking, and the
   glyph is U+2605 and only U+2605.
   THE FIFTH STAR USED TO RENDER LARGER because nothing here named a font.
   The run inherited the body stack, which has no star glyph, so the browser
   fell back PER GLYPH - and the hollow U+2606 on Doris's card could land in
   a different fallback from the filled ones beside it. Naming Georgia fixes
   the cause: measured, U+2605 and U+2606 are both 13.67 x 16 in Georgia, so
   the empty star is exactly the size of the filled ones and takes the same
   colour. One font, one size, one colour, five glyphs. */
/* `.starline`, NOT `.stars`. The first version of this rule reused `.stars`
   and lost: the retired rating component still declares
   `@supports(...){.rating .stars,.review .stars{...}}`, which clips a
   gradient to the text and sets `color:transparent`, and at (0,2,0) it beat
   a bare `.stars`. Measured result was 18.9px glyphs in transparent ink.
   Those rules are dead - nothing carries `.rating` any more - but they are
   above this line and are left where they are, so the new run takes a name
   they cannot reach. */
.starline{
  font-family:Georgia,"Times New Roman",serif;
  font-size:14px;font-weight:700;
  color:var(--star-warm);letter-spacing:2px;line-height:22.4px;
}
.review .starline{display:block;margin-bottom:4px}
/* His `.review__body` is italic; the headline above it keeps its own weight. */
.review p{font-style:italic}
/* OTIS'S CAPTION, `.who`, MEASURED: Georgia 13px/20.8px, weight 400, his
   muted grey, sentence case, NO tracking, NO uppercase, 8px above it, and a
   pale band behind it with no padding of its own.
   HIS BAND IS #F3EBDD ON WHITE. Pasting that hex onto our #F4F1E9 paper
   would leave a band you cannot see - his card ground is white and ours is
   already warm - so the band is our own `--deep`, which sits the same step
   below our paper as his does below his white. The only value not taken
   literally, and it is the one that could not be.
   HIS CAPTION HAS NO RULE ABOVE IT - measured border-top 0px - so the
   hairline this build drew above the name line is gone. */
.who{
  font-family:Georgia,"Times New Roman",serif;
  font-size:13px;font-weight:400;line-height:20.8px;
  /* HIS GREY IS #9A8B7A AND IT DOES NOT SURVIVE THE MOVE. On our band it
     measures 2.59 : 1 - and on his own band it is 2.79, so he fails AA here
     himself. Our --ink-mute is only 4.21 on the same band. --ink-soft is
     7.01 : 1, keeps the line quiet against the body above it, and clears AA
     for a 65+ reader. The SECOND of the two colours that could not be taken
     literally; the band is the first. */
  color:var(--ink-soft);text-transform:none;letter-spacing:normal;
  background:var(--deep);
  margin:8px 0 0;padding:0;border-top:0;
}
@media (max-width:620px){.review{padding:44px 1.2rem 1.2rem}.review::before{font-size:5rem;left:16px}}

/* ---- TOP BAR: ELIAS'S COUNTDOWN LABEL ----
   His `.masthead__center span`: the label sits in the bar's own mono at
   .72rem with .22em of tracking, uppercase, at 0.7 opacity, and the timer
   beside it is the bold plate. Ours already had the plate; this is his
   label treatment on the text beside it. */
.urg-ends{
  font-family:var(--mono);font-size:.72rem;letter-spacing:.22em;
  text-transform:uppercase;opacity:.7;
}
/* His timer tracks at .16em against the label's .22em. */
.urg-timer{letter-spacing:.16em}
@media (max-width:768px){.urg-ends{font-size:.66rem;letter-spacing:.18em}}

/* ---- GLOBAL: THE UPPERCASE EYEBROW LABELS ----
   .62rem is 11.2px at this root and the brief calls for 14px with the
   tracking pulled in. 14 / 18 = .778rem. The tracking goes .2em -> .14em:
   at 14px that is 1.96px between letters against 2.24px before, so the
   label gets bigger without getting wider than its rule. */
/* SET IN PX, NOT rem, AND WITH NO MOBILE STEP-DOWN. The brief is one
   number - 12px becomes 14px - and a rem here would have rendered 14.0
   on the 18px root and 13.2 on the 17px one, while a .72rem mobile step
   put it back to 12.24 and undid the whole change on a phone.
   TWO SELECTORS CARRY MORE THAN A CLASS and had to be answered in kind:
   `#ledger .eyebrow` is an ID rule (1,1,0) that held 03's label at
   11.84px, and the modal's own eyebrow sat at 13.32px. Both are raised
   here rather than edited where they stand. */
.eyebrow,.lc-eyebrow,.xi-eyebrow,
#ledger .eyebrow,
#xi .xi-eyebrow{font-size:14px;letter-spacing:.14em}

/* ---- 06: OTIS'S RATING LINE, MEASURED ----
   His is a star run followed by a <small> at 13px Georgia in his muted grey
   with 8px of left margin, inline, no tracking and no uppercase. The stars
   are the same `.stars` the cards use, so there is one star treatment on the
   page and not two. */
/* HIS TWO STAR TREATMENTS ARE NOT THE SAME, measured 2026-09-11 on his live
   page. The previous pass measured one of them and used it for both.
     review cards  div.st        Georgia 14px / 700 / lh 22.4px
     buy box       div.shopstars Georgia 18px / 400 / lh 28.8px
   Colour (#B0791C) and tracking (2px) are identical in both; the size, the
   weight and the leading are not. 05's cards keep the 14/700 run - that is
   already his card value - and this line takes the 18/400 one.
   His buy-box stars are a bare TEXT NODE inside `.shopstars`, so they take
   that container's type; ours are a span, so the values are set on it. */
.ep-rating{margin:0 0 14px;max-width:none;line-height:28.8px}
.ep-rating .starline{
  display:inline;
  font-size:18px;font-weight:400;line-height:28.8px;
}
.ep-rating small{
  font-family:Georgia,"Times New Roman",serif;
  font-size:13px;font-weight:400;line-height:20.8px;
  color:var(--ink-soft);letter-spacing:normal;text-transform:none;
  margin-left:8px;
}

/* ---- HERO BODY TEXT: 18px FLOOR, 1.6 LEADING ----
   The brief sets a floor, not a size, so the desktop figures that are
   already above it are left alone and only the leading is brought to 1.6.
   The 560px block is where the floor actually bites: html goes to 17px
   there, so .hero-sub's 1.1rem rendered 18.7px at 1.42 and .best's own
   step-down went under 18. Both are set in px here so the floor holds at
   any root. */
/* A FLOOR RAISES, IT NEVER LOWERS. The first version of this block set
   .best to a flat 18px and would have SHRUNK it from 19.08px on desktop,
   which is the opposite of what a minimum means. Only values already
   under the floor are touched.
     .best      1.06rem = 19.08px desktop / 18.02px at the 17px root - over
     .hero-sub  1.35rem desktop / 1.1rem = 18.7px at 560 - over
   So only the LEADING moves, and only where it was under 1.6. */
.hero-sub{line-height:1.6}
.hero-points li{line-height:1.6}
@media (max-width:900px){.hero-sub{line-height:1.6}}
@media (max-width:560px){
  /* 1.42 was the one figure under the floor on this page. */
  .hero-sub{line-height:1.6}
  .hero-points li{font-size:max(18px,1rem);line-height:1.6}
}


/* ==================================================================
   06  ABOUT THE AUTHOR - NEW SECTION, 2026-09-12.

   The reference shop has no persona and therefore no section here, so
   nothing in this file governed any of it before this block. Everything
   below is new; nothing above it was edited.

   GEOMETRY IS ELIAS YODER'S SECTION V, MEASURED LIVE ON 2026-09-12 at
   1920, 1440 and 390 - not estimated and not read off a screenshot:

     .sec.about        padding 110px 0        (76px 0 at 390)
     .container        max-width 1240, padding 0 32px (0 22px at 390)
     .about__grid      grid, 465.797px 630.203px, gap 80px, align start
                       one column at 390, gap 48px
     .about__media     465.80 x 582.23  = 0.79995 : 1, radius 0
                       346.00 x 432.50  = 0.8      : 1  at 390
     .about__frame     1px hairline, 14px OUTSIDE the media on every edge
                       (media x372 w465.8 / frame x358 w493.8)
     .eyebrow          mono 17.28px, .24em, uppercase, accent
     h2                54.4px / 56.576px / 600 / -1.1968px, margin 0 0 22px
                       38.4px / 39.936px at 390
     p                 17.28px / 27.648px, margin 0 0 17.28px
     blockquote        padding 26px 30px, margin 32px 0,
                       border-left 3px, background one step below the band,
                       20.8px / 29.12px italic serif
     .about__sig       (his is a mono "watch the channel" link - NOT ported,
                       see the signature note below)

   WHAT WAS TAKEN LITERALLY AND WHAT WAS TAKEN AS A RATIO, AND WHY THE
   DIFFERENCE IS NOT ARBITRARY. His page and this one do not run at the same
   type scale, so a pixel value only transfers where the two bases already
   agree. Measured on his live page at 1920:

     his page body      18.4px / 29.808px      ours  18px / 29.7px    (2% apart)
     his SECTION h2     60.8px                 ours  38px             (43% apart)
     his ABOUT h2       54.4px  = 0.8947 of his section h2
     his ABOUT p        17.28px = 0.9391 of his page body

   So the ABOUT H2 IS PORTED AS THE RATIO - 38 x 0.8947 = 34.5px - because
   copying 54.4px would put a heading half again the size of every other
   heading on this page. THE ABOUT PARAGRAPH IS PORTED AS THE RATIO TOO -
   18 x 0.9391 = 17px - which lands within a third of a pixel of his own
   17.28px, because the two bodies already agree. The blockquote and the
   signature are absolute for the same reason: at 17px our reading size and
   his are the same size, so his 20.8px and Otis's 26px transfer as they are.

   HIS 110px OF SECTION PADDING IS NOT PORTED, AND THAT IS THE SAME RULE.
   110px is what EVERY `.sec` on his page carries - library, math, inside,
   reviews, about, editions, faq all measured 110px 0 - so it is his page
   rhythm and not a decision about this section. Ours is `--sec`, and this
   section takes `.band` like every other band here. Copying his figure would
   have made one band three times the height of its neighbours and called it
   fidelity.

   HIS ENLARGED EYEBROW IS NOT PORTED EITHER, AND THIS ONE IS A DEVIATION
   RATHER THAN A CONVERSION. His about eyebrow is 17.28px against 11.84px in
   every other section of his - he sets this one 1.46x up. The port brief
   says the label takes THE REFERENCE SHOP'S eyebrow style, so it is plain
   `.eyebrow` at .62rem like every other eyebrow on this page, and his
   enlargement is recorded here rather than applied.

   COLOUR IS THIS SHOP'S, WHICH IS WHAT THE BRIEF SAYS: Elias gives the
   geometry, not the palette. One substitution is worth writing down. HIS
   HIGHLIGHT BAR IS A GOLD, rgb(186,140,62), which on his page is his
   SECONDARY accent - his primary is the oxblood this shop's --accent
   literally is. This page's gold is --accent-lift, and that token is
   documented as "the accent on a dark band" and is reserved for the
   arithmetic; at #E0B458 on this band's paper it would be a bar you cannot
   see. So the bar takes --accent. It is the same ROLE - the page's accent,
   set as a left rule on a quiet panel - carried by the token this palette
   actually has for a light ground.

   THE SIGNATURE IS OTIS GRANGER'S `.sig`, NOT ELIAS'S `.about__sig`. His is
   a mono small-caps "Watch the channel" link, which is a channel plug and
   not a signature; the brief asks for a first name in italic at Otis's size
   and spacing, and Otis's measured 26px / 41.6px italic Georgia with 14px of
   clear above it. Ported at those values in this shop's serif.
   ================================================================== */
.about-in{
  display:grid;
  /* 17 : 23 is 465.797 : 630.203 reduced - his exact column split, carried
     as a ratio so it holds at our 1080px container as it does at his 1176. */
  grid-template-columns:17fr 23fr;
  gap:80px;align-items:start;
}
/* THE FRAME IS A PSEUDO-ELEMENT, NOT AN EMPTY DIV. It is decoration with no
   content and no accessible name, which is exactly what ::before is for, and
   it keeps the markup to one picture. */
.about-media{position:relative}
.about-media::before{
  content:"";position:absolute;inset:-14px;
  border:1px solid var(--line-strong);pointer-events:none;
}
.about-photo{display:block}
/* aspect-ratio AND width/height on the img: the attributes reserve the box
   before the file lands, the ratio holds the 4:5 slot if the plate is ever
   swapped for one a hair off. object-fit:cover means a swapped plate is
   cropped rather than squeezed - a face is never stretched by this page.
   RADIUS 0 IS HIS, MEASURED. His media is a square-cornered block; the 14px
   hairline outside it is the whole of the frame device. */
.about-photo img{
  display:block;width:100%;height:auto;
  aspect-ratio:4/5;object-fit:cover;
  border-radius:0;background:var(--deep);
}
.about-copy h2{
  font-family:var(--serif);font-weight:700;text-transform:none;
  font-size:34.5px;line-height:1.12;letter-spacing:normal;
  color:var(--ink);margin:0 0 22px;max-width:none;
}
/* `:not([class])` IS LOAD-BEARING AND IS NOT A TIDINESS CHOICE.
   Four elements in this column are <p>: the eyebrow, the three body
   paragraphs, the highlight and the signature. A bare `.about-copy p` is
   (0,1,1) and beats `.eyebrow` (0,1,0), `.about-pull` and `.about-sig`
   (0,1,0) on specificity no matter what order they are written in - which
   is exactly what happened on the first pass: the eyebrow came out at 17px
   Lora, and the highlight and the signature both lost their size, their
   italic and their margins to the paragraph rule.
   The three body paragraphs are the only <p> in here with NO class, so
   that is what this selector says. It also lifts the rule to (0,2,1), so
   the three below can match it at the same weight and win on order. */
.about-copy p:not([class]){
  font-family:var(--serif);font-size:17px;line-height:1.6;
  color:var(--ink-soft);max-width:none;margin:0 0 17px;
}
/* 07's eyebrow and 01's are `.band .eyebrow`, (0,2,0). This is (0,2,1) and
   restates nothing - it only has to out-weigh the paragraph rule above,
   and every value it needs is already on `.eyebrow` in styles.css. */
.about-copy p.eyebrow{font-size:.62rem;font-family:var(--ui);margin:0 0 .6rem}
.about-copy p.about-pull{
  margin:32px 0 0;padding:26px 30px;
  border-left:3px solid var(--accent);
  background:var(--deep);
  font-family:var(--serif);font-style:italic;font-weight:400;
  font-size:20.8px;line-height:1.4;color:var(--ink);
  max-width:none;
}
.about-copy p.about-sig{
  margin:14px 0 0;
  font-family:var(--serif);font-style:italic;
  font-size:26px;line-height:1.6;color:var(--ink-mute);
  max-width:none;
}
/* HIS OWN COLLAPSE POINT IS BETWEEN 1440 AND 390 and this page's two-column
   blocks all collapse at 1040, so that is where this one collapses too -
   one breakpoint for the page rather than a second one for this section.
   THE PORTRAIT GOES ABOVE THE TEXT, which is his mobile order and is the
   DOM order here, so nothing has to be re-ordered to get it. */
@media (max-width:1040px){
  .about-in{grid-template-columns:1fr;gap:48px}
  /* Uncapped, a stacked portrait would be 754px wide at 820. His own stacked
     media is the full column at 390 (346px) and nothing wider was ever
     measured, so the cap is the first round number above it. */
  .about-media{max-width:min(100%,420px)}
  /* 14px OF OUTSET DOES NOT FIT THE PHONE GUTTER. `.wrap` is 92vw, so the
     side gutter at 390 is 15.6px and at 360 it is 14.4px - the frame would
     sit within a pixel of the viewport edge and one rounding step from
     causing a horizontal scrollbar. 8px clears it at both widths with room
     to spare, and the device still reads as an offset frame. */
  .about-media::before{inset:-8px}
}
@media (max-width:640px){
  /* The same -8px step `.sec-head h2` takes at this width, so the About head
     stays in this page's own type ladder rather than in his. */
  .about-copy h2{font-size:26.5px}
  /* Same (0,2,1) weight as the rules above, and later in the file. */
  .about-copy p.about-pull{padding:22px 24px;font-size:19px}
  .about-copy p.about-sig{font-size:23px}
}

/* ==================================================================
   THREE RULES THIS SHOP ADDS, AND THE REASON FOR EACH.

   Everything above this line is the reference's, geometry for geometry,
   with only colour moved. These three exist because this shop's markup
   carries three things the reference's does not.
   ================================================================== */

/* 1. 05's COMPOSITE LINE - TOMBSTONED, 2026-09-12.

   It was:
     #reviews .rv-note{margin:.55rem 0 0;font-size:.82rem;line-height:1.5;
                       color:var(--ink-mute);max-width:52ch}
   under a `p.rv-note` reading "Composite stories drawn from reader and
   viewer feedback", between 05's lede and the cards. The reference had
   deleted its own equivalent on its owner's instruction; this shop kept
   the qualifier for one set, and the owner's call of 2026-09-12 is to
   remove it here too.

   THE CLAIM DID NOT GO WITH IT. The footer disclaimer on every page still
   reads "...; stories are composite", and /disclaimer carries the full
   persona disclosure. tools/selfreview.py asserts the footer sentence is
   present AND that this element has not come back, so the two halves
   cannot drift apart.

   The rule is left here rather than deleted so that putting the line back
   is one element of markup and no CSS at all. */

/* 2 and 3. THE PAYMENT ROW'S TWO INLINE style="" ATTRIBUTES, MOVED INTO
   CLASSES. The reference writes the Amex blue and the Apple Pay glyph
   height inline. style-src carries 'unsafe-inline' so they would have
   worked, but the brief's rule for this build is no inline anything, and
   a style attribute is the easiest of the three to simply not have.
   VALUES ARE THE REFERENCE'S, UNCHANGED - and #1F72CD is American
   Express's own blue, a brand mark rather than a palette colour, which
   is why it did not go through the remap table. */
.pay-label--amex{color:#1F72CD}
.pay-label.ap svg{height:.9rem}

/* 4. THE HERO MASTHEAD LINE'S TRACKING, AND IT IS A MEASUREMENT, NOT A
      PREFERENCE.

   The element is the reference's `.hero-mark` unchanged - a flex row of
   name, <hr> and imprint - and so is every other value in it: the mono
   face, 11.84px, the 16px gaps, the 36px of clear beneath. What does not
   port is the CONTENT WIDTH: this shop's imprint is "The Senior Exemption
   Playbook", nine characters longer than the reference's "The Seasoned
   Cruiser", and the brief fixes both labels.

   MEASURED IN CHROMIUM AT 1440: at the reference's .32em the two spans
   come to 137.7px + 307.2px which, with the two 16px gaps, is 476.9px in a
   476.9px column. The <hr> is squeezed to ZERO and both labels wrap onto a
   second line - the one thing the rule exists to prevent, since the hr IS
   the device.

   .22em is the widest tracking that keeps the row on one line with a rule
   between the labels at every width from 1920 down to the breakpoint where
   the reference drops to .20em on its own. The narrow rule is untouched
   and still wins below it. Nothing else about the element moved. */
@media (min-width:420px){.hero-mark{letter-spacing:.22em}}
/* The reference's own narrow rule is `@media (max-width:419.98px)
   {.hero-mark{letter-spacing:.20em}}`, so this one is gated the other way
   and the two cannot fight. Below 420px BOTH shops' labels wrap onto two
   lines - the reference's twenty-character imprint does not fit at 390
   either - so that is its behaviour and not a defect this introduces. */

/* 5. THE DROP CAP WHEN THE LEDE OPENS ON A FIGURE.

   `.best::first-letter` is the reference's drop cap and it is untouched.
   The problem is what "first letter" means here: this shop's lede opens on
   "$6,000", so the browser drop-caps the DOLLAR SIGN ALONE and sets
   "6,000" beside it at body size. The reference's own lede opens on the
   word "Cut", so it never met this.

   THE FIX MOVES THE DEVICE ONTO THE WHOLE FIGURE and changes nothing else:
   the same face, weight, style, size, float, margins and colour, applied
   to the `.fig` span instead of to one glyph, with ::first-letter reset to
   inherit so the two cannot both fire.

   A CLASS AND NOT `:has()`. `.best:has(> .fig:first-child)` would do this
   without touching the markup, but an iPhone older than Safari 15.4 does
   not support it, and the failure mode there is the WORST of the three -
   ::first-letter would still fire, inside an already-drop-capped span, at
   3.4em of 3.4em. This audience is 60 to 78 and is on old phones. An
   explicit class works everywhere. */
.best--figcap::first-letter{
  font:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;
  line-height:inherit;float:none;margin:0;color:inherit;
}
.best--figcap > .fig:first-child{
  font-family:var(--serif);
  font-weight:500;
  font-style:italic;
  font-size:3.4em;
  line-height:.85;
  float:left;
  margin:8px 12px -2px 0;
  color:var(--accent);
}

/* 6. THE 03 SOURCE LINE, MEASURED TWICE AND NUDGED TWICE.

   The brief fixes the string - it has to name the chapters, the year of
   the Medicare figures and which values are illustrative, and it has to
   keep the word "illustrative" - and it fixes the result: ONE LINE at 1920
   and 1440, AT MOST TWO at 390. Raymond's line is 97 characters where the
   reference's is 74, so neither came out on its own.

   MEASURED IN CHROMIUM, not estimated. At the reference's 11.2px mono with
   .1em tracking the line wants exactly 760px, and `.mx-src` is capped at
   exactly max-width:760px - Elias's `.math__delta` width, which is where
   the reference took it from. It lost by about one character's tracking
   and wrapped to two lines at every desktop width.

     760 -> 780   above the one-column step. Twenty pixels, and it is the
                  only geometry in this file that moved for content.
     11.2 -> 10.4 below 640px only. At 390 the container is 359px, so 760px
                  of text is three lines and 706px is two. 10.4px is the
                  size that gets it to two and no smaller; nothing else on
                  the page uses it. Contrast is unchanged and still AA -
                  see tools/contrast.py, "labels on the deep band".

   BOTH ARE RECORDED AS DEVIATIONS. The alternative was to cut words out of
   a line the owner wrote, and a source note that drops half its sources to
   fit is worse than one set 0.8px smaller on a phone. */
.mx-src{max-width:min(780px,100%)}
@media (max-width:640px){.mx-src{font-size:10.4px;line-height:16.8px}}

/* 7. WHERE AN ANCHOR LANDS, GIVEN THAT THE TOP STRIP IS FIXED.

   `section[id]{scroll-margin-top:1.5rem}` is the reference's rule and it
   is 1.5rem of clear above whatever a #link scrolls to. It does not
   account for the urgency strip, which is `position:fixed` and 59.6px
   tall: a section that lands 27px from the top of the VIEWPORT lands 33px
   UNDER the strip, and on this page that is the section numeral and the
   eyebrow above the H2.

   IT MATTERS HERE MORE THAN IT DOES ON THE REFERENCE. Every Kit mail this
   shop sends links to https://raymond-grant.com/#buy, so #buy landing on
   01 is a delivery requirement and not a nicety.

   --urg-h IS URGENCY.CSS'S OWN TOKEN, declared in its :root at 59.6px and
   raised to 65px at the width where the strip grows a line. Reading it
   here means the two cannot drift: if the strip's height changes, the
   anchor offset changes with it. The fallback of 0px keeps this correct on
   any page that does not load urgency.css - the legal pages and
   thank-you - where the rule then computes to exactly the reference's
   1.5rem.

   THE OTHER HALF OF THIS IS IN landing.js. A page opened AT a hash is
   scrolled by the browser before the layout has finished settling, and it
   lands about 90px high whatever this value is; the script re-scrolls once
   the document is loaded. Neither half is enough on its own. */
section[id]{scroll-margin-top:calc(var(--urg-h,0px) + 1.5rem)}

/* ==================================================================
   8. THE BUY BUTTONS: THE ACTION COLOUR, AND THE CRAFT PASS.

   ONYX-GOLD-TOKENS.md section 4: gold carries structure, the
   Trigger-Yellow carries action, and gold on a CTA costs the page its
   click signal. The six fill values and the lip are at --cta in
   styles.css.

   [data-buy] IS THE SELECTOR, AND THAT IS DELIBERATE. It is the same
   attribute the checkout suppressor in landing.js matches and the same
   one tools/check_kit.py counts, so the three cannot drift: a buy link
   added later is yellow, suppressed and gated by the one marker, and a
   button that is NOT a purchase cannot pick the colour up by accident.

   WHAT STAYS GOLD: the hero's "See the Playbook", 04's jump link, 09's
   "Send my question" and the modal's "Send it to me". None of them is a
   purchase. They keep --accent and they take the same SHAPE - see block
   9 - so the buttons read as one family and only money is yellow.

   THE EDGE IS BUILT FROM DEPTH, NOT FROM A LINE, 2026-09-12.
   The first version of this used a 1.5px --sage border, because the
   yellow fill is 1.28 : 1 against the cream page and something had to
   draw the boundary. A hairline round a filled button is the wrong
   answer: it reads as an outline someone forgot to remove. This uses
   three shadows instead, which is how a physical control is drawn:

     inset 0 -2px 0 var(--cta-lip)         the bottom lip - the edge you
                                           would see on a real key
     inset 0 1px 0 rgba(255,255,255,.45)   a 1px light line on the TOP EDGE
                                           ONLY, which is the same light
                                           source. Zero blur and zero
                                           spread, so it cannot reach the
                                           sides or the bottom.
     0 8px 18px -8px rgba(8,14,29,.35)     a soft drop shadow, onyx at 35%

   THE TRANSPARENT BORDER IS GONE, 2026-09-12, AND THAT IS WHAT FIXED THE
   LIGHT LINE DOWN THE SIDES. `.ep-btn` inherited `border:1.5px solid` and
   this block kept it at `transparent` to preserve the metrics. That was
   wrong in a way only a 6x screenshot showed: `background-clip` defaults
   to border-box, so the gradient paints UNDER the transparent border,
   while `box-shadow: inset` is clipped to the PADDING box. The result is
   a 1.5px ring of bare gradient all the way round - a pale hairline on
   both sides and along the top, and a pale strip below the lip.

   The border is now zero and the 1.5px is given back as padding, so the
   button is the same size to the pixel and the inset shadows reach the
   real edge. tools/check_kit.py measures the height and width against the
   gold buttons, which never had the problem, so a future change that
   re-introduces it shows up as a size difference.

   NON-TEXT CONTRAST, AND THIS IS THE RECORDED DECISION.
   WCAG 1.4.11 wants 3 : 1 for a boundary that IDENTIFIES a control. The
   yellow fill is 1.28 : 1 on the paper and does not have it. It does not
   need it: the criterion applies to the visual information REQUIRED to
   identify the component, and here that is the label - 11.94 : 1 at rest,
   never below 9.06 in any state - inside a 71px-tall element. The fill,
   the lip and the shadow are all redundant with a label that is never in
   doubt. The 1.5px border is not coming back; tools/contrast.py records
   the fill ratios as measured rather than as passed, so the number stays
   visible without pretending it is a failure.

   EVERY STATE IS A REAL COLOUR AND NOT A FILTER. filter:brightness() is
   applied after the cascade and a contrast gate cannot see through it.
   All six stops are declared, and all six are measured:
     rest    top 11.94   bottom  9.94
     hover   top 12.58   bottom 10.85
     active  top 10.74   bottom  9.06

   GEOMETRY: same padding, same min-height, same 4px radius the reference
   gives every .btn. What moved is the type - .22em down to .08em at
   weight 700, which is what lets a 13.44px label read as a label rather
   than as spaced-out capitals - and the fact that the border no longer
   takes 1.5px off the content box.
   ================================================================== */

/* --- rest --------------------------------------------------------- */
.btn[data-buy]{
  background:linear-gradient(180deg,var(--cta),var(--cta-2));
  /* ZERO BORDER, AND THE 1.5px GIVEN BACK AS PADDING. See the note at
     the head of this block: a transparent border let the gradient paint
     under it while the inset shadows stopped at the padding box, which
     is where the pale hairline on the sides came from. The button is the
     same size to the pixel - `.ep-btn`'s own padding is 20px 34px and
     box-sizing is border-box, so 20 + 1.5 and 34 + 1.5 is the same outer
     box with nothing showing through. */
  border-width:0;
  padding:21.5px 35.5px;
  color:var(--cta-ink);
  letter-spacing:.08em;
  font-weight:700;
  /* THE " . " BEFORE THE PRICE, AND WHY THE GAP GOES TO ZERO.
     `.ep-btn` is inline-flex with `gap:10px`. The price is its own
     element, so flex wraps "Get the Playbook &middot;" in an anonymous
     item and trims its trailing space - the space BEFORE the middot is a
     3.7px character and the space AFTER it is the 10px flex gap. Measured:
     3.7 against 10, which is the double space.
     Gap 0 here, a non-breaking space on each side of the middot in the
     markup, and the arrow gets its 10px back as a margin below. */
  gap:0;
  box-shadow:
    inset 0 -2px 0 var(--cta-lip),
    inset 0 1px 0 rgba(255,255,255,.45),
    0 8px 18px -8px rgba(8,14,29,.35);
}
/* The arrow keeps the distance the flex gap used to give it. */
.btn[data-buy]::after{margin-left:10px}
/* THE PRICE IS THE LABEL. `.fig` is the page's figure face - serif italic
   - which is right in a price row and wrong inside a button, where it
   made "$27" look pasted on after the words. Inside a buy button it
   inherits everything, so "GET THE PLAYBOOK · $27" is one line of one
   face at one weight. */
.btn[data-buy] .fig{
  font-family:inherit;font-style:normal;font-weight:inherit;font-size:inherit;
}
.btn[data-buy]::after{color:var(--cta-ink)}

/* --- hover: lift 1px, the shadow grows ---------------------------- */
.btn[data-buy]:hover{
  background:linear-gradient(180deg,var(--cta-hover),var(--cta-hover-2));
  border-width:0;
  color:var(--cta-ink);
  transform:translateY(-1px);
  box-shadow:
    inset 0 -2px 0 var(--cta-lip),
    inset 0 1px 0 rgba(255,255,255,.5),
    0 12px 24px -8px rgba(8,14,29,.42);
}

/* --- active: press 1px, the lip shrinks to 1px -------------------- */
/* The lip going 3px -> 1px is what makes the press read: the object is
   sitting down onto the page, so there is less of its side showing. The
   drop shadow shrinks with it for the same reason. */
.btn[data-buy]:active{
  background:linear-gradient(180deg,var(--cta-active),var(--cta-active-2));
  border-width:0;
  color:var(--cta-ink);
  transform:translateY(1px);
  box-shadow:
    inset 0 -1px 0 var(--cta-lip),
    inset 0 1px 0 rgba(255,255,255,.32),
    0 4px 10px -6px rgba(8,14,29,.38);
}

/* --- focus -------------------------------------------------------- */
/* The ring is the site-wide one and is NOT overridden: --sage at a +3px
   offset, so it lands on the GROUND rather than on the button. Measured
   on all three grounds a buy button sits on - 4.02 : 1 on the paper,
   4.28 : 1 on --ink-deep, 4.11 : 1 on the sticky bar - all over the 3 : 1
   WCAG wants for a focus indicator. Nothing to add. */

/* --- the sticky bar's own button ---------------------------------- */
/* Same surface, its own metrics: the bar is 78px tall and the button
   inside it is Otis's Georgia at 17px, which this does not touch. */
.buybar .buybar-cta[data-buy]{
  background:linear-gradient(180deg,var(--cta),var(--cta-2));
  /* The bar's button carries a 1px border, not 1.5px, and the same
     trade applies: zero it and give the pixel back as padding. Its own
     rule sets padding:14px 20px. */
  border-width:0;
  padding:15px 21px;
  color:var(--cta-ink);
  box-shadow:
    inset 0 -2px 0 var(--cta-lip),
    inset 0 1px 0 rgba(255,255,255,.45),
    0 6px 14px -8px rgba(8,14,29,.5);
}
.buybar .buybar-cta[data-buy]:hover{
  background:linear-gradient(180deg,var(--cta-hover),var(--cta-hover-2));
  border-width:0;color:var(--cta-ink);
  box-shadow:
    inset 0 -2px 0 var(--cta-lip),
    inset 0 1px 0 rgba(255,255,255,.5),
    0 8px 18px -8px rgba(8,14,29,.55);
}
.buybar .buybar-cta[data-buy]:active{
  background:linear-gradient(180deg,var(--cta-active),var(--cta-active-2));
  border-width:0;color:var(--cta-ink);
  box-shadow:
    inset 0 -1px 0 var(--cta-lip),
    inset 0 1px 0 rgba(255,255,255,.32),
    0 3px 8px -6px rgba(8,14,29,.5);
}

/* ==================================================================
   9. THE GOLD BUTTONS TAKE THE SAME SHAPE.

   "Only money is yellow" only works if the two kinds of button are
   otherwise the same object. So the four that are not purchases - the
   hero primary, 04's jump link, 09's submit and the modal's Chapter 1
   submit - get the same radius, the same .08em at weight 600, and the
   same three-shadow depth, in gold instead of yellow.

   The lip here is --accent-dark, which is the same steps-under
   relationship --cta-lip has to --cta-2. The top light line is weaker -
   .18 against .45 - because the gold is a dark fill and a bright inset
   on it reads as a scratch rather than as a highlight.

   THESE KEEP THEIR BORDER and do not need the zero-border trade the buy
   buttons took: their fill is --accent, a dark gold, and their border is
   --accent too, so there is no lighter gradient to show through it. The
   1.5px ring is the same colour as what is behind it.
   ================================================================== */
.btn:not([data-buy]):not(.ghost):not(.ep-btn--invert){
  letter-spacing:.08em;
  box-shadow:
    inset 0 -3px 0 var(--accent-dark),
    inset 0 1px 0 rgba(255,255,255,.18),
    0 8px 18px -8px rgba(8,14,29,.30);
}
.btn:not([data-buy]):not(.ghost):not(.ep-btn--invert):hover{
  transform:translateY(-1px);
  box-shadow:
    inset 0 -3px 0 #4A360F,
    inset 0 1px 0 rgba(255,255,255,.2),
    0 12px 24px -8px rgba(8,14,29,.38);
}
.btn:not([data-buy]):not(.ghost):not(.ep-btn--invert):active{
  transform:translateY(1px);
  box-shadow:
    inset 0 -1px 0 #4A360F,
    inset 0 1px 0 rgba(255,255,255,.14),
    0 4px 10px -6px rgba(8,14,29,.34);
}
/* The ghost button is an outline by design and keeps its rule; it only
   takes the tracking so it sits in the same family as the primary beside
   it in the hero row. */
.btn.ghost{letter-spacing:.08em}

/* ==================================================================
   10. THE MICRO LINE BELONGS TO ITS BUTTON.

   `.ep-foot` is "INSTANT ACCESS - PAY ONCE - YOURS FOREVER" under the CTA
   in 01 and 07. The reference centres it across the whole copy column,
   which is right on a page whose CTA is centred too. THIS column's button
   is left-aligned, so a centred line under it belongs to nothing: it
   starts 90px left of the button on one side and runs 120px past it on
   the other.

   IT IS NOW LEFT-ALIGNED TO THE BUTTON'S OWN EDGE, and its tracking comes
   down from .2em to .06em so the whole line fits INSIDE the button's width
   rather than running past it. MEASURED, not chosen: at .1em the line is
   278px against 01's 261px button, 17px too wide; .06em puts it at 257px,
   inside both 01's 261 and 07's 273 with room. The button widths are
   content-sized off a fixed 13.44px label, so they do not move with the
   viewport and neither does this fit. On the phone, where
   the buy button is the full column, it goes back to centred - because
   there the button's edge and the column's edge are the same edge.

   tools/selfreview.py and tools/check_kit.py both measure it: same left
   edge as the button, never wider than the button, never overlapping it
   or the payment row, at every width from 360 to 1920.
   ================================================================== */
.offer-detail .ep-foot{
  text-align:left;
  letter-spacing:.06em;
  margin-inline:0;
  width:fit-content;
  max-width:100%;
}

/* ==================================================================
   11. ON A PHONE THE BUY BUTTON IS THE COLUMN.

   01, 07 and the Last Call. At 390 the copy column is 359px and the
   button's own content width is 297px, which leaves it sitting in the
   middle of a stripe of empty paper with 62px of nothing beside it. A
   primary action on a phone takes the whole column - it is the easiest
   target to hit and it stops the eye having to find the edge.

   THE THRESHOLD IS 640px, which is where this stylesheet already steps
   the offer column down to one column and where `.sec-head h2` takes its
   own -8px. It is not a new breakpoint.

   THE OTHER TWO BUY BUTTONS ARE ALREADY FULL WIDTH and are not touched:
   the modal's is `.ep-btn--block` (100% by its own rule) and the sticky
   bar's is a flex item sized by the bar.

   THE MICRO LINE GOES BACK TO CENTRED HERE. Block 10 left-aligns it to
   the button's edge on desktop; at this width the button's edge IS the
   column's edge, so centred under a full-width button is the same
   alignment and reads better.
   ================================================================== */
@media (max-width:640px){
  #buy .ep-btn-row .ep-btn[data-buy],
  #order .ep-btn-row .ep-btn[data-buy],
  .lastcall .ep-btn[data-buy]{
    display:flex;
    width:100%;
    justify-content:center;
  }
  .offer-detail .ep-foot{
    text-align:center;
    width:auto;
    margin-inline:auto;
  }
}

/* ==================================================================
   12. THE PAGE STRIP'S OWN SCROLLBAR.

   `.scroller` in 04 is `overflow-x:auto` and its five tiles are 1580px
   wide against a 1080px container, so it is scrollable at EVERY width -
   which on Windows, where scrollbars are classic rather than overlay,
   paints a real horizontal bar under the strip on a desktop. That is
   what a horizontal scrollbar on this page turns out to be: not the
   document overflowing - tools/check_kit.py measures zero page overflow
   at every 20px from 360 to 1620 - but this element's own bar.

   THE REFERENCE HAS THE SAME BAR and does not hide it. Hidden here
   because the affordance is already on the page in words: the
   "swipe to see more pages" line sits directly under the strip, which is
   the reason the reference put it there. Nothing about the scrolling
   changes - trackpad, wheel, touch, arrow keys and tabbing to a tile all
   still work; only the painted bar goes.
   ================================================================== */
.scroller{scrollbar-width:none;-ms-overflow-style:none}
.scroller::-webkit-scrollbar{display:none}
