/** Shopify CDN: Minification failed

Line 64:9 Expected ":"

**/
/* ==========================================================================
   FGO HOME v4  --  the Beam-composition homepage.

   Generated from pdp/design/beam-home/index.html on 22 Sep 2026, not retyped,
   so the built page carries the prototype values rather than my memory of them.

   SCOPED TO .fgoH4. The prototype is a whole document and sets body, html, a, p,
   ul and h1-h4 bare. Those rules would hit the theme header, the mini-cart and the
   footer, which render on this page too. Every selector is therefore prefixed, and
   :root is rewritten to .fgoH4 so the token block travels with the scope.

   The @font-face block is dropped: the theme already serves Founders from its own
   assets, and the prototype paths (assets/fonts/...) do not exist here.
   ========================================================================== */
/* ---- theme tokens, lifted from fgo-system.css at build time.   See the note in the generator: pdp-v4 needs these for the theme header and
   footer, but must NOT take the .fgo-sys component rules with them. */
:root {
  --fg-rail: 1360px;
  --fg-sect:       clamp(55px, 6.2vw, 89px);  /* Fibonacci 55 -> 89 */
  --fg-sect-merch: clamp(34px, 4.4vw, 55px);  /* Fibonacci 34 -> 55 */
  --fg-rail-gutter: clamp(20px, 2.8vw, 40px);
  --fg-paper:    #F8F7F0;              /* cream lifted for large surfaces */
  --fg-rule:     rgba(0,0,0,.12);      /* every hairline */
  --fg-ink-70:   rgba(0,0,0,.72);      /* secondary copy */
  --fg-green-12: rgba(4,106,56,.12);   /* tick backgrounds, chips */
  --fg-green-06: rgba(4,106,56,.06);   /* callout grounds */
  --fg-turmeric: #FFCD00;              /* DECORATIVE ONLY. Never type:
  --fg-bg:        #F8F7F0;   /* the light ground — product pops on this */
  --fg-bg-alt:    #F5F3E7;   /* BRAND CREAM — the warm band */
  --fg-tile:      #EAE2CF;   /* THE SURFACE. Deeper than the reference (they sit 7/9/16 below their page; this is 11/17/26) because THEIR products are white and pale, so the tile shows generously around them. OURS are saturated — magenta, teal, brown, deep green — and fill the card, leaving little ground visible, so the same small step registers as nothing. Must be DARKER than the
  --fg-deep:      #046A38;   /* brand green, full strength */
  --fg-deep-ink:  #023A1F;   /* THE INK, and it is ours: brand Organic
  --fg-ink-soft:  #3F6B4F;   /* the same green, lifted for secondary copy */
  --fg-line:      rgba(2, 58, 31, .14);
  --fg-accent:    #046A38;
  --fg-edge:      var(--fg-rail);
  --fg-gutter:    var(--fg-rail-gutter);
  --fg-r-sm:      8px;    /* chips, flags */
  --fg-r-md:      14px;   /* tiles, cards, fields */
  --fg-r-lg:      24px;   /* full-width panels */
  --fg-r-pill:    999px;
  --fg-sect-y:    var(--fg-sect-merch);
  --fg-head-gap:  clamp(13px, 2.4vw, 34px);   /* Fibonacci 13 -> 34 */
  --fg-card-gap:  clamp(13px, 1.5vw, 21px);   /* Fibonacci 13 -> 21 */
  --fg-t-micro:   12px;   /* ui-xs */     /* flags, counts, legal */
  --fg-t-label:   12px;   /* label, .125em tracked */   /* eyebrow / subhead: caps, tracking 125 */
  --fg-t-body:    19px;   /* THE ANCHOR. The whole editorial ladder is
  --fg-t-lede:    24px;   /* 24 x phi = 39, the H2 above it */   /* ui-lg */
  --fg-t-h3:      31px;   /* title. 31 = 19 x phi */   /* title-sm */
  --fg-t-h2:      clamp(29px, 2.7vw, 39px); /* title-lg. 39 = 24 x phi */ /* title -> display on the ramp */ /* was 36-60, sized for all-caps. Title case carries at a smaller step. */
  --fg-t-h1:      clamp(38px, 4.2vw, 61px); /* display-lg; 38 is the 390px cap */
  --fg-t-cta:     16px;   /* ui-base */
  --fg-t-title:   20px;   /* ui-lg, card + product names */
  --fg-h-family:  var(--fg-body);
  --fg-h-weight:  600;
  --fg-h-case:    none;
  --fg-h-track:   -.025em;
  --fg-h-lh:      1.08;
     word in the hero, links, marks, the primary button fill. ONE token: put var(--fg-deep-ink) back here to
  --fg-h-ink:     #12160F;
  --fg-h-em-family: inherit;
  --fg-h-em-style:  normal;
  --fg-h-em-weight: inherit;
  --fg-h-em-size:   1em;
  --fg-h-em-track:  inherit;
  --fg-h-em-color:  inherit;
  --fg-btn-face:   var(--fg-body);
  --fg-btn-size:   16px;
  --fg-btn-weight: 600;
  --fg-btn-case:   none;
  --fg-btn-track:  0;
  --fg-btn-h:      56px;
  --fg-btn-r:      999px;
  --fg-btn-pad-x:  30px;
  --fg-display:   "FoundersCondensed", Arial, sans-serif;
  --fg-body:      "Founders", "Open Sans", sans-serif;
  --fg-serif:     Georgia, "Times New Roman", serif;
  --fg-lh-body:   1.58;    /* at 19px, 1.618 opens the measure too far */
  --fg-lh-tight:  .98;
  --fg-track-cta: .04em;    /* every CTA. never wider */
  --fg-track-lbl: .12em;    /* every eyebrow/label */
  --fg-ease:      cubic-bezier(.16, 1, .3, 1);
}

/* ============================================================
   From Great Origins · Homepage · shopbeam.com homepage layout
   Every dimension below was measured on shopbeam.com at 1440x900
   and 390x844 on 21 Sep 2026 (brief/LAYOUT-SPEC.md). Materials are
   the Hibiscus PDP sister's (beam-layout/DESIGN.md), multi-product.
   ============================================================ */
.fgoH4 {
  color-scheme:light;
  /* brand core (PDP, verbatim) */
  --paper:#FBF8F1;      /* page ground */
  --cream:#F5F3E7;      /* bands, closed accordion rows, review tiles, image wells */
  --white:#FFFFFF;      /* open accordion row only */
  --ink:#141414;        /* type */
  --ink-2:#6B675C;      /* secondary type, warm */
  --line:#D8D3C7;       /* limestone hairline */
  --green:#046A38;      /* Organic Green, chrome: announcement + footer */
  --forest:#023A1F;     /* deep green: headings + the solid CTA */
  /* beam's layout constants (PDP, verbatim) */
  --indent:16px; --gutter:80px; --max:1440px;
  --r-card:8px; --r-form:2px; --r-pill:9999px;
  --ann-h:50px; --head-h:65px;
  --ease:cubic-bezier(.16,1,.3,1);
  /* home */
  --r-tile:12px;        /* review carousel tiles (Beam 12) */
  --r-banner:16px;      /* quality banner (Beam 16) */
  --scrim:rgba(20,20,20,.45);   /* the ONLY scrim value; never darker */
  --chip-bg:rgba(251,248,241,.88); /* paper at .88, the badge chip ground */
}
.fgoH4 * {
  box-sizing:border-box
}
.fgoH4 {
  scroll-behavior:smooth;-webkit-text-size-adjust:100%
}
.fgoH4 {
  margin:0;background:var(--paper);color:var(--ink);font-family:"Founders","Helvetica Neue",Arial,sans-serif;font-size:17px;line-height:26px;font-weight:400;text-rendering:optimizeLegibility;font-kerning:normal;-webkit-font-smoothing:antialiased;overflow-x:hidden
}
.fgoH4 img {
  display:block;max-width:100%
}
.fgoH4 button {
  font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer
}
.fgoH4 a {
  color:inherit
}
.fgoH4 p {
  margin:0;text-wrap:pretty
}
.fgoH4 h1, .fgoH4 h2, .fgoH4 h3, .fgoH4 h4, .fgoH4 h5 {
  margin:0;font-weight:300;color:var(--forest)
}
.fgoH4 :focus-visible {
  outline:2px solid var(--forest);outline-offset:3px;border-radius:2px
}
.fgoH4 .sr {
  position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap
}
.fgoH4 .ico {
  width:16px;height:16px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round
}
.fgoH4 .wrap {
  max-width:var(--max);margin:0 auto;padding-left:var(--gutter);padding-right:var(--gutter)
}
.fgoH4 .band {
  background:var(--cream)
}
/* ---- type roles (PDP verbatim, then the homepage additions) ---- */
.fgoH4 .h0 {
  font-size:56px;line-height:.95;font-weight:300;letter-spacing:-.01em
}
.fgoH4 .h1 {
  font-size:48px;line-height:.98;font-weight:300;letter-spacing:-.01em
}
.fgoH4 .h2 {
  font-size:40px;line-height:1.05;font-weight:300;letter-spacing:-.005em;text-wrap:balance
}
.fgoH4 .h4 {
  font-size:20px;line-height:26px;font-weight:600;color:var(--ink)
}
.fgoH4 .h5 {
  font-size:17px;line-height:24px;font-weight:600;color:var(--ink)
}
.fgoH4 .cap1 {
  font-size:15px;line-height:20px
}
.fgoH4 .cap2 {
  font-size:13px;line-height:18px
}
.fgoH4 .b {
  font-weight:600
}
.fgoH4 .serif {
  font-family:Georgia,"Times New Roman",serif;font-style:italic;font-weight:400
}
/* home */
.fgoH4 .h-hero {
  font-size:56px;line-height:.95;font-weight:300;letter-spacing:-.01em;color:var(--forest);text-wrap:balance
}
.fgoH4 .h-tile {
  font-size:40px;line-height:1.05;font-weight:300;letter-spacing:-.005em;color:var(--paper)
}
.fgoH4 .h3 {
  font-size:24px;line-height:30px;font-weight:400;color:var(--ink)
}
.fgoH4 .lede {
  font-size:18px;line-height:28px
}
.fgoH4 .chip {
  display:inline-flex;align-items:center;height:26px;padding:0 16px;border-radius:var(--r-pill);background:var(--chip-bg);color:var(--ink);font-size:13px;line-height:16px;font-weight:600
}
.fgoH4 .field {
  height:48px;width:100%;padding:0 16px;border-radius:var(--r-form);border:1px solid rgba(245,243,231,.6);background:transparent;color:var(--cream);font:inherit;font-size:16px
}
.fgoH4 .field::placeholder {
  color:var(--cream);opacity:.85
}
.fgoH4 .field:focus-visible {
  outline:2px solid var(--cream);outline-offset:2px
}
/* ---- buttons (PDP verbatim, plus the two homepage variants) ---- */
.fgoH4 .btn {
  display:inline-flex;align-items:center;justify-content:center;gap:10px;height:48px;padding:0 24px;border-radius:var(--r-pill);background:var(--forest);color:#fff;font-size:16px;line-height:16px;font-weight:600;text-decoration:none;transition:background .3s var(--ease),transform .3s var(--ease);width:auto;white-space:nowrap
}
.fgoH4 .btn:hover {
  background:var(--ink)
}
.fgoH4 .btn:active {
  transform:translateY(1px)
}
.fgoH4 .btn.ghost {
  background:transparent;color:var(--ink);border:1px solid var(--ink)
}
.fgoH4 .btn.ghost:hover {
  background:var(--ink);color:#fff
}
.fgoH4 .btn.on-photo {
  background:var(--paper);color:var(--forest)
}
.fgoH4 .btn.on-photo:hover {
  background:var(--cream)
}
.fgoH4 .btn.ghost.on-green {
  color:var(--cream);border-color:var(--cream)
}
.fgoH4 .btn.ghost.on-green:hover {
  background:var(--cream);color:var(--green)
}
.fgoH4 .link {
  font-weight:600;font-size:16px;line-height:16px;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;padding:14px 0;margin:-14px 0
}
.fgoH4 .link:hover {
  color:var(--forest)
}
/* ---- cards, images, motion (PDP verbatim) ---- */
.fgoH4 .card {
  border-radius:var(--r-card);overflow:hidden
}
.fgoH4 .card.pic {
  position:relative;background:var(--cream)
}
.fgoH4 .card.pic img {
  width:100%;height:100%;object-fit:cover;position:absolute;inset:0;transition:transform 1.2s var(--ease)
}
.fgoH4 .card.pic:hover img {
  transform:scale(1.02)
}
/* ---- stars (PDP) ---- */
.fgoH4 .stars {
  position:relative;display:inline-flex;height:16px;line-height:0;color:var(--forest)
}
.fgoH4 .stars .row {
  display:flex;gap:2px
}
.fgoH4 .stars .fill {
  position:absolute;left:0;top:0;overflow:hidden;white-space:nowrap
}
.fgoH4 .stars svg {
  width:16px;height:16px;flex:none
}
.fgoH4 .stars .row.o svg {
  fill:none;stroke:currentColor;stroke-width:1.5
}
.fgoH4 .stars .row.f svg {
  fill:currentColor;stroke:currentColor;stroke-width:1.5
}
/* ---- round arrow controls (PDP gallery arrows): a circle around an arrow is a control ---- */
.fgoH4 .rnav {
  display:flex;justify-content:center;gap:6px;margin-top:37px
}
.fgoH4 .gnav {
  position:relative;width:36px;height:36px;border-radius:50%;background:var(--paper);border:1px solid var(--line);color:var(--ink);display:flex;align-items:center;justify-content:center;transition:background .2s var(--ease),color .2s var(--ease)
}
.fgoH4 .gnav .ico {
  width:10px;height:10px;stroke-width:2.4
}
.fgoH4 .gnav::before {
  content:"";position:absolute;inset:-4px
}
.fgoH4 .gnav:hover {
  background:var(--ink);color:#fff
}
/* ---- scroll rows (phone sliders, reviews carousel) ---- */
.fgoH4 .srow {
  scrollbar-width:none;-ms-overflow-style:none
}
.fgoH4 .srow::-webkit-scrollbar {
  display:none
}
/* ---- best-seller card: subscribe price ---- */
.fgoH4 .pcard .subline {
  color:var(--green);font-weight:600;margin-top:2px
}
/* ---- real people ---- */
.fgoH4 .prow, .fgoH4 .tcards, .fgoH4 .statbar, .fgoH4 .moods {
  list-style:none;margin:0;padding:0
}
.fgoH4 .people {
  padding:80px 0
}
.fgoH4 .prow {
  display:grid;grid-template-columns:repeat(6,1fr);gap:16px;margin-bottom:40px
}
.fgoH4 .prow li {
  margin:0
}
.fgoH4 .prow img {
  width:100%;aspect-ratio:2/3;object-fit:cover;border-radius:var(--r-card);background:var(--cream)
}
.fgoH4 .tcards {
  display:grid;grid-template-columns:repeat(3,1fr);gap:32px
}
.fgoH4 .tcard {
  background:var(--paper);border-radius:var(--r-card);padding:24px;display:flex;flex-direction:column;gap:10px
}
.fgoH4 .tcard blockquote {
  margin:0
}
.fgoH4 .tcard .who {
  margin-top:auto
}
.fgoH4 .tcard .vb {
  color:var(--green);font-weight:600
}
.fgoH4 .statbar {
  display:grid;grid-template-columns:repeat(4,1fr);gap:24px;margin-top:40px;padding-top:32px;border-top:1px solid var(--line)
}
.fgoH4 .statbar li {
  display:flex;flex-direction:column;gap:4px;text-align:center
}
.fgoH4 .statbar .n {
  font-size:32px;line-height:1.1;font-weight:300;color:var(--forest);font-variant-numeric:tabular-nums
}
/* ---- guided discovery ---- */
.fgoH4 .mood {
  padding:80px 0
}
.fgoH4 .moods {
  display:grid;grid-template-columns:repeat(4,1fr);gap:24px
}
.fgoH4 .moods a {
  display:flex;gap:14px;height:100%;padding:24px;border:1px solid var(--line);border-radius:var(--r-card);text-decoration:none;background:var(--paper);transition:border-color .2s var(--ease),background .2s var(--ease)
}
.fgoH4 .moods a:hover {
  border-color:var(--forest);background:var(--cream)
}
.fgoH4 .mi {
  flex:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;color:var(--green)
}
.fgoH4 .mi .ico {
  width:22px;height:22px
}
.fgoH4 .mt {
  display:flex;flex-direction:column;gap:6px
}
.fgoH4 .ml {
  font-size:15px;line-height:20px;font-weight:600;color:var(--forest);display:inline-flex;align-items:center;gap:6px;margin-top:4px
}
.fgoH4 .ml .ico {
  width:14px;height:14px
}
@media (max-width:1024px) {
.fgoH4 .people, .fgoH4 .mood {
  padding:40px 0
}
.fgoH4 .prow {
  grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:24px
}
.fgoH4 .tcards {
  grid-template-columns:1fr;gap:16px
}
.fgoH4 .statbar {
  grid-template-columns:1fr 1fr;gap:20px;margin-top:24px;padding-top:24px
}
.fgoH4 .statbar .n {
  font-size:28px
}
.fgoH4 .moods {
  grid-template-columns:1fr;gap:12px
}
.fgoH4 .moods a {
  padding:16px
}
}
/* ================= announcement + header (PDP verbatim) ================= */
.fgoH4 .ann {
  height:var(--ann-h);background:var(--green);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;line-height:18px;font-weight:600;padding:0 var(--indent);text-align:center
}
.fgoH4 .hdr {
  position:sticky;top:env(safe-area-inset-top,0px);z-index:40;height:var(--head-h);background:var(--paper);border-bottom:1px solid var(--line)
}
.fgoH4 .hdr .wrap {
  height:100%;display:grid;grid-template-columns:1fr auto 1fr;align-items:center
}
.fgoH4 .nav {
  display:flex;gap:28px;align-items:center;font-size:13px;line-height:16px;font-weight:600;letter-spacing:.12em;text-transform:uppercase
}
.fgoH4 .nav a {
  text-decoration:none;display:inline-flex;align-items:center;gap:6px;padding:8px 0;position:relative
}
.fgoH4 .nav a::after {
  content:"";position:absolute;left:0;right:0;bottom:2px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left;transition:transform .35s var(--ease)
}
.fgoH4 .nav a:hover::after {
  transform:scaleX(1)
}
.fgoH4 .nav.right {
  justify-content:flex-end
}
.fgoH4 .nav .icon-btn {
  display:inline-flex;width:40px;height:40px;align-items:center;justify-content:center;border-radius:50%
}
.fgoH4 .nav .icon-btn .ico {
  width:20px;height:20px;stroke-width:1.8
}
.fgoH4 .logo {
  display:block;height:46px
}
.fgoH4 .logo img {
  height:100%;width:auto
}
.fgoH4 .hdr .m-only {
  display:none;width:40px;height:40px;align-items:center;justify-content:center;margin-left:-8px
}
.fgoH4 .hdr .logo {
  justify-self:center
}
/* ================= hero (Beam content_grid, full-bleed photograph) ================= */
.fgoH4 .hero {
  position:relative;background:var(--cream)
}
.fgoH4 .hero>picture img {
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center right
}
.fgoH4 .hero .wrap {
  position:relative;z-index:1
}
.fgoH4 .hero .item {
  aspect-ratio:21/9;display:flex;flex-direction:column;justify-content:center;padding:40px 0
}
.fgoH4 .hero .copy {
  animation:h4rise .7s var(--ease) both
}
@keyframes h4rise {
from {
  transform:translateY(10px);opacity:0
}
to {
  transform:translateY(0);opacity:1
}
}
.fgoH4 .hero .proof {
  display:flex;align-items:center;gap:12px;color:var(--ink)
}
.fgoH4 .hero h1 {
  width:40%;margin:40px 0 16px
}
.fgoH4 .hero .lede {
  max-width:400px
}
.fgoH4 .hero .acts {
  display:flex;align-items:center;flex-wrap:wrap;gap:24px;margin-top:24px
}
/* ================= press marquee (Beam fav-marquee) ================= */
.fgoH4 .press {
  padding:32px 0;overflow:hidden
}
.fgoH4 .press .track {
  display:flex;width:max-content;animation:h4marquee 46s linear infinite
}
.fgoH4 .press .grp {
  display:flex;align-items:center;height:30px
}
.fgoH4 .press .it {
  display:inline-flex;align-items:center;padding:0 70px;white-space:nowrap
}
.fgoH4 .press .it img {
  width:auto
}
.fgoH4 .press .cap {
  color:var(--ink-2)
}
.fgoH4 .press:hover .track, .fgoH4 .press:focus-within .track {
  animation-play-state:paused
}
@keyframes h4marquee {
to {
  transform:translateX(-50%)
}
}
/* ================= best sellers (Beam content_slider, 4 cards) ================= */
.fgoH4 .sellers {
  padding:80px 0
}
.fgoH4 .cards {
  display:grid;grid-template-columns:repeat(4,1fr);gap:32px
}
.fgoH4 .pcard {
  display:flex;flex-direction:column;align-items:flex-start
}
.fgoH4 .pcard .card.pic {
  aspect-ratio:1;width:100%
}
.fgoH4 .pcard .chip {
  position:absolute;top:8px;left:8px;z-index:1
}
.fgoH4 .pcard:hover .card.pic img {
  transform:scale(1.02)
}
.fgoH4 .pcard .h3 {
  margin-top:16px
}
.fgoH4 .pcard .h3 a {
  text-decoration:none
}
.fgoH4 .pcard .h3 a:hover {
  text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px
}
.fgoH4 .pcard .meta {
  margin-top:4px;color:var(--ink-2)
}
.fgoH4 .pcard .btn {
  margin-top:16px;width:100%;padding:0 16px
}
.fgoH4 .pcard .h3 {
  min-height:60px;display:flex;align-items:flex-end
}
/* ================= origins split + accordion (Beam core belief) ================= */
.fgoH4 .origins {
  padding:80px 0
}
.fgoH4 .origins .split {
  display:grid;grid-template-columns:1fr 1fr;gap:32px;align-items:center
}
.fgoH4 .origins .card.pic {
  aspect-ratio:1
}
.fgoH4 .origins .txt {
  padding-left:110px
}
.fgoH4 .origins h2 {
  margin-bottom:8px
}
.fgoH4 .acc {
  margin-top:24px;display:flex;flex-direction:column;gap:8px
}
.fgoH4 .acc .row {
  background:var(--cream);border-radius:var(--r-card);overflow:hidden;transition:background .3s var(--ease)
}
.fgoH4 .acc .row.open {
  background:var(--white)
}
.fgoH4 .acc-btn {
  width:100%;display:flex;justify-content:space-between;align-items:center;gap:16px;text-align:left;font-weight:600;font-size:17px;line-height:24px;min-height:56px;padding:16px;transition:color .18s var(--ease)
}
.fgoH4 .acc-btn .ico {
  width:14px;height:14px;flex:none;transition:transform .45s var(--ease)
}
.fgoH4 .acc-btn:hover {
  color:var(--forest)
}
.fgoH4 .open>.acc-btn .ico {
  transform:rotate(45deg)
}
.fgoH4 .ac {
  display:grid;grid-template-rows:0fr;transition:grid-template-rows .45s var(--ease)
}
.fgoH4 .open>.ac {
  grid-template-rows:1fr
}
.fgoH4 .ac>div {
  overflow:hidden
}
.fgoH4 .ac .in {
  padding:0 16px 16px
}
.fgoH4 .ac p {
  max-width:60ch
}
.fgoH4 .ac .btn {
  margin-top:16px
}
/* ================= quality banner (Beam content_grid banner) ================= */
.fgoH4 .quality {
  padding:80px 0
}
.fgoH4 .banner {
  position:relative;aspect-ratio:2.379;border-radius:var(--r-banner);overflow:hidden;background:var(--cream)
}
.fgoH4 .banner img {
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover
}
.fgoH4 .banner::after {
  content:"";position:absolute;inset:0;background:linear-gradient(90deg,var(--scrim) 0%,rgba(20,20,20,.43) 34%,transparent 64%)
}
.fgoH4 .banner .in {
  position:relative;z-index:1;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;padding:64px 40px;color:var(--cream)
}
.fgoH4 .banner h2 {
  color:var(--cream)
}
.fgoH4 .banner p {
  max-width:430px;margin-top:12px;font-size:18px;line-height:29px
}
.fgoH4 .banner .btn {
  margin-top:40px
}
/* ================= reviews carousel (Beam caption-bar carousel) ================= */
.fgoH4 .reviews {
  padding:40px 0 48px;overflow:hidden
}
.fgoH4 .reviews h2 {
  text-align:center;margin-bottom:36px
}
.fgoH4 .rrow {
  display:flex;gap:16px;align-items:center;overflow-x:auto;scroll-snap-type:x mandatory;padding:0 calc(50% - 150px)
}
@media (min-width:1025px) {
.fgoH4 .rrow {
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 60px,#000 calc(100% - 60px),transparent);mask-image:linear-gradient(90deg,transparent,#000 60px,#000 calc(100% - 60px),transparent)
}
}
.fgoH4 .rtile {
  position:relative;flex:0 0 300px;height:393px;scroll-snap-align:center;background:var(--cream);border-radius:var(--r-tile);overflow:hidden
}
.fgoH4 .rtile.on {
  height:505px
}
.fgoH4 .rtile .bg {
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 0
}
.fgoH4 .rtile:not(.on) .bg {
  object-position:50% 100%
}
.fgoH4 .rtile .q {
  position:relative;z-index:1;padding:16px 20px 0
}
.fgoH4 .rtile .ttl {
  margin-top:10px
}
.fgoH4 .rtile blockquote {
  margin:6px 0 0
}
.fgoH4 .rtile .who {
  margin-top:8px
}
.fgoH4 .rtile .who .vb {
  color:var(--ink-2);margin-left:6px
}
.fgoH4 .rtile .cap {
  position:absolute;left:10px;right:10px;bottom:10px;z-index:1;display:flex;align-items:center;gap:10px;padding:8px;background:var(--chip-bg);border-radius:var(--r-card)
}
.fgoH4 .rtile .cap .th {
  flex:none;width:56px;height:56px;border-radius:4px;overflow:hidden;background:var(--cream)
}
.fgoH4 .rtile .cap .th img {
  width:100%;height:100%;object-fit:cover
}
.fgoH4 .rtile .cap .nm {
  min-width:0
}
.fgoH4 .rtile .cap .nm .b {
  font-size:14px;line-height:18px
}
.fgoH4 .rtile .cap .pr {
  color:var(--ink-2)
}
.fgoH4 .rtile .cap .add {
  position:relative;margin-left:auto;flex:none;width:32px;height:32px;border-radius:50%;border:1px solid var(--ink);color:var(--ink);display:flex;align-items:center;justify-content:center;transition:background .2s var(--ease),color .2s var(--ease)
}
.fgoH4 .rtile .cap .add::before {
  content:"";position:absolute;inset:-6px
}
.fgoH4 .rtile .cap .add .ico {
  width:14px;height:14px
}
.fgoH4 .rtile .cap .add:hover {
  background:var(--ink);color:#fff
}
/* ================= six claims band (Beam ingredients band) ================= */
.fgoH4 .claims {
  padding:80px 0 40px
}
.fgoH4 .claims h2 {
  max-width:14ch;margin-bottom:40px
}
.fgoH4 .cgrid {
  display:grid;grid-template-columns:repeat(6,1fr);gap:40px 32px
}
.fgoH4 .cell {
  display:flex;flex-direction:column;align-items:flex-start;border-top:1px solid var(--line);padding-top:16px
}
.fgoH4 .cell .h5 {
  min-height:48px
}
.fgoH4 .cell img {
  order:2;height:64px;width:auto;margin:16px 0 0
}
.fgoH4 .cell .cico {
  order:2;width:64px;height:64px;margin:16px 0 0;flex:none;fill:none;stroke:var(--forest);stroke-width:.9;stroke-linecap:round;stroke-linejoin:round
}
/* ================= category tiles (Beam content_slider, 7:8 tiles) ================= */
.fgoH4 .cats {
  padding:40px 0
}
.fgoH4 .tiles {
  display:grid;grid-template-columns:repeat(4,1fr);gap:32px
}
.fgoH4 .tile {
  position:relative;display:block;aspect-ratio:7/8;border-radius:var(--r-card);overflow:hidden;background:var(--cream);text-decoration:none
}
.fgoH4 .tile img {
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform 1.2s var(--ease)
}
.fgoH4 .tile:hover img {
  transform:scale(1.02)
}
.fgoH4 .tile::after {
  content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 30%,rgba(20,20,20,.28) 65%,rgba(20,20,20,.45) 100%)
}
.fgoH4 .tile .in {
  position:absolute;inset:0;z-index:1;display:flex;align-items:flex-end;justify-content:space-between;gap:20px;padding:24px
}
.fgoH4 .tile .arr {
  flex:none;width:48px;height:48px;color:#fff;display:flex;align-items:center;justify-content:center
}
.fgoH4 .tile.light .h-tile, .fgoH4 .tile.light .arr {
  color:var(--ink)
}
/* ================= footer (PDP materials, Beam newsletter composition) ================= */
.fgoH4 .foot {
  background:var(--green);color:var(--cream);padding:80px 0 0;overflow:hidden
}
.fgoH4 .ftop {
  display:grid;grid-template-columns:1fr 1fr;gap:32px;padding-bottom:40px;border-bottom:1px solid rgba(245,243,231,.25)
}
.fgoH4 .fnews h2 {
  color:var(--cream);margin-bottom:16px
}
.fgoH4 .fnews form {
  display:grid;grid-template-columns:1fr auto;gap:12px;margin-top:24px;max-width:514px
}
.fgoH4 .fnews .note {
  margin-top:12px;color:var(--cream)
}
.fgoH4 .fcols {
  display:grid;grid-template-columns:repeat(3,1fr);gap:32px
}
.fgoH4 .fcols>div {
  border-top:1px solid rgba(245,243,231,.4);padding-top:16px
}
.fgoH4 .fcols h5 {
  color:var(--cream);letter-spacing:.14em;text-transform:uppercase;font-size:13px;margin-bottom:10px
}
.fgoH4 .fcols ul {
  list-style:none;margin:0;padding:0
}
.fgoH4 .fcols li {
  margin:0 0 10px;line-height:20px
}
.fgoH4 .fcols a {
  text-decoration:none;font-size:15px;line-height:20px
}
.fgoH4 .fvp {
  list-style:none;margin:24px 0 0;padding:0;display:flex;flex-direction:column;gap:14px;max-width:430px
}
.fgoH4 .fvp li {
  display:flex;align-items:flex-start;gap:12px;font-size:16px;line-height:24px
}
.fgoH4 .fvp .ico {
  width:16px;height:16px;margin-top:4px;flex:none;stroke-width:2.4
}
.fgoH4 .fcols a:hover {
  text-decoration:underline;text-underline-offset:4px
}
.fgoH4 .social {
  display:flex;gap:14px;margin-top:32px;gap:24px
}
.fgoH4 .social a {
  width:auto;height:auto;border:0;border-radius:0;padding:4px;display:flex;align-items:center;justify-content:center;transition:opacity .2s var(--ease)
}
.fgoH4 .social a:hover {
  opacity:.7
}
.fgoH4 .social .ico {
  width:20px;height:20px;stroke-width:1.6
}
.fgoH4 .legal {
  display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px 24px;padding:32px 0;font-size:14px;line-height:20px
}
.fgoH4 .legal ul {
  list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:12px 20px
}
.fgoH4 .legal a {
  text-decoration:none
}
.fgoH4 .legal a:hover {
  text-decoration:underline
}
.fgoH4 .wordmark {
  display:flex;justify-content:center;align-items:baseline;gap:.15em;font-size:clamp(36px,10.4vw,150px);line-height:.8;height:.62em;overflow:hidden;color:var(--cream);white-space:nowrap;margin-top:32px
}
.fgoH4 .wordmark .a {
  font-family:"Founders XCond","Founders",sans-serif;font-weight:700;letter-spacing:.01em
}
.fgoH4 .wordmark .b {
  font-family:Georgia,serif;font-style:italic;font-size:.98em
}
/* ================= responsive ================= */
@media (max-width:1279px) {
.fgoH4 .nav.right .hide-md {
  display:none
}
}
@media (max-width:1024px) {
.fgoH4 {
  --gutter:16px;--head-h:53px
}
.fgoH4 .hdr .wrap {
  grid-template-columns:auto 1fr auto
}
.fgoH4 .hdr .nav.left {
  display:none
}
.fgoH4 .hdr .m-only {
  display:inline-flex
}
.fgoH4 .hdr .nav.right a:not(.icon-btn) {
  display:none
}
.fgoH4 .logo {
  height:40px
}
.fgoH4 .h2 {
  font-size:32px
}
.fgoH4 .h-hero {
  font-size:40px;line-height:1
}
.fgoH4 .h-tile {
  font-size:32px
}
/* hero: full-bleed 2:3, copy over the cream top, left on the 16px gutter */
.fgoH4 .hero>picture img {
  object-position:center bottom
}
.fgoH4 .hero .wrap {
  padding:0;max-width:none
}
.fgoH4 .hero .item {
  aspect-ratio:2/3;justify-content:flex-start;padding:32px var(--indent);align-items:center;text-align:center
}
.fgoH4 .hero .proof {
  flex-direction:row;justify-content:center;flex-wrap:wrap;gap:6px 8px
}
.fgoH4 .hero h1 {
  width:auto;margin:16px 0 8px
}
.fgoH4 .hero .lede {
  font-size:16px;line-height:24px
}
.fgoH4 .hero .acts {
  flex-direction:column;align-items:center;gap:12px;margin-top:16px
}
/* marquee */
.fgoH4 .press {
  padding:24px 0
}
.fgoH4 .press .it {
  padding:0 36px
}
/* best sellers: 1.2 cards, the next peeks */
.fgoH4 .sellers {
  padding:40px 0 24px
}
.fgoH4 .sellers .wrap {
  padding:0
}
.fgoH4 .cards {
  display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x mandatory;padding:0 var(--indent);scroll-padding:0 var(--indent)
}
.fgoH4 .pcard {
  flex:0 0 calc((100% - 3.2px)/1.2);scroll-snap-align:start
}
/* origins: text and accordion first, 3:2 photograph below */
.fgoH4 .origins {
  padding:40px 0
}
.fgoH4 .origins .split {
  display:flex;flex-direction:column;align-items:flex-start;gap:25px
}
.fgoH4 .origins .txt {
  order:1;padding-left:0
}
.fgoH4 .origins .card.pic {
  order:0;aspect-ratio:3/2;width:calc(100% + 32px);margin-left:-16px;border-radius:0
}
/* banner: portrait, full-bleed, copy at the bottom */
.fgoH4 .quality {
  padding:0
}
.fgoH4 .quality .wrap {
  padding:0;max-width:none
}
.fgoH4 .banner {
  aspect-ratio:.537;border-radius:0
}
.fgoH4 .banner::after {
  background:linear-gradient(0deg,var(--scrim) 0%,rgba(20,20,20,.43) 34%,transparent 64%)
}
.fgoH4 .banner .in {
  justify-content:flex-end;padding:40px var(--indent)
}
.fgoH4 .banner .btn {
  margin-top:24px
}
/* reviews: one tile size, first at the gutter */
.fgoH4 .reviews {
  padding:40px 0
}
.fgoH4 .reviews h2 {
  margin-bottom:29px
}
.fgoH4 .rrow {
  padding:0 70px;gap:8px;scroll-padding:0 70px
}
.fgoH4 .rtile, .fgoH4 .rtile.on {
  flex-basis:250px;height:393px;scroll-snap-align:center
}
.fgoH4 .rtile blockquote p {
  font-size:15px;line-height:20px
}
/* claims: two columns */
.fgoH4 .claims {
  padding:40px 0
}
.fgoH4 .claims h2 {
  margin-bottom:24px
}
.fgoH4 .cgrid {
  grid-template-columns:1fr 1fr;gap:24px
}
/* categories: 1.4 tiles */
.fgoH4 .cats {
  padding:40px 0
}
.fgoH4 .cats .wrap {
  padding:0
}
.fgoH4 .tiles {
  display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x mandatory;padding:0 var(--indent);scroll-padding:0 var(--indent)
}
.fgoH4 .tile {
  flex:0 0 calc((100% - 6.4px)/1.4);scroll-snap-align:start
}
/* footer: newsletter first, link columns two-up */
.fgoH4 .foot {
  padding-top:48px
}
.fgoH4 .ftop {
  grid-template-columns:1fr;gap:40px
}
.fgoH4 .fnews form {
  max-width:none
}
.fgoH4 .fcols {
  grid-template-columns:1fr;gap:10px
}
.fgoH4 .fbox {
  margin-top:32px
}
.fgoH4 .wordmark {
  margin-top:16px
}
}
@media (prefers-reduced-motion:reduce) {
.fgoH4 *, .fgoH4 *::before, .fgoH4 *::after {
  animation:none!important;transition:none!important;scroll-behavior:auto!important
}
}
/* ---- tiles: Tea Bags dominant (3.27% vs Loose Leaf 0 orders from 140 sessions) ---- */
@media (min-width:1025px) {
.fgoH4 .cats .tiles {
  display:grid!important;grid-template-columns:1.7fr 1fr 1fr 1fr;gap:32px;overflow:visible
}
.fgoH4 .cats .tiles .tile {
  flex:none!important;width:auto!important;min-width:0
}
}
/* ---- best sellers: one row with a peek, never a second row of empty cells ---- */
@media (min-width:1025px) {
.fgoH4 .sellers .cards {
  display:flex!important;gap:32px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth
}
.fgoH4 .sellers .pcard {
  flex:0 0 calc((100% - 192px)/4);scroll-snap-align:start;min-width:0
}
.fgoH4 .sellers .cnav {
  display:flex
}
}
/* below 1280 a 4-up card is too narrow for a two-line product name: go 3-up */
@media (min-width:1025px) and (max-width:1279px) {
.fgoH4 .sellers .pcard {
  flex:0 0 calc((100% - 160px)/3)
}
}
.fgoH4 .sellers .cnav {
  display:flex;gap:6px
}
@media (max-width:1024px) {
.fgoH4 .sellers .cnav {
  display:none
}
}
.fgoH4 .sellers .shead {
  display:flex;align-items:flex-end;justify-content:space-between;gap:24px;margin-bottom:32px
}
.fgoH4 .sellers .sact {
  display:flex;align-items:center;gap:24px
}
@media (max-width:1024px) {
.fgoH4 .sellers .shead {
  padding:0 var(--indent);margin-bottom:20px
}
.fgoH4 .sellers .sact .link {
  font-size:15px
}
}

/* ---- 1. THE BUTTONS ----------------------------------------------------
   Nate, on the best-seller cards: "fix the issue in the buttons."

   Two faults, one you can see and one waiting to happen.

   THE HOVER WAS BLACK. Every button on this page fills rgb(20,20,20) on
   hover -- the solid one darkens to it, the ghost one fills with it. On a
   cream ground under forest-green headings, a near-black pill is the loudest
   object in the section, and black is not where this palette goes. The brand
   has a named accent for exactly this. A ghost button now fills FOREST with
   cream type, which is to say it becomes the page's own solid button; and the
   solid button lifts from forest to Organic Green rather than dropping to
   black. No black anywhere in the hover system.

   THE LABEL COULD NOT WRAP. The card button is width:100% and the base .btn
   is white-space:nowrap, so the label is pinned to one line inside a fixed
   272px box. Measured at 1440: "Shop hibiscus flowers - cut & sifted" needs
   270px of that 272. Two pixels of slack. The row only holds together because
   of which products the collection happens to be serving today -- one longer
   name and the text runs out through the border.

   So the label wraps, the arrow is pinned out of the wrap, the height grows
   from a floor rather than being fixed, and margin-top:auto drops every button
   to the bottom of its card so a two-line label cannot stagger the row. A
   short label renders at exactly the height it did before. */
.fgoH4 .btn:hover { background: var(--green); }
.fgoH4 .btn.ghost:hover { background: var(--forest); color: var(--cream); border-color: var(--forest); }
/* The row was already stretching its cards to a common height. Setting
   height:100% on the card CANCELLED that -- an explicit cross size opts an
   item out of stretch, and 100% of a content-sized flex container resolves to
   auto, so every card except the tallest collapsed back to its own content and
   the buttons staggered by 22px wherever one card had a Subscribe & Save line
   the others did not. The stretch is stated instead, and the card keeps an
   auto height so it can be stretched. */
.fgoH4 .sellers .cards { align-items: stretch; }
.fgoH4 .pcard { height: auto; }
.fgoH4 .pcard .btn {
  margin-top: auto;
  height: auto;
  min-height: 48px;
  padding: 13px 16px;
  white-space: normal;
  line-height: 18px;
  text-align: left;
  gap: 8px;
}
.fgoH4 .pcard .btn .lbl { min-width: 0; text-wrap: balance; }
.fgoH4 .pcard .btn .ico { flex: none; }
/* the meta lines keep their own spacing; only the button is pushed down */
.fgoH4 .pcard .meta, .fgoH4 .pcard .subline { margin-bottom: 0; }


/* ---- 2. THE CENTRED SECTION HEAD HAD NO SPACE UNDER IT ------------------
   Nate: "spacing issue with headline and photos, fix symmetry."

   Measured in the People section at 1440: heading to lede 0px, lede to the
   photo rail 0px, photo rail to the review cards 40px, cards to the stat bar
   40px. Every interval in the section was 40 except the two around the
   heading, which were nothing -- so the rail read as though it were part of
   the lede rather than the next thing down.

   The head now carries the same 40 the rest of the section uses (24 on the
   phone, matching the smaller gaps there), and the lede gets a little air
   under the heading rather than sitting on its baseline. */
.fgoH4 .sec-head { margin-bottom: 40px; }
.fgoH4 .sec-head .lede { margin-top: 10px; }
@media (max-width: 1024px) {
  .fgoH4 .sec-head { margin-bottom: 24px; }
}

/* ---- 3. THE RAIL CARRIES REVIEWS AS WELL AS LOGOS -----------------------
   The rating and the quotes ride the same scroll as the mastheads, so they
   have to sit on the same baseline and read at the same weight -- otherwise
   the rail looks like two components that happen to be touching, which is
   what it replaced. The reviewer name takes the quiet ink so the quote itself
   is the thing you catch as it passes. */
.fgoH4 .press .it.rating,
.fgoH4 .press .it.quote { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; }
.fgoH4 .press .it.rating .stars { height: 14px; color: var(--green); }
.fgoH4 .press .it.rating .stars svg { width: 14px; height: 14px; }
.fgoH4 .press .it.rating .b { font-weight: 600; color: var(--ink); }
.fgoH4 .press .it.quote .nm { color: var(--ink-2); }
.fgoH4 .press .it.quote .qt { font-weight: 600; color: var(--ink); }


/* ---- 4. THE LOGO BAR STANDS STILL ---------------------------------------
   Nate: "bring back this bar -- just in the Beam theme."

   The bar he means is the old one: a single centred line, the mastheads, a
   hairline, the retailers. What comes back is its LAYOUT, not its typography
   -- the labels stay Beam's sentence-case caption rather than the old
   letterspaced caps, because the ask was to bring the bar into this theme
   rather than bring the old theme along with it.

   It wraps on narrow screens instead of overflowing, so the two groups stack
   before anything is cut off, and the hairline hides once they are stacked --
   a vertical rule between two rows separates nothing. */
.fgoH4 .press.is-static { overflow: visible; }
.fgoH4 .press.is-static .track { width: auto; animation: none; justify-content: center; }
.fgoH4 .press.is-static .grp { flex-wrap: wrap; justify-content: center; height: auto; row-gap: 16px; }
.fgoH4 .press.is-static .it { padding: 0 24px; }
.fgoH4 .press.is-static .rule {
  flex: none; width: 1px; height: 24px; background: var(--line); margin: 0 12px;
}
@media (max-width: 860px) {
  .fgoH4 .press.is-static .it { padding: 0 14px; }
  .fgoH4 .press.is-static .rule { display: none; }
}


/* ---- 5. THE HERO FILLS THE WINDOW --------------------------------------
   Measured before: 549px tall at 1440x900, stopping 297px above the fold,
   and still 549 at 1920x1080 because the height came from a 21:9 ratio on a
   rail that is capped at 1280. A wider screen bought no more hero.

   It now takes the window height less the header and a deliberate peek of the
   bar underneath, which is the part that tells you to scroll. The 21:9 stays
   as the floor so a short laptop window cannot crush it, and svh rather than
   vh so a phone browser's collapsing toolbar does not make it jump. Desktop
   only -- see the note in fgo-h4-hero.liquid. */
@media (min-width: 1025px) {
  .fgoH4 .hero.is-tall .item {
    min-height: calc(100svh - var(--h4-hero-trim, 115px));
  }
}

/* ---- 6. THE RAIL'S SPEED IS ITS OWN ------------------------------------
   One duration for a rail of logos and a rail of quotes is one of them wrong.
   Quotes have to be readable as they pass. */
.fgoH4 .press .track { animation: h4marquee var(--h4-marquee-s, 46s) linear infinite; }
.fgoH4 .press.is-static .track { animation: none; }

/* ---- 7. THE PINNED CLAIM -----------------------------------------------
   The rating stands at the head of the rail and the quotes run past it, so
   the count is on screen the whole time rather than once a cycle. The rule
   after it is the same hairline the static bar uses between its two groups.

   Under 760 the pin takes its own line: 200px of a 390px screen is most of
   the width the quotes need to be legible. */
.fgoH4 .press.has-pin .bar { display: flex; align-items: center; }
.fgoH4 .press.has-pin .vp { flex: 1 1 auto; min-width: 0; overflow: hidden; }
.fgoH4 .press.has-pin .pin {
  flex: none; display: inline-flex; align-items: center; gap: 8px;
  padding-left: var(--gutter); padding-right: 24px; position: relative; white-space: nowrap;
}
.fgoH4 .press.has-pin .pin::after {
  content: ''; position: absolute; right: 0; top: 50%; transform: translateY(-50%);
  width: 1px; height: 24px; background: var(--line);
}
.fgoH4 .press.has-pin .pin .stars { height: 14px; color: var(--green); }
.fgoH4 .press.has-pin .pin .stars svg { width: 14px; height: 14px; }
.fgoH4 .press.has-pin .pin .b { font-weight: 600; color: var(--ink); }
@media (max-width: 760px) {
  .fgoH4 .press.has-pin .bar { flex-wrap: wrap; }
  .fgoH4 .press.has-pin .pin {
    width: 100%; justify-content: center; padding: 0 var(--gutter) 10px;
  }
  .fgoH4 .press.has-pin .pin::after { display: none; }
  .fgoH4 .press.has-pin .vp { flex-basis: 100%; }
}


/* ---- 8. THE COPY GETS ITS OWN HALF OF THE PHOTOGRAPH --------------------
   Nate: "compare that to Beam."

   The difference was never the height, it was the collision. Beam's lineup
   occupies the right of the frame and the left is a plain wall, so the copy
   has somewhere to be. Ours ran the headline straight across the Chamomile
   and Turmeric pouches -- unreadable type on top of ruined packaging, the one
   failure that wrecks both halves at once.

   best_herop.png is that composition: pouches from about 39% of the width
   rightward, warm wall and dappled light to the left of it. So the copy is
   capped to stop before they start, and the cap has to move with the window
   because the rail centres while the photograph stays full-bleed:

     available = 0.37 x viewport  -  content-left
     content-left = max(80, (viewport - 1440)/2 + 80)

   which is the three-way min below -- 430 at 1440, 380 at 1920, 318 at 2400,
   and the narrow branch for windows under 1440 where the rail is not yet
   centred. The headline gives up its own 40% width, since the column now
   holds the line. */
@media (min-width: 1025px) {
  .fgoH4 .hero .copy {
    max-width: min(430px, calc(37vw - 80px), calc(630px - 13vw));
  }
  .fgoH4 .hero h1 { width: auto; }
}

/* ---- 9. THE PINNED CLAIM SITS ON THE PAGE RAIL --------------------------
   Nate: "why is it aligned far left?" Because it was: the pin was padded by a
   flat 80px from the viewport edge while every other thing on the page sits on
   a 1440 rail that centres itself. At 1440 those are the same number, which is
   why it looked right here and wrong on his wider screen -- measured at 2020,
   the headings started at 370 and the pin started at 80. 290px adrift.

   It now takes the greater of the two, so it lands on the rail at every width. */
.fgoH4 .press.has-pin .pin {
  padding-left: max(var(--gutter), calc((100% - 1440px) / 2 + var(--gutter)));
}

/* ---- 10. THE STARS SIT ON THE TEXT'S OPTICAL CENTRE ---------------------
   Nate: "this star rating and text need to align horizontally properly."

   The boxes were already centred to the pixel -- measured, the two midpoints
   were identical. The problem is that a line of digits and capitals has its
   visual mass ABOVE the middle of its line box, because the box reserves room
   for descenders that "150,000+ Trusted Reviews" does not use. Centring the
   glyphs on the box centre therefore lands them low against the text.

   For 15px type in a 20px line the digits run from about 3.2 to 13.8, centre
   8.5 against a box centre of 10. The stars come up by that difference, as
   position rather than margin so nothing in the layout moves. */
/* SUPERSEDED by note 62: the same correction, derived from the typeface's
   metrics instead of eyeballed, so it holds at every size this rail is set
   in rather than only at the one it was nudged against. */


/* ---- 11. THE CATEGORY TILES WERE NOT A ROW ------------------------------
   Measured at 1440: tile one 428x489, tiles two to four 252x288. The grid was
   1.7fr 1fr 1fr 1fr -- a deliberate hero tile in the prototype -- and because
   every tile also carries aspect-ratio 7/8, the extra width became extra
   HEIGHT. So three tiles floated at the top of a 489px row with 200px of
   nothing underneath them, which is what read as misplaced.

   A hero tile works when the first category earns the emphasis. Tea bags,
   Superfoods, K-Cups and Loose leaf are four formats of equal standing, and
   nothing on the page argues otherwise, so they get four equal columns:
   296x338 each on the 1280 rail.

   The title also needs room to keep one line -- "Loose leaf" was wrapping
   against the arrow at 252 and clipping. */
.fgoH4 .cats .tiles { grid-template-columns: repeat(4, 1fr) !important; }
.fgoH4 .tile .in { gap: 12px; }
.fgoH4 .tile .h-tile { min-width: 0; text-wrap: balance; }
.fgoH4 .tile .arr { flex: none; }
@media (max-width: 1024px) {
  .fgoH4 .cats .tiles { grid-template-columns: none !important; }
}


/* ---- 12. THE REVIEW BLOCK IS ONE SECTION -------------------------------
   The People section and the carousel now make a single argument -- "real
   customers, real reviews" -- so the seam between them has to stop looking
   like a section break. The carousel drops its top padding when it is running
   as the tail of that block, and the People section drops its bottom padding
   to meet it. */
.fgoH4 .reviews.is-tail { padding-top: 0; }
.fgoH4 .people + .fgoH4 .reviews.is-tail,
.fgoH4 .reviews.is-tail { margin-top: -8px; }

/* ---- 13. THE BELIEF BLOCK CARRIES A CTA --------------------------------
   Beam's commitment-to-quality block ends in one button into a collection;
   ours ended in an accordion and stopped. The button sits under the rows, on
   the text column, not inside a row. */
.fgoH4 .origins .txt > .btn { margin-top: 28px; }


/* ---- 14. "LOOSE LEAF" COULD NOT BE READ --------------------------------
   Nate: "loose leaf text hard to read here."

   The tile had a `light` flag that swaps the title to ink, and it was set --
   but the photograph behind it is a pale green that goes almost white exactly
   where the title sits, so dark-on-pale was still failing, and a scrim built
   for white-on-dark was doing nothing for it.

   Legibility on a photograph somebody else can swap cannot rest on the
   photograph. Every tile now carries a gradient from its own foot, and the
   light variant carries a pale one in the other direction, so whichever way
   the picture goes the type has a ground of its own. The white tiles gain
   contrast too -- the old scrim was flat and the bottom of a photograph is
   where its detail usually is. */
.fgoH4 .tile::after {
  background: linear-gradient(to top, rgba(0,0,0,.55) 0%, rgba(0,0,0,.28) 26%, rgba(0,0,0,0) 58%) !important;
}
.fgoH4 .tile.light::after {
  background: linear-gradient(to top, rgba(255,255,255,.80) 0%, rgba(255,255,255,.45) 26%, rgba(255,255,255,0) 58%) !important;
}
.fgoH4 .tile.light .h-tile, .fgoH4 .tile.light .arr { color: var(--forest); }


/* ---- 15. FGO'S OWN ICONS IN THE CLAIMS BAND ----------------------------
   The band was drawing generic glyphs -- a globe, a shield, two people -- when
   FGO has a real icon set already running in the marquee bar. An <img> has to
   be told to behave like the <svg> it replaces: same box, same place in the
   cell's order, and no baseline gap under it. */
.fgoH4 .cell img.cico {
  order: 2; height: 44px; width: 44px; margin: 18px 0 0;
  display: block; object-fit: contain; object-position: left center;
}


/* ---- 16. THE BUY CARD IN A BEAM RAIL ------------------------------------
   The card is built for a grid cell and this is a scroll rail, so it needs to
   fill the rail's track rather than size itself, and the rail must not inherit
   the grid's own display. Everything else about the card -- tile, rows, the
   add-to-cart -- is its own stylesheet's business and is left alone. */
.fgoH4 .sellers.is-buy .cards { display: flex !important; }
.fgoH4 .sellers.is-buy .pcard { display: block; }
.fgoH4 .sellers.is-buy .fgColCard { width: 100%; height: 100%; }
/* the rail clips its own overflow, so a focus ring on a card has to sit inside it */
.fgoH4 .sellers.is-buy .fgColCard:focus-visible { outline-offset: -3px; }


/* ---- 17. THE CTA, AGAINST BEAM'S ---------------------------------------
   Side by side, three differences and only one of them was the words.

   SIZE. Beam's pill is taller than ours and the type inside it is a step up,
   which is most of why theirs reads as the page's one instruction and ours
   read as a link that had been given a background. 48px and 16px go to 56 and
   17, with the padding opened to match so the pill does not just get fatter.

   THE GLYPH. Ours was the same chevron the carousel uses for "next". An arrow
   with a shaft says go somewhere; a chevron says there is another one along.
   The arrow also needs a touch more air than a chevron did.

   WEIGHT. Founders serves Light, Regular and Semibold -- there is no 500 and
   no roman 700 -- so 600 is the top of the ramp and asking for more produces
   a synthetic face. It stays at 600 and takes its presence from size. */
.fgoH4 .hero .btn,
.fgoH4 .origins .txt > .btn {
  height: 56px; padding: 0 30px; font-size: 17px; line-height: 17px; gap: 12px;
}
.fgoH4 .hero .btn .ico,
.fgoH4 .origins .txt > .btn .ico { width: 20px; height: 20px; }


/* ---- 18. THE CARD LOST ITS COLOURS -------------------------------------
   Nate: "we lost our nice product cards", "white on hover here", and the
   black Add to cart button -- all three are one mistake.

   fgo-col-grid-css declares the card's palette on #collection .fgColGrid:

     --ink: var(--fg-deep-ink);  --tile: var(--fg-tile);  --accent: var(--fg-accent);

   I put the rail on #collection but dropped the fgColGrid class, because it
   carries display:grid and this is a scroll rail. Dropping it took the three
   custom properties with it -- and .fgoH4 declares an --ink of its own, the
   Beam near-black #141414. So the button inherited THAT and turned black; the
   tile had no --tile at all and went white, which is why the packs stopped
   floating and started sitting in a box; and the hover rule, which is
   background: var(--accent) with no fallback, resolved to nothing and made
   the button transparent with cream type on cream. Invisible on hover.

   The properties are declared here instead, so the rail can stay a rail. */
.fgoH4 .sellers.is-buy .cards {
  --ink: var(--fg-deep-ink, #023A1F);
  --ink-soft: var(--fg-ink-soft, #3F6B4F);
  --tile: var(--fg-tile, #EAE2CF);
  --accent: var(--fg-accent, #046A38);
}

/* ---- 19. THE HERO WAS 1680px WIDE IN A 1440px WINDOW -------------------
   227px of horizontal page overflow, and the offender was the hero.

   .hero .item carries aspect-ratio: 21/9, and I gave it min-height to make it
   fill the window. An aspect ratio resolves in BOTH directions: with the
   height forced to 720, the box computed its own width as 720 x 21/9 = 1680
   and pushed the page sideways. The ratio and the min-height were each doing
   what they were told and fighting.

   Once the hero is filling the window the ratio has no job left, so the tall
   variant drops it and keeps the height rule alone. */
@media (min-width: 1025px) {
  .fgoH4 .hero.is-tall .item { aspect-ratio: auto; width: 100%; }
}

/* ---- 20. ONE SIZE FOR EVERY MARK IN THE BAND ---------------------------
   Nate: "would prefer icons all to be same size?" They were not: the two
   official seals came in at 64 and the four line icons at 44, because seals
   and glyphs had been styled as different things. They are one row of six and
   should read as one row of six. 56px for all of them, and the seals keep
   their own proportions inside that height rather than being squared. */
.fgoH4 .cell img,
.fgoH4 .cell img.cico,
.fgoH4 .cell .cico {
  height: 56px; width: auto; max-width: 92px; margin: 18px 0 0;
  object-fit: contain; object-position: left center;
}


/* ---- 21. THE EYEBROW ON THE PHOTO PANEL --------------------------------
   Small, tracked, and in the same cream as the heading so it reads as part of
   the same block rather than a caption that wandered in. It sits on a
   photograph, so it takes the scrim's contrast with everything else in the
   panel; it is never the only thing carrying meaning. */
.fgoH4 .banner .in .eyebrow {
  margin: 0 0 14px;
  font-size: 13px; line-height: 13px; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase;
  color: var(--cream); opacity: .85;
}
@media (max-width: 760px) {
  .fgoH4 .banner .in .eyebrow { margin-bottom: 10px; font-size: 12px; }
}


/* ---- 22. THE COPY COLUMN, MEASURED OFF THE PHOTOGRAPH -------------------
   Nate: "text feels too narrow, this area can stretch a bit -- but fully
   responsive, don't want product clipping."

   The old cap was drawn off 37% of the viewport, which was where I guessed
   the products began. In best_herop.png the leftmost pouch actually starts at
   about 43% -- the eight points between the two guesses are the width the
   headline was missing, and why it broke to three lines.

   The photograph is the original again, so the leftmost pouch is back at 43%
   of the frame and the cap goes back with it: the smaller of 520px, 43vw minus
   the gutter below 1440, and 620 minus 7vw above it, where the rail centres
   and the text column moves right faster than the pouches do. 520 at 1440,
   486 at 1920, 452 at 2400, 393 at 1100. */
@media (min-width: 1025px) {
  .fgoH4 .hero .copy {
    max-width: min(520px, calc(43vw - 80px), calc(620px - 7vw));
  }
  .fgoH4 .hero .lede { max-width: 460px; }
}

/* ---- 23. THE PHONE HERO WAS UNREADABLE ---------------------------------
   The headline, the lede and the button were all being read THROUGH a pouch:
   copy over a photograph whose subject fills it. No amount of scrim fixes a
   layout where the words and the product want the same 390 pixels.

   Beam does not overlay on a phone either -- copy on the ground, packs
   underneath. So the phone hero unstacks: the picture leaves the absolute
   layer and becomes a block under the copy, at its own ratio, and the section
   carries the cream behind both. No overlay, no scrim, no clipping, and the
   packs get the full width instead of a third of it.

   The overlay is still available per-section for a crop with real empty space
   in it -- see the Phone layout setting. */
@media (max-width: 1024px) {
  .fgoH4 .hero.m-stack { display: flex; flex-direction: column; background: var(--cream); }
  .fgoH4 .hero.m-stack > picture {
    position: static; order: 2; display: block; width: 100%; line-height: 0;
  }
  .fgoH4 .hero.m-stack > picture img {
    position: static; width: 100%; height: auto; object-fit: contain;
  }
  .fgoH4 .hero.m-stack .wrap { order: 1; }
  .fgoH4 .hero.m-stack .item {
    aspect-ratio: auto; min-height: 0;
    padding: 28px var(--indent) 24px;
    justify-content: flex-start; align-items: center; text-align: center;
  }
  .fgoH4 .hero.m-stack .copy { max-width: 34ch; margin-inline: auto; }
  .fgoH4 .hero.m-stack .lede { max-width: none; }
  .fgoH4 .hero.m-stack .acts { flex-direction: row; justify-content: center; }
  .fgoH4 .hero.m-stack .btn { height: 52px; font-size: 16px; }
}

/* ---- 24. THE PACKS WERE SWIMMING IN THEIR TILES -------------------------
   Nate: "how do we get larger, more zoomed in product panels here?"

   The card insets its pack by 9% so the photograph's own near-white ground
   can be erased against the tile and the pack appears to float. At the size
   that card was built for, 9% is a margin. In a 252px rail tile it is 23px a
   side on a 3:4 box -- so the pack lost about a third of its area and started
   looking like a thumbnail of itself.

   The inset is a percentage, so it has to come down as the tile does. 3% at
   rail size keeps the float and gives the pack back its presence.

   The !important is not laziness: the card's own rule is #collection
   .fgColCardImg, and an id outranks any number of classes, so .fgoH4
   .sellers.is-buy .fgColCardImg loses to it however specific it looks.
   Measured proof -- the computed padding stayed 22.67px, which is 9% of a
   252px tile, until this was forced. */
/* SUPERSEDED by note 58. Trimming the inset from 9% to 3-4% was treating the
   symptom: any contain-plus-padding keeps the studio margin baked into the
   source and then adds more on top. The liked component crops it instead. */


/* ---- 25. THE PHONE HERO OVERLAYS THE PHOTOGRAPH ------------------------
   Nate: "any way to make the text overlay the background area of the image?
   Like Beam."

   Beam's phone hero is one picture: wall at the top with the copy on it, packs
   along the bottom. Our photograph could not be cropped into that shape -- its
   empty space runs down the LEFT, and the pouches reach to within 350px of the
   top edge out of 2160. So the wall was extended upward from the picture's own
   pixels (see the note in the crop script): same surface, same light, more of
   it. The phone file is now 1100x1734 with the packs in the bottom half.

   The frame takes that exact ratio rather than a rounded 2:3, so the packs sit
   where the photograph puts them instead of where a crop decides. The copy
   holds the top, which is wall at every phone width.

   The stacked layout stays available and stays the safe default for any future
   photograph that does not have this shape. */
@media (max-width: 1024px) {
  .fgoH4 .hero.m-over > picture img { object-position: center bottom; }
  .fgoH4 .hero.m-over .item {
    aspect-ratio: 1100 / 1734;
    justify-content: flex-start;
    padding-top: 30px;
  }
  .fgoH4 .hero.m-over .copy { max-width: 32ch; margin-inline: auto; }
  .fgoH4 .hero.m-over .acts { flex-direction: row; justify-content: center; }
  .fgoH4 .hero.m-over .btn { height: 52px; font-size: 16px; }
}


/* ---- 26. THE SNAPPED TILE HAD NOWHERE TO RISE --------------------------
   Nate: "kinda cool -- is this by design? The middle one merges with the
   above." Half by design.

   The centred tile being taller IS the carousel: it is how the snapped one
   says it is the snapped one. Measured, it is 505px against 393 -- 112px
   taller, so it grows 56px up and 56px down from the row.

   What was not by design is where those 56px went. When the carousel became
   the tail of the review block it lost its heading, and I zeroed its top
   padding so the two halves would read as one section. That left the tile
   growing straight through the section's top edge and across the change from
   the People section's cream to this one's paper -- which is exactly what he
   circled.

   64px of top padding gives the tile its 56 and 8 to spare, and the negative
   margin that was pulling the join tighter comes off. The two halves still
   read as one block; the seam was never doing that work, the shared heading
   was. */
.fgoH4 .reviews.is-tail { padding-top: 64px; margin-top: 0; }

/* ---- 27. THE CLAIM ICONS SAT AT SIX DIFFERENT HEIGHTS ------------------
   Nate: "these need better alignment."

   Four of the six labels run to one line and two run to two, and the icon
   simply followed its own label down. Six marks on six different baselines,
   in a row whose whole job is to read as a set.

   The cells already stretch to a common height in the grid, so the icon is
   pushed to the bottom of its cell instead of trailing its text. Now the
   labels can be any length they like and the marks still line up. */
.fgoH4 .cell img,
.fgoH4 .cell img.cico,
.fgoH4 .cell .cico {
  margin-top: auto; padding-top: 18px;
}


/* ---- 28. THE PICTURE AND ITS EVIDENCE, AS ONE BLOCK --------------------
   Two sections that make one argument have to be spaced like one argument.
   The full-bleed banner keeps its own generous room above, where the break
   from the reviews is real; underneath it the gap closes to the interval the
   claims band uses INSIDE itself, so the six marks read as the banner's own
   footnotes rather than the next thing down the page.

   The band also drops its heading's usual air for the same reason: "Just real
   ingredients" is now a subheading under a picture, not the top of a section. */
/* SUPERSEDED. This paired the field panel with a claims band that is now
   blocks on the panel itself -- and it put its padding inside the CARD rather
   than on the section, because of the .quality / .banner mix-up corrected in
   note 36. Left as a no-op rather than deleted, so the note stays with it. */


/* ---- 29. THE PHONE WAS SAYING TOO MUCH AT ONCE -------------------------
   Nate: "on mobile I'd like it less overwhelming with text all at once, maybe
   more breathing room between each section -- it's kinda messy."

   Counted on his screenshot, the 300px under the hero carried FOUR separate
   text streams: a pinned rating, a scrolling quote, two retail labels with
   five logos across two rows, and a section heading. Each is defensible on its
   own and together they are a wall.

   THE QUOTE RAIL STANDS DOWN ON A PHONE. It is the one that cannot be read
   anyway -- a quote crossing a 390px window at 56px a second is a smear, and
   the visitor gets the same reviews in full, sitting still, further down the
   page. What stays is the line that does the work at this width: the rating
   and the count, centred, one line. The rail is still there at 761px up.

   AND THE SECTIONS BREATHE. Phone padding went 40 to 52, and the two proof
   bars get real space above and below rather than sitting on each other. */
@media (max-width: 760px) {
  .fgoH4 .press.has-pin .vp { display: none; }
  .fgoH4 .press.has-pin .pin {
    width: 100%; justify-content: center; padding: 0 var(--gutter);
  }
  .fgoH4 .press.has-pin { padding: 18px 0; }
  .fgoH4 .press.is-static { padding: 22px 0 26px; }
}
/* SUPERSEDED by note 40, which sets one interval instead of one padding. */


/* ---- 30. THE PHONE BANNER WAS MOSTLY SKY -------------------------------
   Nate: "on mobile a ton of wasted space here, beautiful photo though."

   The phone crop was 590x1100 -- a portrait slice whose top two thirds are
   empty sky above the terraces. On a 390px screen that is nearly a full scroll
   of nothing, and the copy was crammed into the last strip and clipping.

   The crop is square now and taken across the curve of the terraces, so the
   photograph earns its height. The panel holds that ratio, the copy sits over
   the lower third where the field is darkest, and the scrim is deepened at the
   foot so two lines of type are safe on any part of it. */
/* SUPERSEDED by note 36: this was written when I had .banner as the section
   rather than the card, and it re-enabled the scrim the phone layout removes. */

/* ---- 31. THE CLAIMS BAND ON A PHONE ------------------------------------
   Nate: "which brings us back to this -- it's not really that attractive."

   Two columns of label-above-icon, each cell as tall as its longest label, six
   of them: a 700px stack of text with marks trailing underneath. It reads as a
   form, not as a set of credentials.

   Turned on its side it becomes a list, which is what it is. The mark leads at
   32px, the claim sits beside it on one or two lines, a hairline separates each
   from the next, and the whole thing is about a third of the height. The marks
   line up down a single edge, which is the alignment that was missing. */
@media (max-width: 760px) {
  .fgoH4 .claims .cgrid { grid-template-columns: 1fr; gap: 0; }
  .fgoH4 .claims .cell {
    flex-direction: row; align-items: center; gap: 14px;
    border-top: 1px solid var(--line); padding: 13px 0;
  }
  .fgoH4 .claims .cell:last-child { border-bottom: 1px solid var(--line); }
  .fgoH4 .claims .cell img,
  .fgoH4 .claims .cell .cico {
    order: 0; height: 32px; width: 32px; min-width: 32px;
    margin: 0; padding: 0; flex: none;
    object-fit: contain; object-position: center;
  }
  .fgoH4 .claims .cell .h5 { font-size: 14px; line-height: 19px; margin: 0; }
  .fgoH4 .claims .h2 { margin-bottom: 18px; }
}


/* ---- 32. THE REWARDS PANEL GETS THE BEAM TREATMENT ---------------------
   Nate: "our rewards component still needs the Beam treatment."

   What Beam's Dream Capsules panel does that ours was not: the copy occupies a
   defined column rather than running the width of the picture, the eyebrow is
   visible above the heading, and the type block is centred in its own height
   instead of settling at the foot. Ours had the copy along the bottom edge of
   a photograph, which on a phone put it in the last inch of a tall pink field.

   So the panel's copy takes the left half on desktop and the lower half on a
   phone, with the type block centred in it, and the phone crop is square (see
   the note in the crop script) so the pot and the hibiscus stay in shot.

   The scrim is drawn from the copy's side rather than from the foot, which is
   what lets a light photograph -- and this one is bright pink -- hold cream
   type at all. */
/* SUPERSEDED by note 46: this put the copy on the left, which is where the
   photograph's subject is, and then fought the collision with a scrim heavy
   enough to flatten the picture into a maroon slab. */
@media (max-width: 1024px) {
  .fgoH4 .h4-rewards picture, .fgoH4 .h4-rewards img { aspect-ratio: 1 / 1; }
  .fgoH4 .h4-rewards .in { max-width: none; justify-content: flex-end; }
  .fgoH4 .h4-rewards .banner::after {
    background: linear-gradient(to top, rgba(74,10,36,.88) 0%, rgba(74,10,36,.60) 44%, rgba(74,10,36,.06) 76%) !important;
  }
  .fgoH4 .h4-rewards .in .h2 { max-width: none; }
  .fgoH4 .h4-rewards .in p { max-width: none; }
}


/* ---- 33. THE FAQ COLUMN ------------------------------------------------
   The accordion is the Origins block's, so it needs nothing but a column to
   sit in: centred, and narrow enough that a question and its answer are read
   as a pair rather than scanned across the rail. 46ch is about eleven words a
   line, which is where a two-line answer stops needing a second glance. */
/* SUPERSEDED by note 43. */


/* ---- 34. THE MARKS MERGE INTO THE FIELD --------------------------------
   DESKTOP. The strip sits on the photograph's own foot, lifted off it by a
   gradient rather than a block, so the field keeps running underneath and the
   panel stays one picture. Six cells, hairline-separated at 22% cream -- enough
   to group them, not enough to draw a table. The label is small and tracked at
   the head of the row, so "Just real ingredients" reads as what the row is
   called rather than a second headline competing with the first.

   The drawn glyphs reverse to cream; the two certification marks do not. They
   carry their own grounds, they are licensed artwork, and a recoloured USDA
   seal is not a USDA seal. */
.fgoH4 .banner .marks {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  padding: 26px 40px 24px;
  background: linear-gradient(to top, rgba(2,26,14,.90) 0%, rgba(2,26,14,.74) 48%, rgba(2,26,14,0) 100%);
}
.fgoH4 .banner .marks-label {
  margin: 0 0 16px; font-size: 12px; line-height: 12px; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase; color: var(--cream); opacity: .78;
}
.fgoH4 .banner .marks-row {
  list-style: none; margin: 0; padding: 0;
  /* content-width columns, not six equal ones: "No artificial flavors, colors
     or preservatives" is three times the length of "Third-party tested", and
     forcing them into equal sixths broke the long one onto three lines while
     the short ones sat in half-empty cells. Sized to their content and spread
     across the rail, every label lands on one or two lines. */
  display: grid; grid-auto-flow: column; grid-auto-columns: max-content;
  justify-content: space-between; gap: 0;
}
.fgoH4 .banner .mark {
  display: flex; align-items: center; gap: 11px;
  padding: 0 16px; border-left: 1px solid rgba(245,243,231,.22);
}
.fgoH4 .banner .mark:first-child { border-left: 0; padding-left: 0; }
/* .fgoH4 .banner img is the PHOTOGRAPH's rule -- position:absolute, inset:0,
   100%/100%, object-fit:cover -- and it was catching these too, which threw
   every mark into the top-left corner of the card on top of the label. The
   marks are images inside a banner but they are not the banner's image. */
.fgoH4 .banner .marks img {
  position: static; inset: auto;
  width: 34px; height: 34px; object-fit: contain; object-position: center;
}
.fgoH4 .banner .mk { flex: none; }
.fgoH4 .banner .mk-ico { filter: brightness(0) invert(1); opacity: .92; }
.fgoH4 .banner .mt {
  max-width: 17ch;
  font-size: 12.5px; line-height: 15px; font-weight: 600; letter-spacing: .005em;
  color: var(--cream); text-wrap: balance;
}
/* the copy has to clear the strip it now shares a frame with -- desktop only,
   because on a phone the strip is below the copy, not over the picture */
@media (min-width: 1025px) {
  .fgoH4 .banner .in { padding-bottom: 150px; }
}

/* ---- 35. ONE CARD, UNSTACKED, ON A PHONE -------------------------------
   Nate: "whatever is needed to be amazing on mobile and feel like one
   component."

   Overlaying anything on a 390px-wide photograph costs either the picture or
   the words. So the card opens up INSIDE its own border: photograph on the top
   with the radius, cream underneath it, then the copy, then the marks one to a
   row. It is still one object with one outline and one shadow -- it has simply
   stopped pretending a phone is a small desktop.

   The marks get a full row each: the mark at 30px on the left, the claim
   beside it, a hairline between. That is the same list the claims band became
   on a phone, except now it is inside the card it belongs to. */
@media (max-width: 1024px) {
  /* the CARD stops being a fixed shape and becomes as tall as what is in it */
  .fgoH4 .banner { aspect-ratio: auto; height: auto; background: var(--cream); }
  .fgoH4 .banner::after { display: none; }
  .fgoH4 .banner picture { position: static; display: block; line-height: 0; }
  .fgoH4 .banner picture img { position: static; width: 100%; height: auto; aspect-ratio: 4 / 3; }
  .fgoH4 .banner .in {
    position: static; padding: 22px 20px 4px; color: var(--ink);
  }
  .fgoH4 .banner .in .h2 { color: var(--forest); }
  .fgoH4 .banner .in p { color: var(--ink-2); }
  .fgoH4 .banner .in .btn.on-photo { background: var(--forest); color: var(--cream); }
  .fgoH4 .banner .marks {
    position: static; padding: 18px 20px 22px;
    background: none;
  }
  .fgoH4 .banner .marks-label { color: var(--ink-2); opacity: 1; margin-bottom: 4px; }
  .fgoH4 .banner .marks-row {
    grid-auto-flow: row; grid-auto-columns: auto; grid-template-columns: 1fr;
    justify-content: stretch;
  }
  .fgoH4 .banner .mt { max-width: none; }
  .fgoH4 .banner .mark {
    padding: 12px 0; border-left: 0; border-top: 1px solid var(--line); gap: 13px;
  }
  .fgoH4 .banner .mark:first-child { padding-left: 0; }
  .fgoH4 .banner .marks img { width: 30px; height: 30px; }
  .fgoH4 .banner .mk-ico { filter: none; opacity: 1; }
  .fgoH4 .banner .mt { color: var(--ink); font-size: 14px; line-height: 18px; }
}


/* ---- 36. THE MARKS NEED A GROUND OF THEIR OWN --------------------------
   Nate: "the icons get lost, especially certified organic -- needs a white
   background or something to stand out."

   He is right and the USDA seal is the proof: it is dark green and brown, and
   it was sitting on a dark green field. Reversing the drawn glyphs to cream
   helped them and did nothing for the two seals, because a certification mark
   cannot be recoloured -- that artwork is licensed and a white USDA seal is
   not a USDA seal.

   So instead of changing the marks, they each get a ground. A cream plate
   behind every one of the six: the seals sit on the white they were drawn for,
   the glyphs go back to their own ink instead of being reversed, and the row
   reads as six marks rather than six smudges. A rounded square rather than a
   circle, because one of the two seals is a rectangle and a circle would crop
   it. */
.fgoH4 .banner .mk {
  background: var(--cream);
  border-radius: 10px;
  padding: 5px;
  box-shadow: 0 1px 2px rgba(0,0,0,.18);
}
.fgoH4 .banner .marks img.mk { width: 40px; height: 40px; }
.fgoH4 .banner .mk-ico { filter: none; opacity: 1; }
@media (max-width: 1024px) {
  /* on cream the plate would be invisible against the card, so it comes off */
  .fgoH4 .banner .mk { background: none; box-shadow: none; padding: 0; border-radius: 0; }
  .fgoH4 .banner .marks img.mk { width: 30px; height: 30px; }
}

/* ---- 37. THE PHONE CARD, AGAINST THE RIGHT CLASS NAMES -----------------
   Belt and braces for note 35: the section is .quality and the card is
   .banner, so the card's own mobile aspect-ratio has to be released by name or
   it keeps a tall empty pane under the photograph. */
@media (max-width: 1024px) {
  .fgoH4 .quality .banner { aspect-ratio: auto; height: auto; }
  .fgoH4 .quality .banner::after { display: none; }
  .fgoH4 .quality { padding-bottom: 8px; }
}


/* ---- 38. THE TILES NOW HAVE A HEAD ------------------------------------
   Centred, like the other question-shaped heads on this page, and carrying the
   same 40px it uses everywhere else. The tiles sat directly under the Best
   sellers row before and needed no heading; with one they need the section to
   open a little further. */
.fgoH4 .cats { padding-top: 72px; }
.fgoH4 .cats .sec-head { margin-bottom: 36px; }
@media (max-width: 1024px) {
  .fgoH4 .cats { padding-top: 52px; }
  .fgoH4 .cats .sec-head { margin-bottom: 26px; }
}


/* ---- 39. THE REWARDS PANEL, AGAINST BEAM'S ----------------------------
   The parts were all there; the proportions were not. Beam's heading is a
   size up and a weight DOWN from its body -- large and light, which is what
   makes a two-line offer feel like an invitation rather than a section title.
   Ours was running at the same h2 as every other heading on the page.

   Founders serves Light 300, Regular 400 and Semibold. There is no 500 and no
   roman 700, so "lighter and larger" here means a real 300 at 44px rather than
   a synthesised weight at 37.

   The measure comes in to about 44 characters, which is where Beam's body
   sits, and the button takes the arrow the hero's carries. */
.fgoH4 .h4-rewards .in .h2 {
  font-size: clamp(32px, 3.1vw, 46px);
  line-height: 1.04;
  font-weight: 300;
  letter-spacing: -.012em;
  max-width: 16ch;
}
.fgoH4 .h4-rewards .in p { max-width: 44ch; font-size: 16px; line-height: 24px; }
.fgoH4 .h4-rewards .in .btn.on-photo { margin-top: 28px; height: 52px; padding: 0 28px; }
@media (max-width: 1024px) {
  .fgoH4 .h4-rewards .in .h2 { font-size: 30px; max-width: none; }
  .fgoH4 .h4-rewards .in p { max-width: none; font-size: 15px; line-height: 22px; }
  .fgoH4 .h4-rewards .in .btn.on-photo { margin-top: 18px; }
}


/* ---- 40. ONE INTERVAL ON THE PHONE ------------------------------------
   32px at the head and foot of every section, which lands 64px of air between
   one section's last line and the next section's first. That is the single
   number the whole phone layout is now spaced on.

   THE RAIL STOPS PAYING ITS OWN BOTTOM PADDING. #collection carries 55px under
   the grid, which is right on a collection page where the grid IS the page,
   and wrong inside a section that already pays for its own foot. Removing it
   is most of the 159px hole on its own.

   THE TWO PANELS STAY CLOSE. Rewards and the field are full-bleed cards making
   one argument in two frames; 64px between them would read as two unrelated
   pictures. They keep 16.

   THE TILES GO TWO-UP. At 251px wide only one and a half fitted the screen, so
   the row read as one big tile that happened to be cut off. Half the width
   each shows two and a peek of the third, which is what tells you it scrolls. */
@media (max-width: 1024px) {
  .fgoH4 .sellers, .fgoH4 .cats, .fgoH4 .people,
  .fgoH4 .origins, .fgoH4 .faq { padding-top: 32px; padding-bottom: 32px; }
  .fgoH4 .reviews.is-tail { padding-top: 28px; padding-bottom: 32px; }
  .fgoH4 .sellers.is-buy .cards { padding-bottom: 0 !important; }
  .fgoH4 .sec-head { margin-bottom: 24px; }

  /* the two panels, held together and away from what is around them */
  .fgoH4 .quality { padding: 32px 0 0; }
  .fgoH4 .quality + .fgoH4 .quality, .fgoH4 .h4-rewards { padding-bottom: 0; }
  .fgoH4 .quality:last-of-type { padding-bottom: 32px; }
}
@media (max-width: 760px) {
  .fgoH4 .cats .tile { flex: 0 0 calc((100% - 12px) / 2); }
  .fgoH4 .cats .tiles { gap: 12px; }
  .fgoH4 .cats .tile .in { padding: 14px; }
  .fgoH4 .cats .h-tile { font-size: 17px; line-height: 20px; }
}

/* ---- 41. THE PANEL COPY WAS FLOATING IN ITS OWN CARD -------------------
   On a phone the card became auto-height and the copy block became static, but
   .banner .in still carried height:100% and justify-content:center from the
   desktop rule. In a box that is now as tall as its contents, that centred the
   copy inside a stretched flex child -- which is the pool of cream between the
   photograph and the heading in the rewards panel.

   Height auto, aligned to the top, and the copy sits under its picture. */
@media (max-width: 1024px) {
  .fgoH4 .banner .in { height: auto; justify-content: flex-start; }
}


/* ---- 42. THE DESKTOP HAS THE SAME STACKED PADDING ----------------------
   Nate: "probably want to adjust spacing here too -- on desktop."

   Same fault as note 40, at the other width: the sellers section pays 80 at
   its foot, the rail inside it pays #collection's own 55, and the categories
   section pays 72 at its head. 207px between the last "View product" and the
   next heading, where every other interval on the page is 80.

   The rail stops paying for a foot its section already bought, and the
   categories head comes back to the page's own interval. */
@media (min-width: 1025px) {
  .fgoH4 .sellers.is-buy .cards { padding-bottom: 0 !important; }
  .fgoH4 .cats { padding-top: 80px; }
  .fgoH4 .sellers { padding-bottom: 72px; }
}


/* ---- 43. THE FAQ LOOKED UNFINISHED, AND IT WAS A GROUND ----------------
   Nate: "or do you think we leave it for proper styling?"

   No -- it was already styled, it just could not be seen. .acc .row is a cream
   card and I had put the FAQ section on a cream band, so every row was cream
   on cream and the only thing rendering was the question and its plus. The
   Origins accordion looks right for the same reason in reverse: it sits on
   paper.

   Moved to paper, and then scaled up, because this is the last thing before
   the footer and it was sized like a detail: the column goes 760 to 880, the
   question from 17px to 19, the row from 56px tall to 68, and the heading up a
   step. It now reads as a section rather than a postscript.

   The foot comes in too -- the old 80 left a band of empty page between the
   last answer and the footer. */
.fgoH4 .faq { padding: 84px 0 64px; }
.fgoH4 .faq .sec-head { margin-bottom: 34px; }
.fgoH4 .faq .acc { max-width: 880px; margin-inline: auto; gap: 10px; }
.fgoH4 .faq .acc-btn {
  font-size: 19px; line-height: 26px; min-height: 68px; padding: 20px 24px;
}
.fgoH4 .faq .acc-btn .ico { width: 22px; height: 22px; }
.fgoH4 .faq .ac .in { max-width: 64ch; padding: 0 24px 22px; }
.fgoH4 .faq .ac p { font-size: 16px; line-height: 25px; }
@media (max-width: 1024px) {
  .fgoH4 .faq { padding: 36px 0 32px; }
  .fgoH4 .faq .sec-head { margin-bottom: 22px; }
  .fgoH4 .faq .acc-btn { font-size: 17px; line-height: 23px; min-height: 60px; padding: 16px 18px; }
  .fgoH4 .faq .ac .in { padding: 0 18px 18px; }
}


/* ---- 44. THE HOLE IN THE MIDDLE OF THE SELLER CARDS --------------------
   Nate: "why so much empty space in this best sellers carousel?"

   Because one card in the row has two buy rows and the rest have one. Hibiscus
   is the only product on the sandbox with a selling plan, so its card carries
   Subscribe AND Try Once; every other card carries Try Once alone. The cards
   stretch to a common height and the buy block is pinned to the bottom of each
   -- so the five single-row cards each reserve the extra 60-odd pixels
   Hibiscus needs, and that reservation lands as a hole between the size line
   and the first buy row.

   The space itself is not the problem; bottom-aligned buy blocks are worth
   having, and on production more products will carry plans. WHERE it falls is
   the problem. Pushing the name and size down to meet the buy block instead
   moves the slack up under the photograph, where it reads as air around the
   pack rather than a gap in the middle of the card.

   Pack at the top, everything you act on grouped at the bottom.

   Measured after the first attempt: still 148px. The card's own rules are
   #collection .fgColCardLink and #collection .fgColCardMeta, and an id beats
   any number of classes -- the same trap as the pack inset in note 16. Forced. */
.fgoH4 .sellers.is-buy .fgColCardLink {
  flex: 1 1 auto !important; display: flex !important; flex-direction: column !important;
}
.fgoH4 .sellers.is-buy .fgColCardMeta { margin-top: auto !important; }
.fgoH4 .sellers.is-buy .fgColCardTile { flex: none; }


/* ---- 45. THE FAQ SITS IN THE SKY ---------------------------------------
   Nate: "I preferred it when it was part of the image in the background, like
   it's in the sky", and "bring in your UI brain, make it pop."

   He is right, and note 43 was the wrong correction. The rows looked unstyled
   because cream cards sat on a cream band -- but the ACCIDENT was better than
   the fix. With no card behind them the questions float on the ground that
   runs straight down into the footer's illustrated field, and the whole foot
   of the page reads as one sky over one landscape. Putting cards back cut the
   sky into five boxes.

   So the cards go, and the craft goes into the things that can carry it
   without drawing a container:

   GROUND. A wash from paper down to the palest green, so the section arrives
   at the illustration already tinted rather than meeting it at a seam.

   RULE. A hairline at 14% forest -- enough to separate, too little to box.
   The first row has none: a line above the first question would close the
   sky off.

   THE QUESTION. Forest green, up to 20px. It is the loudest text at the foot
   of the page and it should be.

   THE PLUS. This is where the colour goes. A 34px ring in Organic Green that
   fills on hover and on open, with the glyph reversing to cream and rotating
   45 degrees into a cross. One moving part, one accent, and it is the thing
   the eye follows down the list.

   THE ANSWER. Indented to the question's measure and set in the quiet ink, so
   an open row reads as the question having more to say rather than a panel
   opening. */
/* SKY. One flat cream, the same the footer illustration is drawn on, so the
   questions and the field share a single sky with no seam between them. The
   gradient this replaces ended on a green tint and met the footer's warm cream
   at a visible line -- which was the opposite of the thing he asked for. */
.fgoH4 .faq { background: var(--cream); }
.fgoH4 .faq .acc { gap: 0; }
.fgoH4 .faq .acc .row,
.fgoH4 .faq .acc .row.open {
  background: none; border-radius: 0;
  border-top: 1px solid rgba(2,58,31,.14);
}
.fgoH4 .faq .acc .row:first-child { border-top: 0; }
.fgoH4 .faq .acc-btn {
  padding: 24px 4px; min-height: 0;
  font-size: 20px; line-height: 27px; font-weight: 600; color: var(--forest);
}
.fgoH4 .faq .acc-btn:hover { color: var(--green); }

/* the ring */
.fgoH4 .faq .acc-btn .ico {
  width: 34px; height: 34px; flex: none; padding: 8px;
  border: 1.5px solid rgba(4,106,56,.45); border-radius: 50%;
  color: var(--green);
  transition: background .22s var(--ease), color .22s var(--ease),
              border-color .22s var(--ease), transform .28s var(--ease);
}
.fgoH4 .faq .acc-btn:hover .ico { background: rgba(4,106,56,.10); border-color: var(--green); }
.fgoH4 .faq .open > .acc-btn .ico {
  background: var(--green); border-color: var(--green); color: var(--cream);
  transform: rotate(45deg);
}
.fgoH4 .faq .open > .acc-btn { color: var(--green); }

.fgoH4 .faq .ac .in { padding: 0 60px 26px 4px; max-width: 66ch; }
.fgoH4 .faq .ac p { font-size: 16.5px; line-height: 26px; color: var(--ink-2); }
.fgoH4 .faq .ac .btn.ghost { margin-top: 16px; }

@media (max-width: 1024px) {
  .fgoH4 .faq .acc-btn { padding: 19px 2px; font-size: 17px; line-height: 23px; }
  .fgoH4 .faq .acc-btn .ico { width: 30px; height: 30px; padding: 7px; }
  .fgoH4 .faq .ac .in { padding: 0 34px 20px 2px; }
  .fgoH4 .faq .ac p { font-size: 15.5px; line-height: 24px; }
}


/* ---- 46. THE REWARDS PANEL USES THE PHOTOGRAPH'S EMPTY HALF ------------
   Nate: "still waiting on this rewards."

   Fair. What was there had the same fault as the first hero: the copy was on
   the LEFT, which is exactly where the pouch, the pot and the hibiscus are, so
   the words sat on the product. I had been patching that with scrim -- and
   .banner::after was already painting one, so the variant's was the SECOND --
   until the photograph had gone from a flat-lay to a maroon rectangle with a
   ghost of a pack in it.

   The photograph has a large empty pink field down its RIGHT side. That is
   where the copy belongs: no collision to hide, so the scrim can come back to
   something that shapes contrast instead of erasing an image. One gradient,
   from the right, reaching about two thirds across.

   The type stays left-aligned within its column -- Beam's is, and centring it
   would make the block feel like a title card rather than an offer. */
/* SUPERSEDED by note 50, which gives both panels the same left-hand column.
   Putting the rewards copy on the right was wrong for this photograph: the
   right is the cupboard and the woman, and the left is the window wall. */
@media (max-width: 1024px) {
  /* on a phone the card unstacks, so there is no side to sit on and no scrim */
  .fgoH4 .h4-rewards .in {
    margin-left: 0; max-width: none; padding-right: 20px; justify-content: flex-start;
  }
  .fgoH4 .h4-rewards .banner::after { display: none !important; }
}

/* ---- 47. A CHOICE OF ONE IS NOT A CHOICE -----------------------------
   Nate: "maybe the word size or something near the variant, not sure, but it
   still feels weird here."

   It is the radio. Every card renders its purchase options as a radio group,
   which is right when there are two -- Subscribe and Try Once. Five of these
   six products have no selling plan on the sandbox, so their group contains a
   single row with a dot that is already filled and cannot be moved. It offers
   a decision and then refuses to take one, which is exactly the kind of thing
   that reads as wrong before you can say why.

   Where there is only one option the dot comes off and the row becomes what it
   actually is: the price. The border lightens for the same reason -- nothing
   is being selected, so nothing should look selectable.

   NOTE: the markup still carries role="radiogroup" with one radio in it. That
   is the shared card snippet's, not this section's, and forking it to fix the
   ARIA would give the site two card components to keep in step. Worth raising
   against the snippet itself.

   And the size line gets room: it was 2px under the name and flush against the
   row below it, which is what made the whole block feel jammed. */
.fgoH4 .sellers.is-buy .fgColBuy > .fgColOpt:only-child .fgColDot { display: none; }
.fgoH4 .sellers.is-buy .fgColBuy > .fgColOpt:only-child {
  border-color: rgba(2,58,31,.18); cursor: default;
}
.fgoH4 .sellers.is-buy .fgColCardSize {
  display: block; margin: 7px 0 13px; color: var(--ink-2);
}


/* ---- 48. THE HERO STOPPED CROPPING THE PACKS --------------------------
   Nate: "how can we avoid clipping the hibiscus, are we following responsive
   best practice here?"

   Measured rather than judged. The desktop frame is 1440x600, which is 2.40:1.
   The photograph was 1.78:1, so object-fit: cover had to lose 210px of height
   -- and the packs occupy 689px of the 810 available. No object-position saves
   that: the subject is taller than the frame. Art direction per breakpoint and
   a chosen focal point are both best practice and both were already in place;
   neither can fix a subject that does not fit.

   Extending the photograph was tried and reverted: a clamped wall carries no
   dappled light, so however exactly the tone matches at the join, the eye
   still reads flat-next-to-textured as an edge. That is missing information,
   not a seam you can feather.

   The fix is which END the crop comes off. Measured, the packs occupy the top
   85% of the frame and the bottom 15% is stone and marble. Cropping from the
   centre -- the default -- takes 105px off the top, which is exactly the
   Hibiscus pouch's crown. Anchoring to the top takes the same 210px off the
   BOTTOM instead, where it costs the base of a stone riser and nothing else.

   So the hero stays short, the peek stays big, and the packs keep their tops.
   What is lost is the front lip of the marble, which no one will miss.

   NOTE, honestly: at a 600px frame this photograph cannot show the packs
   whole -- they need 690px of the 810 available. A purpose-shot wide hero, or
   a proper outpaint in a tool that can invent dappled light, is the real fix.
   Anchoring the crop is the best available answer with the file we have. */
@media (min-width: 1025px) {
  .fgoH4 .hero > picture img { object-position: center top; }
}

/* ---- 49. THE CLAIMS RAIL ----------------------------------------------
   The six claims, off the photograph and on their own scroll.

   CREAM, NOT GREEN. Nate's instinct: "green background might not look good
   here, it needs to be elegant premium DTC." A full-width Organic Green bar
   immediately under a deep green field photograph is two heavy bands stacked,
   and the page has already spent its saturation on the packs and the field.
   Cream ground, forest icons, ink claims -- it reads as a maker's note rather
   than a promotional strip, and it sits quietly between the photograph and the
   questions.

   The rules between items are what make it a set of statements rather than a
   run-on sentence; they are the same hairline the static logo bar uses. */
.fgoH4 .press .it.claim { display: inline-flex; align-items: center; gap: 12px; white-space: nowrap; }
.fgoH4 .press .it.claim .ci { width: 30px; height: 30px; object-fit: contain; flex: none; opacity: .9; }
.fgoH4 .press .it.claim .ci-seal { width: 34px; height: 34px; opacity: 1; }
.fgoH4 .press .it.claim .ct { font-weight: 600; color: var(--ink); letter-spacing: .005em; }
.fgoH4 .press.has-rules .it { position: relative; }
.fgoH4 .press.has-rules .it + .it::before {
  content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
  width: 1px; height: 26px; background: var(--line);
}
.fgoH4 .press.has-rules .it { padding: 0 40px; }
@media (max-width: 760px) {
  .fgoH4 .press.has-rules .it { padding: 0 22px; }
  .fgoH4 .press .it.claim .ci { width: 26px; height: 26px; }
  .fgoH4 .press .it.claim .ci-seal { width: 30px; height: 30px; }
}


/* ---- 50. ONE PANEL TREATMENT, BOTH PANELS -----------------------------
   The copy takes a defined column on the left, the scrim is shaped to that
   column rather than washed across the whole frame, and the type is centred in
   the height at a fixed inset. The two photo panels now hang on the same two
   numbers, which is most of what "unfinished" was pointing at.

   The scrim stops at 64%: far enough to carry two lines of cream type, near
   enough that the photograph is still the thing you are looking at. */
@media (min-width: 1025px) {
  .fgoH4 .banner .in {
    width: 46%; max-width: 560px; min-width: 380px;
    justify-content: center; align-items: flex-start;
    padding: 56px 40px 56px 56px;
  }
  .fgoH4 .banner::after {
    background: linear-gradient(to right,
      rgba(8,26,16,.78) 0%, rgba(8,26,16,.60) 26%, rgba(8,26,16,.24) 48%, rgba(8,26,16,0) 64%) !important;
  }
  .fgoH4 .banner .in .h2 { max-width: 15ch; }
  .fgoH4 .banner .in p { max-width: 40ch; margin-top: 14px; }
  .fgoH4 .banner .in .btn { margin-top: 30px; }
  .fgoH4 .banner .in .eyebrow { margin-bottom: 16px; }
}

/* the pantry is a warm, bright photograph; its scrim leans warm so the panel
   does not go cold where the window light is */
@media (min-width: 1025px) {
  .fgoH4 .h4-rewards .banner::after {
    background: linear-gradient(to right,
      rgba(44,26,14,.76) 0%, rgba(44,26,14,.58) 26%, rgba(44,26,14,.22) 48%, rgba(44,26,14,0) 64%) !important;
  }
}

/* ---- 51. THE PANEL COPY ON A PHONE ------------------------------------
   Nate: "the rewards section has too much space here, top vs bottom."
   Measured at 390: 120px between the photograph and the heading, and 4px
   between the button and the foot of the card. The block was sitting on the
   picture instead of under it.

   Explicit padding on both ends, so the copy is inset the same above and
   below, and the eyebrow -- which is cream, and was therefore invisible on the
   cream a phone card uses -- takes the green it needs there. */
@media (max-width: 1024px) {
  .fgoH4 .banner .in {
    width: auto; max-width: none; min-width: 0;
    padding: 24px 20px 26px !important;
    justify-content: flex-start;
  }
  .fgoH4 .banner .in > *:first-child { margin-top: 0; }
  .fgoH4 .banner .in .eyebrow { color: var(--green); opacity: 1; margin-bottom: 10px; }
  .fgoH4 .banner .in .h2 { max-width: none; }
  .fgoH4 .banner .in p { max-width: none; margin-top: 10px; }
  .fgoH4 .banner .in .btn { margin-top: 18px; }
}


/* ---- 52. THE 97px OF NOTHING UNDER THE PANTRY -------------------------
   Nate: "the rewards section has too much space here, top vs bottom."

   Measured: 122px between the photograph and the heading, 26px under the
   button. The culprit was a leftover from an earlier phone treatment --

       .h4-rewards picture, .h4-rewards img { aspect-ratio: 1 / 1 }

   The IMG was later given 4:3, but the PICTURE kept its square. So the picture
   box was 390 tall, the image inside it 293, and 97px of empty element sat
   between the photograph and the copy. Nothing was painting it; it was just
   there.

   The picture takes its height from its image, which is what a picture element
   should do. */
@media (max-width: 1024px) {
  .fgoH4 .banner picture,
  .fgoH4 .h4-rewards picture { aspect-ratio: auto !important; display: block; line-height: 0; }
  .fgoH4 .h4-rewards picture img { aspect-ratio: 4 / 3 !important; }
}


/* ---- 53. THE PARTS THE SUBSCRIBE ROW NO LONGER NEEDS ------------------
   Hidden rather than removed, so the script never has to take a node out of a
   structure the card owns -- which is how the label went missing the first
   time. */
.fgoH4 .sellers [data-h4-hide] { display: none !important; }

/* THE LABEL FITS, IT WAS JUST TOO BIG. Nate: "it's on two lines so maybe just
   Subscribe + Save." Measured before dropping the number: the label needs
   140px at the card's 17px and there are 135px between the dot and the price.
   At 13.5px it needs 118 -- it fits with 17px to spare, so the 15% stays,
   which is the only reason anyone reads that row.

   The row beside it comes down to match, so the two are one size. */
/* nothing here any more: the row renders as the card built it. See the note
   in fgo-home-v4.js. */


/* ---- 54. THE HERO PROOF LINE, AGAINST BEAM'S -------------------------
   Nate: "tighten up our eyebrow so it is on the same line and perhaps all
   caps? Look at Beam's."

   Side by side, Beam's reads as a label and ours read as a sentence. Three
   differences:

     CASE. Theirs is uppercase and widely tracked -- 15,000+ VERIFIED 5-STAR
     REVIEWS -- which is what makes it a caption rather than a line of copy
     competing with the headline under it.

     SIZE. Theirs is a step smaller than its body text. Ours was body size, so
     the eye read it as the first sentence of the paragraph.

     THE GAP. Theirs sits the stars right against the words. Ours had 12px and
     the two halves floated apart.

   Locked to one line, because "4.6 average from 150,000+ Amazon reviews"
   wrapping mid-claim is worse than it being small. Below 560px it may wrap
   after all, so the nowrap lifts there rather than pushing the line off the
   screen. */
.fgoH4 .hero .proof {
  gap: 9px;
  font-size: 12.5px; line-height: 14px; font-weight: 600;
  letter-spacing: .13em; text-transform: uppercase;
  color: var(--ink); white-space: nowrap;
}
.fgoH4 .hero .proof .stars { height: 14px; }
.fgoH4 .hero .proof .stars svg { width: 14px; height: 14px; }
.fgoH4 .hero h1 { margin-top: 26px; }
@media (max-width: 560px) {
  .fgoH4 .hero .proof { white-space: normal; font-size: 11.5px; letter-spacing: .1em; }
}


/* ---- 55. THE CARDS GET THE WIDTH BACK ---------------------------------
   Four across the full rail, no half-card peek: 296px each at 1280, against
   the 252 they were. That one number is behind most of the card feedback in
   this thread -- the empty middle, the wrapped subscribe label, the packs
   looking small, "40 Ct" having nowhere to become "40 tea bags".

   Below 1280 the rail keeps a peek, because three full cards plus a hint is a
   better use of 1100px than four cramped ones. */
/* SUPERSEDED by note 63. Dividing the track by a card count reads as four
   across at 1440 and as the phone layout at 1280, because nothing in the
   division knows what the card needs to hold its line. */

/* ---- 56. THE PROGRESS TRACK -------------------------------------------
   A hairline the width of the rail with a filled segment showing how much of
   it you can see and where you are in it. Quiet at rest, forest when you move
   -- it is a position indicator, not a control, so it never asks to be
   clicked. Hidden entirely when everything fits. */
.fgoH4 .sellers .srail {
  position: relative; height: 3px; border-radius: 3px;
  background: rgba(2, 58, 31, .10);
  margin: 34px var(--gutter) 0;
  overflow: hidden;
}
.fgoH4 .sellers .srail span {
  display: block; height: 100%; border-radius: 3px;
  background: var(--forest);
  transition: transform .18s linear, width .18s linear;
}
@media (max-width: 1024px) {
  .fgoH4 .sellers .srail { margin: 22px var(--indent) 0; }
}

/* ---- 57. ADD TO CART IS A SENTENCE ------------------------------------
   The card sets it in caps, which is the one thing in the component that is
   louder than anything around it -- every other control on this page is
   sentence case, and so is the version of this card Nate keeps pointing at. */
/* SUPERSEDED by note 58, which takes the whole control spec from the liked
   component rather than shaving one property off the catalogue default. The
   sentence case was right; 15px in a 46px pill was the "tiny font". */


/* ---- 58. THE LIKED CARD SKIN, PORTED ----------------------------------
   Nate: "the bubble colour and everything just felt like the Find your daily
   ritual component was best so far", "font is tiny", "the cards have a lot of
   negative space around the products".

   All one cause. Our rail is id="collection" (the card snippet needs it), so
   it picks up the BASE catalogue skin from fgo-col-grid-css. The component he
   likes is the same card wearing a second skin -- #collection.is-benefit,
   written inside fgo-benefit-tabs and scoped to that section's id, so not one
   line of it reaches us. This ports it.

   The prefix carries the id, so these rules outrank the base without
   !important, which is all the two superseded notes above had been reduced to.

   THE PACK. Contain plus an inset keeps the studio margin baked into the
   source file and then adds more of its own; the pouch ends up about 65% of
   the tile's width. Cover on a 4:5 tile crops that margin away and renders it
   at about 88% -- a third more pack from the same photograph. The live
   component has been cropping these exact files this way for weeks. */
.fgoH4 .sellers.is-buy .cards#collection .fgColCardTile {
  aspect-ratio: 4 / 5;
  box-shadow: inset 0 0 0 1px rgba(2, 58, 31, .10);
}
.fgoH4 .sellers.is-buy .cards#collection .fgColCardImg {
  object-fit: cover; padding: 0;
}

/* THE TWO BUY ROWS. One border width, never two -- the 2px outline is a
   framework default, not a design. Picked is carried by the ink border, the
   filled dot and a 4% tint, which is a quieter signal than a heavier box and
   stops the row shifting half a pixel when you switch. */
.fgoH4 .sellers.is-buy .cards#collection .fgColOpt {
  min-height: 56px; padding: 8px 15px; gap: 12px;
  border: 1px solid rgba(2, 58, 31, .28); border-radius: 8px;
  background: transparent;
  font-size: 16px; font-weight: 400; line-height: 1.25;
}
.fgoH4 .sellers.is-buy .cards#collection .fgColOpt.is-active {
  border-color: var(--forest); border-width: 1px; padding: 8px 15px;
  background: rgba(2, 58, 31, .04);
}
.fgoH4 .sellers.is-buy .cards#collection .fgColOpt.has-sub { padding-top: 8px; padding-bottom: 8px; }
.fgoH4 .sellers.is-buy .cards#collection .fgColDot {
  width: 18px; height: 18px; border: 1px solid rgba(2, 58, 31, .28); background: transparent;
}
.fgoH4 .sellers.is-buy .cards#collection .fgColOpt.is-active .fgColDot { border: 5px solid var(--forest); }
.fgoH4 .sellers.is-buy .cards#collection .fgColOptMain { font-size: 16px; line-height: 1.25; }
.fgoH4 .sellers.is-buy .cards#collection .fgColOptSub { margin-top: 2px; font-size: 15px; line-height: 1.5; }
.fgoH4 .sellers.is-buy .cards#collection .fgColOptPrice { font-size: 16px; font-weight: 600; font-variant-numeric: tabular-nums; }
.fgoH4 .sellers.is-buy .cards#collection .fgColWas { font-size: 15px; font-weight: 400; }

/* THE SAVING. The amber chip was the one colour in this card that belonged to
   no token on the page -- and it was louder than the Add to cart button under
   it, which is the wrong thing to be loudest. Ink on an 8% ink tint, the same
   8px radius as the row it sits in, sentence case at the sub-line's size. */
.fgoH4 .sellers.is-buy .cards#collection .fgColSave {
  font-size: 15px; font-weight: 600; letter-spacing: 0; line-height: 1.2;
  text-transform: none; padding: 3px 8px; border-radius: 8px;
  background: rgba(2, 58, 31, .08); color: inherit;
}

/* THE CONTROL. 56px, 16px Semibold, sentence case, no tracking, flex-centred
   with no block padding -- the asymmetric 14/20/9 inset is what made a 15px
   label read as 13px. Founders has no roman 700, so 700 was being synthesised;
   600 is the real Semibold. */
.fgoH4 .sellers.is-buy .cards#collection .fgColAtcForm { margin-top: 13px; }
.fgoH4 .sellers.is-buy .cards#collection .fgColAtc {
  display: flex; align-items: center; justify-content: center;
  width: 100%; min-height: 56px;
  font-size: 16px; font-weight: 600; text-transform: none; letter-spacing: 0; line-height: 1;
  padding: 0 30px; border-radius: 999px;
  border: 1px solid var(--forest); background: var(--forest); color: var(--cream);
}
.fgoH4 .sellers.is-buy .cards#collection .fgColAtcPrice { font: inherit; opacity: .85; margin-left: .35em; }
.fgoH4 .sellers.is-buy .cards#collection .fgColView { margin-top: 8px; padding-top: 12px; font-size: 16px; }
.fgoH4 .sellers.is-buy .cards#collection .fgColCardName { font-size: 20px; }
.fgoH4 .sellers.is-buy .cards#collection .fgColCardSize { font-size: 15px; }

/* On a phone the rail card is narrower than the grid card this spec was
   written for, so the control keeps its height and loses inline padding rather
   than wrapping its label. */
@media (max-width: 760px) {
  .fgoH4 .sellers.is-buy .cards#collection .fgColAtc { padding: 0 16px; }
  .fgoH4 .sellers.is-buy .cards#collection .fgColOpt { padding-left: 12px; padding-right: 12px; gap: 10px; }
  .fgoH4 .sellers.is-buy .cards#collection .fgColOpt.is-active { padding-left: 12px; padding-right: 12px; }
}


/* ---- 59. THE CONTROL, SIZED FOR OUR CARD ------------------------------
   Nate, after note 58 landed: "font here still needs a lot of help."

   Note 58 took 16px from the liked component, where the card is 324px wide.
   Ours is 276. The same absolute size behind the same 30px inline inset
   leaves four words adrift in the middle of a full-width dark pill -- the
   label is not small, the empty green around it is large. So the type goes up
   and the inset comes down, which is the same correction in both directions.

   The option rows do NOT follow: their line is dot, label, saving pill and
   price inside 244px, and at 16px it is already at the width where the saving
   pill drops to a second row. */
.fgoH4 .sellers.is-buy .cards#collection .fgColAtc { font-size: 18px; padding: 0 20px; }
.fgoH4 .sellers.is-buy .cards#collection .fgColAtcPrice { opacity: .9; }

/* ---- 60. THE TALL PHOTOGRAPH ------------------------------------------
   Every pouch is a 440x440 file; the Ceylon carton is 440x642. Filling a 4:5
   tile with a 0.685 source crops 13.8px off the bottom, which on that pack is
   the printed net weight. It fits instead -- still about 78% of the tile
   against the 65% the whole rail sat at before note 58, so the card keeps
   most of the win and loses none of the product. */
.fgoH4 .sellers .pcard[data-h4-fit] .fgColCardImg {
  object-fit: contain; padding: 4%; box-sizing: border-box;
}

/* ---- 61. ONE GROUND ON A PHONE ----------------------------------------
   Nate: "make these backgrounds seamless, we have white in the middle between
   Sourced with intention and the scrolling bar."

   Measured at 390: the panel sections are transparent and show the page
   ground #FBF8F1; the claims rail and the FAQ paint themselves #F5F3E7. Six
   points apart is the worst possible difference -- too little to read as a
   band, too much to disappear -- and it lands as a pale stripe exactly where
   he drew it.

   On a phone those bands are not doing the job they were written for. At
   desktop width a cream band separates a full-bleed section from an inset
   one; stacked full-width on a phone there is nothing to separate, so the
   band only contributes an edge. They give it up below 1024 and the page runs
   as one field from the field photograph down to the footer. The hairlines
   between the claims are what make that rail legible, and they stay. */
@media (max-width: 1024px) {
  .fgoH4 .press.band, .fgoH4 .faq { background: transparent; }
}


/* ---- 62. STARS ON THE CAP LINE, NOT THE BOX LINE ----------------------
   Nate, on the hero: "star and text on one horizontal line, spaced properly."

   They were already on one flex line, centred -- and that is the fault.
   align-items: center centres the two BOXES, and a line of type does not sit
   in the middle of its box. The box carries room for ascenders and
   descenders; ALL-CAPS type uses neither, so the letters ride high in it and
   a square icon centred against the same box lands below them. Every star row
   next to a label has this, and it is always blamed on the icon.

   Measured off the rendered pixels at 6x on the hero line (12.5px):

     cap ink    1.00 -> 10.67   centre 5.83     cap height .774em
     star ink   1.83 -> 13.50   centre 7.67     glyph      .934em

   1.84px low, which is 15% of the cap height -- visible, and exactly what he
   circled. The correction belongs to the typeface rather than to this line:

     shift = fontSize x (0.5 - ascent + capHeight / 2)

   Founders measures ascent .74em and cap height .774em, so the shift is
   .147em: 1.84px here, and still right wherever else the rail is set. It is a
   transform, so it moves the ink without moving the layout. */
.fgoH4 { --cap-shift: -.147em; }
.fgoH4 .hero .proof .stars,
.fgoH4 .press .it.rating .stars,
.fgoH4 .press .pin .stars {
  transform: translateY(var(--cap-shift));
}

/* the gap between the stars and the claim was set against the box edge too,
   so it read wider than the word spacing beside it once the stars moved */
.fgoH4 .hero .proof { gap: 10px; align-items: center; }


/* ---- 63. THE CARD HAS A FLOOR AND A CEILING --------------------------
   Nate: the saving badge "is not aligned well with the rest of Subscribe".

   The badge had not moved. The CARD had. fgo-col-grid-css carries a container
   query: at 230px and under, the buy row stops being a flex line and becomes
   a grid that drops the badge to its own row. Sound behaviour for a 320px
   phone in a four-column catalogue -- and we were triggering it on laptops,
   because the old rule divided the track by a card count and never asked what
   the card needed:

     viewport   1440   1280   1100    900    560    390    320
     card        276    238    223    705    431    289    231
     badge inline  y      n      n      y      y      y      n

   1280 is the tell. Four across a 1280 window is 238px a card, and 238 is the
   phone layout -- on the commonest screen size there is. 900 is the same
   error inverted: one card and a peek, across a whole tablet.

   So the width is a range, not a quotient. The floor is 250px, which is what
   the buy row needs to keep dot, label, badge and price on one line; the
   ceiling is 320px, past which a rail card starts reading as a feature panel
   rather than one of a set. How many fit is then an outcome rather than an
   instruction, which is what it should have been. */
@media (min-width: 1280px) {
  .fgoH4 .sellers.is-buy .pcard { flex: 0 0 clamp(276px, calc((100% - 96px) / 4), 300px); }
}
@media (min-width: 1025px) and (max-width: 1279px) {
  .fgoH4 .sellers.is-buy .pcard { flex: 0 0 clamp(276px, calc((100% - 96px) / 3.2), 320px); }
}
@media (max-width: 1024px) {
  .fgoH4 .sellers.is-buy .pcard { flex: 0 0 clamp(276px, 78%, 320px); }
}

/* ---- 64. THE SAVING NEEDS AN EDGE -------------------------------------
   Nate: "when you zoom out the text is hard to see."

   Ink on an 8% ink tint is the liked component's badge, and it reads there
   because it sits on white. Here it sits inside the PICKED row, which is
   itself tinted 4% -- so the badge is a four-point step on a four-point step
   and the pill has no edge at any real viewing size. The letters were never
   the problem; the shape around them was not there.

   A hairline draws it, at the same weight as the row's own border so the two
   belong to one system, and the fill goes up two points to carry it. Still
   quieter than the button underneath, which is the one thing this badge must
   not out-shout. */
.fgoH4 .sellers.is-buy .cards#collection .fgColSave {
  background: rgba(2, 58, 31, .10);
  box-shadow: inset 0 0 0 1px rgba(2, 58, 31, .22);
  white-space: nowrap;
}


/* ---- 65. THE FACE, WHICH WAS THE WHOLE "TINY FONT" -------------------
   Nate, side by side with the live component: "looks better, please fix."

   Measured, every number in our buy box now matches the liked component --
   56px rows, 8px radius, 15px badge, 16px labels. Two things did not, and
   one of them explains the whole thread:

     element   live                 ours
     badge     Founders   w 75px    FoundersCondensed   w 55px
     button    Founders             FoundersCondensed
     name      400                  600

   The page sets a condensed face on its buttons and pills, which is right
   for the page's own CTAs and wrong inside this card -- a condensed face at
   the same pixel size carries about a quarter less ink, so "Save 15%" was
   rendering 20px narrower than the identical string next to it. That is why
   it read as small and as hard to see, and it is why taking the button from
   15px to 18px did not fix the feeling: the letters were the wrong shape,
   not the wrong size.

   Both take the card's own face. With the wider face the button comes back
   down to 17px, which is more ink than 18px condensed was and one step above
   the liked component -- the step our narrower card earns.

   The name drops to 400. 600 in deep green was reading as a link rather than
   a product, which is most of what looked heavier than live. */
.fgoH4 .sellers.is-buy .cards#collection .fgColSave,
.fgoH4 .sellers.is-buy .cards#collection .fgColAtc { font-family: inherit; }
.fgoH4 .sellers.is-buy .cards#collection .fgColAtc { font-size: 17px; }
.fgoH4 .sellers.is-buy .cards#collection .fgColCardName { font-weight: 400; }


/* ---- 66. THE SAVING BADGE, CENTRED ON ITS INK ------------------------
   Nate: "make this equal spacing inside the price discount bubble."

   Measured from the rendered pixels at 6x, with padding 3px 8px:

     left 9.00   right 9.00   top 4.33   bottom 10.83

   Horizontally it was already exact. Vertically the ink sat 6.5px closer to
   the top than the bottom -- the same fault as the hero stars (note 62):
   Founders rides high in its line box, and "Save 15%" has no descender to
   fill the room the box reserves for one. Equal CSS padding is not equal
   optical padding on this face.

   Same pill height, the padding moved to where the space actually is:
   6 above, 0 below, which measures 7.33 / 7.83 -- inside half a pixel. */
.fgoH4 .sellers.is-buy .cards#collection .fgColSave { padding: 6px 8px 0; line-height: 18px; }


/* ---- 67. HEADINGS PINNED AGAINST LATE STYLESHEETS --------------------
   Measured on production, cold cache, throttled: at 2.5s the h1 was
   sentence case in the fallback face (Founders 300 not yet available); at
   12.4s Founders had arrived -- and text-transform was UPPERCASE, alongside
   six Founders @font-face declarations that no theme file makes. A
   stylesheet from outside the theme (an app embed) recases h1, and our
   .h-hero never declared text-transform, so it inherited the last thing
   that landed. That was the "font jumping" Nate saw on every page.

   These headings are ours. Pinned with !important because the intruder
   arrives after every theme stylesheet and may use it too. */
.fgoH4 h1, .fgoH4 h2, .fgoH4 .h1, .fgoH4 .h2, .fgoH4 .h-hero, .fgoH4 .h-tile {
  text-transform: none !important;
}
.fgoH4 .h-hero { letter-spacing: -.01em !important; }


/* ---- 68. THE REVIEWS RAIL UNDER A MOUSE WHEEL -------------------------
   Measured on production: eight direction reversals inside one steady wheel
   gesture. That is mandatory snapping -- right for a thumb, which lets go
   and expects to land on a tile, wrong for a wheel, which never lets go and
   gets snapped back on every notch. Proximity on desktop keeps the arrows,
   keys and auto-advance centring (they scroll to exact centres anyway) and
   stops the fight. Phones keep mandatory.

   The centre tile also grew 393 -> 505px with no transition, its photograph
   jumping object-position, 80ms after every pause -- the "pop" in the middle
   of a scroll. Eased now. And a horizontal gesture at the end of the rail no
   longer becomes browser back/forward. */
/* measured again with proximity: still 8 reversals per gesture -- Chrome snaps
   on every wheel notch for ANY snap container. So on desktop the rail does not
   snap at all during a gesture; the script settles it to the nearest tile once
   the scroll has ended (pickCentre). Phones keep mandatory, where a swipe should
   land on a tile natively. */
@media (min-width: 1025px) {
  .fgoH4 .rrow { scroll-snap-type: none; }
}
.fgoH4 .rrow { overscroll-behavior-x: contain; }
.fgoH4 .rtile { transition: height .45s cubic-bezier(.16, 1, .3, 1); }
/* (the object-position transition that was here moved to note 70: the image
   no longer animates at all) */
@media (prefers-reduced-motion: reduce) {
  .fgoH4 .rtile, .fgoH4 .rtile .bg { transition: none; }
}

/* ---- 69. THE PHONE PANNED SIDEWAYS ------------------------------------
   Nate, on his phone: "it loads proper width then you can scroll
   horizontally." Bisected on production: the Best sellers section. Inside
   it, not the rail -- the screen-reader label in every card's Add to cart
   button (span.fgColSr, absolute, 1px). Nothing above it is positioned, so
   each one is anchored to the VIEWPORT at its card's x in the rail, and the
   labels of the off-screen cards sat at 1034, 1326, 1618px, stretching the
   document to 1619. The scroller could not clip them (not their containing
   block) and neither could .fgoH4 (static). Consentmo's 1560px root was
   100vw of the stretched viewport -- a symptom.

   The button becomes the containing block (source fix); .fgoH4 becomes the
   anchor of last resort so its overflow-x:hidden actually applies to any
   absolute element inside the homepage (belt). Both take the live page from
   1619 to 390 on their own. */
.fgoH4 { position: relative; }
.fgoH4 .sellers .fgColAtc { position: relative; }


/* ---- 70. THE RAIL STOPS PAINTING EVERY FRAME ---------------------------
   Nate: the arrow click is "jagged, jumpy and laggy". Measured on production:
   8-9 frames over 25ms per click, worst 115ms. Two paint costs, both gone.

   THE FADE. It was a mask-image on the scroll container. A mask on a
   scroller cannot be composited, so every frame of every scroll -- wheel,
   arrow, auto-advance -- repainted seven tiles of photography on the main
   thread. The fade is now two overlays on the section, paper to transparent,
   drawn once by the compositor and never touched again.

   THE PHOTO. The reveal animated object-position, which is not compositable
   and re-fits the image every frame. The image is now a fixed 505px box
   anchored to the tile's bottom: a 393px tile shows its lower 393px (exactly
   what object-position 50% 100% showed), and when the tile grows the height
   transition reveals the top. The image itself never animates. */
@media (min-width: 1025px) {
  .fgoH4 .rrow { -webkit-mask-image: none; mask-image: none; }
  .fgoH4 .reviews { position: relative; }
  .fgoH4 .reviews::before, .fgoH4 .reviews::after {
    content: ""; position: absolute; top: 0; bottom: 0; width: 72px; z-index: 2; pointer-events: none;
  }
  .fgoH4 .reviews::before { left: 0; background: linear-gradient(90deg, var(--paper), rgba(251, 248, 241, 0)); }
  .fgoH4 .reviews::after { right: 0; background: linear-gradient(270deg, var(--paper), rgba(251, 248, 241, 0)); }
}
.fgoH4 .rtile .bg {
  inset: auto 0 0 0; height: 505px; object-position: 50% 0; transition: none;
}
.fgoH4 .rtile:not(.on) .bg { object-position: 50% 0; }


/* ---- 71. THE PRESS BAR STANDS ON ONE LINE -----------------------------
   Nate: "walmart is kinda not on the same line as the rest". Measured at 3x
   on production: every logo BOX was centred, but a box is not its lettering.
   The labels stood 3.5px above the logos, Amazon's letters rode high on the
   smile inside their box, and Walmart's x-height was 7.6px against ~10.
   On a phone the bar broke into three ragged lines, Walmart alone on the last.

   The row now aligns on BASELINES, like type. Each logo declares where its
   letters stand (--bl, share of the file height from the bottom, measured from
   the pixels) and sinks by exactly that much, so a smile, a spark or a
   descender hangs below the line and the lettering sits on it -- the labels'
   text baseline included. Each label and its logos are a SET that wraps as a
   unit: one line at desktop, one line per set on a tablet, and on a phone the
   label becomes a small eyebrow over its own row of logos. */
.fgoH4 .press.is-static .grp { align-items: baseline; column-gap: 36px; row-gap: 14px; }
.fgoH4 .press.is-static .set {
  display: inline-flex; align-items: baseline; flex-wrap: nowrap; column-gap: 44px;
}
.fgoH4 .press.is-static .it { padding: 0; }
.fgoH4 .press.is-static .rule { align-self: center; margin: 0; }
.fgoH4 .press .it.lg { display: block; line-height: 1; }
.fgoH4 .press .it.lg img {
  display: inline-block; width: auto; height: var(--h);
  vertical-align: calc(var(--h) * var(--bl, .2) * -1);
}
@media (max-width: 1100px) {
  /* the two sets no longer fit one line: each takes its own, and a vertical
     rule between two rows separates nothing */
  .fgoH4 .press.is-static .grp { flex-direction: column; align-items: center; }
  .fgoH4 .press.is-static .rule { display: none; }
}
@media (max-width: 640px) {
  /* the smile and the spark hang below the last line, so the ground under
     them read ~4px deeper than above the first label: even it out */
  .fgoH4 .press.is-static { padding-top: 24px; padding-bottom: 20px; }
  .fgoH4 .press.is-static .grp { row-gap: 22px; }
  .fgoH4 .press.is-static .set {
    flex-wrap: wrap; justify-content: center; column-gap: clamp(14px, 5.5vw, 22px); row-gap: 4px;
    padding: 0 var(--gutter, 16px);
  }
  .fgoH4 .press.is-static .set > .cap {
    flex: 0 0 100%; justify-content: center; font-size: 13px; line-height: 16px;
  }
}
/* 360px (the commonest Android width) wrapped Us Weekly onto a line of its
   own. Below 375 the mastheads run at 90% so the four stay one row. */
@media (max-width: 339px) {
  .fgoH4 .press.is-static .set { column-gap: 12px; }
}
@media (min-width: 340px) and (max-width: 374px) {
  .fgoH4 .press.is-static .set { column-gap: 16px; }
}
@media (max-width: 374px) {
  .fgoH4 .press.is-static .it.lg img {
    height: calc(var(--h) * .9) !important;
    vertical-align: calc(var(--h) * .9 * var(--bl, .2) * -1);
  }
}


/* ---- 72. THE REVIEWS RAIL, REBUILT ----------------------------------------
   Nate: "improve the overall experience and animation scrolling ... and the
   buttons (it's better on mobile than desktop)". Measured on production before
   touching it: the centre tile grew 393 -> 505px on every step and the row
   COLLAPSED 54px mid-step (neighbours bobbed 27px, the buttons jumped from
   under the cursor, 0.045 CLS per autoplay step); a script re-centred the rail
   after every wheel notch, reversing a fast spin 1-3 times; a resize rewound
   it; the arrows were 36px with a 1.41:1 ring, parked under the rail.
   Brightland's rails (Slick) show what reads premium -- uniform cards on the
   page gutter, a peek at the edge, 48px arrows ON the rail edges that vanish at
   the ends, one card per click, no autoplay -- but their engine drops clicks,
   has no momentum and ignores trackpads. So: that layout on a native scroller.
   Round 2 (23 Sep, after an adversarial verify pass): one tile per click on
   desktop too, a real title/body/name hierarchy, sticky-hover fixed on touch,
   a 6-step indicator instead of a dash, gap = gutter on phones, a focus ring
   drawn around the tiles instead of two full-width rules. */
.fgoH4 .reviews {
  --r-gap: 16px; --r-n: 3; --r-peek: 120px;
  --r-start: max(var(--gutter), calc((100% - var(--max)) / 2 + var(--gutter)));
  --r-w: 320px; --r-h: 480px;
}
/* THE PEEK IS SIZED, NOT LEFT TO CHANCE. Tile width comes from the rail's own
   width (container units) so N whole tiles and ~120px of the next are always
   in view: three up to 1759px, four from 1760 (below that four tiles got
   small enough to crowd the photo). Height keeps one proportion, 1.3. */
.fgoH4 .reviews .rstage { position: relative; container-type: inline-size; }
@supports (width: 1cqw) {
  .fgoH4 .reviews {
    --r-start: max(var(--gutter), calc((100cqw - var(--max)) / 2 + var(--gutter)));
    --r-w: max(250px, calc((100cqw - var(--r-start) - var(--r-peek) - var(--r-n) * var(--r-gap)) / var(--r-n)));
    --r-h: clamp(460px, calc(var(--r-w) * 1.3), 540px);
  }
}
@media (min-width: 1760px) { .fgoH4 .reviews { --r-n: 4; } }
/* small laptops: two big tiles, not three narrow ones -- at 259px wide a
   bottom-anchored photo sat 4px off the caption bar */
@media (min-width: 1025px) and (max-width: 1199px) { .fgoH4 .reviews { --r-n: 2; } }
.fgoH4 .reviews .rrow {
  position: relative;
  align-items: flex-start; gap: var(--r-gap);
  padding: 0 var(--r-start); scroll-padding-inline: var(--r-start);
  scroll-snap-type: none;
  /* the theme's global `* { scroll-behavior: smooth !important }` turned every
     programmatic jump into a glide; this rail animates itself */
  scroll-behavior: auto !important;
  overscroll-behavior-x: contain;
  -webkit-mask-image: none; mask-image: none;
}
.fgoH4 .reviews .rtile, .fgoH4 .reviews .rtile.on {
  flex: 0 0 var(--r-w); width: var(--r-w); height: var(--r-h);
  scroll-snap-align: start; transition: none;
}
.fgoH4 .reviews .rtile .bg, .fgoH4 .reviews .rtile:not(.on) .bg {
  inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 100%;
  transition: none; -webkit-user-drag: none;
}
/* type: a title that leads, the quote, then a quiet byline */
.fgoH4 .reviews .rtile .q { padding: 24px 24px 0; }
.fgoH4 .reviews .rtile .ttl { margin-top: 14px; font-size: 17px; line-height: 22px; font-weight: 600; }
.fgoH4 .reviews .rtile blockquote { margin: 8px 0 0; }
.fgoH4 .reviews .rtile blockquote p { font-size: 16px; line-height: 24px; }
.fgoH4 .reviews .rtile .who { margin-top: 12px; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.fgoH4 .reviews .rtile .who .b { font-size: 13px; line-height: 16px; font-weight: 600; letter-spacing: .01em; }
.fgoH4 .reviews .rtile .who .vb { margin-left: 0; font-size: 12px; line-height: 16px; }
.fgoH4 .reviews .rtile .cap .nm { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fgoH4 .reviews .rtile .cap .t {
  font-size: 14px; line-height: 17px; font-weight: 600; color: var(--ink);
  text-wrap: balance;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.fgoH4 .reviews .rtile .cap .pr { font-size: 14px; line-height: 17px; color: var(--ink-2); }

/* the arrows: Brightland's 48px disc on the rail edges, centred on the tiles */
.fgoH4 .reviews .rarrow {
  position: absolute; top: calc(var(--r-h) / 2); z-index: 3;
  width: 48px; height: 48px; margin-top: -24px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%; border: 1px solid var(--ink);
  background: var(--paper); color: var(--ink);
  box-shadow: 0 8px 24px rgba(20, 20, 20, .10);
  cursor: pointer;
  transition: opacity .25s var(--ease), visibility 0s linear 0s,
              background-color .2s var(--ease), color .2s var(--ease), transform .2s var(--ease);
}
.fgoH4 .reviews .rarrow::before { content: ""; position: absolute; inset: -6px; }
.fgoH4 .reviews .rarrow .ico { width: 22px; height: 22px; stroke-width: 1.5; }
.fgoH4 .reviews .rarrow.prev { left: 24px; }
.fgoH4 .reviews .rarrow.next { right: 24px; }
/* hover only where there IS hover: on touch a tapped button kept the ink fill
   until the next tap and read as a toggled state */
@media (hover: hover) and (pointer: fine) {
  .fgoH4 .reviews .rarrow:hover { background: var(--ink); color: var(--paper); }
}
.fgoH4 .reviews .rarrow:active { transform: scale(.94); }
.fgoH4 .reviews .rarrow:focus-visible { outline: 2px solid var(--forest); outline-offset: 3px; }
.fgoH4 .reviews .rarrow[disabled] {
  background: var(--paper); color: var(--ink);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity .25s var(--ease), visibility 0s linear .25s;
}
.fgoH4 .reviews .rbar { display: none; }
.fgoH4 .reviews .rnav { display: none; }
/* the rail's own focus ring, drawn around the tiles: an outline on a
   full-bleed scroller showed as two stray full-width rules */
@supports selector(:has(*)) {
  .fgoH4 .reviews .rrow:focus-visible { outline: none; }
  .fgoH4 .reviews .rstage:has(> .rrow:focus-visible)::after {
    content: ""; position: absolute; z-index: 4; pointer-events: none;
    /* the carousel's frame, not a tile's: right at any scroll position */
    top: -6px; height: calc(var(--r-h) + 12px);
    left: 6px; right: 6px;
    border: 2px solid var(--forest); border-radius: 18px;
  }
}

@media (min-width: 1025px) {
  /* The repeated list shows on desktop too (Nate, 23 Sep: "it's feeling empty
     ... duping is easy"). Safe in this layout: a review repeats every 6th
     tile and at most 5 are ever in view (4 + the peek at 1760+), so the same
     review is never on screen twice. (The old centred rail showed 7.) */
  .fgoH4 .reviews::before, .fgoH4 .reviews::after { width: 56px; z-index: 2; }
  /* what scrolls past the page gutter fades out, so the rail always reads as
     starting on the gutter -- on a 2560 screen the 640px margin otherwise
     held two old tiles and put the same review in view twice */
  .fgoH4 .reviews::before {
    width: calc(var(--r-start) + 8px);
    background: linear-gradient(90deg, var(--paper) 0, var(--paper) calc(100% - 64px), rgba(251, 248, 241, 0) 100%);
  }
  /* and Prev sits by the first tile, not out at the screen edge */
  .fgoH4 .reviews .rarrow.prev { left: max(24px, calc(var(--r-start) - 72px)); }
  .fgoH4 .reviews .rrow { cursor: grab; -webkit-user-select: none; user-select: none; }
  .fgoH4 .reviews .rrow.is-dragging { cursor: grabbing; }
  .fgoH4 .reviews .rrow.is-dragging a { pointer-events: none; }
}
@media (min-width: 1025px) and (max-width: 1100px) {
  .fgoH4 .reviews::before, .fgoH4 .reviews::after { width: 28px; }
}

@media (max-width: 1024px) {
  .fgoH4 .reviews { --r-w: min(320px, calc(100vw - var(--gutter) - 16px - 56px)); --r-h: 420px; --r-gap: 16px; }
  @supports (width: 1cqw) {
    .fgoH4 .reviews { --r-w: min(320px, calc(100cqw - var(--gutter) - var(--r-gap) - 56px)); --r-h: 420px; }
  }
  .fgoH4 .reviews .rrow { scroll-snap-type: x mandatory; }
  .fgoH4 .reviews .rrow.is-gliding { scroll-snap-type: none; }
  .fgoH4 .reviews .rstage { padding-bottom: 68px; }
  /* a wider phone tile scales the photo up and lifted the ingredient into the
     byline (10px clear at 412); anchoring at 67% keeps it in the free band */
  .fgoH4 .reviews .rtile .bg, .fgoH4 .reviews .rtile:not(.on) .bg { object-position: 50% 67%; }
  .fgoH4 .reviews .rtile .q { padding: 20px 20px 0; }
  .fgoH4 .reviews .rtile .ttl { margin-top: 12px; font-size: 16px; line-height: 21px; }
  .fgoH4 .reviews .rtile blockquote p { font-size: 15px; line-height: 21px; }
  /* one row under the rail: a six-step indicator, then the two buttons */
  .fgoH4 .reviews .rarrow {
    top: auto; bottom: 0; margin: 0; width: 44px; height: 44px; box-shadow: none;
  }
  .fgoH4 .reviews .rarrow .ico { width: 20px; height: 20px; }
  .fgoH4 .reviews .rarrow.prev { left: auto; right: calc(var(--gutter) + 44px + 10px); }
  .fgoH4 .reviews .rarrow.next { right: var(--gutter); }
  .fgoH4 .reviews .rarrow[disabled] {
    opacity: .3; visibility: visible; transition: opacity .25s var(--ease);
  }
  .fgoH4 .reviews .rbar {
    display: flex; gap: 6px; position: absolute; bottom: 21px; height: 2px;
    left: var(--gutter); right: calc(var(--gutter) + 44px + 10px + 44px + 24px);
  }
  .fgoH4 .reviews .rbar > i {
    flex: 1 1 0; height: 2px; border-radius: 2px; background: var(--line);
    transition: background-color .25s var(--ease);
  }
  .fgoH4 .reviews .rbar > i.on { background: var(--ink); }
  .fgoH4 .reviews .rstage:has(> .rrow:focus-visible)::after { height: calc(var(--r-h) + 12px); }
}
/* 320px: a two-line title and a four-line quote reached the mint */
@media (max-width: 339px) {
  .fgoH4 .reviews .rtile .q { padding: 16px 16px 0; }
  .fgoH4 .reviews .rtile .ttl { margin-top: 10px; font-size: 15px; line-height: 20px; }
  .fgoH4 .reviews .rtile blockquote p { font-size: 14px; line-height: 20px; }
}
@media (prefers-reduced-motion: reduce) {
  .fgoH4 .reviews .rarrow, .fgoH4 .reviews .rbar > i { transition: none; }
}


/* ---- 73. THE HERO SHOWS THE PACKS WHOLE, AND KEEPS THEM OFF THE COPY ------
   Jason, on his desktop (1605x768): the pouches were cut off at the bottom.
   Measured at eight common windows, the live hero cut them at every one (32px
   at 1440x900 ... 236 at his) -- the photo was sized to the hero's WIDTH and
   the header floats over the top ~97px of it.
   Then Nate: the copy "collides with our BG image". The first fix sized the
   photo to the pouch band's HEIGHT only, and on taller windows (1280x1024,
   both default MacBook windows) that pushed Spearmint and its mint sprig under
   the headline -- 12 of 17 windows measured.
   So the width decides first. --h4-cap is the tallest photo whose pouch band
   (the mint sprig at 37% of its width to the green pouch at 95.5%, i.e. 1.12x
   its height back from the right edge) still starts --h4-gap right of the copy
   column (--h4-tr, from the wrap and the copy max-width in note 20). The hero
   is never taller than that, so the photo always covers it; the photo takes
   the smaller of "band fills the visible hero" and the cap, and the band is
   centred in what shows below the header. Where that leaves ground on the
   left, the photo dissolves into its own wall and marble (same horizon line,
   72.3%). Everything is in viewport units, so the same numbers hold in every
   property that uses them. */
@media (min-width: 1025px) {
  .fgoH4 .hero.is-tall {
    overflow: hidden;
    background-color: #dcc2ad;
    --h4-top: var(--fgo-head-pull, 97px);
    --h4-gap: 56px;
    --h4-tr: calc(max(80px, calc((100vw - 1440px) / 2 + 80px)) + min(520px, calc(43vw - 80px), calc(620px - 7vw)));
    --h4-cap: calc((100vw - var(--h4-tr) - var(--h4-gap)) / 1.12);
    --h4-H: min(max(calc(100svh - var(--h4-hero-trim, 115px)), 520px, min(36vw, 760px)), var(--h4-cap));
    --h4-ih: min(calc((var(--h4-H) - var(--h4-top) - 44px) / 0.645), var(--h4-cap));
    --h4-it: calc(var(--h4-top) + (var(--h4-H) - var(--h4-top) - 0.645 * var(--h4-ih)) / 2 - 0.145 * var(--h4-ih));
  }
  /* the copy centres in the part of the hero you can SEE, below the floating
     header (a capped 489px hero at 1060 put its first line under the header) */
  .fgoH4 .hero.is-tall .item { min-height: var(--h4-H); padding-top: calc(var(--h4-top) + 20px); padding-bottom: 28px; }
  .fgoH4 .hero.is-tall > picture img {
    inset: auto;
    top: var(--h4-it); right: 0; bottom: auto; left: auto;
    height: var(--h4-ih); width: auto; max-width: none;
    object-fit: cover; object-position: 50% 50%;
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 16%);
            mask-image: linear-gradient(to right, transparent 0, #000 16%);
  }
  .fgoH4 .hero.is-tall::before {
    content: ""; position: absolute; z-index: 0; left: 0; right: 0;
    top: var(--h4-it); height: var(--h4-ih);
    background: linear-gradient(to bottom,
      #dbba9d 0%, #e3c5ab 18%, #ecd3bc 32%, #e2c4a9 48%, #e0c0a4 62%, #ddbc9c 72.2%,
      #f3e6d9 72.4%, #ecd6c1 76%, #f1e1d2 80%, #dac0ac 92%, #d6bba6 100%);
  }
}


/* ---- 74. THE HERO ON TABLETS ----------------------------------------------
   Measured on the sandbox (23 Sep): from 769 to 1024px the phone layout ran
   the box at the tall phone photo's own ratio (1100:1734) -- 1211px tall on a
   768x1024 iPad, 1614px on a 1024x768 one, whose whole first screen was wall.
   From 801px the header floats over the hero as on desktop, and the phone
   layout's copy started under it, hiding the proof line.

   Portrait (and every phone): the stacked hero, but no taller than the screen
   allows -- the photo is bottom-anchored, so the crop only ever takes wall off
   the top. The floor keeps the pouches (54.8% of the photo down) clear of the
   copy; phones come out exactly as before, because the photo's own ratio is
   the smaller number there. Landscape tablets get the desktop layout and the
   landscape photo (the <source> media in fgo-h4-hero.liquid), sized to the
   pouch band as note 73 does, at 88% so the copy column stays clear. */
@media (max-width: 1024px) {
  .fgoH4 .hero.m-over .item {
    aspect-ratio: auto;
    height: min(157.6vw, max(calc(100svh - 176px), calc(71.2vw + 330px)));
  }
}
@media (min-width: 801px) and (max-width: 1024px) {
  .fgoH4 .hero.m-over .item {
    padding-top: calc(var(--fgo-head-pull, 97px) + 30px);
    height: min(157.6vw, max(calc(100svh - 115px), calc(71.2vw + var(--fgo-head-pull, 97px) + 330px)));
  }
}
@media (min-width: 801px) and (max-width: 1024px) and (orientation: landscape) {
  /* the same width-first sizing as note 73, on the tablet copy column
     (40px gutter, copy up to 400px): a 900x600 window put the lede on the
     mint sprig with the first version */
  .fgoH4 .hero.is-tall {
    overflow: hidden;
    background-color: #dcc2ad;
    --h4-top: var(--fgo-head-pull, 97px);
    --h4-gap: 48px;
    --h4-tr: calc(40px + min(400px, calc(44vw - 40px)));
    --h4-cap: calc((100vw - var(--h4-tr) - var(--h4-gap)) / 1.12);
    --h4-H: min(max(calc(100svh - var(--h4-hero-trim, 115px)), min(480px, calc(100svh - 55px)), 36vw), var(--h4-cap));
    --h4-ih: min(calc((var(--h4-H) - var(--h4-top) - 44px) / 0.645), var(--h4-cap));
    --h4-it: calc(var(--h4-top) + (var(--h4-H) - var(--h4-top) - 0.645 * var(--h4-ih)) / 2 - 0.145 * var(--h4-ih));
  }
  .fgoH4 .hero.is-tall .wrap { max-width: none; padding: 0 40px; }
  .fgoH4 .hero.is-tall.m-over .item {
    aspect-ratio: auto; height: auto;
    min-height: var(--h4-H);
    justify-content: center; align-items: flex-start; text-align: left;
    padding: calc(var(--fgo-head-pull, 97px) + 24px) 0 40px;
  }
  .fgoH4 .hero.is-tall.m-over .copy { max-width: min(400px, calc(44vw - 40px)); margin-inline: 0; }
  .fgoH4 .hero.is-tall .proof { justify-content: flex-start; }
  .fgoH4 .hero.is-tall h1 { margin: 20px 0 12px; }
  .fgoH4 .hero.is-tall.m-over .acts { flex-direction: row; justify-content: flex-start; align-items: center; margin-top: 20px; }
  .fgoH4 .hero.is-tall.m-over > picture img {
    position: absolute; inset: auto;
    top: var(--h4-it); right: 0; bottom: auto; left: auto;
    height: var(--h4-ih); width: auto; max-width: none;
    object-fit: cover; object-position: 50% 50%;
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 16%);
            mask-image: linear-gradient(to right, transparent 0, #000 16%);
  }
  .fgoH4 .hero.is-tall::before {
    content: ""; position: absolute; z-index: 0; left: 0; right: 0;
    top: var(--h4-it); height: var(--h4-ih);
    background: linear-gradient(to bottom,
      #dbba9d 0%, #e3c5ab 18%, #ecd3bc 32%, #e2c4a9 48%, #e0c0a4 62%, #ddbc9c 72.2%,
      #f3e6d9 72.4%, #ecd6c1 76%, #f1e1d2 80%, #dac0ac 92%, #d6bba6 100%);
  }
}

