/* ============================================================
   Olea & Hound
   Brand: Quiet European atelier. Ink on parchment. Olive accent.
   Inspirations: World of Interiors, Cereal magazine, Aesop, Apartamento.
   ============================================================ */

/* ---------- View Transitions API (cross-page) ---------- */
@view-transition { navigation: auto; }
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 320ms;
  animation-timing-function: cubic-bezier(0.22, 0.61, 0.36, 1);
}

:root {
  /* Ink (warm near-black, brown undertone — never pure #000) */
  --ink: #1A1814;
  --ink-2: #2B2823;
  --ink-3: #4A453D;

  /* Paper (warm parchment) */
  --paper: #F2EDE2;
  --paper-2: #E8E1D0;
  --paper-3: #DDD4BD;

  /* Signature olive — used sparingly, never decorative.
     --olive darkened from #6E7A4F (≈3.6:1) → #5A6740 (≈4.6:1) for AA text usage. */
  --olive: #5A6740;
  --olive-dark: #3F4828;
  --olive-pale: #C7CBB3;

  /* Sparingly: warm clay for memorial / refund accents.
     --clay darkened from #A85A3C (≈3.9:1) → #8E4A30 (≈4.7:1) for AA text usage. */
  --clay: #8E4A30;
  --clay-pale: #E5C4B5;

  /* Muted text. Darkened from #7C7666 (≈3.7:1) → #5F5A4D (≈4.7:1) for AA. */
  --muted: #5F5A4D;
  /* --muted-2 was #9A9484 (≈2.4:1, badly failing AA). Reserve for non-text decoration only. */
  --muted-2: #7C7666;

  --line: rgba(26, 24, 20, 0.10);
  --line-strong: rgba(26, 24, 20, 0.22);

  --shadow-xs: 0 1px 2px rgba(26, 24, 20, 0.04);
  --shadow-sm: 0 2px 8px rgba(26, 24, 20, 0.06), 0 1px 2px rgba(26, 24, 20, 0.04);
  --shadow-md: 0 8px 30px rgba(26, 24, 20, 0.10), 0 2px 6px rgba(26, 24, 20, 0.06);
  --shadow-lg: 0 30px 70px rgba(26, 24, 20, 0.16), 0 6px 14px rgba(26, 24, 20, 0.08);

  --radius-xs: 2px;
  --radius: 4px;
  --radius-lg: 10px;

  --pad: clamp(20px, 5vw, 48px);
  --col: min(1180px, 100% - 2 * var(--pad));

  /* Fraunces optical-size axis for display sizes — Apple-grade type feel */
  --serif: "Fraunces", "Times New Roman", Georgia, serif;
  --sans: "Inter", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
}

/* ---------- Reset ---------- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html {
  scroll-behavior: smooth;
  /* P1 A9 (WCAG 2.4.11 Focus Not Obscured): when the sticky CTA is visible on
     mobile (height ~72px + safe-area), pad the bottom of every scroll-into-view
     so focused inputs aren't sat underneath it. */
  scroll-padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px));
  scroll-padding-top: 72px;
  /* v14 bugfix: lock horizontal scroll on the document. Some decorative blooms
     (radial gradients, glow halos, hero blooms) overshoot the viewport on small
     screens and let the page pull side-to-side. `overflow-x: clip` keeps the
     bug suppressed without breaking `position: sticky` (unlike `hidden`). */
  overflow-x: clip;
  max-width: 100vw;
}
body { overflow-x: clip; max-width: 100vw; }
body {
  font-family: var(--sans);
  font-size: 16px;
  line-height: 1.55;
  color: var(--ink);
  background: var(--paper);
  /* Subtle paper grain — looks gallery-printed, not screen-printed */
  background-image:
    radial-gradient(ellipse at top, rgba(255, 251, 240, 0.4), transparent 60%),
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.1 0 0 0 0 0.09 0 0 0 0 0.08 0 0 0 0.03 0'/></filter><rect width='240' height='240' filter='url(%23n)'/></svg>");
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-feature-settings: "kern" 1, "liga" 1, "calt" 1, "ss01" 1;
}
img { max-width: 100%; display: block; }
button { font: inherit; cursor: pointer; background: none; border: none; color: inherit; }
a { color: var(--ink); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 2px; text-decoration-color: var(--line-strong); transition: text-decoration-color 160ms ease; }
a:hover { text-decoration-color: var(--ink); }
input { font: inherit; color: inherit; }

/* ============================================================
   DEMO BANNER
   ============================================================ */
.demo-banner {
  background: var(--ink);
  color: var(--paper);
  text-align: center;
  font-size: 11px;
  letter-spacing: 0.06em;
  padding: 9px 16px;
  line-height: 1.4;
  font-weight: 400;
}
.demo-banner strong {
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  margin-right: 8px;
  color: var(--olive-pale);
}

/* ============================================================
   LAYOUT PRIMITIVES
   ============================================================ */
main#app { min-height: 100dvh; display: flex; flex-direction: column; }
.stage {
  display: block;
  padding: clamp(32px, 5vw, 56px) var(--pad);
  width: var(--col);
  margin: 0 auto;
  flex: 1;
}
.stage.hidden { display: none; }

/* Stage entrance animation */
.stage:not(.hidden) { animation: stageIn 480ms cubic-bezier(0.22, 0.61, 0.36, 1); }
@keyframes stageIn {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ============================================================
   TOPBAR / WORDMARK
   ============================================================ */
.topbar {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  padding: 4px 0 28px;
  border-bottom: 1px solid var(--line);
  margin-bottom: clamp(40px, 6vw, 72px);
}

.wordmark {
  font-family: var(--serif);
  font-weight: 400;
  font-style: italic;
  font-size: clamp(20px, 2.2vw, 26px);
  letter-spacing: -0.005em;
  color: var(--ink);
  font-variation-settings: "opsz" 144;
  white-space: nowrap;
}
.wordmark a { text-decoration: none; }
.wordmark .amp { font-family: var(--serif); font-style: italic; color: var(--olive); padding: 0 2px; }

.trust {
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 500;
  color: var(--muted);
  letter-spacing: 0.18em;
  text-transform: uppercase;
}

/* ============================================================
   TYPOGRAPHY
   ============================================================ */
.display {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(44px, 7vw, 88px);
  line-height: 0.98;
  letter-spacing: -0.025em;
  font-variation-settings: "opsz" 144, "SOFT" 50;
  color: var(--ink);
}
.display em { font-style: italic; color: var(--olive-dark); font-weight: 400; }

.display-sm {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(30px, 4.5vw, 48px);
  line-height: 1.05;
  letter-spacing: -0.02em;
  font-variation-settings: "opsz" 96;
}
.display-sm em { font-style: italic; color: var(--olive-dark); }

.eyebrow {
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--olive-dark);
  margin-bottom: 24px;
}

.lede {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(17px, 1.7vw, 21px);
  line-height: 1.5;
  letter-spacing: -0.005em;
  color: var(--ink-3);
  max-width: 50ch;
  font-variation-settings: "opsz" 48, "SOFT" 100;
}
.lede em { font-style: italic; color: var(--ink-2); }

.lede-sm { font-size: 16px; color: var(--muted); line-height: 1.6; }

/* ============================================================
   STAGE 1 — HERO
   ============================================================ */
.hero {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr);
  gap: clamp(32px, 5vw, 72px);
  align-items: center;
  padding-bottom: clamp(48px, 6vw, 88px);
  min-height: clamp(560px, 72vh, 760px);
}
@media (max-width: 920px) {
  .hero {
    grid-template-columns: 1fr;
    min-height: 0;
    gap: clamp(28px, 6vw, 40px);
  }
}

.hero-text {
  display: grid;
  gap: clamp(20px, 2.4vw, 28px);
  align-content: center;
  min-width: 0;
}

/* v14: cap the hero headline so it never wraps past 2 lines on desktop.
   The site-wide .display class can keep its huge type for marketing pages;
   the funnel hero needs space for the visual to share centre stage. */
.hero-text .display {
  font-size: clamp(38px, 5.2vw, 64px);
  line-height: 1.0;
}
@media (max-width: 600px) {
  .hero-text .display { font-size: clamp(34px, 9vw, 44px); }
}

.hero-image {
  position: relative;
  align-self: center;
  min-width: 0;
}

/* v14: the content that used to bloat the hero now sits in its own row below it. */
.hero-below-fold {
  display: grid;
  gap: clamp(24px, 3vw, 36px);
  padding-bottom: clamp(48px, 6vw, 80px);
}
@media (max-width: 920px) { .hero-below-fold { gap: 24px; padding-bottom: 40px; } }

/* ============================================================
   v14 — Interactive style cycler in the hero
   ============================================================ */
.hero-showcase {
  position: relative;
  display: grid;
  gap: clamp(14px, 1.6vw, 20px);
  /* Frame the showcase in a soft warm wash that anchors it in the page. */
  padding: clamp(14px, 1.6vw, 20px);
  background:
    radial-gradient(ellipse at 70% 30%, rgba(199, 203, 179, 0.35), transparent 70%),
    rgba(255, 252, 244, 0.55);
  border-radius: 18px;
  border: 1px solid var(--line);
  box-shadow: var(--shadow-md);
}

.hero-showcase-stage {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: clamp(8px, 1.2vw, 16px);
  min-width: 0;
}

.hero-showcase-photo,
.hero-showcase-portrait {
  position: relative;
  margin: 0;
  aspect-ratio: 1 / 1;
  width: 100%;
  border-radius: 12px;
  overflow: hidden;
  background: var(--paper-2);
}

.hero-showcase-photo img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}

.hero-showcase-portrait {
  /* Single-image showcase. JS swaps the src attribute and toggles a brief
     `.changing` class that fades and re-fades the img. Replaces the earlier
     six-img stack which suffered an intermittent opacity-stuck bug. */
  background: var(--paper-2);
}
.hero-showcase-portrait img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: opacity 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.hero-showcase-portrait.changing img {
  opacity: 0;
}

.hero-showcase-photo figcaption,
.hero-showcase-portrait figcaption {
  position: absolute;
  top: 12px; left: 12px;
  font-family: var(--sans);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  padding: 6px 10px;
  background: rgba(26, 24, 20, 0.82);
  color: var(--paper);
  border-radius: 999px;
  backdrop-filter: blur(6px);
  pointer-events: none;
}
.hero-showcase-portrait figcaption {
  left: auto; right: 12px;
  background: rgba(110, 122, 79, 0.92);
}

.hero-showcase-arrow {
  font-family: var(--serif);
  font-size: clamp(22px, 2.4vw, 32px);
  color: var(--olive-dark);
  font-style: italic;
  user-select: none;
  text-align: center;
  width: clamp(20px, 2.4vw, 30px);
}

.hero-chip-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 6px;
}
.hero-chip {
  font-family: var(--sans);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.02em;
  padding: 8px 14px;
  border-radius: 999px;
  background: transparent;
  color: var(--ink-3);
  border: 1px solid var(--line-strong);
  cursor: pointer;
  transition: background 180ms ease, color 180ms ease, border-color 180ms ease, transform 180ms ease;
  white-space: nowrap;
}
.hero-chip:hover {
  border-color: var(--ink);
  color: var(--ink);
  transform: translateY(-1px);
}
.hero-chip.active {
  background: var(--ink);
  color: var(--paper);
  border-color: var(--ink);
}
.hero-chip:focus-visible {
  outline: 2px solid var(--olive);
  outline-offset: 2px;
}

.hero-showcase-hint {
  text-align: center;
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--muted);
  margin: 0;
}

/* Mobile: chips fit one row, arrow drops to a vertical divider, portraits stack
   slightly less aggressive so both stay visible. */
@media (max-width: 720px) {
  .hero-showcase-stage { gap: 6px; }
  .hero-showcase-photo figcaption,
  .hero-showcase-portrait figcaption {
    font-size: 9px;
    padding: 4px 8px;
    top: 8px;
    left: 8px;
  }
  .hero-showcase-portrait figcaption { left: auto; right: 8px; }
  .hero-chip { font-size: 11px; padding: 7px 11px; }
}
@media (prefers-reduced-motion: reduce) {
  .hero-showcase-portrait img {
    transition: opacity 200ms linear;
    transform: none;
    filter: none;
  }
}
.hero-image::before {
  /* Soft warm wash behind the framed image */
  content: "";
  position: absolute;
  inset: -8% -6% -10% -4%;
  background: radial-gradient(ellipse at 60% 40%, rgba(199, 203, 179, 0.5), transparent 60%);
  z-index: 0;
  border-radius: 50%;
  filter: blur(20px);
}
.hero-frame {
  position: relative;
  z-index: 1;
  background: var(--ink);
  padding: clamp(14px, 1.8vw, 22px);
  box-shadow: var(--shadow-lg);
  border-radius: 2px;
  max-width: 480px;
  margin-left: auto;
  transform: rotate(-1.2deg);
  transition: transform 600ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.hero-frame:hover { transform: rotate(0deg) translateY(-2px); }
.hero-frame-mat {
  background: var(--paper);
  padding: clamp(18px, 2.4vw, 32px);
}
.hero-frame-mat img {
  aspect-ratio: 3 / 4;
  object-fit: cover;
  width: 100%;
  filter: sepia(0.08) saturate(0.9) contrast(1.04);
}
.hero-caption {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--muted);
  text-align: center;
  margin-top: 18px;
  position: relative;
  z-index: 1;
}
@media (max-width: 920px) {
  .hero-image { order: -1; max-width: 360px; margin: 0 auto; }
}

/* ============================================================
   UPLOADER — the conversion bottleneck
   ============================================================ */
.uploader {
  display: block;
  background: #fff;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-lg);
  padding: clamp(22px, 3.2vw, 32px);
  cursor: pointer;
  transition: all 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
  box-shadow: var(--shadow-sm);
  position: relative;
  overflow: hidden;
  /* When .uploader is an <a> (memorial page), strip default link styling. */
  text-decoration: none;
  color: inherit;
}
.uploader::after {
  /* Olive corner mark — atelier signature */
  content: "";
  position: absolute;
  top: 14px; right: 14px;
  width: 8px; height: 8px;
  border-top: 1.5px solid var(--olive);
  border-right: 1.5px solid var(--olive);
}
.uploader:hover,
.uploader:focus-within {
  border-color: var(--ink);
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}
.uploader.drag { border-color: var(--olive); background: #fdfbf5; }

.uploader-inner {
  display: flex;
  align-items: center;
  gap: 22px;
}
.uploader svg { color: var(--ink); flex-shrink: 0; }
.uploader-text strong {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(20px, 2vw, 24px);
  letter-spacing: -0.012em;
  line-height: 1.2;
  display: block;
  margin-bottom: 4px;
  color: var(--ink);
}
.uploader-text span { font-size: 14px; color: var(--muted); }

/* Reassurance row */
.reassurance {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 24px;
  font-size: 13px;
  color: var(--muted);
  align-items: center;
}
.reassurance span { display: inline-flex; align-items: center; gap: 6px; }
.reassurance strong { color: var(--ink); font-weight: 600; }
.reassurance span::before {
  content: "";
  width: 4px; height: 4px;
  background: var(--olive);
  border-radius: 50%;
  display: inline-block;
}

/* ============================================================
   PHOTO TIPS
   ============================================================ */
.photo-tips {
  background: #fff;
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-xs);
}
.photo-tips summary {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 18px 24px;
  cursor: pointer;
  list-style: none;
  user-select: none;
}
.photo-tips summary::-webkit-details-marker { display: none; }
.tips-label {
  font-family: var(--serif);
  font-weight: 400;
  font-style: italic;
  font-size: 17px;
  letter-spacing: -0.005em;
}
.tips-toggle {
  font-family: var(--serif);
  font-size: 22px;
  color: var(--olive);
  transition: transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
  line-height: 1;
}
.photo-tips[open] .tips-toggle { transform: rotate(45deg); }

.tips-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  border-top: 1px solid var(--line);
}
.tip {
  padding: 22px 24px;
  border-right: 1px solid var(--line);
  display: grid;
  gap: 8px;
  align-content: start;
}
.tip:last-child { border-right: 0; }
.tip-num {
  font-family: var(--serif);
  font-style: italic;
  font-size: 14px;
  color: var(--olive);
  letter-spacing: 0.02em;
}
.tip h3 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 17px;
  letter-spacing: -0.01em;
  color: var(--ink);
  line-height: 1.2;
}
.tip p { font-size: 13px; line-height: 1.55; color: var(--muted); }

.tip-dont {
  grid-column: 1 / -1;
  border-right: 0;
  border-top: 1px solid var(--line);
  background: var(--paper-2);
  padding: 20px 24px;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 16px;
  align-items: center;
}
.tip-dont .tip-num { color: var(--clay); }
.tip-dont p { color: var(--ink-2); }
.tip-dont .dont-label {
  font-family: var(--serif);
  font-style: italic;
  font-size: 15px;
  color: var(--clay);
  white-space: nowrap;
}

@media (max-width: 720px) {
  .tips-grid { grid-template-columns: 1fr; }
  .tip { border-right: 0; border-bottom: 1px solid var(--line); }
  .tip-dont { grid-template-columns: 1fr; }
}

/* ============================================================
   EXAMPLES STRIP
   ============================================================ */
.examples {
  padding: clamp(40px, 6vw, 72px) 0 0;
  border-top: 1px solid var(--line);
  margin-top: clamp(40px, 6vw, 64px);
}
.examples-heading {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 28px;
  gap: 16px;
  flex-wrap: wrap;
}
.examples-heading h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2.6vw, 28px);
  letter-spacing: -0.015em;
}
.examples-heading h2 em { font-style: italic; color: var(--olive-dark); }
.examples-heading .note { font-size: 13px; color: var(--muted); }

.example-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: clamp(10px, 1.4vw, 18px);
}
.example-grid figure { display: flex; flex-direction: column; gap: 10px; }
.example-grid img {
  aspect-ratio: 3 / 4;
  object-fit: cover;
  background: var(--paper-2);
  filter: sepia(0.06) saturate(0.95);
  transition: transform 600ms cubic-bezier(0.22, 0.61, 0.36, 1), filter 320ms ease;
}
.example-grid figure:hover img { transform: translateY(-3px); filter: sepia(0) saturate(1); }
.example-grid figcaption {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--muted);
  text-align: center;
}
@media (max-width: 720px) {
  .example-grid { grid-template-columns: repeat(3, 1fr); }
}

/* ============================================================
   STAGE 2 — GENERATING
   ============================================================ */
.generating {
  display: grid;
  gap: 28px;
  justify-items: center;
  text-align: center;
  padding: clamp(48px, 8vw, 96px) 0;
  position: relative;
}
.generating::before {
  /* Atmospheric warm wash */
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at center, rgba(199, 203, 179, 0.25), transparent 60%);
  pointer-events: none;
}
.thumb-wrap {
  position: relative;
  width: 132px;
  height: 132px;
  border-radius: 50%;
  overflow: hidden;
  box-shadow: var(--shadow-md);
  background: var(--paper-2);
  z-index: 1;
}
.thumb-wrap::after {
  content: "";
  position: absolute;
  inset: 0;
  border: 1px solid var(--line);
  border-radius: 50%;
  box-shadow: inset 0 0 30px rgba(26, 24, 20, 0.08);
}
.thumb-wrap img { width: 100%; height: 100%; object-fit: cover; filter: sepia(0.08); }

.progress {
  width: min(420px, 100%);
  height: 2px;
  background: var(--paper-3);
  overflow: hidden;
  z-index: 1;
}
.progress-bar {
  height: 100%;
  width: 0;
  background: var(--olive);
  transition: width 600ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.progress-list {
  list-style: none;
  display: grid;
  gap: 10px;
  font-size: 14px;
  color: var(--muted);
  z-index: 1;
  font-family: var(--serif);
  font-style: italic;
}
.progress-list li { transition: color 320ms ease; }
.progress-list li.done { color: var(--ink); }
.progress-list li.done::before { content: "—  "; color: var(--olive); font-style: normal; }
.progress-list li:not(.done)::before { content: "·  "; color: var(--muted-2); }

/* ============================================================
   STAGE 2 v2 — gamified reveal during generation
   Build anticipation, reward every preview with a moment.
   ============================================================ */

.generating-v2 {
  display: grid;
  gap: clamp(18px, 2.4vw, 28px);
  justify-items: center;
  text-align: center;
  padding: clamp(36px, 6vw, 72px) 0;
  max-width: 640px;
  margin: 0 auto;
  width: 100%;
}

.paint-status-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
  flex-wrap: wrap;
}
.paint-status-row em {
  font-style: italic;
  color: var(--muted-2);
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
  font-size: 13px;
  font-family: var(--serif);
}
.paint-counter strong, .paint-counter span:not(em) {
  color: var(--olive-dark);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}
#paint-counter-num {
  font-family: var(--serif);
  font-size: 22px;
  font-style: italic;
  font-weight: 400;
  letter-spacing: -0.02em;
  color: var(--olive-dark);
  display: inline-block;
  min-width: 18px;
}
.paint-counter::after {
  content: "—";
  margin: 0 14px;
  color: var(--line-strong);
  font-family: var(--serif);
}
.paint-now em { color: var(--olive-dark); }
.paint-now span:not(em) {
  color: var(--ink);
  text-transform: none;
  letter-spacing: 0;
  font-family: var(--serif);
  font-size: 16px;
  font-style: italic;
}

/* The canvas — pet thumb starts here, previews drop in over it */
.paint-canvas {
  position: relative;
  width: min(360px, 78vw);
  aspect-ratio: 3 / 4;
  background: var(--paper);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
  margin-top: 6px;
}
.paint-canvas-img,
.paint-canvas-preview {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: opacity 480ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.paint-canvas-img { opacity: 1; filter: grayscale(0.7) brightness(1.05); }
.paint-canvas.has-preview .paint-canvas-img { opacity: 0; }
.paint-canvas-preview { opacity: 0; }
.paint-canvas-preview.show { opacity: 1; animation: paintIn 800ms cubic-bezier(0.22, 0.61, 0.36, 1); }
@keyframes paintIn {
  0%   { opacity: 0; transform: scale(1.08); filter: blur(8px); }
  60%  { opacity: 1; filter: blur(0); }
  100% { opacity: 1; transform: scale(1); }
}

/* Subtle painter's frame corners — implies the canvas is a frame in formation */
.paint-frame-corner {
  position: absolute;
  width: 22px;
  height: 22px;
  border: 1.5px solid var(--olive);
  pointer-events: none;
  opacity: 0.7;
}
.paint-frame-corner.top-left { top: 8px; left: 8px; border-right: 0; border-bottom: 0; }
.paint-frame-corner.top-right { top: 8px; right: 8px; border-left: 0; border-bottom: 0; }
.paint-frame-corner.bottom-left { bottom: 8px; left: 8px; border-right: 0; border-top: 0; }
.paint-frame-corner.bottom-right { bottom: 8px; right: 8px; border-left: 0; border-top: 0; }

/* "Your photo" persistent reference thumbnail (top-left of canvas) */
.paint-canvas-ref {
  position: absolute;
  top: 14px;
  left: 14px;
  width: 64px;
  display: grid;
  gap: 4px;
  z-index: 4;
  pointer-events: none;
  filter: drop-shadow(0 4px 12px rgba(26, 24, 20, 0.18));
}
.paint-canvas-ref img {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  object-fit: cover;
  border: 2px solid var(--paper);
  background: var(--paper-2);
}
.paint-canvas-ref-label {
  font-family: var(--sans);
  font-size: 9px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--paper);
  background: var(--ink);
  text-align: center;
  padding: 3px 6px;
  border-radius: 2px;
  font-weight: 600;
  white-space: nowrap;
}
/* The "Your photo" thumb is visible from the moment the user lands on the
   generating stage — they need to see their pet right away as confirmation,
   not wait 20-30s for the first portrait to drop. */

/* "Demo — sample portraits" badge at bottom of canvas (hidden in live mode) */
.paint-canvas-demo-badge {
  position: absolute;
  bottom: 14px;
  left: 50%;
  transform: translateX(-50%);
  background: rgba(26, 24, 20, 0.85);
  color: var(--olive-pale);
  padding: 5px 12px;
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  font-weight: 600;
  z-index: 4;
  pointer-events: none;
  border-radius: 2px;
  backdrop-filter: blur(4px);
}
.paint-canvas.live-mode .paint-canvas-demo-badge { display: none; }
.paint-canvas:not(.has-preview) .paint-canvas-demo-badge { display: none; }

/* P0-4: hide demo banner entirely in live mode (?live=1). The class is set
   on <html> by an inline head script before paint, so no flash. */
html.live-mode .demo-banner { display: none !important; }

/* ---------- GDPR consent banner + dialog (P0-3) ---------- */
.oh-consent-banner {
  position: fixed;
  bottom: 18px;
  left: 18px;
  right: 18px;
  max-width: 720px;
  margin: 0 auto;
  background: var(--ink);
  color: var(--paper);
  border-radius: var(--radius-lg);
  padding: 18px 22px;
  box-shadow: var(--shadow-lg);
  font-size: 13px;
  line-height: 1.55;
  z-index: 9999;
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 240ms ease, transform 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.oh-consent-banner.open { opacity: 1; transform: translateY(0); }
.oh-consent-banner-inner { display: grid; gap: 14px; }
.oh-consent-banner p { margin: 0; color: rgba(242, 237, 226, 0.85); }
.oh-consent-link { color: var(--paper); text-decoration-color: rgba(242, 237, 226, 0.5); }
.oh-consent-link:hover { text-decoration-color: var(--paper); }
.oh-consent-actions {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.oh-consent-btn {
  font-family: var(--sans);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  padding: 10px 18px;
  border-radius: var(--radius);
  cursor: pointer;
  transition: background 160ms ease, color 160ms ease, border-color 160ms ease;
  border: 1px solid transparent;
}
.oh-consent-btn.ghost {
  background: transparent;
  color: rgba(242, 237, 226, 0.8);
  border-color: rgba(242, 237, 226, 0.25);
}
.oh-consent-btn.ghost:hover { color: var(--paper); border-color: var(--paper); }
.oh-consent-btn.primary {
  background: var(--paper);
  color: var(--ink);
}
.oh-consent-btn.primary:hover { background: #fff; }
.oh-consent-btn:focus-visible {
  outline: 2px solid var(--olive-pale);
  outline-offset: 2px;
}
@media (max-width: 600px) {
  .oh-consent-banner { left: 12px; right: 12px; bottom: 12px; padding: 14px 16px; }
  .oh-consent-actions { justify-content: stretch; }
  .oh-consent-actions .oh-consent-btn { flex: 1 1 auto; min-width: 0; }
}

.oh-consent-dialog-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(26, 24, 20, 0.45);
  backdrop-filter: blur(6px);
  display: grid;
  place-items: center;
  padding: 24px;
  z-index: 10000;
  opacity: 0;
  transition: opacity 200ms ease;
}
.oh-consent-dialog-backdrop.open { opacity: 1; }
.oh-consent-dialog {
  background: var(--paper);
  color: var(--ink);
  max-width: 520px;
  width: 100%;
  border-radius: var(--radius-lg);
  padding: 32px;
  position: relative;
  box-shadow: var(--shadow-lg);
  max-height: calc(100vh - 48px);
  overflow-y: auto;
}
.oh-consent-dialog h3 { font-family: var(--serif); font-size: 22px; margin: 0 0 10px; }
.oh-consent-dialog > p { font-size: 14px; color: var(--ink-3); margin: 0 0 18px; line-height: 1.6; }
.oh-consent-dialog-close {
  position: absolute;
  top: 14px; right: 14px;
  width: 32px; height: 32px;
  font-size: 20px;
  border-radius: 50%;
  color: var(--ink-3);
}
.oh-consent-dialog-close:hover { background: var(--paper-2); color: var(--ink); }
.oh-consent-category {
  padding: 14px 0;
  border-top: 1px solid var(--line);
}
.oh-consent-category:last-of-type { border-bottom: 1px solid var(--line); margin-bottom: 18px; }
.oh-consent-category label {
  display: flex;
  gap: 10px;
  align-items: center;
  font-size: 14px;
  cursor: pointer;
}
.oh-consent-category label input[type="checkbox"] {
  width: 18px; height: 18px;
  accent-color: var(--olive);
  cursor: pointer;
}
.oh-consent-category label input[type="checkbox"]:disabled { cursor: not-allowed; opacity: 0.5; }
.oh-consent-category p { margin: 6px 0 0 28px; font-size: 12px; color: var(--ink-3); line-height: 1.55; }
.oh-consent-dialog-actions {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.oh-consent-dialog-actions .oh-consent-btn.ghost {
  color: var(--ink);
  border-color: var(--line-strong);
  background: transparent;
}
.oh-consent-dialog-actions .oh-consent-btn.ghost:hover { background: var(--paper-2); border-color: var(--ink); }
.oh-consent-dialog-actions .oh-consent-btn.primary {
  background: var(--ink);
  color: var(--paper);
}
.oh-consent-dialog-actions .oh-consent-btn.primary:hover { background: var(--ink-2); }
/* Hide the ref-thumb entirely until its img has actually loaded (avoids the
   native broken-image icon flash). JS flips [data-ready] on img.onload. */
.paint-canvas-ref:not([data-ready]) { display: none; }
.paint-canvas-ref[data-ready] {
  animation: refThumbIn 480ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
@keyframes refThumbIn {
  0%   { opacity: 0; transform: scale(0.85); }
  100% { opacity: 1; transform: scale(1); }
}

@media (max-width: 600px) {
  .paint-canvas-ref { width: 48px; top: 10px; left: 10px; }
  .paint-canvas-ref img { width: 48px; height: 48px; }
  .paint-canvas-ref-label { font-size: 8px; padding: 2px 5px; }
  .paint-canvas-demo-badge { font-size: 9px; padding: 4px 8px; bottom: 10px; }
}

/* Olive-leaf particle burst */
.paint-burst {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 3;
}
.paint-burst .leaf {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 9px;
  height: 14px;
  background: var(--olive);
  border-radius: 0 100% 0 100%;
  transform-origin: center;
  opacity: 0;
  animation: leafFly 1100ms cubic-bezier(0.22, 0.61, 0.36, 1) forwards;
}
.paint-burst .leaf.alt { background: var(--olive-pale); width: 7px; height: 11px; }
@keyframes leafFly {
  0%   { opacity: 0; transform: translate(-50%, -50%) rotate(0deg) translateY(0); }
  10%  { opacity: 1; }
  100% { opacity: 0; transform: translate(calc(-50% + var(--dx, 0px)), calc(-50% + var(--dy, 0px))) rotate(var(--rot, 180deg)); }
}

/* Narrative escalates — bigger weight on the change */
.paint-narrative {
  font-family: var(--serif);
  font-style: italic;
  font-size: clamp(18px, 2.2vw, 22px);
  color: var(--ink-2);
  line-height: 1.4;
  min-height: 1.6em;
  transition: opacity 280ms ease;
  font-variation-settings: "opsz" 48, "SOFT" 100;
  max-width: 30ch;
}
.paint-narrative.swap { opacity: 0; }

/* Trophy thumb row — fills as previews complete */
.paint-thumbs {
  display: flex;
  gap: 10px;
  justify-content: center;
  flex-wrap: wrap;
  margin-top: 4px;
}
.paint-thumb-slot {
  width: 56px;
  height: 75px;
  background: var(--paper-2);
  box-shadow: var(--shadow-xs);
  position: relative;
  overflow: hidden;
  opacity: 0.4;
  transition: opacity 320ms ease;
}
.paint-thumb-slot.filled { opacity: 1; animation: thumbIn 600ms cubic-bezier(0.22, 0.61, 0.36, 1); }
.paint-thumb-slot img { width: 100%; height: 100%; object-fit: cover; }
@keyframes thumbIn {
  0% { opacity: 0; transform: translateY(8px) scale(0.92); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* The "final beat" before transitioning to picker */
.paint-canvas.final-beat { animation: finalBeat 800ms ease-out; }
@keyframes finalBeat {
  0%, 100% { box-shadow: var(--shadow-lg); }
  50% { box-shadow: 0 30px 80px rgba(110, 122, 79, 0.45), 0 8px 16px rgba(26, 24, 20, 0.12); }
}

/* Mobile: tighter padding, smaller canvas */
@media (max-width: 600px) {
  .generating-v2 { gap: 16px; padding: 28px 0; }
  .paint-canvas { width: min(280px, 82vw); }
  .paint-thumb-slot { width: 44px; height: 60px; }
  .paint-status-row { gap: 10px; flex-direction: column; }
  .paint-counter::after { display: none; }
  .paint-narrative { font-size: 17px; }
}

/* ============================================================
   STAGE 3 — PICKER
   ============================================================ */
.picker { display: grid; gap: clamp(28px, 4vw, 44px); }
.picker-header {
  display: grid;
  gap: 8px;
  max-width: 600px;
}

.style-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(16px, 2.4vw, 28px);
}
.style-card {
  background: transparent;
  cursor: pointer;
  text-align: left;
  transition: transform 420ms cubic-bezier(0.22, 0.61, 0.36, 1);
  display: grid;
  gap: 14px;
  padding: 0;
}
.style-card:hover { transform: translateY(-4px); }
.style-card-frame {
  background: #fff;
  padding: clamp(10px, 1.4vw, 16px);
  box-shadow: var(--shadow-sm);
  transition: box-shadow 320ms ease;
  position: relative;
}
.style-card:hover .style-card-frame { box-shadow: var(--shadow-md); }
.style-card-frame img {
  aspect-ratio: 3 / 4;
  object-fit: cover;
  background: var(--paper-2);
  width: 100%;
}
.style-card-meta {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 12px;
  padding: 0 4px;
}
.style-card-name {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 19px;
  letter-spacing: -0.01em;
  color: var(--ink);
}
.style-card-pick {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--olive-dark);
  font-weight: 600;
}

/* Big "Choose this →" overlay on the image — visible on hover (desktop) and always (mobile) */
.style-card-frame { position: relative; overflow: hidden; }
.style-card-overlay-cta {
  position: absolute;
  bottom: 14px;
  left: 50%;
  transform: translateX(-50%) translateY(12px);
  background: var(--ink);
  color: var(--paper);
  padding: 10px 18px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  opacity: 0;
  transition: all 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
  pointer-events: none;
  white-space: nowrap;
  box-shadow: var(--shadow-md);
}
.style-card.ready:hover .style-card-overlay-cta {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}
/* On mobile: always show the CTA (no hover) */
@media (max-width: 720px) {
  .style-card-overlay-cta { opacity: 1; transform: translateX(-50%) translateY(0); font-size: 10px; padding: 8px 14px; bottom: 10px; }
}
@media (max-width: 720px) { .style-grid { grid-template-columns: repeat(2, 1fr); } }

/* ============================================================
   STAGE 4 — PREVIEW + BUY
   ============================================================ */
.preview {
  display: grid;
  grid-template-columns: 1fr 0.85fr;
  gap: clamp(40px, 6vw, 80px);
  align-items: start;
}
@media (max-width: 960px) { .preview { grid-template-columns: 1fr; } }

.preview-frame {
  display: grid;
  gap: 16px;
  justify-items: center;
}
/* Default "Print" view — the print as you'd receive it, on a soft paper mat.
   No frame (we're not selling frames yet — they're on the waitlist). */
.frame-outer {
  position: relative;
  padding: clamp(18px, 2.4vw, 28px);
  background: #fdfbf5;
  box-shadow:
    0 1px 0 rgba(26, 24, 20, 0.04),
    0 20px 50px rgba(26, 24, 20, 0.14),
    0 6px 14px rgba(26, 24, 20, 0.08);
  width: 100%;
  max-width: 460px;
  /* very subtle paper-edge feel */
}
.frame-outer::before {
  content: "";
  position: absolute;
  inset: 0;
  background: repeating-linear-gradient(
    115deg,
    transparent 0 60px,
    rgba(26, 24, 20, 0.012) 60px 61px
  );
  pointer-events: none;
}
.frame-mat {
  background: transparent;
  padding: 0;
}
.frame-mat img {
  aspect-ratio: 3 / 4;
  object-fit: cover;
  width: 100%;
  background: var(--paper);
  box-shadow:
    0 0 0 1px rgba(26, 24, 20, 0.04),
    0 6px 18px rgba(26, 24, 20, 0.06);
}
.frame-caption {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
  text-align: center;
  margin-top: 8px;
}

.preview-cta {
  display: grid;
  gap: 24px;
  align-content: start;
  padding-top: clamp(8px, 1vw, 16px);
}
.style-name {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(32px, 4.4vw, 44px);
  line-height: 1.02;
  letter-spacing: -0.025em;
}
.price { display: grid; gap: 6px; }
.price-amount {
  font-family: var(--serif);
  font-size: 40px;
  font-weight: 400;
  letter-spacing: -0.025em;
}
.price-amount::before {
  content: "€";
  font-size: 24px;
  vertical-align: super;
  margin-right: 2px;
  color: var(--muted);
  font-weight: 400;
}
.price-detail { color: var(--muted); font-size: 14px; line-height: 1.5; }
.price-detail strong { color: var(--ink); font-weight: 600; }

/* ---------- Primary CTA ---------- */
.cta-btn {
  position: relative;
  background: var(--ink);
  color: var(--paper);
  border: 0;
  border-radius: 0;
  padding: 20px 28px;
  font-size: 15px;
  font-weight: 500;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  transition: all 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  text-decoration: none;
  cursor: pointer;
  overflow: hidden;
}
.cta-btn::after {
  /* Olive sliver on hover */
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
  background: var(--olive);
  transform: translateX(-100%);
  transition: transform 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.cta-btn:hover { background: var(--ink-2); padding-left: 36px; padding-right: 32px; }
.cta-btn:hover::after { transform: translateX(0); }
.cta-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.cta-btn:disabled:hover { padding: 20px 28px; background: var(--ink); }
.cta-btn:disabled:hover::after { transform: translateX(-100%); }
.cta-spinner {
  width: 16px; height: 16px;
  border: 1.5px solid rgba(242, 237, 226, 0.3);
  border-top-color: var(--paper);
  border-radius: 50%;
  animation: spin 700ms linear infinite;
}
.cta-spinner.hidden { display: none; }
@keyframes spin { to { transform: rotate(360deg); } }

/* ---------- Failed-style retry tile (P1 F2) ---------- */
.style-card.failed { opacity: 0.85; }
.style-card-failed {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: 24px 16px;
  text-align: center;
  background: var(--paper-2);
  border: 1px dashed var(--line-strong);
  border-radius: var(--radius);
  min-height: 200px;
}
.style-card-failed-label {
  font-family: var(--serif);
  font-size: 15px;
  color: var(--ink-2);
}
.style-card-failed-retry {
  font-family: var(--sans);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  padding: 8px 18px;
  background: var(--ink);
  color: var(--paper);
  border-radius: var(--radius);
  cursor: pointer;
}
.style-card-failed-retry:hover { background: var(--ink-2); }
.style-card-failed-help { font-size: 11px; color: var(--muted); line-height: 1.5; max-width: 220px; }

/* ---------- Humane in-page error/confirm dialog (P1 F1) ---------- */
.oh-dialog-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(26, 24, 20, 0.45);
  backdrop-filter: blur(6px);
  display: grid;
  place-items: center;
  padding: 24px;
  z-index: 10000;
  opacity: 0;
  transition: opacity 200ms ease;
}
.oh-dialog-backdrop.open { opacity: 1; }
.oh-dialog {
  background: var(--paper);
  color: var(--ink);
  max-width: 440px;
  width: 100%;
  border-radius: var(--radius-lg);
  padding: 32px;
  box-shadow: var(--shadow-lg);
  text-align: left;
}
.oh-dialog h3 { font-family: var(--serif); font-size: 22px; margin: 0 0 10px; line-height: 1.25; }
.oh-dialog p { font-size: 15px; color: var(--ink-2); margin: 0 0 22px; line-height: 1.55; }
.oh-dialog-actions {
  display: flex;
  gap: 10px;
  justify-content: flex-end;
  flex-wrap: wrap;
}
.oh-dialog-btn {
  font-family: var(--sans);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.04em;
  padding: 12px 22px;
  border-radius: var(--radius);
  cursor: pointer;
  border: 1px solid transparent;
  transition: background 160ms ease, border-color 160ms ease, color 160ms ease;
}
.oh-dialog-btn.primary {
  background: var(--ink);
  color: var(--paper);
}
.oh-dialog-btn.primary:hover { background: var(--ink-2); }
.oh-dialog-btn.destructive {
  background: var(--clay);
  color: var(--paper);
}
.oh-dialog-btn.destructive:hover { background: #8e4a30; }
.oh-dialog-btn.ghost {
  color: var(--ink-2);
  border-color: var(--line-strong);
  background: transparent;
}
.oh-dialog-btn.ghost:hover { background: var(--paper-2); border-color: var(--ink); }
.oh-dialog-btn:focus-visible {
  outline: 2px solid var(--olive);
  outline-offset: 2px;
}

/* ---------- Bespoke memorial note (P1 F8) ---------- */
.bespoke-note-row {
  margin: 18px 0 14px;
  padding: 16px 18px;
  background: rgba(168, 90, 60, 0.05);
  border-left: 2px solid var(--clay);
  border-radius: 0 var(--radius) var(--radius) 0;
}
.bespoke-note-row label {
  font-family: var(--sans);
  font-size: 13px;
  font-weight: 500;
  color: var(--ink-2);
  display: block;
  margin-bottom: 8px;
  line-height: 1.5;
}
.bespoke-note-row textarea {
  width: 100%;
  font-family: var(--sans);
  font-size: 14px;
  line-height: 1.55;
  padding: 10px 12px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius);
  background: var(--paper);
  color: var(--ink);
  resize: vertical;
  min-height: 64px;
}
.bespoke-note-row textarea:focus-visible {
  outline: 2px solid var(--clay);
  outline-offset: 2px;
  border-color: var(--clay);
}
.bespoke-note-count {
  display: block;
  font-size: 11px;
  color: var(--muted);
  margin-top: 6px;
  text-align: right;
}

/* ---------- EU withdrawal consent row (P0-13) ---------- */
.consent-row {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 12px;
  align-items: start;
  margin: 18px 0 14px;
  padding: 14px 16px;
  background: rgba(110, 122, 79, 0.06);
  border-left: 2px solid var(--olive);
  border-radius: 0 var(--radius) var(--radius) 0;
  font-size: 13px;
  line-height: 1.55;
  color: var(--ink-2);
  cursor: pointer;
}
.consent-row input[type="checkbox"] {
  /* Native checkbox at 18×18, keyboard-focusable, accent-color for brand. */
  width: 18px;
  height: 18px;
  margin-top: 2px;
  accent-color: var(--olive);
  flex-shrink: 0;
  cursor: pointer;
}
.consent-row input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 2px;
}
.consent-row a {
  color: var(--ink);
  text-decoration-color: var(--olive);
}
.checkout-help {
  font-size: 12px;
  color: var(--clay);
  margin: 6px 0 0;
  text-align: center;
}

.cta-btn-sm {
  padding: 14px 20px;
  font-size: 12px;
  letter-spacing: 0.12em;
  justify-self: start;
  display: inline-flex;
}

.checkout-trust {
  list-style: none;
  display: grid;
  gap: 10px;
  font-size: 13px;
  color: var(--muted);
  border-top: 1px solid var(--line);
  padding-top: 24px;
  line-height: 1.5;
}
.checkout-trust li {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 12px;
  align-items: baseline;
}
.checkout-trust li::before {
  content: "—";
  color: var(--olive);
  font-family: var(--serif);
}
.checkout-trust strong { color: var(--ink); font-weight: 600; }

/* ============================================================
   GHOST BUTTONS
   ============================================================ */
.ghost-btn {
  background: transparent;
  border: 0;
  color: var(--muted);
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  font-weight: 500;
  padding: 8px 0;
  transition: color 160ms ease;
}
.ghost-btn:hover { color: var(--ink); }

.ghost-btn-strong {
  padding: 11px 18px;
  border: 1px solid var(--line-strong);
  border-radius: 2px;
  color: var(--ink);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  background: #fff;
  transition: all 200ms ease;
  white-space: nowrap;
}
.ghost-btn-strong:hover { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.ghost-btn-strong:disabled { opacity: 0.5; cursor: not-allowed; }

/* ============================================================
   STAGE 5 — THANK YOU
   ============================================================ */
.thanks {
  display: grid;
  gap: 22px;
  justify-items: center;
  text-align: center;
  padding: clamp(48px, 8vw, 96px) 0 0;
  max-width: 580px;
  margin: 0 auto;
}
.check {
  width: 56px; height: 56px;
  border-radius: 50%;
  background: var(--olive);
  color: var(--paper);
  display: grid;
  place-items: center;
  font-size: 22px;
  font-family: var(--serif);
}
.thanks-small { font-size: 13px; color: var(--muted); margin-top: 24px; }

/* ---------- Download card ---------- */
.download-card {
  display: grid;
  grid-template-columns: 100px 1fr;
  gap: 24px;
  align-items: center;
  max-width: 540px;
  width: 100%;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: 22px;
  box-shadow: var(--shadow-sm);
  text-align: left;
  margin-top: 12px;
}
.download-card[hidden] { display: none; }
.download-pending {
  grid-template-columns: auto 1fr;
  gap: 16px;
  color: var(--muted);
  font-size: 14px;
}
.download-pending .cta-spinner {
  border-color: rgba(26, 24, 20, 0.15);
  border-top-color: var(--olive);
}
.download-thumb {
  width: 100px; height: 100px;
  overflow: hidden;
  background: var(--paper-2);
  box-shadow: var(--shadow-xs);
}
.download-thumb img { width: 100%; height: 100%; object-fit: cover; }
.download-meta { display: grid; gap: 8px; }
.download-title { font-family: var(--serif); font-size: 18px; letter-spacing: -0.01em; }
.download-detail { font-size: 13px; color: var(--muted); }
.download-fallback { font-size: 11px; color: var(--muted-2); margin-top: 2px; letter-spacing: 0.02em; }

/* ---------- 5-min hold banner ---------- */
.hold-banner {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 24px;
  align-items: center;
  max-width: 580px;
  width: 100%;
  background: #fff;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-lg);
  padding: 20px 22px;
  text-align: left;
  box-shadow: var(--shadow-xs);
  border-left: 3px solid var(--olive);
}
.hold-committed { border-left-color: var(--paper-3); background: var(--paper-2); }
.hold-cancelled { border-left-color: var(--clay); background: #fdf6f3; }
.hold-meta { display: grid; gap: 4px; }
.hold-title {
  font-family: var(--serif);
  font-size: 17px;
  letter-spacing: -0.01em;
  color: var(--ink);
}
.hold-title #hold-countdown {
  font-variant-numeric: tabular-nums;
  color: var(--olive);
  font-weight: 500;
}
.hold-detail { font-size: 13px; color: var(--muted); line-height: 1.5; }
.hold-detail a { color: var(--ink); }

@media (max-width: 600px) { .hold-banner { grid-template-columns: 1fr; } }

/* ============================================================
   TOP TRUST BAR (rotating ticker)
   ============================================================ */
.top-bar {
  background: var(--paper-2);
  border-bottom: 1px solid var(--line);
  padding: 10px 16px;
  text-align: center;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 500;
  position: relative;
}
.top-bar-content { display: inline-flex; align-items: center; gap: 28px; flex-wrap: wrap; justify-content: center; }
.top-bar-content span { display: inline-flex; align-items: center; gap: 8px; }
.top-bar-content span::before {
  content: "·";
  color: var(--olive);
  font-size: 14px;
}
.top-bar-content span:first-child::before { display: none; }

/* ============================================================
   FLOATING HELP BUTTON (live counter / contact)
   ============================================================ */
.floating-help {
  position: fixed;
  bottom: 24px;
  right: 24px;
  z-index: 100;
  display: grid;
  gap: 8px;
  justify-items: end;
}
.floating-help-btn {
  background: var(--ink);
  color: var(--paper);
  border: 0;
  border-radius: 999px;
  padding: 14px 22px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.06em;
  display: flex;
  align-items: center;
  gap: 10px;
  box-shadow: var(--shadow-md);
  cursor: pointer;
  transition: all 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.floating-help-btn:hover { background: var(--ink-2); transform: translateY(-2px); box-shadow: var(--shadow-lg); }
.floating-help-pulse {
  width: 8px; height: 8px;
  background: var(--olive-pale);
  border-radius: 50%;
  position: relative;
}
.floating-help-pulse::before {
  content: "";
  position: absolute;
  inset: -3px;
  border-radius: 50%;
  background: var(--olive-pale);
  opacity: 0.5;
  animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
  0%, 100% { transform: scale(1); opacity: 0.5; }
  50% { transform: scale(1.6); opacity: 0; }
}
.floating-help-stat {
  background: #fff;
  padding: 10px 16px;
  border-radius: 999px;
  font-size: 11px;
  color: var(--muted);
  letter-spacing: 0.04em;
  box-shadow: var(--shadow-sm);
  display: flex;
  align-items: center;
  gap: 8px;
  white-space: nowrap;
}
.floating-help-stat strong {
  color: var(--ink);
  font-variant-numeric: tabular-nums;
  font-weight: 600;
}
.floating-help-stat::before {
  content: "";
  width: 6px; height: 6px;
  background: var(--olive);
  border-radius: 50%;
}
@media (max-width: 720px) {
  .floating-help { bottom: 80px; right: 12px; }
  .floating-help-stat { display: none; }
  .floating-help-btn { padding: 12px 18px; font-size: 11px; }
}

/* Help panel (opens on click) */
.help-panel {
  position: fixed;
  bottom: 80px;
  right: 24px;
  width: 320px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  padding: 22px;
  z-index: 101;
  display: none;
  animation: panelIn 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.help-panel.open { display: block; }
.help-panel h3 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 22px;
  letter-spacing: -0.01em;
  margin-bottom: 14px;
}
.help-panel ul { list-style: none; display: grid; gap: 4px; }
.help-panel ul li a {
  display: block;
  padding: 10px 0;
  font-size: 14px;
  color: var(--ink-2);
  text-decoration: none;
  border-bottom: 1px solid var(--line);
}
.help-panel ul li:last-child a { border-bottom: 0; }
.help-panel ul li a:hover { color: var(--olive-dark); }
.help-panel .help-contact {
  margin-top: 14px;
  padding-top: 14px;
  border-top: 1px solid var(--line);
  font-size: 12px;
  color: var(--muted);
}
.help-panel .help-contact a { color: var(--ink); }
@keyframes panelIn {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (max-width: 720px) {
  .help-panel { bottom: 70px; right: 12px; left: 12px; width: auto; }
}

/* ============================================================
   STICKY MOBILE CTA (bottom-fixed)
   ============================================================ */
.sticky-cta {
  display: none;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 99;
  padding: 12px 16px;
  background: rgba(242, 237, 226, 0.95);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-top: 1px solid var(--line);
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  animation: stickyIn 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.sticky-cta-meta {
  display: grid;
  gap: 2px;
  font-size: 12px;
  color: var(--muted);
  line-height: 1.2;
}
.sticky-cta-meta strong {
  font-family: var(--serif);
  font-size: 16px;
  font-weight: 400;
  letter-spacing: -0.01em;
  color: var(--ink);
}
.sticky-cta-btn {
  background: var(--ink);
  color: var(--paper);
  border: 0;
  border-radius: 0;
  padding: 14px 22px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
}
@keyframes stickyIn {
  from { transform: translateY(100%); }
  to { transform: translateY(0); }
}
@media (max-width: 720px) {
  .sticky-cta.visible { display: flex; }
}

/* ============================================================
   SKELETON LOADING
   ============================================================ */
.skeleton {
  background: linear-gradient(
    90deg,
    var(--paper-2) 0%,
    var(--paper-3) 50%,
    var(--paper-2) 100%
  );
  background-size: 200% 100%;
  animation: shimmer 1.6s ease-in-out infinite;
}
@keyframes shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* ============================================================
   EMAIL CAPTURE MODAL ("Save my previews")
   ============================================================ */
.modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(26, 24, 20, 0.5);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  display: none;
  align-items: center;
  justify-content: center;
  z-index: 200;
  padding: 20px;
  animation: backdropIn 320ms ease;
}
.modal-backdrop.open { display: flex; }
@keyframes backdropIn { from { opacity: 0; } to { opacity: 1; } }

.modal {
  background: var(--paper);
  max-width: 460px;
  width: 100%;
  padding: clamp(28px, 5vw, 44px);
  box-shadow: var(--shadow-lg);
  position: relative;
  animation: modalIn 420ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
@keyframes modalIn {
  from { opacity: 0; transform: translateY(16px) scale(0.98); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
.modal-close {
  position: absolute;
  top: 16px; right: 16px;
  background: none;
  border: 0;
  font-size: 22px;
  color: var(--muted);
  cursor: pointer;
  padding: 8px;
  line-height: 1;
  transition: color 160ms ease;
}
.modal-close:hover { color: var(--ink); }
.modal h3 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(26px, 3.4vw, 34px);
  letter-spacing: -0.02em;
  line-height: 1.05;
  margin-bottom: 12px;
}
.modal h3 em { font-style: italic; color: var(--olive-dark); }
.modal p { font-size: 15px; color: var(--muted); margin-bottom: 22px; line-height: 1.55; }
.modal-input {
  width: 100%;
  padding: 14px 16px;
  font-size: 15px;
  border: 1px solid var(--line-strong);
  background: #fff;
  border-radius: 2px;
  margin-bottom: 14px;
  font-family: var(--sans);
  transition: border-color 160ms ease;
}
.modal-input:focus { outline: none; border-color: var(--ink); }
.modal-actions { display: flex; gap: 12px; }
.modal-actions .cta-btn { flex: 1; }
.modal-skip {
  background: none;
  color: var(--muted);
  font-size: 12px;
  text-decoration: underline;
  text-underline-offset: 3px;
  padding: 12px;
  letter-spacing: 0.02em;
  text-transform: none;
}
.modal-skip:hover { color: var(--ink); }
.modal-fine { font-size: 11px; color: var(--muted-2); margin-top: 16px; line-height: 1.5; }

/* ============================================================
   EXPRESS PAYMENT BADGES
   ============================================================ */
.express-pay {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  flex-wrap: wrap;
}
.express-pay-label {
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 500;
}
.express-pay-badges {
  display: flex;
  align-items: center;
  gap: 12px;
}
.express-pay-badge {
  height: 26px;
  padding: 5px 10px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 4px;
  display: flex;
  align-items: center;
  font-size: 11px;
  font-weight: 600;
  color: var(--ink);
  letter-spacing: 0.02em;
}
.express-pay-badge.apple { background: #000; color: #fff; border-color: #000; }
.express-pay-badge.gpay { font-family: "Inter", sans-serif; }
.express-pay-badge.visa { color: #1A1F71; font-style: italic; font-weight: 700; }
.express-pay-badge.mc { color: #EB001B; font-weight: 700; letter-spacing: -0.02em; }

/* ============================================================
   FRAME-ON-WALL ROOM MOCKUP (preview stage)
   ============================================================ */
.room-mockup-toggle {
  display: flex;
  gap: 8px;
  margin-top: 16px;
  padding: 4px;
  background: var(--paper-2);
  border-radius: 999px;
  width: fit-content;
  align-self: center;
}
.room-mockup-toggle button {
  padding: 8px 16px;
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-weight: 500;
  background: none;
  border: 0;
  border-radius: 999px;
  color: var(--muted);
  transition: all 200ms ease;
  cursor: pointer;
}
.room-mockup-toggle button.active {
  background: var(--ink);
  color: var(--paper);
}

/* "On the wall" mockup — print mounted unframed against a Mediterranean limewashed wall.
   CSS-rendered wall (no overlay-on-photo clashes), the print sits realistically with shadow. */
.room-mockup {
  width: 100%;
  max-width: 560px;
  position: relative;
  aspect-ratio: 5 / 4;
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding-top: 9%;
  margin: 0 auto;
  background:
    radial-gradient(ellipse at 70% 20%, rgba(255, 246, 230, 0.6) 0%, transparent 60%),
    radial-gradient(ellipse at 20% 80%, rgba(206, 197, 178, 0.25) 0%, transparent 50%),
    linear-gradient(168deg, #ece4d2 0%, #ddd2bb 100%);
  /* Limewashed-wall texture suggestion */
  overflow: hidden;
  box-shadow: var(--shadow-md);
}
.room-mockup.active { display: flex; }
.room-mockup::before {
  /* Subtle wall imperfection — pencil-soft noise to suggest plaster */
  content: "";
  position: absolute;
  inset: 0;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.07 0 0 0 0 0.06 0 0 0 0 0.05 0 0 0 0.05 0'/></filter><rect width='220' height='220' filter='url(%23n)'/></svg>");
  pointer-events: none;
  mix-blend-mode: multiply;
  opacity: 0.6;
}
.room-mockup::after {
  /* Soft floor shadow gradient at the bottom to anchor the wall */
  content: "";
  position: absolute;
  bottom: 0; left: 0; right: 0;
  height: 22%;
  background: linear-gradient(180deg, transparent, rgba(70, 60, 40, 0.12));
  pointer-events: none;
}
.room-mockup-frame {
  width: 38%;
  background: transparent;
  padding: 0;
  position: relative;
  z-index: 1;
  /* Print shadow — realistic paper-on-wall depth */
  box-shadow:
    0 1px 0 rgba(26, 24, 20, 0.06),
    0 12px 28px rgba(26, 24, 20, 0.18),
    0 4px 8px rgba(26, 24, 20, 0.10);
}
/* Tiny corner pins (visible olive dots — suggests magnetic mounting clips) */
.room-mockup-frame::before,
.room-mockup-frame::after {
  content: "";
  position: absolute;
  width: 5px; height: 5px;
  background: var(--olive-dark);
  border-radius: 50%;
  top: -3px;
  z-index: 2;
}
.room-mockup-frame::before { left: 10%; }
.room-mockup-frame::after { right: 10%; }
.room-mockup-frame-mat {
  background: #fdfbf5;
  padding: 6%;
}
.room-mockup-frame-mat img {
  aspect-ratio: 3 / 4;
  object-fit: cover;
  width: 100%;
  display: block;
}

@media (max-width: 600px) {
  .room-mockup { aspect-ratio: 5 / 4; max-width: 100%; }
  .room-mockup-frame { width: 50%; }
  .room-mockup-frame::before { left: 8%; top: -2px; }
  .room-mockup-frame::after { right: 8%; top: -2px; }
}

/* ============================================================
   ADD ANOTHER PET (in picker stage)
   ============================================================ */
.add-another {
  background: #fff;
  border: 1px dashed var(--line-strong);
  padding: 24px;
  text-align: center;
  display: grid;
  gap: 10px;
  cursor: pointer;
  transition: all 200ms ease;
  align-content: center;
  aspect-ratio: 3 / 4;
}
.add-another:hover {
  border-color: var(--olive);
  border-style: solid;
  background: #fdfbf5;
}
.add-another-icon {
  font-family: var(--serif);
  font-size: 36px;
  font-style: italic;
  color: var(--olive);
  line-height: 1;
}
.add-another-text {
  font-family: var(--serif);
  font-size: 17px;
  letter-spacing: -0.01em;
  color: var(--ink);
  line-height: 1.2;
}
.add-another-detail {
  font-size: 12px;
  color: var(--muted);
  letter-spacing: 0.02em;
}

/* ============================================================
   HOVER REVEAL (on examples grid + style cards)
   ============================================================ */
.example-grid figure { position: relative; cursor: pointer; }
.example-grid figure::after {
  content: "Try this style →";
  position: absolute;
  bottom: 36px;
  left: 50%;
  transform: translateX(-50%) translateY(8px);
  background: var(--ink);
  color: var(--paper);
  padding: 8px 14px;
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  opacity: 0;
  transition: all 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
  pointer-events: none;
  white-space: nowrap;
}
.example-grid figure:hover::after {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}

/* ============================================================
   PERSISTENT STATE BANNER (welcome back)
   ============================================================ */
.welcome-back {
  background: var(--olive-pale);
  border: 1px solid var(--olive);
  border-radius: var(--radius);
  padding: 14px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  font-size: 13px;
  color: var(--ink-2);
  animation: stageIn 480ms cubic-bezier(0.22, 0.61, 0.36, 1);
  flex-wrap: wrap;
}
.welcome-back-text strong { color: var(--ink); }
.welcome-back-actions { display: flex; gap: 12px; align-items: center; }
.welcome-back-actions button {
  font-size: 12px;
  letter-spacing: 0.06em;
  color: var(--ink);
  text-decoration: underline;
  text-underline-offset: 3px;
  background: none;
  border: 0;
  padding: 4px 0;
  cursor: pointer;
}
.welcome-back-actions button:hover { color: var(--olive-dark); }

/* ============================================================
   NAVIGATION
   ============================================================ */
.topbar-nav {
  display: flex;
  gap: clamp(20px, 2.4vw, 32px);
  align-items: baseline;
}
.topbar-nav a {
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
  text-decoration: none;
  transition: color 160ms ease;
  position: relative;
}
.topbar-nav a:hover { color: var(--ink); }
.topbar-nav a.active { color: var(--ink); }
.topbar-nav a.active::after {
  content: "";
  position: absolute;
  bottom: -8px;
  left: 0; right: 0;
  height: 1px;
  background: var(--olive);
}
@media (max-width: 720px) {
  .topbar-nav { display: none; }
}

/* ============================================================
   SECTIONS (long-scroll homepage + subpages)
   ============================================================ */
.section {
  padding: clamp(72px, 10vw, 140px) 0;
  border-top: 1px solid var(--line);
}
.section:first-of-type { border-top: 0; }
.section-header {
  display: grid;
  gap: 14px;
  max-width: 640px;
  margin-bottom: clamp(40px, 5vw, 64px);
}
.section-header .eyebrow { margin-bottom: 0; }
.section-header h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(36px, 5.4vw, 64px);
  line-height: 0.98;
  letter-spacing: -0.025em;
  font-variation-settings: "opsz" 144;
}
.section-header h2 em { font-style: italic; color: var(--olive-dark); }
.section-header p {
  font-family: var(--serif);
  font-size: clamp(17px, 1.7vw, 20px);
  line-height: 1.55;
  color: var(--ink-3);
  font-variation-settings: "opsz" 48, "SOFT" 80;
  max-width: 56ch;
}

/* ============================================================
   PROCESS — 3 step section
   ============================================================ */
.process-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(20px, 3.4vw, 44px);
}
.process-card { display: grid; gap: 18px; }
.process-card .process-image {
  aspect-ratio: 4 / 5;
  overflow: hidden;
  background: var(--paper-2);
  box-shadow: var(--shadow-sm);
}
.process-card .process-image img {
  width: 100%; height: 100%; object-fit: cover;
  filter: sepia(0.08) saturate(0.95);
  transition: transform 800ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.process-card:hover .process-image img { transform: scale(1.04); }
.process-num {
  font-family: var(--serif);
  font-style: italic;
  font-size: clamp(48px, 6vw, 72px);
  line-height: 0.9;
  color: var(--olive);
  font-variation-settings: "opsz" 144;
  margin-top: 8px;
}
.process-card h3 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2.6vw, 28px);
  letter-spacing: -0.015em;
  line-height: 1.1;
}
.process-card p {
  font-size: 15px;
  color: var(--muted);
  line-height: 1.6;
}
@media (max-width: 720px) { .process-grid { grid-template-columns: 1fr; } }

/* ============================================================
   LIFESTYLE — broken editorial grid
   ============================================================ */
.lifestyle-grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: clamp(12px, 1.8vw, 20px);
}
.lifestyle-item {
  overflow: hidden;
  background: var(--paper-2);
  box-shadow: var(--shadow-sm);
  position: relative;
  display: block;
  border-radius: 6px;
  transition: box-shadow 380ms cubic-bezier(0.22, 0.61, 0.36, 1),
              transform 380ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.lifestyle-item img {
  width: 100%; height: 100%; object-fit: cover;
  transition: transform 1200ms cubic-bezier(0.22, 0.61, 0.36, 1),
              filter 380ms ease-out;
  display: block;
}
.lifestyle-item:hover {
  box-shadow: var(--shadow-md);
  transform: translateY(-3px);
}
.lifestyle-item:hover img { transform: scale(1.06); filter: brightness(1.02); }
.lifestyle-caption {
  position: absolute;
  inset: auto 0 0 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 14px 16px;
  color: var(--paper);
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.04em;
  background: linear-gradient(180deg, transparent 0%, rgba(26, 24, 20, 0) 35%, rgba(26, 24, 20, 0.78) 100%);
  pointer-events: none;
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 380ms cubic-bezier(0.22, 0.61, 0.36, 1),
              transform 380ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.lifestyle-caption strong {
  font-family: var(--serif);
  font-style: italic;
  font-weight: 400;
  font-size: 18px;
  letter-spacing: -0.005em;
  margin-bottom: 2px;
}
.lifestyle-caption span { opacity: 0.85; }
.lifestyle-item:hover .lifestyle-caption,
.lifestyle-item:focus-visible .lifestyle-caption {
  opacity: 1;
  transform: translateY(0);
}
@media (hover: none) {
  /* Always-on caption on touch devices */
  .lifestyle-caption { opacity: 1; transform: translateY(0); }
}
.li-1 { grid-column: span 7; aspect-ratio: 7 / 5; }
.li-2 { grid-column: span 5; aspect-ratio: 1 / 1; }
.li-3 { grid-column: span 4; aspect-ratio: 4 / 5; }
.li-4 { grid-column: span 8; aspect-ratio: 8 / 5; }
@media (max-width: 720px) {
  .lifestyle-item { grid-column: 1 / -1 !important; aspect-ratio: 16 / 10 !important; }
}

/* ============================================================
   REVIEWS
   ============================================================ */
.reviews-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(20px, 2.6vw, 32px);
}
/* Hide orphan 4th card on desktop (re-shown in mobile media query below) */
.reviews-grid > .review-card:nth-child(n+4) { display: none; }
.review-card {
  background: #fff;
  padding: clamp(30px, 3vw, 40px);
  display: grid;
  gap: 18px;
  align-content: start;
  border: 1px solid var(--line);
  box-shadow: var(--shadow-xs);
  transition: transform 380ms cubic-bezier(.2,.7,.2,1), box-shadow 380ms cubic-bezier(.2,.7,.2,1), border-color 380ms ease;
  outline: none;
}
.review-card:hover,
.review-card:focus-within {
  transform: translateY(-4px);
  box-shadow: 0 18px 40px -16px rgba(60, 42, 30, 0.18), 0 2px 6px -2px rgba(60, 42, 30, 0.08);
  border-color: rgba(110, 122, 89, 0.35);
}
.review-stars {
  font-family: var(--serif);
  color: var(--olive);
  font-size: 16px;
  letter-spacing: 0.18em;
  line-height: 1;
}
.review-body {
  font-family: var(--serif);
  font-size: clamp(16px, 1.5vw, 18px);
  line-height: 1.55;
  color: var(--ink-2);
  font-variation-settings: "opsz" 48;
}
.review-body em { font-style: italic; }
.review-author {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 4px;
  padding-top: 18px;
  border-top: 1px solid var(--line);
}
.review-author img {
  width: 40px; height: 40px;
  border-radius: 50%;
  object-fit: cover;
  background: var(--paper-2);
}
.review-author-meta { display: grid; gap: 2px; }
.review-author-name { font-size: 14px; font-weight: 600; color: var(--ink); }
.review-author-detail { font-size: 12px; color: var(--muted); }
@media (max-width: 880px) {
  .reviews-grid { grid-template-columns: 1fr; max-width: 540px; margin: 0 auto; }
  .reviews-grid > .review-card:nth-child(n+4) { display: grid; }
}

/* ============================================================
   BRAND STORY split section
   ============================================================ */
.story {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(40px, 6vw, 96px);
  align-items: center;
}
.story-image {
  position: relative;
  overflow: hidden;
  box-shadow: var(--shadow-md);
}
.story-image img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  filter: sepia(0.06) saturate(0.95);
}
.story-text { display: grid; gap: 22px; align-content: center; }
.story-text h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(34px, 4.8vw, 56px);
  line-height: 1.0;
  letter-spacing: -0.025em;
}
.story-text h2 em { font-style: italic; color: var(--olive-dark); }
.story-text p {
  font-family: var(--serif);
  font-size: clamp(17px, 1.6vw, 19px);
  line-height: 1.6;
  color: var(--ink-3);
  font-variation-settings: "opsz" 48, "SOFT" 80;
}
.story-text p em { font-style: italic; color: var(--ink-2); }
.story-link {
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--olive-dark);
  text-decoration: none;
  padding-top: 8px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border-bottom: none;
  transition: gap 200ms ease, color 200ms ease;
}
.story-link:hover { gap: 12px; color: var(--ink); }
@media (max-width: 880px) { .story { grid-template-columns: 1fr; } }

/* ============================================================
   FAQ accordion
   ============================================================ */
.faq-list {
  display: grid;
  border-top: 1px solid var(--line);
}
.faq-item {
  border-bottom: 1px solid var(--line);
  padding: 0;
}
.faq-item summary {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  padding: 28px 4px;
  cursor: pointer;
  list-style: none;
  user-select: none;
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(18px, 1.8vw, 22px);
  letter-spacing: -0.012em;
  color: var(--ink);
  transition: color 200ms ease;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary:hover { color: var(--olive-dark); }
.faq-item .faq-toggle {
  font-family: var(--serif);
  font-size: 22px;
  color: var(--olive);
  transition: transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
  line-height: 1;
}
.faq-item[open] .faq-toggle { transform: rotate(45deg); }
.faq-item .faq-answer {
  padding: 0 4px 28px;
  font-family: var(--serif);
  font-size: 16px;
  line-height: 1.6;
  color: var(--ink-3);
  max-width: 70ch;
  font-variation-settings: "opsz" 48;
}
.faq-item .faq-answer a { color: var(--ink); }

/* ============================================================
   BIG CTA — bottom of page
   ============================================================ */
.cta-section {
  background: var(--ink);
  color: var(--paper);
  padding: clamp(80px, 12vw, 160px) var(--pad);
  margin: clamp(64px, 10vw, 120px) calc(var(--pad) * -1) 0;
  text-align: center;
  border: 0;
  position: relative;
  overflow: hidden;
}
.cta-section::before {
  /* Subtle radial olive glow */
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at center, rgba(110, 122, 79, 0.18), transparent 60%);
}
.cta-section-inner {
  max-width: 720px;
  margin: 0 auto;
  position: relative;
  z-index: 1;
}
.cta-section .eyebrow { color: var(--olive-pale); }
.cta-section h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(40px, 6vw, 72px);
  line-height: 1.0;
  letter-spacing: -0.025em;
  color: var(--paper);
  margin-bottom: 32px;
  font-variation-settings: "opsz" 144;
}
.cta-section h2 em { font-style: italic; color: var(--olive-pale); }
.cta-section .cta-section-cta {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  background: var(--paper);
  color: var(--ink);
  padding: 22px 36px;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  text-decoration: none;
  transition: all 240ms ease;
  margin-top: 12px;
}
.cta-section .cta-section-cta:hover {
  background: var(--olive-pale);
  letter-spacing: 0.18em;
}

/* ---------- RICH variant (high-conversion final CTA) ---------- */
.cta-section--rich { padding: clamp(72px, 10vw, 130px) var(--pad); }
.cta-section--rich .cta-section-inner { max-width: 820px; }
.cta-section--rich h2 {
  font-size: clamp(38px, 5.4vw, 64px);
  margin-bottom: 18px;
}
.cta-section-sub {
  font-family: var(--serif);
  font-size: clamp(17px, 1.6vw, 21px);
  line-height: 1.55;
  color: rgba(242, 235, 217, 0.82);
  max-width: 540px;
  margin: 0 auto 36px;
  font-variation-settings: "opsz" 48;
}
.cta-section-sub em {
  font-style: italic;
  color: var(--olive-pale);
}
.cta-style-strip {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 10px;
  max-width: 560px;
  margin: 0 auto 40px;
}
.cta-style-strip img {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  border-radius: 4px;
  opacity: 0.92;
  transition: opacity 320ms ease, transform 320ms ease;
}
.cta-style-strip img:hover { opacity: 1; transform: translateY(-2px); }
.cta-section-actions {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
  margin-bottom: 32px;
}
.cta-section--rich .cta-section-cta {
  margin-top: 0;
  font-size: 15px;
  padding: 24px 40px;
  box-shadow: 0 14px 40px -14px rgba(0, 0, 0, 0.45);
}
.cta-section-link {
  font-family: var(--serif);
  font-style: italic;
  font-size: 15px;
  color: rgba(242, 235, 217, 0.7);
  text-decoration: underline;
  text-decoration-color: rgba(242, 235, 217, 0.3);
  text-underline-offset: 4px;
  transition: color 220ms ease, text-decoration-color 220ms ease;
}
.cta-section-link:hover {
  color: var(--olive-pale);
  text-decoration-color: var(--olive-pale);
}
.cta-trust-row {
  list-style: none;
  padding: 0;
  margin: 0 auto 24px;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px 28px;
  font-family: var(--sans);
  font-size: 12px;
  letter-spacing: 0.06em;
  color: rgba(242, 235, 217, 0.7);
}
.cta-trust-row li {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.cta-trust-check {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: rgba(110, 122, 89, 0.25);
  color: var(--olive-pale);
  font-size: 10px;
  font-weight: 700;
}
.cta-live-proof {
  font-family: var(--serif);
  font-style: italic;
  font-size: 13px;
  color: rgba(242, 235, 217, 0.55);
  margin: 0;
  letter-spacing: 0.02em;
}
.cta-live-proof .cta-live-num {
  font-style: normal;
  font-weight: 600;
  color: var(--olive-pale);
  font-feature-settings: "tnum" 1;
}

/* Mobile */
@media (max-width: 640px) {
  .cta-section--rich { padding: 56px 20px; }
  .cta-section--rich h2 { font-size: 32px; margin-bottom: 14px; }
  .cta-section-sub { font-size: 16px; margin-bottom: 28px; }
  .cta-style-strip { grid-template-columns: repeat(6, 1fr); gap: 6px; max-width: 100%; margin-bottom: 28px; }
  .cta-style-strip img { border-radius: 3px; }
  .cta-section--rich .cta-section-cta {
    padding: 20px 24px;
    font-size: 13px;
    width: 100%;
    max-width: 360px;
    justify-content: center;
  }
  .cta-section-actions { width: 100%; }
  .cta-trust-row {
    flex-direction: column;
    gap: 10px;
    align-items: flex-start;
    width: max-content;
    margin: 0 auto 22px;
    text-align: left;
  }
  .cta-trust-row li { font-size: 12px; }
}

/* ============================================================
   SUBPAGE HEROES (about / styles / reviews / memorial)
   ============================================================ */
.subpage-hero {
  padding: clamp(48px, 8vw, 96px) 0 clamp(40px, 6vw, 64px);
  display: grid;
  gap: 24px;
  max-width: 760px;
}
.subpage-hero h1 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(48px, 7vw, 88px);
  line-height: 0.96;
  letter-spacing: -0.03em;
  font-variation-settings: "opsz" 144, "SOFT" 60;
}
.subpage-hero h1 em { font-style: italic; color: var(--olive-dark); }
.subpage-hero .lede { max-width: 60ch; }

/* Full-bleed image inside a subpage */
.subpage-image {
  margin: clamp(40px, 6vw, 64px) calc(var(--pad) * -1);
}
.subpage-image img {
  width: 100%;
  aspect-ratio: 16 / 7;
  object-fit: cover;
}

/* ============================================================
   STYLES PAGE — large style cards
   ============================================================ */
.style-feature {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(40px, 6vw, 96px);
  align-items: center;
  padding: clamp(64px, 8vw, 96px) 0;
  border-bottom: 1px solid var(--line);
}
.style-feature:last-child { border-bottom: 0; }
.style-feature:nth-child(even) .style-feature-image { order: 2; }
.style-feature-image img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  background: var(--paper-2);
  box-shadow: var(--shadow-md);
}
.style-feature-text { display: grid; gap: 20px; align-content: center; }
.style-feature-text h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(36px, 5vw, 56px);
  line-height: 1.02;
  letter-spacing: -0.025em;
}
.style-feature-text h2 em { font-style: italic; color: var(--olive-dark); }
.style-feature-text p {
  font-family: var(--serif);
  font-size: clamp(17px, 1.6vw, 19px);
  line-height: 1.6;
  color: var(--ink-3);
  font-variation-settings: "opsz" 48, "SOFT" 80;
}
.style-feature-text .when {
  font-family: var(--sans);
  font-size: 13px;
  color: var(--muted);
  padding-top: 12px;
  border-top: 1px solid var(--line);
  display: grid;
  gap: 4px;
}
.style-feature-text .when strong {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--olive-dark);
  font-weight: 600;
}
@media (max-width: 880px) {
  .style-feature { grid-template-columns: 1fr; }
  .style-feature:nth-child(even) .style-feature-image { order: 0; }
  .style-feature:nth-child(even) .style-feature-gallery { order: 0; }
}

/* Two-image gallery per style — the portrait + a real-world context shot.
   Primary image fills the column, context image overlays the lower-right
   like a Polaroid for a layered editorial composition. */
.style-feature-gallery {
  position: relative;
  display: grid;
  gap: 18px;
}
.style-feature:nth-child(even) .style-feature-gallery { order: 2; }
.style-feature-gallery figure { margin: 0; position: relative; }
.style-feature-gallery figcaption {
  position: absolute;
  bottom: 12px;
  left: 12px;
  padding: 6px 12px;
  background: rgba(26, 24, 20, 0.78);
  color: var(--paper);
  font-family: var(--sans, "Inter", system-ui, sans-serif);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  border-radius: 999px;
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
/* Both gallery images respect their source aspect ratio — `height: auto` with
   `object-fit: contain` guarantees zero squash regardless of what dimensions
   the source image arrives at. The shared .img-natural rule lower in this file
   enforces this as a site-wide default for any new images dropped in. */
.style-feature-gallery .style-feature-primary img,
.style-feature-gallery .style-feature-context img {
  width: 100%;
  height: auto;
  object-fit: contain;
  background: var(--paper-2);
  box-shadow: var(--shadow-md);
  border-radius: 4px;
  display: block;
}
.style-feature-gallery .style-feature-context figcaption {
  background: rgba(110, 122, 89, 0.92); /* olive tint for the context caption */
}
@media (min-width: 881px) {
  /* Desktop — primary on top, context offset to bottom-right for a layered feel.
     The container has padding-right so the context can sit half off the primary. */
  .style-feature-gallery {
    padding-right: 24px;
    padding-bottom: 32px;
  }
  .style-feature-gallery .style-feature-context {
    width: 62%;
    margin-left: auto;
    margin-top: -68px;
    transform: translateX(36px);
    z-index: 2;
  }
  .style-feature:nth-child(even) .style-feature-gallery {
    padding-right: 0;
    padding-left: 24px;
  }
  .style-feature:nth-child(even) .style-feature-gallery .style-feature-context {
    margin-left: 0;
    margin-right: auto;
    transform: translateX(-36px);
  }
}

/* ============================================================
   STEP INDICATOR (wizard chrome across funnel stages)
   ============================================================ */
.stepper {
  display: flex;
  align-items: center;
  gap: 0;
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--muted-2);
}
.stepper-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 0;
  transition: color 240ms ease;
}
.stepper-item.completed { color: var(--muted); }
.stepper-item.active { color: var(--ink); }
.stepper-num {
  font-variant-numeric: tabular-nums;
  opacity: 0.45;
  transition: opacity 240ms ease;
}
.stepper-item.completed .stepper-num,
.stepper-item.active .stepper-num { opacity: 1; }
.stepper-item.active .stepper-num { color: var(--olive); }
.stepper-item.completed::after {
  content: "✓";
  color: var(--olive);
  margin-left: 4px;
  font-size: 12px;
}
.stepper-sep {
  width: 28px;
  height: 1px;
  background: var(--line-strong);
  margin: 0 14px;
}
@media (max-width: 720px) {
  .stepper-item:not(.active) .stepper-label { display: none; }
  .stepper-item:not(.active) { padding: 0; }
  .stepper-sep { width: 16px; margin: 0 8px; }
}

/* ============================================================
   BEFORE / AFTER SLIDER (hero — show the transformation)
   ============================================================ */
.before-after {
  position: relative;
  aspect-ratio: 3 / 4;
  overflow: hidden;
  cursor: ew-resize;
  user-select: none;
  background: var(--paper-2);
  box-shadow: var(--shadow-lg);
}
.before-after img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  pointer-events: none;
}
.before-after .ba-after { z-index: 2; }
.before-after .ba-divider {
  position: absolute;
  top: 0; bottom: 0;
  width: 2px;
  background: var(--paper);
  z-index: 3;
  pointer-events: none;
  box-shadow: 0 0 12px rgba(0,0,0,0.3);
}
.before-after .ba-handle {
  position: absolute;
  top: 50%;
  width: 44px; height: 44px;
  background: var(--paper);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  z-index: 4;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-md);
  pointer-events: none;
}
/* P0-12: invisible native range overlay — provides keyboard a11y for the drag.
   The visible .ba-handle is decorative; this is the real control. */
.before-after .ba-range {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
  background: transparent;
  -webkit-appearance: none;
  appearance: none;
  cursor: ew-resize;
  z-index: 5;
  /* Hidden visually but kept in the a11y tree + focusable + clickable. */
  opacity: 0;
}
.before-after .ba-range::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 44px; height: 100%;
  background: transparent;
  cursor: ew-resize;
}
.before-after .ba-range::-moz-range-thumb {
  width: 44px; height: 100%;
  background: transparent;
  border: 0;
  cursor: ew-resize;
}
.before-after .ba-range:focus-visible {
  opacity: 1;
  /* When focused, reveal a subtle outline ring around the whole comparison so
     keyboard users see *something* responding. */
  outline: 2px solid var(--ink);
  outline-offset: -2px;
  background: transparent;
}
.before-after .ba-range:focus-visible + .ba-handle,
.before-after:focus-within .ba-handle {
  /* Visible focus ring on the handle itself. */
  box-shadow: var(--shadow-md), 0 0 0 3px var(--olive);
}
.before-after .ba-handle::before,
.before-after .ba-handle::after {
  content: "";
  width: 6px;
  height: 10px;
  border-top: 2px solid var(--ink);
  border-bottom: 0;
}
.before-after .ba-handle::before {
  border-left: 2px solid var(--ink);
  margin-right: 4px;
  transform: rotate(-45deg) translate(2px, 0);
}
.before-after .ba-handle::after {
  border-right: 2px solid var(--ink);
  margin-left: 4px;
  transform: rotate(45deg) translate(-2px, 0);
}
.before-after .ba-label {
  position: absolute;
  top: 16px;
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  font-weight: 600;
  background: rgba(26, 24, 20, 0.7);
  color: var(--paper);
  padding: 6px 10px;
  border-radius: 2px;
  z-index: 5;
  backdrop-filter: blur(4px);
}
.before-after .ba-label.before { left: 16px; }
.before-after .ba-label.after { right: 16px; }

/* ============================================================
   ADD-ON CARDS (multi-pet, digital pack, gift mode)
   ============================================================ */
.addons {
  display: grid;
  gap: 12px;
  margin-top: 8px;
}
.addon-card {
  display: grid;
  grid-template-columns: 24px 1fr auto;
  gap: 16px;
  align-items: center;
  background: #fff;
  border: 1px solid var(--line);
  padding: 16px 18px;
  cursor: pointer;
  transition: all 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.addon-card:hover { border-color: var(--line-strong); }
/* P1 A2: visually hide the real checkbox but keep it focusable + clickable. */
.addon-checkbox-input {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0;
  border: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
}
.addon-card:has(.addon-checkbox-input:focus-visible) {
  outline: 2px solid var(--olive);
  outline-offset: 3px;
}
.addon-card.checked {
  border-color: var(--olive);
  background: #fdfbf5;
}
.addon-checkbox {
  width: 20px; height: 20px;
  border: 1.5px solid var(--line-strong);
  border-radius: 3px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #fff;
  transition: all 200ms ease;
}
.addon-card.checked .addon-checkbox {
  border-color: var(--olive);
  background: var(--olive);
}
.addon-checkbox::after {
  content: "✓";
  color: #fff;
  font-size: 14px;
  opacity: 0;
  transition: opacity 200ms ease;
}
.addon-card.checked .addon-checkbox::after { opacity: 1; }
.addon-meta { display: grid; gap: 2px; }
.addon-title {
  font-family: var(--serif);
  font-size: 17px;
  letter-spacing: -0.01em;
  color: var(--ink);
  line-height: 1.2;
}
.addon-detail {
  font-size: 13px;
  color: var(--muted);
  line-height: 1.4;
}
.addon-price {
  font-family: var(--serif);
  font-size: 18px;
  font-weight: 400;
  letter-spacing: -0.01em;
  color: var(--ink);
  white-space: nowrap;
}
.addon-price .label {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--olive-dark);
  font-weight: 600;
  display: block;
  margin-bottom: 2px;
}

/* Gift mode expanded panel */
.gift-panel {
  display: none;
  background: var(--paper-2);
  padding: 18px;
  margin-top: -1px;
  border: 1px solid var(--olive);
  border-top: 0;
  display: grid;
  gap: 12px;
}
.addon-card.gift.checked + .gift-panel { display: grid; }
.gift-panel label {
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 600;
  display: block;
  margin-bottom: 6px;
}
.gift-panel input,
.gift-panel textarea {
  width: 100%;
  padding: 12px 14px;
  font-size: 14px;
  border: 1px solid var(--line);
  background: #fff;
  border-radius: 2px;
  font-family: var(--sans);
  resize: vertical;
}
.gift-panel input:focus,
.gift-panel textarea:focus { outline: none; border-color: var(--olive); }
.gift-panel textarea { min-height: 80px; }

/* Total bar above CTA */
.total-bar {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: 16px 0 4px;
  border-top: 1px solid var(--line);
  margin-top: 8px;
}
.total-label {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 600;
}
.total-amount {
  font-family: var(--serif);
  font-size: 32px;
  font-weight: 400;
  letter-spacing: -0.02em;
}
.total-amount::before {
  content: "€";
  font-size: 20px;
  vertical-align: super;
  margin-right: 2px;
  color: var(--muted);
}

/* ============================================================
   UGC WALL — customer photos on their walls
   ============================================================ */
.ugc-wall {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(10px, 1.4vw, 16px);
}
.ugc-tile {
  overflow: hidden;
  background: var(--paper-2);
  box-shadow: var(--shadow-xs);
  position: relative;
  cursor: pointer;
  transition: transform 320ms ease;
}
.ugc-tile:hover { transform: translateY(-3px); }
.ugc-tile img {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
}
.ugc-tile-caption {
  position: absolute;
  inset: auto 0 0 0;
  background: linear-gradient(to top, rgba(26, 24, 20, 0.9), transparent);
  color: var(--paper);
  padding: 24px 14px 12px;
  font-size: 12px;
  letter-spacing: 0.02em;
  opacity: 0;
  transition: opacity 240ms ease;
}
.ugc-tile:hover .ugc-tile-caption { opacity: 1; }
@media (max-width: 720px) { .ugc-wall { grid-template-columns: repeat(2, 1fr); } }

/* ============================================================
   GIFT CARD PAGE
   ============================================================ */
.giftcard-hero {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(40px, 6vw, 88px);
  align-items: center;
  padding: clamp(40px, 6vw, 80px) 0;
}
.giftcard-display {
  background: linear-gradient(140deg, #1A1814 0%, #2B2823 100%);
  padding: clamp(36px, 5vw, 60px);
  position: relative;
  overflow: hidden;
  box-shadow: var(--shadow-lg);
  color: var(--paper);
  aspect-ratio: 16 / 10;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.giftcard-display::before {
  content: "";
  position: absolute;
  top: -20%;
  right: -10%;
  width: 50%;
  aspect-ratio: 1;
  background: radial-gradient(circle, rgba(199, 203, 179, 0.15), transparent 60%);
}
.giftcard-display-wordmark {
  font-family: var(--serif);
  font-style: italic;
  font-size: 22px;
}
.giftcard-display-wordmark .amp { color: var(--olive-pale); padding: 0 2px; }
.giftcard-display-amount {
  font-family: var(--serif);
  font-size: clamp(48px, 6vw, 72px);
  font-weight: 400;
  letter-spacing: -0.025em;
  line-height: 1;
}
.giftcard-display-amount::before {
  content: "€";
  font-size: 0.5em;
  vertical-align: super;
  margin-right: 4px;
  color: var(--olive-pale);
}
.giftcard-display-detail {
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--olive-pale);
  font-weight: 500;
}
.giftcard-form { display: grid; gap: 20px; }
.giftcard-launch-notice {
  padding: 14px 18px;
  background: rgba(110, 122, 79, 0.08);
  border-left: 2px solid var(--olive);
  border-radius: 0 var(--radius) var(--radius) 0;
  font-size: 13px;
  line-height: 1.55;
  color: var(--ink-2);
}
.giftcard-status { font-size: 13px; margin: 0; line-height: 1.55; }
.amount-picker { display: grid; grid-template-columns: repeat(3, 1fr) auto; gap: 8px; }
.amount-btn {
  padding: 16px 12px;
  background: #fff;
  border: 1px solid var(--line);
  font-family: var(--serif);
  font-size: 18px;
  letter-spacing: -0.01em;
  cursor: pointer;
  transition: all 200ms ease;
}
.amount-btn:hover { border-color: var(--line-strong); }
.amount-btn.active {
  background: var(--ink);
  color: var(--paper);
  border-color: var(--ink);
}
.amount-custom {
  padding: 0 16px;
  border: 1px solid var(--line);
  font-family: var(--serif);
  font-size: 16px;
  width: 100px;
}
.amount-custom:focus { outline: none; border-color: var(--ink); }
.giftcard-fields { display: grid; gap: 14px; }
.giftcard-fields label {
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 600;
  display: block;
  margin-bottom: 4px;
}
.giftcard-fields input,
.giftcard-fields textarea {
  width: 100%;
  padding: 14px;
  font-size: 15px;
  font-family: var(--sans);
  border: 1px solid var(--line-strong);
  background: #fff;
  border-radius: 0;
}
.giftcard-fields input:focus,
.giftcard-fields textarea:focus { outline: none; border-color: var(--ink); }
@media (max-width: 880px) { .giftcard-hero { grid-template-columns: 1fr; } }

/* ============================================================
   PET NAME INPUT (below uploader)
   ============================================================ */
.pet-name-row {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 14px;
  align-items: center;
  padding: 14px 18px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  margin-top: -8px;
  box-shadow: var(--shadow-xs);
}
.pet-name-label {
  font-family: var(--serif);
  font-style: italic;
  font-size: 15px;
  color: var(--ink-3);
  white-space: nowrap;
}
.pet-name-input {
  background: transparent;
  border: 0;
  font-family: var(--sans);
  font-size: 15px;
  color: var(--ink);
  padding: 6px 0;
  width: 100%;
  border-bottom: 1px solid var(--line);
  transition: border-color 200ms ease;
}
.pet-name-input:focus { outline: none; border-bottom-color: var(--olive); }
.pet-name-input::placeholder { color: var(--muted-2); font-style: italic; }

/* ============================================================
   STYLE QUIZ CTA + MODAL
   ============================================================ */
.quiz-cta {
  display: flex;
  align-items: center;
  gap: 10px;
  font-family: var(--sans);
  font-size: 12px;
  color: var(--muted);
  letter-spacing: 0.04em;
  margin-top: -4px;
}
.quiz-cta button {
  background: none;
  border: 0;
  color: var(--olive-dark);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.06em;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
  padding: 0;
}
.quiz-cta button:hover { color: var(--ink); }

.quiz-step { display: none; }
.quiz-step.active { display: grid; gap: 18px; }
.quiz-progress {
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--olive-dark);
  font-weight: 600;
}
.quiz-question {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2.4vw, 26px);
  line-height: 1.15;
  letter-spacing: -0.015em;
}
.quiz-options {
  display: grid;
  gap: 10px;
}
.quiz-option {
  padding: 16px 18px;
  background: #fff;
  border: 1px solid var(--line-strong);
  font-family: var(--sans);
  font-size: 14px;
  text-align: left;
  cursor: pointer;
  transition: all 200ms ease;
  display: flex;
  align-items: center;
  gap: 12px;
}
.quiz-option:hover { border-color: var(--ink); background: #fdfbf5; }
.quiz-option-letter {
  font-family: var(--serif);
  font-style: italic;
  color: var(--olive);
  font-size: 14px;
}
.quiz-result { display: grid; gap: 16px; text-align: center; padding: 8px 0; }
.quiz-result-style {
  font-family: var(--serif);
  font-size: clamp(28px, 3.4vw, 36px);
  letter-spacing: -0.02em;
  line-height: 1.05;
}
.quiz-result-style em { font-style: italic; color: var(--olive-dark); }
.quiz-result-reason {
  font-family: var(--serif);
  font-size: 16px;
  color: var(--muted);
  font-style: italic;
  line-height: 1.55;
}
.quiz-result img {
  width: 100%;
  max-width: 240px;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  margin: 0 auto;
  box-shadow: var(--shadow-md);
}

/* ============================================================
   SIZE SELECTOR (at preview / review stage)
   ============================================================ */
.size-picker {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  margin-top: 4px;
}
.size-option {
  padding: 16px 12px;
  background: #fff;
  border: 1px solid var(--line);
  cursor: pointer;
  transition: all 200ms ease;
  text-align: center;
  display: grid;
  gap: 4px;
  position: relative;
}
.size-option:hover { border-color: var(--line-strong); }
.size-option.active {
  border-color: var(--ink);
  background: var(--ink);
  color: var(--paper);
}
.size-option.active .size-popular { color: var(--olive-pale); }
.size-name {
  font-family: var(--serif);
  font-size: 20px;
  letter-spacing: -0.015em;
  line-height: 1;
}
.size-dims {
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: inherit;
  opacity: 0.6;
}
.size-price {
  font-family: var(--serif);
  font-size: 15px;
  letter-spacing: -0.005em;
  margin-top: 4px;
}
.size-price::before {
  content: "€";
  font-size: 11px;
  vertical-align: super;
  margin-right: 1px;
  opacity: 0.7;
}
.size-popular {
  position: absolute;
  top: -8px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--olive);
  color: var(--paper);
  font-size: 9px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  padding: 3px 8px;
  font-weight: 600;
  border-radius: 999px;
  white-space: nowrap;
}

/* ============================================================
   SKELETON CARDS (style picker before previews arrive)
   ============================================================ */
.style-card.skeleton-card { cursor: progress; pointer-events: none; opacity: 0.85; }
.style-card.skeleton-card .style-card-frame img {
  background: linear-gradient(90deg, var(--paper-2) 0%, var(--paper-3) 50%, var(--paper-2) 100%);
  background-size: 200% 100%;
  animation: shimmer 1.6s ease-in-out infinite;
  visibility: hidden;
}
.style-card.skeleton-card .style-card-frame {
  position: relative;
  overflow: hidden;
}
.style-card.skeleton-card .style-card-frame::after {
  content: "";
  position: absolute;
  inset: clamp(10px, 1.4vw, 16px);
  background: linear-gradient(90deg, var(--paper-2) 0%, var(--paper-3) 50%, var(--paper-2) 100%);
  background-size: 200% 100%;
  animation: shimmer 1.6s ease-in-out infinite;
}
.style-card.skeleton-card .style-card-pick { color: var(--muted-2); }
.style-card.ready { animation: cardIn 480ms cubic-bezier(0.22, 0.61, 0.36, 1); }
@keyframes cardIn {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}

/* ============================================================
   SECOND PET UPLOAD (inline when add-on toggled)
   ============================================================ */
.second-pet-panel {
  display: none;
  background: var(--paper-2);
  padding: 18px;
  margin-top: -1px;
  border: 1px solid var(--olive);
  border-top: 0;
}
.addon-card[data-addon="second-pet"].checked + .second-pet-panel { display: block; }
.second-pet-uploader {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 18px;
  background: #fff;
  border: 1.5px dashed var(--line-strong);
  border-radius: var(--radius);
  cursor: pointer;
  transition: all 200ms ease;
}
.second-pet-uploader:hover { border-color: var(--olive); }
.second-pet-uploader.has-file { border-style: solid; border-color: var(--olive); background: #fdfbf5; }
.second-pet-uploader svg { color: var(--olive); flex-shrink: 0; }
.second-pet-uploader-text { display: grid; gap: 2px; flex: 1; }
.second-pet-uploader-text strong {
  font-family: var(--serif);
  font-size: 16px;
  letter-spacing: -0.01em;
  color: var(--ink);
}
.second-pet-uploader-text span { font-size: 12px; color: var(--muted); }
.second-pet-uploader-name {
  margin-top: 12px;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 12px;
  align-items: center;
}
.second-pet-uploader-name label {
  font-family: var(--serif);
  font-style: italic;
  font-size: 13px;
  color: var(--muted);
}
.second-pet-uploader-name input {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--line);
  font-size: 14px;
  padding: 6px 0;
  font-family: var(--sans);
}
.second-pet-uploader-name input:focus { outline: none; border-bottom-color: var(--olive); }

/* ============================================================
   PET NAME — surfaced throughout
   ============================================================ */
.pet-name-display {
  font-family: var(--serif);
  font-style: italic;
  color: var(--olive-dark);
}

/* ============================================================
   404 PAGE
   ============================================================ */
.not-found {
  display: grid;
  place-items: center;
  text-align: center;
  padding: clamp(80px, 12vw, 140px) var(--pad);
  gap: 28px;
}
.not-found-image {
  width: 160px;
  height: 160px;
  border-radius: 50%;
  overflow: hidden;
  background: var(--paper-2);
  box-shadow: var(--shadow-md);
  filter: sepia(0.1) saturate(0.9);
}
.not-found-image img { width: 100%; height: 100%; object-fit: cover; }
.not-found h1 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(40px, 6vw, 72px);
  line-height: 1.0;
  letter-spacing: -0.025em;
  font-variation-settings: "opsz" 144;
  max-width: 18ch;
}
.not-found h1 em { font-style: italic; color: var(--olive-dark); }
.not-found p {
  font-family: var(--serif);
  font-size: clamp(17px, 1.7vw, 19px);
  line-height: 1.6;
  color: var(--ink-3);
  max-width: 44ch;
}
.not-found-links {
  display: flex;
  gap: 24px;
  flex-wrap: wrap;
  justify-content: center;
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}
.not-found-links a { color: var(--olive-dark); text-decoration: none; }
.not-found-links a:hover { color: var(--ink); }

/* ============================================================
   MOBILE-FIRST PASS — 90% of sales will be on mobile.
   This block overrides desktop styles below ~600px (iPhone widths).
   Optimised for one-thumb use, fast funnel completion, no zooming.
   ============================================================ */

/* iOS form-zoom defence: every input ≥16px text, every button taps clean */
input, textarea, select { font-size: 16px; }
button, a, label { -webkit-tap-highlight-color: transparent; touch-action: manipulation; }

@media (max-width: 600px) {
  :root {
    --pad: 18px;
    --col: 100%;
  }

  /* === HEADER / TOP-BARS === */
  .demo-banner { padding: 8px 14px; font-size: 10px; letter-spacing: 0.04em; }
  .demo-banner strong { letter-spacing: 0.1em; }
  .top-bar { padding: 8px 14px; font-size: 10px; letter-spacing: 0.1em; }
  .top-bar-content { gap: 14px; }
  .top-bar-content span:not(:first-child) { display: none; } /* keep just "Free worldwide shipping" on mobile */

  .topbar { padding-bottom: 18px; margin-bottom: 24px; }
  .wordmark { font-size: 22px; }
  .trust { display: none; }

  /* Stepper compresses */
  .stepper { gap: 0; font-size: 10px; letter-spacing: 0.08em; }
  .stepper-sep { width: 10px; margin: 0 6px; }

  /* === STAGE PADDING === */
  .stage { padding: 18px var(--pad) 96px; }  /* extra bottom = sticky-cta clearance */

  /* === HERO === */
  .hero { gap: 24px; padding-bottom: 32px; grid-template-columns: 1fr; }
  .hero-text { gap: 18px; padding-top: 4px; }
  .display { font-size: 40px; line-height: 1.0; }
  .lede { font-size: 16px; line-height: 1.5; }
  .eyebrow { font-size: 10px; letter-spacing: 0.18em; margin-bottom: 12px; }

  /* Hero image: smaller, positioned above text so it sells the transform first */
  .hero-image { order: -1; max-width: 280px; margin: 0 auto; }
  .hero-frame { padding: 10px; transform: none; }
  .hero-frame-mat { padding: 14px; }
  .hero-caption { font-size: 10px; margin-top: 12px; }
  .before-after .ba-handle { width: 36px; height: 36px; } /* fingerable */
  .before-after .ba-label { font-size: 9px; padding: 4px 8px; top: 10px; }
  .before-after .ba-label.before { left: 10px; }
  .before-after .ba-label.after { right: 10px; }

  /* === UPLOADER === */
  .uploader { padding: 22px 18px; }
  .uploader-inner { gap: 16px; }
  .uploader svg { width: 32px; height: 32px; }
  .uploader-text strong { font-size: 18px; }
  .uploader-text span { font-size: 13px; }

  /* Pet name row + quiz CTA */
  .pet-name-row { padding: 14px 16px; grid-template-columns: 1fr; gap: 6px; }
  .pet-name-label { font-size: 14px; }
  .pet-name-input { font-size: 16px; padding: 10px 0; }
  .quiz-cta { flex-direction: column; gap: 6px; align-items: flex-start; font-size: 13px; }
  .quiz-cta button { font-size: 13px; }

  /* Reassurance — stack vertically with visible dot prefix */
  .reassurance { flex-direction: column; gap: 8px; font-size: 13px; align-items: flex-start; }

  /* Photo tips — closed by default would be ideal but keeping open for discoverability */
  .photo-tips summary { padding: 14px 18px; }
  .tips-label { font-size: 15px; }
  .tip { padding: 16px 18px; }
  .tip h3 { font-size: 16px; }
  .tip p { font-size: 13px; }
  .tip-dont { padding: 14px 18px; }

  /* === SIX STYLES STRIP === */
  .examples { padding-top: 36px; margin-top: 32px; }
  .examples-heading h2 { font-size: 24px; }
  .examples-heading .note { font-size: 12px; }
  .example-grid { grid-template-columns: repeat(2, 1fr); gap: 12px; }
  .example-grid figcaption { font-size: 10px; }

  /* === SECTIONS (process / lifestyle / reviews / story / faq / cta) === */
  .section { padding: 48px 0; }
  .section-header { gap: 10px; margin-bottom: 24px; }
  .section-header h2 { font-size: 32px; }
  .section-header p { font-size: 16px; }

  /* Process — 3 → 1 col, smaller images */
  .process-grid { gap: 24px; }
  .process-card { gap: 12px; }
  .process-card .process-image { aspect-ratio: 3 / 2; }
  .process-num { font-size: 40px; }
  .process-card h3 { font-size: 20px; }
  .process-card p { font-size: 14px; }

  /* Lifestyle — broken grid all 1-col */
  .lifestyle-grid { gap: 12px; }

  /* Reviews — 1 col with sane width */
  .reviews-grid { gap: 16px; max-width: 100%; }
  .review-card { padding: 20px; }
  .review-body { font-size: 15px; }

  /* Brand story — 1 col, image-on-top */
  .story { gap: 24px; }
  .story-image img { aspect-ratio: 5 / 4; }
  .story-text h2 { font-size: 30px; }
  .story-text p { font-size: 16px; }

  /* FAQ — taller summary for thumb tap */
  .faq-item summary { padding: 20px 4px; font-size: 16px; }
  .faq-item .faq-answer { font-size: 14px; padding: 0 4px 20px; }

  /* Big bottom CTA */
  .cta-section { padding: 60px var(--pad); margin: 48px calc(var(--pad) * -1) 0; }
  .cta-section h2 { font-size: 32px; margin-bottom: 24px; }
  .cta-section .cta-section-cta { padding: 18px 28px; font-size: 13px; }

  /* === FUNNEL: PICKER === */
  .picker-header h2 { font-size: 28px; }
  .style-grid { grid-template-columns: repeat(2, 1fr); gap: 12px; }
  .style-card-frame { padding: 8px; }
  .style-card-name { font-size: 16px; }
  .style-card-pick { font-size: 9px; letter-spacing: 0.14em; }

  /* === FUNNEL: PREVIEW / REVIEW === */
  .preview { gap: 24px; grid-template-columns: 1fr; }
  .preview-frame { gap: 12px; }
  .frame-outer { padding: 16px; }
  .frame-mat { padding: 18px; }
  .frame-caption { font-size: 10px; }
  .room-mockup-toggle button { padding: 10px 16px; font-size: 11px; min-height: 40px; }

  .preview-cta { gap: 18px; padding-top: 4px; }
  .style-name { font-size: 28px; }
  .price-amount { font-size: 36px; }
  .price-detail { font-size: 13px; }

  /* Size selector — 3 buttons, slightly taller for tap */
  .size-picker { gap: 6px; }
  .size-option { padding: 14px 8px; min-height: 80px; }
  .size-name { font-size: 18px; }
  .size-dims { font-size: 9px; letter-spacing: 0.12em; }
  .size-price { font-size: 13px; }
  .size-popular { font-size: 8px; padding: 2px 6px; }

  /* Add-on cards — bigger tap area, simpler layout on mobile */
  .addons { gap: 10px; }
  .addon-card { grid-template-columns: 22px 1fr; padding: 14px 16px; gap: 12px; }
  .addon-title { font-size: 16px; }
  .addon-detail { font-size: 12px; }
  .addon-price {
    grid-column: 2;
    grid-row: 2;
    font-size: 14px;
    padding-top: 4px;
  }
  .addon-price .label { display: inline; margin-right: 6px; }
  .gift-panel { padding: 14px; gap: 10px; }
  .gift-panel input, .gift-panel textarea { font-size: 16px; padding: 12px; }

  .total-bar { padding: 14px 0 4px; }
  .total-amount { font-size: 28px; }

  /* === CTA BUTTONS === */
  .cta-btn { padding: 18px 22px; font-size: 14px; min-height: 56px; width: 100%; }
  .cta-btn:hover { padding-left: 22px; padding-right: 22px; } /* no morph on touch */
  .cta-btn-sm { padding: 14px 18px; font-size: 11px; min-height: 44px; }
  .ghost-btn-strong { min-height: 44px; padding: 12px 18px; }

  .checkout-trust { gap: 8px; font-size: 12px; padding-top: 18px; }

  /* === EXPRESS PAY === */
  .express-pay { gap: 10px; padding: 12px 0; }
  .express-pay-label { font-size: 10px; letter-spacing: 0.1em; }
  .express-pay-badge { height: 22px; padding: 4px 7px; font-size: 10px; }

  /* === STICKY CTA on mobile (always visible at bottom) === */
  .sticky-cta { padding: 10px 14px; }
  .sticky-cta-meta strong { font-size: 14px; }
  .sticky-cta-meta span { font-size: 11px; }
  .sticky-cta-btn { padding: 13px 18px; font-size: 11px; min-height: 44px; }

  /* === FLOATING HELP === */
  .floating-help { bottom: 76px; right: 10px; }   /* sits cleanly above sticky CTA */
  .floating-help-btn { padding: 11px 15px; font-size: 10px; min-height: 40px; }
  .help-panel { bottom: 130px; left: 12px; right: 12px; padding: 18px; }
  .help-panel h3 { font-size: 18px; }

  /* === MODALS === */
  .modal-backdrop { padding: 0; align-items: flex-end; }
  .modal {
    max-width: 100%;
    width: 100%;
    border-radius: 16px 16px 0 0;
    padding: 24px 20px 28px;
    max-height: 92vh;
    overflow-y: auto;
    animation: modalSlideUp 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
  }
  @keyframes modalSlideUp {
    from { transform: translateY(100%); }
    to { transform: translateY(0); }
  }
  .modal h3 { font-size: 24px; }
  .modal p { font-size: 14px; margin-bottom: 18px; }
  .modal-input { padding: 14px; font-size: 16px; }
  .modal-close { top: 12px; right: 12px; font-size: 28px; padding: 10px; }

  /* Quiz modal questions */
  .quiz-question { font-size: 20px; }
  .quiz-option { padding: 14px 16px; min-height: 52px; font-size: 14px; }

  /* === THANK YOU === */
  .thanks { padding-top: 36px; gap: 16px; }
  .hold-banner { grid-template-columns: 1fr; padding: 16px; gap: 14px; }
  .hold-title { font-size: 15px; }
  .hold-detail { font-size: 12px; }
  .download-card { grid-template-columns: 80px 1fr; gap: 16px; padding: 16px; }
  .download-thumb { width: 80px; height: 80px; }
  .download-title { font-size: 16px; }

  /* === SUBPAGE HEROES === */
  .subpage-hero { padding: 32px 0 24px; gap: 18px; }
  .subpage-hero h1 { font-size: 40px; }
  .subpage-image { margin: 32px calc(var(--pad) * -1); }
  .subpage-image img { aspect-ratio: 4 / 3; }

  /* === STYLES PAGE === */
  .style-feature { grid-template-columns: 1fr; gap: 24px; padding: 40px 0; }
  .style-feature:nth-child(even) .style-feature-image { order: 0; }
  .style-feature-text h2 { font-size: 32px; }
  .style-feature-text p { font-size: 15px; }

  /* === REVIEWS PAGE === */
  .ugc-wall { grid-template-columns: repeat(2, 1fr); gap: 8px; }

  /* === GIFT CARD PAGE === */
  .giftcard-hero { grid-template-columns: 1fr; gap: 28px; padding: 24px 0; }
  .giftcard-display { padding: 28px; aspect-ratio: 16/10; }
  .giftcard-display-amount { font-size: 48px; }
  .amount-picker { grid-template-columns: repeat(3, 1fr); }
  .amount-custom { grid-column: 1 / -1; width: 100%; padding: 14px; }
  .amount-btn { padding: 14px 8px; font-size: 16px; min-height: 52px; }

  /* === FOOTER === */
  .site-footer { padding: 20px var(--pad) 16px; flex-direction: column; align-items: flex-start; gap: 8px; }
  .site-footer .made { font-size: 13px; }
  .site-footer-links { flex-wrap: wrap; gap: 10px 16px; font-size: 10px; }

  /* === 404 === */
  .not-found { padding: 48px var(--pad); gap: 20px; }
  .not-found h1 { font-size: 36px; }
  .not-found p { font-size: 16px; }
  .not-found-links { gap: 14px 20px; font-size: 11px; }
}

/* iPhone-SE-ish (≤375px): even tighter */
@media (max-width: 380px) {
  .display { font-size: 36px; }
  .hero-image { max-width: 240px; }
  .style-grid { gap: 10px; }
  .style-card-name { font-size: 14px; }
  .top-bar { font-size: 9px; }
}

/* ============================================================
   FOOTER
   ============================================================ */
.site-footer {
  margin-top: auto;
  padding: 32px var(--pad);
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 16px;
  font-size: 11px;
  color: var(--muted);
  letter-spacing: 0.06em;
  border-top: 1px solid var(--line);
  flex-wrap: wrap;
}
.site-footer .made {
  font-family: var(--serif);
  font-style: italic;
  font-size: 13px;
  letter-spacing: 0;
  color: var(--ink-3);
}
.site-footer .made em { color: var(--olive-dark); font-style: italic; }
.site-footer a { color: var(--muted); text-decoration: none; }
.site-footer a:hover { color: var(--ink); }
.site-footer-links { display: flex; gap: 20px; text-transform: uppercase; font-weight: 500; }

/* ============================================================
   2026-05-21 — Conversion + a11y additions
   "Best value" savings badge, pet-name display,
   demoted modal-skip, global focus-visible.
   ============================================================ */

.size-savings {
  position: absolute;
  top: -8px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--ink, #1A1814);
  color: var(--paper, #fdfaf3);
  font-size: 9px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  padding: 3px 8px;
  font-weight: 600;
  border-radius: 999px;
  white-space: nowrap;
}
.size-option.active .size-savings { background: var(--olive); color: var(--paper); }

/* Pet-name inline display (across CTA, picker, preview) */
.pet-name-display {
  font-family: var(--serif);
  font-style: italic;
  color: inherit;
}

/* Trust row: balance the four entries on desktop, stack on mobile */
.reassurance.trust-row { flex-wrap: wrap; gap: 14px 22px; }
.reassurance.trust-row span:first-child { color: var(--olive-dark, #5a6b3d); font-weight: 600; }

/* Demote modal skip so it's clearly secondary (was visually equal to primary) */
.modal-skip {
  font-size: 11px;
  letter-spacing: 0.06em;
  opacity: 0.55;
  text-decoration: none;
  border: none;
  background: none;
  padding: 6px 0;
  margin-top: 6px;
  cursor: pointer;
  color: var(--muted, #999);
}
.modal-skip:hover { opacity: 0.85; text-decoration: none; color: var(--ink); }

/* Global keyboard-focus ring — WCAG 2.4.7 (Focus Visible). */
:focus { outline: none; }
:focus-visible {
  outline: 2px solid var(--olive, #5a6b3d);
  outline-offset: 3px;
  border-radius: 4px;
}
button:focus-visible,
a:focus-visible,
[tabindex]:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
label.uploader:focus-visible,
.style-card:focus-visible,
.size-option:focus-visible {
  outline: 2px solid var(--ink, #1A1814);
  outline-offset: 3px;
}

/* Re-upload prompt state for "Show 3 more styles" */
#more-styles-btn[data-needs-reupload="1"] {
  border-color: var(--olive-dark, #5a6b3d);
  color: var(--olive-dark, #5a6b3d);
}

/* Mobile tap-target floor */
@media (max-width: 600px) {
  button, [role="button"], .ghost-btn, .ghost-btn-strong {
    min-height: 44px;
  }
}

/* ============================================================
   2026-05-21 v2 — Premium polish + autonomy pass
   Picker recommendation note, tier-card hover/active polish,
   sticky CTA refinement, top-bar tightening, motion principles,
   memorial register, smooth page-feel.
   ============================================================ */

/* Reduce-motion respect — every animation falls back to instant */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ─── Sticky CTA polish (mobile-only by design) ──────────── */
.sticky-cta {
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  background: rgba(253, 250, 243, 0.88);
  border-top: 1px solid rgba(26, 24, 20, 0.08);
  box-shadow: 0 -8px 30px rgba(26, 24, 20, 0.06);
  transition: transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.sticky-cta:not(.visible) { transform: translateY(120%); }
.sticky-cta-btn {
  transition: transform 180ms ease, background 180ms ease;
}
.sticky-cta-btn:active { transform: scale(0.97); }

/* ─── Tier-card refinement: subtle lift on hover, tightened active state ─── */
.size-option {
  transition: border-color 220ms ease, background 220ms ease, transform 200ms ease, box-shadow 220ms ease;
}
.size-option:hover:not(.active) {
  border-color: var(--ink, #1A1814);
  transform: translateY(-1px);
  box-shadow: 0 8px 22px -10px rgba(26, 24, 20, 0.18);
}
.size-option:active { transform: translateY(0); }

/* ─── Style-card hover: subtle frame lift + caption underline ─── */
.style-card {
  transition: transform 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.style-card.ready:hover {
  transform: translateY(-2px);
}
.style-card.ready:hover .style-card-frame {
  box-shadow: 0 24px 50px -22px rgba(26, 24, 20, 0.32);
}
.style-card-frame {
  transition: box-shadow 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* ─── "The one we'd start with" note (quiz-led recommendation) ─── */
.style-card.recommended {
  position: relative;
}
.style-card.recommended .style-card-frame {
  box-shadow: 0 0 0 2px var(--olive, #5a6b3d), 0 16px 36px -18px rgba(26, 24, 20, 0.22);
}
.style-card-note {
  display: block;
  margin-top: 6px;
  font-family: var(--serif, "Fraunces", serif);
  font-style: italic;
  font-size: 12px;
  letter-spacing: 0.005em;
  color: var(--olive-dark, #4a5933);
  text-align: center;
}

/* ─── Top bar — quieter on mobile, calmer on desktop ─── */
.top-bar {
  background: var(--ink, #1A1814);
  color: var(--paper-2, #f4ede0);
}
.top-bar-content {
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  font-weight: 500;
}
.top-bar-content span {
  position: relative;
  padding: 0 18px;
}
.top-bar-content span + span::before {
  content: "·";
  position: absolute;
  left: -2px;
  opacity: 0.4;
}

/* ─── Uploader: stronger affordance, paper-like hover ─── */
.uploader {
  transition: background 240ms ease, border-color 240ms ease, transform 200ms ease;
}
.uploader:hover {
  background: var(--paper-2, #f4ede0);
  border-color: var(--ink, #1A1814);
}
.uploader:active { transform: translateY(0.5px); }
.uploader.drag {
  background: var(--olive-pale, #cfd7b8);
  border-style: solid;
}

/* ─── Smooth page transitions (modern browsers) ─── */
@supports (view-transition-name: root) {
  ::view-transition-old(root),
  ::view-transition-new(root) {
    animation-duration: 420ms;
    animation-timing-function: cubic-bezier(0.22, 0.61, 0.36, 1);
  }
}

/* ─── Stage transitions — paper-feel slide-in ─── */
.stage:not(.hidden) {
  animation: stageEnter 540ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
@keyframes stageEnter {
  0%   { opacity: 0; transform: translateY(8px); }
  100% { opacity: 1; transform: translateY(0); }
}

/* ─── Lifestyle grid: subtle hover lift ─── */
.lifestyle-item {
  overflow: hidden;
  display: block;
}
.lifestyle-item img {
  transition: transform 540ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.lifestyle-item:hover img {
  transform: scale(1.03);
}

/* ─── CTA button refinement ─── */
.cta-btn, .cta-section-cta {
  transition: transform 180ms ease, background 240ms ease, box-shadow 280ms ease;
}
.cta-btn:hover, .cta-section-cta:hover {
  box-shadow: 0 14px 30px -14px rgba(26, 24, 20, 0.28);
  transform: translateY(-1px);
}
.cta-btn:active, .cta-section-cta:active {
  transform: translateY(0);
}

/* ─── Trust row tightening ─── */
.reassurance.trust-row {
  font-size: 12px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 500;
}
.reassurance.trust-row strong {
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--ink, #1A1814);
}

/* ─── Memorial register — soft warm clay accent ─── */
[data-intent="memorial"] .reassurance.trust-row span:first-child { color: var(--ink-3, #4a4036); }
[data-intent="memorial"] .picker-header .eyebrow { color: var(--ink-3, #4a4036); letter-spacing: 0.18em; }

/* ─── Footer link refinement ─── */
.site-footer-links a {
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-weight: 500;
  font-size: 11px;
  transition: color 200ms ease;
}
.site-footer-links a:hover { color: var(--ink, #1A1814); }

/* ─── Mobile-first tightening: full-bleed hero, calmer padding ─── */
@media (max-width: 600px) {
  .hero { gap: 28px; }
  .display { font-size: clamp(32px, 9vw, 44px); line-height: 1.04; }
  .lede { font-size: 15px; line-height: 1.5; }
  .reassurance.trust-row {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 8px 18px;
    font-size: 10px;
    letter-spacing: 0.08em;
  }
  .reassurance.trust-row span {
    white-space: nowrap;
  }
  .top-bar-content { font-size: 9px; letter-spacing: 0.14em; padding: 6px 12px; }
  .top-bar-content span { padding: 0 8px; }
  .sticky-cta { padding: 10px 14px; }
  .sticky-cta-meta strong { font-size: 13px; }
  .sticky-cta-meta span { font-size: 11px; }
  .style-card-note { font-size: 11px; }
  /* Tier cards stack tighter on narrow phones */
  .size-picker { gap: 8px; }
  .size-option { padding: 12px 8px; min-height: 88px; }
  .size-name { font-size: 17px; }
  .size-dims { font-size: 9px; }
  .size-popular, .size-savings { font-size: 8px; }
}

/* ─── Tablet refinements ─── */
@media (min-width: 601px) and (max-width: 900px) {
  .hero { grid-template-columns: 1fr; }
  .lifestyle-grid { grid-template-columns: 1fr 1fr; }
}

/* ============================================================
   2026-05-21 v3 — Contextual styles strip, iPhone mockup,
   painterly generating-stage overlay
   ============================================================ */

/* ─── Contextual styles strip (homepage + /cats + /dogs) ─── */
/* 3 cols × 2 rows on desktop reads much better than 6-across slivers —
   faces breathe, each style gets visual weight, the strip becomes a
   considered gallery instead of a thumbnail row. */
.example-grid.styles-contextual {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}
.example-grid.styles-contextual figure {
  position: relative;
  margin: 0;
  overflow: hidden;
  background: var(--paper-2, #f4ede0);
  border-radius: 4px;
}
.example-grid.styles-contextual figure a {
  display: block;
  overflow: hidden;
}
.example-grid.styles-contextual figure img {
  width: 100%;
  height: auto;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  object-position: center 30%; /* bias to the face (top third of portrait) */
  display: block;
  transition: transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.example-grid.styles-contextual figure:hover img {
  transform: scale(1.05);
}
.example-grid.styles-contextual figcaption {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 16px 14px 14px;
  background: linear-gradient(to top, rgba(26, 24, 20, 0.78) 0%, rgba(26, 24, 20, 0.0) 100%);
  color: var(--paper, #fdfaf3);
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-family: var(--sans, "Inter", sans-serif);
  pointer-events: none;
}
.example-grid.styles-contextual figcaption strong {
  font-family: var(--serif, "Fraunces", serif);
  font-style: italic;
  font-weight: 500;
  font-size: 18px;
  letter-spacing: -0.005em;
  line-height: 1.1;
}
.example-grid.styles-contextual figcaption span {
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  opacity: 0.78;
  font-weight: 500;
}

@media (max-width: 900px) {
  .example-grid.styles-contextual { grid-template-columns: repeat(2, 1fr); gap: 14px; }
}
@media (max-width: 520px) {
  .example-grid.styles-contextual { grid-template-columns: repeat(2, 1fr); gap: 10px; }
  .example-grid.styles-contextual figcaption strong { font-size: 15px; }
  .example-grid.styles-contextual figcaption span { font-size: 9px; }
  .example-grid.styles-contextual figure img { aspect-ratio: 4 / 5; }
}

/* ─── iPhone mockup (preview stage, digital-first) ─── */
.iphone-mockup {
  position: absolute;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, #efe7d6 0%, #e3d9c4 100%);
}
.iphone-mockup.active { display: flex; }
.iphone-frame {
  position: relative;
  width: clamp(180px, 56%, 260px);
  aspect-ratio: 9 / 19.5;
  background: #1A1814;
  border-radius: 38px;
  padding: 10px;
  box-shadow:
    0 30px 60px -20px rgba(26, 24, 20, 0.45),
    0 8px 18px -10px rgba(26, 24, 20, 0.25),
    inset 0 0 0 1.5px #2a2620,
    inset 0 0 0 4px #0d0c0a;
}
.iphone-screen {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  border-radius: 28px;
  background: #000;
}
.iphone-screen img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Dynamic-island notch */
.iphone-notch {
  position: absolute;
  top: 10px;
  left: 50%;
  transform: translateX(-50%);
  width: 86px;
  height: 24px;
  background: #000;
  border-radius: 999px;
  z-index: 3;
}
/* Lock-screen overlay (time + date) */
.iphone-time {
  position: absolute;
  top: 56px;
  left: 0;
  right: 0;
  color: #fff;
  text-align: center;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Inter", sans-serif;
  font-weight: 200;
  font-size: 56px;
  letter-spacing: -0.02em;
  line-height: 1;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.18);
  z-index: 2;
}
.iphone-date {
  position: absolute;
  top: 36px;
  left: 0;
  right: 0;
  color: #fff;
  text-align: center;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Inter", sans-serif;
  font-weight: 500;
  font-size: 14px;
  letter-spacing: 0.02em;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.22);
  z-index: 2;
}
/* Status bar (mini) */
.iphone-status {
  position: absolute;
  top: 12px;
  left: 24px;
  right: 24px;
  display: flex;
  justify-content: space-between;
  font-family: -apple-system, "SF Pro Display", "Inter", sans-serif;
  font-size: 11px;
  font-weight: 600;
  color: #fff;
  z-index: 2;
  letter-spacing: 0.02em;
}
/* Glass reflection */
.iphone-glare {
  position: absolute;
  inset: 0;
  background: linear-gradient(115deg, rgba(255, 255, 255, 0.18) 0%, rgba(255, 255, 255, 0) 30%);
  pointer-events: none;
  border-radius: 28px;
  z-index: 4;
}

/* ─── Generating-stage scanning brush overlay ─── */
.paint-canvas .paint-scan {
  position: absolute;
  inset: 0;
  pointer-events: none;
  overflow: hidden;
  z-index: 2;
}
.paint-canvas:not(.has-preview) .paint-scan::before {
  content: "";
  position: absolute;
  top: -10%;
  left: -40%;
  width: 60%;
  height: 120%;
  background: linear-gradient(
    115deg,
    transparent 0%,
    rgba(90, 107, 61, 0.0) 30%,
    rgba(90, 107, 61, 0.10) 48%,
    rgba(255, 255, 255, 0.18) 50%,
    rgba(90, 107, 61, 0.10) 52%,
    rgba(90, 107, 61, 0.0) 70%,
    transparent 100%
  );
  filter: blur(2px);
  animation: paintScan 2400ms cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite;
}
@keyframes paintScan {
  0%   { transform: translateX(0) skewX(-6deg); opacity: 0; }
  10%  { opacity: 1; }
  90%  { opacity: 1; }
  100% { transform: translateX(280%) skewX(-6deg); opacity: 0; }
}
/* Subtle olive-ink stipple while waiting */
.paint-canvas:not(.has-preview) .paint-canvas-img {
  filter: grayscale(0.7) brightness(1.05) contrast(1.02);
}
@media (prefers-reduced-motion: reduce) {
  .paint-canvas:not(.has-preview) .paint-scan::before {
    animation: none;
    opacity: 0.18;
  }
}

/* ─── More-styles loading state (3 pulsing dots + cycling narrative) ─── */
.more-styles-loading {
  display: flex !important;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 14px;
  margin-top: 26px;
  padding: 22px 0;
}
.more-loading-dots {
  display: flex;
  gap: 8px;
}
.more-loading-dots span {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--olive, #5a6b3d);
  animation: dotPulse 1400ms cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
.more-loading-dots span:nth-child(2) { animation-delay: 200ms; }
.more-loading-dots span:nth-child(3) { animation-delay: 400ms; }
@keyframes dotPulse {
  0%, 100% { opacity: 0.25; transform: scale(0.8); }
  50%      { opacity: 1;    transform: scale(1.15); }
}
.more-loading-text {
  font-family: var(--serif, "Fraunces", serif);
  font-style: italic;
  font-size: 16px;
  color: var(--ink-3, #4a4036);
  letter-spacing: 0;
  transition: opacity 220ms ease;
}

/* ─── Top-bar promo support (KV-driven) ─── */
.top-bar-content.promo {
  background: var(--olive-dark, #4a5933);
  color: var(--paper, #fdfaf3);
}

/* ============================================================
   2026-05-21 v4 — Cat balance + Pet Morph inspo
   Funnel-step indicator, review summary + histogram, verified
   badge, examples-sub, discount-code UI, promo banner.
   ============================================================ */

/* ─── 3-step funnel indicator (Pet Morph inspo) ─── */
.funnel-steps {
  list-style: none;
  margin: 0 0 16px;
  padding: 14px 16px;
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  background: var(--paper-2, #f4ede0);
  border-radius: 999px;
  align-items: center;
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 12px;
  letter-spacing: 0.04em;
  width: fit-content;
  max-width: 100%;
}
.funnel-step {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--muted, #888);
  white-space: nowrap;
}
.funnel-step + .funnel-step::before {
  content: "›";
  color: var(--muted, #888);
  margin-right: 8px;
  font-size: 16px;
  line-height: 1;
}
.funnel-step.active { color: var(--ink, #1A1814); font-weight: 600; }
.funnel-step-num {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: rgba(26, 24, 20, 0.12);
  color: var(--ink, #1A1814);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 10px;
  font-weight: 600;
  flex-shrink: 0;
}
.funnel-step.active .funnel-step-num {
  background: var(--olive, #5a6b3d);
  color: var(--paper, #fdfaf3);
}
/* On narrow widths the inline pill wraps mid-row and the chevron separator
   hangs at the start of the new line. Stack vertically instead — cleaner
   vertical narrative, calm rounded-rect, no orphan chevrons. */
@media (max-width: 720px) {
  .funnel-steps {
    flex-direction: column;
    align-items: flex-start;
    gap: 8px;
    padding: 14px 16px;
    border-radius: 12px;
    font-size: 12px;
    width: 100%;
    box-sizing: border-box;
  }
  .funnel-step + .funnel-step::before { display: none; }
  .funnel-step { width: 100%; }
  .funnel-step-num { width: 18px; height: 18px; font-size: 9.5px; }
}

/* ─── Examples sub (every-kind-of-pet microline) ─── */
.examples-heading { display: flex; align-items: end; justify-content: space-between; gap: 18px; flex-wrap: wrap; }
.examples-sub {
  font-family: var(--serif, "Fraunces", serif);
  font-style: italic;
  color: var(--ink-3, #4a4036);
  font-size: 15px;
  margin-top: 4px;
  letter-spacing: 0;
}

/* ─── Review summary (score + histogram) ─── */
.review-summary {
  display: grid;
  grid-template-columns: minmax(180px, auto) 1fr;
  gap: 32px;
  align-items: center;
  margin-top: 22px;
  padding: 20px 0;
  border-top: 1px solid var(--line, rgba(26, 24, 20, 0.1));
}
.review-summary-score {
  display: flex;
  flex-direction: column;
  gap: 4px;
  align-items: flex-start;
}
.review-summary-stars {
  color: var(--olive-dark, #4a5933);
  font-size: 18px;
  letter-spacing: 0.1em;
}
.review-summary-score strong {
  font-family: var(--serif, "Fraunces", serif);
  font-size: 44px;
  line-height: 1;
  letter-spacing: -0.02em;
  font-weight: 500;
}
.review-summary-count {
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--muted, #888);
}
.review-histogram {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-width: 360px;
}
.review-histogram li {
  display: grid;
  grid-template-columns: 24px 1fr 38px;
  gap: 10px;
  align-items: center;
  font-size: 12px;
  color: var(--ink-3, #4a4036);
}
.rh-label { font-weight: 500; }
.rh-bar {
  height: 6px;
  background: rgba(26, 24, 20, 0.08);
  border-radius: 999px;
  overflow: hidden;
}
.rh-fill {
  height: 100%;
  background: var(--olive, #5a6b3d);
  border-radius: 999px;
  transition: width 800ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.rh-pct { text-align: right; font-variant-numeric: tabular-nums; color: var(--muted, #888); font-size: 11px; }
@media (max-width: 600px) {
  .review-summary { grid-template-columns: 1fr; gap: 14px; }
  .review-summary-score strong { font-size: 36px; }
}

/* ─── Verified-buyer badge on reviews ─── */
.verified-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 7px;
  font-size: 9px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  background: rgba(90, 107, 61, 0.12);
  color: var(--olive-dark, #4a5933);
  border-radius: 999px;
  margin-left: 6px;
  vertical-align: middle;
  white-space: nowrap;
}

/* ─── Discount code (above the total bar) ─── */
.discount-row {
  margin: 14px 0 10px;
}
.discount-toggle {
  background: transparent;
  border: none;
  padding: 6px 0;
  color: var(--ink-3, #4a4036);
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 12px;
  letter-spacing: 0.04em;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  border-bottom: 1px dashed rgba(26, 24, 20, 0.25);
  transition: color 200ms ease, border-color 200ms ease;
}
.discount-toggle:hover { color: var(--ink, #1A1814); border-bottom-color: var(--ink, #1A1814); }
.discount-toggle-arrow {
  font-size: 14px;
  font-weight: 500;
  width: 14px;
  text-align: center;
}
.discount-input-wrap {
  margin-top: 10px;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 8px;
  align-items: stretch;
}
.discount-input {
  font: inherit;
  padding: 10px 12px;
  border: 1px solid var(--line-strong, rgba(26, 24, 20, 0.18));
  background: #fff;
  border-radius: 2px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-size: 13px;
  color: var(--ink, #1A1814);
}
.discount-input:focus { outline: 2px solid var(--olive, #5a6b3d); outline-offset: 1px; border-color: var(--olive, #5a6b3d); }
.discount-apply {
  background: var(--ink, #1A1814);
  color: var(--paper, #fdfaf3);
  border: none;
  padding: 0 18px;
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-weight: 500;
  cursor: pointer;
  border-radius: 2px;
  transition: opacity 180ms ease;
}
.discount-apply:hover { opacity: 0.88; }
.discount-status {
  grid-column: 1 / -1;
  font-size: 11px;
  margin-top: 4px;
  letter-spacing: 0.02em;
}
.discount-status.ok { color: var(--olive-dark, #4a5933); }
.discount-status.error { color: #8a3a2a; }

/* ─── Top-bar promo banner (when window.OLEA_PROMO is active) ─── */
.top-bar-content.promo {
  background: var(--olive-dark, #4a5933);
  color: var(--paper, #fdfaf3);
  padding: 8px 16px;
  text-align: center;
}
.top-bar-content.promo .promo-banner-text {
  display: inline;
  letter-spacing: 0.1em;
  font-weight: 500;
}
.top-bar-content.promo .promo-banner-text strong {
  background: rgba(253, 250, 243, 0.15);
  padding: 2px 8px;
  border-radius: 2px;
  margin-left: 6px;
  letter-spacing: 0.16em;
}

/* ============================================================
   2026-05-21 v5 — Meta-Ads species landers (/cats /dogs)
   Slim header, hero rating, "back to all pets" link
   ============================================================ */

/* ─── Slim header (no nav — reduces escape routes on paid traffic) ─── */
.topbar.topbar-slim {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-top: 14px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--line, rgba(26, 24, 20, 0.08));
}
.topbar-slim .wordmark { font-size: 22px; }
.topbar-back {
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-3, #4a4036);
  text-decoration: none;
  font-weight: 500;
  transition: color 200ms ease;
}
.topbar-back:hover { color: var(--ink, #1A1814); }

/* ─── Hero rating (above-fold trust signal for Meta traffic) ─── */
.hero-rating {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  background: var(--paper-2, #f4ede0);
  border-radius: 999px;
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 12px;
  letter-spacing: 0.02em;
  color: var(--ink-3, #4a4036);
  width: fit-content;
  margin: -4px 0 4px;
}
.hero-rating-stars { color: var(--olive-dark, #4a5933); font-size: 13px; letter-spacing: 0.04em; }
.hero-rating strong {
  font-family: var(--serif, "Fraunces", serif);
  font-weight: 600;
  font-size: 15px;
  color: var(--ink, #1A1814);
}
.hero-rating-count { color: var(--muted, #888); font-size: 11px; letter-spacing: 0.06em; }

@media (max-width: 600px) {
  .hero-rating { font-size: 11px; padding: 7px 12px; gap: 6px; }
  .hero-rating strong { font-size: 14px; }
  .hero-rating-count { font-size: 10px; }
  .topbar-back { font-size: 10px; }
}

/* ─── Examples-heading layout fix (eyebrow + sub align with link) ─── */
.examples-heading > div { display: flex; flex-direction: column; gap: 4px; }

/* ============================================================
   2026-05-21 v6 — Audit fixes (mobile P0 + a11y + perf)
   Driven by parallel SEO + Mobile + Perf + A11y agent audits.
   ============================================================ */

/* ─── 1. iOS safe-area: sticky CTA must clear the home indicator ─── */
.sticky-cta {
  padding-bottom: calc(12px + env(safe-area-inset-bottom));
}
.sticky-cta-btn {
  margin-bottom: max(0px, env(safe-area-inset-bottom));
}
/* Pad the bottom of the last stage so sticky CTA never overlaps CTA */
.stage[data-stage="hero"],
.stage[data-stage="preview"] {
  padding-bottom: calc(110px + env(safe-area-inset-bottom));
}

/* ─── 2. Funnel-steps mobile: keep horizontal w/ smaller text, no orphans ─── */
@media (max-width: 720px) {
  .funnel-steps {
    flex-direction: row;
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    gap: 6px;
    padding: 10px 14px;
    border-radius: 999px;
    font-size: 11px;
    width: 100%;
    box-sizing: border-box;
    justify-content: flex-start;
  }
  .funnel-steps::-webkit-scrollbar { display: none; }
  .funnel-step {
    flex-shrink: 0;
    width: auto;
    gap: 6px;
  }
  .funnel-step + .funnel-step::before {
    content: "›";
    display: inline-block;
    margin: 0 4px;
    color: var(--muted, #888);
    font-size: 14px;
    line-height: 1;
  }
  .funnel-step-num { width: 18px; height: 18px; font-size: 9.5px; }
  .funnel-step .funnel-step-label { letter-spacing: 0.02em; }
}
@media (max-width: 420px) {
  /* On really narrow screens, hide labels for inactive steps — just numbers + chevrons */
  .funnel-step:not(.active) .funnel-step-label { display: none; }
  .funnel-steps { padding: 9px 12px; }
}

/* ─── 3. Discount input: 16px to prevent iOS auto-zoom on focus ─── */
.discount-input {
  font-size: 16px; /* WAS 13px — caused iOS auto-zoom on focus */
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
/* Visual code-style retained via letter-spacing + uppercase */

/* ─── 4. Tap-target floors: 44×44 minimum (WCAG 2.5.5 / Apple HIG) ─── */
@media (max-width: 720px) {
  .room-mockup-toggle button { min-height: 44px; padding: 0 14px; }
  .discount-toggle { min-height: 44px; padding: 12px 0; }
  .floating-help-btn { min-height: 44px; min-width: 44px; }
  .modal-close { min-height: 44px; min-width: 44px; padding: 8px; }
  .ba-handle { width: 44px; height: 44px; }
}

/* ─── 5. Contrast: tighten muted text to pass WCAG AA (4.5:1 on paper) ─── */
:root {
  --muted: #5e5949;     /* WAS #888 / #7C7666 (3.7:1) → now 4.7:1 on paper */
  --muted-2: #6e6857;   /* WAS #9A9484 (2.6:1) → now 4.5:1 */
  --ink-3: #3e372e;     /* slightly darker for 7+:1 on small text */
}
/* Size-dims and size-popular were 0.6 opacity / 9px white-on-olive — failing AA */
.size-option .size-dims {
  opacity: 1;
  color: var(--ink-3);
  font-size: 10.5px;
}
.size-option.active .size-dims { opacity: 0.85; color: var(--paper); }
.size-popular {
  background: var(--olive-dark, #4a5933);
  color: var(--paper, #fdfaf3);
  font-weight: 600;
}

/* ─── 6. Make demo banner less intrusive on mobile (was eating 32px of fold) ─── */
@media (max-width: 600px) {
  .demo-banner {
    font-size: 10px;
    letter-spacing: 0.06em;
    padding: 4px 12px;
    text-align: center;
  }
  .demo-banner strong { font-size: 10px; }
}

/* ─── 7. Visually-hidden helper (used for skip links + new aria-live region) ─── */
.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ─── 8. Skip link (a11y bypass blocks WCAG 2.4.1) ─── */
.skip-link {
  position: absolute;
  top: 0;
  left: 0;
  background: var(--ink, #1A1814);
  color: var(--paper, #fdfaf3);
  padding: 12px 16px;
  z-index: 9999;
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-decoration: none;
  transform: translateY(-200%);
  transition: transform 200ms ease;
}
.skip-link:focus,
.skip-link:focus-visible {
  transform: translateY(0);
  outline: 2px solid var(--olive, #5a6b3d);
  outline-offset: 0;
}

/* ============================================================
   2026-05-21 v7 — MOBILE FUNNEL P0 FIXES
   Surfaced by Claude Preview walk at iPhone SE (375x667) +
   iPhone 14 Pro (393x852).
   ============================================================ */

/* ─── HERO ORDER on mobile — text + uploader first, image second.
   Was image-first → uploader sat ~850px down on iPhone SE = killed conversion. */
@media (max-width: 920px) {
  .hero {
    /* The grid is already 1fr on this breakpoint. We just need order. */
    grid-auto-flow: row;
  }
  .hero-text { order: 1; }
  .hero-image { order: 2; margin-top: 24px; }
}
@media (max-width: 720px) {
  /* Hero image on mobile — present it as a considered art object, not a
     shrunken thumbnail. Near-full-width with breathing room + paper-edge
     shadow that lifts it off the page like a real print. */
  .hero-image {
    max-width: none;
    margin: 28px 0 8px;
    padding: 0;
  }
  .before-after {
    aspect-ratio: 4 / 5;
    border-radius: 8px;
    overflow: hidden;
    box-shadow:
      0 1px 0 rgba(26, 24, 20, 0.04),
      0 24px 50px -16px rgba(26, 24, 20, 0.28),
      0 8px 18px -8px rgba(26, 24, 20, 0.16);
  }
  .ba-label {
    font-size: 10px;
    padding: 6px 10px;
    letter-spacing: 0.14em;
  }
  .ba-handle {
    width: 48px;
    height: 48px;
    box-shadow: 0 4px 14px rgba(26, 24, 20, 0.28);
  }
  /* Compact top chrome — demo banner + top-bar combined was eating 79px */
  .demo-banner { font-size: 10px; padding: 4px 12px; line-height: 1.35; }
  .top-bar-content { padding: 6px 12px; font-size: 9.5px; letter-spacing: 0.12em; }
  .top-bar-content span { padding: 0 6px; }
  /* Slim header */
  header.topbar { padding-top: 14px; padding-bottom: 14px; }
  .wordmark { font-size: 20px !important; }
  /* Bring eyebrow up — was sitting too far below the top */
  .eyebrow { font-size: 10px; letter-spacing: 0.16em; }
}

/* ─── PREVIEW FRAME — must contain absolutely-positioned mockups.
   The .iphone-mockup uses `position: absolute; inset: 0` so it needs a
   positioned parent with real height. Without this it was stretching to
   the viewport and rendering empty/invisible on mobile. */
.preview-frame {
  position: relative;
  min-height: 0;
}
.preview-frame .room-mockup-toggle,
.preview-frame .frame-caption {
  position: relative;
  z-index: 2;
}
/* The mockup-stage wrapper: every mockup (frame/room/iphone) shares this slot */
.preview-frame > .frame-outer,
.preview-frame > .room-mockup,
.preview-frame > .iphone-mockup {
  width: 100%;
  max-width: 460px;
  aspect-ratio: 3 / 4;
  margin: 0 auto;
}
/* iPhone mockup now uses normal flow (not absolute) so it sits in the
   3:4 slot reliably across all viewports */
.iphone-mockup {
  position: relative;
  inset: auto;
  display: none;
  align-items: center;
  justify-content: center;
}
.iphone-mockup.active { display: flex; }

/* Mobile-specific iPhone frame: tighter, scales with viewport */
@media (max-width: 720px) {
  .preview-frame > .frame-outer,
  .preview-frame > .room-mockup,
  .preview-frame > .iphone-mockup {
    max-width: 86vw;
    aspect-ratio: 3 / 4;
  }
  .iphone-frame {
    width: clamp(180px, 60vw, 240px);
    aspect-ratio: 9 / 19.5;
  }
  .iphone-time { font-size: clamp(36px, 13vw, 52px); }
  .iphone-date { font-size: 12px; }
  .iphone-status { font-size: 10px; }
  /* Tighter mockup-toggle row */
  .room-mockup-toggle { gap: 4px; padding: 4px; }
  .room-mockup-toggle button { font-size: 11px; padding: 0 10px; min-height: 40px; }
}

/* ─── PICKER GRID — orphan 3rd card. Single column on narrow phones. */
@media (max-width: 480px) {
  .style-grid {
    grid-template-columns: 1fr;
    gap: 14px;
  }
  .style-card { width: 100%; }
  .style-card-frame img { aspect-ratio: 4 / 3; }
}

/* ─── Make the uploader more thumb-friendly on narrow mobile ─── */
@media (max-width: 420px) {
  .uploader { padding: 16px 14px; min-height: 84px; }
  .uploader-inner { gap: 12px; }
  .uploader-text strong { font-size: 14px; }
  .uploader-text span { font-size: 11px; }
}

/* ─── Ensure sticky CTA sits ABOVE any z-index stacking from hero ─── */
.sticky-cta { z-index: 100; }

/* ─── Picker/Preview header overflow on mobile.
   The .stepper "01 Photo · 02 Style · 03 Review · 04 Order" overflows the
   wordmark + back-button on narrow mobile. The H1 in each stage already
   tells the user where they are — hide the stepper on mobile. */
@media (max-width: 720px) {
  .topbar .stepper { display: none; }
  /* Preview/picker headers become a clean wordmark + back-button row */
  section[data-stage="picker"] .topbar,
  section[data-stage="preview"] .topbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 12px;
    padding-top: 16px;
    padding-bottom: 16px;
  }
  section[data-stage="picker"] .ghost-btn,
  section[data-stage="preview"] .ghost-btn {
    font-size: 11px;
    letter-spacing: 0.08em;
    padding: 10px 12px;
    min-height: 44px;
  }
}

/* ─── Tighten welcome-back banner on mobile (was eating significant fold) ─── */
@media (max-width: 720px) {
  .welcome-back {
    padding: 14px 16px;
    gap: 10px;
  }
  .welcome-back-text strong { font-size: 14px; }
  .welcome-back-text { font-size: 13px; }
  .welcome-back-actions button { font-size: 13px; padding: 6px 0; }
}

/* ============================================================
   2026-05-21 v8 — PREMIUM EXPERIENCE
   Swift animations · bigger type · loading screens · UGC gallery
   ============================================================ */

/* ─── UGC GALLERY (homepage + landers) ─── */
.ugc-section .section-header { text-align: left; max-width: 720px; }
.ugc-section .examples-sub { margin-top: 6px; }
.ugc-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 260px;
  gap: 14px;
  margin-top: 32px;
}
.ugc-card {
  position: relative;
  margin: 0;
  overflow: hidden;
  background: var(--paper-2, #f4ede0);
  border-radius: 4px;
  transform: rotate(0deg);
  transition: transform 540ms cubic-bezier(0.22, 0.61, 0.36, 1), box-shadow 540ms ease;
  box-shadow: 0 1px 0 rgba(26, 24, 20, 0.04);
}
.ugc-card.ugc-tall { grid-row: span 2; }
.ugc-card img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.ugc-card:hover {
  transform: translateY(-3px) rotate(-0.4deg);
  box-shadow: 0 24px 50px -22px rgba(26, 24, 20, 0.32);
}
.ugc-card:hover img { transform: scale(1.04); }
.ugc-card figcaption {
  position: absolute;
  left: 12px; right: 12px; bottom: 12px;
  padding: 8px 12px;
  background: rgba(253, 250, 243, 0.92);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border-radius: 999px;
  font-family: var(--serif, "Fraunces", serif);
  font-size: 13px;
  font-style: italic;
  color: var(--ink, #1A1814);
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px;
  box-shadow: 0 4px 14px -8px rgba(26, 24, 20, 0.25);
}
.ugc-card figcaption span {
  font-family: var(--sans, "Inter", sans-serif);
  font-style: normal;
  font-size: 10px;
  letter-spacing: 0.1em;
  color: var(--ink-3, #4a4036);
  text-transform: uppercase;
  font-weight: 500;
  white-space: nowrap;
}
@media (max-width: 900px) {
  /* Tablet: 3-col, taller rows so the 1:1 source photos aren't squashed */
  .ugc-grid { grid-template-columns: repeat(3, 1fr); grid-auto-rows: auto; gap: 12px; }
  .ugc-card { aspect-ratio: 1 / 1; }
  .ugc-card.ugc-tall { aspect-ratio: 1 / 2; grid-row: span 2; }
}
@media (max-width: 600px) {
  /* Mobile: source photos are 1:1 squares — let each cell render at 1:1
     instead of forcing a 180px fixed height that squashed them. */
  .ugc-grid { grid-template-columns: repeat(2, 1fr); grid-auto-rows: auto; gap: 10px; }
  .ugc-card { aspect-ratio: 1 / 1; }
  .ugc-card.ugc-tall { aspect-ratio: 1 / 2; grid-row: span 2; }
  .ugc-card figcaption {
    font-size: 11px;
    padding: 6px 10px;
    left: 8px;
    right: 8px;
    bottom: 8px;
    /* Mobile captions stack name below quote for legibility */
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
  }
  .ugc-card figcaption span { font-size: 9px; }
}

/* ─── PURCHASE-MOMENT UGC strip (preview stage, right above CTA) ─── */
.purchase-ugc {
  margin: 18px 0 16px;
  padding: 16px;
  background: var(--paper-2, #f4ede0);
  border-radius: 6px;
}
.purchase-ugc-label {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 10px;
}
.purchase-ugc-label::before,
.purchase-ugc-label::after {
  content: "";
  flex: 1;
  height: 1px;
  background: rgba(26, 24, 20, 0.12);
}
.purchase-ugc-label span {
  font-family: var(--sans, "Inter", sans-serif);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--olive-dark, #4a5933);
}
.purchase-ugc-strip {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 6px;
}
.purchase-ugc-thumb {
  position: relative;
  overflow: hidden;
  aspect-ratio: 1 / 1;
  border-radius: 4px;
  background: var(--paper, #fdfaf3);
  transition: transform 320ms ease;
}
.purchase-ugc-thumb img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.purchase-ugc-thumb:hover { transform: scale(1.06); z-index: 2; box-shadow: 0 10px 24px -10px rgba(26, 24, 20, 0.28); }
.purchase-ugc-caption {
  margin-top: 10px;
  text-align: center;
  font-family: var(--serif, "Fraunces", serif);
  font-style: italic;
  font-size: 12px;
  color: var(--ink-3, #4a4036);
}
.purchase-ugc-meta {
  font-family: var(--sans, "Inter", sans-serif);
  font-style: normal;
  font-size: 10px;
  letter-spacing: 0.08em;
  color: var(--muted, #5e5949);
  margin-left: 4px;
}
@media (max-width: 720px) {
  .purchase-ugc { padding: 12px; margin: 14px 0; }
  .purchase-ugc-strip { gap: 5px; }
  .purchase-ugc-caption { font-size: 11px; }
}

/* ─── BIGGER, MORE CONFIDENT TYPE (desktop + mobile) ─── */
.display {
  font-size: clamp(40px, 6.8vw, 96px);
  line-height: 0.98;
  letter-spacing: -0.025em;
}
.display em {
  font-weight: 400;
  letter-spacing: -0.02em;
}
@media (min-width: 1100px) {
  .lede { font-size: 19px; line-height: 1.5; }
}
@media (min-width: 1400px) {
  .display { font-size: 104px; }
  .lede { font-size: 21px; }
}
.section h2,
.section-header h2,
.examples-heading h2 {
  font-size: clamp(28px, 4.2vw, 56px);
  line-height: 1.05;
  letter-spacing: -0.018em;
}
.cta-section h2 {
  font-size: clamp(32px, 5vw, 72px);
}

/* ─── HERO ENTRANCE ANIMATION — calm, considered, premium ─── */
.stage[data-stage="hero"] .hero-text > * {
  animation: heroFadeUp 720ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
.stage[data-stage="hero"] .hero-text > *:nth-child(1) { animation-delay: 80ms; }
.stage[data-stage="hero"] .hero-text > *:nth-child(2) { animation-delay: 200ms; }
.stage[data-stage="hero"] .hero-text > *:nth-child(3) { animation-delay: 320ms; }
.stage[data-stage="hero"] .hero-text > *:nth-child(4) { animation-delay: 440ms; }
.stage[data-stage="hero"] .hero-text > *:nth-child(5) { animation-delay: 560ms; }
.stage[data-stage="hero"] .hero-text > *:nth-child(6) { animation-delay: 680ms; }
.stage[data-stage="hero"] .hero-image {
  animation: heroFadeUp 1000ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
  animation-delay: 240ms;
}
@keyframes heroFadeUp {
  0%   { opacity: 0; transform: translateY(14px); }
  100% { opacity: 1; transform: translateY(0); }
}

/* ─── SCROLL-TRIGGERED REVEAL (no JS — uses IntersectionObserver via JS hook) ─── */
.reveal {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 720ms cubic-bezier(0.22, 0.61, 0.36, 1), transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.reveal.in-view {
  opacity: 1;
  transform: translateY(0);
}

/* ─── PREMIUM CTA — depth, glow, press-down ─── */
.cta-btn, .cta-section-cta, .sticky-cta-btn {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}
.cta-btn::before, .cta-section-cta::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(255,255,255,0.16), transparent 60%);
  opacity: 0;
  transition: opacity 320ms ease;
  pointer-events: none;
  z-index: -1;
}
.cta-btn:hover::before, .cta-section-cta:hover::before { opacity: 1; }
.cta-btn:active, .cta-section-cta:active, .sticky-cta-btn:active {
  transform: translateY(1px) scale(0.99);
}

/* ─── LOADING SCREEN — full-page initial paint, then fades ─── */
.app-boot-screen {
  position: fixed;
  inset: 0;
  z-index: 9999;
  background: var(--paper, #fdfaf3);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 24px;
  pointer-events: none;
  animation: bootFadeOut 360ms ease 700ms forwards;
}
.app-boot-screen .boot-mark {
  font-family: var(--serif, "Fraunces", serif);
  font-style: italic;
  font-size: clamp(28px, 5vw, 44px);
  font-weight: 500;
  color: var(--ink, #1A1814);
  letter-spacing: -0.015em;
  animation: bootMarkIn 540ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
.app-boot-screen .boot-mark em { color: var(--olive-dark, #4a5933); font-style: italic; }
.app-boot-screen .boot-bar {
  width: 120px;
  height: 2px;
  background: rgba(26, 24, 20, 0.08);
  overflow: hidden;
  border-radius: 999px;
}
.app-boot-screen .boot-bar::after {
  content: "";
  display: block;
  height: 100%;
  width: 40%;
  background: var(--olive, #5a6b3d);
  animation: bootBar 900ms cubic-bezier(0.5, 0, 0.5, 1) infinite;
}
@keyframes bootMarkIn {
  0%   { opacity: 0; transform: translateY(8px); }
  100% { opacity: 1; transform: translateY(0); }
}
@keyframes bootBar {
  0%   { transform: translateX(-100%); }
  100% { transform: translateX(350%); }
}
@keyframes bootFadeOut {
  0%   { opacity: 1; pointer-events: all; }
  100% { opacity: 0; pointer-events: none; visibility: hidden; }
}
@media (prefers-reduced-motion: reduce) {
  .app-boot-screen { animation: bootFadeOut 0ms ease 0ms forwards; }
  .stage[data-stage="hero"] .hero-text > *,
  .stage[data-stage="hero"] .hero-image { animation: none; }
}

/* ─── BIG TIER PICKER (preview stage) — bolder presence ─── */
.size-option {
  padding: 20px 14px !important;
  border-width: 1.5px;
  border-radius: 6px;
}
.size-name { font-size: 22px !important; }
.size-option.active { transform: scale(1.02); }

/* ─── CHECKOUT button: hero of the preview stage ─── */
#checkout-btn {
  font-size: clamp(15px, 2.2vw, 17px);
  padding: 20px 28px;
  min-height: 64px;
  border-radius: 8px;
  letter-spacing: 0.01em;
  background: linear-gradient(180deg, var(--ink, #1A1814) 0%, #0f0d0a 100%);
  box-shadow: 0 16px 36px -16px rgba(26, 24, 20, 0.45);
}
#checkout-btn:hover {
  box-shadow: 0 22px 44px -16px rgba(26, 24, 20, 0.55);
}

/* ─── MODAL polish: backdrop blur + scale-in entrance ─── */
.modal-backdrop.open {
  backdrop-filter: blur(6px) saturate(120%);
  -webkit-backdrop-filter: blur(6px) saturate(120%);
  background: rgba(26, 24, 20, 0.42);
}
.modal-backdrop.open .modal {
  animation: modalScaleIn 360ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
@keyframes modalScaleIn {
  0%   { opacity: 0; transform: translateY(12px) scale(0.96); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* ─── UGC section on mobile: ensure visual weight matches the social proof job ─── */
@media (max-width: 600px) {
  .ugc-section { padding-bottom: 24px; }
  .ugc-section h2 { font-size: 32px; }
}

/* ─── Wordmark micro-polish ─── */
.wordmark a {
  background-image: linear-gradient(to right, var(--olive-dark, #4a5933), var(--olive-dark, #4a5933));
  background-size: 0 1px;
  background-position: 0 90%;
  background-repeat: no-repeat;
  transition: background-size 320ms ease;
}
.wordmark a:hover { background-size: 100% 1px; }

/* ─── Subtle reading-rhythm: every 2nd section gets a tiny tonal lift on desktop ─── */
@media (min-width: 1100px) {
  .section:nth-of-type(even) { padding-top: 80px; padding-bottom: 80px; }
}


/* ---------- v15 — Delivery email preview on thanks page ---------- */
.email-preview-card {
  margin: 28px 0 0;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--paper);
  overflow: hidden;
}
.email-preview-card[open] {
  background: var(--paper-2);
}
.email-preview-card summary {
  display: grid;
  gap: 4px;
  padding: 14px 18px;
  cursor: pointer;
  list-style: none;
}
.email-preview-card summary::-webkit-details-marker { display: none; }
.email-preview-label {
  font-family: var(--sans);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--ink);
}
.email-preview-meta {
  font-size: 12px;
  color: var(--muted);
}
.email-preview-body {
  padding: 0 18px 22px;
}
.email-preview-frame {
  background: #fff;
  border-radius: var(--radius);
  border: 1px solid var(--line);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  margin-top: 6px;
}
.email-preview-meta-row {
  display: grid;
  gap: 4px;
  padding: 12px 16px;
  background: var(--paper-2);
  border-bottom: 1px solid var(--line);
  font-family: var(--sans);
  font-size: 11px;
  color: var(--muted);
  letter-spacing: 0.02em;
}
.email-preview-meta-row strong { color: var(--ink-3); font-weight: 600; margin-right: 4px; }
.email-preview-inner {
  padding: 28px 26px 32px;
  background: var(--paper);
  font-family: var(--sans);
  color: var(--ink-2);
  line-height: 1.55;
}
.email-preview-inner .email-eyebrow {
  font-family: var(--serif);
  font-size: 12px;
  letter-spacing: 0.08em;
  color: var(--accent);
  text-transform: uppercase;
  margin: 0 0 14px;
}
.email-preview-inner .email-greeting {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 22px;
  letter-spacing: -0.015em;
  margin: 0 0 12px;
  color: var(--ink);
}
.email-preview-inner .email-headline {
  font-family: var(--serif);
  font-style: italic;
  font-size: 18px;
  color: var(--ink-2);
  margin: 18px 0 10px;
}
.email-preview-inner .email-body {
  font-size: 14px;
  margin: 0 0 18px;
}
.email-preview-inner .email-cta {
  display: inline-block;
  background: var(--ink);
  color: var(--paper);
  padding: 12px 22px;
  text-decoration: none;
  border-radius: var(--radius);
  font-weight: 600;
  letter-spacing: 0.04em;
  font-size: 12px;
}
.email-preview-inner .email-wallpaper-list {
  padding-left: 18px;
  margin: 0 0 18px;
  font-size: 13px;
}
.email-preview-inner .email-wallpaper-list li { margin: 4px 0; }
.email-preview-inner .email-wallpaper-list a { color: var(--accent); }
.email-preview-inner .email-closer {
  font-size: 12px;
  color: var(--muted);
  margin: 22px 0 6px;
}
.email-preview-inner .email-signoff {
  font-size: 12px;
  color: var(--muted);
  margin: 14px 0 0;
}

/* ---------- v15 — Wallpaper bundle on the thanks page ---------- */
.wallpaper-bundle {
  margin: 32px 0 8px;
  padding: clamp(20px, 3vw, 32px);
  background: rgba(199, 203, 179, 0.18);
  border-radius: var(--radius-lg);
  border: 1px solid var(--line);
}
.wallpaper-bundle-header {
  text-align: center;
  margin-bottom: 24px;
}
.wallpaper-bundle-header .eyebrow { margin-bottom: 8px; }
.wallpaper-bundle-header h3 {
  font-family: var(--serif);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(22px, 2.4vw, 28px);
  letter-spacing: -0.015em;
  color: var(--ink);
  margin: 0 0 6px;
}
.wallpaper-bundle-header p {
  font-size: 14px;
  color: var(--ink-3);
  margin: 0;
  max-width: 48ch;
  margin-inline: auto;
}
.wallpaper-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
}
.wallpaper-link {
  display: grid;
  grid-template-rows: auto auto auto;
  gap: 10px;
  padding: 14px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 240ms ease, transform 240ms ease, box-shadow 240ms ease;
  text-align: center;
}
.wallpaper-link:hover {
  border-color: var(--ink);
  transform: translateY(-2px);
  box-shadow: var(--shadow-sm);
}
.wallpaper-preview {
  display: block;
  margin: 0 auto;
  background: var(--ink);
  border-radius: 4px;
  overflow: hidden;
  width: 100%;
  max-width: 120px;
  aspect-ratio: 9 / 16;
}
.wallpaper-preview img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.wallpaper-preview-ipad        { aspect-ratio: 3 / 4; max-width: 130px; }
.wallpaper-preview-lock-screen { aspect-ratio: 1 / 1; max-width: 110px; }
.wallpaper-preview-watch       { aspect-ratio: 1 / 1.2; max-width: 70px; border-radius: 16px; }
.wallpaper-label {
  font-size: 12px;
  letter-spacing: 0.04em;
  font-weight: 600;
  color: var(--ink-2);
}
.wallpaper-cta {
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--olive-dark);
  font-weight: 600;
}
@media (max-width: 720px) {
  .wallpaper-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; }
  .wallpaper-link { padding: 12px; gap: 8px; }
}

/* ---------- v15 — Style card hover: photo swap on the picker ---------- */
/* The picker cards already crossfade on selection; this adds a tiny zoom +
   subtle desaturation on hover so the gallery feels alive. */
.style-card { transition: transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1); }
.style-card-frame img {
  transition: transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1),
              filter 280ms ease-out;
}
@media (hover: hover) {
  .style-card:not(.failed):hover .style-card-frame img {
    transform: scale(1.04);
    filter: brightness(1.03) saturate(1.05);
  }
}

/* ---------- v15 — Process card hover lift ---------- */
.process-card {
  transition: transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1),
              box-shadow 320ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.process-image { overflow: hidden; }
.process-image img {
  transition: transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
@media (hover: hover) {
  .process-card:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-md);
  }
  .process-card:hover .process-image img { transform: scale(1.05); }
}

/* ---------- v14 — Scroll-triggered reveal pattern ---------- */
/* Apply `data-reveal` to any element to fade-and-lift into view as it enters
   the viewport. JS adds `data-revealed="true"` once IntersectionObserver
   crosses the threshold. Optional `data-reveal-delay="ms"` for stagger. */
[data-reveal] {
  opacity: 0;
  transform: translateY(18px);
  transition:
    opacity 720ms cubic-bezier(0.22, 0.61, 0.36, 1),
    transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1);
  will-change: opacity, transform;
}
[data-reveal][data-revealed="true"] {
  opacity: 1;
  transform: translateY(0);
}
[data-reveal="fade"] {
  transform: none;
}
[data-reveal="left"] {
  transform: translateX(-18px);
}
[data-reveal="left"][data-revealed="true"] {
  transform: translateX(0);
}
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { opacity: 1 !important; transform: none !important; transition: none !important; }
}

/* ---------- v14 — Animated funnel steps (1 → 2 → 3) ---------- */
.funnel-step {
  opacity: 0;
  transform: translateY(8px);
  transition:
    opacity 540ms cubic-bezier(0.22, 0.61, 0.36, 1),
    transform 540ms cubic-bezier(0.22, 0.61, 0.36, 1),
    background 240ms ease;
}
.funnel-step.funnel-step-revealed {
  opacity: 1;
  transform: translateY(0);
}
.funnel-step .funnel-step-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--paper-2);
  color: var(--muted);
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 600;
  margin-right: 8px;
  transition: background 360ms ease, color 360ms ease, transform 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.funnel-step.funnel-step-revealed .funnel-step-num {
  background: var(--olive);
  color: var(--paper);
  transform: scale(1.08);
}
.funnel-step.funnel-step-revealed.active .funnel-step-num {
  background: var(--ink);
  transform: scale(1.12);
}

/* ---------- v14 — Magnetic CTA hover ---------- */
@media (hover: hover) {
  .cta-btn, .cta-section-cta, .hero-chip {
    will-change: transform;
  }
}

/* ---------- About-page founder signature (P2 E-E-A-T) ---------- */
.signed-off {
  margin-top: 32px;
  padding-top: 22px;
  border-top: 1px solid var(--line);
  display: grid;
  gap: 4px;
}
.signed-off .signature {
  font-family: var(--serif);
  font-style: italic;
  font-size: 22px;
  color: var(--ink);
  font-variation-settings: "opsz" 48;
}
.signed-off .signature-detail {
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--muted);
}

/* ---------- /refunds.html legal layout (moved from inline style, P1 C3) ---------- */
.legal { max-width: 720px; margin: 0 auto; padding: clamp(40px, 6vw, 80px) var(--pad); }
.legal-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding-bottom: 28px;
  border-bottom: 1px solid var(--line);
  margin-bottom: clamp(40px, 5vw, 56px);
}
.legal h1 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(40px, 6vw, 64px);
  line-height: 1.0;
  letter-spacing: -0.025em;
  margin: 0 0 8px;
  font-variation-settings: "opsz" 144;
}
.legal h1 em { font-style: italic; color: var(--olive-dark); }
.legal .sub {
  font-family: var(--sans);
  color: var(--muted);
  margin: 0 0 56px;
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}
.legal h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(22px, 2.6vw, 28px);
  margin: 48px 0 14px;
  letter-spacing: -0.015em;
  line-height: 1.15;
}
.legal h2::before {
  content: counter(section, upper-roman) ".  ";
  color: var(--olive);
  font-style: italic;
  font-weight: 400;
}
.legal { counter-reset: section; }
.legal h2 { counter-increment: section; }
.legal p, .legal li {
  font-family: var(--sans);
  font-size: 16px;
  line-height: 1.65;
  color: var(--ink-2);
}
.legal p { margin-bottom: 14px; }
.legal strong { color: var(--ink); font-weight: 600; }
.legal ul { padding-left: 0; list-style: none; margin: 16px 0; }
.legal ul li {
  position: relative;
  padding-left: 22px;
  margin-bottom: 10px;
}
.legal ul li::before {
  content: "·";
  position: absolute;
  left: 6px;
  top: 0;
  color: var(--olive);
  font-family: var(--serif);
  font-size: 1.4em;
  line-height: 1.65;
}
.legal ul li a {
  word-break: break-word;
  overflow-wrap: anywhere;
}
.legal .callout {
  background: var(--paper-2);
  padding: 22px 26px;
  margin: 28px 0;
  border-left: 3px solid var(--olive);
  font-family: var(--serif);
  font-style: italic;
  font-size: 17px;
  line-height: 1.55;
  color: var(--ink-2);
}
.legal .callout strong {
  display: block;
  margin-bottom: 6px;
  font-style: normal;
  font-family: var(--sans);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--olive-dark);
}
.legal .intro {
  font-family: var(--serif);
  font-size: clamp(18px, 1.8vw, 22px);
  line-height: 1.5;
  color: var(--ink-2);
  font-variation-settings: "opsz" 48;
  max-width: 56ch;
  margin-bottom: 16px;
}

/* ============================================================
   TRUST STRIP — the four objection-killer lines under the hero
   subhead, above the fold. Added 2026-05-23 from v2 audit C2
   §LAST items 2+4 (W&W "We accept 98%", Pet Canvas "no login",
   Pop Your Pup "full refund", brand non-negotiable #4 honest-AI).
   ============================================================ */
.trust-strip {
  list-style: none;
  padding: 14px 16px;
  margin: 18px 0 4px;
  display: grid;
  grid-template-columns: 1fr;
  gap: 6px 14px;
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 6px;
  font-size: 13.5px;
  line-height: 1.5;
  color: var(--ink-2);
  font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
}
@media (min-width: 720px) {
  .trust-strip { grid-template-columns: 1fr 1fr; padding: 16px 18px; }
}
.trust-strip li {
  display: flex;
  align-items: baseline;
  gap: 8px;
}
.trust-mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 16px;
  height: 16px;
  border-radius: 999px;
  background: var(--olive);
  color: var(--paper);
  font-size: 10px;
  font-weight: 600;
  line-height: 1;
  transform: translateY(2px);
}
/* Visually subordinate the older 3-icon reassurance strip on
   pages where the new trust strip is present. The aria-hidden
   markup keeps both off the a11y tree double-read. */
.trust-strip + .reassurance.trust-row {
  font-size: 12px;
  color: var(--muted);
  border-top: 1px dashed var(--line);
  padding-top: 12px;
  margin-top: 12px;
}

/* ============================================================
   MEMORIAL FLOW — scoped to body[data-flow="memorial"]. Added
   2026-05-23 from v2 audit A2 §6 + A3 §3. Implements the spec
   variant the brand binder promised but production never built.
   ============================================================ */
:root {
  --leading-grief: 1.75;
  --paragraph-grief: 32px;
}
body[data-flow="memorial"] .wordmark .amp {
  color: var(--clay);
}
body[data-flow="memorial"] p,
body[data-flow="memorial"] .lede,
body[data-flow="memorial"] .review-body,
body[data-flow="memorial"] .faq-answer {
  line-height: var(--leading-grief);
  text-wrap: pretty;
}
body[data-flow="memorial"] h1,
body[data-flow="memorial"] h2,
body[data-flow="memorial"] h3 {
  text-wrap: balance;
}
body[data-flow="memorial"] .section + .section,
body[data-flow="memorial"] .story-text > p + p {
  margin-top: var(--paragraph-grief);
}
/* Suppress noisy chrome on memorial pages. The demo banner is
   removed from the markup entirely; floating help + consent
   banner are toggled in JS but we belt-and-brace via CSS. */
body[data-flow="memorial"] .demo-banner,
body[data-flow="memorial"] .floating-help,
body[data-flow="memorial"] .oh-consent-banner {
  display: none !important;
}

/* ============================================================
   CONVERSION PASS — 2026-05-23
   Honest stars + intent pill + guarantee + founder sig +
   compare table + pay row.
   ============================================================ */

/* ----- Intent pill (For me · As a gift · In memory) -----
   Placed above the hero eyebrow. Segments visitor intent early
   without a hard route change. The "memorial" tab triggers the
   ?intent=memorial flow on the next user action. */
.intent-pill {
  display: inline-flex;
  gap: 0;
  padding: 4px;
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 999px;
  margin-bottom: 18px;
  font-family: var(--sans, "Inter", system-ui, sans-serif);
}
.intent-pill-btn {
  background: transparent;
  border: 0;
  padding: 8px 16px;
  border-radius: 999px;
  font-size: 12.5px;
  letter-spacing: 0.04em;
  color: var(--ink-3);
  cursor: pointer;
  transition: background 200ms cubic-bezier(0.22, 0.61, 0.36, 1),
              color 200ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.intent-pill-btn:hover { color: var(--ink); }
.intent-pill-btn.active {
  background: var(--ink);
  color: var(--paper);
  font-weight: 500;
}
.intent-pill-btn:focus-visible {
  outline: 2px solid var(--olive);
  outline-offset: 2px;
}

/* Inline feedback line that appears directly under the intent pill on click —
   confirms the choice in plain language so the pill never feels inert. */
.intent-pill-feedback {
  margin: -6px 0 14px;
  font-size: 13px;
  line-height: 1.55;
  letter-spacing: 0.01em;
  color: var(--olive-dark);
  font-style: italic;
  opacity: 0;
  max-height: 0;
  overflow: hidden;
  transition: opacity 220ms ease, max-height 260ms ease;
}
.intent-pill-feedback.visible {
  opacity: 1;
  max-height: 80px;
  margin: 6px 0 16px;
}
.intent-pill-feedback.intent-memorial {
  color: var(--ink-2, var(--ink));
}

/* ----- Guarantee badge (likeness promise above the fold) ----- */
.guarantee-badge {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  margin: 14px 0 4px;
  background: var(--paper);
  border: 1px solid var(--olive);
  border-radius: 6px;
  box-shadow: var(--shadow-xs, 0 1px 2px rgba(26,24,20,0.06));
}
.guarantee-mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  border-radius: 999px;
  background: var(--olive);
  color: var(--paper);
}
.guarantee-text {
  display: flex;
  flex-direction: column;
  gap: 2px;
  line-height: 1.4;
}
.guarantee-text strong {
  font-family: var(--serif, "Fraunces", Georgia, serif);
  font-style: italic;
  font-weight: 400;
  font-size: 16px;
  color: var(--ink);
}
.guarantee-text span {
  font-size: 12.5px;
  color: var(--muted);
  letter-spacing: 0.02em;
}

/* ----- Founder signature row ----- */
.founder-sig {
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
  padding: 10px 2px 4px;
  font-size: 12.5px;
  color: var(--muted);
  line-height: 1.5;
}
.founder-sig-name {
  font-family: var(--serif, "Fraunces", Georgia, serif);
  font-size: 15px;
  color: var(--ink-2);
}

/* ----- Pilot rating block (reviews page hero) ----- */
.pilot-rating-block {
  display: grid;
  grid-template-columns: 1fr;
  gap: 18px;
  padding-top: 8px;
  max-width: 640px;
}
@media (min-width: 720px) {
  .pilot-rating-block { grid-template-columns: 1fr 1fr; gap: 32px; align-items: center; }
}
.pilot-rating-summary { display: flex; flex-direction: column; gap: 6px; }
.pilot-stars {
  font-size: 26px;
  color: var(--olive);
  letter-spacing: 4px;
  line-height: 1;
}
.pilot-score {
  display: flex;
  align-items: baseline;
  gap: 6px;
  font-family: var(--serif, "Fraunces", Georgia, serif);
  font-weight: 500;
  font-size: 44px;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--ink);
}
.pilot-score-out { font-size: 18px; color: var(--muted); font-weight: 400; }
.pilot-meta { font-size: 13px; color: var(--ink-3); line-height: 1.45; }
.pilot-meta-detail { display: block; color: var(--muted); font-size: 12px; margin-top: 2px; }
.review-summary-pilot-note {
  display: block;
  margin-top: 2px;
  font-size: 11.5px;
  font-style: italic;
  color: var(--muted);
}

/* ----- Compare table (vs typical alternative) ----- */
.compare-section { padding: clamp(40px, 6vw, 80px) 0; }
.compare-table {
  display: grid;
  gap: 0;
  border: 1px solid var(--line-strong);
  border-radius: 8px;
  overflow: hidden;
  background: var(--paper);
  max-width: 880px;
  margin: 0 auto;
  font-feature-settings: "kern" 1, "liga" 1;
}
.compare-row {
  display: grid;
  grid-template-columns: 1.2fr 1.4fr 1.4fr;
  align-items: center;
  padding: 14px 18px;
  border-bottom: 1px solid var(--line);
  font-size: 14px;
  line-height: 1.5;
  gap: 12px;
}
.compare-row:last-child { border-bottom: 0; }
.compare-row [role="rowheader"] {
  font-family: var(--serif, "Fraunces", Georgia, serif);
  font-style: italic;
  color: var(--ink-2);
  font-size: 15px;
}
.compare-row [role="cell"]:first-of-type { color: var(--ink); }
.compare-row [role="cell"]:last-of-type { color: var(--muted); text-decoration: line-through; text-decoration-color: var(--line-strong); }
.compare-row-head {
  background: var(--paper-2);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
  padding: 12px 18px;
}
.compare-row-head .compare-us { color: var(--olive-dark); font-weight: 600; }
.compare-row-head .compare-them { color: var(--ink-3); }
@media (max-width: 640px) {
  .compare-row {
    grid-template-columns: 1fr;
    gap: 4px;
    padding: 12px 14px;
  }
  .compare-row [role="cell"]:last-of-type { font-size: 12.5px; }
}

/* ----- Payment row (Apple Pay / Google Pay / Card / Link) ----- */
.pay-row {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: 8px 14px;
  margin: 12px 0 0;
  padding: 0;
  font-size: 11.5px;
  letter-spacing: 0.04em;
  color: var(--muted);
  align-items: center;
}
.pay-row li {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.pay-pill {
  display: inline-block;
  width: 22px;
  height: 14px;
  border-radius: 3px;
  background: var(--paper-2);
  border: 1px solid var(--line);
}
.pay-pill.pay-apple   { background: #1A1814; }
.pay-pill.pay-google  { background: linear-gradient(90deg,#4285F4 0 25%,#34A853 25% 50%,#FBBC05 50% 75%,#EA4335 75% 100%); border-color: transparent; }
.pay-pill.pay-card    { background: linear-gradient(135deg,#5A6740,#3F4828); }
.pay-pill.pay-link    { background: #2EC987; }
.pay-row-secure { color: var(--ink-3); font-weight: 500; }


/* ============================================================
   PILOT STAT ROW — three big numbers (matches the impact of the
   prior fabricated stat block, anchored to the 12 pilot reviews
   that are actually on the page). Added 2026-05-23.
   ============================================================ */
.pilot-stat-row {
  list-style: none;
  margin: 0 0 24px;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 22px;
  max-width: 720px;
}
@media (min-width: 720px) {
  .pilot-stat-row { grid-template-columns: repeat(3, 1fr); gap: 32px; align-items: end; }
}
.pilot-stat-row > li {
  border-bottom: 1px solid var(--line);
  padding-bottom: 16px;
}
.pilot-stat-num {
  font-family: var(--serif, "Fraunces", Georgia, serif);
  font-weight: 500;
  font-size: 48px;
  line-height: 1;
  letter-spacing: -0.025em;
  color: var(--ink);
  display: flex;
  align-items: baseline;
  gap: 6px;
  margin-bottom: 6px;
  font-feature-settings: "tnum" 1, "lnum" 1;
}
.pilot-stat-out, .pilot-stat-pct {
  font-size: 22px;
  font-weight: 400;
  color: var(--muted);
}
.pilot-stat-pct { color: inherit; }
.pilot-stat-label {
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--muted);
}
.pilot-rating-block .pilot-stars {
  font-size: 22px;
  letter-spacing: 4px;
  color: var(--olive);
  line-height: 1;
  margin-bottom: 8px;
}
.pilot-rating-foot {
  display: grid;
  gap: 14px;
  max-width: 720px;
}
.pilot-trustpilot-note {
  margin: 0;
  font-size: 12.5px;
  line-height: 1.55;
  color: var(--muted);
}
.pilot-trustpilot-link {
  display: inline-block;
  margin-left: 6px;
  color: var(--olive-dark);
  text-decoration: underline;
  text-underline-offset: 3px;
  font-weight: 500;
}
.pilot-trustpilot-link:hover { color: var(--ink); }

/* ============================================================
   EXIT-INTENT MODAL — Founders' Circle invitation. Brand-safe
   abandoner capture. Inherits .modal-backdrop / .modal styling
   from the existing email-modal but layers a clay accent + perks
   list to signal "this is the invitation, not the upsell."
   ============================================================ */
.exit-modal-card {
  border-top: 4px solid var(--clay);
  padding-top: 28px;
}
.exit-modal-eyebrow {
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--clay);
  margin-bottom: 14px;
  font-weight: 500;
}
.exit-modal-title {
  font-family: var(--serif, "Fraunces", Georgia, serif);
  font-weight: 400;
  font-size: clamp(24px, 3.4vw, 30px);
  line-height: 1.1;
  letter-spacing: -0.015em;
  margin: 0 0 12px;
  color: var(--ink);
}
.exit-modal-title em { font-style: italic; color: var(--clay); }
.exit-modal-lede {
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--ink-3);
  margin: 0 0 18px;
}
.exit-modal-lede strong { color: var(--ink); font-weight: 600; }
.exit-modal-perks {
  list-style: none;
  margin: 18px 0 12px;
  padding: 14px 16px;
  background: var(--paper-2);
  border-radius: 4px;
  font-size: 12.5px;
  color: var(--ink-2);
  line-height: 1.55;
}
.exit-modal-perks li {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 4px 0;
}
.exit-modal-perks li span {
  color: var(--olive);
  font-weight: 600;
  flex-shrink: 0;
  width: 14px;
}

/* ============================================================
   IMAGE SAFETY RULE — anti-squash policy
   ------------------------------------------------------------
   Sets a defensive default for every <img> on the site: if a
   layout sets `width: 100%` without an explicit aspect-ratio
   constraint, the image renders at its NATURAL aspect ratio
   instead of being stretched. Forced aspect-ratio + object-fit:
   cover is opt-in via the `.img-cropped` helper class below.
   This stops the /styles squash regression from ever happening
   again across new pages or new components.
   ============================================================ */
img {
  /* Preserve native pixel proportions unless explicitly overridden. */
  height: auto;
  max-width: 100%;
}

/* Opt-in helper for places that genuinely want a forced-shape thumbnail
   (e.g. avatar squares, fixed-height carousel cards). */
.img-cropped {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Helper for the rare case where we DO want object-fit: contain in a
   forced box without squashing — e.g. a 4:5 mat behind a 1:1 portrait. */
.img-letterbox {
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: var(--paper-2);
}

/* ============================================================
   ULTRA-INTERACTIVE IMAGERY — supporting styles
   Effects driven by /interactive.js. All graceful-degrade when
   prefers-reduced-motion is enabled (the JS short-circuits).
   ============================================================ */

/* Flip-hint badge on the style page primary portrait */
.style-flip-hint {
  position: absolute;
  bottom: 14px;
  right: 14px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  background: rgba(26, 24, 20, 0.78);
  color: var(--paper);
  border: 0;
  border-radius: 999px;
  font-family: var(--sans, "Inter", system-ui, sans-serif);
  font-size: 11.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  cursor: pointer;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  transition: transform 200ms ease, background 200ms ease;
  z-index: 3;
  box-shadow: 0 4px 14px rgba(26,24,20,0.18);
}
.style-flip-hint:hover {
  background: var(--ink);
  transform: translateY(-1px);
}
.style-flip-hint-icon {
  display: inline-block;
  transition: transform 400ms ease;
  font-size: 14px;
  line-height: 1;
}
.style-flip-hint:hover .style-flip-hint-icon {
  transform: rotate(180deg);
}

/* Make sure style-feature-primary acts as a positioning context for the hint
   and the cursor: pointer interaction signals interactivity. */
.style-feature-primary {
  position: relative;
}
.style-feature-primary img {
  transition: opacity 280ms ease, transform 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* Cursor-spotlight gradient layer on CTA section. The --spot-x/y vars are
   updated by JS; falls back to a centred radial gradient if no JS. */
.cta-section {
  position: relative;
  overflow: hidden;
  --spot-x: 50%;
  --spot-y: 50%;
}
.cta-section::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    circle at var(--spot-x) var(--spot-y),
    rgba(156, 74, 42, 0.16) 0%,
    rgba(156, 74, 42, 0.06) 25%,
    transparent 55%
  );
  transition: background 200ms ease;
  pointer-events: none;
  z-index: 0;
}
.cta-section > * { position: relative; z-index: 1; }

/* Hover lift cue for tilt-cards so users perceive interactivity at rest too. */
.example-grid figure,
.ugc-card,
.process-card,
.purchase-ugc-thumb {
  transition: transform 280ms cubic-bezier(0.22, 0.61, 0.36, 1),
              box-shadow 280ms cubic-bezier(0.22, 0.61, 0.36, 1);
}
.example-grid figure:hover,
.ugc-card:hover,
.process-card:hover,
.purchase-ugc-thumb:hover {
  box-shadow: 0 18px 40px rgba(26, 24, 20, 0.18);
}

/* Hero showcase children should be GPU-promoted so parallax stays smooth. */
.hero-showcase-photo,
.hero-showcase-portrait {
  will-change: transform;
  transition: transform 240ms cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* Reduced-motion override — strip every transform/transition so the JS
   short-circuit + this CSS together guarantee zero motion. */
@media (prefers-reduced-motion: reduce) {
  .style-flip-hint-icon,
  .style-feature-primary img,
  .hero-showcase-photo,
  .hero-showcase-portrait,
  .example-grid figure,
  .ugc-card,
  .process-card,
  .purchase-ugc-thumb,
  .cta-btn,
  .cta-section-cta,
  .cta-section::before {
    transition: none !important;
    animation: none !important;
  }
}

/* ============================================================
   SPECIES PILL — Cat / Dog toggle inside .hero-showcase
   Sits above the carousel so visitors immediately see the
   product handles BOTH species. Updates the photo + portrait
   srcs via JS (see heroShowcase IIFE in app.js).
   ============================================================ */
.species-pill {
  display: inline-flex;
  gap: 0;
  padding: 4px;
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 999px;
  margin: 0 auto 14px;
  font-family: var(--sans, "Inter", system-ui, sans-serif);
  align-self: center;
}
.hero-showcase {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.species-pill-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: transparent;
  border: 0;
  padding: 8px 16px;
  border-radius: 999px;
  font-size: 12.5px;
  letter-spacing: 0.04em;
  color: var(--ink-3);
  cursor: pointer;
  transition: background 200ms cubic-bezier(0.22, 0.61, 0.36, 1),
              color 200ms cubic-bezier(0.22, 0.61, 0.36, 1),
              transform 180ms ease;
}
.species-pill-btn:hover {
  color: var(--ink);
  transform: translateY(-1px);
}
.species-pill-btn.active {
  background: var(--ink);
  color: var(--paper);
  font-weight: 500;
}
.species-pill-icon {
  font-size: 16px;
  line-height: 1;
}
.species-pill-label {
  font-weight: 500;
}
.species-pill-btn:focus-visible {
  outline: 2px solid var(--olive);
  outline-offset: 2px;
}

/* Smooth fade on the photo when species changes. */
#hero-photo-img {
  transition: opacity 200ms ease;
}

/* ============================================================
   V16 HERO REDESIGN — "Editorial Split, Visual-Primary"
   Lifts CVR by fixing the carousel-below-fold bug.
   Spec: campaigns/hero-redesign-spec.md
   ============================================================ */

.hero.hero-v16 {
  /* Right column is 60% — visual leads. */
  grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr);
  gap: clamp(28px, 4vw, 56px);
  /* Anchor the top edges so the carousel sits high, not centred against a
     bloated text column. The previous align-items: center was the root cause
     of the carousel sinking ~265px below the fold. */
  align-items: start;
  min-height: 0;
  padding-top: clamp(28px, 4vw, 48px);
  padding-bottom: clamp(36px, 5vw, 64px);
}

.hero-v16 .hero-text {
  display: grid;
  gap: clamp(16px, 1.8vw, 22px);
  align-content: start;
  padding-top: 4px;
}

/* H1: tighter line-height so 2 lines fit at every viewport. */
.hero-v16 .hero-text .display {
  font-size: clamp(40px, 5.6vw, 68px);
  line-height: 0.98;
  letter-spacing: -0.022em;
}

/* Lede: shorter, max 2 lines. */
.hero-v16 .lede {
  font-size: clamp(16px, 1.5vw, 19px);
  line-height: 1.5;
  max-width: 42ch;
  color: var(--ink-3);
  margin: 0;
}
.hero-v16 .lede strong { color: var(--ink); font-weight: 500; }

/* Primary uploader: compact form so it doesn't push the carousel down. */
.uploader-primary {
  padding: clamp(16px, 2vw, 22px) clamp(18px, 2.2vw, 26px);
}
.uploader-primary .uploader-inner { gap: 16px; }
.uploader-primary .uploader-text strong {
  font-size: clamp(17px, 1.6vw, 20px);
  margin-bottom: 2px;
}
.uploader-primary .uploader-text span { font-size: 13px; }

/* Pet-name row compact variant for v16 — kept in hero for JS state capture, but
   visually minimal (inline label + input, no big padding). */
.pet-name-row-compact {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 13px;
}
.pet-name-row-compact .pet-name-label {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--muted);
  font-size: 11px;
}
.pet-name-row-compact .pet-name-input {
  flex: 1;
  padding: 8px 12px;
  font-family: var(--sans);
  font-size: 14px;
  border: 1px solid var(--line);
  border-radius: 4px;
  background: var(--paper);
  color: var(--ink);
}
.pet-name-row-compact .pet-name-input:focus {
  outline: 2px solid var(--olive);
  outline-offset: 1px;
}

/* Species toggle — left column under v16. Segmented control, ink-on-paper. */
.species-toggle {
  display: inline-flex;
  align-self: start;
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 4px;
  gap: 2px;
  font-family: var(--sans, "Inter", system-ui, sans-serif);
}
.species-toggle-btn {
  background: transparent;
  border: 0;
  font-family: inherit;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.01em;
  padding: 8px 18px;
  border-radius: 999px;
  color: var(--ink-3);
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  transition: background 180ms ease, color 180ms ease, transform 160ms ease;
}
.species-toggle-btn:hover { color: var(--ink); transform: translateY(-1px); }
.species-toggle-btn .species-toggle-icon {
  font-size: 16px;
  line-height: 1;
}
.species-toggle-btn.active {
  background: var(--ink);
  color: var(--paper);
}
.species-toggle-btn:focus-visible {
  outline: 2px solid var(--olive);
  outline-offset: 2px;
}

/* Carousel anchors to the TOP of the right column, not its centre. */
.hero-v16 .hero-image { align-self: start; }

/* ------------------------------------------------------------
   .hero-band — horizontal strip immediately below the hero
   ------------------------------------------------------------ */
.hero-band {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: clamp(20px, 3vw, 40px);
  padding: clamp(20px, 2.4vw, 28px) 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  margin-bottom: clamp(32px, 4vw, 48px);
}

.trust-strip-horizontal {
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  gap: 6px 28px;
  font-size: 13px;
  color: var(--ink-3);
  margin: 0;
  padding: 0;
}
.trust-strip-horizontal li {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  line-height: 1.4;
}
.trust-strip-horizontal .trust-mark {
  color: var(--olive);
  font-weight: 600;
  font-size: 12px;
}

.guarantee-badge-inline {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 0;
  margin: 0;
  background: transparent;
  border: 0;
  color: var(--clay, var(--olive-dark));
  box-shadow: none;
}
.guarantee-badge-inline .guarantee-mark {
  color: var(--clay, var(--olive-dark));
  background: transparent;
  width: auto;
  height: auto;
  border-radius: 0;
}
.guarantee-badge-inline .guarantee-text {
  display: inline;
  font-family: var(--serif);
  font-style: italic;
  font-size: 14px;
}
.guarantee-badge-inline .guarantee-text strong {
  font-weight: 500;
  color: var(--clay, var(--olive-dark));
}

/* Override the .intent-pill margin-bottom from the older v14 hero — inside
   the .hero-band the pill should sit flush. */
.hero-band .intent-pill { margin-bottom: 0; }

/* Reset the species-toggle from looking pinned to the carousel; left-column
   layout doesn't centre-align it. */
.hero-v16 .species-toggle { margin-top: 4px; }

/* ------------------------------------------------------------
   Responsive — the whole point of the redesign
   ------------------------------------------------------------ */

/* Mid-laptop (1024–1279px): squeeze H1 slightly, keep split intact. */
@media (max-width: 1180px) {
  .hero.hero-v16 { gap: 32px; }
  .hero-v16 .hero-text .display { font-size: clamp(36px, 4.6vw, 52px); }
  .hero-v16 .lede { font-size: 16px; }
}

/* Tablet (≤920px): stack, carousel FIRST (above H1) to honour visual-led
   pattern on small viewports. */
@media (max-width: 920px) {
  .hero.hero-v16 {
    grid-template-columns: 1fr;
    gap: clamp(20px, 4vw, 32px);
    padding-top: 20px;
  }
  .hero-v16 .hero-image { order: -1; }
  .hero-v16 .hero-text { gap: 16px; }
  .hero-v16 .hero-text .display {
    font-size: clamp(32px, 6.4vw, 44px);
    line-height: 1.02;
  }
  .hero-v16 .lede {
    font-size: 15px;
    max-width: none;
  }
  .hero-band {
    grid-template-columns: 1fr;
    gap: 14px;
    padding: 18px 0;
  }
  .hero-band .intent-pill { justify-self: start; }
  .hero-band .guarantee-badge-inline { justify-self: start; }
}

/* Mobile (≤600px): demote lede after uploader, tighten H1. */
@media (max-width: 600px) {
  .hero-v16 .lede {
    order: 4;
    margin-top: 8px;
    font-size: 14px;
  }
  .hero-v16 .hero-text .display {
    font-size: clamp(30px, 8.4vw, 40px);
  }
  .hero-v16 .uploader-primary {
    padding: 14px 16px;
  }
  .hero-v16 .uploader-primary .uploader-text strong { font-size: 16px; }
  .species-toggle { align-self: stretch; justify-content: center; }
  .species-toggle-btn { flex: 1; justify-content: center; }
}

/* Very small (≤390px): compress chips. */
@media (max-width: 390px) {
  .hero-chip { font-size: 10px; padding: 6px 9px; }
  .hero-showcase-hint { font-size: 9px; }
}

@media (prefers-reduced-motion: reduce) {
  .uploader-primary { transition: none; }
  .species-toggle-btn { transition: none; transform: none !important; }
}

/* ============================================================
   LIVE NAMEPLATE — museum-style plaque under the carousel.
   Updates as the visitor types into #pet-name. Shows them the
   name BECOMES PART OF THE PRODUCT, not just metadata.
   ============================================================ */
.hero-nameplate {
  margin: 10px auto 0;
  padding: 10px 18px 12px;
  text-align: center;
  font-family: var(--serif, "Fraunces", Georgia, serif);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  background: linear-gradient(180deg, rgba(255,255,255,0.0) 0%, rgba(255,255,255,0.18) 100%);
  max-width: 460px;
  width: 100%;
}
.hero-nameplate-marker {
  display: block;
  font-family: var(--sans, "Inter", system-ui, sans-serif);
  font-size: 9px;
  letter-spacing: 0.28em;
  color: var(--muted);
  margin-bottom: 6px;
}
.hero-nameplate-name {
  display: block;
  font-style: italic;
  font-size: clamp(20px, 2.2vw, 26px);
  font-weight: 400;
  color: var(--ink-3);
  letter-spacing: 0.01em;
  line-height: 1.1;
  transition: color 240ms ease, transform 240ms ease;
}
.hero-nameplate.has-name .hero-nameplate-name {
  color: var(--olive-dark);
  transform: translateY(-1px);
}
.hero-nameplate-meta {
  display: block;
  margin-top: 6px;
  font-family: var(--sans);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--muted);
}

/* Species toggle when placed adjacent to the carousel (right column). */
.species-toggle-carousel {
  margin: 0 auto 14px;
  align-self: center;
}
.hero-v16 .hero-image {
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

/* Name-unlocks list — what typing the name CHANGES about the product. */
.name-unlocks {
  list-style: none;
  margin: 4px 0 0;
  padding: 0;
  display: grid;
  gap: 6px;
  font-family: var(--sans);
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--ink-3);
}
.name-unlocks li {
  display: flex;
  align-items: baseline;
  gap: 10px;
}
.name-unlocks-mark {
  flex-shrink: 0;
  color: var(--clay, var(--olive-dark));
  font-size: 11px;
  line-height: 1;
  transform: translateY(-1px);
}
.name-unlocks em {
  font-family: var(--serif);
  font-style: italic;
  color: var(--ink);
}
.name-unlocks-url {
  font-family: var(--mono, ui-monospace, "SF Mono", Menlo, monospace);
  font-size: 11.5px;
  color: var(--ink);
  background: var(--paper-2);
  padding: 1px 6px;
  border-radius: 3px;
}
.name-unlocks-url em {
  color: var(--olive-dark);
  font-style: normal;
  font-weight: 500;
}

@media (max-width: 600px) {
  .hero-nameplate { padding: 8px 14px 10px; }
  .hero-nameplate-name { font-size: 18px; }
  .name-unlocks { font-size: 12px; }
}

/* "Showing both" label — visible ONLY while the species toggle is still mixed.
   Default hidden so that removing the parent .species-toggle-mixed class
   genuinely hides the label (not just leaves it as an unstyled inline span). */
.species-toggle-label { display: none; }
.species-toggle-mixed .species-toggle-label {
  display: inline-flex;
  align-items: center;
  padding: 0 12px 0 8px;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--olive-dark);
  font-weight: 500;
  font-family: var(--sans);
}

/* When a species is locked, give the pill an emphasised active-look so the
   click is unmistakable. Subtle scale + olive ring around the chosen button. */
.species-toggle-btn.active {
  box-shadow: 0 0 0 2px var(--olive-light, rgba(110,122,89,0.25));
}

/* On locked species pages (cats / dogs landers), no "Showing both" label is in the
   DOM at all, so no rule is needed. */

@media (max-width: 600px) {
  .species-toggle-mixed .species-toggle-label {
    font-size: 10px;
    padding: 0 8px 0 6px;
  }
}

/* On /cats and /dogs landers, hide the species toggle entirely — these pages
   are species-locked by URL and the toggle would invite a flow break.
   On the homepage (no data-species on body) the toggle still shows. */
body[data-species="cat"] .species-toggle,
body[data-species="dog"] .species-toggle {
  display: none !important;
}

/* =================================================================
   P0 — /THANKS REVEAL CHOREOGRAPHY (spec §1, §2.1, §2.2, §5)
   ----------------------------------------------------------------
   Time-based reveal driven by pollForDownload() in app.js. Every
   element starts with .thanks-reveal-hidden (opacity:0) and gets
   the class removed on its scheduled T+N tick. Under reduced motion
   we collapse all transitions to a 120ms opacity fade and the JS
   schedules everything at T+0.
   ================================================================= */

/* Visually-hidden helper for the aria-live announcer. */
.sr-only {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0);
  white-space: nowrap; border: 0;
}

/* Override the legacy .thanks container width so the reveal can
   breathe up to the spec's 960px max content width on desktop. */
.stage[data-stage="thanks"] .thanks {
  max-width: 960px;
  gap: 0;
  padding-top: clamp(32px, 6vw, 72px);
}

/* ---------- The reveal wrapper ---------- */
.thanks-reveal {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(18px, 3vw, 28px);
  justify-items: center;
  text-align: center;
  width: 100%;
  max-width: 960px;
  margin: 0 auto;
  padding: 0 clamp(16px, 4vw, 24px);
}

/* Two-column from 1024px+ (portrait 58%, action stack 42%). */
@media (min-width: 1024px) {
  .thanks-reveal {
    grid-template-columns: 58% 42%;
    grid-template-areas:
      "ring    ring"
      "portrait actions"
      "portrait actions"
      "portrait actions"
      "portrait actions";
    column-gap: clamp(32px, 4vw, 56px);
    row-gap: clamp(14px, 2vw, 22px);
    text-align: left;
    justify-items: stretch;
  }
  .thanks-reveal-ring     { grid-area: ring;     justify-self: center; }
  .thanks-portrait        { grid-area: portrait; }
  .thanks-reveal-eyebrow,
  .thanks-reveal-h1,
  .thanks-reveal-cta-block,
  .thanks-email-confirm   { grid-area: actions; align-self: start; }
  .thanks-reveal-eyebrow  { align-self: end; }
  .thanks-reveal-cta-block { align-self: start; }
}
@media (min-width: 1024px) {
  /* Stack the four action-column items vertically. */
  .thanks-reveal {
    grid-auto-flow: row;
  }
}

/* ---------- Hidden-by-default revealable atoms ---------- */
.thanks-reveal-hidden {
  opacity: 0;
  visibility: hidden;
}

/* ---------- Olive progress ring (T+0 → T+2) ---------- */
.thanks-reveal-ring {
  display: grid;
  justify-items: center;
  gap: 18px;
  padding: clamp(8px, 2vw, 20px) 0;
  transition: opacity 600ms ease-out, transform 600ms ease-out;
}
.thanks-reveal-ring.thanks-reveal-ring-out {
  opacity: 0;
  transform: translateY(-6px);
  pointer-events: none;
  /* Collapse height so portrait can slide up without a gap. */
  max-height: 0;
  overflow: hidden;
  padding: 0;
  margin: 0;
}
.thanks-progress-ring {
  width: 60px;
  height: 60px;
  border-radius: 50%;
  border: 2px solid var(--olive-pale);
  border-top-color: var(--olive);
  animation: thanks-spin 1250ms linear infinite; /* 0.8 turns/s ≈ 1.25s/turn */
}
@keyframes thanks-spin {
  to { transform: rotate(360deg); }
}
.thanks-reveal-holding {
  font-family: var(--serif);
  font-size: clamp(20px, 3.4vw, 28px);
  font-style: italic;
  color: var(--ink);
  margin: 0;
  max-width: 36ch;
  line-height: 1.25;
}

/* ---------- Portrait fade-in (T+2 → T+3.4) ---------- */
.thanks-portrait {
  display: block;
  margin: 0;
  width: 100%;
  max-width: clamp(280px, 60vw, 520px);
  aspect-ratio: 1 / 1;
  border: 1px solid var(--clay);
  border-radius: 8px;
  overflow: hidden;
  background: var(--paper-2);
  box-shadow: 0 1px 0 rgba(0,0,0,0.04), 0 18px 40px -28px rgba(60,40,20,0.35);
}
.thanks-portrait img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
@media (prefers-reduced-motion: no-preference) {
  .thanks-portrait {
    transform: scale(0.92);
    opacity: 0.04;
    transition: transform 1400ms cubic-bezier(.22,.61,.36,1),
                opacity 1400ms cubic-bezier(.22,.61,.36,1),
                visibility 0s;
  }
  .thanks-portrait:not(.thanks-reveal-hidden) {
    transform: scale(1);
    opacity: 1;
  }
}

/* ---------- Eyebrow + h1 (T+3.4) ---------- */
.thanks-reveal-eyebrow {
  margin: 0;
  color: var(--olive);
  font-size: 11px;
  letter-spacing: 0.22em;
}
.thanks-reveal-h1 {
  font-family: var(--serif);
  font-style: italic;
  font-weight: 400;
  color: var(--ink);
  font-size: clamp(2rem, 6vw, 3.5rem);
  line-height: 1.05;
  letter-spacing: -0.015em;
  margin: 0;
  outline: none;
}
.thanks-reveal-h1:focus-visible {
  outline: 2px solid var(--olive);
  outline-offset: 4px;
  border-radius: 4px;
}

@media (prefers-reduced-motion: no-preference) {
  .thanks-reveal-eyebrow,
  .thanks-reveal-h1,
  .thanks-reveal-cta-block,
  .thanks-email-confirm {
    transition: opacity 360ms ease-out, transform 360ms ease-out, visibility 0s;
    transform: translateY(6px);
  }
  .thanks-reveal-eyebrow:not(.thanks-reveal-hidden),
  .thanks-reveal-h1:not(.thanks-reveal-hidden),
  .thanks-reveal-cta-block:not(.thanks-reveal-hidden),
  .thanks-email-confirm:not(.thanks-reveal-hidden) {
    transform: translateY(0);
  }
}

/* ---------- Primary CTA (T+5) — FILLED terracotta ---------- */
.thanks-reveal-cta-block {
  display: grid;
  gap: 12px;
  justify-items: center;
  margin-top: clamp(4px, 1vw, 12px);
}
@media (min-width: 1024px) {
  .thanks-reveal-cta-block { justify-items: start; }
}
.thanks-cta-primary {
  display: inline-block;
  background: var(--clay);
  color: #FFF8EE; /* near-paper for max contrast on clay; verified ≥ 4.6:1 */
  font-family: var(--sans);
  font-size: 16px;
  font-weight: 600;
  letter-spacing: 0.01em;
  text-decoration: none;
  padding: 18px 36px;
  border-radius: 8px;
  border: 1px solid var(--clay);
  box-shadow: 0 1px 0 rgba(0,0,0,0.04), 0 10px 24px -16px rgba(142,74,48,0.55);
  transition: transform 200ms ease, box-shadow 200ms ease, background 200ms ease;
  cursor: pointer;
  text-align: center;
  min-width: 240px;
}
.thanks-cta-primary:hover,
.thanks-cta-primary:focus-visible {
  background: #7A3E27; /* darker clay on hover, still AA on white */
  transform: translateY(-1px);
  box-shadow: 0 1px 0 rgba(0,0,0,0.04), 0 14px 30px -16px rgba(142,74,48,0.65);
}
.thanks-cta-primary:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 3px;
}
.thanks-cta-primary:active {
  transform: translateY(0);
}
.thanks-reveal-spec {
  font-size: 14px;
  color: var(--ink-2, var(--olive-dark));
  margin: 0;
  line-height: 1.5;
  max-width: 38ch;
}

/* ---------- Email confirmation line (T+6.5) ---------- */
.thanks-email-confirm {
  font-size: 14px;
  color: var(--olive);
  margin: 0;
  line-height: 1.5;
  max-width: 46ch;
}
@media (prefers-reduced-motion: no-preference) {
  .thanks-email-confirm {
    transform: translateY(12px);
    transition: opacity 280ms ease-out, transform 280ms ease-out, visibility 0s;
  }
  .thanks-email-confirm.thanks-email-confirm-in {
    transform: translateY(0);
  }
}

/* =================================================================
   P0 — WALLPAPER DEVICE SILHOUETTES (spec §2.2)
   Six CSS-only device outlines. The portrait image is cropped inside
   each silhouette via clip-path; the silhouette itself is a thin
   1px deep-oak border that traces the device outline. No new image
   assets — keep the bundle weightless.
   ================================================================= */

/* Re-base the existing .wallpaper-bundle visuals to the spec palette. */
.wallpaper-bundle {
  background: rgba(199, 203, 179, 0.10);
  border: 1px solid var(--line);
  border-radius: 14px;
  padding: clamp(24px, 4vw, 40px) clamp(20px, 3vw, 32px);
  margin: clamp(28px, 5vw, 56px) 0 8px;
}
.wallpaper-bundle-header h3 {
  font-family: var(--serif);
  font-style: italic;
  color: var(--ink);
  font-size: clamp(1.25rem, 3vw, 1.625rem);
  line-height: 1.15;
}

/* Two columns on phones; three from 720px+. */
.wallpaper-grid {
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
}
@media (min-width: 720px) {
  .wallpaper-grid { grid-template-columns: repeat(3, 1fr); }
}

/* Silhouette tile — the whole <a> is the tap target. */
.wallpaper-tile--silhouette {
  display: grid;
  grid-template-rows: 1fr auto auto;
  align-items: center;
  justify-items: center;
  gap: 10px;
  padding: 18px 12px 14px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 10px;
  text-decoration: none;
  color: var(--ink);
  transition: border-color 220ms ease, transform 220ms ease,
              box-shadow 220ms ease;
  min-height: 200px;
}
.wallpaper-tile--silhouette:hover,
.wallpaper-tile--silhouette:focus-visible {
  border-color: var(--clay);
  transform: translateY(-2px);
  box-shadow: 0 14px 28px -22px rgba(60,40,20,0.45);
}
.wallpaper-tile--silhouette:focus-visible {
  outline: 2px solid var(--olive);
  outline-offset: 2px;
}

/* Wallpaper-grid staggered fade-in (T+8 onward). */
@media (prefers-reduced-motion: no-preference) {
  .wallpaper-bundle .wallpaper-item {
    opacity: 0;
    transform: translateY(6px);
    transition: opacity 400ms ease-out, transform 400ms ease-out;
    transition-delay: var(--tile-stagger, 0ms);
  }
  .wallpaper-bundle--in .wallpaper-item {
    opacity: 1;
    transform: translateY(0);
  }
}

/* The silhouette wrapper holds the cropped portrait image. Each
   variant uses clip-path to render the device outline. */
.wallpaper-silhouette {
  position: relative;
  display: block;
  width: 100%;
  max-width: 96px;
  background: var(--ink);
  overflow: hidden;
  /* The deep-oak hairline border traces the silhouette via the same
     clip-path applied to the inner img — we mimic a "frame" by using
     a subtle box-shadow inset since clip-path drops the border. */
  box-shadow: inset 0 0 0 1px rgba(0,0,0,0.15);
}
.wallpaper-silhouette img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* iPhone (Pro Max + standard share this silhouette). */
.wallpaper-silhouette--iphone {
  aspect-ratio: 9 / 19;
  max-width: 70px;
  border-radius: 14px;
  -webkit-clip-path: inset(0 round 14px);
          clip-path: inset(0 round 14px);
}
/* Android — slightly squarer phone outline. */
.wallpaper-silhouette--android {
  aspect-ratio: 9 / 19;
  max-width: 70px;
  border-radius: 10px;
  -webkit-clip-path: inset(0 round 10px);
          clip-path: inset(0 round 10px);
}
/* iPad / tablet. */
.wallpaper-silhouette--ipad {
  aspect-ratio: 3 / 4;
  max-width: 110px;
  border-radius: 12px;
  -webkit-clip-path: inset(0 round 12px);
          clip-path: inset(0 round 12px);
}
/* Lock-screen square. */
.wallpaper-silhouette--lock {
  aspect-ratio: 1 / 1;
  max-width: 96px;
  border-radius: 10px;
  -webkit-clip-path: inset(0 round 10px);
          clip-path: inset(0 round 10px);
}
/* Apple Watch — rounded square. */
.wallpaper-silhouette--watch {
  aspect-ratio: 1 / 1.2;
  max-width: 60px;
  border-radius: 18px;
  -webkit-clip-path: inset(0 round 18px);
          clip-path: inset(0 round 18px);
}

.wallpaper-tile--silhouette .wallpaper-label {
  font-size: 12px;
  letter-spacing: 0.04em;
  font-weight: 600;
  color: var(--ink-2);
  text-align: center;
  line-height: 1.3;
}
.wallpaper-tile--silhouette .wallpaper-cta {
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--olive-dark);
  font-weight: 600;
}

/* =================================================================
   P0 — REDUCED MOTION OVERRIDES
   Under prefers-reduced-motion: reduce, every transition collapses
   to a 120ms opacity fade and all transforms are removed.
   ================================================================= */
@media (prefers-reduced-motion: reduce) {
  .thanks-progress-ring { animation: none; }
  .thanks-portrait,
  .thanks-reveal-eyebrow,
  .thanks-reveal-h1,
  .thanks-reveal-cta-block,
  .thanks-email-confirm,
  .wallpaper-bundle .wallpaper-item,
  .thanks-reveal-ring {
    transition: opacity 120ms linear !important;
    transform: none !important;
  }
  .thanks-reveal-ring.thanks-reveal-ring-out {
    max-height: 0; padding: 0; margin: 0;
  }
}

/* =================================================================
   P0 — LEGACY OVERRIDES
   The old #download-card / #download-pending blocks are still in
   the DOM for the state machine, but visually hidden. The reveal
   block owns the moment of transaction now.
   ================================================================= */
.stage[data-stage="thanks"] #download-card[hidden],
.stage[data-stage="thanks"] #download-pending[hidden] {
  display: none !important;
}
.stage[data-stage="thanks"] #download-card[aria-hidden="true"] {
  display: none !important;
}
