/** Shopify CDN: Minification failed

Line 1766:0 Unexpected "}"
Line 1783:0 Unexpected "}"
Line 1831:0 Unexpected "}"
Line 1906:0 Unexpected "}"
Line 1920:0 Unexpected "}"
Line 1933:0 Unexpected "}"

**/
/* NOTE: Dawn sets html{font-size:62.5%} in theme.liquid, so 1rem = 10px.
   All rem values below are scaled x1.6 so they render at the intended pixel size. */
/* ==========================================================================
   KetoMarin — Kaizen-replica design system
   Kaizen tokens sampled from ketomarin/info/Kaizen-homepage.png,
   remapped onto KetoMarin's packaging palette (see info/07-BRAND-STYLE.md).
   Homepage build for KetoMarin.
   ========================================================================== */

:root {
  --km-w-light: 300;   /* the light weight, one switch for all of it */
  /* Ground tones — Kaizen #FFF7F2 / #EBECE7 */
  --km-cream: #F6F2E9;
  --km-cream-alt: #f2efe4;
  --km-white: #ffffff;

  /* Brand — from the box, not the current site */
  --km-lime: #B5D334;        /* Kaizen #01C271 → loud stat band            */
  --km-lime-deep: #93b616;   /* hover / borders                            */
  --km-olive: #3d5426;       /* same green as bands and footer             */
  --km-ink: #3d5426;         /* one dark green: type, CTAs, headings       */
  --km-tan: #d6a86b;
  --km-ink-strong: #3d5426;  /* same green; kept as a token for the lime band */         /* pasta tone through the die-cut window      */

  --km-rule: rgba(61, 84, 38, 0.14);
  --km-muted: rgba(61, 84, 38, 0.62);

  /* Type scale — five sizes, per Jesse's point 3 */
  --km-fs-micro:   1.2rem;                      /* labels, eyebrows, footnotes */
  --km-fs-body:    1.6rem;                      /* body copy, nav, buttons     */
  --km-fs-sub:     2.4rem;                      /* subheads, prices            */
  --km-fs-h:       clamp(3.2rem, 4vw, 4.8rem);  /* section headings            */
  --km-fs-display: clamp(4.8rem, 7vw, 7.2rem);  /* hero                        */

  /* Type */
  --km-display: 'Archivo', 'Helvetica Neue', Arial, sans-serif;
  --km-body: 'Inter', 'Helvetica Neue', Arial, sans-serif;

  /* Rhythm */
  --km-pad: 8.8rem;
  --km-max: 1400px;
  --km-gutter: 4rem;
}

@media screen and (max-width: 749px) {
  :root {
    --km-pad: 5.2rem;
    --km-gutter: 2.4rem;
  }
}

/* --------------------------------------------------------------- base --- */

/* Only html clips. Any overflow value on body makes body the scroll
   container, and position:sticky in the header then has nothing to stick to. */
html { overflow-x: clip; }
body { overflow-x: visible; }

.km-section {
  padding: var(--km-pad) 0;
  overflow: hidden;
  background: var(--km-cream);
  color: var(--km-ink);
  font-family: var(--km-body);
}
.km-section--alt { background: var(--km-cream-alt); }
.km-section--white { background: var(--km-white); }
.km-section--lime {
  background: var(--km-lime);
  color: var(--km-ink-strong);
  padding: 4rem 0;
}
.km-section--lime .km-eyebrow,
.km-section--lime .km-footnote { color: rgba(20, 24, 12, 0.72); }
.km-section--lime .km-stat__num,
.km-section--lime .km-stat__label,
.km-section--lime .km-h2 { color: var(--km-ink-strong); }
.km-section--olive { background: var(--km-olive); color: var(--km-cream); }
.km-section--flush { padding: 0; }

.km-wrap {
  max-width: 100%;
  width: var(--km-max);
  margin: 0 auto;
  padding: 0 var(--km-gutter);
  min-width: 0;
  box-sizing: border-box;
}
.km-split > *,
.km-hero__copy,
.km-stats__grid > *,
.km-inout > * { min-width: 0; }
.km-wrap--narrow { max-width: none; }   /* measure belongs on children, not the wrap */

/* --------------------------------------------------------------- type --- */

.km-display,
.km-h1, .km-h2, .km-h3 {
  /* Dawn's base.css sets color directly on h1-h5, and a direct rule beats an
     inherited one. Without this, headings ignore the section colour and render
     dark on the olive bands. */
  color: inherit;
  overflow-wrap: break-word;
  text-wrap: balance;
  font-family: var(--km-display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: -0.02em;
  line-height: 0.94;
  margin: 0;
}

.km-h1 { font-size: var(--km-fs-h); }
.km-h2 { font-size: var(--km-fs-h); }
.km-h3 { font-size: var(--km-fs-sub); letter-spacing: -0.01em; }

/* Kaizen's signature: one phrase of the headline in the accent colour.
   Set as a block so every headline breaks where the copy intends it to. */
.km-accent { color: var(--km-lime); }
.km-h1 .km-accent,
.km-h2 .km-accent { display: block; }
.km-section--lime .km-accent,
.km-section--olive .km-accent { color: var(--km-white); }

.km-body {
  font-size: var(--km-fs-body);
  line-height: 1.66;
  color: var(--km-muted);
  max-width: 54ch;
  margin: 2rem 0 0;
}
.km-section--olive .km-body { color: rgba(246, 242, 233, 0.78); }
.km-section--olive .km-eyebrow { color: rgba(246, 242, 233, 0.72); }
.km-section--olive .km-footnote { color: rgba(246, 242, 233, 0.68); }
.km-section--olive .km-inout__list li { border-bottom-color: rgba(246, 242, 233, 0.18); }

.km-eyebrow {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--km-muted);
  margin: 0 0 1.9rem;
}

.km-center { text-align: center; }
.km-center .km-body { margin-left: auto; margin-right: auto; }

.km-footnote {
  font-size: var(--km-fs-body);
  line-height: 1.55;
  opacity: 0.72;
  margin-top: 3.2rem;
  max-width: 62ch;
}

/* ------------------------------------------------------------ buttons --- */

.km-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.8rem;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  text-decoration: none;
  padding: 1.76rem 4rem;
  border-radius: 999px;
  border: 2px solid var(--km-ink);
  background: var(--km-ink);
  color: var(--km-cream);
  cursor: pointer;
  transition: background 0.18s ease, color 0.18s ease, transform 0.18s ease;
}
.km-btn:hover { background: transparent; color: var(--km-ink); transform: translateY(-1px); }

.km-btn--light { background: var(--km-cream); color: var(--km-ink); border-color: var(--km-cream); }
.km-btn--light:hover { background: transparent; color: var(--km-cream); }

.km-btn--block { width: 100%; }

/* --------------------------------------------------------------- pills --- */

.km-pills {
  display: flex;
  flex-wrap: wrap;
  gap: 2.4rem;
  padding: 0;
  margin: 0 0 3.04rem;
  list-style: none;
}
.km-pill {
  display: inline-flex;
  align-items: center;
  gap: 0.8rem;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
.km-pill::before {
  content: '';
  width: 1.088rem;
  height: 1.088rem;
  border-radius: 50%;
  background: var(--km-lime);
  flex: none;
}

/* --------------------------------------------------- announcement bar --- */

.km-announce {
  background: var(--km-ink);
  color: var(--km-cream);
  overflow: hidden;
  padding: 0.992rem 0;
}
.km-announce__track {
  display: flex;
  width: max-content;
  animation: km-marquee 38s linear infinite;
}
.km-announce__item {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  padding: 0 4.16rem;
  white-space: nowrap;
}
@keyframes km-marquee {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
  .km-announce__track { animation: none; }
}

/* -------------------------------------------------------------- header --- */

.km-header {
  background: var(--km-cream);
  border-bottom: 1px solid var(--km-rule);
  position: sticky;
  top: 0;
  z-index: 40;
}
.km-header__inner {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 1.6rem;
  padding: 1.68rem var(--km-gutter);
  max-width: var(--km-max);
  margin: 0 auto;
}
.km-header__logo {
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  letter-spacing: -0.02em;
  text-transform: none;
  text-decoration: none;
  color: var(--km-ink);
}
.km-header__nav {
  display: flex;
  gap: 3.04rem;
  list-style: none;
  margin: 0;
  padding: 0;
}
.km-header__nav a {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  text-decoration: none;
  color: var(--km-ink);
}
.km-header__nav a:hover { color: var(--km-lime-deep); }
.km-header__utils {
  display: flex;
  justify-content: flex-end;
  gap: 1.92rem;
  font-size: var(--km-fs-body);
}
.km-header__utils a { color: var(--km-ink); text-decoration: none; }

@media screen and (max-width: 989px) {
  .km-header__nav { display: none; }
  .km-header__inner { grid-template-columns: 1fr auto; }
}

/* ---------------------------------------------------------------- hero --- */

.km-hero { background: var(--km-cream); padding: 0; }
.km-hero__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: center;
  gap: 0;
  max-width: var(--km-max);
  margin: 0 auto;
}
.km-hero__copy { padding: 5.6rem var(--km-gutter); }
.km-hero__media { align-self: stretch; min-height: 40rem; position: relative; overflow: hidden; }
.km-hero__media img,
.km-hero__media svg {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.km-hero__sub { font-size: var(--km-fs-body); line-height: 1.6; margin: 2rem 0 2.6rem; max-width: 46ch; color: var(--km-muted); }
.km-hero__micro {
  font-size: var(--km-fs-body);
  letter-spacing: 0.04em;
  margin-top: 1.76rem;
  color: var(--km-muted);
}
.km-hero__byline {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  margin-top: 3rem;
  padding-top: 2rem;
  border-top: 1px solid var(--km-rule);
  color: var(--km-muted);
}

@media screen and (max-width: 749px) {
  .km-hero__grid { grid-template-columns: 1fr; }
  .km-hero__media { min-height: 32rem; order: -1; }
}

/* ----------------------------------------------------------- stat band --- */
/* Kaizen's "3X THE PROTEIN / 5X THE FIBER / 86% FEWER CARBS" grid */

.km-stats__head { max-width: none; margin-bottom: 2rem; }
.km-stats__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.24rem 3.2rem;
}
.km-stat__num {
  font-family: var(--km-display);
  font-size: var(--km-fs-display);
  font-weight: 700;
  line-height: 0.9;
  letter-spacing: -0.03em;
  display: block;
}
.km-stat__label {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-top: 0.88rem;
  display: block;
}
@media screen and (max-width: 749px) {
  .km-stats__grid { grid-template-columns: 1fr 1fr; }
}

/* ---------------------------------------------------------- comparison --- */

.km-table-scroll {
  overflow-x: auto;
  max-width: 100%;
  margin-top: 4.16rem;
  -webkit-overflow-scrolling: touch;
}
.km-table {
  width: 100%;
  min-width: 760px;
  border-collapse: collapse;
  font-size: var(--km-fs-body);
}
.km-table th,
.km-table td {
  padding: 1.68rem 1.84rem;
  text-align: left;
  border-bottom: 1px solid var(--km-rule);
  vertical-align: middle;
}
.km-table thead th {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  border-bottom: 2px solid var(--km-ink);
}
.km-table tbody th {
  font-weight: 700;
  color: var(--km-muted);
  position: sticky;
  left: 0;
  background: var(--km-cream);
}
.km-table .km-col-us {
  background: rgba(168, 206, 30, 0.16);
  font-weight: 700;
}
.km-table thead .km-col-us {
  background: var(--km-lime);
  color: var(--km-ink);
}

/* --------------------------------------------------------- split media --- */

.km-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6.4rem;
  align-items: center;
}
.km-split--reverse .km-split__media { order: 2; }
.km-split__media img,
.km-split__media svg {
  width: 100%; height: auto; display: block; border-radius: 2px;
}
@media screen and (max-width: 749px) {
  .km-split { grid-template-columns: 1fr; gap: 3.52rem; }
  .km-split--reverse .km-split__media { order: 0; }
}

/* ------------------------------------------------------- in / out cols --- */

.km-inout {
  display: grid;
  grid-template-columns: 1.35fr 1fr;
  gap: 4.4rem;
  margin-top: 4.4rem;
  align-items: start;
}
.km-inout__panel--out {
  background: var(--km-ink);
  color: var(--km-cream);
  padding: 2.8rem 3rem 2.2rem;
  border-radius: 3px;
}
.km-inout__panel--out .km-h3 { color: var(--km-lime); }
.km-inout__count {
  font-family: var(--km-display);
  font-size: var(--km-fs-display);
  font-weight: 700;
  line-height: 0.9;
  letter-spacing: -0.03em;
  display: block;
}
.km-inout__count-label {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  display: block;
  margin-top: 0.6rem;
  color: var(--km-muted);
}
.km-inout__list { list-style: none; margin: 2.24rem 0 0; padding: 0; }
.km-inout__list li {
  padding: 1.44rem 0;
  border-bottom: 1px solid var(--km-rule);
  font-size: var(--km-fs-body);
}
.km-inout__list--out li {
  color: rgba(246, 242, 233, 0.55);
  text-decoration: line-through;
  border-bottom-color: rgba(246, 242, 233, 0.16);
}
/* the IN panel carries all 13 ingredients; flow it into two sub-columns on desktop */
.km-inout__list--in { column-count: 2; column-gap: 4rem; }
.km-inout__list--in li { break-inside: avoid; }
@media screen and (max-width: 749px) { .km-inout__list--in { column-count: 1; } }
@media screen and (max-width: 749px) {
  .km-inout { grid-template-columns: 1fr; gap: 3.84rem; }
}

/* --------------------------------------------------------------- steps --- */

.km-steps {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 4.16rem;
  margin-top: 4.8rem;
  counter-reset: km-step;
}
.km-step { counter-increment: km-step; }
.km-step::before {
  content: counter(km-step, decimal-leading-zero);
  font-family: var(--km-display);
  font-size: var(--km-fs-h);
  font-weight: 700;
  color: var(--km-lime);
  line-height: 1;
  display: block;
  margin-bottom: 1.6rem;
}
@media screen and (max-width: 749px) {
  .km-steps { grid-template-columns: 1fr; gap: 3.2rem; }
}

/* ----------------------------------------------------------- pack cards --- */

.km-packs {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.8rem;
  margin-top: 4.8rem;
}
.km-pack {
  background: var(--km-white);
  border: 2px solid var(--km-rule);
  border-radius: 4px;
  padding: 2.8rem;
  display: flex;
  flex-direction: column;
  position: relative;
}
.km-pack--featured { border-color: var(--km-ink); }
.km-pack__flag {
  position: absolute;
  top: -1.36rem;
  left: 2.8rem;
  background: var(--km-lime);
  color: var(--km-ink);
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  padding: 0.72rem 1.52rem;
  border-radius: 999px;
}
.km-pack__media { margin-bottom: 2.24rem; }
.km-pack__media img,
.km-pack__media svg { width: 100%; height: auto; display: block; }
.km-pack__name {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: -0.01em;
  margin: 0;
}
.km-pack__price {
  font-family: var(--km-display);
  font-size: var(--km-fs-h);
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 1.12rem 0 0.24rem;
}
.km-pack__unit { font-size: var(--km-fs-body); color: var(--km-muted); margin: 0 0 2.4rem; }
.km-pack .km-btn {
  margin-top: auto;
  padding: 1.28rem 2.4rem;
  font-size: var(--km-fs-body);
  letter-spacing: 0.05em;
  border-width: 1px;
}
@media screen and (max-width: 749px) {
  .km-packs { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------ guarantee --- */

.km-guarantee { text-align: center; }
.km-guarantee .km-h2 { max-width: 18ch; margin: 0 auto; }
.km-guarantee__sig {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  margin-top: 4.16rem;
  opacity: 0.85;
}

/* ------------------------------------------------------------------ faq --- */

.km-faq__list { max-width: 100rem; margin: 4.8rem auto 0; }
.km-faq__item {
  background: var(--km-white);
  border: 1px solid var(--km-rule);
  border-radius: 3px;
  margin-bottom: 1.12rem;
}
.km-faq__q {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  padding: 2.16rem 2.56rem;
  cursor: pointer;
  list-style: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1.6rem;
}
.km-faq__q::-webkit-details-marker { display: none; }
.km-faq__q::after { content: '+'; font-size: var(--km-fs-sub); font-weight: var(--km-w-light); line-height: 1; }
.km-faq__item[open] .km-faq__q::after { content: '–'; }
.km-faq__a { padding: 0 2.56rem 2.4rem; font-size: var(--km-fs-body); line-height: 1.64; color: var(--km-muted); }

/* --------------------------------------------------------------- footer --- */

.km-footer { background: var(--km-olive); color: var(--km-cream); padding: var(--km-pad) 0 4rem; }
.km-footer__grid {
  display: grid;
  grid-template-columns: 1.1fr 0.8fr 0.8fr 0.8fr 1.5fr;
  gap: 4rem;
}
.km-footer__logo {
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  letter-spacing: -0.02em;
}
.km-footer__title {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  margin: 0 0 1.92rem;
  opacity: 0.75;
}
.km-footer__list { list-style: none; margin: 0; padding: 0; }
.km-footer__list li { margin-bottom: 0.96rem; }
.km-footer__list a { color: var(--km-cream); text-decoration: none; font-size: var(--km-fs-body); opacity: 0.88; }
.km-footer__list a:hover { opacity: 1; text-decoration: underline; }
.km-footer__capture .km-h3 { max-width: 16ch; margin-bottom: 1.92rem; color: var(--km-cream); }
.km-footer__form { display: flex; gap: 0.96rem; }
.km-footer__form input[type='email'] {
  flex: 1;
  padding: 1.52rem 1.76rem;
  border: 1px solid rgba(246, 242, 233, 0.35);
  background: transparent;
  color: var(--km-cream);
  border-radius: 999px;
  font-family: var(--km-body);
  font-size: var(--km-fs-body);
}
.km-footer__form input::placeholder { color: rgba(246, 242, 233, 0.55); }
.km-footer__bottom {
  margin-top: 5.6rem;
  padding-top: 2.56rem;
  border-top: 1px solid rgba(246, 242, 233, 0.2);
  font-size: var(--km-fs-body);
  opacity: 0.7;
  display: flex;
  justify-content: space-between;
  gap: 1.6rem;
  flex-wrap: wrap;
}
@media screen and (max-width: 989px) {
  .km-footer__grid { grid-template-columns: 1fr 1fr; }
}
@media screen and (max-width: 749px) {
  .km-footer__grid { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------- sticky buy --- */

.km-stickybuy {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 50;
  background: var(--km-ink);
  color: var(--km-cream);
  padding: 1.2rem var(--km-gutter);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.6rem;
  transform: translateY(110%);
  transition: transform 0.28s ease;
}
.km-stickybuy.is-visible { transform: translateY(0); }
.km-stickybuy__label {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.km-stickybuy .km-btn { padding: 1.152rem 2.72rem; font-size: var(--km-fs-body); }

/* ------------------------------------------------------- build note --- */

.km-placeholder-note {
  background: repeating-linear-gradient(45deg, #fff3c4, #fff3c4 12px, #ffe9a3 12px, #ffe9a3 24px);
  color: #4a3b00;
  font-family: var(--km-body);
  font-size: var(--km-fs-micro);
  letter-spacing: 0.06em;
  text-align: center;
  padding: 0.88rem 1.6rem;
  text-transform: uppercase;
  font-weight: 700;
}


/* --------------------------------------------------------------- reviews --- */

.km-reviews {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 4.8rem;
  margin-top: 4.8rem;
}
.km-review { margin: 0; }
.km-review__stars {
  color: var(--km-lime-deep);
  letter-spacing: 0.18em;
  font-size: var(--km-fs-body);
  margin: 0 0 1.44rem;
}
.km-review__quote {
  margin: 0;
  font-size: var(--km-fs-body);
  line-height: 1.64;
  color: var(--km-ink);
}
.km-review__by {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--km-muted);
  margin-top: 1.92rem;
}
@media screen and (max-width: 749px) {
  .km-reviews { grid-template-columns: 1fr; gap: 3.52rem; }
}


/* ------------------------------------------------------------- statement --- */

.km-statement { max-width: none; }
.km-statement .km-h2 { max-width: 18ch; }

.km-statement__lead {
  font-size: var(--km-fs-sub);
  line-height: 1.5;
  color: var(--km-ink);
  margin: 2.8rem 0 0;
  max-width: 42ch;
}
.km-section--olive .km-statement__lead { color: var(--km-cream); }



.km-statement__body {
  font-size: var(--km-fs-body);
  line-height: 1.6;
  color: var(--km-muted);
  margin-top: 3.2rem;
  max-width: 52ch;
}
.km-statement__body p + p { margin-top: 1.4rem; }

/* the line that hands off to the chart below it */
.km-statement__handoff {
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: -0.01em;
  line-height: 1.15;
  margin: 3.6rem 0 0;
  max-width: 24ch;
}
.km-section--olive .km-statement__body {
  font-size: var(--km-fs-body);
  line-height: 1.6;
  color: var(--km-muted);
  margin-top: 3.2rem;
  max-width: 52ch;
}
@media screen and (max-width: 749px) {
  .km-statement__body {
  font-size: var(--km-fs-body);
  line-height: 1.6;
  color: var(--km-muted);
  margin-top: 3.2rem;
  max-width: 52ch;
}
}


/* ------------------------------ ingredients, sitting under the chart --- */

.km-ing {
  margin-top: 3.2rem;
  max-width: none;
  padding-top: 3rem;
  border-top: 1px solid var(--km-rule);
  max-width: 92rem;
}
.km-ing__title {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--km-muted);
  margin: 0 0 1.4rem;
}
.km-ing__list {
  font-size: var(--km-fs-body);
  line-height: 1.55;
  margin: 0;
  color: var(--km-ink);
}
.km-ing__not {
  font-size: var(--km-fs-body);
  line-height: 1.55;
  margin: 1.2rem 0 0;
  color: var(--km-muted);
}
.km-ing__allergen {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin: 2rem 0 0;
  color: var(--km-ink);
}
@media screen and (max-width: 749px) {
  .km-ing__list, .km-ing__not { font-size: var(--km-fs-body); }
}


/* spacing modifiers, so one band can sit flush against the next */
.km-section--tight-bottom { padding-bottom: 4rem; }
.km-section--tight-top { padding-top: 0; }


/* when a band sits flush on the one below, the child spacing has to yield too */
.km-section--tight-top .km-table-scroll { margin-top: 0; }
.km-section--tight-top > .km-wrap > .km-center:empty { display: none; }


/* ------------------------------------------------- centred statement --- */

/* Left-aligned text in a single column that is itself centred on the page.
   Every child shares the column width, so they share one left edge and the
   whole block reads as centred rather than drifting left. */
.km-statement--center {
  text-align: left;
  max-width: 86rem;
  margin-left: auto;
  margin-right: auto;
}
.km-statement--center .km-h2,
.km-statement--center .km-statement__lead,
.km-statement--center .km-statement__body,
.km-statement--center .km-statement__handoff,

/* ------------------------------------------- centred ingredient panel --- */

.km-ing {
  text-align: center;
  margin-left: auto;
  margin-right: auto;
}
.km-ing__list, .km-ing__not { margin-left: auto; margin-right: auto; max-width: none; }


/* a band that needs less air than the page default */
.km-section--tight-y { padding-top: 5.6rem; padding-bottom: 5.6rem; }


/* ------------------------------------------- statement, full width --- */
/* Fills the page container by restructuring rather than stretching prose:
   headline spans, the failures become a 3-up row, body runs in two columns. */

.km-statement--wide { max-width: none; text-align: left; }
.km-statement--wide .km-h2 {
  max-width: 26ch;
  font-size: var(--km-fs-display);
}
.km-statement--wide .km-statement__lead {
  font-size: var(--km-fs-body);
  line-height: 1.6;
  max-width: 52ch;
  margin-top: 0;
  color: var(--km-muted);
}



/* One reading path: prose stays a single column so the eye never doubles back.
   The 3-up list above is the only horizontal element, and it is scannable. */
.km-statement--wide .km-statement__body {
  font-size: var(--km-fs-body);
  line-height: 1.6;
  color: var(--km-muted);
  margin-top: 3.2rem;
  max-width: 52ch;
}
.km-statement--wide .km-statement__body p { break-inside: avoid; margin-top: 0; }
.km-statement--wide .km-statement__body p + p { margin-top: 1.6rem; }
.km-statement--wide .km-statement__handoff { max-width: 30ch; margin-top: 5.6rem; }

@media screen and (max-width: 989px) {
  .km-statement--wide .km-tried { grid-template-columns: 1fr; gap: 0; }
  .km-statement--wide .km-tried li { padding: 1.6rem 0; }

}


/* ------------------------------------- statement pull quote + sig --- */
/* The pull quote is the structural load-bearer: it breaks the section so it
   never reads as a slab, and it carries the sentence the product claim rests on. */

.km-statement__quote {
  font-family: var(--km-display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: -0.02em;
  line-height: 1.05;
  text-wrap: balance;
  color: var(--km-ink);
  font-size: var(--km-fs-h);
  max-width: none;
  margin: 4.4rem 0 0;
}
.km-section--olive .km-statement__quote {
  font-family: var(--km-display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: -0.02em;
  line-height: 1.05;
  text-wrap: balance;
  color: var(--km-ink);
  font-size: var(--km-fs-h);
  max-width: none;
  margin: 4.4rem 0 0;
}

.km-statement__sig {
  font-family: var(--km-body);
  font-size: var(--km-fs-body);
  font-weight: var(--km-w-light);
  text-transform: none;
  letter-spacing: 0;
  color: var(--km-muted);
  margin: 3.2rem 0 0;
  padding-top: 2.4rem;
  border-top: 1px solid var(--km-rule);
  max-width: 52ch;
}

.km-statement--wide .km-statement__body {
  font-size: var(--km-fs-body);
  line-height: 1.6;
  color: var(--km-muted);
  margin-top: 3.2rem;
  max-width: 52ch;
}
@media screen and (max-width: 749px) {
  .km-statement__quote { margin-top: 4rem; }
}

.km-sr { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }


/* ===================== crossed-out alternatives (story beat) ============ */
/*  Small objects with air around them. Each brush X is drawn on its own
    absolutely-positioned layer, sized past the image bounds, so nothing here
    may clip: no overflow:hidden on the figure, the item or the row.          */

:root { --km-strike: #a6432c; }

.km-crossed {
  list-style: none;
  margin: 7rem auto 7rem;
  padding: 0;
  max-width: 76rem;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8rem;
  overflow: visible;
}

.km-crossed__item {
  text-align: center;
  overflow: visible;
}

.km-crossed__figure {
  position: relative;
  width: 100%;
  max-width: 16rem;
  aspect-ratio: 1;
  margin: 0 auto 4.8rem;
  overflow: visible;
}

.km-crossed__ph {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 0.8rem;
  border: 1px dashed rgba(61, 84, 38, 0.3);
  border-radius: 2px;
  background: rgba(61, 84, 38, 0.03);
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: rgba(61, 84, 38, 0.38);
}

/* the X is the dominant element; --km-over is set per item in the markup */
.km-crossed__x {
  position: absolute;
  top: var(--km-over);
  right: var(--km-over);
  bottom: var(--km-over);
  left: var(--km-over);
  width: auto;
  height: auto;
  overflow: visible;
  pointer-events: none;
}

.km-crossed__name {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--km-ink);
  margin: 0;
}

.km-crossed__note {
  font-size: var(--km-fs-body);
  line-height: 1.5;
  color: var(--km-muted);
  margin: 0.8rem 0 0;
}

@media screen and (max-width: 989px) {
  .km-crossed { gap: 6rem; max-width: 64rem; }
  .km-crossed__figure { max-width: 13rem; }
}

@media screen and (max-width: 749px) {
  .km-crossed {
    grid-template-columns: 1fr;
    gap: 7rem;
    max-width: 30rem;
    margin-top: 4.8rem;
  }
  .km-crossed__figure { max-width: 16rem; }
}


/* full-width statement: text centred, image row already centres itself */
.km-statement--wide { text-align: center; }
.km-statement--wide .km-h2,
.km-statement--wide .km-statement__lead,
.km-statement--wide .km-statement__quote,
.km-statement--wide .km-statement__body,
.km-statement--wide .km-statement__sig,
.km-statement--wide .km-statement__handoff {
  margin-left: auto;
  margin-right: auto;
}
.km-statement--wide .km-h2 { max-width: 26ch; }
.km-statement--wide .km-statement__lead { max-width: 46ch; }
.km-statement--wide .km-statement__quote { max-width: 22ch; }
.km-statement--wide .km-statement__body { max-width: 56ch; }
.km-statement--wide .km-statement__sig { max-width: 46ch; border-top: 0; padding-top: 0; }
.km-statement--wide .km-statement__handoff { max-width: 30ch; }


/* ---- full-width statement: one vertical rhythm, deliberately short ----
   Every gap is 3.2rem except around the image row, which needs 5.6rem so the
   brush X (which overhangs its figure by up to 40px) clears the text.        */

.km-statement--wide .km-eyebrow { margin-bottom: 1.6rem; }
.km-statement--wide .km-statement__lead { margin-top: 3.2rem; }
.km-statement--wide .km-crossed { margin-top: 5.6rem; margin-bottom: 5.6rem; }
.km-statement--wide .km-crossed__figure { margin-bottom: 4rem; }
.km-statement--wide .km-statement__quote { margin-top: 3.2rem; }
.km-statement--wide .km-statement__body { margin-top: 3.2rem; }
.km-statement--wide .km-statement__handoff { margin-top: 3.2rem; }

/* the band itself sits close to its neighbours */
.km-statement--wide.km-statement { padding-top: 0; }
.km-section--tight-bottom { padding-bottom: 4rem; }


/* ------------------------- height trims across the page ---------------- */

/* Why I made this: smaller specimens shrink the brush overhang too, which is
   what was forcing the big gap between each image and its label. */
.km-statement--wide .km-crossed { margin-top: 4.4rem; margin-bottom: 4.4rem; }
.km-crossed__figure { max-width: 13rem; }
.km-statement--wide .km-crossed__figure { margin-bottom: 3.4rem; }
.km-crossed__note { margin-top: 0.6rem; }
.km-statement--wide .km-statement__quote { margin-top: 2.8rem; }
.km-statement--wide .km-statement__body { margin-top: 2.8rem; }

/* a band that needs less air than the page default */
.km-section--tight-y { padding-top: 5.2rem; padding-bottom: 5.2rem; }

/* my promise */
.km-guarantee .km-body { margin-top: 1.6rem; }
.km-guarantee .km-btn { margin-top: 0; }
.km-guarantee p:has(.km-btn) { margin-top: 2.4rem !important; }
.km-guarantee__sig { margin-top: 2.4rem; }

/* pack ladder */
.km-packs { margin-top: 3.6rem; }
.km-pack { padding: 2.2rem; }
.km-pack__media { margin-bottom: 1.6rem; }
.km-pack__unit { margin-bottom: 2rem; }

/* FAQ */
.km-faq__list { margin-top: 3.6rem; }
.km-faq__item { margin-bottom: 0.8rem; }
.km-faq__q { padding: 1.5rem 1.8rem; }
.km-faq__a { padding: 0 1.8rem 1.6rem; }


/* the chart reads as a continuation of the paragraph above it: same ground,
   almost no seam, and the table follows close behind its heading */
.km-section--tight-bottom { padding-bottom: 2.4rem; }
.km-section--tight-top { padding-top: 0; }
.km-section--tight-top .km-table-scroll { margin-top: 3.2rem; }


/* compact split: media sized to sit with the text rather than tower over it */
.km-split--compact { grid-template-columns: 1.18fr 0.82fr; gap: 5.6rem; }
.km-split--compact .km-split__media img,
.km-split--compact .km-split__media svg { max-width: 40rem; margin-left: auto; }
@media screen and (max-width: 749px) {
  .km-split--compact { grid-template-columns: 1fr; }
  .km-split--compact .km-split__media img { margin-left: 0; max-width: 100%; }
}


/* ------------------------------- hero pass ----------------------------- */

/* one gap value for every element in the hero */
.km-hero__copy { padding: 4.8rem var(--km-gutter); }
.km-hero .km-eyebrow { margin: 0 0 2.4rem; }
.km-hero__sub { font-size: var(--km-fs-body); line-height: 1.55; margin: 2.4rem 0; max-width: 40ch; }
.km-hero .km-pills { margin: 0 0 2.4rem; }
.km-hero__micro { margin-top: 2.4rem; }

/* headline sized so "Pasta for diabetics." holds one line */
.km-h1 { font-size: var(--km-fs-h); }

.km-hero__media { min-height: 34rem; }

/* the ingredient line runs the full container instead of stopping at 62ch */
.km-footnote--wide { max-width: none; }

/* glucose chart centred in the space it is given, not pushed to the edge */
.km-split--compact .km-split__media img,
.km-split--compact .km-split__media svg { margin-left: auto; margin-right: auto; }


/* promise: signature removed, so close the space it left behind */
.km-guarantee .km-guarantee__sig { display: none; }
.km-guarantee p:has(.km-btn) { margin-bottom: 0 !important; }

/* glucose chart: bigger, and sitting centred in its column */
.km-split--compact { grid-template-columns: 1fr 1fr; gap: 4.8rem; }
.km-split--compact .km-split__media img,
.km-split--compact .km-split__media svg {
  max-width: 52rem;
  margin-left: auto;
  margin-right: auto;
}


/* glucose chart fills its half of the split: larger, and no side margin
   leaving it stranded toward the outer edge */
.km-split--compact { grid-template-columns: 1fr 1fr; gap: 4.8rem; }
.km-split--compact .km-split__media img,
.km-split--compact .km-split__media svg {
  max-width: 100%;
  width: 100%;
  margin-left: 0;
  margin-right: 0;
}


/* ---------------- one content width, one type measure ------------------ */

/* text measures raised so the type column is proportionate to the container
   rather than floating in the middle of it */
.km-statement--wide .km-h2 { max-width: 24ch; }
.km-statement--wide .km-statement__lead { max-width: 54ch; }
.km-statement--wide .km-statement__body { max-width: 62ch; }
.km-statement--wide .km-statement__quote { max-width: 20ch; }
.km-crossed { max-width: 68rem; }

/* the table follows the container instead of dominating it */
.km-table { font-size: var(--km-fs-micro); }
.km-table th, .km-table td { padding: 1.3rem 1.1rem; }

/* allergen line returns, without the divider above it */
.km-ing {
  border-top: 0;
  padding-top: 0;
  margin-top: 2.4rem;
}
.km-ing__allergen { margin-top: 0; }


/* why I made this: left aligned, everything on one left edge */
.km-statement--wide { text-align: left; }
.km-statement--wide .km-h2,
.km-statement--wide .km-statement__lead,
.km-statement--wide .km-statement__quote,
.km-statement--wide .km-statement__body,
.km-statement--wide .km-statement__sig,
.km-statement--wide .km-statement__handoff,
.km-statement--wide .km-crossed {
  margin-left: 0;
  margin-right: 0;
}


/* ---- the story block and the chart's heading sit inset from the page ----
   Everything else keeps the normal container; only this run is pulled in.  */
.km-statement--wide,
.km-comparison__head {
  padding-left: 10rem;
  padding-right: 10rem;
}
@media screen and (max-width: 989px) {
  .km-statement--wide,
  .km-comparison__head { padding-left: 0; padding-right: 0; }
}

/* text measures sized against the inset column */
.km-statement--wide .km-h2 { max-width: 26ch; }
.km-statement--wide .km-statement__lead { max-width: 58ch; }
.km-statement--wide .km-statement__body { max-width: 66ch; }
.km-statement--wide .km-crossed { max-width: none; }

/* glucose heading gets the room to stop breaking so hard */
.km-split--compact { grid-template-columns: 1.12fr 0.88fr; }
.km-split__body .km-h2 { max-width: none; }

/* ------------------------------ lightbox ------------------------------- */

.km-split__media--zoom { cursor: zoom-in; position: relative; }
.km-split__media--zoom::after {
  content: 'Click to enlarge';
  position: absolute;
  right: 1.2rem;
  bottom: 1.2rem;
  background: rgba(20, 24, 12, 0.78);
  color: var(--km-cream);
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  padding: 0.7rem 1.2rem;
  border-radius: 999px;
  pointer-events: none;
  transition: background 0.18s ease;
}
.km-split__media--zoom:hover::after,
.km-split__media--zoom:focus-visible::after { background: rgba(20, 24, 12, 0.95); }
.km-split__media--zoom:focus-visible { outline: 3px solid var(--km-lime); outline-offset: 4px; }

.km-lightbox {
  position: fixed;
  inset: 0;
  z-index: 100;
  background: rgba(20, 24, 12, 0.92);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 4rem;
  opacity: 0;
  transition: opacity 0.18s ease;
  cursor: zoom-out;
}
.km-lightbox.is-open { opacity: 1; }
.km-lightbox img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  display: block;
  border-radius: 3px;
}
.km-lightbox__close {
  position: absolute;
  top: 2rem;
  right: 2.4rem;
  background: none;
  border: 0;
  color: var(--km-cream);
  font-size: var(--km-fs-h);
  line-height: 1;
  cursor: pointer;
  padding: 1rem;
}
@media screen and (max-width: 749px) {
  .km-lightbox { padding: 1.6rem; }
}


/* the story block and the chart heading share one left edge, set well inside
   the page container. The table below stays full width, so the text column
   reads as deliberately inset rather than accidentally narrow. */
.km-comparison__head { text-align: left; }
.km-statement--wide,
.km-comparison__head {
  padding-left: 20rem;
  padding-right: 20rem;
}
.km-comparison__head .km-h2 { max-width: 26ch; }
@media screen and (max-width: 1199px) {
  .km-statement--wide,
  .km-comparison__head { padding-left: 10rem; padding-right: 10rem; }
}
@media screen and (max-width: 989px) {
  .km-statement--wide,
  .km-comparison__head { padding-left: 0; padding-right: 0; }
}


/* .km-statement--wide IS the wrap, so its padding replaces the wrap gutter,
   while .km-comparison__head sits inside the wrap and adds to it. Offset the
   statement by the gutter so both land on the same left edge. */
.km-statement--wide { padding-left: 24rem; padding-right: 24rem; }
.km-comparison__head { padding-left: 20rem; padding-right: 20rem; }
@media screen and (max-width: 1199px) {
  .km-statement--wide { padding-left: 14rem; padding-right: 14rem; }
  .km-comparison__head { padding-left: 10rem; padding-right: 10rem; }
}
@media screen and (max-width: 989px) {
  .km-statement--wide { padding-left: var(--km-gutter); padding-right: var(--km-gutter); }
  .km-comparison__head { padding-left: 0; padding-right: 0; }
}


/* ================= REVERT: back to centred, full width ================= */
/* Undoes the left-align and the inset padding experiments. The story block
   and the chart heading are centred on the normal container again.        */

.km-statement--wide {
  text-align: center;
  padding-left: var(--km-gutter);
  padding-right: var(--km-gutter);
  max-width: 100%;   /* never 'none': that cancels .km-wrap's clamp and the
                        block stays 1400px wide on a phone */
}
.km-statement--wide .km-h2,
.km-statement--wide .km-statement__lead,
.km-statement--wide .km-statement__quote,
.km-statement--wide .km-statement__body,
.km-statement--wide .km-statement__sig,
.km-statement--wide .km-statement__handoff,
.km-statement--wide .km-crossed {
  margin-left: auto;
  margin-right: auto;
}
.km-statement--wide .km-h2 { max-width: 26ch; }
.km-statement--wide .km-statement__lead { max-width: 46ch; }
.km-statement--wide .km-statement__quote { max-width: 22ch; }
.km-statement--wide .km-statement__body { max-width: 56ch; }
.km-statement--wide .km-crossed { max-width: 76rem; }

.km-comparison__head {
  text-align: center;
  padding-left: 0;
  padding-right: 0;
}
.km-comparison__head .km-h2 { max-width: none; margin-left: auto; margin-right: auto; }

@media screen and (max-width: 989px) {
  .km-statement--wide { padding-left: var(--km-gutter); padding-right: var(--km-gutter); }
}


/* ============ story: text left, rejected images stacked right ========== */

.km-statement--split {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  column-gap: 7rem;
  align-items: start;
  text-align: left;
  max-width: none;
  padding-left: var(--km-gutter);
  padding-right: var(--km-gutter);
}
.km-statement--split > * { margin-left: 0; margin-right: 0; }

.km-statement--split .km-eyebrow { grid-column: 1 / -1; grid-row: 1; }
.km-statement--split .km-h2 { grid-column: 1 / -1; grid-row: 2; max-width: 26ch; }
.km-statement--split .km-statement__lead { grid-column: 1; grid-row: 3; max-width: 46ch; margin-top: 3.2rem; }
.km-statement--split .km-statement__quote { grid-column: 1; grid-row: 4; max-width: 16ch; margin-top: 4rem; }
.km-statement--split .km-statement__body { grid-column: 1; grid-row: 5; max-width: 52ch; margin-top: 3.2rem; }
.km-statement--split .km-statement__handoff { grid-column: 1 / -1; grid-row: 6; margin-top: 4.8rem; }

/* the rejects run down the right, each as an image with its verdict beside it */
.km-statement--split .km-crossed {
  grid-column: 2;
  grid-row: 3 / span 3;
  display: grid;
  grid-template-columns: 1fr;
  gap: 5.6rem;
  max-width: none;
  margin: 3.2rem 0 0;
}
.km-statement--split .km-crossed__item {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: 3rem;
  text-align: left;
}
.km-statement--split .km-crossed__figure {
  width: 11rem;
  max-width: 11rem;
  margin: 0;
}
.km-statement--split .km-crossed__name { margin: 0; }
.km-statement--split .km-crossed__note { margin-top: 0.6rem; }

@media screen and (max-width: 989px) {
  .km-statement--split { grid-template-columns: 1fr; }
  .km-statement--split .km-h2,
  .km-statement--split .km-statement__lead,
  .km-statement--split .km-statement__quote,
  .km-statement--split .km-statement__body,
  .km-statement--split .km-statement__handoff,
  .km-statement--split .km-crossed { grid-column: 1; grid-row: auto; }
  .km-statement--split .km-crossed { gap: 4rem; }
}


/* ---------- split: text column left, rejects stacked down the right ----- */

.km-statement--split {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  grid-template-rows: auto auto auto auto;
  column-gap: 7rem;
  align-items: start;
  text-align: left;
  max-width: none;
  padding-left: var(--km-gutter);
  padding-right: var(--km-gutter);
}
.km-statement--split > * { margin-left: 0; margin-right: 0; }
.km-statement--split .km-eyebrow { grid-column: 1 / -1; grid-row: 1; }
.km-statement--split .km-h2 { grid-column: 1 / -1; grid-row: 2; max-width: 26ch; }
.km-statement--split .km-story__main { grid-column: 1; grid-row: 3; }
.km-statement--split .km-crossed { grid-column: 2; grid-row: 3; margin: 0; }
.km-statement--split .km-statement__handoff { grid-column: 1 / -1; grid-row: 4; margin-top: 4.8rem; }

.km-statement--split .km-statement__lead { max-width: 46ch; margin-top: 3.2rem; }
.km-statement--split .km-statement__quote { max-width: 16ch; margin-top: 4rem; }
.km-statement--split .km-statement__body { max-width: 52ch; margin-top: 3.2rem; }

/* each reject: image left, name and verdict stacked beside it */
.km-statement--split .km-crossed {
  display: grid;
  grid-template-columns: 1fr;
  gap: 5.2rem;
  max-width: none;
  margin-top: 3.2rem;
}
.km-statement--split .km-crossed__item {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-rows: auto auto;
  column-gap: 3rem;
  align-content: center;
  text-align: left;
}
.km-statement--split .km-crossed__figure {
  grid-column: 1;
  grid-row: 1 / span 2;
  width: 11rem;
  max-width: 11rem;
  margin: 0;
  align-self: center;
}
.km-statement--split .km-crossed__name { grid-column: 2; grid-row: 1; align-self: end; margin: 0; }
.km-statement--split .km-crossed__note { grid-column: 2; grid-row: 2; align-self: start; margin-top: 0.6rem; }

@media screen and (max-width: 989px) {
  .km-statement--split { grid-template-columns: 1fr; }
  .km-statement--split .km-story__main,
  .km-statement--split .km-crossed,
  .km-statement--split .km-h2,
  .km-statement--split .km-statement__handoff { grid-column: 1; grid-row: auto; }
  .km-statement--split .km-crossed { gap: 4rem; margin-top: 4.8rem; }
}


/* stacked rejects: the gap has to clear the brush overhang on both items */
.km-statement--split .km-crossed { gap: 8.4rem; }


/* ---- split refinements: centred header, 2+1 rejects, wider text ------- */

/* header centred across both columns */
.km-statement--split .km-eyebrow,
.km-statement--split .km-h2 {
  text-align: center;
  max-width: none;
  margin-left: auto;
  margin-right: auto;
}
.km-statement--split .km-h2 { max-width: 30ch; }

/* text column runs the full width it is given */
.km-statement--split { grid-template-columns: 1fr 1fr; column-gap: 6rem; }
.km-statement--split .km-statement__lead,
.km-statement--split .km-statement__body { max-width: none; }
.km-statement--split .km-statement__quote { max-width: 18ch; }

/* konjac and chickpea share a row, lupin sits under them */
.km-statement--split .km-crossed {
  grid-template-columns: 1fr 1fr;
  gap: 7.2rem 4rem;
}
.km-statement--split .km-crossed__item {
  grid-template-columns: 1fr;
  grid-template-rows: auto auto auto;
  justify-items: start;
  column-gap: 0;
}
.km-statement--split .km-crossed__figure {
  grid-column: 1;
  grid-row: 1;
  width: 10rem;
  max-width: 10rem;
  margin: 0 0 3.2rem;
}
.km-statement--split .km-crossed__name { grid-column: 1; grid-row: 2; align-self: auto; }
.km-statement--split .km-crossed__note { grid-column: 1; grid-row: 3; align-self: auto; }

@media screen and (max-width: 989px) {
  .km-statement--split .km-crossed { grid-template-columns: 1fr 1fr; gap: 6rem 3rem; }
}
@media screen and (max-width: 749px) {
  .km-statement--split .km-crossed { grid-template-columns: 1fr; gap: 5.6rem; }
}


/* bigger specimens, smaller X over them, name only underneath */
.km-crossed__figure { max-width: 20rem; }
.km-statement--wide .km-crossed { max-width: 78rem; gap: 6rem; }
.km-statement--wide .km-crossed__figure { margin-bottom: 2.4rem; }
.km-crossed__ph { font-size: var(--km-fs-body); }


/* ------------ comparison as a split: story left, table right ----------- */

.km-comparison--split .km-wrap {
  display: grid;
  grid-template-columns: 0.8fr 1.2fr;
  column-gap: 6rem;
  align-items: start;
}
.km-comparison--split .km-comparison__head {
  grid-column: 1;
  text-align: left;
  padding-left: 0;
  padding-right: 0;
}
.km-comparison--split .km-comparison__head .km-h2 { max-width: 16ch; margin-left: 0; }
.km-comparison--split .km-comparison__head .km-body { max-width: none; margin-left: 0; }
.km-comparison--split .km-comparison__head .km-body p + p { margin-top: 1.6rem; }

.km-comparison--split .km-table-scroll { grid-column: 2; margin-top: 0; }
.km-comparison--split .km-table { min-width: 62rem; font-size: var(--km-fs-micro); }
.km-comparison--split .km-table th,
.km-comparison--split .km-table td { padding: 1.15rem 0.9rem; }

.km-comparison--split .km-footnote,
.km-comparison--split .km-ing { grid-column: 1 / -1; }

@media screen and (max-width: 989px) {
  .km-comparison--split .km-wrap { grid-template-columns: 1fr; row-gap: 4.8rem; }
  .km-comparison--split .km-comparison__head,
  .km-comparison--split .km-table-scroll { grid-column: 1; }
}


/* ===================== comparison table, rebuilt ======================= */
/* Note: Dawn sets the root font to 10px, so table type must be ~1.5rem to
   read at 15px. Earlier values of 0.92rem were rendering at 9px.          */

.km-comparison--split .km-wrap {
  grid-template-columns: 1fr 1fr;
  column-gap: 6.4rem;
  align-items: center;
}

.km-comparison--split .km-table-scroll {
  grid-column: 2;
  margin-top: 0;
  overflow-x: visible;
}

.km-comparison--split .km-table {
  min-width: 0;
  width: 100%;
  table-layout: fixed;
  font-size: var(--km-fs-body);
  border-collapse: collapse;
}

/* label column narrow, five value columns share the rest evenly */
.km-comparison--split .km-table col,
.km-comparison--split .km-table th:first-child,
.km-comparison--split .km-table td:first-child { width: 17%; }

.km-comparison--split .km-table thead th {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  letter-spacing: 0.05em;
  line-height: 1.25;
  text-transform: uppercase;
  padding: 0 0.9rem 1.4rem;
  border-bottom: 2px solid var(--km-ink);
  vertical-align: bottom;
  word-break: normal;
  overflow-wrap: break-word;
}

.km-comparison--split .km-table tbody th {
  font-family: var(--km-body);
  font-size: var(--km-fs-body);
  font-weight: var(--km-w-light);
  text-transform: none;
  letter-spacing: 0;
  color: var(--km-muted);
  padding: 1.5rem 0.9rem;
  border-bottom: 1px solid var(--km-rule);
  background: none;
  position: static;
}

.km-comparison--split .km-table td {
  padding: 1.5rem 0.9rem;
  border-bottom: 1px solid var(--km-rule);
  vertical-align: middle;
}

/* the owned column: header block in lime, cells tinted, nothing else shouts */
.km-comparison--split .km-table thead .km-col-us {
  background: var(--km-lime);
  color: var(--km-ink-strong);
  padding-top: 1.2rem;
  border-radius: 3px 3px 0 0;
}
.km-comparison--split .km-table td.km-col-us {
  background: rgba(168, 206, 30, 0.16);
  font-weight: 700;
  color: var(--km-ink);
}
.km-comparison--split .km-table tbody tr:last-child td.km-col-us {
  border-radius: 0 0 3px 3px;
}

@media screen and (max-width: 989px) {
  .km-comparison--split .km-wrap { grid-template-columns: 1fr; row-gap: 4.8rem; }
  .km-comparison--split .km-comparison__head,
  .km-comparison--split .km-table-scroll { grid-column: 1; }
  .km-comparison--split .km-table-scroll { overflow-x: auto; }
  .km-comparison--split .km-table { min-width: 58rem; }
}


/* ================= hero: full-bleed image, copy on top ================= */

.km-hero--bleed .km-hero__grid {
  position: relative;
  grid-template-columns: 1fr;
  min-height: 56rem;
  align-items: center;
}
.km-hero--bleed .km-hero__copy { max-width: 62rem; padding: 8rem var(--km-gutter); }
.km-hero--bleed .km-hero__media { display: none; }

/* specimen photographs sit inside the dashed frame the placeholder used */
.km-crossed__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 2px;
}


/* the X reads as a mark over the specimen, not a block on top of it */
.km-crossed__x { opacity: 0.72; }

/* the accent line holds one line in the narrower split column */
.km-comparison--split .km-comparison__head .km-h2 { max-width: 20ch; }
.km-comparison--split .km-comparison__head .km-accent { white-space: nowrap; }


/* the supplied hero art already keeps its left side clear: no scrim needed */


/* pack shots carry a lot of white margin: crop in so the boxes fill the card */
.km-pack__media {
  aspect-ratio: 1;
  overflow: hidden;
  border-radius: 2px;
}
.km-pack__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform: scale(1.5);
}

/* hero: pulled back a little and shifted left. Background colour matches the
   art so the narrower image leaves no visible seam at the edges. */
}


/* the hero art now carries its own empty left area, so cover with no seams */
}


/* pack shots sit at their natural size in the card, no crop */
.km-pack__media { aspect-ratio: auto; overflow: visible; }
.km-pack__media img {
  width: 100%;
  height: auto;
  object-fit: fill;
  transform: none;
}

/* hero: tighter crop, product sitting further left */
}


/* ==================== value range, images, rhythm ====================== */

/* 1. Deeper darks, used more. Body copy was 62% opacity of a mid olive,
      which sat too close to the cream ground for anything to punch.       */
:root {
  --km-ink: #3d5426;
  --km-muted: rgba(61, 84, 38, 0.80);
  --km-rule: rgba(61, 84, 38, 0.16);
}
.km-statement__lead,
.km-statement__body,
.km-body,
.km-crossed__note,
.km-review__quote,
.km-faq__a { color: var(--km-muted); }

.km-h1, .km-h2, .km-statement__quote, .km-crossed__name,
.km-table tbody th, .km-pack__name, .km-pack__price { color: var(--km-ink); }

.km-eyebrow { color: rgba(61, 84, 38, 0.66); }
.km-footnote { opacity: 1; color: rgba(61, 84, 38, 0.68); }
.km-table td { color: var(--km-ink); }

/* 2 + 3. Pack shots fill their frame and share one ground with the card, so
          there is no photo-white inside card-white inside page-cream.      */
.km-pack {
  background: #f6f7f9;
  border-color: rgba(61, 84, 38, 0.14);
}
.km-pack--featured { border-color: var(--km-ink); }
.km-pack__media {
  aspect-ratio: 1;
  overflow: hidden;
  border-radius: 2px;
  background: #f6f7f9;
  margin-bottom: 2rem;
}
.km-pack__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform: scale(1.32);
}

/* hero art crops at the frame instead of floating inside it */
}

/* 6. Rejects: bigger, and the X dark enough to read as a rejection while
      still letting the noodle underneath show.                            */
.km-crossed__figure { max-width: 27rem; }
.km-statement--wide .km-crossed { max-width: 98rem; gap: 7rem; }
.km-crossed__x { opacity: 0.85; }
.km-crossed__img { filter: contrast(1.06) saturate(1.05); }


/* specimen photos crop to fill their frame, so no second background shows */
.km-crossed__frame {
  position: absolute;
  inset: 0;
  overflow: hidden;
  border-radius: 2px;
  display: block;
}
.km-crossed__img {
  position: static;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform: scale(1.62);
  filter: contrast(1.05);
}
/* the mark reads as a decisive rejection */
.km-crossed__x { opacity: 1; }


/* ---- fixes ------------------------------------------------------------ */

/* The value-range pass set headings to dark ink globally, which overrode the
   olive bands and rendered them dark-on-dark. Headings there are lime. */
.km-section--olive .km-h1,
.km-section--olive .km-h2,
.km-section--olive .km-statement__quote,
.km-guarantee .km-h2 { color: var(--km-lime); }
.km-section--olive .km-accent,
.km-guarantee .km-accent { color: var(--km-cream); }

/* room under the pull quote before the next band */
.km-statement--wide .km-statement__quote { margin-bottom: 4.8rem; }

/* the three rejects sit at their natural framing, all identical */
.km-crossed__img { transform: none; }

/* pack shots pulled back */
.km-pack__media img { transform: scale(1.08); }


/* olive bands: statement in white, accent phrase in lime */
.km-section--olive .km-h1,
.km-section--olive .km-h2,
.km-guarantee .km-h2 { color: var(--km-cream); }
.km-section--olive .km-accent,
.km-guarantee .km-accent { color: var(--km-lime); }

/* lupin sits a little further back in its frame than the other two */
.km-crossed__item:nth-child(3) .km-crossed__img { transform: scale(1.18); }


/* brand logo in the header; its cream ground matches the header exactly */
.km-header__logo-img {
  display: block;
  height: 4.4rem;
  width: auto;
  mix-blend-mode: multiply;
}
@media screen and (max-width: 749px) {
  .km-header__logo-img { height: 3.6rem; }
}


/* hero: shorter band, tighter crop, art pushed as far left as it goes */
}


/* hero art sits a little lower in the band */
}


/* all three rejects zoomed by the same factor, keeping the framing even
   (lupin keeps its extra 1.18 correction on top) */
.km-crossed__img { transform: scale(1.28); }
.km-crossed__item:nth-child(3) .km-crossed__img { transform: scale(1.51); }


/* hero art nudged back up slightly */
}


/* per-specimen framing corrections */
.km-crossed__item:nth-child(2) .km-crossed__img { transform: scale(1.62); }  /* chickpea */
.km-crossed__item:nth-child(3) .km-crossed__img { transform: scale(1.66); }  /* lupin */


/* chickpea pulled back: it was overshooting the other two */
.km-crossed__item:nth-child(2) .km-crossed__img { transform: scale(1.42); }


/* hero art raised again */
}


/* ============ hero fit, headline scale, pack cutouts ==================== */

/* 1. The hero art is padded to a 3.62 ratio, so at any realistic viewport the
      background is height-locked: the full arrangement sits inside the band
      and only empty padding is ever cropped. No clipped boxes, no cut bowl. */
@media screen and (max-width: 749px) {
}

/* 2. The first line is now the largest type on the page: 64px against the
      section headings' 54px. */
.km-h1 {
  font-size: var(--km-fs-display);
  line-height: 0.98;
}

/* 3. Pack shots are transparent cutouts, so the section cream is the only
      ground: no photo-white inside card-white inside page-cream. The shadow
      is drawn from the silhouette instead of baked into the file. */
.km-pack { background: transparent; }
.km-pack__media { background: transparent; overflow: visible; }
.km-pack__media img {
  object-fit: contain;
  transform: scale(1.06);
  filter: drop-shadow(0 1.4rem 2.4rem rgba(61, 84, 38, 0.16));
}


/* ================= header: dark bar, sticky, one big mark ============== */

/* lime strip over a deep olive bar, so the two do not read as one slab */
.km-announce {
  background: var(--km-lime);
  color: var(--km-ink-strong);
}

.km-header {
  background: var(--km-olive);
  border-bottom: 0;
  position: sticky;
  top: 0;
  z-index: 60;
}
.km-header__inner { padding: 1.1rem var(--km-gutter); }
.km-header__logo,
.km-header__nav a,
.km-header__utils a { color: var(--km-cream); }
.km-header__nav a { position: relative; }
.km-header__nav a:hover,
.km-header__utils a:hover { color: var(--km-lime); }

/* the mark is a transparent cream PNG now, so it needs no blend mode and can
   run nearly the full height of the bar */
.km-header__logo-img {
  display: block;
  height: 5.6rem;
  width: auto;
  mix-blend-mode: normal;
}

/* the pack shadow the boxes lost when they were cut out, drawn from the
   silhouette instead of baked into the file */
.km-pack__media img {
  filter:
    drop-shadow(0 2.2rem 3.2rem rgba(61, 84, 38, 0.22))
    drop-shadow(0 0.6rem 1.1rem rgba(61, 84, 38, 0.13));
}

/* hero: tighter frame on the art, pulled in off the right edge */

/* The art is inset from the right edge, which exposes the band behind it.
   This gradient is sampled straight off the image's right-hand column, so the
   join is invisible instead of a hard vertical seam. */


/* ========================== mobile ===================================== */

@media screen and (max-width: 989px) {
  /* header: mark and cart on one line, the three links centred beneath */
  .km-header__inner {
    grid-template-columns: auto 1fr;
    row-gap: 1rem;
    padding: 1.2rem 2.4rem;
  }
  .km-header__logo  { grid-column: 1; grid-row: 1; }
  .km-header__utils { grid-column: 2; grid-row: 1; align-self: center; }
  .km-header__nav {
    display: flex;
    grid-column: 1 / -1;
    grid-row: 2;
    justify-content: center;
    gap: 2.8rem;
  }
  .km-header__logo-img { height: 4rem; }
  .km-header__nav a { font-size: var(--km-fs-micro); letter-spacing: 0.06em; }
  .km-header__utils { font-size: var(--km-fs-body); }
}

@media screen and (max-width: 749px) {
  :root { --km-gutter: 2.2rem; --km-pad: 5.6rem; }

  /* hero: copy on a clean ground, art as its own band underneath, instead of
     type sitting directly on a photograph. The art itself is set in the single
     hero block at the end of this file. */
  .km-hero--bleed .km-hero__grid { min-height: 0; grid-template-columns: 1fr; }
  .km-hero--bleed .km-hero__copy { padding: 4rem var(--km-gutter) 3.2rem; }
  .km-hero__media { display: none; }

  /* type scale */
  .km-h1 { font-size: var(--km-fs-h); }
  .km-h2 { font-size: var(--km-fs-h); }
  .km-hero__sub { font-size: var(--km-fs-body); margin: 2rem 0; }
  .km-eyebrow { font-size: var(--km-fs-micro); }
  .km-hero .km-pills { gap: 1.2rem 2rem; }

  /* the reject row stacks; keep the crossing marks in proportion */
  .km-statement--wide .km-crossed { max-width: 32rem; gap: 4rem; }
  .km-crossed__figure { max-width: 24rem; }

  /* stacked split blocks read top-to-bottom */
  .km-split, .km-split--compact { grid-template-columns: 1fr; row-gap: 3.2rem; }

  /* one pack per row, at a size worth looking at */
  .km-packs { grid-template-columns: 1fr; gap: 2.4rem; }
}

@media screen and (max-width: 749px) {
  /* Six columns cannot honestly fit a phone. Let the table scroll, but pin the
     row label so a value is never orphaned from what it measures, and say so
     rather than leaving a column sliced off mid-word. */
  .km-comparison--split .km-table-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
  }
  .km-comparison--split .km-table-scroll::before {
    content: 'Swipe to compare →';
    display: block;
    font-family: var(--km-display);
    font-size: var(--km-fs-micro);
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: rgba(61, 84, 38, 0.5);
    margin-bottom: 1.2rem;
  }
  .km-comparison--split .km-table { min-width: 52rem; font-size: var(--km-fs-body); }
  .km-comparison--split .km-table thead th { font-size: var(--km-fs-micro); padding: 0 0.7rem 1.1rem; }
  .km-comparison--split .km-table tbody th,
  .km-comparison--split .km-table td { padding: 1.15rem 0.7rem; }
  .km-comparison--split .km-table tbody th {
    position: sticky;
    left: 0;
    z-index: 1;
    background: var(--km-cream-alt);
    font-size: var(--km-fs-micro);
  }
}

/* position:sticky sticks inside its containing block, and Shopify wraps each
   section in a div the exact height of that section — so sticky on .km-header
   had no room to travel. The wrapper is what has to stick. */
.shopify-section-group-header-group[id*="km_header"] {
  position: sticky;
  top: 0;
  z-index: 60;
}
.km-header { position: static; }

/* The specimens are transparent cutouts now, so there is nothing to crop to.
   The old scale-inside-a-clipped-frame was there to hide their cream photo
   backgrounds; kept, it clips the bowls and paints their soft shadow into a
   square. Let them sit at their natural size instead. */
.km-crossed__frame { overflow: visible; background: none; }
.km-crossed__img,
.km-crossed__item:nth-child(2) .km-crossed__img,
.km-crossed__item:nth-child(3) .km-crossed__img {
  transform: none;
  filter: none;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

/* back to the framing you tuned, applied evenly: the files are each cropped to
   their own bounding box, so one factor keeps all three the same size */
.km-crossed__img,
.km-crossed__item:nth-child(2) .km-crossed__img,
.km-crossed__item:nth-child(3) .km-crossed__img { transform: scale(1.24); }


/* ============== white navbar, stock product photography ================ */

.km-header {
  background: var(--km-white);
  border-bottom: 1px solid var(--km-rule);
}
.km-header__logo,
.km-header__nav a,
.km-header__utils a { color: var(--km-ink); }
.km-header__nav a:hover,
.km-header__utils a:hover { color: var(--km-lime-deep); }

/* the mark is the real logo on a transparent ground, so it needs no blend
   mode and leaves no cream tile behind it on white */
.km-header__logo-img { mix-blend-mode: normal; height: 5.2rem; }

/* pack shots: the supplied photographs as they are, sharing one ground with
   the card so the photo's own background is not a second rectangle */
.km-pack { background: #f6f7f9; border-color: rgba(61, 84, 38, 0.14); }
.km-pack--featured { border-color: var(--km-ink); }
.km-pack__media {
  aspect-ratio: 1;
  overflow: hidden;
  border-radius: 2px;
  background: #f6f7f9;
}
.km-pack__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform: scale(1.08);
  filter: none;
}

/* footer copy sits on the dark olive band and has to be set light explicitly —
   .km-body and .km-footnote both carry the dark on-cream colour */
.km-footer__tagline,
.km-footer__note {
  font-family: var(--km-body);
  color: var(--km-cream);
  max-width: 46ch;
}
.km-footer__tagline { font-size: var(--km-fs-body); line-height: 1.6; margin: 1.2rem 0 0; opacity: 0.85; }
.km-footer__note    { font-size: var(--km-fs-body); line-height: 1.6; margin: 1.6rem 0 0; opacity: 0.75; }
.km-footer__bottom, .km-footer__bottom span { color: var(--km-cream); opacity: 0.7; }


/* the art sits flush to the right edge now: the new source is wider through the
   arrangement, and pulling it left ran the boxes under the headline */

/* the comparison figures need their basis stated, or the numbers mean nothing */
.km-table__basis {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(61, 84, 38, 0.55);
  margin: 0 0 1.4rem;
}

/* the whole guarantee headline reads white on the olive band */
.km-guarantee .km-accent { color: var(--km-cream); }

/* the standalone basis line is gone; it lives in the table's corner cell now,
   set apart from the column headings so it reads as a note, not a column */
.km-table__basis { display: none; }
.km-comparison--split .km-table thead th.km-table__corner {
  font-family: var(--km-body);
  font-size: var(--km-fs-micro);
  font-weight: var(--km-w-light);
  letter-spacing: 0;
  line-height: 1.35;
  text-transform: none;
  color: rgba(61, 84, 38, 0.58);
}

/* ========================================================================
   2026-09-06 revision pass — Jesse's notes
   ======================================================================== */

/* White navbar; cream is used on the bands further down the page.            */
.km-header {
  background: var(--km-white);
  border-bottom: 1px solid var(--km-rule);
}
.km-header__logo,
.km-header__nav a,
.km-header__utils a { color: var(--km-ink); }

/* Cards stay white against the cream packs section, so they read as cards and
   the white-ground product shots disappear into them. */
.km-pack { background: var(--km-white); }

/* The crossed-out bowls were driving the height of the whole section.       */
.km-statement--wide .km-crossed,
.km-crossed { max-width: 52rem; }
.km-statement--wide .km-crossed { margin-top: 3.2rem; margin-bottom: 3.2rem; }

/* Stacked split: copy above, two images side by side beneath. Used by the
   glucose section so the two CGM sets read as one comparison.               */
.km-split--stacked { display: block; }
.km-split--stacked .km-split__body { max-width: 92rem; margin: 0 auto 4rem; text-align: center; }
.km-split--stacked .km-h2 { text-wrap: nowrap; }
.km-split--stacked .km-h2 .km-accent { display: block; }
.km-split--stacked .km-split__pair {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2.4rem;
  align-items: start;
}
.km-split--stacked .km-split__pair img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: 4px;
}
@media screen and (max-width: 749px) {
  .km-split--stacked .km-split__pair { grid-template-columns: 1fr; gap: 1.6rem; }
  .km-split--stacked .km-split__body { margin-bottom: 2.8rem; }
}

/* four competitor bowls, not three */
.km-crossed,
.km-statement--wide .km-crossed { grid-template-columns: repeat(4, 1fr); max-width: 72rem; }
@media screen and (max-width: 749px) {
  .km-crossed,
  .km-statement--wide .km-crossed { grid-template-columns: repeat(2, 1fr); }
}

/* CGM pair: smaller, and a caption under it rather than a wall of numbers above */
.km-split--stacked .km-split__pair { max-width: 92rem; margin-left: auto; margin-right: auto; gap: 3.2rem; }
.km-split--stacked .km-split__caption {
  max-width: 72rem;
  margin: 2.4rem auto 0;
  text-align: center;
  font-size: var(--km-fs-micro);
  line-height: 1.6;
  opacity: 0.8;
}

/* CGM pair: each panel is its own zoom target, labelled and signposted */
.km-split--stacked .km-split__fig { margin: 0; cursor: zoom-in; position: relative; }
.km-split--stacked .km-split__fig img { transition: transform .18s ease, box-shadow .18s ease; }
.km-split--stacked .km-split__fig:hover img,
.km-split--stacked .km-split__fig:focus-visible img { transform: scale(1.015); box-shadow: 0 10px 30px rgba(0,0,0,.22); }
.km-split--stacked .km-split__zoom {
  display: block; margin-top: .4rem;
  font-size: var(--km-fs-micro); font-weight: var(--km-w-light); letter-spacing: .06em;
  text-transform: uppercase; opacity: .62;
}
.km-split--stacked .km-split__figcap {
  margin-top: 1rem; text-align: center;
  font-size: var(--km-fs-body); font-weight: 700; letter-spacing: .02em;
}
.km-section--olive .km-split__figcap { color: var(--km-cream); }

/* The pack shots carry their own white ground, which vanishes into a white
   card. A hairline keeps the product image a distinct object.               */
.km-pack__media {
  border: 1px solid var(--km-rule);
  border-radius: 3px;
  overflow: hidden;
}

/* ---- palette spec 2026-09-06: white objects on cream bands ---- */
.km-header { border-bottom: 0; }                 /* white bar, no border */
.km-table { background: var(--km-white); }
.km-faq__item { background: var(--km-white); }

/* Hero art: the client's own image, used as supplied. No keying, no tinting,
   no scrim over it, and no sampled gradient behind it.                      */

/* Phone hero: keep the theme's structure of copy on a clean ground with the
   art as its own band beneath, and feed that band the client's 4x5 crop
   rather than the 16x9 desktop file.                                        */
@media screen and (max-width: 749px) {
  /* the desktop rule above sets a section background unconditionally, which
     re-introduced the 16x9 art behind the copy on phones. Clear it, so the
     4x5 crop in the band below is the only hero image.                      */
}

/* --------------------------------------------------------------------------
   Pack cards, live pricing (deliverable 4)
   The add-to-cart button now sits inside a form, so the auto margin that used
   to pin it to the bottom of the card has to move onto the form instead.
   -------------------------------------------------------------------------- */
.km-pack__form {
  margin-top: auto;
  display: block;
}
.km-pack .km-pack__form .km-btn { margin-top: 0; width: 100%; }
.km-pack .km-btn[disabled] {
  opacity: 0.45;
  cursor: not-allowed;
  pointer-events: none;
}
.km-pack__was {
  font-family: var(--km-body);
  font-size: var(--km-fs-sub);
  font-weight: var(--km-w-light);
  color: var(--km-muted);
  text-decoration: line-through;
  margin-left: 0.8rem;
  letter-spacing: 0;
}
.km-pack__save {
  display: inline-block;
  margin-left: 0.8rem;
  font-weight: 700;
  color: var(--km-ink);
}

/* ==========================================================================
   HERO ART — the only place the hero background is set.

   Everything that used to live above this (about twenty competing
   background-size / background-position declarations, each tuned to a hero
   photograph that has since been replaced) has been deleted. If the hero art
   needs adjusting, adjust it here and nowhere else.

   The rule: the product is never cropped, at any width. That means `contain`,
   never `cover`, wherever the whole frame is shown. The photograph's own ground
   is rgb(245,242,234) against a --km-cream of rgb(246,242,233), one point
   apart, so the area `contain` leaves uncovered is invisible and the art still
   reads as full bleed.

   >=1200px  overlay. Art contained and anchored right, copy over the empty left
             half of the frame, which is what that half of the photograph is for.
             1200 is the width below which a 62rem copy column and the product
             can no longer share a row without touching.
   <=1199px  stacked. Copy on clean cream, then the 4:5 crop as its own band.
             `cover` is safe there because the only thing it removes is the empty
             cream above the boxes, and the band is capped at 52rem so the
             product stays a sensible size on a tablet.
   ========================================================================== */

.km-hero--bleed {
  background-color: var(--km-cream);
  background-image: var(--km-hero-src);
  background-size: contain;
  background-position: right center;
  background-repeat: no-repeat;
}
.km-hero--bleed::before { content: none; }

/* Tracks the viewport so the contained art scales with it instead of being
   stranded in a fixed-height band. */
.km-hero--bleed .km-hero__grid { min-height: clamp(46rem, 46vw, 66rem); }

@media screen and (min-width: 1200px) {
  /* 44vw is the widest the copy can be and still clear the product, which
     starts about 45% across the frame. */
  .km-hero--bleed .km-hero__copy { max-width: min(62rem, 44vw); }
}

@media screen and (max-width: 1199px) {
  .km-hero--bleed {
    background-image: none;
    background-color: var(--km-cream);
  }
  .km-hero--bleed .km-hero__grid { min-height: 0; grid-template-columns: 1fr; }
  .km-hero--bleed .km-hero__copy { max-width: none; padding: 6.4rem var(--km-gutter) 3.2rem; }
  .km-hero--bleed::after {
    content: '';
    display: block;
    width: 100%;
    max-width: 52rem;
    margin: 0 auto;
    /* the 4:5 crop with its empty upper half trimmed away: the boxes start
       about 49% down the source, and a 7:5 band shows the lower 57% of it, so
       the product sits with a little cream above and below and nothing is cut */
    aspect-ratio: 7 / 5;
    /* versioned by the section; the literal is only a fallback */
    background-image: var(--km-hero-src-mobile, url("km-hero-mobile.webp"));
    background-size: cover;
    background-position: center bottom;
    background-repeat: no-repeat;
  }
}

@media screen and (max-width: 749px) {
  .km-hero--bleed .km-hero__copy { padding: 4rem var(--km-gutter) 3.2rem; }
}

/* ==========================================================================
   PHONE VERTICAL RHYTHM — comparison band and CGM heading
   ========================================================================== */

@media screen and (max-width: 989px) {
  /* `.km-comparison--split .km-wrap` became a grid with a 4.8rem row-gap, but
     its children kept the margins they carried when it was flow layout, so the
     two stacked: 47px under the heading, 80px under the table (48 + a 32
     margin-top), 88px under the footnote (48 + 16 + 24). One gap does the
     spacing now and the margins are zeroed. */
  .km-comparison--split .km-wrap { row-gap: 4rem; }
  .km-comparison--split .km-table-scroll,
  .km-comparison--split .km-footnote,
  .km-comparison--split .km-ing {
    margin-top: 0;
    margin-bottom: 0;
  }

  /* A trailing margin on the last child adds to the section's own bottom
     padding. The story section reads 56px at the top and 24 + 48 = 72 at the
     bottom; 24 + 32 makes both ends 56. */
  .km-statement--wide .km-statement__quote { margin-bottom: 3.2rem; }
  /* Same thing under the pack ladder: 52 + 16 against 52. */
  .km-packs ~ .km-footnote { margin-bottom: 0; }

  /* `text-wrap: nowrap` holds the CGM headline to two lines on a desktop. On a
     phone it runs "I ate both pastas on a CGM." straight off the right edge,
     because a line that cannot wrap simply overflows. `balance` lets it wrap
     and evens the two lines rather than leaving "a CGM." alone on the second. */
  .km-split--stacked .km-h2 { text-wrap: balance; }
}

@media screen and (max-width: 749px) {
  /* The table already scrolls sideways on a phone, so a column is free to be
     as wide as its heading needs. Without this, our own column head breaks as
     "KETOMARI / N". */
  .km-comparison--split .km-table thead th.km-col-us { white-space: nowrap; }
}

/* --------------------------------------------------------------------------
   Footer: 51px of horizontal page scroll at 360px wide.
   The email input is a flex item with `flex: 1`, but a flex item's automatic
   minimum size is its content, and an <input>'s content width is its `size`
   attribute, not zero. So input + JOIN had a 389px floor, the single-column
   grid track inherited it (a `1fr` track is also `min-width: auto`), and the
   whole footer pushed the document 51px wider than the viewport.
   -------------------------------------------------------------------------- */
.km-footer__form input[type='email'] { min-width: 0; }

@media screen and (max-width: 749px) {
  .km-footer__grid { grid-template-columns: minmax(0, 1fr); }
}

/* --------------------------------------------------------------------------
   Desktop hero placement, driven by where the PRODUCT sits in the frame
   rather than by the frame's own edges.

   Measured off km-hero.webp (1920x1080): the boxes and bowl occupy
   x 47.1% to 100%, y 32.6% to 94.9%. Everything above and to the left of that
   is empty cream, which is why centring the frame left the product sitting low.

   So: size the frame so the product comes out at 51vw wide (the widest it can
   be before it meets a 62rem copy column at 1200px), then offset the frame
   upward by the height of its own dead top, which puts the top of the boxes on
   13.3rem -- the y the h1 starts at, constant from 1280 up.
   -------------------------------------------------------------------------- */
@media screen and (min-width: 1200px) {
  .km-hero--bleed {
    background-size: 96.4vw auto;
    background-position: right calc(13.1rem - 17.66vw);
  }
  /* The copy has to be top-aligned for that 13.1rem to mean anything. While the
     grid was `align-items: center` the h1 slid down as the section grew, so the
     art matched it at 1440 and was 68px above it at 1920. */
  .km-hero--bleed .km-hero__grid {
    align-items: start;
    min-height: calc(17.3rem + 33.8vw);
  }
  .km-hero--bleed .km-hero__copy { padding-bottom: 4.8rem; }

  /* The hero now ends about 4rem under the bowl, so the 8.8rem the next section
     was adding on top of that is the gap Shane wanted taken out. */
  [id$="__hero"] + .shopify-section .km-section { padding-top: 5.6rem; }
}

/* ==========================================================================
   FAQ PAGE and CONTACT PAGE
   Rule for these two, and for anything added after them: no new font family,
   no new font size, no new colour. Every value below is either an existing
   token or a value already used elsewhere in this stylesheet.
   ========================================================================== */

/* ---- FAQ page ---- */

.km-faq__intro { max-width: 60ch; margin: 2.4rem auto 0; }

.km-faq__jump {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.8rem;
  list-style: none;
  max-width: 100rem;
  margin: 3.2rem auto 0;
  padding: 0;
}
.km-faq__jump a {
  display: block;
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--km-ink);
  background: var(--km-white);
  border: 1px solid var(--km-rule);
  border-radius: 999px;
  padding: 0.9rem 1.6rem;
  text-decoration: none;
}
.km-faq__jump a:hover,
.km-faq__jump a:focus-visible {
  background: var(--km-lime);
  border-color: var(--km-lime);
}

.km-faq__group {
  max-width: 100rem;
  margin: 0 auto;
  /* the header is sticky, so an anchor lands under it without this */
  scroll-margin-top: 12rem;
}
.km-faq__group + .km-faq__group { margin-top: 4.8rem; }
.km-faq__grouptitle {
  padding-bottom: 1.2rem;
  border-bottom: 1px solid var(--km-rule);
  margin-bottom: 0;
}
.km-faq__group .km-faq__list { margin-top: 1.6rem; }
.km-faq__footer {
  max-width: 100rem;
  margin: 4.8rem auto 0;
  padding-top: 2.4rem;
  border-top: 1px solid var(--km-rule);
}

/* ---- Contact page ---- */

.km-contact__intro { max-width: 60ch; margin: 1.6rem auto 0; }

.km-contact {
  max-width: 62rem;
  margin: 3.2rem auto 0;
}
.km-contact__row { margin-bottom: 1.4rem; }
.km-contact__label {
  display: block;
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--km-ink);
  margin-bottom: 0.5rem;
}
.km-contact__opt {
  font-weight: var(--km-w-light);
  letter-spacing: 0.06em;
  color: var(--km-muted);
}
.km-contact__input {
  display: block;
  width: 100%;
  min-width: 0;
  box-sizing: border-box;
  font-family: var(--km-body);
  font-size: var(--km-fs-body);
  color: var(--km-ink);
  /* cream, not white. On a cream section that means the border has to carry the
     field, so it steps up from --km-rule's 0.14 alpha to 0.3 of the same ink. */
  background: var(--km-cream);
  border: 1px solid rgba(61, 84, 38, 0.3);
  border-radius: 3px;
  padding: 1.1rem 1.4rem;
}
.km-contact__input:focus-visible {
  outline: 2px solid var(--km-lime);
  outline-offset: 2px;
}
.km-contact__input--area { resize: vertical; line-height: 1.64; }
.km-contact__note {
  font-size: var(--km-fs-body);
  line-height: 1.64;
  color: var(--km-ink);
  background: var(--km-white);
  border: 1px solid var(--km-rule);
  border-left-width: 3px;
  border-left-color: var(--km-lime);
  border-radius: 3px;
  padding: 1.4rem 1.6rem;
  margin: 0 0 2.4rem;
}
.km-contact__note--error { border-left-color: var(--km-tan); }
.km-contact__stepshead {
  max-width: 100rem;
  margin: 4rem auto 0;
  text-align: center;
}
.km-contact__stepshead + .km-steps { margin-top: 2.4rem; }
.km-contact__direct {
  max-width: 62rem;
  margin: 4.8rem auto 0;
  text-align: center;
}

/* the pack ladder's block button is the same control; keep them identical */
.km-contact__form .km-btn--block { width: 100%; }

/* ==========================================================================
   PRODUCT PAGE
   Same rule as the FAQ and contact pages: no new font family, no new font
   size, no new colour. Existing tokens and existing classes only.
   ========================================================================== */

.km-pdp__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6.4rem;
  align-items: start;
}
/* The gallery holds while the buy column scrolls past it, so the two finish
   together instead of leaving a tall empty column on the left. */
.km-pdp__gallery { position: sticky; top: 12rem; }

.km-pdp__stage {
  /* No card. The pack shots carry a white ground, so on a white section they
     blend instead of sitting on the page as tiles. */
  background: transparent;
  padding: 0;
  position: relative;
}
.km-pdp__arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 4.4rem;
  height: 4.4rem;
  border: 1px solid var(--km-rule);
  border-radius: 50%;
  background: var(--km-white);
  color: var(--km-ink);
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  /* The image's mix-blend-mode gives it its own stacking context, which paints
     it over the earlier prev arrow and swallows its clicks. */
  z-index: 2;
}
.km-pdp__arrow:hover { background: var(--km-lime); border-color: var(--km-lime); }
.km-pdp__arrow--prev { left: 0; }
.km-pdp__arrow--next { right: 0; }
.km-pdp__stage img { display: block; width: 100%; height: auto; }

.km-pdp__thumbs {
  display: flex;
  flex-wrap: wrap;
  gap: 1.2rem;
  list-style: none;
  margin: 1.6rem 0 0;
  padding: 0;
}
.km-pdp__thumb {
  display: block;
  width: 8.8rem;
  padding: 0.6rem;
  background: transparent;
  border: 1px solid var(--km-rule);
  border-radius: 3px;
  cursor: pointer;
}
.km-pdp__thumb:hover,
.km-pdp__thumb:focus-visible { border-color: var(--km-ink); }
.km-pdp__thumb img { display: block; width: 100%; height: auto; }

.km-pdp__lede { margin-top: 1.6rem; }
/* Kaizen's spec grid: two columns of short factual lines, not pills. */
.km-pdp__specs {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1rem 2.4rem;
  list-style: none;
  margin: 2.8rem 0 0;
  padding: 0;
}
.km-pdp__spec {
  position: relative;
  padding-left: 2rem;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  color: var(--km-ink);
}
.km-pdp__spec::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.62em;
  width: 0.9rem;
  height: 0.9rem;
  border-radius: 50%;
  background: var(--km-lime);
}

.km-pdp__form { margin-top: 2.8rem; }
.km-pdp__packs { border: 0; padding: 0; margin: 0; }
.km-pdp__legend {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--km-ink);
  padding: 0;
  margin-bottom: 1.2rem;
}
.km-pdp__packs {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.2rem;
}
.km-pdp__legend { grid-column: 1 / -1; }
.km-pdp__pack {
  display: block;
  position: relative;
  text-align: center;
  background: var(--km-white);
  border: 2px solid var(--km-rule);
  border-radius: 3px;
  padding: 1rem 0.6rem;
  cursor: pointer;
}
.km-pdp__pack input { position: absolute; opacity: 0; pointer-events: none; }
.km-pdp__pack:hover { border-color: var(--km-ink); }
.km-pdp__pack:has(input:checked) { border-color: var(--km-ink); background: var(--km-lime); }
.km-pdp__pack:has(input:focus-visible) { outline: 2px solid var(--km-lime); outline-offset: 2px; }
.km-pdp__pack--out { opacity: 0.45; cursor: not-allowed; }
.km-pdp__packname {
  display: block;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--km-ink);
}
.km-pdp__packmeta {
  display: block;
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
  margin-top: 0.2rem;
}
.km-pdp__pack:has(input:checked) .km-pdp__packmeta { color: var(--km-ink); }

.km-pdp__price {
  font-family: var(--km-display);
  /* --km-fs-sub is the token the scale reserves for prices; --km-fs-h is a
     section heading and was shouting next to a 1-line product name. */
  font-size: var(--km-fs-sub);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--km-ink);
  margin: 2.4rem 0 0.4rem;
}
/* the struck-through price has to sit under the live one, not level with it */
.km-pdp__price .km-pack__was { font-size: var(--km-fs-body); }
.km-pdp__unit { font-size: var(--km-fs-body); color: var(--km-muted); margin: 0 0 2.4rem; }
.km-pdp__form .km-btn--block { width: 100%; }
.km-pdp__micro { margin-top: 1.6rem; }
.km-pdp__details { margin-top: 3.2rem; max-width: none; }

@media screen and (max-width: 989px) {
  .km-pdp__grid { grid-template-columns: 1fr; gap: 3.2rem; }
}
@media screen and (max-width: 480px) {
  .km-pdp__packs { grid-template-columns: 1fr; }
}

/* Inline links in body copy were falling through to the browser default blue,
   which showed up the moment the FAQ, contact and product pages started
   cross-linking each other. Tokens only: olive text, lime underline. */
.km-body a,
.km-faq__a a,
.km-footnote a,
.km-split__caption a,
.km-pdp__lede a {
  color: var(--km-ink);
  text-decoration: underline;
  text-decoration-color: var(--km-lime);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
.km-body a:hover,
.km-faq__a a:hover,
.km-footnote a:hover,
.km-split__caption a:hover,
.km-pdp__lede a:hover { color: var(--km-lime-deep); }

.km-section--olive .km-body a,
.km-section--olive .km-faq__a a,
.km-section--olive .km-footnote a,
.km-section--olive .km-split__caption a { color: var(--km-cream); }
.km-section--olive .km-body a:hover,
.km-section--olive .km-faq__a a:hover,
.km-section--olive .km-footnote a:hover,
.km-section--olive .km-split__caption a:hover { color: var(--km-lime); }

/* Pack cards now link through to the product page. The media was a div, so it
   needs the block behaviour back, and the name link inherits rather than going
   browser-blue. */
a.km-pack__media { display: block; }
.km-pack__name a { color: inherit; text-decoration: none; }
.km-pack__name a:hover { text-decoration: underline; text-decoration-color: var(--km-lime); text-decoration-thickness: 2px; text-underline-offset: 3px; }


/* ---- PDP: quantity stepper and Kaizen's price label ---- */
.km-pdp__submit { margin-top: 2.4rem; width: 100%; }
.km-pdp__price { margin: 1.6rem 0 0; }


/* Savings flag: a badge sitting on the card's bottom-right corner, centred on
   it and in front of everything, rather than a third line inside the card. */
.km-pdp__packsave {
  position: absolute;
  right: 0;
  bottom: 0;
  transform: translate(50%, 50%);
  z-index: 2;
  white-space: nowrap;
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--km-ink);
  background: var(--km-lime);
  border-radius: 999px;
  padding: 0.4rem 0.9rem;
}
/* the checked card is lime too, so the badge needs an edge to read against it */
.km-pdp__pack:has(input:checked) .km-pdp__packsave {
  background: var(--km-white);
  box-shadow: 0 0 0 1px var(--km-ink);
}
/* the grid clipped nothing before; now it must not, or the badge is cut off */
.km-pdp__packs { overflow: visible; }

@media screen and (max-width: 989px) {
  /* nothing to stick to once the columns stack */
  .km-pdp__gallery { position: static; }
}

/* `.km-section` sets `overflow: hidden`, which makes it a scroll container and
   silently kills `position: sticky` on the gallery. `clip` did not help either:
   Chrome confines a sticky element to the nearest ancestor with any non-visible
   overflow. This section has no full-bleed art to contain, so it can go back to
   visible. Horizontal overflow re-checked at 1440, 1200, 1000, 768, 414, 360. */
.km-pdp { overflow: visible; }

@media screen and (max-width: 480px) {
  /* The pack cards go full width here, so a badge centred on the corner hangs
     18px off the right of the page. Keep the vertical straddle, drop the
     horizontal overhang. */
  .km-pdp__packsave {
    right: 1.2rem;
    transform: translate(0, 50%);
  }
}

/* Reviews empty state. Same measure and rhythm as the FAQ intro so it reads as
   part of the page rather than as an error. */
.km-reviews__empty {
  max-width: 62rem;
  margin: 3.2rem auto 0;
  text-align: center;
}
.km-reviews__empty .km-body { margin-bottom: 2.8rem; }

/* --------------------------------------------------------------------------
   Header and footer cut to basics (his points 8 and 9).

   The header grid was 1fr auto 1fr for logo / nav / utilities. With the nav
   gone there are two children, so the middle track would sit empty and push
   the cart off the right edge. Logo left, cart right.

   The footer grid was five tracks for wordmark plus three link columns plus
   the capture. It is now wordmark, one link list, capture.
   -------------------------------------------------------------------------- */
.km-header__inner:not(:has(nav)) { grid-template-columns: 1fr auto; }

/* Desktop only. Unscoped, this sat after the phone rules and overrode the
   single-column footer, which pushed every page 676px wide at 414. */
@media screen and (min-width: 990px) {
  .km-footer__grid:has(> :nth-child(3)):not(:has(> :nth-child(4))) {
    grid-template-columns: 1.1fr 1fr 1.5fr;
  }
}

/* Contact details as a three-up panel rather than a run-on paragraph. */
.km-contact__details {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.4rem;
  max-width: 100rem;
  margin: 4rem auto 0;
  padding: 2.4rem;
  background: var(--km-white);
  border: 1px solid var(--km-rule);
  border-radius: 3px;
}
.km-contact__detail { text-align: center; }
.km-contact__detail .km-contact__label { margin-bottom: 0.8rem; }
.km-contact__value {
  font-size: var(--km-fs-body);
  line-height: 1.5;
  color: var(--km-ink);
  margin: 0;
}
.km-contact__value a { color: var(--km-ink); text-decoration: none; }
.km-contact__value a:hover {
  text-decoration: underline;
  text-decoration-color: var(--km-lime);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
.km-contact__direct { margin-top: 1.6rem; }

@media screen and (max-width: 749px) {
  .km-contact__details { grid-template-columns: 1fr; gap: 2.8rem; padding: 2.4rem; }
}

/* ==========================================================================
   CART
   Replaces Dawn's stock cart, which was rendering in the theme's own type and
   colour in the middle of the buy path. Tokens and existing classes only.
   ========================================================================== */

.km-cart { max-width: 100rem; margin: 4rem auto 0; }

.km-cart__list { list-style: none; margin: 0; padding: 0; }
.km-cart__line {
  display: grid;
  grid-template-columns: 9.6rem 1fr auto auto;
  gap: 2.4rem;
  align-items: center;
  padding: 2rem 0;
  border-bottom: 1px solid var(--km-rule);
}
.km-cart__line:first-child { border-top: 1px solid var(--km-rule); }

.km-cart__media { display: block; }
.km-cart__media img { display: block; width: 100%; height: auto; border-radius: 3px; }

.km-cart__name {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  margin: 0;
}
.km-cart__name a { color: var(--km-ink); text-decoration: none; }
.km-cart__variant,
.km-cart__each {
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
  margin: 0.4rem 0 0;
}
.km-cart__remove {
  display: inline-block;
  margin-top: 0.8rem;
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
  text-decoration: underline;
  text-decoration-color: var(--km-rule);
  text-underline-offset: 3px;
}
.km-cart__remove:hover { color: var(--km-ink); }

.km-cart__qtyinput {
  width: 6.4rem;
  text-align: center;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  color: var(--km-ink);
  background: var(--km-cream);
  border: 1px solid rgba(61, 84, 38, 0.3);
  border-radius: 3px;
  padding: 0.9rem 0;
}
.km-section--white .km-cart__qtyinput { background: var(--km-white); }

.km-cart__linetotal {
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  color: var(--km-ink);
  margin: 0;
  text-align: right;
  min-width: 9rem;
}

.km-cart__foot {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 4rem;
  margin-top: 2.8rem;
}
.km-cart__update {
  border: 0;
  background: transparent;
  cursor: pointer;
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
  text-decoration: underline;
  text-decoration-color: var(--km-rule);
  text-underline-offset: 3px;
  padding: 0;
}
.km-cart__update:hover { color: var(--km-ink); }

.km-cart__totals { width: 34rem; max-width: 100%; }
.km-cart__subtotal {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  color: var(--km-ink);
  margin: 0 0 0.8rem;
}
.km-cart__note { margin: 0 0 1.6rem; }
.km-cart__continue { text-align: center; margin: 1.6rem 0 0; }
.km-cart__continue a { font-size: var(--km-fs-micro); color: var(--km-muted); }

.km-cart__empty { max-width: 62rem; margin: 3.2rem auto 0; text-align: center; }
.km-cart__empty .km-body { margin-bottom: 2.4rem; }

@media screen and (max-width: 749px) {
  .km-cart__line {
    grid-template-columns: 7.2rem 1fr;
    gap: 1.6rem 2rem;
  }
  .km-cart__qty { grid-column: 2; }
  .km-cart__linetotal { grid-column: 2; text-align: left; min-width: 0; }
  .km-cart__foot { flex-direction: column-reverse; gap: 2.4rem; align-items: stretch; }
  .km-cart__totals { width: 100%; }
  .km-cart__update { text-align: center; }
}

/* ==========================================================================
   FAQ PAGE — sticky topic rail, search, common-question shortcuts.
   Tokens and existing classes only.
   ========================================================================== */

.km-faqp__title { text-align: center; }

.km-faqp {
  display: grid;
  grid-template-columns: 24rem 1fr;
  gap: 6.4rem;
  max-width: 108rem;
  margin: 4rem auto 0;
  align-items: start;
}

.km-faqp__rail { position: sticky; top: 12rem; }
.km-faqp__nav { list-style: none; margin: 1.2rem 0 0; padding: 0; }
.km-faqp__nav li + li { margin-top: 0.2rem; }
.km-faqp__nav a {
  display: block;
  padding: 0.7rem 1.2rem;
  border-radius: 3px;
  font-size: var(--km-fs-body);
  color: var(--km-ink);
  text-decoration: none;
}
.km-faqp__nav a:hover,
.km-faqp__nav a:focus-visible { background: var(--km-lime); }
.km-faqp__help {
  margin-top: 2.4rem;
  padding-top: 1.6rem;
  border-top: 1px solid var(--km-rule);
}

.km-faqp__search { margin-bottom: 2.4rem; }

.km-faqp__common {
  margin-bottom: 3.2rem;
  padding-bottom: 2.4rem;
  border-bottom: 1px solid var(--km-rule);
}
.km-faqp__common ul { list-style: none; margin: 1.2rem 0 0; padding: 0; }
.km-faqp__common li + li { margin-top: 0.6rem; }
.km-faqp__common a {
  font-size: var(--km-fs-body);
  color: var(--km-ink);
  text-decoration: underline;
  text-decoration-color: var(--km-lime);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}

.km-faqp__group { scroll-margin-top: 12rem; }
.km-faqp__group + .km-faqp__group { margin-top: 4rem; }
.km-faqp__grouptitle {
  padding-bottom: 1.2rem;
  border-bottom: 1px solid var(--km-rule);
  margin-bottom: 0;
}
.km-faqp__group .km-faq__list { margin-top: 1.6rem; max-width: none; }
.km-faq__item { scroll-margin-top: 12rem; }
.km-faqp__none { font-size: var(--km-fs-body); color: var(--km-muted); }

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

@media screen and (max-width: 989px) {
  .km-faqp { grid-template-columns: 1fr; gap: 3.2rem; }
  /* nothing to stick to once it is a single column */
  .km-faqp__rail { position: static; }
  .km-faqp__nav { display: flex; flex-wrap: wrap; gap: 0.6rem; }
  .km-faqp__nav li + li { margin-top: 0; }
  .km-faqp__nav a { border: 1px solid var(--km-rule); border-radius: 999px; }
}

/* ---- header: Support dropdown ---- */
.km-header__has-sub { position: relative; }
.km-header__subtoggle {
  border: 0;
  background: transparent;
  cursor: pointer;
  padding: 0;
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
  color: inherit;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}
.km-header__caret { font-size: var(--km-fs-micro); line-height: 1; }
.km-header__sub {
  position: absolute;
  top: calc(100% + 1.2rem);
  left: 50%;
  transform: translateX(-50%);
  min-width: 18rem;
  list-style: none;
  margin: 0;
  padding: 0.8rem 0;
  background: var(--km-white);
  border: 1px solid var(--km-rule);
  border-radius: 3px;
  box-shadow: 0 10px 30px rgba(61, 84, 38, 0.12);
  opacity: 0;
  visibility: hidden;
  z-index: 60;
}
.km-header__has-sub:hover .km-header__sub,
.km-header__has-sub:focus-within .km-header__sub,
.km-header__has-sub.is-open .km-header__sub { opacity: 1; visibility: visible; }
.km-header__sub li { display: block; }
.km-header__sub a {
  display: block;
  padding: 0.8rem 1.6rem;
  white-space: nowrap;
  text-transform: none;
  letter-spacing: 0;
  font-size: var(--km-fs-body);
}
.km-header__sub a:hover { background: var(--km-lime); }

/* ---- contact details panel on cream, not white ---- */
.km-contact__details { background: var(--km-cream); }
.km-section--white .km-contact__details { background: var(--km-white); }

/* ---- FAQ rail: highlight the section you are reading ---- */
.km-faqp__nav a.is-active {
  background: var(--km-lime);
  font-weight: 700;
}

/* Header links in sentence case ("Shop", "Support"), not all caps. */
.km-header__nav a,
.km-header__subtoggle {
  text-transform: none;
  letter-spacing: 0;
}

/* ---- 404 ---- */
.km-404 { max-width: 62rem; margin: 4rem auto; }
.km-404 .km-body { margin-top: 1.6rem; }
.km-404__actions {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.6rem;
  margin-top: 2.8rem;
}
.km-404__home {
  font-size: var(--km-fs-body);
  color: var(--km-ink);
  text-decoration: underline;
  text-decoration-color: var(--km-lime);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}

/* The Support toggle is a <button>, so it inherited body type instead of the nav
   link's. Give it the same face, size, weight and colour as "Shop". */
.km-header__subtoggle {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  color: var(--km-ink);
}




/* ==========================================================================
   MEDIA BAR — dark green marquee under the hero. Reuses the announcement bar's
   km-marquee keyframes. Tokens and existing classes only.
   ========================================================================== */
.km-mediabar {
  display: flex;
  align-items: stretch;
  background: var(--km-olive);
  color: var(--km-cream);
  overflow: hidden;
}
.km-mediabar__label {
  flex: none;
  display: flex;
  align-items: center;
  margin: 0;
  padding: 1.6rem 2.4rem 1.6rem var(--km-gutter);
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--km-lime);
  border-right: 1px solid rgba(246, 242, 233, 0.2);
  position: relative;
  z-index: 1;
  background: var(--km-olive);
}
.km-mediabar__viewport { flex: 1; overflow: hidden; display: flex; align-items: center; }
.km-mediabar__track {
  display: flex;
  align-items: center;
  width: max-content;
  list-style: none;
  margin: 0;
  padding: 0;
  animation: km-marquee 40s linear infinite;
}
.km-mediabar:hover .km-mediabar__track { animation-play-state: paused; }
.km-mediabar__item {
  display: flex;
  align-items: center;
  padding: 1.6rem 3.2rem;
  white-space: nowrap;
}
.km-mediabar__item + .km-mediabar__item::before {
  content: '';
  width: 0.6rem;
  height: 0.6rem;
  border-radius: 50%;
  background: var(--km-lime);
  margin-right: 6.4rem;
  margin-left: -3.2rem;
}
.km-mediabar__item a { display: flex; align-items: center; color: inherit; text-decoration: none; }
.km-mediabar__pub {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--km-cream);
}
.km-mediabar__result {
  margin-left: 1.2rem;
  font-size: var(--km-fs-micro);
  color: rgba(246, 242, 233, 0.75);
}
.km-mediabar__logo { display: block; height: 2.8rem; width: auto; }
@media (prefers-reduced-motion: reduce) {
  .km-mediabar__track { animation: none; }
}
@media screen and (max-width: 749px) {
  .km-mediabar__label { padding: 1.2rem 1.6rem; }
  .km-mediabar__item { padding: 1.2rem 2.4rem; }
}

/* ==========================================================================
   OFFER POPUP. Tokens and existing classes only.
   ========================================================================== */
.km-popup {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--km-gutter);
}
.km-popup__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(61, 84, 38, 0.55);
  opacity: 0;
  transition: opacity .2s ease;
}
.km-popup__panel {
  position: relative;
  display: grid;
  grid-template-columns: 1fr 1fr;
  width: 100%;
  max-width: 80rem;
  max-height: calc(100vh - 4rem);
  overflow: auto;
  background: var(--km-cream);
  border-radius: 3px;
  box-shadow: 0 24px 60px rgba(61, 84, 38, 0.3);
  opacity: 0;
  transform: translateY(1.2rem);
  transition: opacity .2s ease, transform .2s ease;
}
.km-popup.is-open .km-popup__backdrop { opacity: 1; }
.km-popup.is-open .km-popup__panel { opacity: 1; transform: none; }
.km-popup__media {
  background: var(--km-white);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 2.4rem;
}
.km-popup__media img { display: block; width: 100%; height: auto; }
.km-popup__body {
  padding: 4.8rem 4rem 3.2rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.km-popup__body .km-h2 { margin: 0; }
.km-popup__text { margin: 1.6rem 0 2.8rem; }
.km-popup__dismiss {
  margin-top: 1.4rem;
  align-self: center;
  border: 0;
  background: transparent;
  cursor: pointer;
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.km-popup__close {
  position: absolute;
  top: 1.2rem;
  right: 1.2rem;
  width: 3.6rem;
  height: 3.6rem;
  border: 0;
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
  font-size: var(--km-fs-body);
  color: var(--km-ink);
  z-index: 1;
}
.km-popup__close:hover { background: var(--km-white); }
@media screen and (max-width: 749px) {
  .km-popup__panel { grid-template-columns: 1fr; max-width: 44rem; }
  .km-popup__media { padding: 1.6rem; }
  .km-popup__media img { max-height: 18rem; width: auto; }
  .km-popup__body { padding: 2.4rem 2.4rem 2rem; }
}

/* ==========================================================================
   Comparison table on cream. The table was painted white; it now takes the
   section's ground, with the KetoMarin column still tinted for emphasis.
   ========================================================================== */
.km-table { background: transparent; }
.km-comparison--split .km-table td,
.km-comparison--split .km-table tbody th,
.km-comparison--split .km-table thead th { background-color: transparent; }
/* td.km-col-us is (0,3,1) and still beats the (0,2,1) rule above, so the
   KetoMarin column keeps its tint without restating it here. */


/* Popup headline was breaking to five lines with the period orphaned; the copy
   column gets the wider share and the heading balances its lines. */
.km-popup__panel { grid-template-columns: 5fr 7fr; }
.km-popup__body .km-h2 { text-wrap: balance; }
.km-popup__panel:focus { outline: none; }
@media screen and (max-width: 749px) {
  .km-popup__panel { grid-template-columns: 1fr; }
}

/* On phones the nav links drop to micro type; the Support toggle has to follow
   or it renders a size larger than "Shop" beside it. */
@media screen and (max-width: 989px) {
  .km-header__subtoggle { font-size: var(--km-fs-micro); }
  .km-header__nav { align-items: center; }
}


/* ==========================================================================
   Header on cream. At the top of the page it has no edge, so it blends into
   the hero. When the page scrolls under it (class set in km-header.liquid) it
   picks up a hairline and a soft shadow and reads as a separate bar.
   ========================================================================== */
.km-header {
  background: var(--km-cream);
  border-bottom: 1px solid transparent;
  box-shadow: none;
  transition: border-color .2s ease, box-shadow .2s ease;
}
.km-header.is-scrolled {
  border-bottom-color: var(--km-rule);
  box-shadow: 0 6px 20px rgba(61, 84, 38, 0.1);
}

/* HERO-GRAIN:START */
/* ==========================================================================
   Hero (and the header above it) a shade darker, with film grain.

   The hero photograph carries the old cream baked into its ground, so darkening
   the section background alone would show the photo as a lighter rectangle.
   Instead a ::before layer sits over the whole hero -- background and photo --
   and multiplies a slightly darker tint plus a noise texture into it. The copy
   sits above the layer, so type stays clean.

   The header stays plain cream (Shane, 2026-09-16), so there is a visible step
   from the header into the darker hero.

   Deliberate exception to the no-new-colors rule, requested by Shane 2026-09-16.
   ========================================================================== */
.km-hero--bleed {
  position: relative;
  isolation: isolate;
}
.km-hero--bleed::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-color: rgb(246, 250, 253);
  mix-blend-mode: multiply;
}
.km-hero--bleed .km-hero__grid {
  position: relative;
  z-index: 1;
}
/* HERO-GRAIN:END */

/* BUGFIX 2026-09-16: `.km-popup { display: flex }` beats the browser's own
   `[hidden] { display: none }`, so the closed popup was still a transparent
   full-screen layer at z-index 200 swallowing every click on the page. */
.km-popup[hidden] { display: none !important; }

/* The header's transparent 1px border sat outside the grain layer, so a thin
   strip of plain cream showed at the header/hero join. No border at rest; the
   scrolled hairline is drawn as a shadow instead. */
.km-header { border-bottom-width: 0; }
.km-header.is-scrolled {
  box-shadow: 0 1px 0 var(--km-rule), 0 6px 20px rgba(61, 84, 38, 0.1);
}

/* PDP gallery on the cream section. The pack shots have white grounds; a
   multiply blend turns that white into the section's cream and leaves the
   greens, the pasta and the shadows as they are. No change to the files. */
.km-pdp__stage img,
.km-pdp__thumb img { mix-blend-mode: multiply; }
/* The gallery is position: sticky, which isolates it, so the blend needs a
   backdrop inside it. Cream frames give the multiply something to hit. */
.km-pdp:not(.km-section--white) .km-pdp__stage,
.km-pdp:not(.km-section--white) .km-pdp__thumb { background: var(--km-cream); }

/* FAQ topic rail follows the scroll. `.km-section { overflow: hidden }` makes
   the section a scroll container, which silently stops position: sticky on the
   rail — the same trap as the PDP gallery. This section has no full-bleed art
   to clip. */
.km-faqp-sec { overflow: visible; }
.km-faqp__rail { align-self: start; }

/* Comparison stats row: figure over label, three across. Tokens only. */
.km-compstats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.4rem;
  list-style: none;
  margin: 2.8rem 0 0;
  padding: 2.4rem 0 0;
  border-top: 1px solid var(--km-rule);
}
.km-compstats li { display: flex; flex-direction: column; gap: 0.4rem; }
.km-compstats__num {
  font-family: var(--km-display);
  font-size: var(--km-fs-h);
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--km-ink);
}
.km-compstats__label {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--km-muted);
}
@media screen and (max-width: 480px) {
  .km-compstats { gap: 1.6rem; }
}

/* ==========================================================================
   REVIEWS LIST — Judge.me-style layout in the house type and color.
   ========================================================================== */
.km-rv { max-width: 108rem; margin: 0 auto; }
.km-rv [hidden] { display: none !important; }   /* see the popup bug, 2026-09-16 */

.km-rv__summary { text-align: center; margin-top: 2.4rem; }
.km-rv__avgrow { display: inline-flex; align-items: center; gap: 1.2rem; }
.km-rv__avg {
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  color: var(--km-ink);
}
.km-rv__based {
  margin: 0.8rem 0 0;
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--km-ink);
}

.km-rv__stars { display: inline-flex; gap: 0.2rem; }
.km-rv__star { width: 2rem; height: 2rem; fill: none; stroke: var(--km-ink); stroke-width: 1.4; }
.km-rv__star.is-on { fill: var(--km-ink); }
.km-rv__stars--lg .km-rv__star { width: 2.4rem; height: 2.4rem; }

.km-rv__actions {
  display: flex;
  justify-content: space-between;
  gap: 1.6rem;
  margin-top: 3.2rem;
}
.km-rv__actions .km-btn { min-width: 32rem; text-align: center; }

.km-rv__filters {
  display: flex;
  flex-wrap: wrap;
  gap: 0.8rem;
  margin-top: 1.6rem;
}
.km-rv__chip {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--km-ink);
  background: transparent;
  border: 1px solid var(--km-rule);
  border-radius: 999px;
  padding: 0.8rem 1.4rem;
  cursor: pointer;
}
.km-rv__chip:hover,
.km-rv__chip.is-active { background: var(--km-lime); border-color: var(--km-lime); }

.km-rv__bar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 3.2rem;
  padding-bottom: 1.2rem;
  border-bottom: 1px solid var(--km-ink);
}
.km-rv__count,
.km-rv__sort span,
.km-rv__select {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: var(--km-ink);
}
.km-rv__sort { display: inline-flex; align-items: center; gap: 2.4rem; }
.km-rv__select {
  border: 0;
  background: transparent;
  cursor: pointer;
  padding-right: 0.4rem;
}

.km-rv__list { list-style: none; margin: 0; padding: 0; }
.km-rv__item {
  padding: 2.8rem 0;
  border-bottom: 1px solid var(--km-ink);
}
.km-rv__name {
  margin: 0;
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--km-ink);
}
.km-rv__verified {
  display: flex;
  align-items: center;
  gap: 0.8rem;
  margin: 0.8rem 0 0;
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--km-ink);
}
.km-rv__verified svg { width: 1.6rem; height: 1.6rem; fill: var(--km-ink); }
.km-rv__verified .km-rv__tick { fill: none; stroke: var(--km-cream); stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.km-rv__item .km-rv__stars { margin-top: 1rem; }
.km-rv__title {
  margin: 1.2rem 0 0;
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  color: var(--km-ink);
  text-transform: none;
  letter-spacing: -0.01em;
}
.km-rv__body {
  margin: 1rem 0 0;
  font-size: var(--km-fs-body);
  line-height: 1.64;
  color: var(--km-ink);
}
.km-rv__none { margin-top: 2.4rem; font-size: var(--km-fs-body); color: var(--km-muted); }

@media screen and (max-width: 749px) {
  .km-rv__actions { flex-direction: column; }
  .km-rv__actions .km-btn { min-width: 0; width: 100%; }
  .km-rv__sort { gap: 1.2rem; }
  .km-rv__count, .km-rv__sort span, .km-rv__select { font-size: var(--km-fs-micro); }
}

/* Stats at the hero headline size, per Shane. */
.km-compstats__num { font-size: var(--km-fs-display); }

/* The 20ch cap split "They all take / out wheat." while "We take the starch
   out." sat on one long line. No cap, so each sentence gets its own line; if the
   column is too narrow to hold one, the lines balance instead of leaving a
   ragged break. */
.km-comparison--split .km-comparison__head .km-h2 { max-width: none; text-wrap: balance; }
.km-comparison--split .km-comparison__head .km-h2 { letter-spacing: -0.03em; }
@media screen and (min-width: 1200px) {
  .km-comparison--split .km-wrap { column-gap: 4.8rem; }
}

/* Comparison heading: each sentence on its own line where the column can hold
   it; below that it balances. */
@media screen and (min-width: 1400px) {
  .km-comparison--split .km-comparison__head .km-h2 { white-space: nowrap; }
}

/* Reviews: controls at a sensible size. The buttons were full CTA size. */
.km-rv__actions .km-btn {
  min-width: 24rem;
  padding: 1.1rem 2.4rem;
  font-size: var(--km-fs-micro);
  letter-spacing: 0.1em;
}
.km-rv__count,
.km-rv__sort span,
.km-rv__select { font-size: var(--km-fs-micro); }
.km-rv__avg { font-size: var(--km-fs-sub); }
.km-rv__stars--lg .km-rv__star { width: 2rem; height: 2rem; }
.km-rv__star { width: 1.6rem; height: 1.6rem; }
.km-rv__title { font-size: var(--km-fs-body); }
.km-rv__item { padding: 2rem 0; }
.km-rv__actions { margin-top: 2.4rem; }
.km-rv__bar { margin-top: 2.4rem; }

/* ==========================================================================
   CART PAGE, two columns: items left, sticky order summary right.
   ========================================================================== */
.km-cart {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 36rem;
  gap: 4.8rem;
  align-items: start;
  max-width: 116rem;
}
.km-cart__line .km-cart__media { background: var(--km-cream); border-radius: 3px; overflow: hidden; }
.km-cart__line .km-cart__media img { mix-blend-mode: multiply; }
.km-cart__summary {
  position: sticky;
  top: 12rem;
  padding: 2.8rem;
  background: var(--km-white);
  border: 1px solid var(--km-rule);
  border-radius: 3px;
}
.km-cart__summarytitle {
  margin: 0 0 1.6rem;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--km-ink);
}
.km-cart__row {
  display: flex;
  justify-content: space-between;
  margin: 0 0 1rem;
  font-size: var(--km-fs-body);
  color: var(--km-ink);
}
.km-cart__free { font-weight: 700; }
.km-cart__row--total {
  margin: 1.6rem 0 0.4rem;
  padding-top: 1.6rem;
  border-top: 1px solid var(--km-rule);
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
}
.km-cart__summary .km-cart__note { margin: 0 0 1.6rem; font-size: var(--km-fs-micro); color: var(--km-muted); }
.km-cart__assure { list-style: none; margin: 1.6rem 0 0; padding: 0; }
.km-cart__assure li {
  position: relative;
  padding-left: 2rem;
  margin-top: 0.8rem;
  font-size: var(--km-fs-micro);
  color: var(--km-ink);
}
.km-cart__assure li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.45em;
  width: 0.8rem;
  height: 0.8rem;
  border-radius: 50%;
  background: var(--km-lime);
}
.km-cart__links {
  display: flex;
  justify-content: space-between;
  margin-top: 2rem;
  padding-top: 1.6rem;
  border-top: 1px solid var(--km-rule);
}
.km-cart__links a { font-size: var(--km-fs-micro); color: var(--km-muted); }
@media screen and (max-width: 989px) {
  .km-cart { grid-template-columns: 1fr; gap: 3.2rem; }
  .km-cart__summary { position: static; }
}

/* ==========================================================================
   CART DRAWER — slides in from the right. Closed = visibility: hidden, so the
   closed drawer can never intercept clicks. Tokens and existing classes only.
   ========================================================================== */
.km-drawer {
  position: fixed;
  inset: 0;
  z-index: 150;
  visibility: hidden;
  pointer-events: none;
  transition: visibility 0s linear .3s;
}
.km-drawer.is-open {
  visibility: visible;
  pointer-events: auto;
  transition: visibility 0s;
}
.km-drawer [hidden] { display: none !important; }
.km-drawer__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(61, 84, 38, 0.45);
  opacity: 0;
  transition: opacity .3s ease;
}
.km-drawer.is-open .km-drawer__backdrop { opacity: 1; }
.km-drawer__panel {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  max-width: 44rem;
  display: flex;
  flex-direction: column;
  background: var(--km-cream);
  box-shadow: -12px 0 40px rgba(61, 84, 38, 0.18);
  transform: translateX(100%);
  transition: transform .3s ease;
}
.km-drawer.is-open .km-drawer__panel { transform: none; }
.km-drawer__panel:focus { outline: none; }
html.km-drawer-lock { overflow: hidden; }

.km-drawer__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 2rem 2.4rem;
  border-bottom: 1px solid var(--km-rule);
}
.km-drawer__title {
  margin: 0;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--km-ink);
}
.km-drawer__count { font-weight: 700; }
.km-drawer__close {
  width: 3.6rem;
  height: 3.6rem;
  border: 0;
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
  font-size: var(--km-fs-body);
  color: var(--km-ink);
}
.km-drawer__close:hover { background: var(--km-white); }
.km-drawer__ship {
  margin: 0;
  padding: 1rem 2.4rem;
  background: var(--km-lime);
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  text-align: center;
  color: var(--km-ink);
}

.km-drawer__body { flex: 1; overflow-y: auto; padding: 0 2.4rem; }
.km-drawer__list { list-style: none; margin: 0; padding: 0; }
.km-drawer__line {
  display: grid;
  grid-template-columns: 8rem 1fr auto;
  gap: 1.6rem;
  align-items: start;
  padding: 2rem 0;
  border-bottom: 1px solid var(--km-rule);
  transition: opacity .2s ease;
}
.km-drawer__line.is-busy { opacity: 0.5; }
.km-drawer__media {
  display: block;
  background: var(--km-cream);
  border-radius: 3px;
  overflow: hidden;
}
.km-drawer__media img { display: block; width: 100%; height: auto; mix-blend-mode: multiply; }
.km-drawer__name {
  margin: 0;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
}
.km-drawer__name a { color: var(--km-ink); text-decoration: none; }
.km-drawer__variant { margin: 0.2rem 0 0; font-size: var(--km-fs-micro); color: var(--km-muted); }
.km-drawer__qty {
  display: inline-flex;
  align-items: center;
  margin-top: 1rem;
  border: 1px solid rgba(61, 84, 38, 0.3);
  border-radius: 999px;
}
.km-drawer__qty button {
  width: 3.2rem;
  height: 3.2rem;
  border: 0;
  background: transparent;
  cursor: pointer;
  font-size: var(--km-fs-body);
  color: var(--km-ink);
  border-radius: 999px;
}
.km-drawer__qty button:hover { background: var(--km-lime); }
.km-drawer__qty span {
  min-width: 2.4rem;
  text-align: center;
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  color: var(--km-ink);
}
.km-drawer__right { text-align: right; }
.km-drawer__price {
  margin: 0;
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  color: var(--km-ink);
}
.km-drawer__was { display: block; font-size: var(--km-fs-micro); font-weight: var(--km-w-light); color: var(--km-muted); }
.km-drawer__remove {
  margin-top: 1.2rem;
  border: 0;
  background: transparent;
  cursor: pointer;
  padding: 0;
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.km-drawer__remove:hover { color: var(--km-ink); }

.km-drawer__empty { padding: 4.8rem 0; text-align: center; }
.km-drawer__empty .km-body { margin-bottom: 2rem; }

.km-drawer__foot {
  padding: 2rem 2.4rem 2.4rem;
  border-top: 1px solid var(--km-rule);
  background: var(--km-cream);
}
.km-drawer__subtotal {
  display: flex;
  justify-content: space-between;
  margin: 0 0 0.4rem;
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  color: var(--km-ink);
}
.km-drawer__note { margin: 0 0 1.6rem; font-size: var(--km-fs-micro); color: var(--km-muted); }
.km-drawer__viewcart {
  display: block;
  margin-top: 1.2rem;
  text-align: center;
  font-size: var(--km-fs-micro);
  color: var(--km-ink);
  text-decoration: underline;
  text-decoration-color: var(--km-lime);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
[aria-busy="true"] { opacity: 0.6; cursor: progress; }

/* Dawn's base.css has `div:empty { display: none }`. Both backdrops are empty
   divs, so they never rendered: no dimming, and clicking outside did nothing. */
.km-drawer__backdrop,
.km-popup__backdrop { display: block !important; }

/* Cart page quantity stepper, matching the drawer's. */
.km-cart__stepper {
  display: inline-flex;
  align-items: center;
  border: 1px solid rgba(61, 84, 38, 0.3);
  border-radius: 999px;
  background: var(--km-cream);
}
.km-cart__stepper button {
  width: 3.6rem;
  height: 3.6rem;
  border: 0;
  border-radius: 999px;
  background: transparent;
  cursor: pointer;
  font-size: var(--km-fs-body);
  color: var(--km-ink);
}
.km-cart__stepper button:hover { background: var(--km-lime); }
.km-cart__stepper .km-cart__qtyinput {
  width: 4rem;
  border: 0;
  background: transparent;
  padding: 0;
  -moz-appearance: textfield;
}
.km-cart__stepper .km-cart__qtyinput::-webkit-outer-spin-button,
.km-cart__stepper .km-cart__qtyinput::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.km-cart__qty.is-busy { opacity: 0.5; pointer-events: none; }
.km-cart__qty .km-contact__label { margin-bottom: 0.6rem; }

/* ==========================================================================
   AS SEEN ON (km-media)
   A label and a single row of logos. Publications with no artwork sit in the
   display face, so a mixed row still lines up. Tokens only.
   ========================================================================== */
.km-logos__label { margin-bottom: 0; }
.km-logos {
  list-style: none;
  margin: 2.8rem 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 3.2rem 5.6rem;
}
.km-logos__item {
  display: flex;
  align-items: center;
  justify-content: center;
}
.km-logos__item a { display: block; text-decoration: none; }
.km-logos__img {
  display: block;
  max-height: 4rem;
  width: auto;
  opacity: 0.85;
}
.km-logos__name {
  font-family: var(--km-display);
  font-size: var(--km-fs-sub);
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--km-ink);
  opacity: 0.85;
}
.km-logos__item--empty .km-logos__name { opacity: 0.45; }
@media screen and (max-width: 749px) {
  .km-logos { gap: 2rem 3.2rem; }
  .km-logos__name { font-size: var(--km-fs-body); }
  .km-logos__img { max-height: 3.2rem; }
}

/* ==========================================================================
   PROSE PAGES (km-prose) — policies and any plain page.
   Shopify's policy pages used to render Dawn's own markup: Assistant, 40px,
   black on white. This is the house page furniture instead. Rich text arrives
   from the admin, so every tag it can emit is styled here, and every size
   comes from the five tokens.
   ========================================================================== */
.km-prose { max-width: 76rem; }
.km-prose .km-h2 { margin-bottom: 1.2rem; }
.km-prose__meta { margin: 0 0 3.2rem; }
.km-prose__body { color: var(--km-ink); }
.km-prose__body > *:first-child { margin-top: 0; }
.km-prose__body p,
.km-prose__body ul,
.km-prose__body ol {
  font-size: var(--km-fs-body);
  line-height: 1.65;
  margin: 0 0 1.6rem;
}
.km-prose__body h2,
.km-prose__body h3,
.km-prose__body h4 {
  font-family: var(--km-display);
  font-weight: 700;
  color: var(--km-ink);
  margin: 3.6rem 0 1.2rem;
}
.km-prose__body h2 { font-size: var(--km-fs-sub); letter-spacing: -0.01em; }
.km-prose__body h3,
.km-prose__body h4 {
  font-size: var(--km-fs-body);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.km-prose__body ul,
.km-prose__body ol { padding-left: 2.4rem; }
.km-prose__body li { margin-bottom: 0.8rem; }
.km-prose__body strong { font-weight: 700; }
.km-prose__body a {
  color: var(--km-ink);
  text-decoration: underline;
  text-decoration-color: var(--km-lime);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
.km-prose__body hr {
  border: 0;
  border-top: 1px solid var(--km-rule);
  margin: 3.2rem 0;
}
.km-prose__body table { width: 100%; border-collapse: collapse; font-size: var(--km-fs-body); }
.km-prose__body th,
.km-prose__body td { text-align: left; padding: 1.2rem 1.6rem; border-bottom: 1px solid var(--km-rule); }
.km-prose__help {
  margin-top: 4rem;
  padding-top: 2.4rem;
  border-top: 1px solid var(--km-rule);
  color: var(--km-muted);
}
.km-prose__help p { margin: 0; font-size: var(--km-fs-body); }

/* Footer contact line: the legal address and how to reach a human, which every
   food storefront needs within one click. */
.km-footer__contact {
  margin: 1.6rem 0 0;
  font-size: var(--km-fs-micro);
  line-height: 1.7;
  color: rgba(246, 242, 233, 0.78);
}
.km-footer__contact a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }
.km-footer__contact a:hover { color: var(--km-lime); }

/* Shopify renders /policies/* from its own fixed markup — a policy template is
   not a thing a theme can add, so these four pages are styled where they land.
   Same furniture as km-prose: cream ground, Archivo title, Inter body on the
   house measure, in place of Dawn's Assistant-on-white. */
.shopify-policy__container {
  max-width: 76rem !important;
  width: 100%;
  margin: 0 auto;
  padding: var(--km-pad) var(--km-gutter);
  background: transparent;
  font-family: var(--km-body);
  color: var(--km-ink);
}
.shopify-policy__title { text-align: left; margin-bottom: 1.2rem; }
.shopify-policy__title h1 {
  font-family: var(--km-display);
  font-size: var(--km-fs-h);
  font-weight: 700;
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: var(--km-ink);
  margin: 0;
}
.shopify-policy__body { font-size: var(--km-fs-body); }
.shopify-policy__body .rte > *:first-child { margin-top: 0; }
.shopify-policy__body p,
.shopify-policy__body ul,
.shopify-policy__body ol {
  font-size: var(--km-fs-body);
  line-height: 1.65;
  color: var(--km-ink);
  margin: 0 0 1.6rem;
}
.shopify-policy__body h2,
.shopify-policy__body h3,
.shopify-policy__body h4,
.shopify-policy__body strong {
  font-family: var(--km-display);
  color: var(--km-ink);
}
.shopify-policy__body h2,
.shopify-policy__body h3,
.shopify-policy__body h4 { font-weight: 700; margin: 3.6rem 0 1.2rem; }
.shopify-policy__body h2 { font-size: var(--km-fs-sub); letter-spacing: -0.01em; }
.shopify-policy__body h3,
.shopify-policy__body h4 {
  font-size: var(--km-fs-body);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.shopify-policy__body ul,
.shopify-policy__body ol { padding-left: 2.4rem; }
.shopify-policy__body li { margin-bottom: 0.8rem; }
.shopify-policy__body a {
  color: var(--km-ink);
  text-decoration: underline;
  text-decoration-color: var(--km-lime);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
.shopify-policy__body hr { border: 0; border-top: 1px solid var(--km-rule); margin: 3.2rem 0; }
/* The policy pages are the only ones whose content is not a km section, so the
   page ground shows through. Paint it cream at the main wrapper; every other
   page has sections that paint over it. */
#MainContent { background: var(--km-cream); }

/* The pack cards carried #f6f7f9, a cool grey that is in neither the logo nor
   the style scheme — it was picked to match the pack shots' own ground. The
   shots multiply onto cream cleanly (same as the PDP gallery), so the card can
   use a palette color and the photo ground disappears into it. */
.km-pack,
.km-pack__media { background: var(--km-cream); }
.km-pack__media img { mix-blend-mode: multiply; }

/* ==========================================================================
   DAWN LEAKS
   Anything we never wrote a rule for inherits Dawn's body font (Assistant) and
   its near-black text. That was reaching real, visible copy — the hero
   subheading and micro line, the header Account and Cart links, every footer
   link, the drawer's empty state — because those elements set a size and a
   color but never a family. Set the base here so inheritance lands on ours.
   ========================================================================== */
body {
  font-family: var(--km-body);
  color: var(--km-ink);
}
.skip-to-content-link {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  background: var(--km-ink);
  color: var(--km-cream);
}

/* --------------------------------------------------------------------------
   Collection and search are the two pages with no km section behind them, so
   they render Dawn's own markup end to end: Assistant, near-black headings and
   a 10-14px scale. They are reachable and they are in the sitemap, so they get
   the scheme too. Dawn's component-*.css files load AFTER km.css, so the
   component-level rules below need the extra specificity to win.
   -------------------------------------------------------------------------- */
.collection-hero__title,
.template-search h1,
body .title--primary,
body .collection h1,
body .template-search .h2 {
  font-family: var(--km-display);
  font-size: var(--km-fs-h);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--km-ink);
}
body .card__heading,
body .card__heading a,
body .full-unstyled-link,
body .card-information__text {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  color: var(--km-ink);
  text-transform: uppercase;
  letter-spacing: 0.02em;
}
body .price,
body .price-item,
body .price__container .price-item {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  color: var(--km-ink);
}
body .price-item--regular s,
body s.price-item {
  font-weight: var(--km-w-light);
  color: var(--km-muted);
}
body .facets__heading,
body .facets__summary-label,
body .facets__selected,
body .facets__label,
body .field__label,
body .collection-product-count,
body .facet-filters__label,
body .product-count__text {
  font-family: var(--km-display);
  font-size: var(--km-fs-micro);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--km-muted);
}
body .collection,
body .template-search,
body .facets-container,
body .card__content,
body .card__information {
  font-family: var(--km-body);
  color: var(--km-ink);
}
body .collection .field__input,
body .template-search .field__input {
  font-family: var(--km-body);
  font-size: var(--km-fs-body);
  color: var(--km-ink);
  background: var(--km-cream);
}
/* Form controls do not inherit font-family from body, so every button, input
   and select falls back to the UA font unless told otherwise. The drawer's
   close glyph was the last one rendering in Arial. */
button, input, select, textarea { font-family: inherit; }
/* Last of Dawn's collection/search chrome: the "Remove all" reset, the counts
   beside it, and the floating field label on the search box. */
body .facets__reset,
body .active-facets span,
body .facets-container span,
body .product-count span,
body .product-count__text {
  font-family: var(--km-body);
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
}
body .collection .field__label,
body .template-search .field__label,
body .search__input + .field__label {
  font-family: var(--km-body);
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
}
/* Dawn shrinks its floating label to 1rem (10px) once the field has content;
   that rule is more specific than the one above, so it needs matching. */
body .template-search .field__input:focus ~ .field__label,
body .template-search .field__input:not(:placeholder-shown) ~ .field__label,
body .collection .field__input:focus ~ .field__label,
body .collection .field__input:not(:placeholder-shown) ~ .field__label {
  font-size: var(--km-fs-micro);
  color: var(--km-muted);
}

/* ==========================================================================
   PHONE HEADER
   At 390px the desktop three-column grid stacked into three rows: the logo on
   one, "Shop / Support" on another that overflowed past the header's own
   height onto the hero, and Account / Cart on a third — with 30x14 and 62x14
   tap targets. Below 750px it is one row (logo, cart, menu button) and the nav
   becomes a flat panel where every destination is one tap and 48px tall.
   ========================================================================== */
.km-header__burger { display: none; }
.km-header__mobile { display: none; }

/* 989px, not 749: between 750 and 989 the desktop nav came back and was clipped
   by its own column at iPad-portrait width. The phone header covers tablets. */
@media screen and (max-width: 989px) {
  .km-header__inner {
    grid-template-columns: auto 1fr auto;
    gap: 1.2rem;
    padding: 1.2rem var(--km-gutter);
  }
  .km-header__inner > nav { display: none; }          /* desktop nav and its dropdown */

  .km-header__logo { grid-column: 1; }
  .km-header__logo-img { max-height: 3.6rem; width: auto; }

  .km-header__utils {
    grid-column: 3;
    display: flex;
    align-items: center;
    gap: 1.2rem;
  }
  /* Account moves into the menu panel: two text links plus a button is more
     than the width holds, and Cart is the one that has to stay reachable. */
  .km-header__utils > a:not([data-km-cart-open]) { display: none; }

  .km-header__burger {
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    width: 4.4rem;
    height: 4.4rem;
    padding: 0 1rem;
    border: 0;
    background: transparent;
    cursor: pointer;
  }
  .km-header__burger span {
    display: block;
    height: 2px;
    width: 100%;
    background: var(--km-ink);
    transition: transform .2s ease, opacity .2s ease;
  }
  .km-header.is-menu-open .km-header__burger span:first-child { transform: translateY(3.5px) rotate(45deg); }
  .km-header.is-menu-open .km-header__burger span:last-child { transform: translateY(-3.5px) rotate(-45deg); }

  .km-header__mobile {
    display: block;
    border-top: 1px solid var(--km-rule);
    background: var(--km-cream);
  }
  .km-header__mobile[hidden] { display: none; }
  .km-header__mobile ul {
    list-style: none;
    margin: 0;
    padding: 0.8rem var(--km-gutter) 1.6rem;
  }
  .km-header__mobile li + li { border-top: 1px solid var(--km-rule); }
  .km-header__mobile a {
    display: flex;
    align-items: center;
    min-height: 4.8rem;
    font-family: var(--km-display);
    font-size: var(--km-fs-body);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--km-ink);
    text-decoration: none;
  }
}

/* ==========================================================================
   PHONE FOOTER
   The email capture leads on the phone (Shane, 2026-09-19): it is the only
   action in the footer, and it was sitting under the wordmark, the contact
   block and every link.
   ========================================================================== */
@media screen and (max-width: 749px) {
  .km-footer__grid { display: flex; flex-direction: column; gap: 3.2rem; }
  .km-footer__capture { order: -1; }
}
/* Rich-text settings wrap their value in a <p>, which resets to Dawn's 1.5rem
   inside our own sized element. The PDP's reassurance line was the one place
   that showed. */
.km-pdp__micro p,
.km-hero__micro p,
.km-hero__sub p { font-size: inherit; margin: 0; }
/* The keyboard-only "Skip to content" link was clipping its own text. */
.skip-to-content-link { width: auto; white-space: nowrap; }
/* Popup image panel on cream, not white (Shane, 2026-09-19). The pack shot's
   own white ground multiplies away against it, same as the PDP gallery. */
.km-popup__media { background: var(--km-cream); }
.km-popup__media img { mix-blend-mode: multiply; }

/* ==========================================================================
   PHONE: PRODUCT PAGE
   ========================================================================== */
@media screen and (max-width: 749px) {
  /* Thumbnails: one row that scrolls, instead of wrapping onto a second. */
  .km-pdp__thumbs {
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity;
    gap: 0.8rem;
    padding-bottom: 0.4rem;
    scrollbar-width: none;
  }
  .km-pdp__thumbs::-webkit-scrollbar { display: none; }
  .km-pdp__thumb {
    flex: 0 0 8.4rem;
    scroll-snap-align: start;
  }

  /* The six specs were two columns of tall rows eating a third of the screen.
     Same six facts, micro type, tight leading. */
  .km-pdp__specs {
    gap: 0.6rem 1.6rem;
    margin-top: 2rem;
  }
  .km-pdp__spec {
    font-size: var(--km-fs-micro);
    line-height: 1.35;
    padding-left: 1.6rem;
  }

  /* Pack size: three across in one row, not three stacked rows. */
  .km-pdp__packs { display: block; }
  .km-pdp__packs .km-pdp__pack { width: auto; }
  .km-pdp__packlist,
  fieldset.km-pdp__packs > label { min-width: 0; }
  .km-pdp__packs {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 0.8rem;
  }
  .km-pdp__legend { grid-column: 1 / -1; margin-bottom: 0.4rem; }
  .km-pdp__pack {
    padding: 1.2rem 0.8rem;
    text-align: center;
    min-width: 0;
  }
  .km-pdp__packname { font-size: var(--km-fs-micro); letter-spacing: 0.02em; }
  .km-pdp__packmeta { font-size: var(--km-fs-micro); }
  /* The corner badge does not fit a third-width card; it sits in the card. */
  .km-pdp__packsave {
    position: static;
    transform: none;
    display: block;
    margin-top: 0.6rem;
    padding: 0.2rem 0.4rem;
  }

  /* Price was a full-width line floating between the selector and the button. */
  .km-pdp__price {
    display: flex;
    align-items: baseline;
    gap: 0.8rem;
    margin: 1.6rem 0 1.2rem;
  }
}

/* ==========================================================================
   PHONE AND TABLET: COMPARISON
   The wrap's single grid track was sized by its widest child rather than the
   screen — `1fr` with default `min-width: auto` lets the 520px table push the
   track to 434px in a 390px viewport. `.km-section { overflow: hidden }` then
   clipped the result, which is why "We take the starch out.", the stats and
   the footnote were cut off mid-word. The track is capped and the table scrolls
   inside its own container instead.
   ========================================================================== */
@media screen and (max-width: 989px) {
  .km-comparison--split .km-wrap { grid-template-columns: minmax(0, 1fr); }
  .km-comparison--split .km-wrap > * { min-width: 0; max-width: 100%; }
  .km-comparison--split .km-table-scroll {
    max-width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  /* A pinned first column on a 390px screen leaves almost nothing to read;
     Shane asked for a plain scrollable table. */
  .km-comparison--split .km-table tbody th,
  .km-table tbody th { position: static; left: auto; }
}
/* The price is part of the button on the phone. On a 390px screen it was a lone
   24px number floating in a full-width line between the pack grid and the CTA;
   in the button it reads as the thing being bought. Desktop keeps the price line
   and hides the button copy. */
.km-pdp__btnprice { display: none; }
@media screen and (max-width: 749px) {
  .km-pdp__price { display: none; }
  .km-pdp__btnprice {
    display: inline;
    margin-left: 0.8rem;
    padding-left: 0.8rem;
    border-left: 1px solid rgba(246, 242, 233, 0.4);
  }
}
/* That nowrap keeps "We take the starch out." on one line where the column is
   wide enough for it. Below 990px it is wider than the screen, and because
   `.km-section` clips, the sentence was cut off mid-word rather than wrapping. */
@media screen and (max-width: 989px) {
  /* Both halves of the heading were nowrap, `.km-h2` at line 3698 and the
     accent at 1734, which is what held the copy column at a 744px floor and
     clipped the text once the table took a fair share. A heading wraps. */
  .km-comparison--split .km-comparison__head .km-h2,
  .km-comparison--split .km-comparison__head .km-accent { white-space: normal; }
}

/* ==========================================================================
   ROUND 1, EASY PASS (Jesse, September 20, 2026)
   ========================================================================== */
:root {
  /* 1.7: the light accent is the K in his logo. Measured #fbf7ef in
     `ketomarin logo1.psd`. Both hero photos were retinted to the same ground. */
  --km-cream: #fbf7ef;
  /* 1.8: lime is Pantone 375 C, from the new pasta box. */
  --km-lime: #97D700;
  /* 1.2 and 1.3: body text at full strength. The faded green read as a light
     weight to him and counted as a fourth text color. */
  --km-muted: var(--km-ink);
  /* 2.5.4: the red crosses were off-palette. */
  --km-strike: var(--km-ink);
}

/* 1.4: no gray hero. The tint layer that produced #ECEDE8 is switched off; the
   hero is the same light accent as the rest of the page. */
.km-hero--bleed::before { content: none; }

/* 1.3: inverse text on green is the light accent itself, not a faded version. */
.km-section--olive .km-body,
.km-section--olive .km-eyebrow,
.km-section--olive .km-footnote,
.km-footer__contact { color: var(--km-cream); }

/* 2.3.2: the line under the headline and the line under the button read as a
   narrower font: the micro line carried extra letter-spacing. Both are now
   plain body text. */
.km-hero__sub,
.km-hero__micro { letter-spacing: normal; color: var(--km-ink); }

/* 2.9.5: the per-serving line in one weight. */
.km-pack__unit,
.km-pack__unit * { font-weight: var(--km-w-light); }

/* 2.5.4: crosses smaller and quieter, drawn in the one green. */
.km-crossed__x {
  top: 16% !important;
  right: 16% !important;
  bottom: 16% !important;
  left: 16% !important;
  opacity: 0.9 !important;
}
/* 2.12.3: the footer in two sizes. The contact block was the only 12px text. */
.km-footer__contact { font-size: var(--km-fs-body); }
/* The loop now carries more copies per half, so the same 38s would scroll about
   50% faster. Slowed back to roughly the old reading speed. */
.km-announce__track { animation-duration: 58s; }

/* ==========================================================================
   ROUND 1 TYPE SYSTEM (Jesse 1.1, 2.3.1): three sizes, two weights.
   - Headline: one size between the old heading (48) and display (72). The hero
     and every section heading now share it, desktop and phone.
   - Subhead 24 and body 16 stay.
   - The 12px micro size is retired; labels, footnotes, the announcement bar
     and the table's small text all set at body size.
   Weights are 400 and 700; the old 800 was folded into 700.
   ========================================================================== */
:root {
  --km-fs-h: clamp(3.2rem, 4.4vw, 5.6rem);
  --km-fs-display: var(--km-fs-h);
  --km-fs-micro: var(--km-fs-body);
}

/* ==========================================================================
   ROUND 1 BACKGROUNDS (Jesse 1.4, 1.5, 1.10, 2.9.2): three grounds only —
   the K cream, the dark green and the lime — in an order where no two
   neighboring sections share one.
     Homepage: hero cream, founder green, comparison cream, glucose green,
               reviews cream, media lime, packs green, FAQ cream, footer green
     PDP:      product cream, glucose green, comparison cream, FAQ lime,
               reviews cream, footer green
   White is retired: every surface that was white (cards, table, FAQ rows,
   inputs) takes the cream, which on a green or lime section is the layer.
   ========================================================================== */
:root { --km-white: var(--km-cream); }

/* Two-part headlines lean on color now that the periods are gone. On green the
   accent is the lime, which reads clearly against it. */
.km-section--olive .km-accent { color: var(--km-lime); }

/* Lime ground: everything in the one green. The old near-black label color is
   off-palette. */
.km-section--lime,
.km-section--lime .km-eyebrow,
.km-section--lime .km-footnote,
.km-section--lime .km-body,
.km-section--lime .km-h2,
.km-section--lime .km-logos__name { color: var(--km-ink); }

/* Founder on green: bowl labels turn to the cream, the crosses to the lime.
   Lime on the dark green is the one place Pantone 375 C carries enough
   contrast, and it keeps the crosses off the same value as the labels. */
.km-section--olive .km-crossed__name,
.km-section--olive .km-crossed__note { color: var(--km-cream); }
.km-section--olive .km-crossed__x g { stroke: var(--km-lime); }

/* Packs on green: cream cards are the second layer, the lime badge the third. */
.km-section--olive .km-pack { border-color: transparent; }

/* Round 2 [2.3.1b, 2.5.2], Shane approved 2026-09-27: the accent phrase is lime
   type on cream, and the underline is gone. Jesse asked twice, and his reason
   is sound as design: the underline separates the two halves of a headline far
   more weakly than a colour change does.

   On the record, because it was the reason for the round 1 treatment this
   replaces: Pantone 375 C on the cream measures 1.63:1, where the floor for
   large text is 3:1. On the dark green it measures 4.82:1 and those accents are
   unchanged. Reverting is this one rule. */
.km-section:not(.km-section--olive):not(.km-section--lime) .km-accent,
.km-hero .km-accent {
  color: var(--km-lime);
  text-decoration: none;
}
/* The founder lead paragraph kept its green when the section went green. */
.km-section--olive .km-statement__lead,
.km-section--olive .km-statement__quote,
.km-section--olive .km-statement__body { color: var(--km-cream); }
/* Table text moved from 12px to 16px; the KetoMarin column's fixed width no
   longer held its own header. Columns size to their content and the table
   scrolls inside its container on the phone. */
.km-table th.km-col-us,
.km-table td.km-col-us { width: auto; min-width: max-content; }
/* ...and on phones and tablets the table itself stops dividing its width evenly
   (`table-layout: fixed` ignores what each header needs). It sizes to content
   and scrolls inside `.km-table-scroll`. */
@media screen and (max-width: 989px) {
  .km-comparison--split .km-table,
  .km-table { table-layout: auto; width: max-content; min-width: 100%; }
}

/* ==========================================================================
   ROUND 1 SECTION SIZES (Jesse 1.9): one vertical padding for every section,
   64px on desktop and 48px on the phone. Sections had drifted to 88, 56/24 and
   52 depending on which "tight" variant each carried. The variants now resolve
   to the same token, so the spec can state one number. The hero keeps its own
   full-bleed layout and is not a padded section.
   ========================================================================== */
:root { --km-pad: 6.4rem; }
@media screen and (max-width: 749px) { :root { --km-pad: 4.8rem; } }
.km-section.km-section--tight-y,
.km-section.km-section--tight-top,
.km-section.km-section--tight-bottom,
.km-section {
  padding-top: var(--km-pad);
  padding-bottom: var(--km-pad);
}
.km-hero.km-section,
.km-section.km-hero { padding-top: 0; padding-bottom: 0; }
/* ...including the section straight after the hero, which an older rule gave
   its own 56px top. */
[id$="__hero"] + .shopify-section .km-section { padding-top: var(--km-pad); }

/* ==========================================================================
   JUDGE.ME (Jesse 2.8, Shane 2026-09-22). The app renders its own markup with
   black text, gray metadata, teal stars and 12/14/20px type, which is four
   colors and three sizes the scheme does not have. Pulled onto the scheme.
   Scoped to the reviews section so nothing else is touched.
   ========================================================================== */
.km-rv-sec [class*="jm-"],
.km-rv-sec [class*="jdgm-"] {
  font-family: var(--km-body) !important;
  font-size: var(--km-fs-body) !important;
  color: var(--km-ink) !important;
}
.km-rv-sec [class*="jm-"][class*="title"],
.km-rv-sec [class*="jm-"][class*="heading"],
.km-rv-sec [class*="jm-"][class*="rating-number"] {
  font-family: var(--km-display) !important;
  font-size: var(--km-fs-sub) !important;
  font-weight: 700 !important;
}
/* Stars keep their own icon font; only the color and size change. */
.km-rv-sec [class*="star"] {
  color: var(--km-ink) !important;
  font-size: var(--km-fs-sub) !important;
}
.km-rv-sec button.jm-button--primary {
  background: var(--km-ink) !important;
  color: var(--km-cream) !important;
  border-radius: 999px !important;
  border: 0 !important;
  font-family: var(--km-display) !important;
  font-weight: 700 !important;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
/* Inputs follow the scheme. The sort dropdown is left to Judge.me: it styles the
   select itself, and overriding it collapsed the control to a square showing the
   first letter of "Most Recent". */
.km-rv-sec [class*="jm-"] input,
.km-rv-sec [class*="jm-"] textarea { font-family: var(--km-body) !important; background: var(--km-cream) !important; color: var(--km-ink) !important; }
/* The stars are glyphs in Judge.me's own icon font, so they keep it; only their
   color and size follow the scheme. */
.km-rv-sec [class*="star"],
.km-rv-sec [class*="Star"] { font-family: 'JudgemeStar', sans-serif !important; }
/* `[class*=button]` also matched the cluster that WRAPS the button (and the
   filter button beside it), which is what stretched the pill across the row.
   Only the real buttons are styled, and icon elements keep their own font, or
   their glyph renders as a stray letter. */
.km-rv-sec button.jm-button--primary {
  width: fit-content !important;
  max-width: 100%;
  padding: 1.2rem 2.4rem !important;
}
.km-rv-sec button.jm-button--secondary {
  background: transparent !important;
  color: var(--km-ink) !important;
  border: 1px solid var(--km-rule) !important;
  border-radius: 999px !important;
}
.km-rv-sec [class*="icon"],
.km-rv-sec [class*="Icon"] { font-family: inherit; }
.km-rv-sec .jm-with-icon svg,
.km-rv-sec [class*="icon"] svg { fill: currentColor; }
/* Judge.me's compact sort control renders as a 64px native select, so it showed
   only the "M" of "Most Recent". Sized to its text as a pill like the rest. */
.km-rv-sec select.jdgm-sort-dropdown,
.km-rv-sec .jm-sort-filter__select {
  width: auto !important;
  min-width: 17rem !important;
  height: auto !important;
  font-family: var(--km-body) !important;
  font-size: var(--km-fs-body) !important;
  color: var(--km-ink) !important;
  background: var(--km-cream) !important;
  border: 1px solid var(--km-rule) !important;
  border-radius: 999px !important;
  padding: 0.7rem 1.6rem !important;
  text-indent: 0 !important;
}
/* Two real reviews, not three placeholders: the row fits what exists. */
.km-reviews { grid-template-columns: repeat(auto-fit, minmax(28rem, 1fr)); }

/* Jesse 2.2: with the nav gone, Account sits next to Cart on the phone as well. */
@media screen and (max-width: 989px) {
  .km-header__utils > a:not([data-km-cart-open]) { display: inline-flex; }
}
/* Jesse 2.11: the question and the answer are now the same face. The question
   was Archivo in capitals against an Inter answer, which is what looked like
   two different fonts. */
.km-faq__q {
  font-family: var(--km-body);
  text-transform: none;
  letter-spacing: 0;
}
/* The homepage review stars were lime-deep: a fourth color, and 2.2:1 on the
   cream. They take the one green, like the Judge.me stars on the product page. */
.km-review__stars { color: var(--km-ink); }

/* ==========================================================================
   ROUND 2 — Jesse, September 27, 2026
   ========================================================================== */

/* 2.7a: the homepage review quotes were italic. Dawn's base.css sets
   `blockquote { font-style: italic }` and ours never reset it, which is the
   whole difference he spotted between the two pages. */
.km-review__quote { font-style: normal; }

/* 3.3: the six fact bullets above PACK SIZE were all bold, so nothing in that
   block stood out. Regular, and the headings above keep the emphasis. */
.km-pdp__spec { font-weight: var(--km-w-light); }

/* 3.8b: Judge.me prints the reviewer name in sentence case; the homepage sets
   it uppercase. Same treatment on both. */
.km-rv-sec .jdgm-rev__author,
.km-rv-sec .jdgm-rev__buyer-badge + .jdgm-rev__author {
  font-family: var(--km-display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

/* 2.1a: the bar measures 4.82:1, which passes, but at the micro size with
   0.14em tracking it reads thin, which is what he is seeing. Body size and
   less tracking, same colours. */
.km-announce__item {
  font-size: var(--km-fs-body);
  letter-spacing: 0.08em;
}

/* 2.10.1: "See all questions" sat below a grey rule with its own underline,
   which read as a separate block. It belongs to the questions above it. */
.km-faq__footer {
  margin-top: 2.4rem;
  padding-top: 0;
  border-top: 0;
}
.km-faq__footer a {
  text-decoration: none;
  background-image: none;
  border-bottom: 0;
  box-shadow: none;
  font-family: var(--km-display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
.km-faq__footer a:hover { text-decoration: underline; }

/* 2.11.4: the contact email was the only footer link still underlined, because
   it sits outside .km-footer__list. */
.km-footer__contact a { text-decoration: none; }
.km-footer__contact a:hover { text-decoration: underline; }

/* 2.11.3: one inverse weight across all three columns. What read as different
   weights was five different opacities on the same cream. */
.km-footer__list a,
.km-footer__tagline,
.km-footer__note,
.km-footer__contact,
.km-footer__contact a,
.km-footer__bottom,
.km-footer__bottom span {
  opacity: 0.88;
  font-weight: var(--km-w-light);
}
.km-footer__list a:hover,
.km-footer__contact a:hover { opacity: 1; }

/* 2.11.1 + 2.11.2: the first column opened with the wordmark at the sub size in
   sentence case while columns two and three opened with an uppercase title at
   body size, so their first lines sat on different baselines. Measured at
   5497px against 5793px. Give all three openers one treatment and they line up
   on their own, and the capture heading joins them rather than being a third
   thing. */
.km-footer__logo,
.km-footer__capture .km-h3 {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  line-height: 1.3;
  margin: 0 0 1.92rem;
  opacity: 0.75;
}
.km-footer__title { line-height: 1.3; }
.km-footer__grid > * { align-content: start; }

/* 1.9 + 2.9.3: reviews, media, packs and FAQ ran cream, cream, cream, cream.
   The scope fixes the background order, and packs is the section that breaks
   the run. On the green the cards are the second layer and the lime badge the
   third, so the grey border has nothing left to do. The guarantee under it is
   already green, so the two now read as one dark block closing the page. */
.km-section--olive .km-pack {
  border-color: transparent;
  background: var(--km-white);
}
.km-section--olive .km-pack--featured {
  border-color: var(--km-lime);
}
.km-section--olive .km-packs__note,
.km-section--olive .km-pack__unit { color: rgba(246, 242, 233, 0.82); }
.km-section--olive .km-pack .km-pack__unit { color: var(--km-ink); }

/* 1.2: one font family. Archivo takes the body too, so --km-body and
   --km-display are now the same stack and Inter is no longer requested.
   Archivo sets a little wider than Inter at the same size, so the body size is
   left where it is rather than chased; the measure is what changes, and the
   columns are max-width capped already. */
:root {
  --km-body: 'Archivo', 'Helvetica Neue', Arial, sans-serif;
}
body,
button, input, select, textarea {
  font-family: var(--km-body);
}

/* 2.6.1: the three lines under the two charts ran at two sizes, three weights
   and two cases, on top of whatever the charts themselves already carry. One
   size, two weights, one case, one opacity. */
.km-split--stacked .km-split__figcap,
.km-split--stacked .km-split__zoom,
.km-split--stacked .km-split__caption {
  font-size: var(--km-fs-body);
  letter-spacing: 0;
  text-transform: none;
  opacity: 0.85;
}
.km-split--stacked .km-split__figcap { font-weight: 700; opacity: 1; }
.km-split--stacked .km-split__zoom,
.km-split--stacked .km-split__caption { font-weight: var(--km-w-light); }

/* 2.10.2a: the full FAQ page carried four sizes. The page heading and the body
   size are the two that earn their place; the group titles drop to the body
   size in capitals, which makes them a label rather than a third heading, and
   the rail and the help note come up off micro. Two sizes, two weights, two
   cases. */
.km-faqp__grouptitle {
  font-size: var(--km-fs-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  line-height: 1.3;
}
.km-faqp__help,
.km-faqp__help.km-footnote,
.km-faqp__common a,
.km-faqp__none,
.km-faqp__nav a { font-size: var(--km-fs-body); font-weight: var(--km-w-light); }

/* 2.10.2b: a tap on a question gave no feedback on a phone, because the only
   state on it was :hover, which a touch screen never fires. */
.km-faq__q { -webkit-tap-highlight-color: transparent; transition: background-color .12s ease; }
.km-faq__q:active {
  background-color: rgba(151, 215, 0, 0.18);
  background-color: color-mix(in srgb, var(--km-lime) 18%, transparent);
}

/* 3.4: on a phone the price rides in the Add to cart button and the save badge
   sits inside its card. On desktop the price was a lone line at the sub size
   above the button and the badge hung off the card corner, so the two screens
   read as two designs. Desktop now follows the phone, which is the version he
   picked, and it drops a font size off the page at the same time. */
.km-pdp__price { display: none; }
.km-pdp__btnprice {
  display: inline;
  margin-left: 0.8rem;
  padding-left: 0.8rem;
  border-left: 1px solid rgba(246, 242, 233, 0.4);
}
.km-pdp__packsave {
  position: static;
  transform: none;
  display: block;
  margin-top: 0.6rem;
  padding: 0.2rem 0.4rem;
  border-radius: 3px;
}

/* 3.6: the product page table ran at the micro size behind a 62rem min-width,
   so it scrolled inside a column it should have fitted, and it did not match
   the homepage table it is meant to repeat. Same size as the homepage, no
   min-width, tighter gutters so four columns fit the 1.2fr track. Auto layout
   is deliberate: `table-layout: fixed` clipped the KETOMARIN header the last
   time it was tried. */
.km-comparison--split .km-table {
  min-width: 0;
  width: 100%;
  font-size: var(--km-fs-body);
}
.km-comparison--split .km-table th,
.km-comparison--split .km-table td { padding: 1.2rem 1rem; }
.km-comparison--split .km-table-scroll { overflow-x: auto; }

/* 1.1 + 3.8a: two sizes, not three. The 24px step was still carrying four
   things: the pack card price, the publication name, the Judge.me review title
   and the gallery arrow glyph. All of them work at the body size with bold
   doing the emphasis, and the page loses a size. The section heading
   "Customer reviews" is already .km-h2, so it matches the homepage, which is
   what 3.8a asked. */
.km-pack__price,
.km-logos__name,
.km-rv__title,
.km-rv-sec .jdgm-rev__title,
.km-rv-sec .jdgm-widget .jdgm-rev-widg__title {
  font-size: var(--km-fs-body);
  font-weight: 700;
}
/* the arrow is a glyph in a round button, sized by the button, not by the scale */
.km-pdp__arrow { font-size: var(--km-fs-body); line-height: 1; }
.km-faq__q::after { font-size: var(--km-fs-body); }

/* The last four things off the two-size scale, found by reading every rendered
   node rather than by reading the stylesheet. Judge.me is targeted by its own
   title classes only: a blanket rule here previously resized the star icon
   font and broke the stars. */
.km-pack__was,
.km-drawer__subtotal,
.km-drawer__foot .km-drawer__total,
.km-rv-sec .jm-review-widget-minimal-header__title,
.jdgm-write-review-modal__title {
  font-size: var(--km-fs-body);
}

/* Judge.me loads its own stylesheet after ours, so its widget title needs the
   flag to come back onto the scale. Scoped to the one class: the star icon
   font must keep its own size or the stars break. */
.jm-review-widget-minimal-header__title { font-size: var(--km-fs-body) !important; }

/* The FAQ search box was the last 15px on the site, from the browser default
   for an input rather than from the scale. */
#km-faq-search,
.km-faqp__search input { font-size: var(--km-fs-body); }

/* .km-h3 was still on the sub size, which is the third size the scale no
   longer has. It is the label role: body size, bold, capitals. The contact
   page steps were the last place it showed. */
.km-h3 { font-size: var(--km-fs-body); letter-spacing: 0.1em; }

/* Judge.me sets its widget title from a stylesheet that loads after ours, so
   the class alone lost even with the flag. Tag plus both classes wins it. */
p.jm-text.jm-review-widget-minimal-header__title { font-size: var(--km-fs-body) !important; }

/* Dawn's base.css puts every field and button at 1.5rem. That is the 15px the
   FAQ search box kept showing on a phone. */
input, select, textarea, button, .button, .button-label { font-size: var(--km-fs-body); }

/* Judge.me writes `--text-size: var(--jm-heading-sm-size)` inline on its widget
   title, so no font-size rule of ours reaches it however specific, and it sets
   that variable on a container that outranks :root. The declaration below is
   kept because it costs nothing and takes effect the moment they stop, but the
   title is still 24px and the real fix is the text-size control in the Judge.me
   app settings. It is the one element on the site off the two-size scale. */
:root { --jm-heading-sm-size: var(--km-fs-body); }

/* ==========================================================================
   ROUND 2, second pass — Shane approved 2026-09-27
   ========================================================================== */

/* 2.3.1a: "Corte Madera, California" was not a lighter weight, it was the one
   surviving faded green at 66%, which round 1 [1.3] took out everywhere else.
   Full strength, same bold as the other labels. Whether the line stays at all
   is still his call. */
.km-eyebrow { color: var(--km-ink); }
.km-section--olive .km-eyebrow { color: var(--km-cream); }

/* 1.1: two weights, and the lighter of the two is now thinner than the regular
   that was there. Archivo Light 300 for body, Bold 700 for headings and labels.
   Regular 400 is no longer requested or used anywhere, so the page really does
   carry two weights rather than two plus whatever a browser default supplies.
   Dawn's own stylesheets set 400 in a few places and are caught here. */
body,
p, li, td, input, select, textarea, .km-body, .km-footnote {
  font-weight: var(--km-w-light);
}
strong, b, th, h1, h2, h3, h4, .km-h1, .km-h2, .km-h3, .km-btn, button, .km-eyebrow {
  font-weight: 700;
}

/* Judge.me's own body text sits at 400, which would be a third weight on the
   product page. Their `.jm-text` class carries it, so it is set here rather
   than by fighting each element. The star icon font is untouched. */
.km-rv-sec .jm-text,
.jm-text { font-weight: var(--km-w-light); }
.km-rv-sec .jm-text b,
.km-rv-sec .jm-text strong { font-weight: 700; }

/* 2.5.1 transposed: the pasta is the row and the measure is the column, which
   he asked for because five columns of numbers plus a label was too wide. The
   highlight moves with it. Every .km-col-us rule above is now dead, because
   nothing carries that class any more; these replace it on the row. */
.km-table tr.km-row-us th,
.km-table tr.km-row-us td {
  background: rgba(168, 206, 30, 0.16);
  font-weight: 700;
  color: var(--km-ink);
}
.km-table tr.km-row-us th[scope='row'] {
  background: var(--km-lime);
  color: var(--km-ink);
  border-radius: 3px 0 0 3px;
}
.km-table tr.km-row-us td:last-child { border-radius: 0 3px 3px 0; }
/* The row label column now carries brand names rather than one-word measures,
   so it needs room and the measures can be narrow and right-aligned. */
.km-table th[scope='row'] { white-space: nowrap; }
.km-table thead th:not(.km-table__corner),
.km-table tbody td { text-align: right; }
.km-table thead th.km-table__corner,
.km-table th[scope='row'] { text-align: left; }

/* Transposed, the table is four measures wide instead of six pastas, so it can
   fit a 390px screen rather than scrolling. What was blocking it: the corner
   cell held "Per 2oz (56g) serving" on one line, the headers would not wrap,
   and the row labels were nowrap. The basis moves to the footnote on a phone,
   where the footnote is directly under the table anyway. */
@media screen and (max-width: 749px) {
  /* These have to outrank the 2026-09-06 phone block, which targets
     `.km-comparison--split .km-table thead th` at (0,2,2). A media query adds
     no specificity of its own, so the selectors are matched level for level. */
  .km-comparison--split .km-table thead th.km-table__corner,
  .km-table thead th.km-table__corner {
    font-size: 0;
    padding: 0 0.5rem 1.1rem 0;
  }
  .km-comparison--split .km-table thead th,
  .km-table thead th { white-space: normal; padding: 0 0.5rem 1.1rem; }
  .km-comparison--split .km-table tbody th,
  .km-comparison--split .km-table td,
  .km-table tbody th,
  .km-table td { padding: 0.9rem 0.5rem; white-space: normal; }
  .km-comparison--split .km-table,
  .km-table { min-width: 0; }
  /* Fixed layout was tried here to force the table into 346px and it does fit,
     but at 17% a column is narrower than the word PROTEIN, so the headers
     broke mid-word: "NET CARB S", "PROT EIN", "CALO RIES". Five columns of
     16px type do not fit a 390px screen, and the only way to make them is a
     third, smaller font size, which 1.1 rules out. So the phone keeps the
     sideways scroll it already had, with the swipe hint above it. Desktop,
     which is what 3.6 was about, now fits with no scroll at all. */
}

/* Measured: "Per 2oz (56g) serving" is 210px on one line and the corner was
   giving it 108, so it broke to three lines and read as a stack of fragments.
   The measure columns meanwhile were 132px each while the widest word in them,
   CALORIES, is 90. So: hand the corner a floor and hint the measure columns
   narrow. NET CARBS is 101px and breaks to two lines at that width, which is
   what Shane asked for, and CALORIES at 90 still holds one line. */
@media screen and (min-width: 750px) {
  .km-comparison--split .km-table thead th.km-table__corner,
  .km-table thead th.km-table__corner { min-width: 12rem; width: 12rem; }
  .km-comparison--split .km-table thead th:not(.km-table__corner),
  .km-table thead th:not(.km-table__corner) { width: 7rem; }
  .km-comparison--split .km-table th,
  .km-comparison--split .km-table td,
  .km-table th,
  .km-table td { padding-left: 0.7rem; padding-right: 0.7rem; }
  .km-comparison--split .km-table th[scope='row'],
  .km-table th[scope='row'] { padding-left: 1.2rem; }
}

/* The split was `1fr 1fr`, but a bare `1fr` floors at min-content, so the copy
   column grew past its half on the strength of its own longest line and took
   744px against the table's 528. That is why the product page table had to
   break PROTEIN and CALORIES mid-word while the homepage did not. Both tracks
   now floor at zero and the table gets the larger share, because a heading and
   three stats need less room than five columns of numbers. */
@media screen and (min-width: 990px) {
  /* The thing that made every ratio fail was `white-space: nowrap` on the
     accent phrase: it gave the copy column a 745px floor at 56px, so the table
     only ever got what was left, and `max-content` then collapsed the
     homepage table to zero because that intro is long. The heading wraps now,
     which is what a heading should do, and the two columns can just share. */
  /* Both halves of the heading were nowrap, `.km-h2` at line 3698 and the
     accent at 1734, which is what held the copy column at a 744px floor and
     clipped the text once the table took a fair share. A heading wraps. */
  .km-comparison--split .km-comparison__head .km-h2,
  .km-comparison--split .km-comparison__head .km-accent { white-space: normal; }
  .km-comparison--split .km-wrap {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr);
  }
  /* Measured, not guessed: the table lands at 652px. A 12rem corner leaves each
     measure 115px, which is 97px of content. CALORIES is 90 and holds one
     line, NET CARBS is 101 and wraps to two, which is what Shane asked for.
     15rem was tried and starved the measures to 88px, breaking CALORIE / S. */
  .km-comparison--split .km-table thead th.km-table__corner,
  .km-table thead th.km-table__corner { min-width: 12rem; width: 12rem; }
}

/* ==========================================================================
   ROUND 3 — Jesse, October 4, 2026
   ========================================================================== */

/* 2.11.1 "Are texts here of same inverse weight? They look inconsistent."
   They were not. Round 2's 2.11.2 asked the three column openers to match in
   case and size, so they went bold at 700 while everything under them stayed
   at 300. One weight now, and case alone carries the hierarchy. */
.km-footer__logo,
.km-footer__title,
.km-footer__capture .km-h3,
.km-footer__form button { font-weight: var(--km-w-light); }
.km-footer__logo,
.km-footer__title,
.km-footer__capture .km-h3 { opacity: 0.88; }

/* 3.2 the six facts above PACK SIZE in capitals, as on the landing page. */
.km-pdp__spec { text-transform: uppercase; letter-spacing: 0.06em; }

/* 2.3.1c the hero specs un-bolded, to match the product page. They are 300
   now like the rest of the body, so the lime dot is what marks them as a row
   of facts rather than a sentence. */
.km-pill { font-weight: var(--km-w-light); }

/* 2.9.1 "save $4.50" sits in the sentence, so it stops shouting. */
.km-pack__save { font-weight: var(--km-w-light); text-transform: none; }

/* 2.4.1 crosses shorter and thinner. The stroke widths came down in the
   section; this is the "shorter" half, pulling the arms further inside the
   bowl. Round 1 set 16%. */
.km-crossed__x {
  top: 24% !important;
  right: 24% !important;
  bottom: 24% !important;
  left: 24% !important;
}

/* 2.5.4 the swipe hint in the light weight, still capitals. */
@media screen and (max-width: 989px) {
  .km-comparison--split .km-table-scroll::before {
    font-weight: var(--km-w-light);
    font-size: var(--km-fs-body);
  }
}

/* 1.7 + 2.2 "header seems too narrow" and "logo square 50 to 100% larger".
   One change, because the logo is sized off the bar. The mark was 52px inside a
   74px bar on desktop and 36 inside 60 on the phone. It goes to 78 and 54, up
   50%, and the bar grows with it so the breathing room around it holds. His
   logo file is 1294x536, so it has the pixels for this with no softening. */
.km-header__logo-img { height: 7.8rem; }
.km-header__inner { padding-top: 1.9rem; padding-bottom: 1.9rem; }
@media screen and (max-width: 989px) {
  /* a `max-height: 3.6rem` further up was capping the phone logo, so the
     height alone did nothing. Both have to move. */
  .km-header__logo-img { height: 5.4rem; max-height: 5.4rem; }
  .km-header__inner { padding-top: 1.4rem; padding-bottom: 1.4rem; }
}
/* 480 and under keeps the same 5.4rem: at 4.8 the mark was only a third
   bigger and he asked for half again at least. */
.km-header__logo-img { max-height: 7.8rem; }

/* 2.3.1b the line under the headline on one line on desktop, as on the product
   page. It was wrapping on a 40ch cap, and the sentence is 64 characters. The
   copy column is wide enough to hold it without one. */
@media screen and (min-width: 1200px) {
  .km-hero__sub { max-width: none; }
}

/* 3.4 "Customer Reviews should be of same size and case as heading". It was
   Judge.me's own title, printed at 24px from a size the app writes inline,
   which beat three attempts in round 2. So the app's title is hidden and the
   section prints our own heading instead, the same .km-h2 the homepage uses.
   One heading, ours, on the scale. */
.km-rv-sec .jm-review-widget-minimal-header__title,
.km-rv-sec .jdgm-rev-widg__title { display: none !important; }

/* 2.1 the announcement bar with motion turned off.
   `prefers-reduced-motion` already stopped the marquee, but it stopped it on a
   strip six copies wide, so the bar parked on the first message and the second
   was never seen. Jesse has Reduce Motion on and asked whether his old iPhone
   was at fault. It was not. With the animation off the track stops being a
   strip: it centres, wraps, and shows one copy of each message. */
@media (prefers-reduced-motion: reduce) {
  .km-announce { padding: 0.7rem 0; }
  .km-announce__track {
    width: auto;
    flex-wrap: wrap;
    justify-content: center;
    row-gap: 0.2rem;
  }
  .km-announce__item { padding: 0 1.6rem; }
  /* one copy of each. The section repeats the blocks to make the loop
     seamless and tags the first pass, so this holds at any number of them. */
  .km-announce__item:not(.km-announce__item--first) { display: none; }
}

/* 2.10.1 the press state the touch handler drives. The `:active` rule stays
   for pointer devices; `.is-pressed` is what actually fires on iOS. */
.km-faq__q.is-pressed {
  background-color: rgba(151, 215, 0, 0.18);
  background-color: color-mix(in srgb, var(--km-lime) 18%, transparent);
}

/* 3.3 "Column width inconsistent for 4 photos under pack, 3 pack size options,
   ADD TO CART button, and nutrition facts table. Due to my iPhone SE?"
   Not his phone. On a 375px screen the product grid's container is 331px wide
   and its children were measuring 376, so the thumbnails, the pack selector,
   the button and the details all ran 45px past the edge and were clipped,
   while the comparison table stayed inside. That is the inconsistency he saw.
   A bare `1fr` track floors at min-content, and the three-across pack selector
   has a min-content wider than the screen, so it pushed the whole column out.
   Same fault the comparison grid had. */
@media screen and (max-width: 989px) {
  .km-pdp__grid { grid-template-columns: minmax(0, 1fr); }
  .km-pdp__grid > *,
  .km-pdp__buy,
  .km-pdp__media { min-width: 0; max-width: 100%; }
  .km-pdp__packs { min-width: 0; }
  .km-pdp__thumbs { min-width: 0; overflow-x: auto; }
}

/* and on desktop the same section sat 24px left of everything above it: the
   comparison split ran a 1fr/1.05fr grid with a 48px gap while the product
   grid runs even columns with 64. Matched, so the table lines up with the buy
   column. */
@media screen and (min-width: 990px) {
  .km-comparison--split .km-wrap {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    column-gap: 6.4rem;
  }
}

/* ==========================================================================
   ROUND 4 — Jesse, October 10, 2026
   ========================================================================== */

/* 2.5.2 + 2.10.2 "Please use body text weight for Footnote. No need for a 3rd
   lighter weight." There is no third weight: the footnote is 300 like the body
   and always was. What reads as lighter is colour, a 68% alpha on the same
   green, and on the full FAQ page "Cannot find an answer?" carries the same
   class at the same alpha, which is 2.10.2. Full strength on every ground, so
   weight and colour both match the body and the third tone disappears. */
.km-footnote { color: var(--km-ink); }
.km-section--olive .km-footnote { color: var(--km-cream); }
.km-section--lime .km-footnote { color: rgb(20, 24, 12); }

/* 2.5.2, second half. "SWIPE TO COMPARE" was the same trick: round 3 took it
   to weight 300, but the base rule still painted it at 50% alpha. */
@media screen and (max-width: 989px) {
  .km-comparison--split .km-table-scroll::before { color: var(--km-ink); }
}

/* 2.3.1 "1G NET CARB" to "1g Net Carb". The four lime bullets already separate
   the facts, so the capitals were doing a second job nothing needed. The text
   itself is title case in the template; this drops the transform. */
.km-pill { text-transform: none; letter-spacing: 0; }

/* 3.1 the six facts above PACK SIZE take whatever the hero pills take, which
   is what "same font style as landing page" asks for. Round 3's 3.2 is the
   rule being reversed here. */
.km-pdp__spec { text-transform: none; letter-spacing: 0; }

/* 2.10.1 "Please unbold SEE ALL QUESTIONS". */
.km-faq__footer a { font-weight: var(--km-w-light); }

/* 2.11.1 "Original bold KETOMARGIN, BE FIRST TO KNOW... and JOIN look better."
   Third time the footer weight has moved: round 2's 2.11.3 asked for one
   inverse weight, round 3's 2.11.1 asked for one weight everywhere and took
   these to 300. Only the three he names come back; the column titles stay at
   300 so the footer still reads as two levels rather than four. */
.km-footer__logo,
.km-footer__capture .km-h3,
.km-footer__form button { font-weight: 700; opacity: 1; }

/* 2.4.1 "lime cross signs slightly shorter so to be less overwhelming."
   Round 1 set the arms 16% inside the bowl, round 3 took them to 24%. 30% is
   the third pass and the one he asked for. */
.km-crossed__x {
  top: 30% !important;
  right: 30% !important;
  bottom: 30% !important;
  left: 30% !important;
}

/* 2.5.1 "Table heading CALORIES is cut off for desktop." Not cut off, broken:
   `overflow-wrap: break-word` on the header row let the browser split the word
   itself, so a 77px column printed CALORIE over S. It is the same fault as the
   `table-layout: fixed` attempt in round 3 that produced PROT EIN. Words stay
   whole now, and the tracking and gutters come in far enough that the longest
   header fits the column it has. */
.km-comparison--split .km-table thead th {
  overflow-wrap: normal;
  word-break: keep-all;
  hyphens: none;
  letter-spacing: 0.02em;
}
.km-comparison--split .km-table th,
.km-comparison--split .km-table td { padding: 1.2rem 0.6rem; }

/* 3.2 "SAVE $4.5 and SAVE $15 are out of their lime boxes." True on the phone
   only: the badge is a block inside a third-width card, 67px of box holding
   93px of nowrap text, so the back half of the figure sat outside the green.
   It spans the card's padding now and takes the 0.02em tracking the pack name
   beside it already uses. */
@media screen and (max-width: 749px) {
  .km-pdp__packsave {
    margin-left: -1rem;
    margin-right: -1rem;
    padding-left: 0.2rem;
    padding-right: 0.2rem;
    letter-spacing: 0.02em;
  }
}

/* 2.1 "mobile screen please go back to FREE SHIPPING ON ALL US ORDERS as it is
   too packed to also have 1G NET CARB...". Per-message, set in the theme
   editor, so he can change his mind without me. It also retires the frozen-bar
   problem on the phone: with one message there is no second one to miss. */
@media screen and (max-width: 749px) {
  .km-announce__item--deskonly { display: none; }
}

/* 2.5.1, the narrow-desktop band. Keeping words whole raises the table's
   minimum width, so between 990 and 1200 the last column ran 2 to 21px past
   its container. Tighter gutters and no tracking on the header row buy back
   about 30px, which clears it without touching the sizes or the weights. */
@media screen and (min-width: 990px) and (max-width: 1200px) {
  .km-comparison--split .km-table thead th { letter-spacing: 0; }
  .km-comparison--split .km-table th,
  .km-comparison--split .km-table td { padding-left: 0.4rem; padding-right: 0.4rem; }
}
/* Measured after: 1200 and up is clean, which covers his MacBook Air at 1280
   and 1440. Between 990 and 1152 the table still runs 4 to 18px past its
   container and scrolls for it. `max-width` on a sticky cell was tried and
   does nothing, because auto table layout ignores it. Left as a scroll
   rather than chased further. */

/* 2.2 + 2.3.2 "increase more so that word KetoMarin of logo on mobile is
   bigger than word Account", and "make margins of header narrower so blank
   space between header and landing smaller".
   The two pull against each other, because the bar is sized off the logo, so
   the padding gives back exactly what the logo takes. On the phone the mark
   goes 54 to 66px while the padding comes 14 to 10, which leaves the bar at
   the same 86px it is now and makes the wordmark clearly larger than
   "Account" beside it. Desktop keeps its 78px mark and just loses the
   padding. */
.km-header__inner { padding-top: 1.4rem; padding-bottom: 1.4rem; }
@media screen and (max-width: 989px) {
  .km-header__logo-img { height: 6.6rem; max-height: 6.6rem; }
  .km-header__inner { padding-top: 1rem; padding-bottom: 1rem; }
}

/* 2.3.2 the landing section's own top and bottom. The hero carried an 8rem
   override where every other copy block uses 5.6rem, so it was the one
   section running wider than the rest of the page. Back to the base figure,
   which both closes the gap he is pointing at and puts the hero on the same
   rhythm as everything under it. */
.km-hero--bleed .km-hero__copy { padding-top: 5.6rem; padding-bottom: 5.6rem; }
@media screen and (max-width: 989px) {
  .km-hero--bleed .km-hero__copy { padding-top: 2.8rem; padding-bottom: 2.4rem; }
}

/* 2.2, the knock-on. Growing the mark to 66px left the utilities column able
   to shrink, because "Account Cart (0)" has a small min-content width once
   the browser is allowed to wrap it, so "Cart (0)" broke across two lines.
   Holding each link on one line raises that min-content width and the grid
   gives the column the space it needs. At 375px the row needs about 307 of
   the 331 available, so it fits with room. */
@media screen and (max-width: 749px) {
  .km-header__utils { white-space: nowrap; }
  .km-header__utils > a { white-space: nowrap; }
}

/* ==========================================================================
   ROUND 5 — Jesse, October 14, 2026
   ========================================================================== */

/* "Please adjust logo size to make KetoMarin same size as Account and Cart
   and align them horizontally for mobile version."
   This reverses 2.2 from four days ago, which asked for the wordmark bigger
   than "Account". Measured off the logo file: the lettering stands 0.209 of
   the image height, so a 66px image puts it at 13.8px against Account's 11.5px
   cap at 16px Archivo. 55px brings the two to the same height. The row is
   centre-aligned so the mark, the wordmark and the links sit on one line. */
@media screen and (max-width: 989px) {
  /* Second pass. 55px put the wordmark at 11.49px of ink against "Account" at
     11.25px, so it measured very slightly larger and he still read it as
     smaller. The logotype's strokes are finer than Archivo at the same cap
     height, which is what makes it look it. Matched by eye instead: 60px puts
     the lettering at 12.54px.
     The alignment was a real fault, not a perception. In the logo file the
     wordmark's ink sits 12.5px below the image's own centre, 2.33% of its
     height, so centring the image box left the lettering low against the
     links. Settled at 1px by eye, not by arithmetic. Centring the wordmark's
     ink gave 2.8px, which measured right and looked wrong: the wordmark is
     1.25px taller than "Account", so matching their centres throws its cap
     line above the text, and the square mark rides high with it. He called
     that "a bit higher". 1px is between the two states he has commented on
     and reads level against both links. */
  .km-header__logo-img {
    height: 6rem;
    max-height: 6rem;
    transform: translateY(-0.16rem);
  }
  .km-header__inner { align-items: center; }
  .km-header__logo { display: flex; align-items: center; }
  .km-header__utils { align-self: center; }
}

/* "Can we try a slightly heavier weight for all places using light 300 on
   mobile?" Regular 400 on phones, Light 300 unchanged on desktop. Every rule
   that set 300 now reads --km-w-light, so this one line moves all 21 of them
   and one line puts them back.
   Worth knowing: this is a third weight on the page, which his own 1.1 and the
   style sheet both put at two. */
@media screen and (max-width: 749px) {
  :root { --km-w-light: 400; }
}

/* The 60px mark fits from 360px up, and the original iPhone SE is 320. There
   the row wants 292px of a 276px content box, so "Cart (0)" ran past the
   gutter and the page itself went 5px wider than the screen. Tightening the
   two header gaps and taking the mark to 56px brings it to 272. The gutter
   stays 22px, so the one-gutter rule holds; only this header gets narrower
   gaps, and only on the narrowest phone. At 56px the wordmark is still 11.7px
   against "Account" at 11.25, so it reads the same size there too. */
@media screen and (max-width: 359px) {
  .km-header__inner { gap: 0.8rem; }
  .km-header__utils { gap: 0.8rem; }
  .km-header__logo-img { height: 5.6rem; max-height: 5.6rem; transform: translateY(-0.15rem); }
}

/* He aligns the cap tops, not the baselines, which is what his two notes were
   telling me. Measured live at 375: at a 1px lift the K sat 0.59px below the A
   in "Account" and he called it a tiny bit lower; at 2.8px it sat 1.8px above
   and he called it a bit higher. 1.6px puts the two cap tops level. The
   wordmark is 12.4px against Account's 11.0, so its baseline still runs lower,
   which is correct for the larger lettering. */

/* "Alignment of 2-PACK 8 servings button from 2 lines to 3 lines like 4- and
   8-PACK buttons." On a phone "16 servings" and "32 servings" wrap and
   "8 servings" does not, so that one card ran a line short while all three
   boxes stayed 155px tall. The count takes its own line now, so every card
   reads name, number, servings. Desktop has the room and is left alone. */
@media screen and (max-width: 749px) {
  .km-pdp__packnum { display: block; }
}

/* ---- KM Glucose test ---------------------------------------------------
   The strips are cropped to the card bounds: 1317px holding three 417px
   screenshots with 33px between them. 417/1317 is 31.66% and 33/1317 is
   2.5%, so a three column grid at a 2.5% gap drops each label exactly over
   its own screenshot. If the crop in slice_cgm_strips.py moves, this moves.  */
.km-cgm__tests {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 3.2rem;
  max-width: 92rem;
  margin: 4rem auto 0;
  align-items: start;
}
.km-cgm__test { margin: 0; min-width: 0; position: relative; }
.km-cgm__test[data-km-zoom] { cursor: zoom-in; }

.km-cgm__title {
  font-family: var(--km-display);
  font-size: var(--km-fs-body);
  font-weight: 700;
  margin: 0 0 1.6rem;
  text-align: center;
  text-wrap: balance;
}
.km-cgm__labels {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.5%;
  margin: 0 0 0.8rem;
  font-size: var(--km-fs-body);
  font-weight: var(--km-w-light);
  text-align: center;
}
.km-cgm__labels span { min-width: 0; }
.km-cgm__strip {
  display: block;
  width: 100%;
  height: auto;
  margin: 0 0 2rem;
}
.km-cgm__strip:last-of-type { margin-bottom: 0; }

.km-cgm__zoom {
  display: block;
  margin-top: 1.2rem;
  text-align: center;
  font-size: var(--km-fs-body);
  font-weight: var(--km-w-light);
}
.km-cgm__head,
.km-cgm__intro { text-align: center; }
.km-cgm__intro { margin: 1.6rem auto 0; max-width: 62rem; }
.km-cgm__foot { max-width: 72rem; margin: 3.2rem auto 0; text-align: center; }

@media screen and (max-width: 749px) {
  .km-cgm__tests { grid-template-columns: 1fr; gap: 4rem; margin-top: 3.2rem; }
  .km-cgm__strip { margin-bottom: 1.6rem; }
}

/* The enlarge hint carried 0.72 opacity, copied from the km-split version it
   replaced. That is the fourth tone Jesse caught in 2.5.2 and the style sheet
   rules out, so it comes off. Every word in this section is now one of the
   three colors at full strength, at 16px, in 300 or 700. */
