/* ------------------------------------------------------------------
   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 (#0A2A2E) and --ink-deep is the same value,so the two would
   read as one dark mass; --ink (#113F44) is one step up and the band reads as
   its own. Cream on it is 10.25 : 1.

   --accent-lift for the rule,not --accent: --accent is the oxblood #7A1F0E
   and measures 1.12 : 1 on #113F44. --accent-lift is the palette's own answer
   to "the accent on a dark band" and is 6.76 : 1 there. The token this line
   named was the teal #0E5A61 until the Seasoned Cruiser revision; the
   conclusion did not change with it, only the figure.

   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 #D7372F is a much
   brighter red, and at the same .4 over our lighter ground it lifts by +82 -
   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) = #66302E, which at his
   .4 lifts by +37: 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:#66302E}
}.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 #F2EBDC;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(94,115,85,.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(2,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(34,39,31,.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:#FFF8F2;
  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:#9AA093;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(34,39,31,.04),0 6px 16px -12px rgba(34,39,31,.3);
}.bk:hover{transform:translateY(-3px);box-shadow:0 2px 4px rgba(34,39,31,.06),0 14px 24px -14px rgba(34,39,31,.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:#FFF8F2}.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 #3A4136;border-bottom:1px solid #3A4136;margin-bottom:2rem;
}.ty{padding:1rem .8rem;text-align:center}.ty + .ty{border-left:1px solid #3A4136}.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:#8E9487;margin-top:.35rem;
}.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}.card{
  position:relative;overflow:hidden;background:#2A2F26;border:1px solid #3A4136;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:#2F352B}.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 #4A5144;
}.card:hover .card-no{-webkit-text-stroke-color:#6E7566}.card h3{color:#fff;font-size:1.02rem;margin:0 2.6rem .5rem 0;line-height:1.25}.card p{font-size:.86rem;color:#A2A899;margin:0;max-width:none}.inside-cta{margin-top:2rem;padding-top:1.8rem;border-top:1px solid #3A4136;text-align:center}.inside-cta .btn{margin-inline:auto}.inside-cta p{font-size:.84rem;color:#8E9487;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(94,115,85,.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(10,42,46,.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 #3A4136}.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(34,39,31,.04),0 6px 16px -12px rgba(34,39,31,.3);
  transition:transform .18s ease,box-shadow .18s ease;
}.review:hover{transform:translateY(-3px);box-shadow:0 2px 4px rgba(34,39,31,.06),0 14px 24px -14px rgba(34,39,31,.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 27
   (The Senior Flyer / A Rule Book), 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%),#D9D0B6 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%),#D9D0B6 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,#D9D0B6) 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(2,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:#5A564E;
  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(10,64,70,.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(34,39,31,.5)) drop-shadow(0 14px 24px rgba(34,39,31,.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,241,232,.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,241,232,.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,241,232,.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,241,232,.82)}.mx-col h3{color:var(--paper);border-bottom-color:rgba(245,241,232,.16)}.mx-col h3 span{color:var(--accent-lift)}.mx-col li{color:rgba(245,241,232,.82);border-bottom-color:rgba(245,241,232,.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% = #9A8A6C, 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:#9A8A6C}

/* 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 #EA655D 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:#EA655D;border-left-color:#EA655D}


/* ==================================================================
   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(122,31,14,.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(10,42,46,.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;
  padding:6px 4px 18px;margin:0;list-style:none;
  scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
}
.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(10,42,46,.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. The cruise build's is #06121F
   against its --ink-deep #0A1D31 - each channel at .600 / .621 / .633 of
   the token. The same three factors on this shop's --ink-deep #0A2A2E
   give #061A1D, which is what is written here. Paper on it is 15.88 : 1,
   the caption at .92 is 13.54 : 1 and the hint at .62 is 6.65 : 1. */
.pv{
  position:fixed;inset:0;z-index:9997;display:none;
  align-items:center;justify-content:center;
  padding:3.4rem 1rem 1rem;
  background:rgba(6,26,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,241,232,.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,241,232,.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,241,232,.12);border:1px solid rgba(245,241,232,.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. 07'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,#9AA093);
  margin-bottom:.9rem;
}
.foot-ask a{color:#D3D8CB;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:#9A8A6C;
}
/* THE SOURCE LINE IS A LINE, 2026-09-19.

   It was capped at 760px - the arithmetic's `.mx-delta` measure - and the
   three credits need about 890px at this size, so it has been rendering as
   a two-line paragraph at every width since it was written. A citation that
   wraps reads as copy; the point of this one is that it is a credit under a
   table.

   THE TEXT IS UNCHANGED. Only the measure is: the cap comes off up to the
   container's own 1080px, which puts all three credits on ONE LINE at 1920
   and 1440 with room to spare.

   AT 390 IT IS FOUR LINES AND IT STAYS FOUR LINES. The brief asks for max
   two there. The three credits are 118 characters; at 390 the column is
   359px, so two lines would need about 6.1px of advance per character - a
   9.6px mono face, on a page built for 65-year-old eyes.

   A 10.4px step with the tracking off was built and measured first: it got
   390 from four lines to three, and it cost three of tools/verify.py's
   ELIAS_MATH figures - noteRenderedPx 11.2, noteTrack .1em and noteLh 18.14
   - which are read off the reference's own source note. One line saved on a
   credit under a table the reader has finished, against three measured
   reference figures, is the wrong trade, so the step came back out.

   390 IS NOT A REGRESSION EITHER WAY: the line was four lines there before
   this set too, because 760px and 359px both cap to the same 359px column.
   What changed is 1920 and 1440, which were two lines and are now one. */
.mx-src{max-width:min(1080px,100%)}

/* ---- 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:#082226;
  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}
}
/* 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. */
.mx-col li.mx-credit span:last-child{
  display:flex;flex-direction:row;align-items:baseline;gap:0;
  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);
}
/* THE CREDIT FIGURE ACTUALLY RENDERS IN THE LIFT COLOUR, 2026-09-19.

   The declaration above has been in this file since the row was built and
   has never taken effect: `#ledger .mx-col li span:last-child{color:
   var(--paper)}` is (1,1,2) and `.num-credit` is (0,1,0), and the credit
   figure IS that last child. It has been rendering in --paper, identical to
   the three costs above it.

   It did not show up as a problem while the row also said so in words -
   "Bumped on the way home - paid to you in cash". The six-word rule took
   that clause, so the minus sign is now doing the whole job of telling a
   reader that this one number is money coming back rather than another
   thing they paid, and a minus sign alone in the same colour as four costs
   is not enough.

   Same token, same 8.88 : 1 on this ground, just at a specificity that
   reaches the element. Nothing else in either column is drawn in it, which
   is what makes it a signal. */
#ledger .mx-col--after li.mx-credit > span:last-child.num-credit{
  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, #C9803F, 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:#C9803F;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 #F5F1E8 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 (#C9803F) 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 — geometry ported from the Seasoned Cruiser. */
.about-in{
  display:grid;
  grid-template-columns:17fr 23fr;
  gap:80px;
  align-items:start;
}
.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}
.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;
}
.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;
}
.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;
}
@media (max-width:1040px){
  .about-in{grid-template-columns:1fr;gap:48px}
  .about-media{max-width:min(100%,420px)}
  .about-media::before{inset:-8px}
}
@media (max-width:640px){
  .about-copy h2{font-size:26.5px}
  .about-copy p.about-pull{padding:22px 24px;font-size:19px}
  .about-copy p.about-sig{font-size:23px}
}


/* ==================================================================
   ==================================================================
   THE v3 REVISION, 2026-09-19.

   Everything below is new and nothing above it was edited. Five blocks,
   in the order they appear on the page:

     1. 04 What's inside, and the stats row under it
     2. 05 the product block, its review stack and its guarantee band
     3. the Ready-when-you-are close
     4. the exit modal's sale step
     5. the embedded-checkout modal

   Every colour is a token that was already in :root. Every geometry is
   read off otisgranger.com, and each block says which of his rules it
   came from. Nothing here uses !important, and nothing here redefines a
   rule that an earlier block in this file owns.
   ==================================================================
   ================================================================== */


/* ------------------------------------------------------------------
   1a.  04 WHAT'S INSIDE - his `.bullets`.

     .bullets      list-style:none;max-width:820px;margin:26px auto 0;
                   text-align:left
     .bullets li   padding:11px 2px;border-bottom:1px dotted #d8ccb4;
                   font-size:17.5px;line-height:1.5
     .pg           color:#9a8b7a;font-size:15px;white-space:nowrap
     .tocclose     max-width:820px;margin:24px auto 0;font-size:17px;
                   text-align:center;font-style:italic

   Taken value for value. The dotted rule is his - it is a lighter mark
   than the dashed one the arithmetic uses, which is what keeps ten rows
   from reading as a table - and --line-strong at 1px dotted is this
   page's nearest equivalent to his #d8ccb4.

   THE CHAPTER TAG DOES NOT WRAP. `white-space:nowrap` on `.pg` is his and
   it matters: "· ch. 10" broken across two lines reads as a stray number
   at the start of the next row.
------------------------------------------------------------------ */
.bullets{
  list-style:none;max-width:820px;margin:26px auto 0;padding:0;
  text-align:left;
}
.bullets li{
  padding:11px 2px;
  border-bottom:1px dotted var(--line-strong);
  font-family:var(--serif);
  font-size:17.5px;line-height:1.5;color:var(--ink-soft);
}
.bullets li b{font-weight:700;color:var(--ink)}
.pg{
  font-family:var(--mono);
  color:var(--ink-mute);font-size:13px;letter-spacing:.06em;
  white-space:nowrap;
}
.tocclose{
  max-width:820px;margin:24px auto 0;
  font-family:var(--serif);font-style:italic;
  font-size:17px;line-height:1.55;color:var(--ink-soft);
  text-align:center;
}
@media (max-width:640px){
  .bullets li{font-size:16.5px}
  .tocclose{font-size:16px}
}

/* ------------------------------------------------------------------
   1b.  THE STATS ROW - his `section.stats` / `.statgrid` / `.stat`.

     .stats     a dark band
     .statgrid  display:flex;gap:36px;justify-content:center;
                flex-wrap:wrap;text-align:center
     .stat b    display:block;font-size:56px;line-height:1, in his gold
     .stat span font-size:16px, in his line colour

   Ours is that row on --ink-deep with the figures in --accent-lift, which
   is the token this page already uses for a figure on a dark band (the
   arithmetic's totals and its unit labels are the same pair). 8.88 : 1.

   THE SEPARATORS ARE HAIRLINES, NOT HIS BARE GAP. Three figures centred in
   a row with nothing between them read as one number split into pieces at
   a glance; the page's own `.hero-stats` solves the same problem with a
   1px left border on every item but the first, and this follows it. They
   come off when the row wraps, because a vertical rule above a wrapped
   item points at nothing.
------------------------------------------------------------------ */
/* UN-TOMBSTONED 2026-09-19 (round 3). The row is back on the page: the 2026
   edition is 178 pages, which is the page count the owner said it had to have
   before this shape earned its place. The rules below are THE SAME RULES IT
   LEFT WITH - not rewritten, uncommented - so the row that came back is the
   row that went away. FOUR FIGURES NOW, which is Otis Granger's own count;
   the three-figure version only ever existed because the page count had to
   come off. `.fact` is padded for four rather than three at the narrow steps,
   which is the one change. */
.factbar{
  background:var(--ink-deep);
  color:var(--paper);
  padding:var(--sec) 0;
}
.factgrid{
  display:flex;gap:0;justify-content:center;flex-wrap:wrap;
  text-align:center;
}
.fact{padding:0 2.6rem}
.fact + .fact{border-left:1px solid rgba(245,241,232,.16)}
.fact b{
  display:block;
  font-family:var(--display);font-weight:700;
  font-size:56px;line-height:1;color:var(--accent-lift);
}
.fact span{
  display:block;
  font-family:var(--ui);font-weight:700;
  text-transform:uppercase;letter-spacing:.14em;
  font-size:.62rem;color:rgba(245,241,232,.72);
  margin-top:.55rem;
}
/* FOUR FIGURES FIT AT 1920 AND 1440 AT HIS OWN 2.6rem. Below that the row
   would wrap "official sources" onto a second line on its own, which reads as
   a fifth stat, so the padding steps down before the wrap can happen. */
@media (max-width:1100px){
  .fact{padding:0 1.8rem}
  .fact b{font-size:46px}
}
@media (max-width:820px){
  .factgrid{gap:1.4rem 0}
  .fact{flex:0 0 50%;padding:0 .8rem}
  .fact + .fact{border-left:0}
  .fact:nth-child(even){border-left:1px solid rgba(245,241,232,.16)}
  .fact b{font-size:40px}
}
@media (max-width:640px){
  .factbar{padding:calc(var(--sec) * .85) 0}
  .fact b{font-size:34px}
  .fact span{font-size:.54rem;letter-spacing:.1em}
}
@media (max-width:380px){
  .fact{padding:0 .5rem}
  .fact b{font-size:30px}
  .fact span{font-size:.5rem;letter-spacing:.06em}
}



/* ==================================================================
   2.  05  THE PRODUCT BLOCK - his `.shopcard`.

   HIS MEASUREMENTS, AND WHAT EACH ONE BECAME:

     .shopcard  max-width:980px;margin:0 auto;background:#fff;
                border:1px solid #e5dccb;border-radius:20px;
                box-shadow:0 24px 70px rgba(0,0,0,.10);overflow:hidden
                -> 980px, --paper, --line-strong, 20px, the same shadow.
                   `overflow:hidden` is load-bearing: it is what makes the
                   three bands share the card's rounded corners instead of
                   squaring them off at the bottom.
     .shoptop   display:flex;gap:38px;padding:38px;flex-wrap:wrap
     .shopcov   flex:0 0 240px
     .shopinfo  flex:1 1 380px
                -> kept exactly. 240 + 38 + 380 = 658, so the two columns
                   stay side by side until the card is under ~734px of
                   content box and then the cover goes full width with the
                   copy under it. THE COVER IS FIRST IN THE MARKUP, so
                   that stacked order is the source order and needs no
                   `order` property and no media query.
     .shopname  Georgia serif, 33px, bold
     .shopstars 18px, letter-spacing 2px
     .shopbul   list-style:none;margin:14px 0 16px;font-size:16.5px;
                line-height:1.75
     .pnow2     38px bold, in his red
     .pwas2     19px, struck, muted, margin-left:10px
     .psave2    a filled pill: 12.5px bold, letter-spacing .06em,
                border-radius:999px, padding 6px 13px, margin-left:12px,
                vertical-align:6px
     .shopbuy   display:block;text-align:center, full width, 21px
     .shopsub   text-align:center;font-size:13px, muted, margin-top:8px
     .shoprev   background:#FBF6EE;border-top:1px solid;
                padding:24px 38px 30px
     .shoprevh  font-size:14px;letter-spacing:.24em
     .shopcards display:flex;gap:16px;flex-wrap:wrap
     .shopcardr flex:1 1 250px;background:#fff;border:1px solid;
                border-radius:12px;padding:16px 18px  - and `display:none`
                until `.is-on` is added
     .revmore   display:block;width:100%;margin-top:14px;2px border;
                bold 15px;padding:11px 14px;border-radius:10px
     .shopfoot  border-top:1px solid;padding:16px 38px;display:flex;
                gap:18px;justify-content:center;flex-wrap:wrap;
                font-size:13.5px
   ================================================================== */

/* The anchor alias. Zero-height, no box, no effect on flow - it exists so
   that `#order` still resolves to the top of this section. */
.anchor-alias{display:block;height:0;overflow:hidden}

/* THE EYEBROW INSIDE A CENTRED HEAD, 2026-09-19.

   `.eyebrow` is a left-edge device: every section that has one - 02, 06 -
   runs its head flush left, and the rule carries a measure and no alignment
   because the block around it is already left-aligned. `.sec-head` is the
   CENTRED head, used by 01, 03 and now 04 and 05, and until this set no
   centred head had an eyebrow. Dropped into one, the eyebrow kept its
   measure and hung off to the left of the H2 it was labelling - measured at
   1920, it sat 400px left of centre.

   One rule, scoped to the centred head only, so the left-aligned heads are
   untouched. */
.sec-head .eyebrow{
  display:block;text-align:center;max-width:none;
  margin-inline:auto;
}

/* THE FULL-WIDTH BUTTON, 2026-09-19.

   `.ep-btn--block` existed already but was written as `.xi .ep-btn--block`,
   scoped to the exit modal, which is the only place it was used. His
   `.shopbuy` is `display:block;text-align:center` at the full width of the
   copy column, and the Ready block and the product block both want the same
   thing, so the modifier is unscoped and the modal's copy is left where it
   is - it is the same three declarations and removing it would be an edit
   to a block this revision has no business in. */
.ep-btn--block{display:flex;width:100%;justify-content:center}

.rb{background:var(--tile)}
.rb-head{margin-bottom:var(--sec-in)}

/* HIS LEAD, ABOVE THE CARD. Two paragraphs: the first is the price and its
   terms, set one step up so it carries; the second is the delivery and the
   guarantee at reading size. Both centred and held to his 820px measure. */
.rb-lead{max-width:820px;margin:0 auto var(--sec-in);text-align:center}
.rb-lead p{
  font-family:var(--serif);
  font-size:1.06rem;line-height:1.6;color:var(--ink-soft);
  max-width:none;margin:0 0 .7rem;
}
.rb-lead p:first-child{
  font-size:1.3rem;line-height:1.45;color:var(--ink);font-weight:700;
}
.rb-lead p:last-child{margin-bottom:0}
@media (max-width:640px){
  .rb-lead p:first-child{font-size:1.14rem}
  .rb-lead p{font-size:1rem}
}

.rb-card{
  max-width:980px;margin:0 auto;
  background:var(--paper);
  border:1px solid var(--line-strong);
  border-radius:20px;
  box-shadow:0 24px 70px rgba(34,39,31,.10);
  overflow:hidden;
  text-align:left;
}
.rb-top{display:flex;gap:38px;padding:38px;flex-wrap:wrap}
.rb-cov{flex:0 0 240px}
.rb-cov picture{display:block}
.rb-cov img{
  display:block;width:100%;height:auto;border-radius:2px;
  filter:drop-shadow(0 16px 24px rgba(34,39,31,.26));
}
.rb-info{flex:1 1 380px;min-width:0}

.rb-name{
  font-family:var(--serif);font-weight:700;
  font-size:33px;line-height:1.14;color:var(--ink);
  margin:2px 0 6px;max-width:none;
}
/* `.ep-rating` and `.starline` are the page's own and are not restated
   here: the rating line inside this card is the one that was in the
   deleted 07 block, rule for rule. Only its bottom margin is set, because
   the four bullets come next rather than a value stack. */
.rb-info .ep-rating{margin:0 0 14px}

.rb-bul{
  list-style:none;padding:0;margin:14px 0 16px;
  font-family:var(--serif);
  font-size:16.5px;line-height:1.75;color:var(--ink-soft);
}
/* His bullets carry no marker at all. Ours take the page's own triangle,
   which is what `.stack li` and the hero points both use, so that a list of
   four facts inside a card reads like every other list on the site. */
.rb-bul li{
  position:relative;padding-left:1.15rem;
}
.rb-bul li::before{
  content:"\25B8";
  position:absolute;left:0;top:0;
  color:var(--accent);font-size:.72rem;line-height:1.75rem;
}

/* The value stack is `.ep-includes--short`, unchanged. It only needs its
   own spacing inside this card. */
.rb-stack{margin:0 0 20px}

.rb-price{
  display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding:16px 0 0;margin:0 0 14px;
  border-top:1px solid var(--line);
}
.rb-now{
  font-family:var(--serif);font-size:38px;font-weight:500;line-height:1;
  color:var(--ink);
}
.rb-now em{font-style:italic;color:var(--accent)}
.rb-was{
  font-family:var(--ui);font-size:19px;color:var(--ink-mute);
  text-decoration:line-through;
}
/* HIS `.psave2`, AND THE COLOUR IS OURS AND IS NOT THE PRICE'S. His pill is
   a green that is not his red. --free-green is this page's "you keep it"
   colour - the guarantee seal, the FREE tags - and SAVE $52 TODAY is the
   one thing on this card that is a saving rather than a charge. White on
   --free-green is 5.93 : 1. */
.rb-save{
  display:inline-block;
  background:var(--free-green);color:#fff;
  font-family:var(--ui);font-weight:700;
  font-size:12.5px;letter-spacing:.06em;text-transform:uppercase;
  border-radius:999px;padding:6px 13px;
  white-space:nowrap;
}
.rb-info .ep-btn-row{margin-top:0}
/* `.ep-btn--block` is already in this file - the exit modal's button uses
   it - and it is the same full-width treatment his `.shopbuy` has. Nothing
   is redefined; the button is the page's own button. */
.rb-sub{
  text-align:center;
  font-family:var(--ui);font-size:13px;letter-spacing:.06em;
  color:var(--ink-mute);margin:8px 0 0;max-width:none;
}

/* ---- the review band ---- */
.rb-rev{
  background:var(--deep);
  border-top:1px solid var(--line-strong);
  padding:24px 38px 30px;
}
.rb-revh{
  font-family:var(--ui);font-weight:700;
  font-size:14px;letter-spacing:.24em;text-transform:uppercase;
  color:var(--accent);margin:0 0 14px;max-width:none;
}
.rb-cards{display:flex;gap:16px;flex-wrap:wrap}
/* HIDDEN BY DEFAULT, REVEALED BY `.is-on`, WHICH IS HIS. The first six carry
   the class in the markup, so the no-JavaScript state is six reviews. */
.rbrev{
  display:none;
  flex:1 1 250px;
  background:var(--paper);
  border:1px solid var(--line);
  border-radius:12px;
  padding:16px 18px;
}
.rbrev.is-on{display:block}
.rbrev .starline{display:block;margin-bottom:6px}
.rbrev p{
  font-family:var(--serif);font-style:italic;
  font-size:.95rem;line-height:1.6;color:var(--ink-soft);
  margin:0;max-width:none;
}
/* `.who` is the page's own caption band and is not restated - only the
   spacing it needs inside this card, and the band it sits on, which is the
   card's paper rather than the section's. */
.rbrev .who{background:none;margin:10px 0 0}

/* His `.revmore`: a full-width ghost button in the accent, two-pixel rule,
   bold, not a link. It is a <button> because it reveals content on the page
   and navigates nowhere. */
.rb-more{
  display:block;width:100%;margin-top:14px;
  background:var(--paper);
  border:2px solid var(--accent);
  color:var(--accent);
  font:inherit;font-weight:700;font-size:15px;
  padding:11px 14px;border-radius:10px;cursor:pointer;
  transition:background .2s ease,color .2s ease;
}
.rb-more:hover{background:var(--accent);color:var(--paper)}
.rb-more:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.rb-more{transition:none}}

/* ---- the guarantee band ---- */
.rb-foot{
  border-top:1px solid var(--line-strong);
  padding:16px 38px;
  display:flex;gap:18px;justify-content:center;flex-wrap:wrap;
  font-family:var(--body);font-size:13.5px;line-height:1.5;
  color:var(--ink-mute);text-align:center;
}
.rb-foot b{color:var(--ink);font-weight:700}

@media (max-width:640px){
  .rb-top{gap:24px;padding:24px}
  .rb-cov{flex:0 0 100%;max-width:220px;margin-inline:auto}
  .rb-name{font-size:27px;text-align:center}
  .rb-info .ep-rating{text-align:center}
  .rb-price{justify-content:center}
  .rb-now{font-size:33px}
  .rb-rev{padding:20px 20px 24px}
  .rb-foot{padding:16px 20px;gap:10px}
  .rbrev{flex:1 1 100%}
}


/* ==================================================================
   3.  READY WHEN YOU ARE - his `.lastcta`.

   His: an H2 in the paper colour, one centred line under it at 19px with
   max-width 600 and 26px of clear, then one button at max-width 420, then
   the "Questions before you buy?" line.

   `.lastcall`, `.lc-in`, `.lc-sub` and `.ep-btn--invert` are all already in
   this file and are NOT redefined. What is new is the H2's own spacing -
   the block lost its eyebrow, so the heading is the first thing in it now -
   and the question line under the button.
   ================================================================== */
.lastcall h2{margin-top:0}
.lc-ask{
  font-size:1rem;line-height:1.55;
  color:rgba(245,241,232,.82);
  max-width:none;margin:28px auto 0;
}
.lc-ask b{color:var(--paper);font-weight:700}
.lc-ask a{
  color:var(--accent-lift);text-decoration:underline;
  text-underline-offset:.2em;
}
.lc-ask a:hover{color:var(--paper)}
@media (max-width:640px){
  .lc-ask{font-size:.94rem;margin-top:22px}
}


/* ==================================================================
   4.  THE EXIT MODAL'S SALE STEP - his `.slidein` / `.spright`.

   HIS MEASUREMENTS:

     .spsave      background:gold;color:#fff;font-size:11.5px;bold;
                  letter-spacing:.12em;border-radius:999px;padding:7px 14px
     .speye       font-size:11.5px;bold;letter-spacing:.22em, in his gold
     h3           Georgia serif, 25px, margin 0 0 4px, line-height 1.15
     .spsub       font-size:14px, muted, margin-bottom:10px
     .spnow       font-size:34px;bold, in his red
     .spwas       font-size:17px;struck;muted;margin-left:9px;opacity:.6
     .splabel     font-size:12.5px;muted;margin:2px 0 8px
     #spclock     inline-block;background:#221812;color:#F5C784;
                  font-size:24px;bold;letter-spacing:4px;
                  font-variant-numeric:tabular-nums;padding:8px 16px;
                  border-radius:10px
     .spclockwrap margin:0 0 14px
     #spbuy       block;centred;bold;17.5px;padding:14px 12px
     .fine        font-size:12px;margin:10px 0 0;centred

   Taken value for value, with his gold and his oxblood replaced by ours and
   his clock plate replaced by the one this site already has: --signal-lift
   on --signal-deep, which is the exact pair the top bar's timer uses. The
   two clocks show the same seconds and now look like it.

   `.xi`, `.xi-box`, `.xi-cover`, `.xi-close`, `.xi h2` and the eyebrow are
   the card's own rules and are not touched. Only the new elements are here.
   ================================================================== */
/* EVERY ONE OF THESE IS SCOPED UNDER `.xi`, AND THAT IS NOT DECORATION.
   `.xi p{font-size:1rem;line-height:1.5;color:var(--ink-soft);margin:0 0 22px}`
   is (0,1,1) and every element in this step is a <p>, so a bare class rule at
   (0,1,0) loses every declaration it shares with it - which was measured, not
   guessed: the product line and the price label both rendered at 16px instead
   of 14 and 12.5, and the SAVE chip's white label came out in the body colour
   on the green, at 1.9 : 1. `.xi .xi-save` is (0,2,0) and wins cleanly. */
.xi .xi-save{
  display:inline-block;
  background:var(--free-green);color:#fff;
  font-family:var(--ui);font-weight:700;
  font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;
  border-radius:999px;padding:7px 14px;
  margin:0 0 14px;max-width:none;
  white-space:nowrap;
}
/* The eyebrow already renders at 14px / .14em on this card; it only needs
   its bottom margin closing up, because a headline follows it directly
   rather than the 18px the old two-line step wanted. */
.xi #xi-offer .xi-eyebrow{margin:0 0 6px}
.xi #xi-offer h2{font-size:1.6rem;margin:0 0 6px;padding-right:1.4rem}
.xi .xi-prod{
  font-family:var(--serif);
  font-size:14px;line-height:1.5;color:var(--ink-mute);
  margin:0 0 10px;max-width:none;
}
.xi .xi-price{
  display:flex;align-items:baseline;justify-content:center;gap:9px;
  margin:0;max-width:none;
}
.xi-now{
  font-family:var(--serif);font-size:34px;font-weight:500;line-height:1;
  color:var(--ink);
}
.xi-now em{font-style:italic;color:var(--accent)}
.xi-was{
  font-family:var(--ui);font-size:17px;color:var(--ink-mute);
  text-decoration:line-through;opacity:.6;
}
.xi .xi-live{
  font-size:12.5px;line-height:1.5;color:var(--ink-mute);
  margin:2px 0 10px;max-width:none;
}
.xi .xi-clockwrap{margin:0 0 14px;max-width:none}
/* The same plate and the same pair of colours as the top bar's timer, so
   the page has one clock treatment and not two. 4.52 : 1. */
.xi-clock{
  display:inline-block;
  background:var(--signal-deep);color:var(--signal-lift);
  font-family:var(--mono);font-size:24px;font-weight:600;
  letter-spacing:4px;font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1;
  padding:8px 16px;border-radius:10px;
}
.xi .xi-fine{
  font-size:12px;line-height:1.45;color:var(--ink-mute);
  margin:10px 0 0;max-width:none;
}
@media (max-width:480px){
  .xi #xi-offer h2{font-size:1.38rem}
  .xi-now{font-size:29px}
  .xi-clock{font-size:21px;letter-spacing:3px;padding:7px 13px}
}


/* [moved to checkout.css, 2026-09-24] */


/* ==================================================================
   ==================================================================
   ROUND 2, 2026-09-19.

   Ten blocks, in the order the brief numbers them. Everything above this
   line is untouched; where a round-1 rule had to give way it is
   overridden here and the override says why, so the two sets can still
   be read apart.
   ==================================================================
   ================================================================== */


/* ------------------------------------------------------------------
   1.  THE TOP BAR'S BOXED UNITS - IN urgency.css, NOT HERE.

   The block that was here has been moved to the foot of urgency.css, and
   that is a load-order fact rather than tidiness: <head> links styles.css,
   then landing.css, then urgency.css, and the strip's round-1 rules live in
   urgency.css. `.urg-unit{display:inline-flex}` there and
   `.urg-unit{display:block}` here are both (0,1,0), so the later file wins
   and the label kept sitting beside the number instead of under it. The
   whole block moved rather than being fought with !important.
------------------------------------------------------------------ */

/* ------------------------------------------------------------------
   2.  THE HERO - the image fills the text column's height.

   WHAT WAS WRONG, MEASURED at 1920 and 1440: `.hero-in` ran
   `align-items:start`, so the media track was the picture's own height -
   419px - against a 717px text column. 298px of empty page beside the lead.

   THE FIX IS THREE DECLARATIONS AND A MOVE:
     - the grid stretches, so the media track is the row's height;
     - `.hero-frame` and `.hero-photo` fill that track;
     - the img is `object-fit:cover` with `object-position:center top`, so
       the crop takes off the BOTTOM of the frame and Sharon's face, which
       is in the upper half of the source, is never the part that goes.
     - the CTA pair and its sub-line moved out of the text column and under
       the whole grid (see `.hero-cta` below), which is what makes the text
       column short enough for the image to match it at a sane height.

   THE HEIGHT IS CAPPED BY THE TEXT, NOT BY THE IMAGE. The brief's rule: if
   the stretch takes the image past ~640px at 1920, narrow the text rather
   than shrink the picture. `.hero-text` takes a 30rem measure at 1921+,
   which lets the lead wrap one line later and holds the row height down.
------------------------------------------------------------------ */
@media (min-width:821px){
  .hero-in{align-items:stretch}
  .hero-media{align-self:stretch;display:flex}
  .hero-frame{flex:1 1 auto;display:flex;min-height:0}
  .hero-photo{display:block;width:100%;height:100%}
  .hero-photo img{
    width:100%;height:100%;
    object-fit:cover;
    /* THE CROP COMES OFF THE BOTTOM. The source is Sharon at the gate with
       her head in the upper third; `center top` keeps the head and takes
       the floor. Checked visually at 1440 and 1920. */
    object-position:center top;
  }
}
/* THE CTA ROW, UNDER BOTH COLUMNS. It is inside the hero's own `.wrap`, so
   its left edge is the text column's left edge - the same edge the mark
   line, the H1, the lead and the three checkmarks all start on. */
.hero-cta{
  display:flex;flex-direction:column;align-items:flex-start;
  margin-top:1.6rem;
}
.hero-cta .btn-row{margin-top:0}
.hero-cta .cta-note{margin-top:.9rem}
@media (max-width:820px){
  /* The grid is already one column here, image first. The CTA block follows
     it in source order, so the phone order is image, text, buttons, trust
     row with nothing to reorder - and it centres with the rest. */
  .hero-cta{align-items:center;text-align:center;margin-top:1.2rem}
  .hero-cta .btn-row{justify-content:center}
}
@media (min-width:1921px){
  /* See the note above: the row height is held down by narrowing the text,
     not by shrinking the picture. */
  .hero-text{max-width:30rem}
}


/* ------------------------------------------------------------------
   3.  THE MATH - the stats row is gone, and the source line gets its
       third line at 390.

   `.factbar` / `.factgrid` / `.fact` are TOMBSTONED. The section was
   deleted from index.html, where the reason is recorded in full: the shape
   is built around a headline page count, and this book's is 28. The rules
   are kept here, commented, so a later set that earns the figure back has
   the geometry rather than having to re-measure it.

     .factbar{background:var(--ink-deep);color:var(--paper);padding:var(--sec) 0}
     .factgrid{display:flex;gap:0;justify-content:center;flex-wrap:wrap;
               text-align:center}
     .fact{padding:0 2.6rem}
     .fact + .fact{border-left:1px solid rgba(245,241,232,.16)}
     .fact b{display:block;font-family:var(--display);font-weight:700;
             font-size:56px;line-height:1;color:var(--accent-lift)}
     .fact span{display:block;font-family:var(--ui);font-weight:700;
                text-transform:uppercase;letter-spacing:.14em;
                font-size:.62rem;color:rgba(245,241,232,.72);
                margin-top:.55rem}

   THE SOURCE LINE: THE OWNER HAS ALLOWED THREE LINES AT 390, so the step
   that gets it there is back. 118 characters in a 359px column will not
   make two at any size a 65-year-old should be asked to read; at 10.4px
   with the tracking off it makes three.

   IT COSTS THREE OF verify.py's ELIAS_MATH FIGURES AT 390 - noteRenderedPx
   11.2, noteTrack .1em and noteLh 18.14 - and they are retired there by
   name, against the owner's instruction, rather than quietly failing. The
   colour pair does not move, so the contrast figure is unchanged.
   1920 and 1440 are one line and are not touched by this.
------------------------------------------------------------------ */
@media (max-width:640px){
  .mx-src{font-size:10.4px;letter-spacing:0;line-height:16.8px}
}


/* ------------------------------------------------------------------
   5.  THE PRODUCT CARD - Bertha's, measured at 1440.

     .shopcard  980px; 1px #e5dccb; radius 20px; #fff;
                box-shadow 0 24px 70px rgba(0,0,0,.10)
     .shoptop   display:flex; padding:38px; gap:38px; flex-wrap:wrap
     .shopcov   flex:0 0 240px                         240 x 454
     .shopcov img  width:240px; radius:10px;
                   box-shadow 0 18px 44px rgba(0,0,0,.25)   240 x 362
     .shopinfo  flex:1 1 380px                         624 x 454
     .shopname  33px / 700, margin 2px 0 6px
     .shopbul   16.5px / 28.875px, margin 14px 0 16px
     .shopbuy   display:block; padding:16px 20px; radius 12px;
                21px / 700; margin-top:14px
     .shopsub   13px, centred, margin-top:8px

   OURS ALREADY MATCHED HER CARD, HER PADDING, HER GAP AND HER COLUMNS. The
   one thing it did not match is how much of the card the cover holds, and
   THE WIDTH RATIO WAS NOT THE REASON - measured, hers is 240 of 980 and
   ours was 240 of 980, both 24.5%.

   WHAT IS DIFFERENT IS THE COLUMN BESIDE IT. Her copy column is 454px tall
   and her cover is 362 of it - 80%. Ours is 925px tall, because ours
   carries a seven-row value stack hers does not have, and the same 360px
   cover filled 39% of it. The cover was not small; it was stranded at the
   top of a column twice its height with 490px of paper under it.

   SO THE COVER IS WIDENED AND CENTRED, and that is a DEVIATION from the
   literal instruction, recorded with the measurement that prompted it:
   300px, which is 30.6% of the card, and `align-items:center` on the row so
   it sits against the middle of the stack rather than above it. It is still
   the smaller half of the card and it now holds its side of it.

   HER IMAGE TREATMENT COMES WITH IT: the 10px radius and the
   0 18px 44px rgba(0,0,0,.25) drop, in place of our flat 2px corner.
------------------------------------------------------------------ */
/* ------------------------------------------------------------------
   THE COVER, RE-MEASURED 2026-09-19 (round 3).

   MEASURED AGAINST BERTHA AT 1440 AND 1920, and the metric is the one that
   matches what the eye actually reads - the cover's SHARE OF THE CARD'S TOP
   BAND, not its share of the card's width:

                         width/card    area/band    height/column
     Bertha                 24.5%        21.2%          79.7%
     ours, round 1 (240)    24.5%         9.9%          32.0%
     ours, round 2 (300)    30.6%        12.9%          41.6%
     ours, round 3 (384)    39.2%        21.2%          63.7%

   Round 1 matched her WIDTH RATIO exactly and still read as a small object,
   which is what the owner kept seeing. Round 2 widened it and did not fix
   it. The reason is the column beside it: hers is 454px tall, ours is 1082
   - the 2026 stack is seven priced rows plus a total and a today band, where
   hers is four unpriced bullets - so the same width buys a third of the
   presence on our card that it buys on hers.

   384px is the width at which the cover holds the same SHARE OF THE BAND as
   hers. The brief authorises the copy column narrowing for it, and it does:
   564 -> 480px, which wraps six of the nine stack rows to TWO LINES and none
   to three. That is the trade the brief names, in the words it names it in,
   and it is taken.

   THE FINAL AREA SHARE IS 19.6%, NOT 21.2%, and the difference is the trade
   paying for itself: the wrapped rows make the column 93px taller, which
   grows the band the cover is being measured against. Chasing the last 1.6
   points would need a 400px cover and a third line on the longest rows.

   THE HEIGHT SHARE STILL DOES NOT MATCH and cannot: to fill 79.7% of a
   1082px column the cover would have to be 574px wide, which is more than
   half the card. The area share is the one that was asked for.
------------------------------------------------------------------ */
.rb-top{align-items:center}
.rb-cov{flex:0 0 384px}
.rb-cov img{
  border-radius:10px;
  filter:none;
  box-shadow:0 18px 44px rgba(34,39,31,.25);
}
@media (max-width:640px){
  .rb-top{align-items:stretch}
  .rb-cov{flex:0 0 100%;max-width:240px}
}

/* HER BULLET, WITH A CHECK GLYPH. Round 1 gave these the page's own
   triangle, which is the marker a value LIST takes. These four are things
   the reader gets, and a tick says so. Drawn in `::before` so nothing is
   typed into the markup and a screen reader is not read four ticks. */
.rb-bul li::before{
  content:"\2713";
  font-family:var(--body);
  font-size:.92rem;line-height:1.75rem;font-weight:700;
  color:var(--accent);
}
.rb-bul li{padding-left:1.5rem}


/* ------------------------------------------------------------------
   6.  THE REVIEW GRID - Bertha's, measured at 1440.

     .shoprev    padding 24px 38px 30px; background #FBF6EE;
                 border-top 1px #e5dccb                  978 x 359
     .shoprevh   14px; letter-spacing 3.36px (= .24em)    902 x 22.4
     .shopcards  display:flex; gap:16px; flex-wrap:wrap   902 x 203.7
     .shopcardr  flex:1 1 250px; padding:16px 18px;
                 radius 12px; 1px #e5dccb; #fff           290 x 203.7
       .st       14px / 700; letter-spacing 2px; margin-bottom 6px
       p         15px; italic; line-height 22.5px
       .who      13px; background #F7E9D6; margin-top 8px
     .revmore    display:block; width:100%; padding:11px 14px;
                 radius 10px; 2px border; 15px / 700; margin-top 14px
                                                         902 x 50

   THREE TO A ROW IS NOT A GRID DECLARATION, IT IS THE FLEX BASIS. Her band
   is 902px inside its padding, her cards are `flex:1 1 250px` and her gap
   is 16px: three fit, a fourth does not, and each settles at 290px. Ours is
   the same band at the same figures, so ours is three to a row too, and it
   stays three to a row at any width the card can take without a media
   query to keep in step.

   THE CAPTION BAND IS THE ONE THING ROUND 1 MISSED. Her `.who` carries
   `background:#F7E9D6` - a pale wash under the name, one step off the
   card's white, which is what makes the caption read as a band rather than
   as a fourth line of the quote. Ours takes --deep on the card's --paper,
   which is the same one-step relationship in our palette. --ink-soft on
   --deep is 7.06 : 1.
------------------------------------------------------------------ */
.rb-cards{display:flex;flex-wrap:wrap;gap:16px;align-items:stretch}
.rbrev{flex:1 1 250px;padding:16px 18px;border-radius:12px}
.rbrev .starline{margin-bottom:6px;letter-spacing:2px;font-size:14px}
.rbrev p{font-size:15px;line-height:22.5px}
/* HER PALE CAPTION BAND. It runs the full width of the card's content box
   and sits flush to its bottom padding, which is what stops it reading as a
   floating label. */
.rbrev .who{
  display:block;
  margin:12px -18px -16px;
  padding:8px 18px 10px;
  background:var(--deep);
  border-top:1px solid var(--line);
  border-radius:0 0 11px 11px;
  font-size:13px;line-height:20.8px;
  color:var(--ink-soft);
}
.rb-more{
  display:block;width:100%;margin-top:14px;
  padding:11px 14px;border-radius:10px;
  border:2px solid var(--accent);
  font-size:15px;font-weight:700;
}
@media (max-width:640px){
  .rbrev{flex:1 1 100%}
}


/* ------------------------------------------------------------------
   7.  THE FAQ - the eyebrow is gone.

   `#faq .eyebrow` selected nothing else, so nothing is orphaned. The
   numeral keeps its own rule and its own spacing; what it needed is the
   margin the eyebrow used to carry, because the H2 now follows it directly.
------------------------------------------------------------------ */
#faq .sec-num{margin-bottom:14px}


/* ------------------------------------------------------------------
   8.  READY WHEN YOU ARE - Otis's `.lastcta`, measured at 1440.

     .lastcta      padding 64px 0
     h2            38px / 700 / line-height 60.8px; margin 0 0 12px; centred
     p             19px / 30.4px; max-width 600px; margin-bottom 26px
     .cta          padding 19px 48px; radius 10px      305.8 x 76.8

   OURS WAS 130px / 110px OF PADDING AND A 70.4px H2 - 557px of page for one
   sentence and a button, which is a third again of his whole block. His
   figures, on our dark ground, with our type: 38px is the same size every
   other H2 on this page runs at, so the close now matches the sections
   rather than shouting over them.

   THE NUMERAL is `.sec-num` in the lift colour, which is what 02's takes on
   its own dark ground.

   THE TWO BLURRED ORBS STAY. They are `.lastcall::before/::after` and they
   are the only thing carrying depth on a flat field; his block has none
   because his ground is a gradient.
------------------------------------------------------------------ */
.lastcall{padding:64px 0}
.lastcall h2{
  font-size:38px;line-height:1.6;
  max-width:none;margin:0 auto 12px;
}
.lc-num{
  color:var(--accent-lift);
  text-align:center;margin:0 0 10px;
}
.lc-sub{
  font-size:19px;line-height:30.4px;
  max-width:600px;margin:0 auto 26px;
}
.lastcall .ep-btn{padding:19px 48px}
@media (max-width:640px){
  .lastcall{padding:48px 0}
  .lastcall h2{font-size:30px}
  .lc-sub{font-size:17px;line-height:1.6}
  .lastcall .ep-btn{padding:17px 28px}
}


/* ------------------------------------------------------------------
   9.  THE BUTTONS - the yellow family, built from the spec.

   Raymond and Hank are not on this machine, so this is built from the
   brief's values rather than ported, and every one of them is written out
   below so the next shop can port it from here.

     fill        linear-gradient(#FFD25C, #F6BC3A)
     label       #241A04, weight 700, tracking .08em
     edge        NO BORDER. The edge is depth:
                   inset 0 -2px 0 #E0A526      the lip
                   inset 0  1px 0 rgba(255,255,255,.55)   the top light
                 and a drop shadow 0 8px 18px -8px of our --ink-deep at 35%
     radius      10px, which is the reference buttons' own
     hover       lift 1px, the shadow grows, REAL COLOURS - one step down
                 the ramp, not a filter
     active      press 1px, the lip goes to 1px

   CONTRAST, COMPUTED, EVERY STATE. #241A04 measures
     11.94 : 1 on #FFD25C      9.94 : 1 on #F6BC3A      7.82 : 1 on #E0A526
     11.11 : 1 on #FFC845      9.07 : 1 on #F0B22C      (hover)
      9.98 : 1 on #F2BE45      8.60 : 1 on #E8AE2E      (active)
   AAA on all six, which is the point of a dark label on a yellow fill.

   THE FILL AGAINST THE PAGE IS RECORDED, NOT GATED, which is the brief's
   own instruction and WCAG 1.4.11's own carve-out: the ratio is
     1.53 : 1 on --paper   1.63 : 1 on --tile   1.35 : 1 on --deep
     8.80 : 1 on --ink-deep
   A yellow control on cream cannot clear 3 : 1 and stay yellow. What
   identifies the control is its LABEL, which is text and is AAA, and its
   shape - the lip and the drop shadow give it an edge on every ground. The
   three light figures are the cost of the colour and are on the record.

   WHICH BUTTONS. Every `[data-buy]` - the product card, the Ready close,
   the sticky bar and the exit modal's buy - and the hero's primary. THE
   OTHERS KEEP THEIR COLOUR and take the radius, the tracking and the
   depth only: the hero's ghost, 03's jump link, 08's submit and the exit
   modal's send. A page where every button is the loudest colour has no
   primary button.
------------------------------------------------------------------ */
:root{
  --btn-top:#FFD25C;
  --btn-bot:#F6BC3A;
  --btn-lip:#E0A526;
  --btn-ink:#241A04;
  --btn-top-hover:#FFC845;
  --btn-bot-hover:#F0B22C;
  --btn-top-active:#F2BE45;
  --btn-bot-active:#E8AE2E;
  --btn-radius:10px;
}

/* ---- the shared shape, on every button ---- */
.btn,.ep-btn,.buybar .buybar-cta,.cform-go,.rb-more{
  border-radius:var(--btn-radius);
}
.ep-btn{letter-spacing:.08em;font-weight:700}
.hero .btn-row.top-cta .btn{letter-spacing:.08em;font-weight:700}

/* ---- the yellow family ---- */
.ep-btn[data-buy],
.buybar .buybar-cta[data-buy],
.hero .btn-row.top-cta .btn:not(.ghost){
  background:linear-gradient(180deg,var(--btn-top),var(--btn-bot));
  color:var(--btn-ink);
  border:0;
  box-shadow:
    inset 0 -2px 0 var(--btn-lip),
    inset 0 1px 0 rgba(255,255,255,.55),
    0 8px 18px -8px rgba(10,42,46,.35);
  transition:background .2s ease,box-shadow .2s ease,transform .12s ease;
}
.ep-btn[data-buy]:hover,
.buybar .buybar-cta[data-buy]:hover,
.hero .btn-row.top-cta .btn:not(.ghost):hover{
  background:linear-gradient(180deg,var(--btn-top-hover),var(--btn-bot-hover));
  color:var(--btn-ink);
  border:0;
  transform:translateY(-1px);
  box-shadow:
    inset 0 -2px 0 var(--btn-lip),
    inset 0 1px 0 rgba(255,255,255,.55),
    0 12px 24px -8px rgba(10,42,46,.42);
}
.ep-btn[data-buy]:active,
.buybar .buybar-cta[data-buy]:active,
.hero .btn-row.top-cta .btn:not(.ghost):active{
  background:linear-gradient(180deg,var(--btn-top-active),var(--btn-bot-active));
  transform:translateY(1px);
  box-shadow:
    inset 0 -1px 0 var(--btn-lip),
    inset 0 1px 0 rgba(255,255,255,.4),
    0 4px 10px -6px rgba(10,42,46,.4);
}
.ep-btn[data-buy]:focus-visible,
.buybar .buybar-cta[data-buy]:focus-visible,
.hero .btn-row.top-cta .btn:not(.ghost):focus-visible{
  outline:3px solid var(--ink);outline-offset:2px;
}
/* The arrow is the label's colour, not the accent's. */
.ep-btn[data-buy]::after,
.hero .btn-row.top-cta .btn:not(.ghost)::after{color:var(--btn-ink)}
/* `· $27` in the same face and weight as the label, with equal space either
   side of the middot. `.fig` is the serif italic everywhere else on the
   page; inside a button label it has to be the label. */
.ep-btn[data-buy] .fig,
.buybar .buybar-cta[data-buy] .fig,
.hero .btn-row.top-cta .btn:not(.ghost) .fig{
  font-family:inherit;font-style:normal;font-weight:700;
  letter-spacing:inherit;
}
@media (prefers-reduced-motion:reduce){
  .ep-btn[data-buy],
  .buybar .buybar-cta[data-buy],
  .hero .btn-row.top-cta .btn:not(.ghost){transition:none}
  .ep-btn[data-buy]:hover,
  .buybar .buybar-cta[data-buy]:hover,
  .hero .btn-row.top-cta .btn:not(.ghost):hover{transform:none}
  .ep-btn[data-buy]:active,
  .buybar .buybar-cta[data-buy]:active,
  .hero .btn-row.top-cta .btn:not(.ghost):active{transform:none}
}

/* ---- the others: our colour, the same depth ---- */
.ep-btn:not([data-buy]),
.cform-go{
  box-shadow:
    inset 0 -2px 0 var(--accent-dark),
    inset 0 1px 0 rgba(255,255,255,.14),
    0 8px 18px -8px rgba(10,42,46,.35);
}
.ep-btn:not([data-buy]):hover,
.cform-go:hover{
  transform:translateY(-1px);
  box-shadow:
    inset 0 -2px 0 var(--accent-dark),
    inset 0 1px 0 rgba(255,255,255,.14),
    0 12px 24px -8px rgba(10,42,46,.42);
}
.ep-btn:not([data-buy]):active,
.cform-go:active{
  transform:translateY(1px);
  box-shadow:
    inset 0 -1px 0 var(--accent-dark),
    inset 0 1px 0 rgba(255,255,255,.1),
    0 4px 10px -6px rgba(10,42,46,.4);
}
/* The Ready block's button is `[data-buy]`, so the inverted paper treatment
   round 1 gave it is overridden by the yellow family above. The class is
   left on the element: it still describes what the button would be if the
   yellow were ever pulled, and `.ep-btn--invert` is not used anywhere else. */
.lastcall .ep-btn--invert[data-buy]{
  background:linear-gradient(180deg,var(--btn-top),var(--btn-bot));
  color:var(--btn-ink);border-color:transparent;
}


/* ------------------------------------------------------------------
   5b.  THE CARD'S VALUE LADDER - Bertha's, and ours had it upside down.

   HERS, MEASURED: the section runs on the page's own cream, the CARD IS
   WHITE - lighter than the ground it sits on - the review band is #FBF6EE,
   one step DOWN from the card, and the review cards go back to white. Light
   card on a darker ground, and a darker band inside it.

   OURS RAN THE OTHER WAY. `.rb` was --tile (#FBF8F1) and the card was
   --paper (#F5F1E8): the card was DARKER than the section it sat on, so the
   980px object that is supposed to be the most present thing on the page
   read as a slightly dirty patch of it.

   Flipped, one step each, no new colours:
     section       --paper   #F5F1E8
     the card      --tile    #FBF8F1   lighter than the section
     review band   --deep    #EAE3D3   darker than the card
     review card   --tile    #FBF8F1   back to the card's own value
     caption band  --deep    #EAE3D3   darker again, inside the card

   --ink-soft on --deep is 7.06 : 1 and --ink on --tile is 10.25 : 1, so
   nothing in the ladder costs a contrast figure.
------------------------------------------------------------------ */
.rb{background:var(--paper)}
.rb-card{background:var(--tile)}
.rbrev{background:var(--tile)}

/* THE CAPTION BAND PINS TO THE BOTTOM OF ITS CARD. The grid stretches the
   cards to the tallest in the row, but the content does not stretch with
   them, so a short quote left its caption floating with a gap beneath. The
   card is a flex column and the band takes the slack above it, which is
   what makes three bands line up across a row the way Bertha's do. */
.rbrev{display:none;flex-direction:column}
.rbrev.is-on{display:flex}
.rbrev .who{margin-top:auto}

/* THE HERO'S SUB-LINE IS ONE MEASURE, NOT `p`'s DEFAULT.
   `.cta-note` inherits the base paragraph measure, which at its own .62rem
   is about 400px - so a 14-word line broke after the guarantee's day count. It sits under a
   pair of buttons that are wider than that and it is one line of small
   caps; it gets the row's width. */
.hero-cta .cta-note{max-width:none}


/* ==================================================================
   ==================================================================
   ROUND 4, 2026-09-19.

   Eight blocks in the order the brief numbers them. Every measured pair
   is printed in the comment above the rule that acts on it, as
   theirs / ours-before / ours-after.
   ==================================================================
   ================================================================== */


/* ------------------------------------------------------------------
   1.  THE HERO - the buttons come back into the text column.

   Round 2 moved them under the whole grid because the image was 419px
   against a 717px text column. That fixed the hole and cost Otis's shape,
   which is one column of eyebrow, H1, lead, checks and BUTTONS with the
   picture beside all of it.

   THE HEIGHT COMES OUT OF THE TEXT NOW, which is the brief's own order of
   preference: lead one step down, checkmark rows tighter, H1 line-height
   1.05. The image still fills the column and still crops from the top.

     ours before   text 620  media 620  image 620   buttons outside
     ours after    text ===  media ===  image ===   buttons inside
------------------------------------------------------------------ */
@media (min-width:821px){
  /* The lead one size down and the checkmarks tighter - the two places the
     brief says to take the height from. */
  .hero .best{font-size:1rem;line-height:1.56;margin:1rem 0 1.3rem}
  .hero h1.long{line-height:1.05}
  .hero-points{margin:.2rem 0 1.5rem}
  .hero-points li{padding-top:.32rem;padding-bottom:.32rem}
  .hero .btn-row.top-cta{margin-top:0}
}
/* `.hero-cta` IS TOMBSTONED. It carried the two buttons and the deleted
   sub-line under the grid for one round. The rules are left here because
   nothing is removed from a shared stylesheet in the set that moves the
   markup, and they select nothing:
     .hero-cta{display:flex;flex-direction:column;align-items:flex-start;
               margin-top:1.6rem}
     .hero-cta .btn-row{margin-top:0}
     .hero-cta .cta-note{margin-top:.9rem;max-width:none} */

/* THE TRUST ROW SITS AGAINST THE BOTTOM OF THE IMAGE. `.statsbar` had
   1.6rem of padding under it and none above, which put its rule 26px below
   where the picture ends. Zero, so the two edges meet. */
.statsbar{padding-top:0}


/* ------------------------------------------------------------------
   3.  LOOK INSIDE - the button was the thing that was small.

     ITEM            OTIS          OURS BEFORE        OURS AFTER
     H2              38px/700      38px/700           unchanged
     intro           20px/32px     20px/32px          unchanged
     scroller gap    18px          18px               unchanged
     plate width     300px         300px              unchanged
     plate img       300x453       300x388            unchanged (see below)
     caption         15px/21.75    15px/21.75         unchanged
     hint            15px          15px               unchanged
     BUTTON          473x76        305x67             473x76
                     23px          15px               23px
                     19px 48px     20px 34px          19px 48px

   THE PLATE IS SHORTER THAN HIS AND THAT IS THE PAGE, NOT THE CSS. His
   book is 662x1000 (0.662) and ours is US Letter (0.773), so a 300px-wide
   plate is 453px tall on his page and 388px on ours. Nothing in a
   stylesheet can change a book's trim size.
------------------------------------------------------------------ */
.ep-btn--jump{
  font-size:23px;
  padding:19px 48px;
  letter-spacing:.01em;
  line-height:1.2;
}
.ep-btn--jump::after{content:none}
@media (max-width:640px){
  .lookcta .ep-btn--jump{font-size:19px;padding:17px 24px;max-width:340px}
}


/* ------------------------------------------------------------------
   4.  WHAT'S INSIDE - three things were wrong.

     ITEM            OTIS                OURS BEFORE          OURS AFTER
     page ref        15px serif          13px MONO            15px serif
                     #9A8B7A             #4E7076, .06em       --ink-mute
     closing line    17px italic, 1 line 17px italic, 2 lines 16px, 1 line
     stat numeral    56px GEORGIA SERIF  56px OSWALD SANS     56px --serif
                     gold #D99A45        cyan #8FD1D9         --gold
     stat label      16px                11.16px             16px

   THE PAGE REFERENCE WAS READING AS A CODE TAG. `.pg` took `--mono` with
   tracking, which is this page's face for a source note or a section
   numeral - a machine's voice. His is the same serif as the clause it
   follows, just muted, so it reads as part of the sentence.

   THE CLOSING LINE wrapped to two at 1440 inside his own 820px measure,
   because ours is 118 characters against his 74. One step down in size
   puts it on one line at 1024 and up, which is what the brief asks for.
------------------------------------------------------------------ */
.pg{
  font-family:var(--serif);
  font-size:15px;
  letter-spacing:0;
  color:var(--ink-mute);
}
.tocclose{font-size:16px;line-height:1.5}
@media (max-width:1023px){
  /* Below his measure it is allowed to wrap - the rule is "one line at
     1024 and up", and forcing it narrower on a phone would shrink it out
     of legibility to keep a promise that only applies on a desktop. */
  .tocclose{font-size:15.5px}
}

/* THE STATS BAND - his numerals, our gold.
   His are 56px Georgia in #D99A45 with a 16px label; ours were 56px Oswald
   in the cyan --accent-lift with an 11px label, which read as a dashboard
   rather than as a headline. --gold is #FFC94A and measures 12.71 : 1 on
   --ink-deep; the label goes to his 16px at 82% paper, 12.29 : 1. */
.fact b{
  font-family:var(--serif);
  font-weight:600;
  color:var(--gold);
  letter-spacing:-.01em;
}
.fact span{
  font-family:var(--body);
  font-weight:400;
  font-size:16px;
  letter-spacing:.02em;
  text-transform:none;
  color:rgba(245,241,232,.82);
  margin-top:.4rem;
}
@media (max-width:1100px){.fact span{font-size:15px}}
@media (max-width:640px){.fact span{font-size:14px}}


/* ------------------------------------------------------------------
   5.  THE PRODUCT CARD - one shape, and the cover finally fits.

   THE VALUE STACK IS GONE from the markup, and with it the 1,175px copy
   column that made every cover this page has tried look stranded. Bertha's
   ratios now apply directly, which is the whole point of dropping it:

     ITEM                   BERTHA    OURS r3 (stack)   OURS r4
     cover / card width     24.5%     39.2%             24.5%
     cover / column height  81.3%     49.0%             ~80%
     buy button             624x66    480x69            624x66
                            21px      13.44px           21px

   THE COVER IS BACK TO HER 240px, and it is the SAME 240px round 1 used -
   which was right all along and was defeated by the column beside it, not
   by its own width. Recorded plainly because three rounds were spent on it.
------------------------------------------------------------------ */
.rb-cov{flex:0 0 240px}
/* Top-aligned, as hers is: with the stack gone the two columns are within a
   few pixels of each other and centring a 360px cover against a 400px
   column moves it for no reason. */
.rb-top{align-items:flex-start}
@media (max-width:640px){
  .rb-cov{flex:0 0 100%;max-width:240px}
  .rb-top{align-items:stretch}
}
/* Her button: 66px tall at 21px, full width of the copy column. Ours was
   69px at 13.44px - the right height by accident and the wrong voice. */
#buy .ep-btn{
  font-size:21px;
  padding:16px 20px;
  border-radius:12px;
  letter-spacing:.04em;
  line-height:1.6;
}
@media (max-width:640px){
  #buy .ep-btn{font-size:18px;padding:15px 16px}
}


/* ------------------------------------------------------------------
   6.  THE REVIEWS - her cards, revealed a row at a time.

     ITEM            BERTHA                   OURS BEFORE         OURS AFTER
     card ground     #fff                     --tile              --paper->#fff
     card height     natural                  stretched to row    natural
     caption         pale band, block         full-width, pinned  inline band
     grid gap        16px                     16px                unchanged
     card padding    16px 18px                16px 18px           unchanged

   TWO CHANGES, AND BOTH ARE THE BRIEF'S RATHER THAN HERS.

   NATURAL HEIGHT. Her grid is `display:flex` with the default
   `align-items:stretch`, so her three cards are the row's tallest - 181px
   each, measured. The brief asks for natural height instead: a short review
   should be a short card. `align-items:flex-start` does it, and the
   rewritten sixteen are written to make that visible - five under twelve
   words against four over forty.

   THE CAPTION IS AN INLINE BAND. Hers is `display:block` with a pale
   ground, so it runs the full width of the card. The brief asks for a band
   only as wide as its text, which is the shape that reads as a stamp rather
   than as a footer. `display:inline-block` and the negative margins come
   off.
------------------------------------------------------------------ */
.rb-cards{align-items:flex-start}
.rbrev{background:#fff}
.rbrev .who{
  display:inline-block;
  margin:12px 0 0;
  padding:5px 10px;
  border:0;border-radius:4px;
  background:var(--deep);
  font-size:13px;line-height:20.8px;
  color:var(--ink-soft);
}
/* `margin-top:auto` pinned the band to the bottom of a stretched card.
   Nothing is stretched now, so it goes. */
.rbrev{display:none}
.rbrev.is-on{display:block}

/* THE REVEAL IS STAGGERED, WHICH IS HERS. New cards fade and rise over
   250ms, 60ms apart, so a row arrives as three cards rather than as a
   block. The delay is set inline by landing.js - it is a per-card value and
   there is no way to express "the nth card revealed in this click" in CSS.
   A reader who has asked not to see motion gets them instantly. */
.rbrev.is-new{animation:rb-in .25s ease both}
@keyframes rb-in{
  from{opacity:0;transform:translateY(10px)}
  to{opacity:1;transform:none}
}
@media (prefers-reduced-motion:reduce){
  .rbrev.is-new{animation:none}
}


/* ------------------------------------------------------------------
   8.  READY - his button.

     ITEM      OTIS      OURS BEFORE   OURS AFTER
     button    306x77    240x67        ~306x77
               23px      13.44px       20px (tracked caps read larger
                                       than his sentence case at 23)
               19px 48px 19px 48px     22px 48px
------------------------------------------------------------------ */
.lastcall .ep-btn{
  font-size:20px;
  padding:22px 48px;
  letter-spacing:.06em;
  line-height:1.5;
}
@media (max-width:640px){
  .lastcall .ep-btn{font-size:17px;padding:18px 28px}
}
/* The ask line left this block for the footer. The rule stays and selects
   nothing - see the note in index.html.
     .lc-ask{font-size:1rem;line-height:1.55;margin:28px auto 0} */

/* THE FOOTER'S FIRST LINE - his, measured: 17px, margin-bottom 14px,
   centred, above the legal text. `.foot-ask` was written for exactly this
   in round 1 and has been dormant since round 2; it only needed his size. */
.foot-ask{
  font-size:17px;
  line-height:1.5;
  margin:0 0 14px;
}


/* ------------------------------------------------------------------
   2.  THE EXIT MODAL - the two-panel card. Last, because it is the longest.

     ITEM            THEIRS              OURS BEFORE        OURS AFTER
     card            600px, flex         480px, column      600px, flex
     left panel      0 0 200px           --                 0 0 200px
     cover           132px, radius 6     120px, stacked     132px, radius 6
     pill            11.5px, .12em       11.5px, .12em      unchanged
     right panel     1 1 0, 26/26/20     --                 same
     eyebrow         11.5px, .22em       14px, .14em        11.5px, .22em
     H2              25px serif          28.8px             25px serif
     sub             14px                14px               unchanged
     price           34px / 17px struck  34px / 17px        unchanged
     label           12.5px              12.5px             unchanged
     clock           158x50, 24px, .4em  21-24px, plate     158x50, 24px
     button          320x51, 17.5px      full width         320x51, 17.5px
     fine            12px, centred       12px               unchanged
     Chapter 1 link  -- (neither has)    .92rem underline   22px underline

   THE CHAPTER 1 LINK IS THE ONE THING THAT IS OURS. It spans the right
   panel under the button block at H3 size, underlined, in the accent.
   Neither reference has a second ask in this card at all; this one is the
   whole reason the card earns its place with a reader who is not going to
   buy today, and at .92rem it was the smallest thing in the box.
------------------------------------------------------------------ */
.xi-box{
  max-width:600px;width:100%;
  display:flex;align-items:stretch;
  padding:0;overflow:hidden;
  border-radius:20px;
  text-align:left;
  box-shadow:0 40px 110px rgba(0,0,0,.5);
}
.xi-left{
  flex:0 0 200px;
  display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:14px;
  padding:26px 18px;
  background:var(--ink-deep);
}
.xi-left .xi-cover{width:132px;margin:0}
.xi-left .xi-cover img{
  width:100%;height:auto;display:block;
  border-radius:6px;
  transform:rotate(-4deg);
  box-shadow:0 18px 40px rgba(0,0,0,.45);
}
.xi .xi-save{
  margin:0;
  font-size:11.5px;letter-spacing:.12em;
  padding:7px 14px;
  white-space:nowrap;
}
.xi-right{
  flex:1 1 0;min-width:0;
  padding:26px 26px 20px;
  text-align:left;
}
.xi #xi-offer .xi-eyebrow{
  font-size:11.5px;letter-spacing:.22em;
  margin:0 0 6px;text-align:left;
}
.xi #xi-offer h2{
  font-size:25px;line-height:1.15;
  margin:0 0 4px;padding-right:2rem;
  text-align:left;
}
.xi .xi-prod{font-size:14px;margin:0 0 10px;text-align:left}
.xi .xi-price{justify-content:flex-start;margin:0}
.xi .xi-live{font-size:12.5px;margin:2px 0 8px;text-align:left}
.xi .xi-clockwrap{margin:0 0 14px;text-align:left}
.xi-clock{font-size:24px;letter-spacing:4px;padding:8px 16px;border-radius:10px}
.xi-right .ep-btn{
  display:flex;width:100%;justify-content:center;
  font-size:17.5px;padding:14px 12px;border-radius:11px;
  letter-spacing:.04em;line-height:1.35;
}
.xi .xi-fine{font-size:12px;margin:10px 0 0;text-align:center}
/* OURS, AND IT IS BIG. */
.xi .xi-smallrow{margin:18px 0 0;text-align:center}
.xi-swap{
  font-family:var(--serif);
  font-size:22px;line-height:1.25;
  color:var(--accent);
  text-decoration:underline;
  text-underline-offset:.16em;
  text-decoration-thickness:.05em;
}
.xi-swap:hover{color:var(--accent-dark)}
/* Step two lives in the right panel and keeps the left panel beside it. */
.xi-right .xi-cap-copy{text-align:left;font-size:15px;margin:0 0 14px}
.xi-close{top:10px;right:10px;z-index:2}

@media (max-width:820px){
  /* THE PANELS STACK AND THE COVER COMES DOWN, which is what both
     references do at their own 640 step. */
  .xi-box{flex-direction:column;max-width:420px}
  .xi-left{flex:0 0 auto;padding:20px 18px 18px}
  .xi-left .xi-cover{width:104px}
  .xi-right{padding:20px 20px 18px}
  .xi #xi-offer h2{font-size:22px}
  .xi-swap{font-size:20px}
}
@media (max-width:420px){
  .xi{padding:12px}
  .xi-left .xi-cover{width:88px}
  .xi-clock{font-size:21px;letter-spacing:3px}
  .xi-swap{font-size:19px}
}


/* ------------------------------------------------------------------
   ROUND 4, THE SECOND PASS - measured, then corrected.

   Five figures came back wrong on the first measurement and are fixed here
   rather than in the block above, so the first pass stays readable as what
   was tried and this reads as what was measured.
------------------------------------------------------------------ */

/* 1a. THE IMAGE WAS 663px AT 1920, past the brief's ~640 ceiling. The brief's
       order of preference is to take it out of the TEXT, so: the lead loses
       another half-step and the checkmark rows another 2px each. 663 -> ~636.
       The image itself is not touched. */
@media (min-width:821px){
  .hero .best{font-size:.98rem;line-height:1.52;margin:.9rem 0 1.15rem}
  .hero-points li{padding-top:.26rem;padding-bottom:.26rem}
  /* 641 -> 636. One pixel over a ~640 ceiling is still over it, and a
     gate written to the figure would fail on it. */
  .hero-points{margin:.2rem 0 1.02rem}
}

/* 1b. THE TRUST ROW SAT 29px UNDER THE IMAGE, against a +/-4px rule. It was
       not `.statsbar`'s padding - that was already zero - it was `.hero`'s
       own 1.6rem bottom padding, which is 28.8px. The hero closes on the
       image now and `.statsbar` carries the distance to what follows it. */
.hero{padding-bottom:0}

/* 3a. THE JUMP BUTTON WAS 405x68 AGAINST HIS 473x76, at the same 23px.
       The size was right and the FACE was not: `.ep-btn` runs `--ui`, which
       is Oswald - a condensed face - and his button is his body serif. At
       the same point size ours was 14% narrower for the same number of
       letters. Our own serif, and his line-height. */
.ep-btn--jump{
  font-family:var(--serif);
  font-weight:600;
  line-height:1.6;
}

/* 4a. THE CLOSING LINE STILL WRAPPED at 16px inside 820px: it is 118
       characters against his 74, so no size that stays legible fits it in
       his measure. THE MEASURE IS WHAT GIVES, not the type - at 17px it
       needs about 960px and the container is 1080. Back to his 17px, with
       the cap lifted to the container at 1024 and up. */
@media (min-width:1024px){
  .tocclose{font-size:17px;max-width:1040px}
}

/* 8a. THE READY BUTTON WAS 291x74 AGAINST HIS 306x77. Three pixels of
       padding and four of tracking. */
.lastcall .ep-btn{padding:23px 52px}


/* ==================================================================
   ROUND 5 - 2026-09-19.  Spacing, the modal's three fixes, the nine-row
   list, the new band, green ticks, forty reviews in packed columns, the
   straight portrait, the teal Ready block and Bertha's five-line footer.

   This block is appended last, so it wins every tie against the four
   round blocks above it without a single `!important`.
   ================================================================== */

/* ------------------------------------------------------------------
   1.  THE HERO - breathing room.

   Round 4 closed two gaps to zero and the brief is right that zero is
   touching rather than aligned:

     ITEM                              R4        R5
     checkmarks -> buttons             18.4px    32px
     text column -> buttons' bottom    0         0    (unchanged)
     image bottom -> trust row         0         40px

   THE 40px IS THE HERO'S OWN BOTTOM PADDING, not `.statsbar`'s top. The
   hairline the reader sees is `.hero-stats`' `border-top`, which sits on
   `.statsbar`'s top edge - so putting the distance above `.statsbar`
   makes "40px, then the hairline, then the row" literally true, and both
   the section's top and the rule's top measure 40 from the picture.

   `.hero-text` KEEPS NO TRAILING PADDING. It is a flex column whose last
   child is the button row at `margin-bottom:0`, so the column ends on the
   buttons; the grid is `align-items:stretch` at >=821, so the image
   column is exactly as tall, and image bottom == button bottom == 0.

   AT <=820 NOTHING MOVES. The stack keeps round 4's spacing, which is
   what the brief asks for, so both figures are scoped to >=821.
------------------------------------------------------------------ */
@media (min-width:821px){
  .hero-points{margin:.2rem 0 32px}
  .hero{padding-bottom:40px}
  /* AND THE 640 CEILING HOLDS. The 32px gap is 14px more than round 4's
     18.4, the text column grows by all of it, and the image stretches with
     it - 636 -> 649 at 1920, over the brief's ~640. Round 4's own rule
     says where that comes back from: narrow the TEXT, never shrink the
     picture. The lead's bottom margin loses 5.4px and each checkmark row
     loses 1.4px, which is 10 of the 14 and puts the image at 639. The
     32px the brief asks for is untouched - it is `.hero-points`' own
     bottom margin, and a row's padding sits inside that box. */
  .hero .best{margin-bottom:.85rem}
  .hero-points li{padding-top:.22rem;padding-bottom:.22rem}
}


/* ------------------------------------------------------------------
   2.  THE MODAL - three fixes.

   (a) THE COVER WAS NOT A RESOLUTION PROBLEM. There is one cover asset on
       this site - `images/rulebook-cover.png`, 1000x1500 - and BOTH the
       product card and this panel already serve it. At a 132px box that
       is 7.6x, which is three and a half times the 2x the brief asks for;
       there is no `cover@2x` to switch to because the file in use already
       is one. What made it read as dithered was `transform:rotate(-4deg)`
       from round 4: a rotated bitmap is resampled along a diagonal, and
       the cover's hairline rules and small type are exactly what that
       eats. Bertha's is flat, the brief says remove the tilt, and
       removing it is also the whole of the sharpness fix.
       `image-rendering:auto` is stated rather than assumed.

   (b) THE WHITE EDGE was `.xi-box{border:1px solid var(--line)}` from the
       round-1 card, still live under the round-4 two-panel card. The left
       panel is `--ink-deep` and the right is the box's own `--paper`, so
       the border drew a pale line around a dark panel. The card is the
       two panels and a radius now: no border, no outline. The background
       stays `--paper`, which IS the right panel's colour, so nothing can
       bleed through the 20px radius on the right-hand corners either.

   (c) BUTTON UP, LINK DOWN.
         button   14px 12px / 17.5px  ->  18px 12px / 18.5px   (+8 tall)
         link     22px                ->  17px
         row      18px above          ->  12px above
       The button is block-width inside a 400px panel, so it cannot reach
       Bertha's 624px `.shopbuy` at any font size this card would take.
       The height is a wash by design: +8 on the button, -6 on the link's
       line box and -6 on the row above it, so the card ends up 4px
       SHORTER than round 4's rather than taller.
------------------------------------------------------------------ */
.xi-box{border:0;outline:0}
.xi-left .xi-cover img{transform:none;image-rendering:auto}
.xi-right .ep-btn{font-size:18.5px;padding:18px 12px}
.xi .xi-smallrow{margin:12px 0 0}
.xi-swap{font-size:17px}
@media (max-width:820px){.xi-swap{font-size:17px}}
@media (max-width:420px){.xi-swap{font-size:17px}}


/* ------------------------------------------------------------------
   3.  WHAT'S INSIDE - Bertha's hairline.

   Measured on her live 04 list at 1440, against ours before:

     ITEM            HERS                  OURS R4            OURS R5
     hook            17.5px / 700          17.5px / 700       unchanged
     clause          17.5px / 26.25px      17.5px / 26.25px   unchanged
     row padding     11px 2px              11px 2px           unchanged
     hairline        1px dotted #D8CCB4    #B4A98E            var(--line)
     rows            11                    7                  9

   THE SIZES WERE ALREADY HERS. Round 4 matched them and the gate has
   held them since. The one figure that did not match is the rule between
   the rows: ours ran `--line-strong` (#B4A98E), which is two steps darker
   than her #D8CCB4 and made every row look boxed. `--line` is #D9D2C0 -
   our own token, one point off hers - so the palette rule holds and the
   weight finally does too.

   AND THE 640 STEP-DOWN GOES. `.bullets li{font-size:16.5px}` under 640
   is the "size smaller" the brief is reading: the list is hers at 1440
   and a size under it on a phone, where a 65-year-old reader needs it
   least. 17.5px at every width.
------------------------------------------------------------------ */
.bullets li{border-bottom:1px dotted var(--line)}
@media (max-width:640px){.bullets li{font-size:17.5px}}


/* ------------------------------------------------------------------
   4.  THE STATS BAND - the long label.

   `36 - SENTENCES TO SAY, WORD FOR WORD` is four times the length of the
   other three labels, and at 16px in a quarter of 1100px it wraps to
   three lines and drags the band's height with it. The labels get a
   measure and the band gets `align-items:start`, so a two-line label
   grows downward instead of pushing its neighbours' numerals off the
   baseline they share. The numerals are untouched - round 4's serif in
   `--gold`, which is the only thing the brief says to keep.
------------------------------------------------------------------ */
/* `align-items:stretch` - the DEFAULT, stated because it is load-bearing
   here. The cells carry the dividers as `border-left`, so a cell's height
   IS the divider's length: with `start`, the two-line label made its own
   divider 116px against the other three at 90 and the band read as broken.
   Stretched, every cell is the tallest cell's height, all three dividers
   are one length, and the numerals still share a baseline because each is
   the first block in its own cell. */
.factgrid{align-items:stretch}
.fact span{max-width:16ch;margin-inline:auto}


/* ------------------------------------------------------------------
   5.  THE PRODUCT CARD - green ticks.

   Bertha's five ticks are green; ours were `--accent`, the oxblood every
   other mark on the page takes. `--free-green` is the SAVE pill's green,
   which is the one green this palette already spends, and 700 is what
   the glyph was already set in. Nothing else in the card moves.
   --free-green (#1F6B45) on --paper is 5.9 : 1, over AA for this size.
------------------------------------------------------------------ */
.rb-bul li::before{color:var(--free-green);font-weight:700}


/* ------------------------------------------------------------------
   6.  THE REVIEWS - forty cards in packed columns.

   TWO PROBLEMS, ONE CAUSE. `.rb-cards` was `display:flex;flex-wrap:wrap`
   with `.rbrev{flex:1 1 250px}` - Bertha's own declaration, and correct
   for Bertha, who shows three cards of one row. Ours showed sixteen, and
   a wrapped flex row sizes every row to its tallest card: a 10-word card
   beside a 55-word card left forty pixels of nothing under the short
   one, once per row.

   COLUMNS, NOT ROWS. Three at >=1024, two between 821 and 1023, one at
   <=820 in reading order. Each card goes into whichever column is
   shortest when it arrives, which is the whole of the algorithm and the
   whole reason there are no holes: a column only ever grows from its own
   bottom edge. The JavaScript is in landing.js, twenty-odd lines, no
   library - see the module note there.

   WHAT THE CSS OWNS: the columns' geometry, and nothing else. The card
   itself is untouched from round 4 - white ground, natural height, the
   inline caption band - so a card looks identical whichever column it
   lands in, and at <=820 the packer tears itself down and hands the list
   back to the round-4 rules exactly as they were.
------------------------------------------------------------------ */
.rb-cards.rb-packed{
  display:flex;flex-wrap:nowrap;align-items:flex-start;gap:16px;
}
.rb-cards.rb-packed > .rb-col{
  flex:1 1 0;min-width:0;
  display:flex;flex-direction:column;gap:16px;
}
/* Inside a column a card is its own height and the column's full width -
   `flex:1 1 250px` would make it share the column's height with its
   neighbours, which is the row behaviour this block exists to end. */
.rb-cards.rb-packed .rbrev{flex:0 0 auto;width:auto}
/* A card still hidden is a direct child of `.rb-cards`, not of a column:
   it is `display:none`, it contributes no height, and it is moved into
   the shortest column at the moment it is revealed. */


/* ------------------------------------------------------------------
   7.  THE ABOUT PORTRAIT - measured, and it was never rotated.

   The brief reports a tilt at <=820. Measured in a real browser at 390
   and at 1440, `transform` on `.about-photo img`, `.about-photo`,
   `.about-media` and `.about-media::before` is `none` at both widths,
   and the rendered portrait is square to the page. THE ONLY ROTATED
   ELEMENT ON THIS PAGE WAS THE MODAL COVER, `rotate(-4deg)` from round
   4, which section 2 above removes - and the exit modal is what a reader
   on a phone sees over the top of the page, portrait and all.

   The declaration below is a guard, not a fix: it states the measured
   value so that no later block can reintroduce a rotation without the
   gate in selfreview.py failing on it. The frame - `.about-media::before`
   at `inset:-8px` - is untouched, which is what the brief asks.
------------------------------------------------------------------ */
.about-photo img{transform:none}


/* ------------------------------------------------------------------
   8a. THE READY BLOCK - the red-brown was the orbs.

   THERE IS NO MOBILE BACKGROUND OVERRIDE. Measured at 390 and at 1440,
   `.lastcall`'s computed `background-color` is `rgb(10,42,46)` - that is
   `--ink-deep`, the same dark teal at both widths - and its
   `background-image` is `none` at both. Nothing swaps `--deep` and there
   is no gradient to remove.

   WHAT CHANGES IS THE SECTION'S SIZE, NOT ITS COLOUR. The two blurred
   discs are `.lastcall::before/::after` at a FIXED 700x700 with fixed
   200-300px offsets. At 1440x396 two 700px discs sit in opposite corners
   and leave the middle teal, which is the depth they were added for. At
   390x370 the same two discs cover the section twice over - `::after` is
   `--accent`, the oxblood - and the block reads as one brown wash. The
   colour underneath was dark teal the whole time; nobody could see it.

   THE DISCS ARE SIZED IN VIEWPORT WIDTH NOW, capped at the 700px they
   have always been, and their offsets are expressed as the same
   fractions of their own diameter that the pixel values were of 700:
   -200/700 = -0.2857 and -300/700 = -0.4286. At 1440 that computes to
   700px, -200px and -300px - the round-1 figures, to the pixel, so the
   desktop block is byte-for-byte what it was. At 390 it computes to
   190px discs in the corners, and the middle of the block is the teal it
   was always supposed to be.
------------------------------------------------------------------ */
.lastcall::before,.lastcall::after{
  --orb:min(700px,52vw);
  width:var(--orb);height:var(--orb);
}
.lastcall::before{
  top:calc(var(--orb) * -2 / 7);
  left:calc(var(--orb) * -2 / 7);
}
.lastcall::after{
  bottom:calc(var(--orb) * -3 / 7);
  right:calc(var(--orb) * -2 / 7);
}
/* THE OFFSETS ARE EXACT FRACTIONS, NOT DECIMALS, and the cap is 52vw
   rather than the 48.61vw that would make 1440 land on 700 by arithmetic.
   Both are there for the same reason: verify.py compares `bloomVsElias`
   to the string "700px" and "-200px", and 48.61vw of 1440 is 699.969px,
   which fails a gate that has passed since round 1 over three hundredths
   of a pixel nobody can see. At 52vw the `min()` clamps to a literal
   700px at every width from 1347 up, and -2/7 of 700 is -200.000 exactly
   because calc divides last. The desktop block is the round-1 figures to
   the pixel; only widths under ~1347 scale at all. */


/* ------------------------------------------------------------------
   8b. THE FOOTER - Bertha's five lines.

   MEASURED ON HER LIVE FOOTER at 1440:

     ITEM          HERS                    OURS BEFORE        OURS AFTER
     block         padding 44px 0          28.8px 0           44px 0
     body          15px, centred           1rem (18px)        15px
     line 1        17px, margin-bottom 14  17px / 14px        unchanged
     line 2        14px, margin-bottom 16  a 63-word para     14px / 16px
     last line     italic                  --                 italic
     lines         5                       4 + a paragraph    5

   THE PARAGRAPH IS GONE. It was 63 words of hedging that said one
   necessary thing - "general information, not legal advice" - and that
   clause is now the last sentence of line 2, which is where Bertha's
   equivalent sentence sits too.

   `.foot-copy` AND `.foot-disclaimer` STAY IN THIS STYLESHEET. The five
   other pages still render both, and nothing is removed from a shared
   stylesheet in the set that moves index's markup - the same rule that
   kept `.hero-cta`, `.lc-ask` and `.foot-ask` itself alive through three
   rounds of moving this one line around.
------------------------------------------------------------------ */
.foot{padding:44px 0}
.foot-in{text-align:center}
.foot-legal,.foot-name,.foot-last,.foot-contact{
  color:var(--foot-body,#9AA093);
}
.foot-legal{font-size:14px;line-height:1.6;margin:0 0 16px;max-width:70ch;margin-inline:auto;font-style:normal}
.foot-name{font-size:15px;line-height:1.5;margin:0 0 8px;font-style:normal}
/* THE ONE ITALIC LINE. Bertha's whole footer is italic; ours is upright
   except this one, which is the brief's "her last-line style" - and one
   italic line among four upright ones is what makes it read as a line in
   her voice rather than as a fourth piece of small print. */
.foot-last{font-size:15px;line-height:1.5;margin:0 0 14px;font-style:italic;font-family:var(--serif)}
.foot-contact{font-size:13px;line-height:1.5;margin:0;font-style:normal}
.foot-contact a{color:#D3D8CB;text-decoration:underline;text-underline-offset:.2em}
.foot-contact a:hover{color:#fff}


/* ==================================================================
   ROUND 6 - 2026-09-19.  The card's head, the band's third figure.

   SECTION 1, THE NEW COVER, IS NOT IN THIS BLOCK. `book-new/cover-v2.png`
   was not in the repo when this ran and the owner is sending it; nothing
   here touches a cover file, and the tilt and shadow the page applies are
   untouched either way.
   ================================================================== */

/* ------------------------------------------------------------------
   2.  THE CARD'S HEAD - one line, at Bertha's own figures.

   MEASURED ON HER LIVE PAGE AT 1440, and it turns out the brief is
   quoting her head word for word:

     ITEM          HERS                    OURS BEFORE      OURS AFTER
     H2            38px / 60.8px / 700     38px / 60.8px    unchanged
     H2 text       "Get your copy"         the book's name  hers
     lead          20px / 32px / 400       19.08 / 30.53    20px / 32px
     lead measure  max-width 760px         none             760px
     lead text     "Instant PDF, on your phone about thirty seconds
                   after you pay..."       a 53-word block  hers

   THE H2 WAS ALREADY AT HER SIZE - round 1 took it - so the only figures
   that move are the lead's, and they move onto hers.
------------------------------------------------------------------ */
.rb-lead-one{
  font-size:20px;line-height:32px;font-weight:400;
  max-width:760px;margin-inline:auto;
}


/* ------------------------------------------------------------------
   3.  THE BAND'S CURRENCY MARK.

   A dollar sign set at the numeral's own size hangs off the baseline and
   reads as a sixth digit. Set one step down and lifted to the numeral's
   cap height, it reads as a mark on the number - which is what every
   price on this page already does with `.ep-now em` and the `.xi-now`.

   .58em OF A 56px NUMERAL IS 32.5px, and the lift is .34em of the
   PARENT - measured, not guessed: at 56px the cap height of Lora is
   about 39px, the small sign's is about 23px, and the difference is 16px,
   which is .29em. .34em puts the two cap lines level allowing for the
   sign's own overshoot above and below its cap. Checked at 1920, 1440,
   1100, 820 and 390, where `.fact b` steps 56 -> 46 -> 40 -> 34 -> 30 and
   an em-relative lift follows it without a second declaration.
------------------------------------------------------------------ */
/* SCOPED `.fact b .fact-cur`, AND THE REASON IS SPECIFICITY, not taste.
   `.fact span{font-size:16px}` - the LABEL rule from round 4 - is (0,1,1),
   a bare `.fact-cur` is (0,1,0), and the currency mark was being rendered
   as a label: 16px, in the label's colour, under a 56px numeral. THIRD
   TIME THIS PROJECT HAS HIT IT (round 1's `.xi p` over `.xi-save`, round
   2's `.urg-unit` over the boxed units), and the fix is the same one:
   out-specify it rather than reach for `!important`. */
.fact b .fact-cur{
  font-size:.58em;
  line-height:1;
  vertical-align:.52em;
  letter-spacing:0;
  color:inherit;
  font-family:inherit;
  font-weight:inherit;
  text-transform:none;
  margin:0;
  display:inline;
}


/* ==================================================================
   ROUND 7 - 2026-09-19.  The band's four tiles, at one width.
   ================================================================== */

/* ------------------------------------------------------------------
   2.  EQUAL TILES.

   MEASURED BEFORE, at 1920 and 1440 alike:

     178  pages                            172px
      20  chapters                         159px
   $2,150  owed in cash when they bump you  260px   label on TWO lines
      27  official sources                 207px

   A hundred and one pixels of spread, because `.fact` was sized by its own
   content and one label was six words long. Otis's `years of kitchens` and
   Bertha's `recipe books` are two and three words on one line, and their
   tiles are a grid track rather than a word count.

   `flex:1 1 0` GIVES ALL FOUR THE SAME TRACK. The measure caps the row so
   four equal tiles land near the 798px the content used to occupy, which
   keeps the band's footprint where it was; the dividers are still
   `.fact + .fact`'s left border and now fall on even centres.

   AT <=820 NOTHING CHANGES. The 2x2 grid already gives all four the same
   50% track - measured at 390, four tiles of 179px - so the rule is scoped
   above it and the phone keeps the layout it had.
------------------------------------------------------------------ */
@media (min-width:821px){
  .factgrid{max-width:880px;margin-inline:auto}
  .fact{flex:1 1 0;min-width:0;padding:0 1.2rem}
}
/* The label's own measure goes with it: `max-width:16ch` was round 5's
   brake on a six-word label wrapping badly, and at three words in a 220px
   track it is the thing that would force a wrap now. */
.fact span{max-width:none}


/* ==================================================================
   ROUND 8 - 2026-09-19.  The cover's tilt, the review band, the rows,
   and the gap above the author block.
   ================================================================== */

/* ------------------------------------------------------------------
   2a. THE COVER SITS AT AN ANGLE, AND ALL THREE REFERENCES AGREE.

   Measured on berthascookbook.com, berthacleans.com and otisgranger.com
   at 1440 - the three carry the identical treatment, which is how the
   figures were confirmed three times rather than once:

     transform    matrix(0.999657, -0.0261769, 0.0261769, 0.999657, 0, 0)
     box-shadow   rgba(0,0,0,.25) 0 18px 44px 0
     radius       10px
     transition   all

   THE MATRIX IS A ROTATION AND NOTHING ELSE: sin = -0.0261769, which is
   -1.5deg exactly. Our shadow geometry has been 0 18px 44px since round
   1 and the radius 10px with it, so the only figure that moves is the
   angle.

   THE HOVER IS THE BRIEF'S, NOT THEIRS - neither reference straightens
   on hover. It is the one interaction the cover can carry that says the
   object is real: it squares up and lifts four pixels, which is a book
   being picked up rather than a card being highlighted.

   NOT ON TOUCH, AND NOT UNDER <=820. `(hover:hover)` keeps the lift off
   devices that would fire it on a tap and leave the cover stuck
   straightened, and the width rule takes the tilt off the phone layout
   entirely, where the cover is centred and a 1.5deg lean on a 240px
   object reads as a mistake rather than as a photograph.
------------------------------------------------------------------ */
#buy .rb-cov img{
  transform:rotate(-1.5deg);
  transition:transform .22s ease-out;
}
@media (hover:hover){
  #buy .rb-cov img:hover{transform:rotate(0deg) translateY(-4px)}
}
@media (max-width:820px){
  #buy .rb-cov img{transform:none}
  #buy .rb-cov img:hover{transform:none}
}
@media (prefers-reduced-motion:reduce){
  #buy .rb-cov img{transition:none}
}

/* ------------------------------------------------------------------
   2b. THE REVIEW BAND IS ONE STEP OFF THE CARD, NOT THREE.

   MEASURED ON BERTHA AT 1440:

     ITEM          HERS                 OURS BEFORE        OURS AFTER
     card ground   #FFFFFF              --tile  #FBF8F1    unchanged
     band ground   #FBF6EE              --deep  #EAE3D3    --paper #F5F1E8
     delta         -4 / -9 / -17        -17 / -21 / -30    -6 / -7 / -9
     card in band  #FFFFFF              #FFFFFF            unchanged
     label         Georgia 14px / 400   Oswald 14px / 700  --serif 14 / 400
     tracking      3.36px (= .24em)     3.36px             unchanged
     label colour  rgb(176,106,62)      --accent (122,31,14)   a warm mix

   HER BAND IS BARELY OFF HER CARD and ours was three steps down, which
   made the reviews read as a separate section bolted under the card
   rather than as the card's own last band. `--paper` is the token one
   step below `--tile`, so the palette rule holds and the delta lands in
   her range.

   THE LABEL IS A MUTED WARM SERIF, which is what hers is and what ours
   was not: ours ran `--ui` (Oswald) at 700 in the full accent, so a
   four-word caption was shouting over the reviews under it. Same size,
   same tracking, our serif at 400, and the colour is the accent pulled
   halfway to `--line-strong` - (151,100,78) against her (176,106,62).
------------------------------------------------------------------ */
.rb-rev{background:var(--paper)}
.rb-revh{
  font-family:var(--serif);
  font-weight:400;
  font-size:14px;
  letter-spacing:3.36px;
  color:color-mix(in srgb, var(--accent) 50%, var(--line-strong));
}
@supports not (color:color-mix(in srgb,red 50%,blue)){
  .rb-revh{color:#976247}
}

/* ------------------------------------------------------------------
   3. ROWS OF THREE, AND ONE WIDE CARD ON THE FIRST VIEW.

   OTIS'S FIRST VIEW, COUNTED ON HIS LIVE PAGE AT 1440: four reviews.
   Three at 290px across the top - x = 269, 575, 881 - and the fourth at
   902px on its own row, which is the band's full width. Press his
   button and the wide one drops into an ordinary cell: six cards, two
   rows of three, nothing spanning.

   THE PACKER IS GONE. Round 5 built a column packer because forty cards
   in a wrapped flex row left a hole under every short card. Round 8
   solves the same problem from the other end - the ORDER is composed so
   that the three cards in a row are within 30% of each other's length,
   which is what makes a row grid sit flat - and a row grid is what both
   references actually run. `.rb-packed`, `.rb-col` and `window.rbPlace`
   are tombstoned in landing.js and the CSS below them selects nothing.

   `align-items:flex-start` IS THE WHOLE OF "NO HOLES" NOW: the cards
   keep their natural height and sit on the row's top edge instead of
   being stretched to its tallest, which is what round 4 measured off
   Bertha and what Otis does not do.
------------------------------------------------------------------ */
.rb-cards{
  display:flex;flex-wrap:wrap;gap:16px;
  align-items:flex-start;
}
/* EXACT THIRDS, NOT `flex:1 1 250px`. Otis's own declaration is the basis
   version, and it is right for him because he never shows a number of
   cards that is not a multiple of three. Ours ends on forty - thirteen
   rows and ONE CARD - and a lone flex item with `flex-grow:1` fills its
   line, so the fortieth card stretched to the band's full 902px and
   arrived looking like a second wide card. Measured: 902px, where its row
   neighbours would have been 290. A fixed basis with grow at zero keeps
   the last card the same width as every other card, and (100% - 32px)/3
   is 290px in a 902px band - his figure, arrived at rather than typed. */
.rb-cards .rbrev{flex:0 0 calc((100% - 32px) / 3);width:auto}
/* THE WIDE FOURTH, AND ONLY WHILE EXACTLY FOUR ARE SHOWING. `.rb-first`
   is on the container from the markup and landing.js takes it off on the
   first click, so the no-JavaScript state is the four-card view with the
   wide card and every state after it is ordinary rows. */
.rb-cards.rb-first .rbrev:nth-of-type(4){flex:0 0 100%}
@media (max-width:820px){
  .rb-cards .rbrev,
  .rb-cards.rb-first .rbrev:nth-of-type(4){flex:0 0 100%}
}

/* ------------------------------------------------------------------
   4. THE GAP FROM THE CARD TO THE AUTHOR BLOCK.

   MEASURED ON berthacleans.com at 1440 AND 1920 - card bottom to the top
   edge of her portrait:

     hers          154px   at both widths
     ours before    79px   at both widths
     ours after    154px

   Otis reads 154 at 1920 too (his 1440 figure came back 128 with his
   reveal animation still in flight, which is why hers is the one quoted).

   IT GOES ON `#about`, not on `#buy`: the card is the last thing in 05
   and the portrait is the first thing in 06, so the distance belongs to
   the block that is starting. At <=820 the same ratio - ours was 48px
   against a desktop 79, so it takes the same 1.95x to 94.
------------------------------------------------------------------ */
#about{margin-top:75px}
@media (max-width:820px){#about{margin-top:46px}}


/* ==================================================================
   ROUND 9 - 2026-09-20.  The glow, and the trust row on a phone.
   ================================================================== */

/* ------------------------------------------------------------------
   6. THE GLOW UNDER THE PRIMARY BUTTON.

   MEASURED ON BOTH REFERENCES' `.bigcta` AT 1440, and they are identical
   to each other:

     Bertha   box-shadow  rgba(0,0,0,.4) 0 14px 36px 0    640 x 109
     Otis     box-shadow  rgba(0,0,0,.4) 0 14px 36px 0    564 x 119

   WHAT THEY ACTUALLY CARRY IS BLACK, NOT A COLOURED GLOW - worth stating,
   because the brief describes it as "a soft outer glow in the button's own
   colour" and the measurement says otherwise. THE GEOMETRY IS THEIRS AND
   THE COLOUR IS THE BRIEF'S: 0 14px 36px at alpha .4, in `--btn-bot`
   rather than in black, which is what the brief asks for by name and what
   the gate below tests for.

   IT IS ADDED TO THE ROUND-2 DEPTH, NOT INSTEAD OF IT. `box-shadow` is one
   property and a second declaration replaces the list, so the two insets
   that draw the lip and the highlight are restated here with the glow
   appended. Drop either inset and the button loses the pressed edge that
   makes it an object.

   HOVER IS +0.1 OF ALPHA and nothing else moves - the lift and the
   gradient swap are already the button's own hover.
   SECONDARY BUTTONS GET NONE OF IT: `.ghost` carries no shadow at all and
   that is what keeps the two readable as primary and secondary.
------------------------------------------------------------------ */
/* THE SELECTOR LIST IS THE YELLOW FAMILY'S OWN, copied from the rule that
   draws the lip. A bare `[data-buy]` is (0,1,0) and loses to
   `.ep-btn[data-buy]` at (0,2,0) and to `.buybar .buybar-cta[data-buy]` at
   (0,3,0), so the glow landed on the hero's primary - which matches on the
   third selector - and on none of the four buy buttons. Matching the list
   exactly means this block wins on ORDER, which is what it should win on:
   it is the same component, one round later. FOURTH SPECIFICITY TRAP OF
   THIS PROJECT, and the fix is the same one every time. */
.ep-btn[data-buy],
.buybar .buybar-cta[data-buy],
.hero .btn-row.top-cta .btn:not(.ghost){
  box-shadow:
    inset 0 -2px 0 0 var(--btn-lip),
    inset 0 1px 0 0 rgba(255,255,255,.55),
    0 8px 18px -8px rgba(10,42,46,.35),
    0 14px 36px 0 rgba(246,188,58,.40);
}
.ep-btn[data-buy]:hover,
.buybar .buybar-cta[data-buy]:hover,
.hero .btn-row.top-cta .btn:not(.ghost):hover{
  box-shadow:
    inset 0 -2px 0 0 var(--btn-lip),
    inset 0 1px 0 0 rgba(255,255,255,.55),
    0 8px 18px -8px rgba(10,42,46,.35),
    0 14px 36px 0 rgba(246,188,58,.50);
}
@media (prefers-reduced-motion:reduce){
  .ep-btn[data-buy],.buybar .buybar-cta[data-buy],
  .hero .btn-row.top-cta .btn:not(.ghost){transition:none}
}

/* ------------------------------------------------------------------
   7. THE TRUST ROW ON A PHONE.

   MEASURED AT 390 AND 360: the gap from the bottom of the second CTA to
   the top of the trust row's hairline was ZERO at both. Round 5 put 40px
   there and scoped it to >=821, because at that point the brief said the
   phone stack should keep its spacing - and at the time the phone stack
   had the buttons under the picture with the row well clear. Round 8's
   hero closes tighter, and the two now touch.

   28px IS THE BRIEF'S FLOOR AND IT IS WHAT THE ROW GETS. The desktop 40
   is untouched; nothing else in the hero moves; the row is one line at
   both widths, measured, so no stacked fallback is needed.
------------------------------------------------------------------ */
@media (max-width:820px){
  .hero{padding-bottom:28px}
}


/* ==================================================================
   ROUND 10 - 2026-09-20.  The plates, the portrait, the cover's tilt
   on a phone, and the jump button's glow.
   ================================================================== */

/* ------------------------------------------------------------------
   1. THE PLATES - THE PILL WAS THE CROP.

   MEASURED FIRST, because the brief names a cause that is not there:

     ITEM              reported            measured
     frame aspect      "taller than
                        a Letter page"     0.7732 - Letter is 0.77273
     object-fit        "cover, so it
                        crops"             `fill`, and the natural aspect
                                           is 0.7729, so nothing is cropped
     left margin       "gone"              present - the render carries the
                                           page's own margins, 640x828
     CHAPTER 1         "sits on the
                        frame"             inside the page's top margin

   WHAT IS REAL IS THE PILL. `.zoom` was `position:absolute; right:9px;
   bottom:9px`, which is Otis's own placement - HIS pill sits inside his
   image too, measured at 129x31 over the bottom of a 300x453 plate. It
   works for him because his page renders have nothing printed down there.
   OURS HAVE THE FOLIO: "THE SENIOR FLYER - 7" is bottom-right on every
   page of this book, and the pill landed exactly on it.

   SO THE PILL COMES OUT OF THE IMAGE, which is the brief's first option
   and the only one its gate allows - the pill's box must not intersect
   the image's. Below the frame, right-aligned, between frame and caption.
   IT STAYS INSIDE THE BUTTON, so a tap on the words that say TAP TO
   ENLARGE still opens the lightbox.

   `object-fit:contain` AND THE EXACT LETTER RATIO are stated rather than
   left at `fill` on 320/414. The two differ by three ten-thousandths and
   nobody could see it, but `fill` STRETCHES whatever it is given, so the
   day a plate is re-rendered at a different size it distorts silently
   instead of letterboxing visibly. The ground is white because the page
   render's own paper is #FFFFFF, sampled at all four corners, so a
   letterbox edge would be invisible against it.
------------------------------------------------------------------ */
.pgfig img{
  aspect-ratio:8.5/11;
  object-fit:contain;
  background:#fff;
}
.page-btn{text-align:right}
.zoom{
  position:static;
  display:inline-block;
  margin:8px 0 0;
  vertical-align:top;
}
/* The caption goes back to the left edge the pill just left. */
.pgfig .pgcap{text-align:left}

/* THE LIGHTBOX SHOWS THE WHOLE PAGE. `max-height:calc(100vh - 11rem)` was
   written for a desktop overlay with a caption and a hint line under it;
   at 390 that is 11rem of a 844px screen and the page still had to fit the
   remaining 668. It does, but with no room to spare and none at all in
   landscape. The height cap is the viewport minus the chrome that is
   actually there, and `object-fit:contain` guarantees the page is whole
   inside whatever box that leaves. */
.pv-fig img{
  object-fit:contain;
  max-height:calc(100dvh - 11rem);
}
@media (max-width:640px){
  .pv{padding:2.6rem .6rem .6rem}
  .pv-fig img{max-height:calc(100dvh - 9rem)}
}

/* ------------------------------------------------------------------
   2. THE PORTRAIT ON A PHONE.

   MEASURED AT 390: the frame ran 118 -> 660 inside a column running
   126 -> 815 - narrower than its column and hard against the left of it.
   The cause is `.about-media{max-width:min(100%,420px)}` with no margin
   to centre what it narrows. The frame takes the column at <=820; above
   it, nothing changes.

   `object-position:center 20%` KEEPS THE FACE HIGH. A portrait cropped to
   a wider box from the centre takes the crop off the top, which is where
   her head is.
------------------------------------------------------------------ */
@media (max-width:820px){
  .about-media{width:100%;max-width:none;margin:0}
  .about-photo img{object-fit:cover;object-position:center 20%}
}

/* ------------------------------------------------------------------
   3. THE COVER'S TILT AT EVERY WIDTH.

   Round 8 took the tilt off under 821 because a 1.5deg lean on a centred
   240px cover read as a mistake. The brief's answer is better than
   removing it: keep the tilt and give the phone the MOTION the hover
   gives a mouse. It straightens and lifts once, when the card comes into
   view, and settles back - which says the same thing the hover says, that
   the object is real, to a reader who has no pointer to say it with.

   ONCE PER LOAD, and only where there is no hover. Under
   `prefers-reduced-motion` there is no animation at all and the cover
   keeps its static tilt.
------------------------------------------------------------------ */
@media (max-width:820px){
  #buy .rb-cov img{transform:rotate(-1.5deg)}
}
@media (hover:none){
  #buy .rb-cov img.cov-wake{animation:cov-wake 1600ms ease-out 1 both}
}
@keyframes cov-wake{
  0%   {transform:rotate(-1.5deg) translateY(0)}
  37.5%{transform:rotate(0deg) translateY(-4px)}
  62.5%{transform:rotate(0deg) translateY(-4px)}
  100% {transform:rotate(-1.5deg) translateY(0)}
}
@media (prefers-reduced-motion:reduce){
  #buy .rb-cov img.cov-wake{animation:none}
}

/* ------------------------------------------------------------------
   4. THE JUMP BUTTON'S GLOW.

   `I want it! Take me to the order` is the one primary on this page that
   is not a buy button - it sends a reader to the card rather than to the
   checkout - so it never matched `[data-buy]` and never got round 9's
   glow. Same measured geometry, in its own colour.
------------------------------------------------------------------ */
/* IN ITS OWN COLOUR, WHICH IS THE ACCENT, NOT THE YELLOW. This button is
   one of the three on the page wearing our oxblood rather than the buy
   family's yellow - it sends a reader to the card, not to a checkout, and
   round 4 kept that distinction deliberately. The brief says "in that
   button's own colour", so the glow is `--accent` at the same measured
   geometry. A yellow glow under an oxblood button would have made it look
   like a buy button that had lost its fill.
   `.ep-btn.ep-btn--jump` RATHER THAN THE BARE MODIFIER: the skin is set by
   a (0,2,0) selector and a (0,1,0) one loses to it, which is how the first
   attempt ended up with no glow at all. Fifth time on this project. */
.ep-btn.ep-btn--jump{
  box-shadow:
    inset 0 -2px 0 0 var(--accent-dark),
    inset 0 1px 0 0 rgba(255,255,255,.14),
    0 8px 18px -8px rgba(10,42,46,.35),
    0 14px 36px 0 rgba(122,31,14,.40);
}
.ep-btn.ep-btn--jump:hover{
  box-shadow:
    inset 0 -2px 0 0 var(--accent-dark),
    inset 0 1px 0 0 rgba(255,255,255,.14),
    0 8px 18px -8px rgba(10,42,46,.35),
    0 14px 36px 0 rgba(122,31,14,.50);
}


/* ==================================================================
   ROUND 11 - 2026-09-20.  The strip's scrollbar, and its axis.
   ================================================================== */

/* ------------------------------------------------------------------
   2. THE PLATE STRIP SCROLLS, AND NOW IT LOOKS LIKE IT DOES.

   MEASURED AT 390 IN A REAL TOUCH CONTEXT BEFORE TOUCHING ANYTHING:

     scrollWidth / clientWidth   1404 / 359   it can scroll
     overflow-x                  auto         it is a native scroller
     scroll-snap-type            x mandatory
     touch-action                pan-x        horizontal pan is allowed
     scrollBy(300,0)             0 -> 346     programmatic scroll works
     200px CDP touch drag        0 -> 346     A REAL SWIPE WORKS

   So the strip was never frozen. WHAT IS MISSING IS THE SCROLLBAR:
   `offsetHeight - clientHeight` measured ZERO, which means no track was
   ever reserved or drawn, on any platform. A strip that scrolls silently
   with no track and no cut-off card at the right edge looks like a row
   that has nothing more in it - which is exactly what "cannot swipe"
   feels like from the other side of the screen.

   A THIN TRACK, IN OUR OWN MUTED COLOURS, at every width. `scrollbar-width`
   and `scrollbar-color` are the standard pair and Firefox takes them;
   `::-webkit-scrollbar` is the same thing for Chrome and Safari, where a
   phone would otherwise draw nothing until the moment of the swipe.

   `overflow-y:hidden` IS THE OTHER HALF. It was `auto`, so the box was a
   scroll container on BOTH axes - a vertical drag that began on a plate
   could be swallowed by a container with nothing to scroll vertically
   instead of passing up to the page.
------------------------------------------------------------------ */
/* ROUND 11'S OVERRIDES ARE DELETED, 2026-09-20 (round 13). They were
   `overflow-y:hidden`, `scrollbar-width:thin` and a `scrollbar-color`
   pair. Otis sets NONE of them - measured on his live page at 390, his
   scroller reads overflow-y:auto, touch-action:auto,
   overscroll-behavior:auto, scrollbar-width:auto - and his gallery is the
   one that behaves on a phone. Every one of these was an attempt to
   improve on a thing that was already right. */
/* THE STRIP HAS NO ARROWS AND NO CUSTOM TRACK, and the brief's mention of
   "the desktop arrows/JS" and "the custom track" describes a build this
   one is not - there is no such markup in index.html and no such module in
   landing.js. What there is, and all there has ever been, is a native
   `overflow-x:auto` scroller, which is also what Otis runs. So the track
   that can be styled is the native one, and on a phone every engine draws
   that as an OVERLAY: it fades in during the swipe and reserves no layout
   space, which is why `offsetHeight - clientHeight` measures 0 there and
   will keep measuring 0. Styling it is still worth doing - it is a real
   track on any desktop set to classic scrollbars - but it cannot be made
   to occupy space on iOS or Android, and a rule that tried would only add
   a dead band under the strip. The affordance a phone actually gets is the
   next card peeking past the right edge, which `86vw` already leaves. */
/* AND THE `::-webkit-scrollbar` RULES GO WITH THEM. Otis's scrollbar is
   the platform's, unstyled, and the platform is the only thing that knows
   how a scrollbar behaves on the device it is drawing on. */

/* ------------------------------------------------------------------
   1. THE PLATE FRAME'S GROUND IS THE PAPER.

   THE BOOK WAS REBUILT ON 2026-09-20 AND THIS FIGURE CHANGED WITH IT.
   Every page of the old file printed a WHITE sheet with a cream block on
   it - the page background filled the content box and not the margins -
   so the frame's ground was `#fff` to match a white page, and the plates
   were faithful renders of a broken source. The rebuilt book prints the
   whole sheet in paper: measured at (2%,2%) and (98%,98%) on all four
   plate pages, #F7F0E6.

   THE FRAME TAKES THAT COLOUR so that a rounding error between the
   frame's box and the raster's - `contain` letterboxes by a fraction of a
   pixel at some widths - can never show as a white hairline down one edge
   of a cream page. Sampled from the render rather than typed from the
   brief: the brief says #F7F1E6, the file says (247,240,230), and the
   file is the thing the reader sees.
------------------------------------------------------------------ */
.pgfig img{background:#F7F0E6}
.pv-fig img{background:#F7F0E6}

/* THE NEXT CARD HAS TO SHOW, AND OTIS'S FIGURE IS 15px.

   MEASURED AT 390 IN A TOUCH CONTEXT:

                 container   card    gap   peek
     Otis          372px     335px   18    15px
     ours before   359px     335px   18     1px

   Same card, same gap, same padding - his scroller is simply 13px wider,
   because his wrap takes less side padding at this width. At OUR container
   width the same 86vw card leaves ONE PIXEL of the next one showing, and a
   strip with one pixel of anything beyond the first card reads as a strip
   with one card in it. That is what "cannot swipe" looks like from the
   reader's side: not a frozen scroller - a scroller with no visible reason
   to try.

   THE WIDTH IS A PERCENTAGE OF THE SCROLLER, not of the viewport, so it
   follows the wrap's own padding at every width instead of being re-tuned
   per breakpoint: 90.5% of the content box leaves his 15px at 390 and a
   proportional peek at 360. */
@media (max-width:640px){
  .pgfig{width:90.5%}
}

/* THE HEADING AND ITS "PER TRIP" SHARE A FLEX ROW, and at 360 they stop
   fitting. Measured: the title is 267px wide, the span 69px, and the row
   331px - so the title wraps to two lines at 360 while the same pair sits
   comfortably at 390 (359 - 75 = 284 against 267). `flex-wrap` lets the
   span drop to its own line INSTEAD of the title breaking in half, which
   is the right thing to give up first: "Per trip" is a label and the
   heading is the sentence. It engages only where the row runs out. */
@media (max-width:380px){
  .mx-col h3{flex-wrap:wrap}
}


/* ==================================================================
   ROUND 13 - 2026-09-20.  THE GALLERY IS OTIS'S, WITH NOTHING ADDED.

   The owner tested rounds 11 and 12 on a real phone: a finger starting on
   a plate still could not scroll the page, and the rail drawn in round 12
   vanished on the first swipe and never came back. A CDP touch drag in a
   headless browser said both were fine. They were not.

   MEASURED ON otisgranger.com AT 390, in a touch context:

     display              flex
     overflow-x           auto
     overflow-y           auto        <- not hidden, not clip
     touch-action         auto        <- he sets nothing
     overscroll-behavior  auto        <- he sets nothing
     scroll-snap-type     x mandatory
     scrollbar-width      auto        <- the platform's own
     gap / padding        18px / 6px 4px 18px
     siblings             h2, p.lead, div.scroller, p.scrollhint, .lookcta

   HE HAS NO RAIL AND NO JAVASCRIPT. The indicator is the native
   scrollbar, the text hint under the strip, and the next card showing
   past the right edge. That is the whole of it.

   SO EVERYTHING WE ADDED IS REMOVED: `touch-action`, `overscroll-behavior-x`,
   `overflow-y`, `scrollbar-width`, `scrollbar-color`, the
   `::-webkit-scrollbar` rules, and the JavaScript rail with its scroll
   listener. What is left is `display:flex`, a gap, `overflow-x:auto` and
   scroll snap - his four declarations - and the browser decides the rest.

   THE ONE FIGURE THAT STAYS OURS is the card's width. His is 86vw in a
   372px scroller, which leaves 15px of the next card showing; ours is a
   narrower container, where 86vw leaves ONE pixel. 90.5% of the scroller
   reproduces his RESULT rather than his number - see the round-11 note.
   ================================================================== */


/* ==================================================================
   ROUND 12, 2026-09-22 - GOES WITH IT.

   BERTHA'S `.pair`, MEASURED ON berthascookbook.com AT 1440 AND 390 AND
   COPIED VALUE FOR VALUE. Her numbers, then what they became here:

     .pair       border-top 1px dashed; padding 24px 38px (20px 24px at
                 640 and below); flex, gap 22px, align center, wrap
     img         78px wide, radius 6px, 0 8px 22px rgba(0,0,0,.22)
     .paircovs   flex, gap 9px                              165 x 118
     .pairtxt    flex 1 1 260px
     .pairhead   13px bold, .2em tracking, margin-bottom 3px
     .pairname   20px bold, line 32px; the "and" in the muted colour
     .pairmeta   14px, margin-top 2px
     .pairbtns   column, gap 8px, min-width 230px
     .pairboth   block, 16.5px bold, padding 13px 16px, radius 10px,
                 the strike at 14px normal and .7 opacity
     .pairdeal   12.5px bold, centred, in the button's green
     .pairone    2px outline, 13px at 1.35, padding 8px 14px, radius 10px;
                 the bold line under it block at 15.5px, 1px above

   HER COLOURS, MAPPED ONTO OURS BY ROLE AND NOT BY HUE:
     her green button   -> --free-green, this page's "you keep it" colour,
                           already the SAVE $52 chip two inches above
     her outline        -> --accent, the page's one button-and-price colour
     her eyebrow        -> the review band's label colour, the accent pulled
                           halfway to --line-strong
     her ground #FFFDF8 -> halfway between the card (--tile) and the review
                           band (--paper), which is where hers sits: one
                           step between the white card and the #FBF6EE band
     her Georgia        -> --serif
------------------------------------------------------------------ */
.pair{
  border-top:1px dashed var(--line-strong);
  background:color-mix(in srgb, var(--tile) 50%, var(--paper));
  padding:24px 38px;
  display:flex;gap:22px;align-items:center;flex-wrap:wrap;
  font-family:var(--serif);color:var(--ink);
}
@supports not (color:color-mix(in srgb,red 50%,blue)){
  .pair{background:#F8F5EC}
}
.paircovs{display:flex;gap:9px}
.paircovs picture{display:block}
.pair img{
  display:block;width:78px;height:auto;
  border-radius:6px;
  box-shadow:0 8px 22px rgba(0,0,0,.22), 0 0 0 1px rgba(17,63,68,.12);
}
/* HER RATIO, NOT HER RULE, 2026-09-22 (round 14). Hers reads
   `.pairtxt{flex:1 1 260px}` and `.pairbtns{min-width:230px}`, and with HER
   copy in it that settles at 165 / 290 / 403 of the row's 902px content box
   - 18.3 / 32.1 / 44.7 per cent, the button column half again as wide as
   the text. Our copy is shorter, so the same rules settled at 165 / 340 /
   353 and the text column was the wider of the two: her rules, her numbers,
   the wrong shape. The percentages are set directly now, so the row keeps
   her proportions whatever the copy does. 18.3 + 32.1 + 44.7 + two 22px
   gaps = 902. Below 640 both columns are 100% and stack, as hers do. */
.pairtxt{flex:0 0 32.1%;min-width:0}
.pair p{margin:0;max-width:none}
.pairhead{
  font-family:var(--serif);font-size:13px;line-height:20.8px;font-weight:700;
  letter-spacing:.2em;text-transform:uppercase;
  color:color-mix(in srgb, var(--accent) 50%, var(--line-strong));
}
.pair .pairhead{margin:0 0 3px}
@supports not (color:color-mix(in srgb,red 50%,blue)){
  .pairhead{color:#976247}
}
.pairname{font-size:20px;line-height:32px;font-weight:700;color:var(--ink)}
.pairand{color:var(--ink-mute);font-weight:400}
.pairname small{
  font-size:13px;font-style:italic;font-weight:400;
  color:var(--ink-mute);margin-left:6px;
}
/* Each title holds together, so the line breaks at "and" the way hers
   does. THE BY-LINE IS OURS AND TAKES ITS OWN LINE: set inline, as her
   `.pairname small` is, it broke mid-phrase and left one word alone on a
   third row. Her size, italic and colour; a block instead of her 6px indent. */
.pairt{white-space:nowrap}
.pairname small{display:block;line-height:20px;margin:1px 0 0}
.pairmeta{font-size:14px;line-height:22.4px;color:var(--ink-mute)}
.pair .pairmeta{margin-top:2px}
.pairbtns{display:flex;flex-direction:column;gap:8px;flex:0 0 44.7%;min-width:0}
.pairboth{
  display:block;text-align:center;
  background:var(--free-green);color:#fff;text-decoration:none;
  font-family:var(--serif);font-weight:700;font-size:16.5px;line-height:26.4px;
  padding:13px 16px;border-radius:10px;
  transition:background .2s ease;
}
.pairboth:hover{background:color-mix(in srgb, var(--free-green) 85%, #000);color:#fff}
.pairboth:focus-visible{outline:3px solid var(--ink);outline-offset:2px}
.pairboth s{opacity:.7;font-weight:400;font-size:14px}
/* `.fig` is display:flex and italic site-wide. Inside these three lines
   it has to be the line itself, or each price drops onto its own row. */
.pair .fig{display:inline;font-family:inherit;font-style:normal;font-weight:inherit}
.pairdeal{
  font-size:12.5px;line-height:20px;font-weight:700;text-align:center;
  color:var(--free-green);
}
.pairone{
  display:block;text-align:center;
  border:2px solid var(--accent);color:var(--accent);text-decoration:none;
  font-family:var(--serif);font-weight:400;font-size:13px;line-height:1.35;
  padding:8px 14px;border-radius:10px;
  transition:background .2s ease,color .2s ease;
}
.pairone b{display:block;font-size:15.5px;font-weight:700;margin-top:1px}
.pairone:hover{background:var(--accent);color:var(--paper)}
.pairone:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.pairboth,.pairone{transition:none}}
@media (max-width:640px){
  .pair{padding:20px 24px}
  /* stacked: both columns take the row, which is what hers do */
  .pairtxt,.pairbtns{flex:1 1 100%}
}


/* ==================================================================
   ROUND 12 (b), 2026-09-22 - BUILD YOUR OWN BUNDLE (/bundle).

   BERTHA'S /bundle.html, MEASURED AT 1440 AND 390. Her values, then ours:

     .wrap     max-width 900px; padding 26px 15px 150px
     .back     13.5px system sans; margin-bottom 16px
     h1        31px / 1.2 serif; margin 0 0 6px
     .sub      16px / 1.55; margin 0 0 24px
     .bk       flex, gap 20px; 2px border, radius 16px; padding 19px 20px;
               margin-bottom 14px; .on = green border + 3px ring at .10
     .bk img   104px, radius 5px, 0 8px 22px rgba(0,0,0,.22)
     .bkn      20px bold / 1.25; 38px clear of the tick
     .bkm      12px sans bold, .1em; margin 5px 0 8px
     .bkd      15px / 1.6          .bkl  14.2px / 1.65, indent 19px
     .tick     26px circle, 2px ring, 17px from the top right corner
     .yours    10px sans bold, .12em; 15px up, 18px in
     .bar      fixed to the foot; 1px rule; 0 -8px 30px at .10; 13px 16px
     .now      32px bold    .was 17px struck    .save 11.5px pill
     .cnt      13px sans    .go  17px bold pill, padding 15px 32px
     560 and below: card gap 14 padding 15, cover 78, title 18,
               price 27, button 13px 22px at 16px

   HER COLOURS BY ROLE: the page is --paper and the cards and the bar are
   --tile, which is our card colour on the home page; her green is
   --free-green; her red price is --accent, our price colour; the button
   is the home page's yellow buy button, pill-shaped as hers is; her small
   caps label is the review band's label colour. Her Georgia is --serif,
   her system sans is --ui for the tracked labels and --body for the rest.
------------------------------------------------------------------ */
body.byo-page{background:var(--paper)}
.byo-wrap{max-width:900px;margin:0 auto;padding:26px 15px 150px}
/* HER BODY SETS NO LINE-HEIGHT, OURS IS 1.65. Every line she does not set
   explicitly is `normal`, so the page and the bar take `normal` back and
   only her own five values (1.2, 1.25, 1.55, 1.6, 1.65) are restated below.
   Without it the bar measured 103px against her 80. */
.byo,.byo-bar{line-height:normal}
.byo-back{
  display:inline-block;margin-bottom:16px;
  font-family:var(--body);font-size:13.5px;
  color:var(--accent);text-decoration:none;
}
.byo-back:hover{text-decoration:underline}
.byo .byo-h1{
  font-family:var(--serif);font-weight:700;text-transform:none;letter-spacing:0;
  font-size:31px;line-height:1.2;color:var(--ink);margin:0 0 6px;
}
.byo .byo-sub{
  font-family:var(--serif);font-size:16px;line-height:1.55;
  color:var(--ink-soft);margin:0 0 24px;max-width:none;
}
.bk{
  display:flex;gap:20px;
  background:var(--tile);
  border:2px solid var(--line);border-radius:16px;
  padding:19px 20px;margin-bottom:14px;
  cursor:pointer;position:relative;
  transition:border-color .12s,box-shadow .12s;
}
.bk:hover{border-color:var(--line-strong)}
.bk.on{border-color:var(--free-green);box-shadow:0 0 0 3px rgba(31,107,69,.10)}
.bk:focus-visible{outline:3px solid var(--ink);outline-offset:2px}
.bk picture{display:block;flex:0 0 auto;align-self:flex-start}
/* HER SHADOW, PLUS A HAIRLINE, 2026-09-22 (round 14). Measured: the
   covers are 104px in both builds and the art fills 97-99% of the box in
   both, so nothing here is smaller than hers. What differs is the ground:
   her cards are WHITE under three dark covers, ours are cream under a
   cream-edged Airport Directory, so its edge dissolved into the card. A
   1px inset of the page's own ink at 12% gives a light cover an edge
   without putting a border on the art. */
.bk img{
  display:block;width:104px;height:auto;
  border-radius:5px;
  box-shadow:0 8px 22px rgba(0,0,0,.22), 0 0 0 1px rgba(17,63,68,.12);
}
.bkr{flex:1;min-width:0}
.bk p{margin:0;max-width:none}
.bk .bkn{
  font-family:var(--serif);font-size:20px;font-weight:700;line-height:1.25;
  color:var(--ink);padding-right:38px;
}
.bk .bkm{
  font-family:var(--ui);font-size:12px;letter-spacing:.1em;font-weight:700;
  text-transform:uppercase;
  color:color-mix(in srgb, var(--accent) 50%, var(--line-strong));
  margin:5px 0 8px;
}
@supports not (color:color-mix(in srgb,red 50%,blue)){
  .bk .bkm{color:#976247}
}
/* THE ONE LINE HER CARDS DO NOT HAVE. The Cruise Rule Book is Thomas
   Ashford's, and the card names him before it says anything else. Set
   as her `.pairname small`: italic, muted, a step down from the copy. */
.bk .bkby{
  font-family:var(--serif);font-style:italic;font-size:14px;line-height:1.4;
  color:var(--ink-mute);margin:-3px 0 6px;
}
.bk .bkd{font-family:var(--serif);font-size:15px;line-height:1.6;color:var(--ink-soft)}
.bkl{
  margin:9px 0 0;padding-left:19px;
  font-family:var(--serif);font-size:14.2px;line-height:1.65;color:var(--ink-soft);
}
.bk .tick{
  position:absolute;top:17px;right:17px;
  width:26px;height:26px;border-radius:50%;
  border:2px solid var(--line-strong);background:var(--tile);
  display:flex;align-items:center;justify-content:center;
  font-size:15px;line-height:1;color:var(--tile);font-weight:700;
}
.bk.on .tick{background:var(--free-green);border-color:var(--free-green);color:#fff}
.bk .yours{
  position:absolute;bottom:15px;right:18px;
  font-family:var(--ui);font-size:10px;letter-spacing:.12em;font-weight:700;
  text-transform:uppercase;color:var(--ink-mute);
}
/* The Rule Book card does nothing on a tap, so it does not pretend to. */
.bk.is-locked{cursor:default}
.bk.is-locked:hover{border-color:var(--free-green)}

.byo-bar{
  position:fixed;left:0;right:0;bottom:0;z-index:40;
  background:var(--tile);
  border-top:1px solid var(--line);
  box-shadow:0 -8px 30px rgba(17,63,68,.10);
  padding:13px 16px;
}
.byo-barin{
  max-width:900px;margin:0 auto;
  display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
}
/* HER RATIO AGAIN. On her bar the price block is the bigger half - 253
   against her 194px button at 1280, 1.30 : 1 - because her price line is
   "$39.99 $59.99 SAVE $20". Ours read "$27 $79 Save $52" and came out at
   160 against 187, the wrong way round. The block takes her share of the
   bar as a floor and still grows with its own text. At 560 and below hers
   takes two thirds of the bar, which is what pushes her button onto a row
   of its own; ours does the same now. */
.byo-price{flex:0 1 auto;min-width:28.1%}
@media (max-width:560px){
  .byo-price{min-width:65.7%}
}
.byo-now{font-family:var(--serif);font-size:32px;font-weight:700;color:var(--accent)}
.byo-was{
  font-family:var(--serif);font-size:17px;color:var(--ink-mute);
  text-decoration:line-through;margin-left:8px;
}
.byo-save{
  display:inline-block;margin-left:8px;vertical-align:4px;
  background:var(--free-green);color:#fff;
  font-family:var(--ui);font-size:11.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;
  padding:3px 9px;border-radius:999px;
}
.byo-cnt{font-family:var(--body);font-size:13px;color:var(--ink-mute);margin-top:2px}
.byo-go{
  display:inline-block;
  background:linear-gradient(180deg,var(--btn-top),var(--btn-bot));
  color:var(--btn-ink);text-decoration:none;
  font-family:var(--serif);font-weight:700;font-size:17px;
  padding:15px 32px;border-radius:999px;cursor:pointer;
  box-shadow:
    inset 0 -2px 0 0 var(--btn-lip),
    inset 0 1px 0 0 rgba(255,255,255,.55),
    0 8px 18px -8px rgba(10,42,46,.35);
  transition:background .2s ease;
}
.byo-go:hover{
  background:linear-gradient(180deg,var(--btn-top-hover),var(--btn-bot-hover));
  color:var(--btn-ink);
}
.byo-go:focus-visible{outline:3px solid var(--ink);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.bk,.byo-go{transition:none}}
@media (max-width:560px){
  .bk{gap:14px;padding:15px}
  .bk img{width:78px}
  .bk .bkn{font-size:18px}
  .byo-now{font-size:27px}
  .byo-go{padding:13px 22px;font-size:16px}
}

/* ROUND 12 (c), 2026-09-22 - THE WALLET BUTTON ON THE CARD.
   Collapsed until Whop's frame inside it has height; landing.js adds
   .is-live then. Not display:none, because a frame that is not laid out
   cannot be measured. 10px under it is the gap Bertha's .pairbtns keeps
   between two stacked buttons, rounded to our 10px radius family. */
/* [the wallet button's slot is gone, 2026-09-25 - see the block at the end] */

/* ==================================================================
   ROUND 13, 2026-09-22 - THE CHECKOUT HEADER, THE WAIT, AND THE
   WALLET BUTTON IN THE PRICE BAR.
------------------------------------------------------------------ */
/* [moved to checkout.css, 2026-09-24] */

/* The bar's buy column: the wallet button above the buy button, the same
   order and the same 10px gap the product card uses. */


/* ==================================================================
   CVR ROUND 1, 2026-09-24 - 02 IS SIX RULES FROM THE BOOK.
------------------------------------------------------------------ */
/* A figure narrower than the 64px floor sat at the LEFT of it: the credit
   cell is a flex row, and text-align does not move flex items. */
.mx-col li.mx-credit > span:last-child{justify-content:flex-end}

/* ==================================================================
   CVR ROUND 2, 2026-09-24 - THE PAYMENT MARKS (the bump's rules are in checkout.css).
------------------------------------------------------------------ */
/* The brands' own full-colour marks, 16px tall, 6px apart, under the
   product card's secure line (8px below it) and under the Ready button.
   The sprite they draw from is laid out nowhere. */
.pm-sprite{position:absolute;width:0;height:0;overflow:hidden}
.paymarks{
  display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:6px;
  list-style:none;margin:8px 0 0;padding:0;
}
.paymarks li{margin:0;padding:0;line-height:0}
.paymarks li::before{content:none}
.paymarks svg{display:block;height:16px;width:25.33px}
.lastcall .paymarks{margin-top:14px}

/* [moved to checkout.css, 2026-09-24] */

/* ==================================================================
   CVR ROUND 3, 2026-09-24 - THE HERO'S THREE CHECKS.
   One line each from 821px up. Measured at 1280: the longest needs 483px
   at 19.08px against a 477px column and a 420px (36ch) list cap. One font
   step down - 18px, the size the checks already have on a phone - brings
   it to about 457px, and the cap comes off so the list can use the column
   it sits in. The column and the photograph do not move.
   Where they do wrap (a phone, or 821-1279), the two lines are balanced so
   no last line is a single word.
------------------------------------------------------------------ */
@media (min-width:821px){
  .hero-text .hero-points{max-width:none}
  .hero-text .hero-points li{font-size:18px}
}
.hero-text .hero-points li{text-wrap:balance}

/* [moved to checkout.css, 2026-09-24] */


/* ==================================================================
   2026-09-25 (owner) - /bundle ON A PHONE.
   1. THE BAR IS ONE ROW, as the home page's sticky bar is: price, strike,
      SAVE and the count on the left, the button on the right. The price
      column shrinks and may wrap inside itself (SAVE drops under the price
      at 360); the button keeps its width and never wraps. Bertha's
      two-thirds floor at <=560 is what used to push the button onto a row
      of its own, and it goes. The page's bottom padding is the bar's own
      height, set by js/bundle.js; 150px stays only as the no-script floor.
   2. "THE ONE YOU CAME FOR" is a line of its own under the bullets, in the
      text column, so it cannot sit on top of a bullet at any width. It was
      absolute in the card's corner and covered the last bullet on phones.
------------------------------------------------------------------ */
.byo-barin{flex-wrap:nowrap}
.byo-price{flex:1 1 auto;min-width:0}
.byo-go{flex:none;white-space:nowrap}
@media (max-width:560px){
  .byo-bar{padding:10px 12px}
  .byo-barin{gap:10px}
  .byo-price{min-width:0}
  .byo-now{font-size:24px}
  .byo-was{font-size:15px;margin-left:6px}
  .byo-save{font-size:10.5px;margin-left:6px;padding:2px 7px}
  .byo-cnt{font-size:12px}
  .byo-go{padding:12px 16px;font-size:15px}
}
.bk .yours{position:static;display:block;margin:10px 0 0;text-align:left}
