/* ==========================================================================
   PiviPets — site.css
   Design system for the PiviPets WordPress theme.

   Sections 1–14 are the original storefront design system, preserved exactly.
   Section 15 onward adds what WordPress and WooCommerce need: layout
   scaffolding, editor block styles, widget and comment styling, and the
   markup WooCommerce generates.

   The tokens in :root are overridden at runtime by Customizer values — see
   inc/customizer-css.php. Editing a token here changes the shipped default.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. TOKENS
   -------------------------------------------------------------------------- */
/* --------------------------------------------------------------------------
   0. FONTS

   Self-hosted so the site has no third-party dependency: no DNS lookup to
   fonts.gstatic.com on first paint, no request leaving the visitor's
   browser to another company, and one fewer thing that can be slow or
   blocked. font-display: swap keeps text visible while they load.

   Fraunces and Manrope are variable fonts — one file covers every weight.
   All three are SIL Open Font License 1.1.
   -------------------------------------------------------------------------- */
@font-face {
  font-family: "Fraunces";
  src: url("../fonts/fraunces-variable.woff2") format("woff2-variations"),
       url("../fonts/fraunces-variable.woff2") format("woff2");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Manrope";
  src: url("../fonts/manrope-variable.woff2") format("woff2-variations"),
       url("../fonts/manrope-variable.woff2") format("woff2");
  font-weight: 200 800;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "DM Mono";
  src: url("../fonts/dm-mono-regular.woff2") format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

:root {
  /* Ink + surfaces */
  --ink:        #241B45;   /* deep twilight — headings, footer, hero */
  --ink-soft:   #4A3D75;
  --muted:      #6E6590;
  --surface:    #FFFCF8;   /* page background */
  --surface-2:  #F3EEFF;   /* alternating section background */
  --card:       #FFFFFF;
  --line:       #E4DCF2;

  /* Color worlds — these are the real filament families */
  --sun:        #FF8A3D;
  --frost:      #3EC1D3;
  --glow:       #9B5DE5;
  --seal:       #14806A;   /* trust / in-stock / savings */

  --grad-sun:   linear-gradient(135deg, #FFC24A 0%, #FF6B57 100%);
  --grad-frost: linear-gradient(135deg, #9BE7F5 0%, #6C8CFF 100%);
  --grad-glow:  linear-gradient(135deg, #9B5DE5 0%, #F15BB5 55%, #4FC7D9 100%);

  /* Type */
  --display: "Fraunces", Georgia, "Times New Roman", serif;
  --body:    "Manrope", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --mono:    "Manrope", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;

  /* Space + shape */
  --gut:      clamp(1.25rem, 4vw, 2.5rem);
  --max:      1200px;
  --radius:   20px;
  --radius-s: 12px;
  --shadow:   0 2px 4px rgba(36,27,69,.04), 0 12px 32px rgba(36,27,69,.08);
  --shadow-l: 0 4px 8px rgba(36,27,69,.06), 0 24px 60px rgba(36,27,69,.14);

  /* Derived — recalculated by the Customizer when an accent changes */
  --btn-shadow: #D96A22;
  --card-min:   17rem;   /* minimum card track; drives the shop column count */
  --aside:      19rem;   /* sidebar width */
}

/* --------------------------------------------------------------------------
   2. RESET + BASE
   -------------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
  margin: 0;
  background: var(--surface);
  color: var(--ink);
  font-family: var(--body);
  font-size: 1.0625rem;
  line-height: 1.65;
  font-weight: 450;
  -webkit-font-smoothing: antialiased;
}
img, svg, video { max-width: 100%; height: auto; display: block; }
a { color: inherit; }
button { font: inherit; color: inherit; }

h1, h2, h3, h4 {
  font-family: var(--display);
  font-variation-settings: "SOFT" 60, "WONK" 1, "opsz" 60;
  font-weight: 700;
  line-height: 1.08;
  letter-spacing: -.015em;
  margin: 0 0 .5em;
  text-wrap: balance;
}
h1 { font-size: clamp(2.4rem, 6vw, 4.1rem); }
h2 { font-size: clamp(1.9rem, 4vw, 2.9rem); }
h3 { font-size: clamp(1.25rem, 2.2vw, 1.6rem); }
h4 { font-size: 1.0625rem; letter-spacing: 0; }
p  { margin: 0 0 1em; max-width: 66ch; }

/* The mono "field label" — used for every technical/data line on the site.
   3D printing is a technical craft; the mono voice earns the storybook serif. */
.field {
  font-family: var(--mono);
  font-size: .7rem;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--muted);
  margin: 0 0 .75rem;
  display: block;
}
.field--sun   { color: #C25A18; }
.field--frost { color: #16788A; }
.field--glow  { color: #7A3ECF; }

/* --------------------------------------------------------------------------
   3. LAYOUT
   -------------------------------------------------------------------------- */
.wrap { width: 100%; max-width: var(--max); margin-inline: auto; padding-inline: var(--gut); }
.section { padding-block: clamp(3.5rem, 8vw, 6rem); }
.section--tint { background: var(--surface-2); }
.section--ink  { background: var(--ink); color: #EDE7FF; }
.section--ink h2, .section--ink h3 { color: #fff; }
.section--ink .field { color: #B7A9E8; }

.section-head { max-width: 44rem; margin-bottom: clamp(2rem, 4vw, 3rem); }
.section-head.center { margin-inline: auto; text-align: center; }
.section-head.center p { margin-inline: auto; }
.lede { font-size: 1.15rem; color: var(--ink-soft); }
.section--ink .lede { color: #C9BEF0; }

.grid { display: grid; gap: clamp(1rem, 2.5vw, 1.75rem); }
.grid-2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr)); }
.grid-3 { grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--card-min)), 1fr)); }
.grid-4 { grid-template-columns: repeat(auto-fill, minmax(min(100%, 14rem), 1fr)); }
.split  { display: grid; gap: clamp(2rem, 5vw, 4rem); align-items: center;
          grid-template-columns: repeat(auto-fit, minmax(min(100%, 24rem), 1fr)); }

/* Skip link */
.skip {
  position: absolute; left: -9999px; top: 0; z-index: 999;
  background: var(--ink); color: #fff; padding: .75rem 1.25rem; border-radius: 0 0 8px 0;
}
.skip:focus { left: 0; }

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 3px solid var(--glow);
  outline-offset: 3px;
  border-radius: 4px;
}

/* --------------------------------------------------------------------------
   4. BUTTONS + PILLS
   -------------------------------------------------------------------------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  padding: .95rem 1.6rem;
  border: 2px solid transparent; border-radius: 999px;
  background: var(--sun); color: #2A1400;
  font-weight: 800; font-size: 1rem; letter-spacing: -.01em;
  text-decoration: none; cursor: pointer;
  box-shadow: 0 4px 0 var(--btn-shadow);
  transition: transform .14s ease, box-shadow .14s ease, background .14s ease;
}
.btn:hover { transform: translateY(2px); box-shadow: 0 2px 0 var(--btn-shadow); filter: brightness(1.06); }
.btn:active { transform: translateY(4px); box-shadow: 0 0 0 var(--btn-shadow); }
.btn--ghost {
  background: transparent; color: var(--ink); border-color: var(--ink); box-shadow: none;
}
.btn--ghost:hover { background: var(--ink); color: #fff; transform: none; box-shadow: none; }
.section--ink .btn--ghost { color: #fff; border-color: #7C6BB8; }
.section--ink .btn--ghost:hover { background: #fff; color: var(--ink); }
.btn--wide { width: 100%; }
.btn--lg { padding: 1.1rem 2rem; font-size: 1.075rem; }

.pill {
  display: inline-flex; align-items: center; gap: .4rem;
  padding: .35rem .8rem; border-radius: 999px;
  background: var(--surface-2); color: var(--ink-soft);
  font-family: var(--mono); font-size: .68rem; letter-spacing: .12em; text-transform: uppercase;
}
.pill--seal { background: rgba(20,128,106,.12); color: #0B6853; }
.pill--sun  { background: rgba(255,138,61,.16); color: #B4530F; }
.pill--new  { background: var(--ink); color: #fff; }

.swatch { width: 1.1rem; height: 1.1rem; border-radius: 50%; display: inline-block;
          border: 2px solid #fff; box-shadow: 0 0 0 1px var(--line); }
.swatch--sun   { background: var(--grad-sun); }
.swatch--frost { background: var(--grad-frost); }
.swatch--glow  { background: var(--grad-glow); }

/* --------------------------------------------------------------------------
   5. HEADER
   -------------------------------------------------------------------------- */
.announce {
  background: var(--ink); color: #EFE9FF; text-align: center;
  font-family: var(--mono); font-size: .72rem; letter-spacing: .1em; text-transform: uppercase;
  padding: .55rem 1rem;
}
.announce b { color: #FFC24A; }

.masthead {
  position: sticky; top: 0; z-index: 50;
  background: rgba(255,252,248,.92);
  backdrop-filter: saturate(150%) blur(10px);
  border-bottom: 1px solid var(--line);
}
.masthead__inner {
  display: flex; align-items: center; gap: 1rem;
  min-height: 68px; max-width: var(--max); margin-inline: auto; padding-inline: var(--gut);
}
.brand { display: flex; align-items: center; gap: .6rem; text-decoration: none; font-family: var(--display);
         font-weight: 900; font-size: 1.35rem; letter-spacing: -.02em; }
.brand__mark { width: 38px; height: 38px; border-radius: 50%; background: var(--grad-glow);
               display: grid; place-items: center; color: #fff; font-size: .95rem; flex: none; }

.nav { margin-left: auto; display: flex; align-items: center; gap: .35rem; }
.nav a {
  text-decoration: none; padding: .55rem .8rem; border-radius: 999px;
  font-weight: 700; font-size: .95rem; white-space: nowrap;
}
.nav a:hover { background: var(--surface-2); }
.nav a[aria-current="page"] { background: var(--ink); color: #fff; }

.tools { display: flex; align-items: center; gap: .4rem; }
.icon-btn {
  border: 1px solid var(--line); background: var(--card); border-radius: 999px;
  padding: .5rem .85rem; cursor: pointer; font-weight: 700; font-size: .9rem;
  display: inline-flex; align-items: center; gap: .4rem;
}
.icon-btn:hover { border-color: var(--ink); }
.cart-count {
  background: var(--sun); color: #2A1400; border-radius: 999px;
  min-width: 1.35rem; height: 1.35rem; display: grid; place-items: center;
  font-size: .78rem; font-weight: 800;
}
.burger { display: none; }

@media (max-width: 940px) {
  .burger { display: inline-flex; }
  .nav {
    position: fixed; inset: 0 0 0 auto; width: min(84vw, 340px);
    background: var(--surface); border-left: 1px solid var(--line);
    flex-direction: column; align-items: stretch; gap: .25rem;
    padding: 5.5rem 1.25rem 2rem; transform: translateX(100%);
    transition: transform .25s ease; box-shadow: var(--shadow-l); overflow-y: auto;
  }
  .nav[data-open="true"] { transform: none; }
  .nav a { padding: .9rem 1rem; font-size: 1.05rem; border-bottom: 1px solid var(--line); border-radius: 0; }
}

/* --------------------------------------------------------------------------
   6. HERO
   -------------------------------------------------------------------------- */
.hero { position: relative; overflow: hidden; background: var(--ink); color: #F2EDFF; }
.hero::before {
  content: ""; position: absolute; inset: -30% -10% auto -10%; height: 120%;
  background:
    radial-gradient(closest-side, rgba(155,93,229,.45), transparent 70%) 12% 20%/48rem 48rem no-repeat,
    radial-gradient(closest-side, rgba(62,193,211,.35), transparent 70%) 88% 8%/40rem 40rem no-repeat,
    radial-gradient(closest-side, rgba(255,138,61,.30), transparent 70%) 70% 90%/36rem 36rem no-repeat;
  pointer-events: none;
}
.hero__inner {
  position: relative; display: grid; gap: clamp(2rem, 5vw, 3.5rem); align-items: center;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
  padding-block: clamp(3rem, 7vw, 5.5rem);
}
.hero h1 { color: #fff; }
.hero h1 em { font-style: normal; background: var(--grad-sun); -webkit-background-clip: text;
              background-clip: text; color: transparent; }
.hero .lede { color: #CFC4F2; font-size: clamp(1.05rem, 2vw, 1.3rem); max-width: 34ch; }
.hero__cta { display: flex; flex-wrap: wrap; gap: .75rem; margin: 1.75rem 0 1.25rem; }
.hero__proof { display: flex; flex-wrap: wrap; gap: 1.25rem; font-size: .85rem; color: #BEB0EC;
               font-family: var(--mono); letter-spacing: .06em; }
.hero__proof span { display: flex; align-items: center; gap: .4rem; }

/* --------------------------------------------------------------------------
   7. SIGNATURE COMPONENT — THE ADOPTION CARD
   Every PiviPet is presented as a filed adoption record: photo, stamped seal,
   and mono data fields. This is the one element the site is remembered by.
   -------------------------------------------------------------------------- */
.adopt-card {
  position: relative; background: var(--card); border-radius: var(--radius);
  border: 1px solid var(--line); box-shadow: var(--shadow);
  overflow: hidden; display: flex; flex-direction: column;
  transition: transform .18s ease, box-shadow .18s ease;
}
.adopt-card:hover, .adopt-card:focus-within { transform: translateY(-4px); box-shadow: var(--shadow-l); }

/* 1.3.40 — the whole animal, never cropped.

   The frame was 4:5 with object-fit:cover, which fills the box by cutting
   whatever does not fit. That is right for photos shot to the frame and wrong
   for these: long animals lost their tails and the wide shots lost their
   sides. The frame is now square — closer to how the photographs are actually
   composed — and the image is fitted inside it rather than cropped to it.

   The background is the card's own surface, so a photo on white blends into
   the card and no letterbox band is visible. A photo shot on a different
   backdrop will show a faint edge; that is the trade for never losing a tail
   again, and it argues for shooting all 36 on the same white. */
.adopt-card__media {
  position: relative;
  aspect-ratio: 1 / 1;
  background: var(--surface);
  overflow: hidden;
}

.adopt-card__media img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  transition: transform .4s ease;
}
.adopt-card:hover .adopt-card__media img { transform: scale(1.04) rotate(-1.2deg); }
.adopt-card__flag {
  position: absolute; top: .75rem; left: .75rem; z-index: 2;
}
.adopt-card__worlds { position: absolute; bottom: .75rem; right: .75rem; display: flex; gap: .3rem; z-index: 2; }

.adopt-card__body { padding: 1.1rem 1.15rem 1.25rem; display: flex; flex-direction: column; flex: 1; }
.adopt-card__name { font-family: var(--display); font-size: 1.3rem; font-weight: 700; margin: 0; }
.adopt-card__species { font-family: var(--mono); font-size: .72rem; letter-spacing: .12em;
                       text-transform: uppercase; color: var(--muted); margin: .15rem 0 .8rem; }

/* 1.3.37 — what the price covers, on the card itself. Set in the body face
   rather than the mono eyebrow so it reads as a sentence to a human, not as
   another metadata row — it is the one line on the card doing persuasion.
   Sits above the data strip, which pins itself to the bottom with
   margin-top:auto, so this stays tight under the series line. */
.adopt-card__includes {
  display: flex;
  align-items: baseline;
  gap: .4rem;
  font-size: .84rem;
  font-weight: 600;
  line-height: 1.4;
  color: var(--ink-soft);
  margin: -.4rem 0 .85rem;
}

/* 1.3.38 — the same purple diamond that marks every item in the includes
   list on the homepage and the buy box. Reusing it ties the card to the rest
   of the site rather than inventing a new mark, and the colour is what does
   most of the work: at .84rem the eye catches the accent before it reads the
   words. Italics and a leading asterisk were considered and rejected —
   italics lose legibility at this size, and an asterisk reads as a footnote
   marker, which frames a selling point as fine print. */
.adopt-card__includes::before {
  content: "◆";
  color: var(--glow);
  font-size: .7em;
  flex: none;
  position: relative;
  top: -.05em;
}

@media (max-width: 640px) {
  .adopt-card__includes { font-size: .8rem; }
}

/* the perforated data strip */
.datastrip { border-top: 1px dashed var(--line); margin-top: auto; padding-top: .8rem; }
.datarow {
  display: flex; justify-content: space-between; gap: 1rem;
  font-family: var(--mono); font-size: .74rem; padding: .18rem 0;
}
.datarow dt, .datarow span { color: var(--muted); letter-spacing: .06em; text-transform: uppercase; }
.datarow dd, .datarow b { margin: 0; color: var(--ink); text-align: right; font-weight: 700; }
.adopt-card__foot { display: flex; align-items: center; gap: .75rem; margin-top: 1rem; }
.price { font-family: var(--display); font-size: 1.35rem; font-weight: 800; }
.price s { font-family: var(--body); font-size: .85rem; font-weight: 500; color: var(--muted); margin-left: .4rem; }
.adopt-card__foot .btn { padding: .7rem 1.15rem; font-size: .9rem; margin-left: auto; }

/* Stamped seal — used on the product page + adoption center */
.seal {
  width: 108px; height: 108px; border-radius: 50%; display: grid; place-items: center;
  text-align: center; border: 2px dashed var(--seal); color: var(--seal);
  font-family: var(--mono); font-size: .58rem; letter-spacing: .14em; text-transform: uppercase;
  line-height: 1.35; transform: rotate(-8deg); flex: none; padding: .5rem;
}

/* --------------------------------------------------------------------------
   8. GENERIC CARDS + FEATURE BLOCKS
   -------------------------------------------------------------------------- */
.card {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 1.5rem; box-shadow: var(--shadow);
}
.card h3 { margin-bottom: .35rem; }
.card p:last-child { margin-bottom: 0; }
.section--ink .card { background: rgba(255,255,255,.06); border-color: rgba(255,255,255,.14); color: #E4DCFF; box-shadow: none; }

.icon-tile {
  width: 46px; height: 46px; border-radius: 14px; display: grid; place-items: center;
  font-size: 1.4rem; margin-bottom: .9rem; background: var(--surface-2);
}
.icon-tile--sun { background: var(--grad-sun); }
.icon-tile--frost { background: var(--grad-frost); }
.icon-tile--glow { background: var(--grad-glow); }

/* Numbered steps — used only where order genuinely matters (the adoption flow) */
.steps { counter-reset: step; display: grid; gap: 1.25rem; }
.step { display: grid; grid-template-columns: 3rem 1fr; gap: 1rem; align-items: start; }
.step::before {
  counter-increment: step; content: counter(step);
  width: 3rem; height: 3rem; border-radius: 50%; display: grid; place-items: center;
  background: var(--ink); color: #fff; font-family: var(--display); font-weight: 800; font-size: 1.2rem;
}
.section--ink .step::before { background: var(--sun); color: #2A1400; }
.step h3 { margin-bottom: .2rem; }
.step p { margin-bottom: 0; }

/* Collection tile */
.tile {
  position: relative; display: block; text-decoration: none; border-radius: var(--radius);
  overflow: hidden; background: var(--card); border: 1px solid var(--line); box-shadow: var(--shadow);
  transition: transform .18s ease, box-shadow .18s ease;
}
.tile:hover { transform: translateY(-4px); box-shadow: var(--shadow-l); }
.tile img { aspect-ratio: 1; object-fit: cover; width: 100%; }
.tile__body { padding: 1rem 1.15rem 1.25rem; }
.tile__body h3 { margin-bottom: .1rem; font-size: 1.2rem; }
.tile__body p { font-size: .9rem; color: var(--muted); margin: 0; }

/* Colour-world explainer */
.world { text-align: center; }
.world__orb { width: 120px; height: 120px; border-radius: 50%; margin: 0 auto 1rem; box-shadow: var(--shadow); }
.world__orb--sun   { background: var(--grad-sun); }
.world__orb--frost { background: var(--grad-frost); }
.world__orb--glow  { background: var(--grad-glow); }

/* Testimonials */
.quote { background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); padding: 1.6rem; box-shadow: var(--shadow); }
.quote blockquote { margin: 0 0 1rem; font-size: 1.02rem; }
.quote figcaption { font-family: var(--mono); font-size: .74rem; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.stars { color: var(--sun); letter-spacing: .1em; margin-bottom: .6rem; }

/* Trust bar */
.trustbar { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
            border-block: 1px solid var(--line); padding-block: 1.5rem; }
.trust { display: flex; gap: .7rem; align-items: flex-start; font-size: .92rem; }
.trust strong { display: block; font-size: .95rem; }
.trust span { color: var(--muted); }

/* Bundle ladder */
.ladder { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr)); }
.rung { border: 2px solid var(--line); border-radius: var(--radius); padding: 1.4rem; background: var(--card); position: relative; }
.rung--best { border-color: var(--sun); box-shadow: 0 0 0 4px rgba(255,138,61,.14); }
.rung__tag { position: absolute; top: -.75rem; left: 1.2rem; }
.rung h3 { margin-bottom: .1rem; }
.rung .price { display: block; margin: .5rem 0 .25rem; }
.rung ul { margin: .9rem 0 1.25rem; padding: 0; list-style: none; font-size: .92rem; }
.rung li { padding-left: 1.4rem; position: relative; margin-bottom: .35rem; }
.rung li::before { content: "✓"; position: absolute; left: 0; color: var(--seal); font-weight: 800; }

/* FAQ */
.faq details {
  border-bottom: 1px solid var(--line); padding: 1.1rem .25rem;
}
.faq summary {
  cursor: pointer; font-family: var(--display); font-size: 1.12rem; font-weight: 700;
  list-style: none; display: flex; justify-content: space-between; gap: 1rem; align-items: center;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after { content: "+"; font-family: var(--body); font-size: 1.5rem; color: var(--sun); flex: none; }
.faq details[open] summary::after { content: "–"; }
.faq details > p { margin: .8rem 0 0; color: var(--ink-soft); }

/* Email capture */
.signup { background: var(--grad-glow); border-radius: var(--radius); padding: clamp(1.75rem, 4vw, 3rem); color: #fff; }
.signup h2 { color: #fff; }
.signup p { color: rgba(255,255,255,.9); }
.form-row { display: flex; flex-wrap: wrap; gap: .6rem; max-width: 34rem; }
.form-row input { flex: 1 1 14rem; }
input, select, textarea {
  font: inherit; padding: .85rem 1rem; border-radius: 999px; border: 1px solid var(--line);
  background: #fff; color: var(--ink); width: 100%;
}
textarea { border-radius: var(--radius-s); min-height: 9rem; resize: vertical; }
label { font-weight: 700; font-size: .92rem; display: block; margin-bottom: .35rem; }
.field-group { margin-bottom: 1.1rem; }
.hint { font-size: .82rem; color: var(--muted); margin: .4rem 0 0; }
.signup .hint { color: rgba(255,255,255,.85); }

/* --------------------------------------------------------------------------
   9. PRODUCT PAGE
   -------------------------------------------------------------------------- */
.crumbs { font-family: var(--mono); font-size: .72rem; letter-spacing: .08em; text-transform: uppercase;
          color: var(--muted); padding-block: 1.25rem; }
.crumbs a { text-decoration: none; }
.crumbs a:hover { text-decoration: underline; }

.pdp { display: grid; gap: clamp(1.5rem, 4vw, 3.5rem); grid-template-columns: repeat(auto-fit, minmax(min(100%, 24rem), 1fr));
       align-items: start; padding-bottom: clamp(2rem, 5vw, 4rem); }
.gallery__main { border-radius: var(--radius); overflow: hidden; border: 1px solid var(--line); background: var(--surface-2); }
.gallery__main img { width: 100%; aspect-ratio: 1; object-fit: cover; }
.gallery__thumbs { display: grid; grid-template-columns: repeat(4, 1fr); gap: .6rem; margin-top: .6rem; }
.gallery__thumbs button { padding: 0; border: 2px solid var(--line); border-radius: var(--radius-s);
                          overflow: hidden; background: none; cursor: pointer; }
.gallery__thumbs button[aria-current="true"] { border-color: var(--ink); }
.gallery__thumbs img { aspect-ratio: 1; object-fit: cover; width: 100%; }

.buybox { position: sticky; top: 90px; }
.buybox h1 { margin-bottom: .15rem; }
.buybox .price { font-size: 2rem; }
.option-row { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: 1.25rem; }
.chip {
  border: 2px solid var(--line); background: #fff; border-radius: 999px;
  padding: .55rem 1rem; cursor: pointer; font-weight: 700; font-size: .9rem;
  display: inline-flex; align-items: center; gap: .45rem;
}
.chip[aria-pressed="true"] { border-color: var(--ink); background: var(--ink); color: #fff; }
.chip[aria-pressed="true"] .swatch { box-shadow: 0 0 0 1px #fff; }

.included { list-style: none; padding: 0; margin: 1.25rem 0; display: grid; gap: .55rem; }
/* 1.3.43 — the row is a block with an absolutely placed marker, not a flex
   container. As flex, every child became its own flex item, so a list written
   by hand as <strong>Label</strong> — description had the label and the
   description wrapping in separate columns ("A teacher / guide"). The theme's
   own lists wrap their content in a span and were fine; hand-written ones in
   page content were not. Block flow means both work, and any list written
   later works too. */
.included li {
  display: block;
  position: relative;
  padding-left: 1.3rem;
  font-size: .96rem;
}

.included li::before {
  content: "◆";
  color: var(--glow);
  position: absolute;
  left: 0;
  top: 0;
  line-height: inherit;
}

.accordion { border-top: 1px solid var(--line); margin-top: 1.5rem; }

/* --------------------------------------------------------------------------
   10. BLOG + ARTICLE
   -------------------------------------------------------------------------- */
.post { background: var(--card); border: 1px solid var(--line); border-radius: var(--radius);
        overflow: hidden; box-shadow: var(--shadow); display: flex; flex-direction: column; }
.post img { aspect-ratio: 16/10; object-fit: cover; }
.post__body { padding: 1.25rem; display: flex; flex-direction: column; flex: 1; }
.post__body h3 { font-size: 1.2rem; }
.post__body a { text-decoration: none; }
.post__body a:hover { text-decoration: underline; }
.post__meta { margin-top: auto; font-family: var(--mono); font-size: .72rem; letter-spacing: .08em;
              text-transform: uppercase; color: var(--muted); padding-top: .75rem; }

.prose { max-width: 42rem; }
.prose h2 { margin-top: 2.25rem; }
.prose h3 { margin-top: 1.75rem; }
.prose ul, .prose ol { padding-left: 1.25rem; }
.prose li { margin-bottom: .5rem; max-width: 64ch; }
.prose table { width: 100%; border-collapse: collapse; margin: 1.5rem 0; font-size: .95rem; }
.prose th, .prose td { text-align: left; padding: .7rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; }
.prose th { font-family: var(--mono); font-size: .72rem; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }

/* --------------------------------------------------------------------------
   11. SHOP FILTERS
   -------------------------------------------------------------------------- */
.filters { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-bottom: 1.75rem; }
.filters .chip { font-size: .85rem; padding: .45rem .9rem; }
.result-count { font-family: var(--mono); font-size: .75rem; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); margin-left: auto; }

/* --------------------------------------------------------------------------
   12. CART DRAWER
   -------------------------------------------------------------------------- */
.drawer {
  position: fixed; inset: 0 0 0 auto; width: min(92vw, 400px); background: var(--surface);
  border-left: 1px solid var(--line); box-shadow: var(--shadow-l); z-index: 80;
  transform: translateX(100%); transition: transform .25s ease;
  display: flex; flex-direction: column;
}
.drawer[data-open="true"] { transform: none; }
.drawer__head { display: flex; align-items: center; justify-content: space-between; padding: 1.1rem 1.25rem; border-bottom: 1px solid var(--line); }
.drawer__head h2 { margin: 0; font-size: 1.3rem; }
.drawer__body { padding: 1.25rem; overflow-y: auto; flex: 1; }
.drawer__foot { padding: 1.25rem; border-top: 1px solid var(--line); background: var(--card); }
.line-item { display: grid; grid-template-columns: 56px 1fr auto; gap: .75rem; align-items: center; padding: .75rem 0; border-bottom: 1px dashed var(--line); }
.line-item img { border-radius: 8px; }
.line-item strong { display: block; font-size: .95rem; }
.line-item small { color: var(--muted); font-family: var(--mono); font-size: .72rem; }
.progress { height: 8px; border-radius: 999px; background: var(--surface-2); overflow: hidden; margin: .5rem 0 1rem; }
.progress i { display: block; height: 100%; background: var(--grad-sun); width: 0; transition: width .3s ease; }
.scrim { position: fixed; inset: 0; background: rgba(36,27,69,.45); z-index: 70; opacity: 0; pointer-events: none; transition: opacity .25s ease; }
.scrim[data-open="true"] { opacity: 1; pointer-events: auto; }

/* --------------------------------------------------------------------------
   13. FOOTER
   -------------------------------------------------------------------------- */
.footer { background: var(--ink); color: #C6BAEC; padding-block: clamp(3rem, 6vw, 4.5rem) 2rem; }
.footer h4 { color: #fff; font-family: var(--mono); font-size: .74rem; letter-spacing: .16em;
             text-transform: uppercase; margin-bottom: 1rem; }
.footer a { color: #C6BAEC; text-decoration: none; }
.footer a:hover { color: #fff; text-decoration: underline; }
.footer ul { list-style: none; padding: 0; margin: 0; }
.footer li { margin-bottom: .5rem; }
.footer__grid { display: grid; gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(min(100%, 12rem), 1fr)); }
.footer__brand { max-width: 22rem; }
.footer__brand .brand { color: #fff; margin-bottom: .75rem; }
.footer__bottom { border-top: 1px solid rgba(255,255,255,.14); margin-top: 2.5rem; padding-top: 1.5rem;
                  display: flex; flex-wrap: wrap; gap: 1rem; justify-content: space-between;
                  font-size: .84rem; }

/* --------------------------------------------------------------------------
   14. MOTION
   -------------------------------------------------------------------------- */
/* Scroll reveal.
   Scoped to .has-js so that with JavaScript disabled — or if site.js fails
   to load — the content is simply visible rather than permanently at
   opacity 0. The class is set by a tiny inline snippet in the head, before
   first paint, so there is no flash of hidden content. */
.has-js .reveal { opacity: 0; transform: translateY(18px); transition: opacity .5s ease, transform .5s ease; }
.has-js .reveal.in { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; }
  html { scroll-behavior: auto; }
  .reveal { opacity: 1; transform: none; }
}

/* Utilities */
.center { text-align: center; }
.mt-0 { margin-top: 0; } .mb-0 { margin-bottom: 0; }
.stack > * + * { margin-top: 1rem; }
.visually-hidden {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ==========================================================================
   15. WORDPRESS LAYOUT SCAFFOLDING
   Classes the templates need that the static prototype did not.
   ========================================================================== */

.wrap--narrow { max-width: 52rem; }
.section--pagehead { padding-block: clamp(2.5rem, 6vw, 4rem); }
.section-head--flush { margin-bottom: 0; }
.section-head--tight { margin-bottom: 1.25rem; }
.section__cta { margin-top: 2rem; }

/* Two-column body layout used by the Journal and the shop */
.layout { display: grid; gap: clamp(2rem, 4vw, 3.5rem); align-items: start; }
@media (min-width: 62rem) {
  .layout--sidebar { grid-template-columns: 1fr var(--aside); }
  .layout--sidebar-left { grid-template-columns: var(--aside) 1fr; }
  .layout--sidebar-left .layout__main { order: 2; }
  .layout--sidebar-left .layout__aside { order: 1; }
  .layout__aside { position: sticky; top: 90px; }
}
.layout__main { min-width: 0; }

/* Header ------------------------------------------------------------------ */
.brand__text { white-space: nowrap; }
/* Wordmark logos are wide, not square. Constrain the height and let the
   width follow, so a horizontal logo is not squashed into a 38px box. */
.brand__logo {
  height: 42px; width: auto; max-width: min(240px, 45vw);
  object-fit: contain; flex: none; display: block;
}
@media (max-width: 940px) { .brand__logo { height: 36px; max-width: 55vw; } }

.nav__list {
  list-style: none; margin: 0; padding: 0;
  display: flex; align-items: center; gap: .35rem;
}
.nav__list li { margin: 0; }
.nav__list a {
  text-decoration: none; padding: .55rem .8rem; border-radius: 999px;
  font-weight: 700; font-size: .95rem; white-space: nowrap; display: block;
}
.nav__list a:hover { background: var(--surface-2); }
.nav__list a[aria-current="page"] { background: var(--ink); color: #fff; }

.burger__label { font-size: .9rem; }

@media (max-width: 940px) {
  .nav__list { flex-direction: column; align-items: stretch; gap: .25rem; }
  .nav__list a { padding: .9rem 1rem; font-size: 1.05rem; border-bottom: 1px solid var(--line); border-radius: 0; }
}

/* Hero -------------------------------------------------------------------- */
.hero__copy { min-width: 0; }
.hero__record { max-width: 26rem; margin-inline: auto; width: 100%; }
.field--hero { color: #FFC24A; }
.field--on-glow { color: rgba(255,255,255,.8); }
.hero__proof { list-style: none; margin: 0; padding: 0; }
.hero__proof li { display: flex; align-items: center; gap: .4rem; }
.hero__cta--center { justify-content: center; }

/* Trust bar as a list ------------------------------------------------------ */
.trustbar { list-style: none; margin: 0; padding-inline: 0; padding-block: 1.5rem; }
.trust__mark { color: var(--glow); flex: none; }
.trustbar--pdp { grid-template-columns: 1fr 1fr; margin-top: 1.5rem; }

/* Steps as an ordered list ------------------------------------------------- */
.steps--row {
  list-style: none; counter-reset: step; margin: 0; padding: 0;
  display: grid; gap: clamp(1rem, 2.5vw, 1.75rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
}
.steps--row .step { margin: 0; }

/* Adoption card ------------------------------------------------------------ */
.adopt-card__img { width: 100%; height: 100%; object-fit: cover; }

/* 1.3.29 — compact variant for the product buy box. One line per item: bold
   label, dash, description, all inline. Tighter row gap than the default
   .included so seven items cost as little height as possible — every pixel
   here pushes the storybook upsell further down. */
.included--compact { gap: .55rem; }

.included--compact li {
  align-items: baseline;
  line-height: 1.45;
}

.included--compact li strong {
  font-size: .95rem;
  color: var(--ink);
}

.included--compact .included__desc {
  font-size: .95rem;
  color: var(--muted);
}

@media (max-width: 640px) {
  .included--compact { gap: .6rem; }
}

/* 1.3.28 — hide Square's Apple Pay / Google Pay bar on product pages only.
   Square's own setting hides wallets by type, not by page, so switching them
   off there would have removed them from checkout too — and on phones those
   buttons skip the whole address form, which is where mobile checkouts get
   abandoned. Scoped to body.single-product so cart and checkout are
   untouched. Selectors are deliberately broad: the plugin has renamed these
   containers between versions, and a stale selector here fails silently.
   If the bar reappears after a Square update, that is the cause. */
body.single-product [id^="wc-square-digital-wallet"],
body.single-product [class*="wc-square-digital-wallet"],
body.single-product [id^="wc-square-apple-pay"],
body.single-product [id^="wc-square-google-pay"],
body.single-product [class*="wc-square-wallet"],
body.single-product .wc-square-wallet-divider,
body.single-product .woocommerce-square-digital-wallet {
  display: none !important;
}

/* 1.3.25 — upsells relocated into the buy-box column. Compact two-up so the
   offer reads as an add-on beside the price, not a second product page. */
.summary-upsells {
  margin: 1.6rem 0 0;
  padding-top: 1.3rem;
  border-top: 1px dashed var(--line, rgba(0,0,0,.14));
}

.summary-upsells .products {
  gap: .9rem;
  margin: 0;
}

.summary-upsells h2 {
  font-size: 1rem;
  letter-spacing: .02em;
  margin: 0 0 .85rem;
}

.summary-upsells .adopt-card__flag,
.summary-upsells .pill--new,
.summary-upsells .field { display: none; }

.summary-upsells li.product h3,
.summary-upsells li.product .woocommerce-loop-product__title {
  font-size: .95rem;
  line-height: 1.25;
}

.summary-upsells li.product .price { font-size: .95rem; }

@media (max-width: 640px) {
  .summary-upsells .products { gap: .7rem; }
}

/* 1.3.23 — variation note under the product gallery. Quiet on purpose: it
   sits below a large photograph and should read as a footnote, not compete
   with the buy box across the gap. */
.gallery-note {
  margin: .85rem 0 0;
  font-size: .86rem;
  line-height: 1.5;
  color: var(--muted);
  max-width: 46ch;
}

@media (max-width: 900px) {
  .gallery-note {
    margin-bottom: 1.25rem;
    max-width: none;
  }
}

/* Content span inside .included list items (see pivipets_included_list) */
.included li > span { min-width: 0; }

/* 1.3.19 — stacked variant, used by the homepage adoption-kit section.
   The label goes up a size and takes its own line; the description drops
   beneath it in the muted body colour. Uppercase was considered and
   rejected — the labels are long phrases ("An exclusive Adoption
   PiviPendant"), and set in caps they read slowly and fight the display
   serif in the heading directly above. Size, weight and the line break
   carry the separation instead. */
.included--stacked { gap: 1.05rem; }
.included--stacked li { align-items: baseline; }
.included--stacked li > span { display: block; }

.included--stacked li strong {
  display: block;
  font-size: 1.07rem;
  line-height: 1.3;
  letter-spacing: .004em;
  color: var(--ink);
  margin-bottom: .16rem;
}

/* The dash only makes sense on one line. */
.included--stacked .included__sep { display: none; }

.included--stacked .included__desc {
  display: block;
  font-size: .95rem;
  line-height: 1.5;
  color: var(--muted);
}

/* Phones: the two-column split has already collapsed by here, so the
   labels get a touch more room and the gap tightens back up. */
@media (max-width: 640px) {
  .included--stacked { gap: .9rem; }
  .included--stacked li strong { font-size: 1.02rem; }
}

/* 1.3.17 — a page marked "Narrow reading column" also gets .prose, whose
   generic ul/li rules add an indent and a per-item max-width. Those outrank
   .included and squeeze the checklist bullets so the bold label breaks away
   from its description. Same collision already fixed for .faq__answer; this
   restates it wherever an .included list sits inside prose. */
.prose .included { padding-left: 0; }
.prose .included li { max-width: none; margin-bottom: 0; }
.adopt-card__name { font-size: 1.3rem; }
.adopt-card__name a { text-decoration: none; }
.adopt-card__name a::after {
  /* Full-card click target without nesting interactive elements */
  content: ""; position: absolute; inset: 0; z-index: 1;
}
.adopt-card__name a:hover { text-decoration: underline; }
/* Raise these above the card-wide link overlay.
   NOTE: do not set position here. The flag and the color swatches are
   already absolutely positioned inside the media well; overriding that with
   position:relative dropped them back into normal flow, which is how the
   swatches ended up half outside the bottom-left corner of every card. */
.adopt-card__foot .btn { position: relative; z-index: 2; }
.adopt-card__flag,
.adopt-card__worlds { z-index: 3; }
.adopt-card--featured .adopt-card__body { padding-bottom: 1.5rem; }

/* Framed imagery ----------------------------------------------------------- */
.framed { border-radius: var(--radius); box-shadow: var(--shadow-l); }

/* Journal cards ------------------------------------------------------------ */
.post__media { display: block; }
.post__media img { aspect-ratio: 16/10; object-fit: cover; width: 100%; }
.post__title { font-size: 1.2rem; margin-bottom: .4rem; }
.post__title a { text-decoration: none; }
.post__title a:hover { text-decoration: underline; }

/* Entry content ------------------------------------------------------------ */
/* Cap the measure on ordinary prose so paragraphs stay readable, but let
   full-width layout blocks through. A .section pasted into a page is a
   band that should span the viewport; capping it at 42rem squeezed entire
   pages into a narrow left-hand column. The :not() list names the layout
   wrappers the theme provides, so prose stays constrained and structure
   does not. */
/* 1.3.34 — .woocommerce added to the exemption list. Cart, checkout and
   account render as <div class="woocommerce"> inside .entry-content, so the
   42rem prose cap was squeezing the entire checkout into a reading column.
   The billing fields, the order review and the payment methods all inherited
   that width, which is what made the form look broken: fields at odd widths,
   labels crowding their inputs, card icons stacking vertically. The layout
   was fine; the container was wrong. */
.entry-content > *:not(.section):not(.wrap):not(.alignwide):not(.alignfull):not(.split):not(.grid):not(.woocommerce) {
  max-width: 42rem;
  /* 1.3.16 — the cap above was applied without centring, so every prose page
     (For Teachers, Care Instructions, Custom Orders, Terms) rendered as a
     narrow column jammed against the left edge of a much wider .wrap. The
     column is the right width; it just needs to sit in the middle of it. */
  margin-inline: auto;
}
.entry-content > .section,
.entry-content > .woocommerce,
.entry-content > .wrap { max-width: none; width: 100%; }
.entry-content > .alignwide { max-width: min(100%, 68rem); margin-inline: auto; }
.entry-content > .alignfull { max-width: none; }
.entry-content--full > * { max-width: none; }
.is-narrow .entry-content { margin-inline: auto; }

.entry-media { margin: 0 0 2rem; }
.entry-media__img { border-radius: var(--radius); box-shadow: var(--shadow); width: 100%; }

/* 1.3.18 — the adoption-kit flat-lay is the strongest selling image on the
   homepage, so it is allowed its natural shape and a little extra room. */
.framed--kit { width: 100%; height: auto; object-fit: contain; }
.entry-media--hero { margin-top: -1rem; }

.entry-title { margin-bottom: .4rem; }
.entry-tags { margin-top: 2.5rem; }
.tag-list { list-style: none; display: flex; flex-wrap: wrap; gap: .4rem; padding: 0; margin: 0; }
.tag-list a {
  display: inline-block; padding: .35rem .8rem; border-radius: 999px;
  background: var(--surface-2); font-size: .85rem; text-decoration: none;
}
.tag-list a:hover { background: var(--ink); color: #fff; }
.entry-download { margin-top: 2rem; }

.page-links { display: flex; gap: .4rem; align-items: center; margin-top: 2rem; }

/* Post navigation ---------------------------------------------------------- */
.post-nav { margin-top: 3rem; border-top: 1px solid var(--line); padding-top: 1.5rem; }
.post-nav .nav-links { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr)); }
.post-nav a { text-decoration: none; display: block; }
.post-nav a:hover .post-nav__title { text-decoration: underline; }
.post-nav__title { font-family: var(--display); font-weight: 700; font-size: 1.05rem; display: block; }
.post-nav .nav-next { text-align: right; }

/* Pagination --------------------------------------------------------------- */
.pagination { margin-top: 3rem; }
.pagination .nav-links { display: flex; flex-wrap: wrap; gap: .4rem; justify-content: center; align-items: center; }
.pagination .page-numbers {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 2.75rem; height: 2.75rem; padding: 0 .8rem;
  border: 2px solid var(--line); border-radius: 999px;
  text-decoration: none; font-weight: 700; font-size: .95rem;
}
.pagination .page-numbers:hover { border-color: var(--ink); }
.pagination .page-numbers.current { background: var(--ink); border-color: var(--ink); color: #fff; }
.pagination .dots { border-color: transparent; }

/* FAQ answers -------------------------------------------------------------- */
.faq__answer { margin-top: .8rem; color: var(--ink-soft); }
.faq__answer > :last-child { margin-bottom: 0; }
.faq summary { padding-right: .25rem; }

/* Breadcrumbs -------------------------------------------------------------- */
.crumbs__sep { opacity: .5; }
.crumbs [aria-current="page"] { color: var(--ink); }

/* Pledge card -------------------------------------------------------------- */
.pledge { text-align: center; padding: clamp(2rem, 5vw, 3.5rem); }
.pledge__text {
  font-family: var(--display); font-size: clamp(1.1rem, 2.4vw, 1.45rem);
  line-height: 1.7; margin: 1.5rem auto; color: var(--ink); max-width: none;
}

/* Founder ------------------------------------------------------------------ */
.founder__signature { margin-top: 1.5rem; }

/* Signup ------------------------------------------------------------------- */
.signup__form .btn { color: #2A1400; }
.signup__placeholder { text-align: left; }
.signup .form-row input,
.signup__form input { border-color: transparent; }

/* Widgets ------------------------------------------------------------------ */
.widget { font-size: .95rem; }
.widget__title { font-family: var(--display); font-size: 1.15rem; margin-bottom: .75rem; }
.widget ul { list-style: none; padding: 0; margin: 0; }
.widget li { padding: .35rem 0; border-bottom: 1px dashed var(--line); }
.widget li:last-child { border-bottom: 0; }
.widget a { text-decoration: none; }
.widget a:hover { text-decoration: underline; }
.widget--banner { padding-block: 1.5rem; }
.footer-banner { background: var(--surface-2); border-top: 1px solid var(--line); }
.buybox__widgets { margin-top: 1.5rem; }

/* Footer additions --------------------------------------------------------- */
.footer__col { min-width: 0; }
.footer__heading {
  color: #fff; font-family: var(--mono); font-size: .74rem; letter-spacing: .16em;
  text-transform: uppercase; margin-bottom: 1rem;
}
.footer__list { list-style: none; padding: 0; margin: 0; }
.footer__list li { margin-bottom: .5rem; }
.footer__legal-list {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-wrap: wrap; gap: 1rem; font-size: .84rem;
}

/* Search + empty states ---------------------------------------------------- */
.search-again { margin-top: 1.5rem; max-width: 34rem; }
.no-results { max-width: 34rem; margin-inline: auto; }
.no-results .search-form { margin-inline: auto; justify-content: center; }
.search-form { display: flex; flex-wrap: wrap; gap: .6rem; }
.search-field { flex: 1 1 14rem; }

/* Comments ----------------------------------------------------------------- */
.comments { margin-top: 3rem; border-top: 1px solid var(--line); padding-top: 2rem; }
.comment-list { list-style: none; padding: 0; margin: 0 0 2rem; }
.comment-list ol { list-style: none; padding-left: 1.5rem; }
.comment-body { padding: 1.25rem 0; border-bottom: 1px dashed var(--line); }
.comment-meta { font-family: var(--mono); font-size: .74rem; letter-spacing: .08em;
                text-transform: uppercase; color: var(--muted); margin-bottom: .5rem; }
.comment-author img { border-radius: 50%; display: inline-block; vertical-align: middle; margin-right: .5rem; }
.comment-form { display: grid; gap: 1rem; max-width: 40rem; }
.comment-reply-title { font-family: var(--display); }
.bypostauthor > .comment-body .comment-author::after {
  content: "★"; color: var(--sun); margin-left: .35rem;
}

/* ==========================================================================
   16. BLOCK EDITOR STYLES
   Registered in inc/blocks.php; these are their front-end appearance.
   ========================================================================== */

.is-style-pivipets-card {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 1.5rem; box-shadow: var(--shadow);
}
.is-style-pivipets-tint { background: var(--surface-2); padding-block: clamp(2rem, 5vw, 4rem); }
.is-style-pivipets-ink { background: var(--ink); color: #EDE7FF; padding-block: clamp(2rem, 5vw, 4rem); }
.is-style-pivipets-ink :is(h1,h2,h3,h4) { color: #fff; }

.is-style-pivipets-field {
  font-family: var(--mono); font-size: .7rem; letter-spacing: .16em;
  text-transform: uppercase; color: var(--muted);
}
.is-style-pivipets-lede { font-size: 1.15rem; color: var(--ink-soft); }
.is-style-pivipets-hint { font-size: .82rem; color: var(--muted); }

.is-style-pivipets-included { list-style: none; padding: 0; display: grid; gap: .55rem; }
.is-style-pivipets-included li { display: flex; gap: .65rem; align-items: flex-start; }
.is-style-pivipets-included li::before { content: "◆"; color: var(--glow); flex: none; }

.is-style-pivipets-checks { list-style: none; padding: 0; }
.is-style-pivipets-checks li { padding-left: 1.4rem; position: relative; margin-bottom: .35rem; }
.is-style-pivipets-checks li::before {
  content: "✓"; position: absolute; left: 0; color: var(--seal); font-weight: 800;
}

.is-style-pivipets-framed img { border-radius: var(--radius); box-shadow: var(--shadow-l); }

.is-style-pivipets-faq { border-bottom: 1px solid var(--line); padding: 1.1rem .25rem; }
.is-style-pivipets-faq summary {
  cursor: pointer; font-family: var(--display); font-size: 1.12rem; font-weight: 700;
}

.is-style-pivipets-testimonial {
  background: var(--card); border: 1px solid var(--line); border-left: 4px solid var(--sun);
  border-radius: var(--radius); padding: 1.6rem; box-shadow: var(--shadow);
}

.wp-block-button.is-style-pivipets-ghost .wp-block-button__link {
  background: transparent; color: var(--ink); border: 2px solid var(--ink); box-shadow: none;
}
.wp-block-button.is-style-pivipets-ghost .wp-block-button__link:hover { background: var(--ink); color: #fff; }

/* Core block defaults tuned to the design system */
.wp-block-button__link {
  border-radius: 999px; padding: .95rem 1.6rem; font-weight: 800;
  background: var(--sun); color: #2A1400; box-shadow: 0 4px 0 var(--btn-shadow);
}
.wp-block-image img { border-radius: var(--radius-s); }
.wp-block-pullquote, .wp-block-quote { border-left: 4px solid var(--sun); padding-left: 1.25rem; }
.wp-block-separator { border: 0; border-top: 1px solid var(--line); margin-block: 2.5rem; }
.wp-block-table table { width: 100%; border-collapse: collapse; }
.wp-block-table :is(th, td) { border-bottom: 1px solid var(--line); padding: .7rem .6rem; text-align: left; }
.wp-block-table th {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted);
}

/* Color + gradient palette classes generated by the editor */
.has-ink-color { color: var(--ink); }
.has-ink-background-color { background-color: var(--ink); }
.has-sun-color { color: var(--sun); }
.has-sun-background-color { background-color: var(--sun); }
.has-frost-color { color: var(--frost); }
.has-frost-background-color { background-color: var(--frost); }
.has-glow-color { color: var(--glow); }
.has-glow-background-color { background-color: var(--glow); }
.has-seal-color { color: var(--seal); }
.has-seal-background-color { background-color: var(--seal); }
.has-surface-2-background-color { background-color: var(--surface-2); }
.has-sun-gradient-background { background: var(--grad-sun); }
.has-frost-gradient-background { background: var(--grad-frost); }
.has-glow-gradient-background { background: var(--grad-glow); }

/* ==========================================================================
   17. CONTRAST CORRECTIONS

   Two colour-inheritance bugs carried over from the static prototype. Both
   are fixed here rather than in sections 1–14 so the original design system
   stays readable as a record of what was inherited.
   ========================================================================== */

/* (a) The adoption card is a white card that can sit on a dark band. Without
       an explicit color, its name and price inherit the hero's light
       lavender and land at roughly 1.4:1 against white — effectively
       invisible, which is exactly what the hero card did. Anchoring the
       card's own color makes it independent of wherever it is placed. */
.adopt-card__body { color: var(--ink-soft); }
.adopt-card__name,
.adopt-card__body .price { color: var(--ink); }

/* (b) .btn--ghost is ink text inside an ink border. On the dark hero that is
       dark-on-dark, so the secondary call to action disappeared. The ink
       band already had a fix (.section--ink .btn--ghost); the hero never
       received it. Applying the same treatment to any dark context. */
.hero .btn--ghost,
.section--ink .btn--ghost { color: #fff; border-color: #7C6BB8; }
.hero .btn--ghost:hover,
.section--ink .btn--ghost:hover { background: #fff; color: var(--ink); border-color: #fff; }

/* ==========================================================================
   18. DROPDOWN SUB-MENUS

   The static prototype had a flat navigation bar, so none of this existed.
   Real sites grow sub-pages, so the nav supports one level of nesting.

   Three ways in, deliberately: hover for pointers, :focus-within for
   keyboard, and an explicit toggle button injected by site.js for touch
   (where hover does not exist and :focus-within is unreliable). Any one of
   them opens the menu; none is required.
   ========================================================================== */

.nav__list li { position: relative; }

.sub-menu {
  list-style: none;
  margin: 0;
  padding: .4rem;
  min-width: 13rem;
}

/* ---------- Desktop: a floating panel ---------- */
@media (min-width: 941px) {
  .sub-menu {
    position: absolute;
    top: calc(100% + .25rem);
    left: 0;
    z-index: 60;
    background: var(--card);
    border: 1px solid var(--line);
    border-radius: var(--radius-s);
    box-shadow: var(--shadow-l);

    /* Hidden but still in the layout, so it can animate and stays
       measurable. visibility keeps it out of the tab order. */
    opacity: 0;
    visibility: hidden;
    transform: translateY(-4px);
    transition: opacity .16s ease, transform .16s ease, visibility .16s;
  }

  .nav__list li:hover > .sub-menu,
  .nav__list li:focus-within > .sub-menu,
  .nav__list li > .sub-menu[data-open="true"] {
    opacity: 1;
    visibility: visible;
    transform: none;
  }

  .sub-menu a {
    white-space: nowrap;
    font-size: .92rem;
    font-weight: 600;
    padding: .55rem .7rem;
  }

  /* Parent items get room for the caret */
  .menu-item-has-children > a { padding-right: 1.9rem; }

  .submenu-toggle {
    position: absolute;
    top: 50%;
    right: .5rem;
    transform: translateY(-50%);
    width: 1.1rem;
    height: 1.1rem;
    display: grid;
    place-items: center;
    border: 0;
    background: none;
    color: inherit;
    cursor: pointer;
    padding: 0;
    font-size: .6rem;
    line-height: 1;
  }
  .submenu-toggle svg { transition: transform .16s ease; }
  .submenu-toggle[aria-expanded="true"] svg { transform: rotate(180deg); }
}

/* ---------- Mobile: an indented block inside the slide-in panel ---------- */
@media (max-width: 940px) {
  .sub-menu {
    padding: 0 0 0 1rem;
    border-left: 2px solid var(--line);
    margin: 0 0 .25rem 1rem;
  }
  .sub-menu a { font-size: .98rem; padding: .7rem 1rem; }

  /* Collapsed by default so a long menu stays scannable on a phone. */
  .sub-menu[data-open="false"] { display: none; }

  .menu-item-has-children > a { padding-right: 3rem; }

  .submenu-toggle {
    position: absolute;
    top: 0;
    right: 0;
    width: 3rem;
    height: 3.1rem;
    display: grid;
    place-items: center;
    border: 0;
    background: none;
    color: inherit;
    cursor: pointer;
  }
  .submenu-toggle svg { transition: transform .16s ease; }
  .submenu-toggle[aria-expanded="true"] svg { transform: rotate(180deg); }
}

@media (prefers-reduced-motion: reduce) {
  .sub-menu, .submenu-toggle svg { transition: none; }
}

/* ==========================================================================
   19. MOBILE MENU CONTAINING-BLOCK FIX

   The mobile navigation panel is position:fixed with inset:0, so it should
   fill the viewport. It did not — it was clipped to the height of the
   header, roughly 120px on a 780px screen, leaving most menu items
   unreachable on a phone.

   The cause is that .masthead sets backdrop-filter. Any element with a
   backdrop-filter becomes the containing block for its fixed-position
   descendants, so the panel's inset:0 was resolving against the header's
   box rather than the viewport. The header is sticky, so this was invisible
   at desktop widths where the panel is not fixed.

   Dropping the blur below the mobile breakpoint restores the viewport as
   the containing block. The header keeps its near-opaque background, so
   the visual difference is negligible — and backdrop-filter is expensive
   to composite on phones anyway.
   ========================================================================== */

@media (max-width: 940px) {
  .masthead {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    background: var(--surface);
  }

  /* Belt and braces: if a future change reintroduces a containing block,
     the panel still fills the screen rather than collapsing. */
  .nav {
    height: 100vh;
    height: 100dvh;
    max-height: 100vh;
    max-height: 100dvh;
  }
}

/* Editor-only hints shown in place of empty sections. Never seen by visitors. */
.editor-hint {
  border: 2px dashed var(--line);
  border-radius: var(--radius);
  padding: 1.5rem;
  text-align: center;
  background: var(--surface-2);
  max-width: 40rem;
  margin-inline: auto;
}
.editor-hint__title { font-family: var(--display); font-weight: 700; font-size: 1.1rem; margin: .35rem 0 .5rem; }
.editor-hint .hint { margin-bottom: 1rem; }

/* ==========================================================================
   20. SALE PRICES

   WooCommerce wraps a sale price in <ins> and the old price in <del>. The
   browser default for <ins> is an underline, which read as a mistake next
   to a struck-through original — "$119.94 $99.00" with both decorated.
   These rules were previously scoped to the product page only, so cards
   and the bundle ladder kept the browser default.
   ========================================================================== */

.price ins,
.woocommerce-Price-amount ins,
ins.woocommerce-Price-amount {
  text-decoration: none;
  background: transparent;
  font-weight: inherit;
}

.price del,
del .woocommerce-Price-amount {
  opacity: .5;
  font-size: .8em;
  font-weight: 600;
  margin-right: .35rem;
}

/* The sale price should read as the price, not as an afterthought. */
.price ins { color: inherit; }

/* ==========================================================================
   21. SINGLE-HYPHEN CLASS ALIASES

   The BEM-style modifiers below use a double hyphen (.section--tint), which
   is standard CSS practice but a hazard in WordPress: pasting HTML through
   the classic editor, or copying it out of any tool that applies smart
   typography, converts "--" into an en-dash and the class silently stops
   matching. The same happens to straight quotes around attributes.

   These aliases give every modifier a single-hyphen equivalent, so
   hand-pasted HTML keeps working even when something along the way has
   been helpful with the punctuation. Both spellings are supported
   permanently — this is not a temporary workaround.
   ========================================================================== */

.section-tint { background: var(--surface-2); }

.section-ink {
  background: var(--ink);
  color: #EDE7FF;
}
.section-ink :is(h1, h2, h3, h4) { color: #fff; }
.section-ink a { color: #FFC24A; }
.section-ink .btn-ghost,
.section-ink .btn--ghost { color: #fff; border-color: #7C6BB8; }

.wrap-narrow { max-width: 52rem; }

.btn-ghost {
  background: transparent;
  color: var(--ink);
  border: 2px solid var(--ink);
  box-shadow: none;
}
.btn-ghost:hover {
  background: var(--ink);
  color: #fff;
  transform: none;
  box-shadow: none;
}

/* ==========================================================================
   22. SECTION-BUILT PAGES

   Pages whose content is a series of full-width bands (see
   pivipets_content_has_sections). The article gets no outer wrapper, so the
   bands reach the edges of the screen and each band's own .wrap handles the
   column width — one level of centring instead of two.
   ========================================================================== */

.has-sections { padding-block: 0; }
.has-sections > .entry-content > * { max-width: none; }

/* An empty column in a two-up split leaves a hole. When one side has no
   content — an image not added yet — collapse to a single column rather
   than reserving space for nothing.

   :not(:has(*)) rather than :empty, because a div containing only a
   newline is not :empty as far as CSS is concerned, and hand-edited HTML
   almost always has a newline in it. This matches any column with no
   element children, whitespace or not. */
.split > div:not(:has(*)) { display: none; }

/* Cap the measure inside split columns.

   When both columns are filled each is around 540px, so this changes
   nothing. When one is empty — an image not added yet — the surviving
   column would otherwise stretch to the full 1120px container and run a
   line of text roughly twice as long as the prose sections above and
   below it. Capping the text keeps the page reading evenly either way.

   Done on the children rather than on .split itself because the obvious
   selector, .split:has(> div:not(:has(*))), is invalid CSS — :has() may
   not be nested inside another :has() — and fails silently. */
.split > div > :is(p, ul, ol, blockquote, h1, h2, h3, h4) {
  max-width: 42rem;
}

/* ==========================================================================
   23. SERIES INTRODUCTION

   The theme, verse and physical tokens shown at the top of a product
   category archive. See inc/series.php.
   ========================================================================== */

.series-intro {
  max-width: 46rem;
  margin: 0 auto clamp(2rem, 5vw, 3rem);
  text-align: center;
}

.series-intro__quote {
  border: 0;
  margin: .5rem 0 1.25rem;
  padding: 0;
}
.series-intro__quote p {
  font-family: var(--display);
  font-size: clamp(1.3rem, 3vw, 1.9rem);
  line-height: 1.25;
  color: var(--ink);
  margin: 0;
}
.series-intro__quote p::before { content: "\201C"; }
.series-intro__quote p::after  { content: "\201D"; }

.series-intro .lede { margin-bottom: 1.5rem; }

.series-intro__tokens {
  display: flex;
  flex-wrap: wrap;
  gap: 1.75rem;
  align-items: center;
  margin: 0;
  font-family: var(--mono);
  font-size: .72rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
}
.series-intro__tokens span { display: flex; gap: .5rem; align-items: baseline; }
.series-intro__tokens strong {
  font-family: var(--body);
  font-size: .95rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink);
}

/* Fun fact and story details on a product page. See inc/animals.php. */
.animal-story {
  margin-top: 1.5rem;
  padding-top: 1.25rem;
  border-top: 1px dashed var(--line);
}
.animal-story__fact {
  font-family: var(--display);
  font-size: 1.1rem;
  line-height: 1.4;
  color: var(--ink);
  margin: .35rem 0 1rem;
}
.animal-story .datarow { margin: 0; }

/* Series tiles on the browse-by-series page. Spans rather than headings,
   because the whole tile is one link and a heading inside a link reads
   oddly to a screen reader. */
.tile__media { display: block; }
.tile__body { display: flex; flex-direction: column; gap: .15rem; }
.tile__name {
  font-family: var(--display);
  font-weight: 700;
  font-size: 1.2rem;
  color: var(--ink);
  line-height: 1.2;
}
.tile__count { font-size: .85rem; color: var(--muted); }
a.tile { text-decoration: none; display: block; }

/* ==========================================================================
   24. SHOP HEADER

   The filter chips sit inside the header band rather than below it. The
   band was previously a tall empty rectangle with only a title in it, and
   the filters are the first thing a shopper reaches for — so putting them
   together fills the space and shortens the path to a filtered view.
   ========================================================================== */

.shop-head .filters {
  margin-top: clamp(1.5rem, 3vw, 2.25rem);
  padding-top: clamp(1.25rem, 3vw, 1.75rem);
  border-top: 1px solid var(--line);
}

/* On the tinted band a plain white chip reads as a button rather than a
   panel edge, so the unselected state gets a solid background. */
.shop-head .filters .chip { background: var(--card); }
.shop-head .filters .chip[aria-current="true"] { background: var(--ink); color: #fff; }

.shop-head .result-count { margin-left: auto; }

/* Series page header: identity on the left, the series photograph beside it. */
.series-head { display: grid; gap: clamp(1.5rem, 4vw, 3rem); align-items: center; }
@media (min-width: 62rem) {
  .series-head--media { grid-template-columns: 1fr minmax(0, 22rem); }
}
.series-head h1 { margin-bottom: .5rem; }
.series-head .lede { margin-bottom: 0; max-width: 34rem; }
.series-head__media { margin: 0; }
/* 1.3.39 — the image is no longer pre-cropped, so the figure takes whatever
   height the picture needs. A square series image now shows square; a
   landscape one shows landscape. Nothing is cut off either way, and there are
   no empty bands, because the box follows the image rather than the image
   being forced into the box. */
.series-head__media img {
  width: 100%; height: auto; border-radius: var(--radius);
  box-shadow: var(--shadow-l); display: block;
  max-height: 26rem;
  object-fit: contain;
}

/* ==========================================================================
   25. PROCESS FLOW

   A numbered sequence with arrows between the steps, for explaining how
   adoption works. The arrows are drawn in CSS and marked aria-hidden by
   virtue of being generated content, so a screen reader hears an ordered
   list — which is what it is — rather than a row of punctuation.

   The arrows disappear below the breakpoint, where the steps stack
   vertically and an arrow pointing right would be pointing nowhere.
   ========================================================================== */

.flow {
  list-style: none;
  counter-reset: flow;
  margin: 0;
  padding: 0;
  display: grid;
  gap: clamp(1.5rem, 4vw, 2rem);
}

@media (min-width: 60rem) {
  .flow { grid-auto-flow: column; grid-auto-columns: 1fr; align-items: start; }
}

.flow__step {
  position: relative;
  text-align: center;
  padding-inline: .5rem;
}

.flow__step::before {
  counter-increment: flow;
  content: counter(flow);
  display: grid;
  place-items: center;
  width: 3.25rem;
  height: 3.25rem;
  margin: 0 auto .9rem;
  border-radius: 50%;
  background: var(--grad-sun);
  color: #2A1400;
  font-family: var(--display);
  font-weight: 800;
  font-size: 1.25rem;
  box-shadow: var(--shadow);
}

/* The connector. Sits level with the numbers, not the text, so it reads as
   joining the steps rather than underlining them. */
@media (min-width: 60rem) {
  .flow__step:not(:last-child)::after {
    content: "";
    position: absolute;
    top: 1.6rem;
    left: calc(50% + 2.25rem);
    right: calc(-50% + 2.25rem);
    height: 2px;
    background: linear-gradient(90deg, var(--line), var(--glow));
    border-radius: 2px;
  }
}

.flow__step h3 { font-size: 1.15rem; margin-bottom: .35rem; }
.flow__step p { color: var(--ink-soft); margin: 0; font-size: .95rem; }

.section--ink .flow__step p { color: #C9BEEF; }
.section-ink .flow__step p { color: #C9BEEF; }

/* The pledge card, when a pledge is written as verse. */
.pledge__verse {
  font-family: var(--display);
  font-size: clamp(1.15rem, 2.6vw, 1.5rem);
  line-height: 1.75;
  color: var(--ink);
  margin: 1.25rem 0;
}
.pledge__warning {
  font-size: .9rem;
  color: var(--muted);
  font-style: italic;
  margin: 0;
}

/* --------------------------------------------------------------------------
   Process flow with photographs.

   When each step has a picture, the row of images carries the sequence on
   its own, so the connecting line is dropped and the step number becomes a
   badge on the image instead. Keeping both would be two devices doing one
   job, and the line would have to be positioned against an image whose
   height changes with the column width.
   -------------------------------------------------------------------------- */

.flow--media .flow__step { text-align: left; }

.flow--media .flow__step::after { content: none; }

.flow--media .flow__step::before {
  position: absolute;
  top: .75rem;
  left: .75rem;
  margin: 0;
  z-index: 2;
  width: 2.75rem;
  height: 2.75rem;
  font-size: 1.1rem;
  border: 3px solid var(--card);
}

.flow__media {
  display: block;
  margin: 0 0 1rem;
  border-radius: var(--radius);
  overflow: hidden;
  background: var(--surface-2);
  box-shadow: var(--shadow);
}
.flow__media img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
}

@media (max-width: 60rem) {
  .flow--media .flow__step { max-width: 26rem; margin-inline: auto; }
}

/* --------------------------------------------------------------------------
   Series token: the pendant shape.

   The pendant is a physical thing the customer will hold, so it is shown
   as a shape rather than described in words. The shape name travels with
   it as screen-reader text, so nothing is lost when the visual is not
   available.
   -------------------------------------------------------------------------- */

.token { display: inline-flex; align-items: center; gap: .5rem; }

.token__label {
  font-family: var(--mono);
  font-size: .72rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
}

.token__shape {
  color: var(--ink);
  flex: none;
  display: block;
  width: 1.35rem;
  height: 1.35rem;
}


.section--ink .token__shape,
.section-ink .token__shape { color: #fff; }

/* .visually-hidden is defined in section 3. */

/* Age and safety notice on product pages. Deliberately quiet rather than
   alarming — a parent needs to see it, not be frightened by it. */
.safety-note {
  margin-top: 1rem;
  padding: .9rem 1.1rem;
  background: var(--surface-2);
  border-radius: var(--radius-s);
  border-left: 3px solid var(--sun);
}
.safety-note .datarow { margin: 0 0 .35rem; }
.safety-note__warning {
  display: flex;
  gap: .5rem;
  align-items: flex-start;
  margin: 0;
  font-size: .85rem;
  line-height: 1.5;
  color: var(--ink-soft);
}

/* ==========================================================================
   26. FAQ ACCORDION SIZING AND SPACING

   The questions are the headings of the page — they are what someone scans
   to find their answer — so they are set at heading scale rather than as
   slightly-bold body text. Previously they sat at 1.12rem, which read as a
   list rather than a set of topics.

   ONE OWNER OF THE VERTICAL RHYTHM
   --------------------------------
   The base .faq details rule (section 8) pads each row by 1.1rem top and
   bottom, and this section then padded the summary inside it by another
   1.1rem. Both applied, so a closed question carried 4.4rem of padding
   around a single line of text and every row floated in space.

   Rather than reduce both by half — which leaves two rules that have to be
   kept in step forever — the row padding is zeroed here and the summary is
   made the single owner of it. The summary is also the click target, so
   putting the padding there means the whole row is tappable rather than
   just the text inside it.

   The base .faq details padding is left alone, because the homepage FAQ
   section uses .faq without .accordion and still depends on it.
   ========================================================================== */

.faq.accordion { margin-bottom: clamp(2rem, 5vw, 3rem); }

.faq.accordion details { padding-block: 0; }

.faq.accordion summary {
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(1.15rem, 2.2vw, 1.45rem);
  line-height: 1.25;
  letter-spacing: -.01em;
  color: var(--ink);
  padding-block: 1.05rem;
}

/* An open question sits closer to its own answer than to the next question,
   so the two read as one unit instead of three evenly spaced lines. */
.faq.accordion details[open] summary { padding-bottom: .6rem; }

/* The + / − marker was set at 1.5rem when the questions were 1.12rem. Now
   that they run up to 1.45rem it needs to grow with them to stay legible. */
.faq.accordion summary::after {
  font-size: 1.75rem;
  font-weight: 400;
  line-height: 1;
}

.faq.accordion .faq__answer { margin-top: 0; padding-bottom: 1.3rem; }
.faq.accordion .faq__answer p { margin-bottom: .75rem; }
.faq.accordion .faq__answer > :last-child { margin-bottom: 0; }

/* Checklists inside an answer — the care list, for example. On a narrow
   page the generic .prose ul and .prose li rules outrank .included and add
   an indent and per-item margins it does not want, so they are restated
   here at a specificity that wins. */
.faq__answer .included {
  padding-left: 0;
  margin: .9rem 0;
  gap: .5rem;
}
.faq__answer .included li {
  margin-bottom: 0;
  max-width: none;
}

/* The section headings above each group, one step larger again. */
.entry-content > h2 { margin-top: clamp(2.5rem, 5vw, 3.5rem); }
.entry-content > h2:first-child { margin-top: 0; }

/* The two buttons that close the page sit in a single paragraph. Left as
   inline content they only have a word space between them, and nothing at
   all when they wrap onto separate lines on a phone. */
.entry-content p:has(> .btn) {
  display: flex;
  flex-wrap: wrap;
  gap: .75rem;
  max-width: none;
}

/* ==========================================================================
   27. UTILITY LABEL TYPOGRAPHY

   The small uppercase labels — series names under an animal, the Waiting
   list and Best seller flags, breadcrumbs, the announcement bar, footer
   column headings, spec rows — were set in DM Mono. Monospace exists so
   that a lowercase l can be told from a 1 in code; every character is
   given identical width whether it needs it or not. At 11px, uppercase,
   with wide tracking, that even spacing stops words forming the shapes an
   eye recognises at a glance, and the labels have to be read letter by
   letter.

   --mono now points at Manrope, so all twenty places change together and
   the site carries two typefaces rather than three. The DM Mono @font-face
   is left in place and simply goes unused — a browser only downloads a
   font it actually needs, so this costs nothing, and reverting is a
   one-line change to the variable if you want it back.

   Manrope is a proportional face, so it needs different handling to read
   as a label rather than as shrunken body text: heavier weight to hold up
   at small sizes, tighter tracking because proportional letterforms need
   less help separating, and a nudge up in size where the old size was
   only tolerable because monospace runs visually wide.
   ========================================================================== */

.pill,
.adopt-card__species,
.crumbs,
.announce,
.result-count,
.post__meta,
.datarow,
.seal,
.field,
.quote figcaption,
.prose th,
.footer h4 {
  font-weight: 600;
}

/* Series name beneath the animal's name — the most-read label on the site. */
.adopt-card__species {
  font-size: .76rem;
  letter-spacing: .09em;
}

/* Corner flags: Waiting list, Best seller, On sale. */
.pill {
  font-size: .72rem;
  letter-spacing: .08em;
}

.crumbs,
.announce,
.result-count,
.post__meta { letter-spacing: .07em; }

.datarow { font-size: .78rem; }
.datarow dt,
.datarow span { letter-spacing: .05em; }

/* The stamped seal sits on two or three short lines inside a circle, so it
   keeps more tracking than the rest — the letterforms need the air. */
.seal { font-size: .62rem; letter-spacing: .1em; }

.footer h4 { letter-spacing: .12em; }

/* ==========================================================================
   28. HERO PROOF LINE + LABEL CONTRAST

   THE PROOF LINE
   --------------
   "From $19.99 · Ships in 3–5 days · Made in Maryland" are not labels.
   They are three of the strongest reasons to buy, and they were set at
   label size in a dim lilac, reading as fine print.

   They were also failing contrast. The hero is not flat: three radial
   glows sit over --ink, and where the purple one is strongest the
   background lightens to about #5A398D. Against that, #BEB0EC measured
   4.43:1 — under the 4.5:1 minimum for text this size. Not broken enough
   to be obvious, which is why it read as merely dim.

   #DDD3FA measures 6.2:1 at that same worst point and 11.2:1 on plain
   --ink, so it holds up across the whole gradient. The size goes up and
   the tracking comes down: the wide spacing was compensating for DM Mono
   and is no longer needed.

   The diamonds stay dimmer than the words on purpose. Previously they were
   the same colour as the text, so separator and content had equal weight
   and the line read as six items rather than three.

   THE SERIES LABEL
   ----------------
   --muted on the alternating #F3EEFF section background measured 4.71:1 —
   passing, but with nothing to spare, and the first thing to suffer on a
   dim phone screen outdoors. #5F5682 brings that to 5.9:1 and 6.7:1 on
   white, while staying clearly secondary to the near-black animal name
   above it. Deliberately not --ink-soft, which at 9.5:1 would start
   competing with the name.
   ========================================================================== */

.hero__proof {
  font-size: .95rem;
  font-weight: 600;
  color: #DDD3FA;
  letter-spacing: .04em;
  gap: 1.5rem;
}

.hero__proof li > span[aria-hidden="true"] {
  color: #9C86D8;
  font-size: .72em;
}

.adopt-card__species { color: #5F5682; }

/* ==========================================================================
   29. THE ANIMAL STORY ROWS

   "Learns about" / "Adjusting to change" and "PiviPages story" / "Alex the
   Adaptable Axolotl" were built on .datarow, which is a spec-table
   component: it pushes label and value to opposite edges so a reader can
   scan a column of values down the page. That is right for Size and
   Articulation, where nobody reads the label and the value as one thought.

   Here they are one thought. Splitting them across the full width breaks
   the phrase in half and leaves the eye to jump a gap and reassemble it.

   There was a second problem underneath. Both halves are spans, so both
   inherited the label treatment — small, uppercase, muted. The storybook
   title was being shouted in the same voice as the field name above it,
   when it is the most appealing piece of content in the block.

   So: the row flows as a phrase, the label keeps its small uppercase
   treatment, and the value becomes ordinary sentence-case text in full
   ink. Setting the row to block also lets a long value wrap under itself
   naturally instead of being squeezed by a flex track.

   Scoped to .animal-story. The spec table and the cart subtotal still use
   .datarow as designed.
   ========================================================================== */

.animal-story .datarow {
  display: block;
  font-size: .95rem;
  letter-spacing: 0;
  padding: .35rem 0;
  line-height: 1.5;
}

.animal-story .datarow span:first-child {
  font-size: .74rem;
  font-weight: 600;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--muted);
  margin-right: .55rem;
}

.animal-story .datarow span + span {
  font-weight: 600;
  font-size: 1rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink);
}

/* ==========================================================================
   30. WOOCOMMERCE PAGINATION

   The pagination rules in section 12 were written for WordPress core, which
   wraps page links in .pagination > .nav-links. WooCommerce emits something
   different — nav.woocommerce-pagination holding a plain <ul> — so not one
   of those rules matched on the shop or the series archives, and the page
   links fell through as an unstyled bulleted list running down the left
   margin. The stray dots under the grid were literally list markers.

   Rather than duplicate the block, the WooCommerce selectors are given the
   same treatment, so both structures land in the same place.
   ========================================================================== */

.woocommerce-pagination { margin-top: 3rem; }

.woocommerce-pagination ul.page-numbers {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
  justify-content: center;
  align-items: center;
  list-style: none;
  margin: 0;
  padding: 0;
}

.woocommerce-pagination ul.page-numbers li {
  margin: 0;
  list-style: none;
}

.woocommerce-pagination li .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2.6rem;
  min-height: 2.6rem;
  padding: 0 .7rem;
  border: 1px solid var(--line);
  border-radius: var(--r-pill);
  font-weight: 600;
  text-decoration: none;
  color: var(--ink);
}

.woocommerce-pagination li .page-numbers:hover { border-color: var(--ink); }

.woocommerce-pagination li .page-numbers.current {
  background: var(--ink);
  border-color: var(--ink);
  color: #fff;
}

.woocommerce-pagination li .page-numbers.dots {
  border-color: transparent;
  min-width: auto;
}

/* A Coming soon card should not compete with an adoptable one. */
.adopt-card .btn-ghost { border-width: 1px; }

/* ==========================================================================
   31. SHOP HEAD SPACING

   With the duplicated wrapper gone (see pivipets_wc_wrapper_start), the
   tinted page-head band and the product grid finally share an edge. Two
   spacing problems that the misalignment was masking are now visible.

   The band inherits .section's generous padding-block on top of the
   page-head padding it already has, leaving a pool of empty tint under the
   filter pills. And .section on the grid below adds its own top padding to
   that, so roughly 110px of nothing sat between the pills and the sort
   dropdown.

   The band keeps comfortable padding above its heading and much less below
   its filters, and the grid section starts closer underneath.
   ========================================================================== */

.section--pagehead.shop-head { padding-bottom: clamp(1.5rem, 3vw, 2.25rem); }

.section--pagehead.shop-head + .section { padding-top: clamp(1.75rem, 3vw, 2.5rem); }

/* ==========================================================================
   FORM PLUGINS

   1.3.44 — the contact form ships with its own stylesheet: square corners,
   a bright blue submit button and its own label sizing, none of which match
   the site. These rules bring it onto the theme's tokens without touching
   the plugin, so a plugin update cannot undo the work and the form keeps
   working exactly as it did.

   Selectors cover the common form plugins rather than just the one in use
   now — the markup differs between them and a wrong guess fails silently,
   so all four are listed. Anything not present simply never matches.
   ========================================================================== */

/* Fields */
.gform_wrapper input[type="text"],
.gform_wrapper input[type="email"],
.gform_wrapper input[type="tel"],
.gform_wrapper input[type="url"],
.gform_wrapper input[type="number"],
.gform_wrapper select,
.gform_wrapper textarea,
.wpforms-container input[type="text"],
.wpforms-container input[type="email"],
.wpforms-container input[type="tel"],
.wpforms-container select,
.wpforms-container textarea,
.wpcf7 input[type="text"],
.wpcf7 input[type="email"],
.wpcf7 input[type="tel"],
.wpcf7 select,
.wpcf7 textarea,
.nf-form-cont input[type="text"],
.nf-form-cont input[type="email"],
.nf-form-cont input[type="tel"],
.nf-form-cont textarea {
  width: 100%;
  box-sizing: border-box;
  padding: .75rem 1rem;
  border: 1px solid var(--line);
  border-radius: var(--radius-s, 14px);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-size: 1rem;
  line-height: 1.4;
  transition: border-color .14s ease, box-shadow .14s ease;
}

.gform_wrapper textarea,
.wpforms-container textarea,
.wpcf7 textarea,
.nf-form-cont textarea {
  min-height: 9rem;
  resize: vertical;
}

/* Focus ring in the brand accent rather than the browser default. */
.gform_wrapper input:focus,
.gform_wrapper select:focus,
.gform_wrapper textarea:focus,
.wpforms-container input:focus,
.wpforms-container textarea:focus,
.wpcf7 input:focus,
.wpcf7 textarea:focus,
.nf-form-cont input:focus,
.nf-form-cont textarea:focus {
  outline: none;
  border-color: var(--glow);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--glow) 25%, transparent);
}

/* Labels */
.gform_wrapper .gfield_label,
.wpforms-container .wpforms-field-label,
.wpcf7 label,
.nf-form-cont .nf-field-label label {
  font-weight: 700;
  font-size: .95rem;
  color: var(--ink);
  margin-bottom: .4rem;
  display: block;
}

/* The required marker was shouting in pure red. */
.gform_wrapper .gfield_required,
.gform_wrapper .gfield_required_text,
.wpforms-required-label {
  color: var(--muted);
  font-weight: 600;
  font-size: .85em;
}

/* Submit — the theme's pill button, including the pressed-down hover. */
.gform_wrapper input[type="submit"],
.gform_wrapper button[type="submit"],
.gform_wrapper .gform_button,
.wpforms-container button[type="submit"],
.wpforms-container .wpforms-submit,
.wpcf7 input[type="submit"],
.wpcf7 .wpcf7-submit,
.nf-form-cont input[type="button"] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: .95rem 1.6rem;
  border: 2px solid transparent;
  border-radius: 999px;
  background: var(--sun);
  color: #2A1400;
  font-family: inherit;
  font-weight: 800;
  font-size: 1rem;
  letter-spacing: -.01em;
  cursor: pointer;
  box-shadow: 0 4px 0 var(--btn-shadow);
  transition: transform .14s ease, box-shadow .14s ease, filter .14s ease;
}

.gform_wrapper input[type="submit"]:hover,
.gform_wrapper button[type="submit"]:hover,
.gform_wrapper .gform_button:hover,
.wpforms-container button[type="submit"]:hover,
.wpforms-container .wpforms-submit:hover,
.wpcf7 input[type="submit"]:hover,
.wpcf7 .wpcf7-submit:hover,
.nf-form-cont input[type="button"]:hover {
  transform: translateY(2px);
  box-shadow: 0 2px 0 var(--btn-shadow);
  filter: brightness(1.06);
}

.gform_wrapper input[type="submit"]:active,
.gform_wrapper button[type="submit"]:active,
.wpforms-container button[type="submit"]:active,
.wpcf7 input[type="submit"]:active {
  transform: translateY(4px);
  box-shadow: 0 0 0 var(--btn-shadow);
}

/* Spacing between rows, so the form breathes like the rest of the page. */
.gform_wrapper .gfield,
.wpforms-container .wpforms-field,
.nf-form-cont .nf-field-container {
  margin-bottom: 1.15rem;
}

/* The spam-check widget sits on its own line above the button. */
.gform_wrapper .gform_footer,
.wpforms-container .wpforms-submit-container {
  margin-top: 1.4rem;
}

/* --------------------------------------------------------------------------
   1.3.45 — Gravity Forms, at its own specificity.

   The 1.3.44 rules matched the labels and the required marker but lost the
   fields and the submit button. Gravity Forms 2.5+ ships .gravity-theme and
   styles its controls as .gform_wrapper.gravity-theme input[type=text] —
   two classes plus an attribute — and its stylesheet loads after the theme's,
   so a single-class rule never won. These repeat the same design at matching
   specificity rather than reaching for !important on everything.
   ----------------------------------------------------------------------- */

.gform_wrapper.gravity-theme input[type="text"],
.gform_wrapper.gravity-theme input[type="email"],
.gform_wrapper.gravity-theme input[type="tel"],
.gform_wrapper.gravity-theme input[type="url"],
.gform_wrapper.gravity-theme input[type="number"],
.gform_wrapper.gravity-theme input[type="password"],
.gform_wrapper.gravity-theme select,
.gform_wrapper.gravity-theme textarea {
  padding: .75rem 1rem;
  border: 1px solid var(--line);
  border-radius: var(--radius-s, 14px);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-size: 1rem;
  line-height: 1.4;
  box-sizing: border-box;
  transition: border-color .14s ease, box-shadow .14s ease;
}

.gform_wrapper.gravity-theme textarea {
  min-height: 9rem;
  resize: vertical;
}

.gform_wrapper.gravity-theme input:focus,
.gform_wrapper.gravity-theme select:focus,
.gform_wrapper.gravity-theme textarea:focus {
  outline: none;
  border-color: var(--glow);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--glow) 25%, transparent);
}

.gform_wrapper.gravity-theme .gfield_label {
  font-weight: 700;
  font-size: .95rem;
  color: var(--ink);
  margin-bottom: .4rem;
}

/* Sub-labels under a name field ("First", "Last"). */
.gform_wrapper.gravity-theme .gform_fields .gfield_label + .ginput_container label,
.gform_wrapper.gravity-theme .gform-field-label--type-sub {
  font-size: .82rem;
  color: var(--muted);
  font-weight: 600;
}

/* The submit button, pill-shaped like every other button on the site. */
.gform_wrapper.gravity-theme .gform_footer input[type="submit"],
.gform_wrapper.gravity-theme .gform_footer button[type="submit"],
.gform_wrapper.gravity-theme .gform_page_footer input[type="submit"] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: auto;
  padding: .95rem 1.6rem;
  border: 2px solid transparent;
  border-radius: 999px;
  background: var(--sun);
  color: #2A1400;
  font-family: inherit;
  font-weight: 800;
  font-size: 1rem;
  letter-spacing: -.01em;
  cursor: pointer;
  box-shadow: 0 4px 0 var(--btn-shadow);
  transition: transform .14s ease, box-shadow .14s ease, filter .14s ease;
}

.gform_wrapper.gravity-theme .gform_footer input[type="submit"]:hover,
.gform_wrapper.gravity-theme .gform_footer button[type="submit"]:hover {
  transform: translateY(2px);
  box-shadow: 0 2px 0 var(--btn-shadow);
  filter: brightness(1.06);
}

.gform_wrapper.gravity-theme .gform_footer input[type="submit"]:active,
.gform_wrapper.gravity-theme .gform_footer button[type="submit"]:active {
  transform: translateY(4px);
  box-shadow: 0 0 0 var(--btn-shadow);
}

.gform_wrapper.gravity-theme .gfield { margin-bottom: 1.15rem; }
.gform_wrapper.gravity-theme .gform_footer { margin-top: 1.4rem; }

/* Validation messages in the brand's red-brown rather than pure red. */
.gform_wrapper.gravity-theme .gfield_validation_message,
.gform_wrapper.gravity-theme .validation_message {
  border-radius: var(--radius-s, 14px);
  font-size: .9rem;
}

/* --------------------------------------------------------------------------
   1.3.46 — the submit button, finally.

   1.3.45 matched Gravity Forms' own selector exactly, which is a specificity
   tie — and on a tie the stylesheet that loads last wins, which is theirs.
   Rather than escalate the selector further and have the next plugin update
   move the goalposts again, the visual properties carry !important. Scoped
   to this one button so nothing else on the site inherits the escape hatch.

   The radius is also raised here: at 14px the fields still read as square
   next to the site's rounded cards. */

.gform_wrapper.gravity-theme .gform_footer input[type="submit"],
.gform_wrapper.gravity-theme .gform_footer input.button,
.gform_wrapper.gravity-theme .gform_footer button,
.gform_wrapper.gravity-theme .gform_page_footer input[type="submit"],
.gform_wrapper .gform_footer input[type="submit"],
.gform_wrapper .gform_footer button {
  background: var(--sun) !important;
  background-color: var(--sun) !important;
  background-image: none !important;
  color: #2A1400 !important;
  border: 2px solid transparent !important;
  border-radius: 999px !important;
  padding: .95rem 1.6rem !important;
  font-family: inherit !important;
  font-weight: 800 !important;
  font-size: 1rem !important;
  letter-spacing: -.01em !important;
  text-transform: none !important;
  width: auto !important;
  box-shadow: 0 4px 0 var(--btn-shadow) !important;
  cursor: pointer;
  transition: transform .14s ease, box-shadow .14s ease, filter .14s ease;
}

.gform_wrapper.gravity-theme .gform_footer input[type="submit"]:hover,
.gform_wrapper.gravity-theme .gform_footer button:hover,
.gform_wrapper .gform_footer input[type="submit"]:hover {
  transform: translateY(2px);
  box-shadow: 0 2px 0 var(--btn-shadow) !important;
  filter: brightness(1.06);
}

.gform_wrapper.gravity-theme .gform_footer input[type="submit"]:active,
.gform_wrapper.gravity-theme .gform_footer button:active {
  transform: translateY(4px);
  box-shadow: 0 0 0 var(--btn-shadow) !important;
}

/* Fields: a rounder corner so they sit with the cards beside them. */
.gform_wrapper.gravity-theme input[type="text"],
.gform_wrapper.gravity-theme input[type="email"],
.gform_wrapper.gravity-theme input[type="tel"],
.gform_wrapper.gravity-theme input[type="url"],
.gform_wrapper.gravity-theme input[type="number"],
.gform_wrapper.gravity-theme select,
.gform_wrapper.gravity-theme textarea {
  border-radius: 16px !important;
  border-color: var(--line) !important;
}

/* ==========================================================================
   LITTERS — 1.3.47
   ========================================================================== */

/* Homepage ladder: three rungs, the biggest saving lifted slightly. */
.litter-ladder {
  list-style: none;
  padding: 0;
  margin: 2rem 0 0;
  display: grid;
  gap: 1.1rem;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
}

.litter-rung {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1.6rem 1.4rem 1.4rem;
  box-shadow: var(--shadow-s, 0 2px 10px rgba(40, 20, 80, .06));
  display: flex;
  flex-direction: column;
  gap: .35rem;
}

.litter-rung--best {
  border-color: var(--glow);
  box-shadow: 0 10px 30px rgba(120, 60, 220, .14);
  transform: translateY(-4px);
}

.litter-rung__flag {
  position: absolute;
  top: -.75rem;
  left: 1.4rem;
  background: var(--glow);
  color: #fff;
  font-family: var(--mono);
  font-size: .68rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  padding: .3rem .7rem;
  border-radius: 999px;
}

.litter-rung__label {
  font-family: var(--mono);
  font-size: .74rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
  margin: 0;
}

.litter-rung__saving {
  font-family: var(--display);
  font-size: 2rem;
  font-weight: 700;
  color: var(--ink);
  line-height: 1.1;
  margin: 0;
}

.litter-rung__note {
  font-size: .92rem;
  color: var(--ink-soft);
  margin: 0;
}

/* 1.3.76 — a pet from a different series per thumbnail, overlapped so the
   row reads as a group rather than a list. The ring around each one is the
   card's own background, which is what keeps the overlap legible. */
/* Always three columns, however many pets the rung shows. Sized by flex
   instead, two pets came out visibly larger than three on the rung beside
   them, because each row divided its own width. Three fixed columns give
   every pet on every rung the same size, and the pair simply leaves the
   last column empty. Capping the row rather than the image keeps the
   overlap intact on a wide card, where a per-image cap would have left
   them sitting apart. */
.litter-rung__pets {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  align-items: center;
  margin: auto 0;          /* centres the row in whatever slack the tallest rung creates */
  padding: .9rem 0;
  max-width: 28rem;        /* 1.3.78 — a third larger; the pets were reading small in a tall rung */
}

.litter-rung__pets img {
  width: 100%;
  height: auto;
  aspect-ratio: 1;
  margin-left: -.85rem;
  display: block;
  border-radius: 50%;
  object-fit: cover;
  background: var(--surface);
  border: 3px solid var(--surface);
  box-shadow: 0 3px 10px rgba(40, 20, 80, .14);
}

.litter-rung__pets img:first-child { margin-left: 0; }

/* 1.3.76 — the rungs are grid items, so they all take the height of the
   tallest. "A full litter" is tall because it lists the series, which left
   a pocket of blank space under the price on the other two and read as a
   missing photo. Pinning the price to the bottom puts the slack above it
   and lines all three prices up on one baseline. */
.litter-rung__example {
  margin: auto 0 0;
  padding-top: .6rem;
  border-top: 1px dashed var(--line);
  font-size: .9rem;
  color: var(--ink);
}

.litter-rung__example s { color: var(--muted); margin-left: .25rem; }

.litter-ladder__cta {
  margin: 2rem 0 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 1rem 1.4rem;
}

.litter-ladder__small { font-size: .88rem; color: var(--muted); }

/* Cart nudge: the line that turns two pets into three. */
.litter-nudge {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: .6rem 1rem;
  margin: 0 0 1.5rem;
  padding: 1rem 1.2rem;
  background: color-mix(in srgb, var(--glow) 9%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--glow) 35%, transparent);
  border-radius: var(--radius-s, 14px);
}

.litter-nudge p {
  margin: 0;
  flex: 1 1 16rem;
  font-weight: 600;
  color: var(--ink);
}

.litter-nudge__mark { color: var(--glow); }

.litter-nudge__link { font-weight: 700; white-space: nowrap; }

/* Series page button and its saving line. */
.series-litter {
  margin-top: 1.4rem;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .6rem 1.1rem;
}

.series-litter__saving {
  margin: 0;
  font-weight: 600;
  color: var(--ink-soft);
}

.series-litter__saving s { color: var(--muted); font-weight: 400; }

/* 1.3.49 — series picker on the full-litter rung. Chips rather than a plain
   list, so each series reads as something to tap. */
.litter-rung__pick {
  margin: .9rem 0 .45rem;
  font-family: var(--mono);
  font-size: .7rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
}

.litter-rung__series {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
}

.litter-rung__series a {
  display: inline-block;
  padding: .38rem .8rem;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  color: var(--ink);
  font-size: .82rem;
  font-weight: 600;
  text-decoration: none;
  line-height: 1.3;
  transition: border-color .14s ease, background .14s ease, color .14s ease;
}

.litter-rung__series a:hover,
.litter-rung__series a:focus-visible {
  border-color: var(--glow);
  background: color-mix(in srgb, var(--glow) 10%, var(--surface));
  color: var(--ink);
}

/* FAQ page built from the FAQs list (1.3.73) ------------------------------
   The groups give the page a spine: a heading, an optional line of context,
   then its questions. Spacing does the separating rather than rules, so a
   page of five groups does not turn into a page of lines. */
.faq-page__intro { margin-bottom: clamp(2rem, 5vw, 3rem); }

.faq-page__group { margin-bottom: clamp(2.5rem, 6vw, 4rem); }
.faq-page__group:last-of-type { margin-bottom: 0; }

.faq-page__heading {
  font-size: clamp(1.5rem, 3vw, 2.1rem);
  margin-bottom: .75rem;
  padding-bottom: .5rem;
  border-bottom: 2px solid var(--line);
}

.faq-page__group .lede { margin-bottom: 1rem; }

.faq-page__closing {
  margin-top: clamp(2.5rem, 6vw, 4rem);
  padding-top: clamp(1.5rem, 4vw, 2.5rem);
  border-top: 1px solid var(--line);
}

.faq-page__closing .faq-page__heading { border-bottom: 0; padding-bottom: 0; }
.faq-page__closing .lede { margin-bottom: 1.25rem; }
