/* =========================================================
   Benton Sans Wide — self-hosted (public/fonts/benton-sans-wide)
   Paths are relative to this stylesheet (css/style.css) so they
   resolve correctly regardless of how the site is mounted.
   ========================================================= */
@font-face {
  font-family: "Benton Sans Wide";
  src: url("../public/fonts/benton-sans-wide/benton-sans-wide-extralight.ttf") format("truetype");
  font-weight: 200;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Benton Sans Wide";
  src: url("../public/fonts/benton-sans-wide/benton-sans-wide-book.ttf") format("truetype");
  font-weight: 300;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Benton Sans Wide";
  src: url("../public/fonts/benton-sans-wide/benton-sans-wide-regular.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Benton Sans Wide";
  src: url("../public/fonts/benton-sans-wide/benton-sans-wide-medium.ttf") format("truetype");
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Benton Sans Wide";
  src: url("../public/fonts/benton-sans-wide/benton-sans-wide-bold.ttf") format("truetype");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Benton Sans Wide";
  src: url("../public/fonts/benton-sans-wide/benton-sans-wide-black.ttf") format("truetype");
  font-weight: 900;
  font-style: normal;
  font-display: swap;
}

:root {
  --bg: #ffffff;
  --white: #ffffff;
  --secondary: #e8d7bb;
  --ink: #111111;
  --black: #111111;
  --gray: #7a736c;
  --muted: #7a736c;
  --line: #d8c9ad;
  --accent: #a7604a;

  /* Canonical brand font token. Use --font-benton-sans-wide in all new code. */
  --font-benton-sans-wide: "Benton Sans Wide", sans-serif;
  /* Legacy alias — kept so the ~150 existing `var(--font-geist-sans)` references
     resolve to Benton Sans Wide without a project-wide rename. Do not remove. */
  --font-geist-sans: var(--font-benton-sans-wide);

  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --pad: clamp(22px, 5vw, 64px);
  /* Unified horizontal rail used by nav, footer, and product page sections.
     Matches the nav bar's left/right offset so every section aligns edge-to-edge
     with the header/footer on every viewport. */
  --section-pad: max(20px, 4vw);
  /* Content max-width used by product page sections + footer inner grid.
     Wider than the legacy 1440px cap so 1600–2560px viewports actually fill,
     but capped so 4K screens don't stretch cards into billboards. */
  --section-max: 1720px;
}

/* =========================================================
   Font utility classes (Benton Sans Wide)
   .font-geistSans is aliased for backward compatibility with
   existing `<body class="font-geistSans">` markup.
   ========================================================= */
.font-benton,
.font-geistSans {
  font-family: var(--font-benton-sans-wide);
}

.font-benton-extralight { font-weight: 200; }
.font-benton-book       { font-weight: 300; }
.font-benton-regular    { font-weight: 400; }
.font-benton-medium     { font-weight: 500; }
.font-benton-bold       { font-weight: 700; }
.font-benton-black      { font-weight: 900; }

/* ==========================================================
   Brand logo variants — derived from a single copper `logo.avif`
   via CSS filters (no extra asset files required).

   Usage on any <img> that renders the Swiss Arabian mark:
     .logo--black  → force pure black silhouette (on light bg)
     .logo--white  → force pure white silhouette (on dark bg)
     .logo--copper → keep original brand copper (primary)
   ========================================================== */
.logo--black  { filter: brightness(0); }
.logo--white  { filter: brightness(0) invert(1); }
.logo--copper { filter: none; }

*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html { scroll-behavior: smooth; }

body {
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-geist-sans);
  font-size: 16px;
  font-weight: 400;
  line-height: 1.6;
  overflow-x: hidden;
}

body.lock,
body.is-loading { overflow: hidden; }

/* ==============================================================
   LOADER — editorial theme (warm cream · ink · accent)
   Consumes: var(--secondary), var(--ink), var(--accent), var(--ease)
   ============================================================== */

.loader {
  --loader-fill: 0;
  position: fixed;
  inset: 0;
  z-index: 300;
  overflow: hidden;
  background: #ffffff;
  color: #000;
  transform: translateY(0);
  transition: transform 1.2s cubic-bezier(0.76, 0, 0.24, 1);
  will-change: transform;
  isolation: isolate;
}

.loader__corner {
  position: absolute;
  width: 26px;
  height: 26px;
  border: 0 solid #000;
  pointer-events: none;
}
.loader__corner--tl { top: 22px; left: 22px;   border-top-width: 1.5px; border-left-width: 1.5px; }
.loader__corner--tr { top: 22px; right: 22px;  border-top-width: 1.5px; border-right-width: 1.5px; }
.loader__corner--bl { bottom: 22px; left: 22px;  border-bottom-width: 1.5px; border-left-width: 1.5px; }
.loader__corner--br { bottom: 22px; right: 22px; border-bottom-width: 1.5px; border-right-width: 1.5px; }

.loader__grid {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-rows: auto 1fr auto;
  height: 100%;
  padding: clamp(28px, 4vw, 48px);
}

.loader__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}

.loader__row--mid {
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  gap: clamp(20px, 2.6vw, 34px);
}

.loader__brand {
  display: inline-flex;
  align-items: center;
  gap: 12px;
}

.loader__brand img {
  height: 32px;
  width: auto;
  object-fit: contain;
}

.loader__meta {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: #000;
}

.loader__meta i {
  font-style: normal;
  color: #000;
  opacity: 0.4;
}

.loader__stage {
  width: clamp(120px, 17vw, 190px);
  aspect-ratio: 140 / 260;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  overflow: visible;
}

.loader__bottle {
  width: 100%;
  height: 100%;
  display: block;
  overflow: visible;
}

.loader__liquid-group {
  transform: translateY(calc(140px * (1 - var(--loader-fill, 0))));
  transition: transform 0.18s linear;
  transform-box: fill-box;
}

.loader__wave {
  transform-origin: 50% 100%;
  animation: loaderWave 3.4s ease-in-out infinite;
}

@keyframes loaderWave {
  0%, 100% { transform: translateX(-6px); }
  50%      { transform: translateX(6px); }
}

.loader__wisp {
  fill: none;
  opacity: 0;
  transform-origin: 50% 100%;
  transform-box: fill-box;
  animation: loaderWisp 3.6s ease-in-out infinite;
}

.loader__wisp--2 { animation-delay: 1.2s; }
.loader__wisp--3 { animation-delay: 2.4s; }

@keyframes loaderWisp {
  0%   { opacity: 0;   transform: translateY(6px)  scale(0.9); }
  30%  { opacity: 0.7; }
  75%  { opacity: 0.2; }
  100% { opacity: 0;   transform: translateY(-22px) scale(1.05); }
}

.loader__status {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  font-family: var(--font-geist-sans);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: #000;
}

.loader__status::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #000;
  animation: loaderPulse 1.6s ease-in-out infinite;
}

@keyframes loaderPulse {
  0%, 100% { opacity: 0.2; transform: scale(0.85); }
  50%      { opacity: 1;   transform: scale(1.15); }
}

.loader__num {
  display: inline-flex;
  align-items: flex-start;
  gap: 8px;
  font-family: var(--font-geist-sans);
  font-size: clamp(4.5rem, 13vw, 8.5rem);
  font-weight: 800;
  letter-spacing: -0.055em;
  line-height: 0.88;
  color: #000;
}

.loader__num i {
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: 0.28em;
  font-weight: 800;
  letter-spacing: 0;
  color: #000;
  margin-top: 0.4em;
}

.loader__track {
  width: 100%;
  height: 2px;
  background: rgba(0, 0, 0, 0.1);
  overflow: hidden;
  margin-bottom: 14px;
}

.loader__track span {
  display: block;
  height: 100%;
  width: 0;
  background: #000;
  transition: width 0.16s linear;
}

.loader__foot {
  display: flex;
  justify-content: space-between;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: #000;
}

.loader.is-leave {
  transform: translateY(-100%);
  pointer-events: none;
}

.nav,
.hero__left,
.hero__sound {
  opacity: 0;
  transform: translateY(28px);
}

body.is-ready .nav,
body.is-ready .hero__left,
body.is-ready .hero__sound {
  opacity: 1;
  transform: none;
  transition:
    opacity 1s var(--ease) 0.15s,
    transform 1.2s var(--ease) 0.15s;
}

body.is-ready .hero__left { transition-delay: 0.28s, 0.28s; }
body.is-ready .hero__sound { transition-delay: 0.52s, 0.52s; }

img,
video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

a { color: inherit; text-decoration: none; }

button,
input {
  font: inherit;
  color: inherit;
  background: none;
  border: 0;
}

button { cursor: pointer; }

::selection {
  background: var(--ink);
  color: var(--white);
}

.glow {
  position: fixed;
  width: 42vw;
  height: 42vw;
  border-radius: 50%;
  pointer-events: none;
  z-index: 0;
  filter: blur(80px);
  opacity: 0.4;
}

.glow--a {
  top: -12vw;
  left: -8vw;
  background: #a7604a;
  animation: drift 14s ease-in-out infinite;
}

.glow--b {
  right: -10vw;
  bottom: 10vh;
  background: #a7604a;
  animation: drift 18s ease-in-out infinite reverse;
}

/* Products page (`.shop-page`) is a pure editorial white listing surface.
   Suppress the copper ambience glows here so .pvideo, .shop-toolbar, and
   .collection render on a clean #fff without a warm tint bleeding through.
   Home page keeps the glows for hero ambience. */
body.shop-page .glow {
  display: none;
}

@keyframes drift {
  50% { transform: translate(20px, -16px) scale(1.06); }
}

.nav,
.hero,
.shop,
.mrq,
.families,
.hgallery,
.manifesto,
.picks,
.cinema,
.talk-sec,
.foot,
.menu {
  position: relative;
  z-index: 2;
}

.nav {
  position: fixed;
  top: 18px;
  left: var(--section-pad);
  right: var(--section-pad);
  z-index: 40;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  height: auto;
  padding: 0;
  background: none;
  border: 0;
  box-shadow: none;
  transition: top 0.35s var(--ease);
}

/* Past-hero — subtle position tuck (color/theme is already light by default) */
body.is-past-hero .nav {
  top: 12px;
}

.brand {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  background: none;
  border: 0;
  box-shadow: none;
  transition: transform 0.4s var(--ease), filter 0.4s var(--ease);
}

.brand:hover {
  transform: scale(1.06);
  filter: brightness(1.15);
}

.brand img {
  display: block;
  height: 58px;
  width: auto;
  object-fit: contain;
}

.nav__mid {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 1 auto;
  max-width: min(860px, 68vw);
  gap: 2px;
  padding: 5px;
  border: 1px solid rgba(0, 0, 0, 0.06);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.82);
  backdrop-filter: blur(20px) saturate(1.4);
  -webkit-backdrop-filter: blur(20px) saturate(1.4);
  box-shadow:
    0 10px 30px rgba(0, 0, 0, 0.06),
    inset 0 1px 0 rgba(255, 255, 255, 0.6);
  transition: background 0.4s var(--ease), border-color 0.4s;
}

.nav__mid > a,
.drop > button {
  position: relative;
  padding: 10px 16px;
  border-radius: 999px;
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.72);
  white-space: nowrap;
  transition: color 0.4s var(--ease), background 0.3s;
}

.nav__mid > a::after,
.drop > button::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 4px;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: #111;
  transform: translate(-50%, 6px);
  opacity: 0;
  transition: 0.3s var(--ease);
}

.nav__mid > a:hover::after,
.drop > button:hover::after,
.drop:hover > button::after {
  opacity: 1;
  transform: translate(-50%, 0);
}

.nav__mid > a:hover,
.drop > button:hover,
.drop:hover > button {
  color: #111;
  background: rgba(17, 17, 17, 0.05);
}

.drop { position: relative; }

.drop > button {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.drop > button span {
  font-size: 0.6rem;
  color: rgba(17, 17, 17, 0.55);
  transition: transform 0.3s var(--ease);
}

.drop:hover > button span { transform: rotate(180deg); }

.drop__list {
  position: absolute;
  top: calc(100% + 14px);
  left: 50%;
  min-width: 200px;
  padding: 8px;
  border: 1px solid rgba(0, 0, 0, 0.06);
  border-radius: 18px;
  background: rgba(255, 255, 255, 0.9);
  backdrop-filter: blur(20px) saturate(1.4);
  -webkit-backdrop-filter: blur(20px) saturate(1.4);
  box-shadow:
    0 20px 50px rgba(0, 0, 0, 0.12),
    inset 0 1px 0 rgba(255, 255, 255, 0.7);
  transform: translate(-50%, 8px);
  opacity: 0;
  visibility: hidden;
  transition: 0.28s var(--ease);
}

.drop__list a {
  display: block;
  padding: 10px 12px;
  border-radius: 12px;
  color: rgba(17, 17, 17, 0.78);
  font-size: 0.8rem;
  letter-spacing: 0.02em;
}

.drop__list a:hover {
  background: rgba(167, 96, 74, 0.12);
  color: var(--accent);
}

.drop:hover .drop__list,
.drop:focus-within .drop__list {
  opacity: 1;
  visibility: visible;
  transform: translate(-50%, 0);
}

.nav__right {
  display: flex;
  align-items: center;
  gap: 10px;
}

.nav__actions {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 5px;
  border: 1px solid rgba(0, 0, 0, 0.06);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.82);
  backdrop-filter: blur(20px) saturate(1.4);
  -webkit-backdrop-filter: blur(20px) saturate(1.4);
  box-shadow:
    0 10px 30px rgba(0, 0, 0, 0.06),
    inset 0 1px 0 rgba(255, 255, 255, 0.6);
  transition: background 0.4s var(--ease), border-color 0.4s;
}

.nav__ic {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  border-radius: 50%;
  color: rgba(17, 17, 17, 0.75);
  transition: 0.3s var(--ease);
}

.nav__ic:hover {
  background: rgba(17, 17, 17, 0.05);
  color: #111;
}

.nav__ic svg {
  width: 17px;
  height: 17px;
}

.nav__sep {
  width: 1px;
  height: 20px;
  background: rgba(0, 0, 0, 0.1);
}

.nav__bag {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  height: 38px;
  padding: 0 4px 0 14px;
  border-radius: 999px;
  color: #111;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  transition: 0.3s var(--ease);
}

.nav__bag:hover { background: rgba(17, 17, 17, 0.05); }

.nav__bag b {
  display: grid;
  place-items: center;
  min-width: 28px;
  height: 28px;
  padding: 0 8px;
  border-radius: 999px;
  background: var(--accent);
  color: #fff;
  font-weight: 600;
  font-size: 0.72rem;
  letter-spacing: 0;
  transition: background 0.25s var(--ease);
}

/* Empty state — JS toggles .is-empty on #cartCount when cart is 0.
   Soft grey pill so an empty bag doesn't scream in brand copper.
   Mirrors the existing pattern in .nav__bag-link b.is-empty. */
.nav__bag b.is-empty {
  background: rgba(17, 17, 17, 0.14);
  color: rgba(17, 17, 17, 0.6);
}

.icon-circle {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid rgba(0, 0, 0, 0.06);
  background: rgba(255, 255, 255, 0.82);
  backdrop-filter: blur(22px) saturate(1.4);
  -webkit-backdrop-filter: blur(22px) saturate(1.4);
  color: #111;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.06);
  transition: 0.3s var(--ease);
}

.icon-circle svg {
  width: 18px;
  height: 18px;
}

.icon-circle:hover {
  background: #fff;
  border-color: rgba(0, 0, 0, 0.16);
}

.search {
  position: fixed;
  top: 84px;
  right: max(18px, 4vw);
  z-index: 41;
  width: min(360px, calc(100vw - 36px));
  padding: 8px;
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 18px;
  background: rgba(12, 12, 12, 0.62);
  backdrop-filter: blur(18px);
}

.search input {
  width: 100%;
  min-height: 46px;
  padding: 0 14px;
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.08);
  color: #fff;
}

.search input::placeholder { color: rgba(255, 255, 255, 0.55); }
.search input:focus { outline: none; }

.arrow {
  color: var(--accent);
  display: inline-block;
  transition: transform 0.3s var(--ease);
}

.talk:hover .arrow,
.btn:hover .arrow,
.card__buy button:hover .arrow {
  transform: translate(3px, -3px);
}

.nav__burger {
  display: none;
  position: relative;
}

.nav__burger i {
  position: absolute;
  left: 14px;
  width: 16px;
  height: 1.5px;
  /* Match the rest of the nav iconography (search, bag, count) which all render
     in dark ink over the near-white `.icon-circle` pill. Previously #fff, which
     was invisible against the translucent-white button background. */
  background: var(--ink);
  border-radius: 2px;
  transition: 0.3s var(--ease);
}

.nav__burger i:first-child { top: 16px; }
.nav__burger i:last-child { top: 24px; width: 12px; }

.nav__burger.is-open i:first-child {
  top: 20px;
  transform: rotate(45deg);
}

.nav__burger.is-open i:last-child {
  top: 20px;
  width: 16px;
  transform: rotate(-45deg);
}

.menu {
  position: fixed;
  top: 100px;
  right: max(16px, 4vw);
  z-index: 39;
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-width: 180px;
  padding: 20px 22px;
  background: rgba(232, 215, 187, 0.92);
  border: 1px solid var(--line);
  border-radius: 18px;
  backdrop-filter: blur(16px);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-8px);
  transition: 0.35s var(--ease);
}

.menu.open {
  opacity: 1;
  visibility: visible;
  transform: none;
}

.menu a,
.menu button {
  text-align: left;
  font-size: 1.05rem;
}

.hero {
  position: relative;
  isolation: isolate;
  min-height: 100vh;
  display: grid;
  grid-template-columns: 1fr;
  gap: 48px;
  align-items: end;
  padding: 110px var(--pad) 88px;
  overflow: hidden;
  color: #fff;
}

.hero__bg {
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}

.hero__bg video {
  transform: scale(1.06);
}

.hero__left {
  position: relative;
  z-index: 2;
  max-width: 500px;
}

/* Type scale tuned for laptop viewports (1280–1440px).
   At 1280px this resolves to ~54px (vs ~72px previously) so the h1
   sits over the product photography without overwhelming it. */
.hero h1 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.4rem, 4.2vw, 4.5rem);
  font-weight: 700;
  letter-spacing: -0.045em;
  line-height: 0.98;
  color: #000;
  text-shadow: none;
  margin-bottom: 18px;
}

.hero h1 em {
  font-style: normal;
  font-weight: 700;
  color: #000;
}

.hero__lede {
  max-width: 40ch;
  font-size: 1.02rem;
  font-weight: 500;
  line-height: 1.55;
  color: #000;
  text-shadow: none;
}

.hero__cta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 22px;
  margin-top: 26px;
}


.ghost-link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  height: 60px;
  padding: 0;
  font-size: 0.74rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #000;
  transition: color 0.3s;
}

.ghost-link span {
  position: relative;
  padding-bottom: 4px;
}

.ghost-link span::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  background: rgba(0, 0, 0, 0.55);
  transition: background 0.3s;
}

.ghost-link .arrow {
  font-size: 1rem;
}

.ghost-link:hover { color: var(--accent); }
.ghost-link:hover span::after { background: var(--accent); }
.ghost-link:hover .arrow { transform: translate(3px, -3px); }

.shop h2,
.talk-sec h2,
.sheet h2 {
  font-weight: 600;
  letter-spacing: -0.04em;
  line-height: 1.05;
}

.shop__intro,
.talk-sec__left p,
.sheet > div p:not(.label) {
  color: var(--muted);
  max-width: 36ch;
}

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 50px;
  padding: 0 24px;
  margin-top: 26px;
  background: var(--ink);
  color: var(--white);
  border-radius: 999px;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  box-shadow: 0 12px 30px rgba(0, 0, 0, 0.12);
  transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
}

.btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 16px 34px rgba(0, 0, 0, 0.16);
}

.btn--wide { width: 100%; margin-top: 28px; }

.btn.btn--light {
  display: inline-flex;
  align-items: center;
  justify-content: flex-start;
  gap: 14px;
  min-height: 60px;
  margin-top: 0;
  padding: 6px 6px 6px 26px;
  background: #fff;
  color: #111;
  border-radius: 999px;
  box-shadow: 0 14px 34px rgba(0, 0, 0, 0.22);
  transition: transform 0.3s var(--ease), background 0.3s;
}

.btn.btn--light:hover {
  transform: translateY(-2px);
  background: #f5ede2;
  box-shadow: 0 18px 40px rgba(0, 0, 0, 0.26);
}

.btn__ic {
  display: grid;
  place-items: center;
  width: 46px;
  height: 46px;
  border-radius: 50%;
  background: #111;
  color: #fff;
  font-size: 1rem;
  font-weight: 400;
  transition: background 0.3s, transform 0.3s var(--ease);
}

.btn.btn--light:hover .btn__ic {
  background: var(--accent);
  transform: rotate(45deg);
}

/* Sound / mute toggle — sits at the bottom-right of the hero, on the same
   vertical rail as the nav bar. Two icons live inside the pill: a play
   triangle (default, muted state) and an animated equaliser (live state).
   Visibility is swapped by the .is-live class, toggled from main.js. */
.hero__sound {
  position: absolute;
  right: var(--section-pad);
  bottom: clamp(24px, 3vw, 40px);
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 10px 18px 10px 14px;
  border: 1px solid rgba(255, 255, 255, 0.2);
  border-radius: 999px;
  background: rgba(12, 12, 12, 0.5);
  backdrop-filter: blur(14px);
  color: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.3s, border-color 0.3s;
}

.hero__sound:hover {
  background: rgba(12, 12, 12, 0.75);
  border-color: rgba(255, 255, 255, 0.32);
}

.hero__sound:focus-visible {
  outline: 2px solid rgba(255, 255, 255, 0.65);
  outline-offset: 3px;
}

.hero__sound-ic {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 14px;
  height: 14px;
  color: var(--accent);
}

/* Idle state: show play triangle, hide EQ. */
.hero__sound-ic--live { display: none; }

/* Live state: hide play triangle, show pulsing EQ. */
.hero__sound.is-live .hero__sound-ic--play { display: none; }
.hero__sound.is-live .hero__sound-ic--live { display: inline-flex; }

.hero__eq {
  align-items: flex-end;
  gap: 2px;
  height: 10px;
}

.hero__eq i {
  width: 2px;
  height: 4px;
  background: var(--accent);
}

.hero__sound.is-live .hero__eq i {
  animation: eq 0.7s ease-in-out infinite;
  background: var(--accent);
}

.hero__sound.is-live .hero__eq i:nth-child(2) { animation-delay: 0.1s; }
.hero__sound.is-live .hero__eq i:nth-child(3) { animation-delay: 0.2s; }

@keyframes eq {
  50% { height: 10px; }
}

.pills {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 22px;
}

.pill {
  min-height: 36px;
  padding: 0 14px;
  border: 1px solid #111;
  border-radius: 999px;
  font-size: 0.72rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  transition: 0.25s var(--ease);
}

.pill.plus {
  width: 36px;
  padding: 0;
}

.pill.is-on,
.pill:hover {
  background: var(--ink);
  color: var(--white);
}

.shop {
  padding: clamp(90px, 11vw, 140px) var(--pad) clamp(80px, 10vw, 120px);
  background: #fff;
  color: var(--ink);
}

/* .talk-sec layout is fully declared later; base rule kept minimal to avoid clashes. */
.talk-sec {
  background: var(--secondary);
}

.shop__head {
  display: grid;
  grid-template-columns: 1.15fr 0.85fr;
  align-items: end;
  gap: 48px;
  padding-bottom: 44px;
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
}

.label {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  color: var(--accent);
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  margin-bottom: 18px;
}

.label i {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
}

.label span {
  color: rgba(0, 0, 0, 0.32);
  letter-spacing: 0.22em;
  padding-left: 6px;
  border-left: 1px solid rgba(0, 0, 0, 0.14);
}

.shop h2,
.talk-sec h2 {
  font-size: clamp(2.2rem, 4.2vw, 3.6rem);
}

.shop__aside {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 22px;
}

.shop__intro {
  color: var(--muted);
  max-width: 40ch;
  font-size: 1rem;
  line-height: 1.55;
}

.shop__all {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--ink);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink);
}

.shop__all .arrow { color: var(--accent); }

.shop__rail {
  --card-w: clamp(240px, 22vw, 320px);
  --edge-pad: 0px;
  position: relative;
  display: flex;
  gap: 22px;
  margin: 48px calc(var(--pad) * -1) 0;
  padding: 6px var(--pad) 44px;
  overflow-x: auto;
  overflow-y: hidden;
  overscroll-behavior-x: contain;
  /* Proximity (not mandatory) — mandatory snap fights every wheel frame,
     which turns diagonal trackpad gestures into visible page-scroll jitter
     when the cursor is over the rail. Proximity still snaps when the user
     releases near a card, without the intermediate tug-of-war. */
  scroll-snap-type: x proximity;
  scroll-padding-left: var(--pad);
  scrollbar-width: none;
  -ms-overflow-style: none;
  cursor: grab;
  user-select: none;
  scroll-behavior: smooth;
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 var(--pad), #000 calc(100% - var(--pad)), transparent 100%);
          mask-image: linear-gradient(90deg, transparent 0, #000 var(--pad), #000 calc(100% - var(--pad)), transparent 100%);
}

.shop__rail::-webkit-scrollbar { display: none; }

.shop__rail.is-dragging {
  cursor: grabbing;
  scroll-snap-type: none;
  scroll-behavior: auto;
}

.shop__rail:focus-visible {
  outline: 2px solid rgba(167, 96, 74, 0.4);
  outline-offset: 4px;
  border-radius: 24px;
}

.shop__rail > .card {
  flex: 0 0 var(--card-w);
  width: var(--card-w);
  scroll-snap-align: start;
  scroll-snap-stop: always;
}

.shop__rail.is-dragging > .card {
  pointer-events: none;
}

.shop__rail > .card .card__media img {
  -webkit-user-drag: none;
  user-select: none;
}

/* Register --is-hover as a numeric property so CSS can smoothly
   interpolate the lift/scale/Z-pop that reads var(--is-hover)
   inside the .card__media img transform. Without this, custom
   properties are treated as text and can't be transitioned. */
@property --is-hover {
  syntax: "<number>";
  inherits: true;
  initial-value: 0;
}

.card {
  --is-hover: 0;
  position: relative;
  background: #fafaf7;
  border: 1px solid rgba(0, 0, 0, 0.06);
  border-radius: 22px;
  overflow: hidden;
  box-shadow: 0 1px 2px rgba(17, 17, 17, 0.04);
  perspective: 1000px;
  transition:
    transform 0.55s cubic-bezier(0.22, 1, 0.36, 1),
    box-shadow 0.55s cubic-bezier(0.22, 1, 0.36, 1),
    border-color 0.45s var(--ease),
    --is-hover 0.55s cubic-bezier(0.22, 1, 0.36, 1);
}

.card:hover {
  transform: translateY(-6px);
  border-color: rgba(216, 175, 122, 0.5);
  box-shadow:
    0 24px 44px -22px rgba(167, 96, 74, 0.26),
    0 12px 22px -18px rgba(17, 17, 17, 0.14),
    0 0 0 1px rgba(216, 175, 122, 0.14) inset;
}

.card__media {
  display: block;
  position: relative;
  width: 100%;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  background: #f5f1ea;
  transform-style: preserve-3d;
  color: inherit;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
}

/* Anchor-wrapped h3 inherits the h3's typography so the name still looks like
   heading text, not a default blue underlined link. */
.card__meta h3 a {
  color: inherit;
  text-decoration: none;
}

.card__meta h3 a:hover {
  color: var(--accent);
}

.card__media::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    radial-gradient(
      120% 70% at 50% 42%,
      rgba(255, 224, 178, 0.4) 0%,
      rgba(232, 215, 187, 0.22) 32%,
      rgba(167, 96, 74, 0.06) 62%,
      rgba(0, 0, 0, 0) 82%
    ),
    linear-gradient(180deg, rgba(0, 0, 0, 0) 62%, rgba(17, 17, 17, 0.1) 100%);
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.55s cubic-bezier(0.22, 1, 0.36, 1);
}

.card:hover .card__media::after { opacity: 1; }

.card__media::before {
  content: "";
  position: absolute;
  top: -15%;
  bottom: -15%;
  left: -40%;
  width: 50%;
  z-index: 2;
  background: linear-gradient(
    115deg,
    rgba(255, 255, 255, 0) 0%,
    rgba(255, 255, 255, 0.04) 30%,
    rgba(255, 240, 210, 0.45) 50%,
    rgba(255, 255, 255, 0.04) 70%,
    rgba(255, 255, 255, 0) 100%
  );
  transform: translateX(0) skewX(-16deg);
  opacity: 0;
  pointer-events: none;
  filter: blur(2px);
  transition:
    transform 0.9s cubic-bezier(0.22, 1, 0.36, 1),
    opacity 0.3s var(--ease);
}

.card:hover .card__media::before {
  transform: translateX(300%) skewX(-16deg);
  opacity: 1;
  transition:
    transform 0.9s cubic-bezier(0.22, 1, 0.36, 1) 0.05s,
    opacity 0.25s var(--ease) 0.08s;
}

.card__media img {
  position: relative;
  z-index: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform:
    translate3d(
      calc(var(--tx, 0) * 5px),
      calc(-5px * var(--is-hover, 0) + var(--ty, 0) * 4px),
      calc(var(--is-hover, 0) * 22px)
    )
    rotateY(calc(var(--tx, 0) * 8deg))
    rotateX(calc(var(--ty, 0) * -6deg))
    scale(calc(1 + var(--is-hover, 0) * 0.035));
  transform-origin: center 62%;
  transform-style: preserve-3d;
  transition:
    transform 0.45s cubic-bezier(0.22, 1, 0.36, 1),
    filter 0.7s var(--ease);
  will-change: transform;
}

.card:hover .card__media img {
  filter: drop-shadow(0 22px 18px rgba(167, 96, 74, 0.22));
}

.card__idx,
.card__tag {
  z-index: 3;
  transition: transform 0.55s cubic-bezier(0.22, 1, 0.36, 1);
}

.card:hover .card__idx { transform: translateY(-2px); }
.card:hover .card__tag { transform: translateY(-2px); }

.card h3 { position: relative; }

.card h3::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -4px;
  width: 0;
  height: 1px;
  background: linear-gradient(90deg, var(--accent) 0%, rgba(216, 175, 122, 0.9) 100%);
  transition: width 0.55s cubic-bezier(0.22, 1, 0.36, 1);
  pointer-events: none;
}

.card:hover h3::after { width: 38px; }

.card__price { transition: color 0.4s var(--ease); }
.card:hover .card__price { color: var(--accent); }

.card__idx {
  position: absolute;
  top: 14px;
  left: 14px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 32px;
  height: 24px;
  padding: 0 9px;
  border-radius: 999px;
  background: rgba(17, 17, 17, 0.82);
  backdrop-filter: blur(10px);
  color: #fff;
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  pointer-events: none;
}

.card__tag {
  position: absolute;
  top: 14px;
  right: 14px;
  padding: 5px 10px;
  border-radius: 999px;
  background: rgba(17, 17, 17, 0.82);
  backdrop-filter: blur(10px);
  color: #fff;
  font-size: 0.6rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  pointer-events: none;
}

.card__meta {
  padding: 22px 22px 22px;
  background: #fff;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

/* Small-caps eyebrow — family + concentration/size on one line.
   <b> segment carries a slightly lower opacity + normal weight to
   read as secondary metadata. */
.card__family {
  font-family: var(--font-geist-sans);
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.62);
  margin: 0;
  line-height: 1.4;
}

.card__family b {
  font-weight: 600;
  color: rgba(17, 17, 17, 0.38);
  letter-spacing: 0.22em;
}

.card__row {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 12px;
  margin-top: 2px;
}

.card h3 {
  font-family: var(--font-geist-sans);
  font-size: 1.08rem;
  font-weight: 700;
  letter-spacing: -0.018em;
  line-height: 1.18;
  color: var(--ink);
  /* Reserve two lines so cards keep uniform heights when longer product
     names (e.g. "Shaghaf Amber Infusion") wrap in narrow slots. */
  min-height: calc(1.18em * 2);
  /* Grow to take remaining row space so long names wrap gracefully
     instead of overflowing next to the price. min-width:0 avoids the
     flex item's implicit min-content floor that prevents wrapping. */
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: flex-end;
  overflow-wrap: anywhere;
}

.card__price {
  font-family: var(--font-geist-sans);
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ink);
}

.card__notes {
  font-family: var(--font-geist-sans);
  font-size: 0.82rem;
  font-weight: 500;
  line-height: 1.55;
  color: rgba(17, 17, 17, 0.62);
  margin: 4px 0 4px;
  /* Clamp to 2 lines so cards keep uniform heights when note lengths differ.
     min-height reserves the vertical space up-front — avoids grid jitter. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: calc(1.55em * 2);
  transition: color 0.35s var(--ease);
}

.card:hover .card__notes {
  color: rgba(17, 17, 17, 0.88);
}

/* Footer row — hairline divider, CTA on the left, secondary link on the right. */
.card__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  margin-top: 10px;
  padding-top: 14px;
  border-top: 1px solid rgba(17, 17, 17, 0.08);
}

.card__add {
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  flex: 1 1 auto;
  min-height: 42px;
  padding: 0 6px 0 18px;
  border: 1px solid rgba(0, 0, 0, 0.14);
  border-radius: 999px;
  background: transparent;
  color: var(--ink);
  font-family: var(--font-geist-sans);
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  cursor: pointer;
  transition:
    background 0.35s var(--ease),
    color 0.35s var(--ease),
    border-color 0.35s var(--ease);
}

.card__add .arrow {
  display: grid;
  place-items: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--ink);
  color: #fff;
  font-size: 0.8rem;
  transition:
    background 0.35s var(--ease),
    transform 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

.card__add:hover {
  background: var(--ink);
  color: #fff;
  border-color: var(--ink);
}

.card__add:hover .arrow {
  background: var(--accent);
  transform: translate(3px, -3px) rotate(-4deg);
}

.card__add:active .arrow {
  transform: translate(1px, -1px) scale(0.94);
}

/* "Details" secondary text link — sits at the right edge of the footer.
   Hairline underline draws through the whole word (right-anchored) at rest,
   then re-anchors left on hover to flip direction. */
.card__more {
  position: relative;
  flex: 0 0 auto;
  padding: 4px 2px;
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
  transition: color 0.3s var(--ease);
}

.card__more::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 1px;
  background: rgba(17, 17, 17, 0.2);
  transform-origin: right;
  transition: background 0.3s, transform 0.4s var(--ease);
}

.card__more:hover {
  color: var(--ink);
}

.card__more:hover::after {
  background: var(--ink);
  transform: scaleX(1.06);
  transform-origin: left;
}

/* -- .card__go (rounded arrow) --------------------------------------
   Compact circle CTA that sits at the right end of .card__foot next to
   .card__notes. Provides a clear "view this product" affordance without
   competing with the card's other links (media / h3 anchor). Uses the
   same ↗ arrow language and diagonal-translate hover as other CTAs on
   the site (.picks__cta, .fam__go, .card__add .arrow). */
.card__foot .card__notes {
  /* Inside the foot row, notes shares horizontal space with .card__go.
     flex + min-width:0 lets webkit-box line-clamp shrink correctly;
     margin reset removes the vertical rhythm meant for block context. */
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
}

.card__go {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  background: var(--ink);
  color: #fff;
  text-decoration: none;
  font-size: 0.95rem;
  line-height: 1;
  transition:
    background 0.4s var(--ease),
    transform 0.4s var(--ease),
    box-shadow 0.4s var(--ease);
}

.card__go span {
  display: inline-block;
  transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
}

.card__go:hover {
  background: var(--accent);
  transform: scale(1.06);
  box-shadow: 0 8px 22px -12px rgba(17, 17, 17, 0.4);
}

.card__go:hover span {
  transform: translate(3px, -3px);
}

.card__go:active {
  transform: scale(0.97);
}

.card__go:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

/* ==========================================================
   Marquee — bold running band under hero
   ========================================================== */
.mrq {
  overflow: hidden;
  padding: clamp(28px, 5vh, 56px) 0;
  background: #fff;
  border-top: 1px solid rgba(17, 17, 17, 0.06);
  border-bottom: 1px solid rgba(17, 17, 17, 0.06);
}

.mrq__row {
  display: flex;
  width: 100%;
}

.mrq__track {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: clamp(28px, 4vw, 60px);
  padding-right: clamp(28px, 4vw, 60px);
  white-space: nowrap;
  will-change: transform;
  transform: translate3d(0, 0, 0);
}

.mrq__item {
  display: inline-flex;
  align-items: center;
  flex: 0 0 auto;
}

.mrq__word {
  font-family: var(--font-geist-sans);
  font-size: clamp(3rem, 8vw, 7.5rem);
  font-weight: 600;
  letter-spacing: -0.035em;
  line-height: 0.9;
  text-transform: uppercase;
  color: var(--ink);
}

.mrq__ic {
  display: inline-grid;
  place-items: center;
  width: clamp(58px, 6vw, 96px);
  height: clamp(58px, 6vw, 96px);
  border-radius: 50%;
  background: var(--accent);
  color: #fff;
  font-size: clamp(1.6rem, 3vw, 2.6rem);
  font-weight: 400;
  line-height: 1;
  transform: rotate(-2deg);
}

.mrq__img {
  overflow: hidden;
  width: clamp(120px, 12vw, 200px);
  height: clamp(80px, 8vh, 130px);
  border-radius: 999px;
  background: #f5f1ea;
  border: 1px solid rgba(17, 17, 17, 0.06);
}

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

@media (prefers-reduced-motion: reduce) {
  .mrq__track { transform: none !important; }
}

/* ==========================================================
   Fragrance Families — bento showcase of scent categories
   ========================================================== */
.families {
  padding: clamp(90px, 11vw, 140px) var(--pad) clamp(80px, 10vw, 120px);
  background: #f9f6f0;
  color: var(--ink);
}

.families__head {
  display: grid;
  grid-template-columns: 1.15fr 0.85fr;
  align-items: end;
  gap: 48px;
  padding-bottom: 44px;
  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
}

/* Section title — matches the marquee (.pbanner__title) and cinema title system:
   Geist sans-serif at 700, non-italic, accent color for emphasis (no serif switch). */
.families__title h2 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.2rem, 4.2vw, 3.6rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  line-height: 1.02;
  color: var(--ink);
}

.families__title h2 em {
  font-family: inherit;
  font-style: normal;
  font-weight: 700;
  color: var(--accent);
  letter-spacing: inherit;
}

.families__aside {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 22px;
}

.families__intro {
  color: var(--muted);
  max-width: 44ch;
  font-size: 1rem;
  line-height: 1.6;
}

.families__all {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 8px 8px 8px 22px;
  border: 1px solid var(--ink);
  border-radius: 999px;
  background: transparent;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink);
  transition: 0.3s var(--ease);
}

.families__all .arrow {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: var(--ink);
  color: #fff;
  transition: 0.3s var(--ease);
}

.families__all:hover {
  background: var(--ink);
  color: #fff;
}

.families__all:hover .arrow {
  background: var(--accent);
  transform: translate(2px, -2px);
}

.families__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 22px;
  margin-top: 48px;
}

.fam {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 18px;
  min-height: 360px;
  padding: 26px 26px 26px;
  border-radius: 24px;
  overflow: hidden;
  isolation: isolate;
  color: var(--ink);
  text-decoration: none;
  cursor: pointer;
  transition:
    transform 0.7s var(--ease),
    box-shadow 0.6s var(--ease);
}

.fam:focus-visible {
  outline: 2px solid rgba(167, 96, 74, 0.55);
  outline-offset: 4px;
}

.fam::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -3;
  background: var(--fam-bg);
  transition: transform 1.2s var(--ease);
}

.fam::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -2;
  background:
    radial-gradient(120% 80% at 100% 0%, rgba(255, 255, 255, 0.34) 0%, rgba(255, 255, 255, 0) 60%),
    radial-gradient(80% 60% at 0% 100%, rgba(0, 0, 0, 0.08) 0%, rgba(0, 0, 0, 0) 60%);
  opacity: 0.95;
  pointer-events: none;
}

.fam:hover {
  transform: translateY(-6px);
  box-shadow: 0 30px 60px -30px rgba(0, 0, 0, 0.25);
}

.fam:hover::before {
  transform: scale(1.06);
}

.fam--floral {
  --fam-bg: linear-gradient(155deg, #fce4dc 0%, #f2c1b1 55%, #d99785 100%);
  color: #4a2018;
}

.fam--woody {
  --fam-bg: linear-gradient(155deg, #e8d5b8 0%, #b98d5c 55%, #6b4a2a 100%);
  color: #2f1e10;
}

.fam--oriental {
  --fam-bg: linear-gradient(155deg, #efd39b 0%, #c67338 45%, #5a1218 100%);
  color: #2a0808;
}

.fam--fresh {
  --fam-bg: linear-gradient(155deg, #e5ede0 0%, #b8d3c2 55%, #7ba692 100%);
  color: #17332a;
}

.fam--musk {
  --fam-bg: linear-gradient(155deg, #f3e6d0 0%, #d6bd97 55%, #967651 100%);
  color: #2f2213;
}

.fam--smoke {
  --fam-bg: linear-gradient(155deg, #d6d0c6 0%, #6f685f 55%, #1b1815 100%);
  color: #f3ede2;
}

.fam__idx {
  position: relative;
  z-index: 2;
  align-self: flex-start;
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.28em;
  padding: 6px 12px;
  border-radius: 999px;
  border: 1px solid currentColor;
  background: transparent;
  color: inherit;
  opacity: 0.78;
  text-transform: uppercase;
  transition: opacity 0.4s var(--ease);
}

.fam__product {
  position: absolute;
  top: 18px;
  right: 18px;
  width: 42%;
  height: calc(100% - 36px);
  padding: 0;
  background: transparent;
  border-radius: 0;
  object-fit: contain;
  object-position: center;
  z-index: 2;
  opacity: 0;
  transform: translateX(24px);
  transition:
    opacity 0.55s var(--ease),
    transform 0.75s var(--ease);
  pointer-events: none;
  /* Product PNGs ship with a white studio background baked into the pixels
     (no alpha channel). `multiply` blends every white pixel into whatever
     gradient sits behind it, effectively knocking the white out while the
     bottle's darker colored pixels (cap, label, liquid) stay fully visible.

     No `filter: drop-shadow` here — because these PNGs have no alpha,
     drop-shadow casts off the full rectangular image bounds and reads as
     a visible rounded-rectangle frame behind the bottle. If we ever need
     to re-ground the bottle on lighter gradients (Floral, Fresh), do it
     with a radial-gradient bloom on the .fam card background, not with
     a filter on the img. */
  mix-blend-mode: multiply;
}

/* Smoke card previously used `mix-blend-mode: luminosity` to keep the older
   red smoke.png visible on the charcoal gradient. After swapping in
   heat.png (matching card 3 / Oriental), luminosity rendered the PNG's
   baked-in white studio background as a visible light plate behind the
   bottle. Removing the override lets Smoke inherit the default `multiply`
   blend so the presentation matches card 3 exactly — no light plate. The
   bottle reads as a darker silhouette against the charcoal, which is the
   intended visual now that both cards share the same product image. */

.fam:hover .fam__product {
  opacity: 1;
  transform: translateX(0);
}

.fam__mono {
  position: absolute;
  top: 22px;
  right: 22px;
  width: clamp(72px, 6vw, 96px);
  height: clamp(72px, 6vw, 96px);
  z-index: 1;
  opacity: 0.5;
  transition: opacity 0.4s var(--ease), transform 0.7s var(--ease);
}

.fam__mono svg {
  width: 100%;
  height: 100%;
  color: currentColor;
}

.fam:hover .fam__mono {
  opacity: 0;
  transform: scale(0.7);
}

.fam__body {
  position: relative;
  z-index: 2;
  margin-top: auto;
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-width: 58%;
}

/* Card name — matches .pcard__row h3 typography (Geist sans, bold, tight tracking).
   No italic, no serif, no thin weights — same visual system as the marquee cards. */
.fam__body h3 {
  font-family: var(--font-geist-sans);
  font-size: clamp(1.8rem, 2.6vw, 2.4rem);
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1.02;
  color: inherit;
}

.fam__notes {
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: inherit;
  opacity: 0.7;
  margin-top: 6px;
}

.fam__desc {
  font-size: 0.86rem;
  line-height: 1.5;
  color: inherit;
  opacity: 0.78;
  max-width: 28ch;
  margin-top: 6px;
}

.fam__go {
  position: relative;
  z-index: 3;
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-top: 18px;
  padding: 0;
  color: inherit;
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
}

.fam__go span {
  opacity: 0.5;
  transform: translateX(-6px);
  transition:
    opacity 0.4s var(--ease),
    transform 0.4s var(--ease);
}

.fam__go b {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: currentColor;
  font-size: 0.98rem;
  font-style: normal;
  line-height: 1;
  transition:
    transform 0.4s var(--ease),
    background 0.4s var(--ease);
}

.fam--floral .fam__go b { color: #fce4dc; }
.fam--woody  .fam__go b { color: #e8d5b8; }
.fam--oriental .fam__go b { color: #efd39b; }
.fam--fresh  .fam__go b { color: #e5ede0; }
.fam--musk   .fam__go b { color: #f3e6d0; }
.fam--smoke  .fam__go b { color: #1b1815; }

.fam:hover .fam__go span {
  opacity: 1;
  transform: translateX(0);
}

.fam:hover .fam__go b {
  transform: rotate(-8deg) translate(3px, -3px);
}

@media (max-width: 1100px) {
  .families__grid { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 980px) {
  .families__head { grid-template-columns: 1fr; align-items: start; gap: 24px; }
}

@media (max-width: 640px) {
  .families__grid { grid-template-columns: 1fr; }
  .fam { min-height: 340px; }
  .fam__body { max-width: 60%; }
  .fam__product {
    opacity: 1;
    transform: none;
    width: 38%;
  }
  .fam__mono { opacity: 0; }
  .fam__go span { opacity: 1; transform: none; }
}

@media (hover: none) {
  .fam__product {
    opacity: 1;
    transform: none;
  }
  .fam__mono { opacity: 0; }
  .fam__go span { opacity: 1; transform: none; }
}

/* ==========================================================
   Horizontal Editorial Gallery — scroll-driven, sticky pin
   Palette: Obsidian / Deep Burgundy / Champagne Gold / Ivory
   ========================================================== */
.hgallery {
  --obsidian: #171310;
  --burgundy: #5a171d;
  --gold: #c6a56b;
  --ivory: #f5f0e8;
  --ivory-warm: #ede4d3;
  --hg-ease: cubic-bezier(0.76, 0, 0.24, 1);

  position: relative;
  min-height: 100vh;
  background: var(--ivory);
  color: var(--obsidian);
  font-family: var(--font-benton-sans-wide);
}

.hgallery__sticky {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
  isolation: isolate;
}

.hgallery__grain {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: 0.55;
  background:
    radial-gradient(1200px 600px at 12% 20%, rgba(198, 165, 107, 0.22) 0%, rgba(245, 240, 232, 0) 55%),
    radial-gradient(1000px 500px at 90% 80%, rgba(90, 23, 29, 0.14) 0%, rgba(245, 240, 232, 0) 55%);
}

.hgallery__sticky::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: min(40vw, 560px);
  z-index: 2;
  background: linear-gradient(
    90deg,
    var(--ivory) 0%,
    var(--ivory) 55%,
    rgba(245, 240, 232, 0) 100%
  );
  pointer-events: none;
}

.hgallery__head {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 3;
  width: min(30vw, 460px);
  height: 100%;
  padding: clamp(90px, 12vh, 140px) clamp(28px, 4vw, 60px) clamp(50px, 7vh, 80px);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: 24px;
  pointer-events: none;
}

.hgallery__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin: 0;
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: var(--burgundy);
}

.hgallery__eyebrow span {
  width: 26px;
  height: 1px;
  background: var(--gold);
}

/* Section title — matches the marquee (.pbanner__title) typography system:
   Geist sans at 700, non-italic. Burgundy accent color preserved for section palette identity. */
.hgallery__title {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.4rem, 4.6vw, 4.4rem);
  font-weight: 700;
  line-height: 1.02;
  letter-spacing: -0.035em;
  color: var(--obsidian);
  margin: 22px 0 20px;
}

.hgallery__title em {
  font-family: inherit;
  font-style: normal;
  font-weight: 700;
  color: var(--accent);
  letter-spacing: inherit;
}

.hgallery__lede {
  max-width: 30ch;
  font-size: 0.95rem;
  line-height: 1.55;
  color: rgba(23, 19, 16, 0.62);
}

.hgallery__meter {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-geist-sans);
  font-size: 0.86rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--obsidian);
  margin-top: auto;
  pointer-events: auto;
}

.hgallery__meter b {
  font-weight: 600;
  color: var(--obsidian);
  min-width: 1.6em;
  display: inline-block;
}

.hgallery__meter .hgallery__total {
  color: rgba(23, 19, 16, 0.4);
}

.hgallery__meter-bar {
  position: relative;
  flex: 1;
  min-width: 90px;
  height: 1px;
  background: rgba(23, 19, 16, 0.16);
  overflow: hidden;
}

.hgallery__meter-bar i {
  display: block;
  width: 0;
  height: 100%;
  background: var(--obsidian);
  transition: width 0.18s linear;
}

.hgallery__hint {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(23, 19, 16, 0.48);
}

.hgallery__hint-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--gold);
  box-shadow: 0 0 0 4px rgba(198, 165, 107, 0.18);
  animation: hgPulse 2.4s ease-in-out infinite;
}

@keyframes hgPulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50% { transform: scale(0.7); opacity: 0.6; }
}

.hgallery__track {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: clamp(12px, 1.6vw, 22px);
  height: 100%;
  padding: 0 clamp(60px, 8vw, 140px) 0 min(32vw, 480px);
  will-change: transform;
  transform: translate3d(0, 0, 0);
}

.hgallery__item {
  position: relative;
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  gap: 22px;
}

.hgallery__item { width: clamp(320px, 32vw, 460px); }

.hgallery__link {
  position: absolute;
  inset: 0;
  z-index: 4;
  border-radius: 22px;
  text-indent: -9999px;
  overflow: hidden;
  background: transparent;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: box-shadow 0.4s var(--hg-ease);
}

.hgallery__link:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px var(--ivory-warm), 0 0 0 4px var(--gold);
}

.hgallery__frame {
  position: relative;
  width: 100%;
  aspect-ratio: 3 / 4;
  height: clamp(440px, 66vh, 620px);
  overflow: hidden;
  border-radius: 22px;
  background: var(--ivory-warm);
  box-shadow: 0 24px 60px -20px rgba(23, 19, 16, 0.28);
}

.hgallery__frame img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform: scale(1.06);
  opacity: 0.6;
  filter: blur(6px);
  transition:
    transform 1.2s var(--hg-ease),
    opacity 0.9s var(--hg-ease),
    filter 0.9s var(--hg-ease);
}

.hgallery__item.is-in .hgallery__frame img {
  transform: scale(1);
  opacity: 1;
  filter: blur(0);
}

.hgallery__item:hover .hgallery__frame img {
  transform: scale(1.035);
}

.hgallery__frame::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(23, 19, 16, 0) 55%, rgba(23, 19, 16, 0.35) 100%);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.5s var(--hg-ease);
}

.hgallery__item:hover .hgallery__frame::after { opacity: 1; }

.hgallery__discover {
  position: absolute;
  left: 22px;
  bottom: 22px;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  border-radius: 999px;
  background: rgba(245, 240, 232, 0.94);
  color: var(--obsidian);
  font-size: 0.6rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  opacity: 0;
  transform: translateY(10px);
  transition:
    opacity 0.5s var(--hg-ease),
    transform 0.5s var(--hg-ease);
  pointer-events: none;
}

.hgallery__discover::after {
  content: "↗";
  color: var(--burgundy);
  font-weight: 500;
}

.hgallery__item:hover .hgallery__discover {
  opacity: 1;
  transform: none;
}

.hgallery__item figcaption {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 0 4px;
  opacity: 0;
  transform: translateY(14px);
  transition:
    opacity 0.8s var(--hg-ease) 0.15s,
    transform 0.8s var(--hg-ease) 0.15s;
}

.hgallery__item.is-in figcaption {
  opacity: 1;
  transform: none;
}

.hgallery__cap-i {
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--gold);
}

/* Card label — matches .pcard__row h3 / .fam__body h3: Geist sans, bold, tight tracking. */
.hgallery__item figcaption b {
  font-family: var(--font-geist-sans);
  font-size: clamp(1.3rem, 1.7vw, 1.7rem);
  font-weight: 700;
  letter-spacing: -0.025em;
  color: var(--obsidian);
  line-height: 1.1;
}

.hgallery__item figcaption em {
  font-style: normal;
  font-size: 0.82rem;
  color: rgba(23, 19, 16, 0.58);
  line-height: 1.4;
  max-width: 34ch;
}

@media (max-width: 1100px) {
  .hgallery__head {
    width: min(34vw, 420px);
  }
  .hgallery__track {
    padding-left: min(36vw, 460px);
  }
}

@media (max-width: 900px) {
  .hgallery {
    height: auto !important;
  }
  .hgallery__sticky {
    position: relative;
    height: auto;
    padding: 80px 0 60px;
  }
  .hgallery__head {
    position: relative;
    width: 100%;
    height: auto;
    padding: 0 var(--pad) 40px;
  }
  .hgallery__meter { max-width: 320px; }
  .hgallery__track {
    height: auto;
    padding: 20px var(--pad) 40px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    transform: none !important;
    scrollbar-width: none;
  }
  .hgallery__track::-webkit-scrollbar { display: none; }
  .hgallery__item {
    scroll-snap-align: start;
    width: 78vw;
  }
  .hgallery__frame { height: 58vh; }
  .hgallery__frame img {
    opacity: 1;
    filter: none;
    transform: none;
  }
  .hgallery__item figcaption {
    opacity: 1;
    transform: none;
  }
}

/* Kill the desktop left-side ivory fade on small phones. On desktop this
   ::after gradient sits behind the sticky title so cards blend in from the
   left. Below 900 px the title stacks above the track (see rule above), so
   the fade has nothing to anchor and simply paints a 40 vw ivory bar over
   the first card's caption — visible in QA on ≤ 500 px devices. */
@media (max-width: 500px) {
  .hgallery__sticky::after { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .hgallery__track { transition: none !important; }
  .hgallery__frame img {
    opacity: 1;
    filter: none;
    transform: none;
    transition: none;
  }
  .hgallery__item figcaption {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ==============================================================
   MANIFESTO — glowing editorial statement w/ scroll-fill type
   ============================================================== */
.manifesto {
  --fill: 0;
  --fill-pct: calc(var(--fill) * 100%);
  --ink-base: rgba(20, 16, 14, 0.13);
  --accent-base: rgba(167, 96, 74, 0.22);
  position: relative;
  padding: clamp(120px, 16vw, 220px) var(--pad);
  background: #ffffff;
  color: var(--ink);
  overflow: hidden;
  text-align: center;
  isolation: isolate;
}

.manifesto__glow {
  position: absolute;
  top: 46%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: min(80vw, 1000px);
  height: min(60vw, 700px);
  border-radius: 50%;
  background: radial-gradient(
    50% 50% at 50% 50%,
    rgba(230, 118, 58, 0.62) 0%,
    rgba(232, 160, 100, 0.38) 22%,
    rgba(255, 200, 140, 0.18) 46%,
    rgba(255, 220, 180, 0.08) 60%,
    transparent 74%
  );
  filter: blur(55px);
  pointer-events: none;
  z-index: 0;
  animation: manifestoGlow 9s ease-in-out infinite alternate;
}

@keyframes manifestoGlow {
  0%   { transform: translate(-50%, -50%) scale(1); opacity: 0.94; }
  100% { transform: translate(-48%, -47%) scale(1.05); opacity: 1; }
}

.manifesto__arc {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  border-radius: 50%;
  border: 1px solid rgba(20, 16, 14, 0.055);
  pointer-events: none;
  z-index: 1;
}

.manifesto__arc--outer {
  top: 6%;
  width: min(74vw, 940px);
  height: min(74vw, 940px);
}

.manifesto__arc--inner {
  top: 12%;
  width: min(58vw, 740px);
  height: min(58vw, 740px);
  border-color: rgba(20, 16, 14, 0.045);
}

.manifesto__grid {
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image:
    linear-gradient(rgba(20, 16, 14, 0.025) 1px, transparent 1px),
    linear-gradient(90deg, rgba(20, 16, 14, 0.025) 1px, transparent 1px);
  background-size: 88px 88px;
  mask-image: radial-gradient(80% 60% at 50% 40%, #000 0%, transparent 82%);
  -webkit-mask-image: radial-gradient(80% 60% at 50% 40%, #000 0%, transparent 82%);
  pointer-events: none;
}

.manifesto__ing {
  position: absolute;
  z-index: 1;
  pointer-events: none;
  opacity: 0.95;
  /* Warm red-tinted shadow anchors the red rose bloom without turning muddy;
     bottle SVG in the opposite corner still reads correctly against it. */
  filter: drop-shadow(0 22px 26px rgba(120, 20, 30, 0.22));
  will-change: transform;
}

.manifesto__ing--tr {
  top: clamp(40px, 6vw, 90px);
  right: clamp(20px, 4vw, 80px);
  width: clamp(120px, 14vw, 220px);
  --rot: 16deg;
  transform: rotate(var(--rot));
  animation: mfIngFloatTR 9s ease-in-out infinite;
}

.manifesto__ing--bl {
  bottom: clamp(40px, 6vw, 90px);
  left: clamp(20px, 4vw, 80px);
  width: clamp(140px, 15vw, 240px);
  --rot: -8deg;
  transform: rotate(var(--rot));
  animation: mfIngFloatBL 11s ease-in-out infinite -2s;
}

@keyframes mfIngFloatTR {
  0%, 100% { transform: rotate(16deg) translateY(0); }
  50%      { transform: rotate(19deg) translateY(-12px); }
}

@keyframes mfIngFloatBL {
  0%, 100% { transform: rotate(-8deg) translateY(0); }
  50%      { transform: rotate(-11deg) translateY(-10px); }
}

.manifesto__inner {
  position: relative;
  z-index: 2;
  max-width: 1100px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(18px, 2.2vw, 30px);
}

.manifesto__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.34em;
  text-transform: uppercase;
  color: rgba(20, 16, 14, 0.6);
}

.manifesto__eyebrow i {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 4px rgba(167, 96, 74, 0.14);
}

.manifesto__title {
  font-family: var(--font-geist-sans);
  font-style: normal;
  /* Benton Sans Wide reads visually larger than a normal-width sans at the
     same em-size, so this clamp is intentionally smaller than a Geist-tuned
     equivalent. Keeps "From Notes to Second Skin" comfortable across 320–2560px. */
  font-size: clamp(2.4rem, 7.5vw, 6.4rem);
  font-weight: 500;
  letter-spacing: -0.035em;
  line-height: 0.92;
  max-width: 20ch;
  margin: 0;

  color: var(--ink-base);
  -webkit-text-fill-color: transparent;
  background-image: linear-gradient(
    to bottom,
    var(--ink) 0%,
    var(--ink) var(--fill-pct),
    var(--ink-base) var(--fill-pct),
    var(--ink-base) 100%
  );
  -webkit-background-clip: text;
  background-clip: text;
  will-change: background-image;
}

.manifesto__title br { display: inline; }

.manifesto__mark {
  position: relative;
  padding: 0 0.02em;
  font-family: inherit;
  font-style: normal;
  font-weight: 700;
  display: inline-block;

  color: var(--accent-base);
  -webkit-text-fill-color: transparent;
  background-image: linear-gradient(
    to bottom,
    var(--accent) 0%,
    var(--accent) var(--fill-pct),
    var(--accent-base) var(--fill-pct),
    var(--accent-base) 100%
  );
  -webkit-background-clip: text;
  background-clip: text;
  z-index: 0;
}

.manifesto__mark::after { content: none; }

@supports not (-webkit-background-clip: text) {
  .manifesto__title { color: var(--ink); -webkit-text-fill-color: currentColor; }
  .manifesto__mark { color: var(--accent); -webkit-text-fill-color: currentColor; }
}

.manifesto__lede {
  font-family: var(--font-geist-sans);
  font-size: clamp(0.95rem, 1.35vw, 1.15rem);
  line-height: 1.65;
  color: rgba(20, 16, 14, 0.9);
  max-width: 52ch;
  margin: 4px 0 0;
}

.manifesto__soft {
  color: rgba(20, 16, 14, 0.42);
}

.manifesto__meta {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-top: 10px;
  font-family: var(--font-geist-sans);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: rgba(20, 16, 14, 0.5);
}

.manifesto__dot {
  display: inline-block;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: rgba(20, 16, 14, 0.35);
}

@media (max-width: 900px) {
  .manifesto { padding: clamp(90px, 14vw, 140px) var(--pad); }
  .manifesto__title { font-size: clamp(2rem, 9vw, 4rem); }

  .manifesto__ing--tr {
    width: clamp(90px, 22vw, 140px);
    top: 24px;
    right: 14px;
  }
  .manifesto__ing--bl {
    width: clamp(100px, 26vw, 160px);
    bottom: 24px;
    left: 14px;
  }
}

@media (max-width: 720px) {
  .manifesto__arc,
  .manifesto__grid { display: none; }
  .manifesto__glow {
    width: 110vw;
    height: 70vw;
    filter: blur(40px);
  }
  .manifesto__ing { opacity: 0.7; }
}

@media (max-width: 480px) {
  .manifesto__ing { opacity: 0.55; }
}

@media (prefers-reduced-motion: reduce) {
  .manifesto { --fill: 1; }
  .manifesto__glow { animation: none; }
}

/* ==============================================================
   TOP PICKS — split editorial: featured bestseller + chart
   ============================================================== */
.picks {
  --picks-ink: #14100e;
  --picks-warm: #f5f0e8;
  --picks-gold: #c6a56b;
  --picks-burgundy: #4a151a;
  position: relative;
  padding: 0;
  background: var(--picks-warm);
  color: var(--picks-ink);
  overflow: hidden;
}

.picks__inner {
  display: grid;
  grid-template-columns: 1fr 1fr;
  min-height: 100vh;
}

/* ---------- Left: editorial featured product (light) ---------- */
.picks__left {
  position: relative;
  isolation: isolate;
  padding: clamp(24px, 2.8vw, 40px) clamp(28px, 3.6vw, 52px);
  background: #ffffff;
  color: var(--picks-ink);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: clamp(12px, 1.4vw, 18px);
  overflow: hidden;
  min-height: clamp(340px, 44vh, 440px);
  border-right: 1px solid rgba(20, 16, 14, 0.06);
  perspective: 1000px;
}

.picks__grain { display: none; }

.picks__glow {
  position: absolute;
  inset: 0;
  z-index: 0;
  background:
    radial-gradient(55% 35% at 50% 40%, rgba(198, 165, 107, 0.10) 0%, transparent 72%),
    radial-gradient(80% 60% at 100% 0%, rgba(74, 21, 26, 0.03) 0%, transparent 60%);
  pointer-events: none;
}

.picks__topline {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
}

.picks__eyebrow {
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: rgba(20, 16, 14, 0.62);
}

.picks__stock {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(20, 16, 14, 0.62);
}

.picks__stock i {
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #4a9d5a;
  box-shadow: 0 0 0 3px rgba(74, 157, 90, 0.16);
}

.picks__feature {
  position: relative;
  z-index: 2;
  display: grid;
  place-items: center;
  flex: 1;
  min-height: 130px;
  transform-style: preserve-3d;
}

.picks__ring {
  position: absolute;
  width: clamp(170px, 20vw, 280px);
  height: clamp(170px, 20vw, 280px);
  border: 1px solid rgba(20, 16, 14, 0.12);
  border-radius: 50%;
  transform:
    translate3d(calc(var(--tx, 0) * -10px), calc(var(--ty, 0) * -10px), 0);
  transition: transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: transform;
}

.picks__ring::before,
.picks__ring::after {
  content: "";
  position: absolute;
  inset: 20px;
  border: 1px dashed rgba(20, 16, 14, 0.08);
  border-radius: 50%;
}

.picks__ring::after { inset: 44px; border-style: solid; opacity: 0.8; }

@keyframes picksRing {
  to { transform: rotate(360deg); }
}

.picks__hero {
  position: relative;
  z-index: 2;
  width: clamp(150px, 18vw, 230px);
  height: auto;
  object-fit: contain;
  filter: none;
  transform:
    rotateY(calc(var(--tx, 0) * 22deg))
    rotateX(calc(var(--ty, 0) * -18deg))
    translate3d(calc(var(--tx, 0) * 16px), calc(var(--ty, 0) * 16px), 40px);
  transform-origin: center center;
  transform-style: preserve-3d;
  transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: transform;
}

.picks__watermark {
  position: absolute;
  z-index: 1;
  bottom: -4%;
  left: 50%;
  transform:
    translateX(calc(-50% + var(--tx, 0) * 14px))
    translateY(calc(var(--ty, 0) * 8px));
  transition: transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
  font-family: var(--font-benton-sans-wide);
  font-style: normal;
  font-size: clamp(3.4rem, 6vw, 5.6rem);
  font-weight: 400;
  letter-spacing: -0.04em;
  line-height: 0.85;
  color: transparent;
  -webkit-text-stroke: 1px rgba(20, 16, 14, 0.06);
  text-transform: uppercase;
  white-space: nowrap;
  pointer-events: none;
  user-select: none;
  will-change: transform;
}

.picks__meta {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.picks__name {
  font-family: var(--font-benton-sans-wide);
  font-style: normal;
  font-size: clamp(2rem, 3.4vw, 3rem);
  font-weight: 400;
  letter-spacing: -0.02em;
  line-height: 0.95;
  color: var(--picks-ink);
}

.picks__notes {
  font-family: var(--font-geist-sans);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--picks-burgundy);
}

.picks__blurb {
  font-family: var(--font-geist-sans);
  font-size: 0.95rem;
  line-height: 1.6;
  color: rgba(20, 16, 14, 0.72);
  max-width: 44ch;
}

.picks__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  border-top: 1px solid rgba(20, 16, 14, 0.1);
  padding-top: 22px;
  margin-top: 10px;
  flex-wrap: wrap;
}

.picks__pricebox {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.picks__priceval {
  font-family: var(--font-benton-sans-wide);
  font-style: normal;
  font-size: clamp(1.7rem, 2.5vw, 2.2rem);
  color: var(--picks-ink);
  line-height: 1;
}

.picks__priceunit {
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(20, 16, 14, 0.5);
}

.picks__cta {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 4px 4px 4px 22px;
  border-radius: 999px;
  background: var(--picks-ink);
  color: #ffffff;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  transition: transform 0.4s var(--ease), background 0.4s var(--ease);
}

.picks__cta b {
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: #ffffff;
  color: var(--picks-ink);
  font-style: normal;
  font-size: 0.9rem;
  transition: transform 0.4s var(--ease);
}

.picks__cta:hover { transform: translateY(-2px); }
.picks__cta:hover b { transform: rotate(-8deg) translate(2px, -2px); }

/* ---------- Right: chart list ---------- */
.picks__right {
  position: relative;
  padding: clamp(24px, 2.8vw, 40px) clamp(28px, 3.6vw, 52px);
  background: var(--picks-warm);
  color: var(--picks-ink);
  display: flex;
  flex-direction: column;
  gap: clamp(14px, 1.6vw, 20px);
  min-height: clamp(340px, 44vh, 440px);
}

.picks__head {
  display: flex;
  flex-direction: column;
  gap: 18px;
}

.picks__label {
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: rgba(20, 16, 14, 0.6);
}

/* Section title — matches the marquee (.pbanner__title) typography system:
   Geist sans at 700. Burgundy accent color on the emphasis for section-palette identity. */
.picks__title {
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: clamp(2.2rem, 4vw, 3.4rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  line-height: 1.02;
  color: var(--picks-ink);
}

.picks__title em {
  font-family: inherit;
  font-style: normal;
  font-weight: 700;
  color: var(--picks-burgundy);
  letter-spacing: inherit;
}

.picks__lede {
  font-family: var(--font-geist-sans);
  font-size: 1rem;
  line-height: 1.6;
  color: rgba(20, 16, 14, 0.72);
  max-width: 44ch;
}

.picks__list {
  display: flex;
  flex-direction: column;
  list-style: none;
  padding: 0;
  margin: 0;
}

.pick {
  position: relative;
  border-top: 1px solid rgba(20, 16, 14, 0.14);
}

.pick:last-child {
  border-bottom: 1px solid rgba(20, 16, 14, 0.14);
}

.pick::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -1px;
  height: 2px;
  width: 0;
  background: var(--picks-burgundy);
  transition: width 0.6s var(--ease);
  pointer-events: none;
}

.pick:hover::after { width: 100%; }

/* Real anchor wrapping row content. Owns the row grid layout so children
   (rank / info / price+arrow) fill columns while the anchor provides link
   semantics (right-click, middle-click, keyboard focus).
   Thumbnails were removed — their visual weight moved to a floating cursor-follow
   image (.picks__cursor) so each row reads as clean chart data. */
.pick__link {
  display: grid;
  grid-template-columns: 44px 1fr auto;
  align-items: center;
  gap: 18px;
  padding: 18px 0;
  color: inherit;
  text-decoration: none;
  transition: padding 0.5s var(--ease);
}

.pick__link:hover {
  padding-left: 14px;
}

/* Keyboard-focus visual — compensates for the anchor having no visible box.
   Scoped to :focus-visible so mouse users don't see it. */
.pick:has(.pick__link:focus-visible) {
  outline: 2px solid var(--picks-burgundy);
  outline-offset: 4px;
  border-radius: 4px;
}

/* Chart rank number — Geist sans bold with tabular numerals so 01–04 align
   like real chart data. Higher opacity than before (0.5 → readable authority). */
.pick__rank {
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: clamp(1.5rem, 2.2vw, 2rem);
  font-weight: 700;
  color: rgba(20, 16, 14, 0.5);
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
  transition: color 0.4s var(--ease), transform 0.5s var(--ease);
}

.pick:hover .pick__rank {
  color: var(--picks-burgundy);
  transform: translateX(-2px);
}

.pick__info {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}

/* Product name — matches .pcard__row h3 / .fam__body h3: Geist sans, bold, tight tracking. */
.pick__info h4 {
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: clamp(1.1rem, 1.4vw, 1.35rem);
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1.05;
  color: var(--picks-ink);
}

.pick__info p {
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(20, 16, 14, 0.6);
}

.pick__right {
  display: flex;
  align-items: center;
  gap: 18px;
}

/* Price — Geist sans bold with tabular numerals so prices align down the column. */
.pick__price {
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: 1rem;
  font-weight: 700;
  color: var(--picks-ink);
  letter-spacing: -0.01em;
  font-variant-numeric: tabular-nums;
}

.pick__go {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  border: 1px solid rgba(20, 16, 14, 0.2);
  color: var(--picks-ink);
  font-size: 0.85rem;
  transition:
    background 0.4s var(--ease),
    color 0.4s var(--ease),
    transform 0.5s var(--ease),
    border-color 0.4s var(--ease);
}

.pick:hover .pick__go {
  background: var(--picks-ink);
  color: var(--picks-warm);
  border-color: var(--picks-ink);
  transform: rotate(-8deg) translate(1px, -1px);
}

/* ------------------------------------------------------------------
   Floating cursor-follow image reveal.
   Position (--x, --y) and tilt (--r) are written by JS every RAF frame.
   CSS owns the visual transform so paint stays on the compositor thread.
   Landscape aspect + no plate/shadow — bottle floats "naked" on the
   section background, following the cursor. */
.picks__cursor {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 4;
  width: clamp(240px, 22vw, 320px);
  aspect-ratio: 4 / 3;
  pointer-events: none;
  opacity: 0;
  transform:
    translate3d(var(--x, 0px), var(--y, 0px), 0)
    translate(-50%, -50%)
    rotate(var(--r, 0deg));
  transition: opacity 0.35s var(--ease);
  will-change: transform, opacity;
}

.picks__cursor.is-on {
  opacity: 1;
}

.picks__cursor img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  transition: opacity 0.35s var(--ease);
}

.picks__cursor img.is-swapping {
  opacity: 0;
}

/* Reduced-motion contract: image still appears on hover for context but skips
   the physics-driven follow — matches accessibility expectations. */
@media (prefers-reduced-motion: reduce) {
  .picks__cursor {
    transition: opacity 0.2s linear;
  }
  .picks__cursor img {
    transition: opacity 0.2s linear;
  }
}

.picks__all {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-top: 6px;
  padding: 4px 4px 4px 20px;
  border-radius: 999px;
  border: 1px solid rgba(20, 16, 14, 0.2);
  background: transparent;
  color: var(--picks-ink);
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  transition: background 0.4s var(--ease), color 0.4s var(--ease);
}

.picks__all b {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--picks-ink);
  color: var(--picks-warm);
  font-style: normal;
  font-size: 0.88rem;
  transition: transform 0.4s var(--ease);
}

.picks__all:hover {
  background: var(--picks-ink);
  color: var(--picks-warm);
}

.picks__all:hover b {
  background: var(--picks-warm);
  color: var(--picks-ink);
  transform: rotate(-8deg) translate(2px, -2px);
}

@media (max-width: 900px) {
  .picks__inner { grid-template-columns: 1fr; }
  .picks__left,
  .picks__right {
    min-height: auto;
    padding: clamp(40px, 7vw, 64px) clamp(24px, 6vw, 44px);
  }
  .picks__left {
    border-right: none;
    border-bottom: 1px solid rgba(20, 16, 14, 0.08);
  }
  .picks__watermark { font-size: 5rem; }
  .pick__link {
    grid-template-columns: 40px 1fr auto;
    gap: 14px;
    padding: 16px 0;
  }
  .pick__right { gap: 12px; }
  .pick__go { display: none; }
  /* Floating cursor image is hidden on touch — no cursor to follow. */
  .picks__cursor { display: none; }
}

@media (hover: none) {
  .picks__hero,
  .picks__ring,
  .picks__watermark {
    transform: none;
    transition: none;
  }
  .picks__watermark { transform: translateX(-50%); }
  .card__media img {
    transform: none;
    transition: filter 0.9s var(--ease);
  }
}

@media (max-width: 520px) {
  .picks__foot { flex-direction: column; align-items: flex-start; }
  .picks__cta { align-self: stretch; justify-content: space-between; }
}

/* ==============================================================
   CONTACT — "Let's talk"
   ============================================================== */

.talk-sec {
  position: relative;
  isolation: isolate;
  padding: clamp(80px, 10vw, 130px) var(--pad);
  background: var(--secondary);
  display: grid;
  grid-template-columns: 1fr 1.05fr;
  gap: clamp(40px, 5vw, 72px);
  align-items: start;
  overflow: hidden;
}

.talk-sec::before {
  content: "";
  position: absolute;
  top: -18%;
  left: -12%;
  width: 46vw;
  height: 46vw;
  background: radial-gradient(circle, rgba(167, 96, 74, 0.18) 0%, rgba(167, 96, 74, 0) 62%);
  filter: blur(50px);
  pointer-events: none;
  z-index: -1;
  animation: talkGlow 14s ease-in-out infinite;
}

@keyframes talkGlow {
  50% { transform: translate(20px, -14px) scale(1.05); opacity: 0.85; }
}

.talk-sec__grain {
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: 0.35;
  mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' seed='2'/><feColorMatrix values='0 0 0 0 0.55  0 0 0 0 0.4  0 0 0 0 0.3  0 0 0 0.28 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  z-index: -1;
}

/* editorial "SA" monogram watermark — sits behind the left column heading,
   same trick as .picks__watermark, uses site's Benton Sans Wide family */
.talk-sec__mark {
  position: absolute;
  top: clamp(48px, 8vw, 96px);
  left: clamp(24px, 5vw, 96px);
  font-family: var(--font-benton-sans-wide);
  font-size: clamp(9rem, 22vw, 20rem);
  font-weight: 400;
  line-height: 0.86;
  letter-spacing: -0.04em;
  color: var(--ink);
  opacity: 0.055;
  pointer-events: none;
  user-select: none;
  z-index: 0;
  white-space: nowrap;
}

.talk-sec__mark em {
  font-style: italic;
  color: var(--accent);
  opacity: 0.85;
}

.talk-sec__left {
  max-width: 540px;
  position: sticky;
  top: 100px;
  z-index: 1;
}

.talk-sec h2 {
  font-size: clamp(2.2rem, 4.4vw, 3.6rem);
  font-weight: 600;
  letter-spacing: -0.04em;
  line-height: 1.02;
}

.talk-sec h2 em,
.form h3 em {
  font-family: var(--font-benton-sans-wide);
  font-style: italic;
  font-weight: 400;
  color: var(--accent);
  letter-spacing: -0.01em;
  font-size: 1.02em;
  text-transform: none;
}

.talk-sec__lede {
  color: var(--muted);
  max-width: 44ch;
  font-size: 1rem;
  line-height: 1.65;
  margin-top: 18px;
}

.talk-sec__list {
  margin: 30px 0 24px;
  padding: 22px 0;
  border-top: 1px solid rgba(17, 17, 17, 0.14);
  border-bottom: 1px solid rgba(17, 17, 17, 0.14);
  display: flex;
  flex-direction: column;
  gap: 14px;
  list-style: none;
}

.talk-sec__list li {
  display: flex;
  align-items: baseline;
  gap: 18px;
  font-size: 0.95rem;
  color: var(--ink);
}

.talk-sec__list li b {
  min-width: 32px;
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  color: var(--accent);
}

.talk-sec__trust {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 22px;
}

.chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 12px 6px 10px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.5);
  border: 1px solid rgba(17, 17, 17, 0.08);
  font-size: 0.64rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.72);
  backdrop-filter: blur(6px);
}

.chip i {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 3px rgba(167, 96, 74, 0.18);
}

.mail {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 6px 6px 6px 22px;
  border: 1px solid var(--ink);
  border-radius: 999px;
  background: transparent;
  color: var(--ink);
  font-size: 0.78rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  transition: 0.3s var(--ease);
}

.mail .arrow {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--ink);
  color: #fff;
  transition: 0.3s var(--ease);
}

.mail:hover { background: var(--ink); color: #fff; }
.mail:hover .arrow { background: var(--accent); }

.talk-sec__meta {
  margin: 30px 0 0;
  padding-top: 22px;
  border-top: 1px dashed rgba(17, 17, 17, 0.22);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

.talk-sec__meta > div {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.talk-sec__meta dt {
  font-size: 0.6rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.44);
}

.talk-sec__meta dd {
  margin: 0;
  font-size: 0.86rem;
  color: var(--ink);
  line-height: 1.4;
}

/* ==============================================================
   FORM CARD
   ============================================================== */

.form {
  position: relative;
  z-index: 1;
  padding: clamp(28px, 3.4vw, 42px);
  background: rgba(255, 255, 255, 0.72);
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 26px;
  backdrop-filter: blur(10px);
  box-shadow:
    0 24px 60px rgba(0, 0, 0, 0.08),
    inset 0 1px 0 rgba(255, 255, 255, 0.7);
}

.form::before {
  content: "";
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  background: linear-gradient(140deg, rgba(167, 96, 74, 0.3), transparent 42%, rgba(167, 96, 74, 0.14));
  z-index: -1;
  opacity: 0;
  transition: opacity 0.45s var(--ease);
}

.form:focus-within::before { opacity: 1; }

.form__head {
  margin-bottom: 28px;
  padding-bottom: 22px;
  border-bottom: 1px solid rgba(17, 17, 17, 0.1);
}

.form__head-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  margin-bottom: 14px;
}

.form__idx {
  font-size: 0.64rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
}

.form__idx i {
  font-style: normal;
  color: var(--accent);
  margin: 0 6px;
}

.form__badge {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 5px 12px 5px 9px;
  border: 1px solid rgba(17, 17, 17, 0.1);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.65);
  font-size: 0.58rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.7);
}

.form__badge i {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #2fa77a;
  box-shadow: 0 0 0 3px rgba(47, 167, 122, 0.22);
  animation: pulseDot 2.2s ease-in-out infinite;
}

@keyframes pulseDot {
  50% { box-shadow: 0 0 0 5px rgba(47, 167, 122, 0.06); }
}

.form h3 {
  font-size: clamp(1.7rem, 2.6vw, 2.1rem);
  font-weight: 600;
  letter-spacing: -0.03em;
  line-height: 1.05;
  margin: 0;
}

.form__hint {
  margin-top: 10px;
  font-size: 0.86rem;
  color: rgba(17, 17, 17, 0.55);
  line-height: 1.5;
}

.form__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 22px 22px;
}

/* Floating-label field component */
.field {
  position: relative;
  display: block;
  padding-top: 18px;
}

.field input {
  width: 100%;
  padding: 8px 0 12px;
  border: 0;
  border-bottom: 1px solid rgba(17, 17, 17, 0.24);
  background: transparent;
  font-size: 1rem;
  color: var(--ink);
  transition: border-color 0.3s;
}

.field input:focus { outline: none; border-bottom-color: transparent; }
.field input::placeholder { color: transparent; }

.field__label {
  position: absolute;
  top: 26px;
  left: 0;
  font-size: 1rem;
  color: rgba(17, 17, 17, 0.5);
  letter-spacing: 0;
  text-transform: none;
  transform-origin: left top;
  transition:
    transform 0.28s var(--ease),
    color 0.28s var(--ease),
    top 0.28s var(--ease),
    letter-spacing 0.28s var(--ease);
  pointer-events: none;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 100%;
}

.field__label i {
  font-style: normal;
  font-size: 0.78rem;
  color: rgba(17, 17, 17, 0.34);
  margin-left: 4px;
}

.field input:not(:placeholder-shown) + .field__label,
.field input:focus + .field__label {
  top: 0;
  transform: scale(0.72);
  color: var(--accent);
  letter-spacing: 0.18em;
  text-transform: uppercase;
}

.field__bar {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  pointer-events: none;
  overflow: hidden;
}

.field__bar::before {
  content: "";
  position: absolute;
  inset: 0;
  transform: scaleX(0);
  transform-origin: left;
  background: linear-gradient(90deg, var(--accent), var(--ink));
  transition: transform 0.45s var(--ease);
}

.field input:focus ~ .field__bar::before,
.field input:not(:placeholder-shown) ~ .field__bar::before {
  transform: scaleX(1);
}

.field input:required:user-invalid ~ .field__bar::before {
  transform: scaleX(1);
  background: #b3452b;
}

.field--wide {
  grid-column: 1 / -1;
  margin-top: 22px;
}

.form__label {
  margin: 30px 0 14px;
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
}

.form .pills {
  justify-content: flex-start;
  margin-top: 0;
}

.form .pill {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 42px;
  padding: 0 16px;
  background: transparent;
  color: var(--ink);
  border: 1px solid rgba(17, 17, 17, 0.22);
  font-weight: 500;
}

.form .pill i {
  font-style: normal;
  font-size: 0.6rem;
  color: var(--accent);
  letter-spacing: 0.1em;
}

.form .pill.is-on,
.form .pill:hover {
  background: var(--ink);
  color: #fff;
  border-color: var(--ink);
}

.form .pill.is-on i,
.form .pill:hover i { color: var(--accent); }

.btn.btn--send {
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  width: 100%;
  min-height: 62px;
  margin-top: 30px;
  padding: 6px 6px 6px 26px;
  background: var(--ink);
  color: #fff;
  border-radius: 999px;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  box-shadow: 0 16px 34px rgba(0, 0, 0, 0.2);
  transition: 0.3s var(--ease);
}

.btn.btn--send:hover {
  transform: translateY(-2px);
  box-shadow: 0 22px 44px rgba(0, 0, 0, 0.26);
}

.btn.btn--send .btn__ic {
  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: #fff;
  color: var(--ink);
  font-size: 1rem;
  transition: 0.3s var(--ease);
}

.btn.btn--send:hover .btn__ic {
  background: var(--accent);
  color: #fff;
  transform: translate(3px, -3px);
}

.ok {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 18px;
  padding: 14px 18px;
  border-radius: 16px;
  background: rgba(47, 167, 122, 0.08);
  border: 1px solid rgba(47, 167, 122, 0.24);
  color: #1e6b52;
  font-size: 0.9rem;
  animation: okIn 0.5s var(--ease);
}

@keyframes okIn {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}

.ok__ic {
  display: grid;
  place-items: center;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: #2fa77a;
  color: #fff;
  flex-shrink: 0;
}

.ok__ic svg { width: 14px; height: 14px; }

.form__policy {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 14px;
  font-size: 0.72rem;
  color: rgba(17, 17, 17, 0.5);
}

.form__policy i {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  display: inline-block;
  flex-shrink: 0;
}

/* ==============================================================
   FOOTER — Minimal light editorial (reference-matched)
   Tokens used: --bg, --ink, --muted, --accent, --line, --ease, --pad
   ============================================================== */

.foot {
  position: relative;
  isolation: isolate;
  /* Horizontal edges match the nav bar so header and footer sit on the same rail. */
  padding: clamp(48px, 6vw, 84px) var(--section-pad) 26px;
  background: var(--bg);
  color: var(--ink);
  border-top: 1px solid rgba(17, 17, 17, 0.08);
}

.foot__top {
  display: grid;
  grid-template-columns: minmax(280px, 1.15fr) 1fr 1fr;
  gap: clamp(32px, 5vw, 84px);
  padding-bottom: clamp(40px, 5vw, 64px);
}

.foot__col {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 0;
}

.foot__col--brand { gap: 22px; }

/* brand lockup — logo + tagline */
.foot__logo {
  display: inline-block;
  padding: 0;
  background: none;
  border: 0;
  transition: transform 0.35s var(--ease);
  align-self: flex-start;
}

.foot__logo img {
  display: block;
  height: 38px;
  width: auto;
  object-fit: contain;
}

.foot__logo:hover { transform: translateY(-1px); }

.foot__lede {
  margin: -6px 0 0;
  max-width: 340px;
  font-size: 0.86rem;
  line-height: 1.55;
  color: rgba(17, 17, 17, 0.62);
}

.foot__lede em {
  font-family: var(--font-benton-sans-wide);
  font-style: italic;
  font-weight: 400;
  color: var(--accent);
  font-size: 1.05em;
  letter-spacing: -0.005em;
}

/* editorial index tag beside nav headings */
.foot__hd-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  margin-bottom: 14px;
}

.foot__col--nav .foot__hd-row .foot__hd { margin-bottom: 0; }

.foot__idx {
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}

.foot__hd {
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ink);
  margin: 0;
  line-height: 1.3;
}

.foot__hd--sm {
  font-size: 0.9rem;
  font-weight: 600;
  margin-bottom: 12px;
}

.foot__col--nav { gap: 10px; }
.foot__col--nav .foot__hd { margin-bottom: 14px; }

.foot__col--nav a {
  position: relative;
  color: var(--ink);
  font-size: 0.9rem;
  line-height: 1.5;
  width: fit-content;
  transition: color 0.25s var(--ease);
}

.foot__col--nav a::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -2px;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s var(--ease);
}

.foot__col--nav a:hover { color: var(--accent); }
.foot__col--nav a:hover::after { transform: scaleX(1); }

/* ---- newsletter ---- */
.foot__news {
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 4px 4px 4px 14px;
  border: 1px solid rgba(17, 17, 17, 0.85);
  border-radius: 999px;
  background: var(--bg);
  transition: border-color 0.3s, box-shadow 0.3s;
  max-width: 380px;
}

.foot__news:focus-within {
  border-color: var(--ink);
  box-shadow: 0 0 0 3px rgba(17, 17, 17, 0.06);
}

.foot__news input {
  flex: 1;
  min-height: 38px;
  background: transparent;
  border: 0;
  color: var(--ink);
  font-size: 0.86rem;
  letter-spacing: 0;
  padding: 0 8px 0 0;
  min-width: 0;
}

.foot__news input:focus { outline: none; }
.foot__news input::placeholder { color: rgba(17, 17, 17, 0.42); font-size: 0.85rem; }

.foot__news button {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 36px;
  padding: 0 8px 0 18px;
  border-radius: 999px;
  background: var(--ink);
  color: #fff;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease), transform 0.3s var(--ease);
}

.foot__news button .arrow {
  display: grid;
  place-items: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.14);
  color: #fff;
  font-size: 0.78rem;
  transition: 0.3s var(--ease);
}

.foot__news button:hover {
  background: var(--accent);
  transform: translateY(-1px);
}

.foot__news button:hover .arrow {
  background: rgba(255, 255, 255, 0.24);
  transform: translate(2px, -2px);
}

/* ---- socials + cruelty-free badge (inline row) ---- */
.foot__badges {
  display: flex;
  align-items: center;
  gap: 14px;
  flex-wrap: wrap;
}

.foot__social {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border: 1px solid rgba(17, 17, 17, 0.3);
  border-radius: 50%;
  color: var(--ink);
  transition: 0.25s var(--ease);
}

.foot__social svg { width: 14px; height: 14px; }

.foot__social:hover {
  background: var(--ink);
  color: var(--bg);
  transform: translateY(-1px);
}

.foot__cf {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 2px 12px 2px 4px;
  border-radius: 999px;
}

.foot__cf-ic {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  color: var(--accent);
}

.foot__cf-ic svg { width: 26px; height: 26px; }

.foot__cf-txt {
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink);
  line-height: 1.1;
}

/* ---- country select ---- */
.foot__region { margin-top: 4px; }

.foot__select {
  position: relative;
  max-width: 380px;
}

.foot__select select {
  width: 100%;
  min-height: 44px;
  padding: 0 40px 0 18px;
  background: var(--bg);
  color: var(--ink);
  border: 1px solid rgba(17, 17, 17, 0.85);
  border-radius: 999px;
  font-family: var(--font-geist-sans);
  font-size: 0.88rem;
  font-weight: 500;
  letter-spacing: 0;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  transition: border-color 0.3s, box-shadow 0.3s;
}

.foot__select select:focus {
  outline: none;
  border-color: var(--ink);
  box-shadow: 0 0 0 3px rgba(17, 17, 17, 0.06);
}

.foot__select-caret {
  position: absolute;
  right: 16px;
  top: 50%;
  transform: translateY(-50%);
  display: grid;
  place-items: center;
  pointer-events: none;
  color: var(--ink);
}

.foot__select-caret svg { width: 12px; height: 8px; }

/* ---- centered serif wordmark with flanking hairlines + small-caps sub ---- */
.foot__wordmark {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: clamp(18px, 3vw, 40px);
  padding: clamp(28px, 3.4vw, 44px) 0 clamp(20px, 2.6vw, 32px);
  user-select: none;
}

.foot__wordmark-rule {
  height: 1px;
  background: linear-gradient(to right, rgba(17, 17, 17, 0), rgba(17, 17, 17, 0.18) 30%, rgba(17, 17, 17, 0.18) 70%, rgba(17, 17, 17, 0));
}

.foot__wordmark-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
}

/* Big centered footer wordmark — image mark (logo.avif). Sized to visually
   match the height of the previous text lockup; scales with viewport. */
.foot__wordmark-img {
  display: block;
  height: clamp(44px, 5.2vw, 72px);
  width: auto;
  object-fit: contain;
  user-select: none;
  -webkit-user-drag: none;
}

.foot__wordmark-sub {
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
  white-space: nowrap;
}

/* ---- fine legal bar ---- */
.foot__bot {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 6px 14px;
  padding-top: 20px;
  border-top: 1px solid rgba(17, 17, 17, 0.06);
  font-size: 0.78rem;
  color: rgba(17, 17, 17, 0.6);
}

.foot__bot a {
  color: rgba(17, 17, 17, 0.72);
  transition: color 0.25s;
}

.foot__bot a:hover { color: var(--accent); }

.foot__sep {
  color: rgba(17, 17, 17, 0.24);
  user-select: none;
}

.foot__copy { color: rgba(17, 17, 17, 0.56); }

.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.9s var(--ease), transform 0.9s var(--ease);
}

.reveal.is-in {
  opacity: 1;
  transform: none;
}

.hero .reveal:nth-child(1) { transition-delay: 0.05s; }
.hero .reveal:nth-child(2) { transition-delay: 0.16s; }
.hero .reveal:nth-child(3) { transition-delay: 0.28s; }

.veil {
  position: fixed;
  inset: 0;
  z-index: 50;
  background: rgba(17, 17, 17, 0.28);
}

.bag,
.sheet {
  position: fixed;
  z-index: 60;
  background: var(--white);
  visibility: hidden;
  opacity: 0;
  transition: 0.4s var(--ease);
}

.bag {
  top: 0;
  right: 0;
  width: min(400px, 100%);
  height: 100%;
  display: flex;
  flex-direction: column;
  border-radius: 24px 0 0 24px;
  transform: translateX(18px);
}

.sheet {
  inset: 50% auto auto 50%;
  width: min(840px, calc(100% - 24px));
  max-height: calc(100vh - 32px);
  overflow: auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  border-radius: 28px;
  transform: translate(-50%, -48%);
}

.bag.open,
.sheet.open {
  visibility: visible;
  opacity: 1;
}

.bag.open { transform: none; }
.sheet.open { transform: translate(-50%, -50%); }

.bag header,
.sheet__row,
.line {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.bag header { padding: 24px; border-bottom: 1px solid var(--line); }
.bag header h2,
.sheet h2 { font-size: 1.6rem; }
.bag__list { flex: 1; overflow: auto; padding: 8px 24px 24px; }
.bag footer { padding: 20px 24px 24px; border-top: 1px solid var(--line); }
.bag footer p {
  display: flex;
  justify-content: space-between;
  margin-bottom: 8px;
}

.line {
  gap: 12px;
  padding: 16px 0;
  border-bottom: 1px solid var(--line);
}

.line img {
  width: 58px;
  height: 74px;
  border-radius: 10px;
}

.sheet img { min-height: 440px; }
.sheet > div { padding: 32px; }
.sheet__x { position: absolute; top: 18px; right: 18px; z-index: 2; }
.empty { color: var(--muted); padding: 28px 0; }

@media (max-width: 1180px) {
  .nav__mid,
  .talk { display: none; }
  .nav__burger { display: block; }
}

@media (max-width: 1100px) {
  .shop__rail { --card-w: clamp(240px, 34vw, 300px); }
}

@media (max-width: 900px) {
  .shop__rail { --card-w: clamp(220px, 62vw, 280px); }

  /* Center-snap on touch viewports: the active card sits with equal air on
     the left and right of the viewport rather than hugging the left edge.
     The formula reads --card-w dynamically, so it stays in sync with the
     narrower --card-w overrides at ≤640px / ≤560px / ≤480px without any
     per-breakpoint duplication. Vertical padding stays untouched (only
     padding-inline is overridden). */
  .shop__rail {
    padding-inline: calc((100vw - var(--card-w)) / 2);
    scroll-padding-inline: calc((100vw - var(--card-w)) / 2);
  }

  .shop__rail > .card { scroll-snap-align: center; }
}

@media (max-width: 560px) {
  .shop__rail { --card-w: 78vw; }
}

@media (max-width: 980px) {
  .hero,
  .shop__head,
  .talk-sec,
  .form__grid,
  .sheet,
  .foot__top {
    grid-template-columns: 1fr;
  }

  .shop__head { align-items: start; gap: 24px; }

  .hero {
    padding-top: 100px;
    text-align: left;
  }

  .hero h1 { font-size: clamp(2.6rem, 10vw, 3.4rem); }
  .hero { padding: 120px var(--pad) 100px; }

  .talk-sec__left { position: static; top: auto; }
  .talk-sec__mark {
    top: clamp(24px, 6vw, 48px);
    left: clamp(12px, 4vw, 24px);
    font-size: clamp(7rem, 32vw, 14rem);
    opacity: 0.045;
  }

  /* footer collapses to a single column stack */
  .foot__top {
    grid-template-columns: 1fr;
    gap: 44px;
    padding-bottom: 44px;
  }
  .foot__news,
  .foot__select { max-width: 100%; }
}

/* ==============================================================
   HERO — laptop tier (981–1280px)
   ------------------------------------------------------------
   Desktop >1280px keeps the existing tuning (padding-bottom 88px,
   h1 clamp up to 4.5rem, btn--light 60px tall). On 1280px laptops
   two things need to happen so the hero doesn't feel oversized:

   1) Bottom-align the left-column block with the .hero__sound
      "Play Sound" button. The sound button uses
      bottom: clamp(24px, 3vw, 40px); the hero's own
      padding-bottom is 88px on desktop — so on a laptop the
      "Scent that feels." block was sitting ~50px higher than
      the sound button. Mirror the exact same clamp on the
      hero's padding-bottom so both baselines resolve to the
      identical pixel at every viewport in this range.

   2) Trim the type + button sizes ~15–20% so the hero doesn't
      read as if it were rendered on a 27" monitor. Tap targets
      still meet the 44px minimum.
   ============================================================== */
@media (min-width: 981px) and (max-width: 1280px) {
  .hero {
    padding: 96px var(--pad) clamp(24px, 3vw, 40px);
  }

  .hero h1 { font-size: clamp(2rem, 3.4vw, 3rem); margin-bottom: 14px; }
  .hero__lede { font-size: 0.92rem; }
  .hero__cta { gap: 18px; margin-top: 20px; }

  .btn.btn--light {
    min-height: 52px;
    padding: 5px 5px 5px 22px;
    gap: 12px;
    font-size: 0.72rem;
  }
  .btn__ic { width: 40px; height: 40px; font-size: 0.9rem; }

  .ghost-link { height: 52px; font-size: 0.68rem; }
}

/* ==============================================================
   LOADER — laptop tier (981–1280px)
   ------------------------------------------------------------
   Base loader sizing was tuned for 1440–1920px monitors:
     .loader__stage width caps at 190px (→ ~352px tall via
     aspect-ratio 140/260), .loader__num caps at 8.5rem (~136px),
     mid-row gap caps at 34px, grid padding caps at 48px.
   Total mid-column intrinsic height on a 1280px viewport ~750px,
   which is taller than a 720p laptop, so the "100%" counter was
   being clipped at the fold. Trim each piece proportionally so
   the loader fits comfortably inside 720px height.

   Everything scales through the same clamp() expressions, only
   with tighter caps — the fluid low-end still governs narrower
   laptops (say 1024px) so nothing snaps between viewports.
   ============================================================== */
@media (min-width: 981px) and (max-width: 1280px) {
  .loader__grid { padding: clamp(20px, 2.4vw, 32px); }
  .loader__brand img { height: 28px; }
  .loader__row--mid { gap: clamp(14px, 1.8vw, 22px); }
  .loader__stage { width: clamp(90px, 12vw, 140px); }
  .loader__status { font-size: 0.68rem; }
  .loader__num { font-size: clamp(3.5rem, 9vw, 6rem); }
}

/* ==============================================================
   FAMILIES — laptop tier (981–1280px)
   ------------------------------------------------------------
   Layers cleanly over the existing column-count breakpoints:
     • >1280px → desktop (3-col, base sizes)
     • 1101–1280 → this tier + 3-col (rules in this block only)
     • 981–1100 → this tier + 2-col (existing 1100px rule wins)
     • ≤980 → head stacks (existing 980px rule)
   Everything here is padding + typography + card intrinsic height,
   orthogonal to grid column count — nothing here interferes with
   the responsive column cascade already in place.
   ============================================================== */
@media (min-width: 981px) and (max-width: 1280px) {
  .families {
    padding: clamp(64px, 8vw, 96px) var(--pad) clamp(56px, 7vw, 84px);
  }
  .families__head { padding-bottom: 32px; gap: 32px; }
  .families__title h2 { font-size: clamp(1.9rem, 3.2vw, 2.6rem); }
  .families__intro { font-size: 0.92rem; }
  .families__grid { gap: 18px; margin-top: 36px; }

  .fam { min-height: 300px; padding: 22px; gap: 14px; }
  .fam__idx { font-size: 0.58rem; padding: 5px 10px; letter-spacing: 0.24em; }
  .fam__body h3 { font-size: clamp(1.5rem, 2.2vw, 1.9rem); }
  .fam__notes { font-size: 0.58rem; }
  .fam__desc { font-size: 0.8rem; max-width: 24ch; }
  .fam__go { font-size: 0.62rem; margin-top: 12px; }
  .fam__go b { width: 34px; height: 34px; font-size: 0.86rem; }
  .fam__mono {
    top: 18px;
    right: 18px;
    width: clamp(60px, 5vw, 78px);
    height: clamp(60px, 5vw, 78px);
  }
  .fam__product { top: 14px; right: 14px; width: 40%; }
}

@media (max-width: 640px) {
  .talk-sec__meta { grid-template-columns: 1fr 1fr; }
  .foot__bot { justify-content: flex-start; text-align: left; }
  /* collapse the flanking hairlines on narrow screens */
  .foot__wordmark { grid-template-columns: 1fr; }
  .foot__wordmark-rule { display: none; }
}

@media (max-width: 560px) {
  .foot { padding: clamp(48px, 8vw, 72px) var(--pad) 92px; }
  .foot__wordmark-img { height: clamp(38px, 9vw, 56px); }
  .foot__wordmark-sub { letter-spacing: 0.22em; font-size: 0.58rem; }
}

.cinema {
  --cinema-p: 0;
  position: relative;
  height: 240vh;
  background: #ffffff;
  color: #000;
}

.cinema__sticky {
  position: sticky;
  top: 0;
  height: 100vh;
  width: 100%;
  overflow: hidden;
  display: block;
  background: #ffffff;
}

.cinema__grain {
  display: none;
}

.cinema__intro {
  position: absolute;
  top: clamp(80px, 12vh, 140px);
  left: 50%;
  transform: translateX(-50%) translateY(calc(var(--cinema-p) * -24px));
  text-align: center;
  z-index: 3;
  width: min(720px, 90vw);
  opacity: calc(1 - var(--cinema-p) * 1.6);
  transition: opacity 0.15s linear;
  pointer-events: none;
}

.cinema__intro .label {
  color: #000;
  justify-content: center;
}

.cinema__intro .label i {
  background: #000;
  box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.08);
}

.cinema__intro .label span {
  color: rgba(0, 0, 0, 0.55);
  border-left-color: rgba(0, 0, 0, 0.14);
}

.cinema__intro h2 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.6rem, 6.4vw, 5.2rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  line-height: 1;
  color: #000;
  margin-top: 10px;
}

.cinema__intro h2 em {
  font-style: normal;
  color: #000;
  font-weight: 700;
}

.cinema__lede {
  margin-top: 14px;
  color: rgba(0, 0, 0, 0.62);
  font-size: clamp(0.95rem, 1.2vw, 1.05rem);
  font-weight: 500;
  line-height: 1.55;
}

.cinema__frame {
  position: absolute;
  inset: 0;
  z-index: 2;
  transform-origin: 50% 100%;
  transform:
    translateY(calc((1 - var(--cinema-p)) * -6vh))
    scale(calc(0.32 + var(--cinema-p) * 0.68));
  border-radius: calc((1 - var(--cinema-p)) * 24px);
  overflow: hidden;
  background: #000;
  box-shadow:
    0 40px 90px -30px rgba(0, 0, 0, 0.28),
    0 20px 40px -20px rgba(0, 0, 0, 0.14),
    0 0 0 1px rgba(0, 0, 0, 0.06) inset;
  will-change: transform, border-radius;
}

.cinema__vid {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.cinema__frame::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0.35) 0%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 70%, rgba(0, 0, 0, 0.5) 100%);
  pointer-events: none;
  opacity: calc(1 - var(--cinema-p) * 0.55);
  transition: opacity 0.2s linear;
}

.cinema__badge {
  position: absolute;
  top: 16px;
  left: 16px;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.9);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border: 1px solid rgba(0, 0, 0, 0.06);
  color: #000;
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  opacity: calc(1 - var(--cinema-p) * 1.4);
  transform: scale(calc(1 / (0.32 + var(--cinema-p) * 0.68)));
  transform-origin: top left;
  transition: opacity 0.2s linear;
}

.cinema__badge b { font-weight: 800; }
.cinema__badge i {
  font-style: normal;
  font-weight: 500;
  color: rgba(0, 0, 0, 0.55);
  font-size: 0.64rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.cinema__hint {
  position: absolute;
  bottom: clamp(20px, 4vh, 44px);
  left: 50%;
  transform: translateX(-50%);
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  color: rgba(0, 0, 0, 0.6);
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  opacity: calc(1 - var(--cinema-p) * 3);
  pointer-events: none;
}

.cinema__hint b {
  font-style: normal;
  font-weight: 400;
  font-size: 0.9rem;
  animation: cinemaBob 1.8s ease-in-out infinite;
}

@keyframes cinemaBob {
  0%, 100% { transform: translateY(0); opacity: 0.6; }
  50% { transform: translateY(4px); opacity: 1; }
}

@media (max-width: 900px) {
  .cinema {
    --cinema-p: 1;
    height: auto;
  }

  .cinema__sticky {
    position: relative;
    height: auto;
    padding: clamp(80px, 12vw, 120px) var(--pad) clamp(80px, 12vw, 120px);
  }

  .cinema__intro {
    position: relative;
    top: auto;
    left: auto;
    transform: none;
    opacity: 1;
    margin-bottom: 32px;
    text-align: left;
    width: 100%;
  }

  .cinema__intro .label { justify-content: flex-start; }

  .cinema__frame {
    position: relative;
    inset: auto;
    width: 100%;
    aspect-ratio: 9 / 14;
    max-height: 80vh;
    transform: none;
    border-radius: 22px;
    box-shadow: 0 24px 60px -22px rgba(0, 0, 0, 0.22);
  }

  .cinema__frame::after { opacity: 0.3; }

  .cinema__badge { transform: none; opacity: 1; }

  .cinema__hint { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation: none !important;
    transition: none !important;
  }

  .reveal,
  .nav,
  .hero__left,
  .hero__sound { opacity: 1; transform: none; }

  .loader { display: none; }
}

/* ==========================================================
   SHOP PAGES — products / product / cart / checkout
   ----------------------------------------------------------
   Consumes existing tokens: --accent, --ink, --bg, --secondary,
   --gray, --muted, --line, --ease, --pad, --font-geist-sans
   No new palette; layered on top of the home-page system.
   ========================================================== */

/* -- Inner-page nav (shop pages) ---------------------------- */
.nav--inner {
  position: sticky;
  top: 0;
  left: auto;
  right: auto;
  z-index: 40;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 14px clamp(20px, 4vw, 48px);
  background: rgba(255, 255, 255, 0.94);
  backdrop-filter: blur(18px) saturate(1.2);
  border-bottom: 1px solid rgba(17, 17, 17, 0.06);
  transition: none;
}

.nav--inner .brand img {
  height: 44px;
  filter: none;
}

.nav__inner-links {
  display: flex;
  align-items: center;
  gap: 4px;
}

.nav__inner-links a {
  position: relative;
  padding: 10px 14px;
  border-radius: 999px;
  color: rgba(17, 17, 17, 0.72);
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: color 0.3s var(--ease), background 0.3s;
}

.nav__inner-links a:hover {
  color: var(--ink);
  background: rgba(17, 17, 17, 0.04);
}

.nav__inner-links a.is-active {
  color: var(--ink);
  background: rgba(17, 17, 17, 0.06);
}

.nav__inner-right {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.nav__inner-right .nav__ic {
  width: 40px;
  height: 40px;
  color: var(--ink);
  border: 1px solid rgba(17, 17, 17, 0.1);
  background: #fff;
  border-radius: 50%;
}

.nav__inner-right .nav__ic:hover {
  background: rgba(17, 17, 17, 0.04);
}

.nav__bag-link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  height: 40px;
  padding: 0 6px 0 16px;
  border: 1px solid rgba(17, 17, 17, 0.1);
  border-radius: 999px;
  background: #fff;
  color: var(--ink);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: 0.25s var(--ease);
}

.nav__bag-link:hover {
  background: var(--ink);
  color: #fff;
}

.nav__bag-link b {
  display: grid;
  place-items: center;
  min-width: 28px;
  height: 28px;
  padding: 0 8px;
  border-radius: 999px;
  background: var(--accent);
  color: #fff;
  font-weight: 600;
  font-size: 0.72rem;
  letter-spacing: 0;
}

.nav__bag-link b.is-empty {
  background: rgba(17, 17, 17, 0.14);
}

/* -- Page container shell ----------------------------------- */
.page {
  min-height: calc(100vh - 200px);
  background: var(--bg);
  color: var(--ink);
}

/* ==========================================================
   Products page — cinematic video hero (.pvideo)
   ----------------------------------------------------------
   Structure:
     .pvideo           — outer section; horizontal padding uses --section-pad
                         so the section sits on the same rail as header/footer
     .pvideo__stage    — video wrapper, capped at --section-max, rounded
     .pvideo__media    — the <video> element itself
     .pvideo__grad     — bottom-fade gradient for legibility
     .pvideo__inner    — text column BELOW the video, same rail

   Vertical rhythm — --pvideo-gap is the vertical breathing above AND below
   the video. Same variable drives .pvideo's padding-top and .pvideo__inner's
   margin-top so the video is visually balanced.
   ========================================================== */
.pvideo {
  --pvideo-gap: clamp(96px, 9vw, 128px);
  position: relative;
  background: #fff;
  /* Top = bottom-below-video (both --pvideo-gap). Horizontal matches header rail.
     Section's own padding-bottom is smaller — the "bottom breathing" of the video
     lives on .pvideo__inner's margin-top, not on the section. */
  padding: var(--pvideo-gap) var(--section-pad) clamp(40px, 5vw, 64px);
}

.pvideo__stage {
  position: relative;
  width: 100%;
  /* Follow the same content cap as header/footer/grid — the video is a card,
     not a full-bleed element. */
  max-width: var(--section-max);
  margin: 0 auto;
  aspect-ratio: 21 / 9;
  border-radius: 16px;
  overflow: hidden;
  isolation: isolate;
  background: #0f0d0b;
}

.pvideo__media {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
  object-position: center;
  filter: saturate(1.02) contrast(1.02);
  z-index: 1;
}

.pvideo__grad {
  position: absolute;
  inset: auto 0 0 0;
  height: 45%;
  background: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0) 0%,
    rgba(0, 0, 0, 0.08) 60%,
    rgba(0, 0, 0, 0.22) 100%
  );
  pointer-events: none;
  z-index: 2;
}

.pvideo__inner {
  position: relative;
  width: 100%;
  /* Same content cap as .pvideo__stage — video and text sit inside the same rail.
     Parent .pvideo already applies --section-pad horizontal padding, so no
     extra horizontal padding here. */
  max-width: var(--section-max);
  /* margin-top matches .pvideo's padding-top (--pvideo-gap) so the space
     above and below the video is symmetric. */
  margin: var(--pvideo-gap) auto 0;
  padding: 0;
}

.pvideo__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  padding: 8px 16px 8px 4px;
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 999px;
  background: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.6);
  margin-bottom: 32px;
}

.pvideo__rule {
  display: inline-block;
  width: 32px;
  height: 1px;
  background: var(--ink);
  margin-left: 12px;
  opacity: 0.55;
}

.pvideo__eyebrow b {
  font-weight: 700;
  color: var(--ink);
}

.pvideo__eyebrow i {
  font-style: normal;
  color: rgba(17, 17, 17, 0.3);
}

.pvideo__title {
  font-family: var(--font-geist-sans);
  /* Reduced from clamp(2.8rem, 6.4vw, 5.8rem) — Benton Sans Wide reads
     visually larger than a normal-width sans at the same em, so this
     clamp is dialed down ~22% across all three stops. */
  font-size: clamp(2.2rem, 5vw, 4.6rem);
  font-weight: 700;
  line-height: 0.94;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  color: #000;
  margin: 0 0 28px;
  max-width: 20ch;
}

.pvideo__title em {
  font-style: normal;
  color: var(--accent);
  font-weight: 700;
  -webkit-text-fill-color: currentColor;
}

.pvideo__lede {
  max-width: 62ch;
  font-family: var(--font-geist-sans);
  font-size: clamp(0.98rem, 1.2vw, 1.12rem);
  font-weight: 500;
  line-height: 1.6;
  color: rgba(17, 17, 17, 0.7);
  margin: 0 0 44px;
}

.pvideo__foot {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 32px;
  flex-wrap: wrap;
  padding-top: 28px;
  border-top: 1px solid rgba(17, 17, 17, 0.08);
}

.pvideo__meta {
  display: grid;
  grid-template-columns: repeat(4, auto);
  gap: 20px 44px;
  margin: 0;
}

.pvideo__meta > div {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}

.pvideo__meta dt {
  font-family: var(--font-geist-sans);
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
}

.pvideo__meta dd {
  font-family: var(--font-geist-sans);
  font-size: 0.96rem;
  font-weight: 700;
  color: var(--ink);
  margin: 0;
  letter-spacing: -0.01em;
}

.pvideo__feat {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  padding: 12px 12px 12px 20px;
  border: 1px solid rgba(17, 17, 17, 0.1);
  border-radius: 999px;
  background: #fff;
  color: var(--ink);
  transition: 0.35s var(--ease);
}

.pvideo__feat:hover {
  background: var(--ink);
  color: #fff;
  border-color: var(--ink);
}

.pvideo__feat-lbl {
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
  transition: color 0.3s;
}

.pvideo__feat:hover .pvideo__feat-lbl {
  color: rgba(245, 239, 229, 0.6);
}

.pvideo__feat-name {
  font-family: var(--font-geist-sans);
  font-size: 0.94rem;
  font-weight: 700;
  letter-spacing: -0.005em;
}

.pvideo__feat-name i {
  font-style: normal;
  color: var(--accent);
  font-weight: 600;
}

.pvideo__feat:hover .pvideo__feat-name i {
  color: #e5b898;
}

.pvideo__feat-arrow {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: rgba(17, 17, 17, 0.06);
  color: var(--ink);
  font-size: 0.9rem;
  transition: transform 0.3s var(--ease), background 0.3s, color 0.3s;
}

.pvideo__feat:hover .pvideo__feat-arrow {
  background: #fff;
  color: var(--ink);
  transform: translate(2px, -2px);
}

@media (max-width: 900px) {
  .pvideo {
    /* Tighter vertical rhythm on mobile — --pvideo-gap drives both the
       space above the video and .pvideo__inner's margin-top, so the video
       stays symmetric here too. */
    --pvideo-gap: 88px;
    padding-bottom: 32px;
  }
  .pvideo__stage {
    /* Taller aspect on mobile so the video still reads cinematically
       when the viewport narrows. */
    aspect-ratio: 16 / 11;
    border-radius: 12px;
  }
  .pvideo__title {
    font-size: clamp(1.9rem, 7vw, 2.8rem);
  }
  .pvideo__foot {
    flex-direction: column;
    align-items: flex-start;
    gap: 20px;
  }
  .pvideo__meta {
    grid-template-columns: repeat(2, auto);
    gap: 16px 32px;
  }
}

@media (max-width: 560px) {
  .pvideo__stage {
    border-radius: 10px;
  }
}

/* -- Editorial banner (products page) — white/black marquee-style hero -- */
.pbanner {
  position: relative;
  isolation: isolate;
  min-height: min(78vh, 720px);
  padding: clamp(120px, 10vw, 168px) clamp(24px, 5vw, 80px) clamp(48px, 6vw, 80px);
  background: #ffffff;
  color: var(--ink);
  overflow: hidden;
  border-bottom: 1px solid rgba(17, 17, 17, 0.06);
}

.pbanner__grain { display: none; }
.pbanner__glow  { display: none; }

.pbanner__inner {
  position: relative;
  z-index: 2;
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  gap: clamp(40px, 6vw, 96px);
  align-items: center;
  max-width: 1400px;
  margin: 0 auto;
}

/* Left column — editorial copy */
.pbanner__left {
  max-width: 640px;
}

.pbanner__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  padding: 8px 16px 8px 4px;
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 999px;
  background: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.6);
  margin-bottom: 32px;
}

.pbanner__rule {
  display: inline-block;
  width: 32px;
  height: 1px;
  background: var(--ink);
  margin-left: 12px;
  opacity: 0.55;
}

.pbanner__eyebrow b {
  font-weight: 700;
  color: var(--ink);
}

.pbanner__eyebrow i {
  font-style: normal;
  color: rgba(17, 17, 17, 0.3);
}

.pbanner__title {
  font-family: var(--font-geist-sans);
  /* Reduced from clamp(3rem, 7vw, 6.4rem) — kept in lockstep with
     .pvideo__title so the two collection-page hero variants remain
     visually equivalent. */
  font-size: clamp(2.4rem, 5.4vw, 4.8rem);
  font-weight: 700;
  line-height: 0.94;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  margin: 0 0 28px;
  color: #000;
}

.pbanner__title em {
  font-style: normal;
  color: var(--accent);
  font-weight: 700;
  -webkit-text-fill-color: currentColor;
}

.pbanner__lede {
  max-width: 52ch;
  font-family: var(--font-geist-sans);
  font-size: clamp(0.98rem, 1.2vw, 1.12rem);
  font-weight: 500;
  line-height: 1.6;
  color: rgba(17, 17, 17, 0.7);
  margin: 0 0 40px;
}

.pbanner__meta {
  display: grid;
  grid-template-columns: repeat(4, auto);
  gap: 28px 40px;
  padding-top: 28px;
  border-top: 1px solid rgba(17, 17, 17, 0.08);
  margin: 0;
}

.pbanner__meta > div {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}

.pbanner__meta dt {
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
}

.pbanner__meta dd {
  font-family: var(--font-geist-sans);
  font-size: 0.98rem;
  font-weight: 600;
  color: var(--ink);
  margin: 0;
  letter-spacing: -0.01em;
}

/* Right column — featured signature stage */
.pbanner__right {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 20px;
}

.pbanner__stage {
  position: relative;
  width: 100%;
  aspect-ratio: 4 / 5;
  max-width: 460px;
  display: grid;
  place-items: center;
  background: transparent;
  border: 0;
  overflow: visible;
  isolation: isolate;
}

.pbanner__stage::before {
  content: none;
}

.pbanner__stage-idx {
  position: absolute;
  top: 4px;
  left: 4px;
  z-index: 3;
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.45);
}

.pbanner__stage img {
  position: relative;
  z-index: 2;
  width: 100%;
  height: 100%;
  object-fit: contain;
  padding: 0;
  filter: drop-shadow(0 30px 44px rgba(0, 0, 0, 0.14));
}

.pbanner__stage-plate {
  position: absolute;
  left: 12%;
  right: 12%;
  bottom: 2%;
  height: 28px;
  background: radial-gradient(ellipse at center, rgba(0, 0, 0, 0.18) 0%, transparent 70%);
  filter: blur(8px);
  z-index: 1;
  pointer-events: none;
}

.pbanner__feat {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  padding: 12px 12px 12px 20px;
  border: 1px solid rgba(17, 17, 17, 0.1);
  border-radius: 999px;
  background: #fff;
  color: var(--ink);
  transition: 0.35s var(--ease);
}

.pbanner__feat:hover {
  background: var(--ink);
  color: #fff;
  border-color: var(--ink);
}

.pbanner__feat-lbl {
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
  transition: color 0.3s;
}

.pbanner__feat:hover .pbanner__feat-lbl {
  color: rgba(245, 239, 229, 0.6);
}

.pbanner__feat-name {
  font-family: var(--font-geist-sans);
  font-size: 0.94rem;
  font-weight: 700;
  letter-spacing: -0.005em;
}

.pbanner__feat-name i {
  font-style: normal;
  color: var(--accent);
  font-weight: 600;
}

.pbanner__feat:hover .pbanner__feat-name i {
  color: #e5b898;
}

.pbanner__feat-arrow {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: rgba(17, 17, 17, 0.06);
  color: var(--ink);
  font-size: 0.9rem;
  transition: transform 0.3s var(--ease), background 0.3s, color 0.3s;
}

.pbanner__feat:hover .pbanner__feat-arrow {
  background: #fff;
  color: var(--ink);
  transform: translate(2px, -2px);
}

/* Bottom bar under banner */
.pbanner__foot {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  max-width: 1400px;
  margin: clamp(40px, 5vw, 72px) auto 0;
  padding-top: clamp(24px, 3vw, 36px);
  border-top: 1px solid rgba(17, 17, 17, 0.08);
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
}

.pbanner__foot-scroll {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  color: var(--ink);
}

.pbanner__foot-scroll i {
  display: inline-block;
  font-style: normal;
  color: var(--ink);
  animation: pbanScroll 2.6s ease-in-out infinite;
}

@keyframes pbanScroll {
  0%, 100% { transform: translateY(0); opacity: 0.55; }
  50% { transform: translateY(4px); opacity: 1; }
}

.pbanner__foot-note {
  color: rgba(17, 17, 17, 0.4);
}

/* -- Toolbar (filters + sort) ------------------------------- */
.shop-toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 16px 24px;
  /* Same rail as .pvideo__inner and .collection__grid — perfect alignment
     with nav bar edges on every viewport. */
  max-width: calc(var(--section-max) + 2 * var(--section-pad));
  margin: 0 auto;
  padding: clamp(24px, 3vw, 40px) var(--section-pad) clamp(24px, 3vw, 36px);
  background: #fff;
}

/* Filter pill spans the full available width in the toolbar row. On narrow
   viewports where the chips exceed available width, the pill becomes
   horizontally swipe-scrollable — native touch on mobile, 2-finger swipe on
   trackpads — with the scrollbar visually hidden. */
.shop-toolbar__filters {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: 6px;
  padding: 4px;
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.82);
  backdrop-filter: blur(12px) saturate(1.1);
  box-shadow: 0 1px 2px rgba(17, 17, 17, 0.03);

  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  scroll-padding-inline: 4px;
  scrollbar-width: none;
  -ms-overflow-style: none;
}

.shop-toolbar__filters::-webkit-scrollbar {
  display: none;
}

.shop-toolbar .chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 40px;
  padding: 0 20px;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: rgba(17, 17, 17, 0.65);
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  transition: 0.28s var(--ease);
  cursor: pointer;
  flex-shrink: 0;
  scroll-snap-align: start;
  white-space: nowrap;
}

.shop-toolbar .chip:hover {
  color: var(--ink);
}

.shop-toolbar .chip.is-on {
  background: var(--ink);
  color: #fff;
  box-shadow: 0 4px 14px -6px rgba(17, 17, 17, 0.28);
}

/* Count badge inside toolbar chips (currently only rendered on "All").

   The generic `.chip i` rule elsewhere on the site styles a 6×6 accent dot
   (used decoratively in the hero pill). Inside the toolbar we're rendering
   a numeric count instead — so we need to fully reset the dot geometry
   (width/height/border-radius/background/box-shadow) that would otherwise
   leak through, then re-style as a proper inline count badge. */
.shop-toolbar .chip i {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 22px;
  height: 20px;
  padding: 0 6px;
  margin-left: 2px;
  width: auto;
  border-radius: 999px;
  background: rgba(17, 17, 17, 0.08);
  box-shadow: none;
  color: rgba(17, 17, 17, 0.6);
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  line-height: 1;
  font-variant-numeric: tabular-nums;
}

.shop-toolbar .chip.is-on i {
  background: rgba(255, 255, 255, 0.18);
  color: rgba(255, 255, 255, 0.92);
}

.shop-toolbar__sort {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-left: auto;
  flex: 0 0 auto;
  font-family: var(--font-geist-sans);
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
}

/* Narrow screens: filter pill takes the full row on its own; sort drops
   below and left-aligns so it doesn't hang alone on the right edge. */
@media (max-width: 640px) {
  .shop-toolbar__filters {
    flex: 1 1 100%;
  }
  .shop-toolbar__sort {
    margin-left: 0;
    flex: 1 1 100%;
    justify-content: flex-start;
  }
}

.shop-toolbar__select {
  position: relative;
  display: inline-flex;
  align-items: center;
}

.shop-toolbar__select select {
  appearance: none;
  padding: 12px 44px 12px 20px;
  border: 1px solid rgba(17, 17, 17, 0.1);
  border-radius: 999px;
  background: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--ink);
  cursor: pointer;
  transition: border-color 0.25s;
}

.shop-toolbar__select select:hover {
  border-color: rgba(17, 17, 17, 0.28);
}

.shop-toolbar__caret {
  position: absolute;
  right: 16px;
  color: rgba(17, 17, 17, 0.5);
  pointer-events: none;
  font-size: 0.7rem;
}

/* -- Product grid (collection) ------------------------------
   Horizontal padding sits on .collection__grid (not .collection) so the
   grid shares the exact same max-width + padding formula as .pvideo__inner
   and .shop-toolbar. Result: cards line up with header/footer edges. */
.collection {
  padding: 0 0 clamp(96px, 12vw, 160px);
  background: #fff;
}

.collection__grid {
  display: grid;
  /* Base rule targets ultra-wide displays (≥1600px). All lower breakpoints
     narrow via max-width media queries below (mobile-last cascade). */
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: clamp(16px, 1.8vw, 28px);
  max-width: calc(var(--section-max) + 2 * var(--section-pad));
  margin: 0 auto;
  padding: 0 var(--section-pad);
}

/* Grid column ladder:
     ≥1600px       → 5 cols (ultra-wide displays)
     1200–1599px  → 4 cols (laptop range; 1280px shows 4 cards per spec)
      900–1199px  → 3 cols
      600–899px   → 2 cols
      <600px       → 1 col
   Each card target width sits near 300–340px at every tier so image,
   title, and CTA never feel cramped. */
@media (max-width: 1599px) {
  .collection__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

@media (max-width: 1199px) {
  .collection__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 899px) {
  .collection__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 599px) {
  .collection__grid { grid-template-columns: 1fr; }
}

.collection__empty {
  text-align: center;
  color: var(--muted);
  padding: 100px 20px;
  font-family: var(--font-geist-sans);
  font-size: 0.86rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* -- Product card (matches home .card language) ------------ */
.pcard {
  position: relative;
  display: flex;
  flex-direction: column;
  background: transparent;
  border: 0;
  border-radius: 0;
  overflow: hidden;
  transition: transform 0.55s cubic-bezier(0.22, 1, 0.36, 1);
}

.pcard:hover {
  transform: translateY(-6px);
}

.pcard__media {
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  background: transparent;
  isolation: isolate;
}

.pcard__media::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0) 55%, rgba(0, 0, 0, 0.06) 100%);
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.55s cubic-bezier(0.22, 1, 0.36, 1);
}

.pcard:hover .pcard__media::after { opacity: 1; }

.pcard__media img {
  position: relative;
  z-index: 2;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  padding: 0;
  display: block;
  transition: transform 0.9s cubic-bezier(0.22, 1, 0.36, 1);
  transform-origin: center 60%;
}

.pcard:hover .pcard__media img {
  transform: scale(1.04);
}

.pcard__idx {
  position: absolute;
  top: 14px;
  left: 16px;
  z-index: 3;
  font-family: var(--font-geist-sans);
  font-style: normal;
  font-size: 0.62rem;
  font-weight: 700;
  color: rgba(17, 17, 17, 0.65);
  letter-spacing: 0.28em;
  text-transform: uppercase;
  padding: 6px 10px;
  background: rgba(255, 255, 255, 0.86);
  backdrop-filter: blur(8px);
  border-radius: 4px;
  transition: transform 0.45s var(--ease), color 0.3s;
}

.pcard:hover .pcard__idx {
  color: var(--ink);
  transform: translateY(-2px);
}

.pcard__tag {
  position: absolute;
  top: 14px;
  right: 16px;
  z-index: 3;
  padding: 6px 12px;
  border: 0;
  border-radius: 999px;
  background: var(--ink);
  color: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.56rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  transition: transform 0.45s var(--ease);
}

.pcard:hover .pcard__tag {
  transform: translateY(-2px);
}

.pcard__body {
  padding: 20px 2px 4px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.pcard__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
}

.pcard__row h3 {
  font-family: var(--font-geist-sans);
  font-size: 1.35rem;
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1;
  margin: 0;
  position: relative;
  padding-bottom: 4px;
  color: var(--ink);
}

.pcard__row h3 a {
  color: inherit;
  transition: color 0.35s var(--ease);
}

.pcard__row h3::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 0;
  height: 1px;
  background: var(--ink);
  transition: width 0.55s cubic-bezier(0.22, 1, 0.36, 1);
}

.pcard:hover .pcard__row h3::after {
  width: 34px;
}

.pcard__price {
  font-family: var(--font-geist-sans);
  font-size: 1.02rem;
  font-weight: 700;
  color: var(--ink);
  letter-spacing: -0.01em;
}

.pcard__family {
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
  margin: 6px 0 4px;
}

.pcard__notes {
  font-family: var(--font-geist-sans);
  font-size: 0.82rem;
  font-weight: 500;
  color: rgba(17, 17, 17, 0.6);
  margin: 0 0 16px;
  line-height: 1.5;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: calc(1.5em * 2);
}

.pcard__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  padding-top: 14px;
  border-top: 1px solid rgba(17, 17, 17, 0.08);
}

.pcard__add {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 10px 18px;
  border: 0;
  border-radius: 999px;
  background: var(--ink);
  color: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease), transform 0.3s var(--ease);
  cursor: pointer;
}

.pcard__add:hover {
  background: #000;
  transform: translateX(2px);
}

.pcard__add .arrow {
  display: inline-block;
  transition: transform 0.3s var(--ease);
}

.pcard__add:hover .arrow {
  transform: translate(2px, -2px);
}

.pcard__add.is-added {
  background: #2f7a5c;
}

.pcard__add.is-added .arrow {
  transform: rotate(90deg);
}

.pcard__more {
  font-family: var(--font-geist-sans);
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
  position: relative;
  padding: 4px 0;
  transition: color 0.3s;
}

.pcard__more::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 1px;
  background: rgba(17, 17, 17, 0.2);
  transition: background 0.3s, transform 0.4s var(--ease);
  transform-origin: right;
}

.pcard__more:hover {
  color: var(--ink);
}

.pcard__more:hover::after {
  background: var(--ink);
  transform: scaleX(1.1);
  transform-origin: left;
}

/* -- Product detail page (PDP) — white/black · Geist Sans -- */
.crumbs {
  display: flex;
  align-items: center;
  gap: 10px;
  /* Top padding clears the fixed nav footprint (~80px on inner pages) with
     20-50px of breathing room. Matches the top-clearance rhythm used by
     .pvideo on the products page for visual consistency. */
  padding: clamp(96px, 9vw, 128px) clamp(24px, 5vw, 80px) 0;
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
}

.crumbs a {
  color: inherit;
  transition: color 0.25s;
}

.crumbs a:hover {
  color: var(--ink);
}

.crumbs i {
  font-style: normal;
  color: rgba(17, 17, 17, 0.28);
}

.crumbs span {
  color: var(--ink);
  font-weight: 700;
}

.pdp__hero {
  display: grid;
  /* Info column gets the slight edge — product name, notes and CTA are the
     money-side of a PDP; the media column is capped separately via
     .pdp__stage max-width so it can't dominate. */
  grid-template-columns: 1fr 1.1fr;
  gap: clamp(40px, 6vw, 88px);
  padding: clamp(28px, 5vw, 56px) clamp(24px, 5vw, 80px) clamp(56px, 8vw, 96px);
  background: #fff;
}

.pdp__media {
  position: relative;
}

.pdp__stage {
  position: relative;
  /* Hard cap so the bottle render stays at a natural product-shot size
     no matter how wide the grid column becomes. */
  max-width: 480px;
  margin: 0 auto;
  aspect-ratio: 4 / 5;
  background: transparent;
  border: 0;
  overflow: visible;
  display: grid;
  place-items: center;
}

.pdp__stage img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  padding: 0;
}

.pdp__thumbs {
  display: flex;
  gap: 12px;
  margin-top: 24px;
  /* Match the .pdp__stage centering + width cap so thumbs sit directly
     under the bottle render, not stretched across the whole column. */
  max-width: 480px;
  margin-left: auto;
  margin-right: auto;
  justify-content: flex-start;
}

.pdp__thumb {
  width: 72px;
  height: 72px;
  padding: 0;
  border: 1px solid rgba(17, 17, 17, 0.1);
  border-radius: 4px;
  background: transparent;
  overflow: hidden;
  cursor: pointer;
  transition: border-color 0.25s;
}

.pdp__thumb.is-on,
.pdp__thumb:hover {
  border-color: var(--ink);
}

.pdp__thumb img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  padding: 15%;
}

.pdp__info {
  position: sticky;
  top: 100px;
  /* Vertically center against the taller bottle image column so the two
     halves feel balanced. Sticky still engages when scrolling: initial
     anchor is the centered position, then pins at top:100px. Mobile
     (≤1100px) turns this into a single column via .pdp__hero override
     and forces .pdp__info back to position: static — so the centered
     alignment is desktop-only, which is the intended behavior. */
  align-self: center;
}

.pdp__idx {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
  margin-bottom: 20px;
}

.pdp__idx i {
  display: inline-block;
  width: 28px;
  height: 1px;
  background: var(--ink);
  opacity: 0.55;
}

.pdp__name {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.4rem, 5vw, 4.2rem);
  font-weight: 700;
  line-height: 0.94;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  color: #000;
  margin: 0 0 14px;
}

.pdp__concentration {
  font-family: var(--font-geist-sans);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
  margin: 0 0 28px;
}

.pdp__story {
  font-family: var(--font-geist-sans);
  font-size: 1rem;
  font-weight: 500;
  line-height: 1.65;
  color: rgba(17, 17, 17, 0.75);
  margin: 0 0 32px;
}

.pdp__specs {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
  padding: 22px 0;
  border-top: 1px solid rgba(17, 17, 17, 0.08);
  border-bottom: 1px solid rgba(17, 17, 17, 0.08);
  margin: 0 0 32px;
}

.pdp__specs dt {
  font-family: var(--font-geist-sans);
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
  margin-bottom: 8px;
}

.pdp__specs dd {
  font-family: var(--font-geist-sans);
  font-size: 0.9rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ink);
}

.pdp__buy {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  margin-bottom: 24px;
}

.pdp__price {
  font-family: var(--font-geist-sans);
  font-size: 1.7rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--ink);
}

.pdp__add {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  height: 54px;
  padding: 0 28px;
  border: 0;
  border-radius: 999px;
  background: var(--ink);
  color: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  transition: 0.3s var(--ease);
  cursor: pointer;
}

.pdp__add:hover {
  background: #000;
  transform: translateX(2px);
}

.pdp__add.is-added {
  background: #2f7a5c;
}

.pdp__promise {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-family: var(--font-geist-sans);
  font-size: 0.84rem;
  font-weight: 500;
  color: rgba(17, 17, 17, 0.65);
}

.pdp__promise b {
  color: var(--ink);
  margin-right: 4px;
  font-weight: 700;
}

.pdp__missing {
  padding: clamp(80px, 12vw, 160px) clamp(24px, 5vw, 80px);
  text-align: center;
  background: #fff;
}

.pdp__missing h1 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.4rem, 5vw, 4rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  color: #000;
  margin-bottom: 16px;
}

/* -- Notes pyramid ------------------------------------------ */
.pyramid {
  padding: clamp(56px, 8vw, 100px) clamp(24px, 5vw, 80px);
  background: #fafaf7;
  border-top: 1px solid rgba(17, 17, 17, 0.06);
}

.pyramid__head {
  max-width: 640px;
  margin-bottom: clamp(32px, 5vw, 64px);
}

.pyramid__head h2 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2rem, 4.4vw, 3.6rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  line-height: 0.98;
  color: #000;
  margin: 12px 0 0;
}

.pyramid__head h2 em {
  font-style: normal;
  color: var(--accent);
  font-weight: 700;
}

.pyramid__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(20px, 3vw, 40px);
}

.pyramid__tier {
  position: relative;
  padding: 32px;
  background: #fff;
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 6px;
  transition: border-color 0.35s var(--ease), transform 0.4s var(--ease);
}

.pyramid__tier:hover {
  border-color: rgba(17, 17, 17, 0.24);
  transform: translateY(-3px);
}

.pyramid__idx {
  position: absolute;
  top: 22px;
  right: 26px;
  font-family: var(--font-geist-sans);
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.35);
}

.pyramid__tier h3 {
  font-family: var(--font-geist-sans);
  font-size: 1.25rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  text-transform: uppercase;
  margin-bottom: 18px;
  color: var(--ink);
}

.pyramid__tier ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.pyramid__tier li {
  position: relative;
  padding-left: 20px;
  font-family: var(--font-geist-sans);
  font-size: 0.92rem;
  font-weight: 500;
  color: rgba(17, 17, 17, 0.75);
}

.pyramid__tier li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 12px;
  width: 10px;
  height: 1px;
  background: var(--ink);
  opacity: 0.55;
}

/* -- Rail (recently viewed / also-like) --------------------- */
.rail {
  padding: clamp(56px, 8vw, 100px) clamp(24px, 5vw, 80px);
  background: #fff;
  border-top: 1px solid rgba(17, 17, 17, 0.06);
}

.rail__head {
  margin-bottom: clamp(28px, 4vw, 48px);
}

.rail__head h2 {
  font-family: var(--font-geist-sans);
  font-size: clamp(1.8rem, 3.8vw, 3rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  line-height: 0.98;
  color: #000;
  margin: 12px 0 0;
}

.rail__head h2 em {
  font-style: normal;
  color: var(--accent);
  font-weight: 700;
}

.rail__track {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: clamp(20px, 2.5vw, 32px);
}

.rcard {
  display: flex;
  flex-direction: column;
  color: inherit;
  transition: transform 0.4s var(--ease);
}

.rcard:hover {
  transform: translateY(-3px);
}

.rcard__media {
  aspect-ratio: 4 / 5;
  background: transparent;
  overflow: hidden;
  display: block;
  transition: border-color 0.35s var(--ease);
}

.rcard__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  padding: 0;
  display: block;
  transition: transform 0.6s var(--ease);
}

.rcard:hover .rcard__media img {
  transform: scale(1.04);
}

.rcard__meta {
  padding-top: 14px;
}

.rcard__meta h3 {
  font-family: var(--font-geist-sans);
  font-size: 1.02rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0 0 4px;
}

.rcard__meta p {
  font-family: var(--font-geist-sans);
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
  margin: 0 0 10px;
}

.rcard__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.rcard__price {
  font-family: var(--font-geist-sans);
  font-size: 0.9rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ink);
}

.rcard__add {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border: 1px solid rgba(17, 17, 17, 0.14);
  border-radius: 50%;
  background: #fff;
  color: var(--ink);
  font-size: 1.1rem;
  line-height: 1;
  cursor: pointer;
  transition: 0.25s var(--ease);
}

.rcard__add:hover {
  background: var(--ink);
  color: #fff;
}

.rcard__add.is-added {
  background: #2f7a5c;
  color: #fff;
  border-color: #2f7a5c;
}

/* ==========================================================
   CART PAGE
   ========================================================== */
.cart {
  padding: clamp(48px, 6vw, 96px) clamp(24px, 5vw, 80px) clamp(80px, 10vw, 140px);
}

.cart__head {
  max-width: 720px;
  margin-bottom: clamp(32px, 5vw, 64px);
}

.cart__head h1 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.4rem, 5.8vw, 4.8rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  line-height: 0.94;
  color: #000;
  margin: 12px 0 16px;
}

.cart__head h1 em {
  font-style: normal;
  color: var(--accent);
  font-weight: 700;
}

.cart__lede {
  font-family: var(--font-geist-sans);
  font-size: 1rem;
  font-weight: 500;
  color: rgba(17, 17, 17, 0.7);
  max-width: 52ch;
  line-height: 1.6;
}

.cart__body {
  display: grid;
  grid-template-columns: 1.6fr 1fr;
  gap: clamp(32px, 4vw, 64px);
  align-items: start;
}

.cart__items {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.cline {
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: 24px;
  padding: 24px 0;
  border-bottom: 1px solid rgba(17, 17, 17, 0.08);
}

.cline:first-child {
  border-top: 1px solid rgba(17, 17, 17, 0.08);
}

.cline__media {
  display: block;
  aspect-ratio: 1 / 1;
  background: transparent;
  overflow: hidden;
}

.cline__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  padding: 0;
  display: block;
}

.cline__body {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: 4px 0;
}

.cline__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
}

.cline__row h3 {
  font-family: var(--font-geist-sans);
  font-size: 1.2rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0;
}

.cline__row h3 a {
  color: inherit;
  transition: color 0.25s;
}

.cline__row h3 a:hover {
  color: #000;
}

.cline__price {
  font-family: var(--font-geist-sans);
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ink);
}

.cline__meta {
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
  margin: 6px 0 14px;
}

.cline__actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}

.cline__qty {
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.6);
  padding: 6px 14px;
  border: 1px solid rgba(17, 17, 17, 0.12);
  border-radius: 999px;
}

.cline__remove {
  font-family: var(--font-geist-sans);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.55);
  padding: 6px 0;
  border-bottom: 1px solid rgba(17, 17, 17, 0.2);
  transition: color 0.25s, border-color 0.25s;
  cursor: pointer;
  background: transparent;
}

.cline__remove:hover {
  color: var(--ink);
  border-color: var(--ink);
}

/* Cart summary sidebar */
.cart__summary {
  position: sticky;
  top: 100px;
  padding: 32px;
  background: #fafaf7;
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 6px;
}

.cart__summary h2 {
  font-family: var(--font-geist-sans);
  font-size: 1.05rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0 0 20px;
  padding-bottom: 16px;
  border-bottom: 1px solid rgba(17, 17, 17, 0.12);
}

.cart__totals {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding-bottom: 20px;
  border-bottom: 1px solid rgba(17, 17, 17, 0.12);
  margin: 0 0 20px;
}

.cart__totals > div {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-family: var(--font-geist-sans);
  font-size: 0.92rem;
}

.cart__totals dt {
  color: rgba(17, 17, 17, 0.65);
  font-weight: 500;
}

.cart__totals dd {
  font-weight: 700;
  color: var(--ink);
  letter-spacing: -0.01em;
}

.cart__totals-line {
  padding-top: 14px;
  border-top: 1px solid rgba(17, 17, 17, 0.12);
  font-size: 1.05rem !important;
}

.cart__totals-line dt {
  font-family: var(--font-geist-sans);
  font-weight: 700;
  color: var(--ink) !important;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  font-size: 0.72rem;
}

.cart__totals-line dd {
  font-family: var(--font-geist-sans);
  font-size: 1.3rem;
  font-weight: 700;
  letter-spacing: -0.02em;
}

.cart__cta {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  height: 56px;
  border-radius: 999px;
  background: var(--ink);
  color: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease);
  margin-bottom: 16px;
}

.cart__cta:hover {
  background: #000;
}

.cart__hint {
  font-family: var(--font-geist-sans);
  font-size: 0.82rem;
  font-weight: 500;
  color: rgba(17, 17, 17, 0.6);
  margin: 6px 0;
}

.cart__hint b {
  color: var(--ink);
  font-weight: 700;
}

.cart__badges {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 20px;
  padding-top: 20px;
  border-top: 1px solid rgba(17, 17, 17, 0.12);
  font-family: var(--font-geist-sans);
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
}

.cart__empty {
  padding: clamp(80px, 12vw, 160px) 20px;
  text-align: center;
}

.cart__empty h2 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2rem, 4.4vw, 3.6rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  color: #000;
  margin: 12px 0 12px;
}

.cart__empty h2 em {
  font-style: normal;
  color: var(--accent);
  font-weight: 700;
}

.cart__empty p {
  font-family: var(--font-geist-sans);
  font-weight: 500;
  color: var(--muted);
  margin-bottom: 24px;
}

/* ==========================================================
   CHECKOUT PAGE
   ========================================================== */
.nav--checkout {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  padding: 18px clamp(20px, 4vw, 48px);
  background: #fff;
  border-bottom: 1px solid rgba(17, 17, 17, 0.06);
}

.nav--checkout .brand img {
  height: 44px;
  filter: none;
}

.nav__checkout-title {
  font-size: 0.72rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.6);
  text-align: center;
}

.nav__checkout-back {
  justify-self: end;
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.7);
  transition: color 0.25s;
}

.nav__checkout-back:hover {
  color: var(--accent);
}

.checkout {
  /* Top padding is intentionally larger than the horizontal / bottom values
     so the first cbox ("Contact") clears the fixed nav at any viewport size.
     Nav footprint = top offset (12–18 px) + nav height (~44–56 px) ≈ 60–74 px.
     Matching the .hero / .shop / product-page convention of 90–140 px keeps
     the vertical rhythm consistent across the site. */
  padding: clamp(96px, 11vw, 140px) clamp(24px, 5vw, 80px) clamp(80px, 10vw, 140px);
}

.checkout__layout {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: clamp(40px, 5vw, 80px);
  align-items: start;
}

.checkout__form {
  display: flex;
  flex-direction: column;
  gap: 24px;
}

.cbox {
  padding: 32px;
  background: #fff;
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 4px;
}

.cbox__head {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: 20px;
  padding-bottom: 16px;
  border-bottom: 1px solid rgba(17, 17, 17, 0.08);
}

.cbox__num {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: var(--ink);
  color: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0;
}

.cbox__head h2 {
  font-family: var(--font-geist-sans);
  font-size: 1.1rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0;
}

.cbox__body {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.cbox__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}

.cbox__ship {
  gap: 8px;
}

.fld {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.fld--full {
  grid-column: 1 / -1;
}

.fld > span {
  font-size: 0.68rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.6);
}

.fld input[type="text"],
.fld input[type="email"],
.fld input[type="tel"] {
  height: 48px;
  padding: 0 16px;
  border: 1px solid rgba(17, 17, 17, 0.16);
  border-radius: 4px;
  background: #fff;
  font-family: inherit;
  font-size: 0.94rem;
  color: var(--ink);
  transition: border-color 0.25s;
}

.fld input:focus {
  outline: none;
  border-color: var(--accent);
}

.fld input.is-err {
  border-color: #b34c3a;
}

.fld--check {
  flex-direction: row;
  align-items: center;
  gap: 10px;
}

.fld--check input {
  width: 18px;
  height: 18px;
  accent-color: var(--accent);
}

.fld--check span {
  font-size: 0.86rem;
  text-transform: none;
  letter-spacing: 0;
  color: rgba(17, 17, 17, 0.72);
}

.fld__select {
  position: relative;
  display: block;
}

.fld__select select {
  appearance: none;
  width: 100%;
  height: 48px;
  padding: 0 40px 0 16px;
  border: 1px solid rgba(17, 17, 17, 0.16);
  border-radius: 4px;
  background: #fff;
  font-family: inherit;
  font-size: 0.94rem;
  color: var(--ink);
  cursor: pointer;
}

.fld__select b {
  position: absolute;
  top: 50%;
  right: 14px;
  transform: translateY(-50%);
  color: rgba(17, 17, 17, 0.5);
  pointer-events: none;
}

.ship {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 14px;
  padding: 14px 16px;
  border: 1px solid rgba(17, 17, 17, 0.14);
  border-radius: 4px;
  cursor: pointer;
  transition: border-color 0.25s, background 0.25s;
}

.ship:hover {
  border-color: rgba(17, 17, 17, 0.28);
}

.ship input {
  accent-color: var(--accent);
}

.ship input:checked ~ .ship__title {
  color: var(--ink);
}

.ship:has(input:checked) {
  border-color: var(--ink);
  background: rgba(17, 17, 17, 0.02);
}

.ship__title {
  font-size: 0.9rem;
  color: rgba(17, 17, 17, 0.7);
}

.ship__price {
  font-size: 0.86rem;
  font-weight: 500;
  color: var(--ink);
}

.checkout__cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  height: 60px;
  border: 0;
  border-radius: 999px;
  background: var(--ink);
  color: #fff;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease);
  cursor: pointer;
}

.checkout__cta:hover {
  background: var(--accent);
}

.checkout__legal {
  text-align: center;
  font-size: 0.78rem;
  color: rgba(17, 17, 17, 0.5);
  line-height: 1.6;
}

.checkout__legal a {
  color: var(--ink);
  border-bottom: 1px solid rgba(17, 17, 17, 0.2);
}

/* Order summary sidebar */
.checkout__summary {
  position: sticky;
  top: 100px;
  padding: 32px;
  background: #fafaf7;
  border: 1px solid rgba(17, 17, 17, 0.08);
  border-radius: 6px;
}

.checkout__summary h2 {
  font-family: var(--font-geist-sans);
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0 0 20px;
  padding-bottom: 14px;
  border-bottom: 1px solid rgba(17, 17, 17, 0.12);
}

.checkout__lines {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin-bottom: 20px;
  padding-bottom: 20px;
  border-bottom: 1px solid rgba(17, 17, 17, 0.14);
}

.coline {
  display: grid;
  grid-template-columns: 56px 1fr auto;
  gap: 14px;
  align-items: center;
}

.coline__media {
  position: relative;
  width: 56px;
  height: 56px;
  background: transparent;
  border-radius: 4px;
  overflow: hidden;
}

.coline__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  padding: 0;
  display: block;
}

.coline__media b {
  position: absolute;
  top: -8px;
  right: -8px;
  display: grid;
  place-items: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--ink);
  color: #fff;
  font-size: 0.66rem;
  font-weight: 600;
}

.coline__body h3 {
  font-family: var(--font-geist-sans);
  font-size: 0.94rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0;
}

.coline__body p {
  font-family: var(--font-geist-sans);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
  margin: 2px 0 0;
}

.coline__price {
  font-family: var(--font-geist-sans);
  font-size: 0.92rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ink);
}

.checkout__totals {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding-bottom: 16px;
  border-bottom: 1px solid rgba(17, 17, 17, 0.14);
  margin: 0 0 16px;
}

.checkout__totals > div {
  display: flex;
  justify-content: space-between;
  font-size: 0.92rem;
}

.checkout__totals dt {
  color: rgba(17, 17, 17, 0.7);
}

.checkout__totals dd {
  font-weight: 500;
}

.checkout__totals-line {
  padding-top: 8px;
  border-top: 1px solid rgba(17, 17, 17, 0.14);
}

.checkout__totals-line dt {
  font-family: var(--font-geist-sans);
  font-weight: 700;
  color: var(--ink) !important;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  font-size: 0.7rem;
}

.checkout__totals-line dd {
  font-family: var(--font-geist-sans);
  font-size: 1.2rem;
  font-weight: 700;
  letter-spacing: -0.02em;
}

.checkout__badges {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(17, 17, 17, 0.5);
}

.checkout__badges i {
  color: rgba(17, 17, 17, 0.3);
}

.checkout__done {
  max-width: 640px;
  margin: 80px auto;
  text-align: center;
  padding: 20px;
}

.checkout__done h1 {
  font-family: var(--font-geist-sans);
  font-size: clamp(2.4rem, 5.2vw, 4rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  color: #000;
  line-height: 0.96;
  margin: 20px 0 16px;
}

.checkout__done h1 em {
  font-style: normal;
  color: var(--accent);
  font-weight: 700;
}

.checkout__done p {
  font-family: var(--font-geist-sans);
  color: rgba(17, 17, 17, 0.7);
  font-size: 1rem;
  font-weight: 500;
  line-height: 1.6;
  margin-bottom: 32px;
}

.checkout__done b {
  color: var(--ink);
  font-weight: 700;
}

.checkout__empty {
  max-width: 560px;
  margin: 80px auto;
  text-align: center;
  padding: 20px;
}

.checkout__empty h2 {
  font-family: var(--font-geist-sans);
  font-size: clamp(1.8rem, 4.4vw, 3rem);
  font-weight: 700;
  letter-spacing: -0.035em;
  text-transform: uppercase;
  color: #000;
  margin: 12px 0 24px;
}

/* Slim footer for checkout */
.foot--slim {
  padding: 32px clamp(20px, 4vw, 48px);
  background: #fff;
  border-top: 1px solid rgba(17, 17, 17, 0.06);
}

.foot--slim .foot__bot {
  padding: 0;
  border: 0;
  justify-content: center;
  gap: 12px;
  font-size: 0.72rem;
  color: rgba(17, 17, 17, 0.5);
}

.foot--slim .foot__bot a {
  color: rgba(17, 17, 17, 0.7);
}

.foot--slim .foot__bot a:hover {
  color: var(--accent);
}

/* ==========================================================
   Responsive — shop pages
   ========================================================== */
@media (max-width: 1100px) {
  .pdp__hero {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .pdp__info {
    position: static;
  }
  .cart__body,
  .checkout__layout {
    grid-template-columns: 1fr;
  }
  .cart__summary,
  .checkout__summary {
    position: static;
  }
  .pbanner__inner {
    grid-template-columns: 1fr;
    gap: 48px;
  }
  .pbanner__right {
    order: -1;
  }
  .pbanner__stage {
    max-width: 340px;
  }
  .pbanner__meta {
    grid-template-columns: repeat(2, auto);
    gap: 20px 32px;
  }
}

@media (max-width: 900px) {
  .nav__inner-links {
    display: none;
  }
  .pbanner {
    min-height: auto;
    padding: 96px 24px 40px;
  }
  .pbanner__title {
    font-size: clamp(1.9rem, 7vw, 2.8rem);
  }
  .pbanner__foot {
    flex-direction: column;
    align-items: flex-start;
    gap: 12px;
  }
  .shop-toolbar {
    flex-direction: column;
    align-items: stretch;
    gap: 16px;
    padding-top: 40px;
    padding-bottom: 28px;
  }
  .shop-toolbar__filters {
    overflow-x: auto;
    flex-wrap: nowrap;
    -webkit-overflow-scrolling: touch;
  }
  .pyramid__grid {
    grid-template-columns: 1fr;
  }
  .cbox__grid {
    grid-template-columns: 1fr;
  }
  .cline {
    grid-template-columns: 96px 1fr;
  }
  .nav--checkout {
    grid-template-columns: 1fr auto;
  }
  .nav__checkout-title {
    display: none;
  }

  /* Prevent iOS Safari's autozoom on input focus. Any <input> with a
     computed font-size < 16px triggers a viewport zoom-in on tap, which
     is jarring in a multi-step checkout. Bumping the checkout form's
     text inputs to 16px on mobile is the standard enterprise fix and
     costs us one pixel of visual density we don't need on a phone. */
  .checkout .fld input[type="text"],
  .checkout .fld input[type="email"],
  .checkout .fld input[type="tel"],
  .checkout .fld__select select {
    font-size: 16px;
  }
}

/* ==============================================================
   PDP mid-tier tuning — small tablet / large phone (≤ 720 px)
   --------------------------------------------------------------
   Bridges the gap between the ≤ 1100 px column-stack and the
   ≤ 480 px full mobile refinement so PDP typography scales
   smoothly across 480–720 px instead of jumping in one step.
   Everything here is PDP-scoped (.crumbs, .pdp__*, .pyramid*,
   .rail*, .rcard*) — no effect on products.html or cart flows.
   ============================================================== */
@media (max-width: 720px) {
  /* Breadcrumbs — smooth halfway step between 0.7rem default and
     the 0.56rem set at ≤ 480 so 600 px tablets don't feel oversized. */
  .crumbs {
    padding-top: clamp(80px, 12vw, 108px);
    font-size: 0.62rem;
    letter-spacing: 0.18em;
    gap: 8px;
    flex-wrap: wrap;
    line-height: 1.4;
  }
  .crumbs i { font-size: 0.72rem; }

  /* Hero — after the ≤ 1100 stack, this trims the tall vertical
     padding that the desktop clamp still produces at 700 px. */
  .pdp__hero {
    padding: clamp(40px, 6vw, 64px) clamp(20px, 4vw, 40px)
             clamp(56px, 7vw, 80px);
    gap: 28px;
  }
  .pdp__stage { max-width: 420px; }

  .pdp__name { font-size: clamp(2rem, 6vw, 3rem); }
  .pdp__concentration { margin-bottom: 22px; }
  .pdp__story { font-size: 0.96rem; }

  /* Notes pyramid — 1-col stack already inherited from ≤ 900. Just
     ease the surrounding padding + heading so the section doesn't
     dwarf the story block above it. */
  .pyramid {
    padding: clamp(48px, 7vw, 72px) clamp(20px, 4vw, 40px);
  }
  .pyramid__head { margin-bottom: clamp(24px, 4vw, 40px); }
  .pyramid__head h2 { font-size: clamp(1.9rem, 5.5vw, 2.6rem); }
  .pyramid__tier { padding: 26px; }

  /* Rails — tighter min-track so tablets show 3 cards comfortably
     (was locked to 2 with 220 px min + 32 px gutter at ~720 vw). */
  .rail {
    padding: clamp(48px, 7vw, 72px) clamp(20px, 4vw, 40px);
  }
  .rail__head h2 { font-size: clamp(1.7rem, 5vw, 2.4rem); }
  .rail__track {
    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
    gap: clamp(16px, 2.4vw, 24px);
  }

  /* Not-found state — desktop clamp gave it 12 vw padding which
     eats a phone screen. Bring it into the mobile rhythm. */
  .pdp__missing {
    padding: clamp(56px, 10vw, 96px) clamp(20px, 4vw, 40px);
  }
  .pdp__missing h1 { font-size: clamp(1.9rem, 6vw, 2.6rem); }

  /* ------------------------------------------------------------
     Cart page — mid-tier (≤ 720 px). Two goals: (1) push the head
     below the fixed nav which the desktop clamp fails to clear,
     (2) tune line-item + summary typography for portrait tablet /
     large phone landscape before the ≤ 480 refinement kicks in.
     ------------------------------------------------------------ */
  .cart {
    padding: clamp(96px, 14vw, 120px) clamp(20px, 4vw, 40px)
             clamp(64px, 9vw, 96px);
  }
  .cart__head { margin-bottom: clamp(28px, 4vw, 44px); }
  .cart__head h1 { font-size: clamp(2rem, 6vw, 3.2rem); }
  .cart__lede { font-size: 0.94rem; }
  .cart__body { gap: 28px; }

  .cline { grid-template-columns: 110px 1fr; gap: 20px; padding: 20px 0; }
  .cline__row h3 { font-size: 1.1rem; }
  .cline__actions { flex-wrap: wrap; gap: 12px; }

  .cart__summary { padding: 26px; }
  .cart__summary h2 { font-size: 0.98rem; margin-bottom: 16px; padding-bottom: 14px; }

  .cart__empty { padding: clamp(64px, 10vw, 96px) 20px; }
  .cart__empty h2 { font-size: clamp(1.9rem, 5.5vw, 2.8rem); }
}

/* Tighten pvideo + collection grid at mid-to-wide viewports.
   Range covers 1200–1720px so both the 4-col tier (1200–1599px, laptop
   range including 1280px) and the lower half of the 5-col tier
   (1600–1720px) get consistent card typography and vertical rhythm. */
@media (min-width: 1200px) and (max-width: 1720px) {
  .pvideo {
    /* Slightly larger --pvideo-gap in this range so the video breathes on
       mid-desktop viewports. This flows to .pvideo__inner margin-top too,
       preserving the symmetric-margin invariant. */
    --pvideo-gap: clamp(120px, 9vw, 140px);
    padding-bottom: 56px;
  }
  .pvideo__title {
    font-size: clamp(3.2rem, 4.2vw, 4.2rem);
  }
  .shop-toolbar {
    padding-top: 48px;
    padding-bottom: 32px;
  }
  .collection {
    padding-bottom: clamp(96px, 10vw, 128px);
  }
  .collection__grid {
    gap: clamp(18px, 1.6vw, 26px);
  }
  /* Tighten card body copy so long product names (e.g. "Shaghaf Amber
     Infusion") stay balanced against price and CTA at both 4-col and
     5-col tiers within this range. */
  .pcard__row h3 { font-size: 1.15rem; }
  .pcard__price { font-size: 0.94rem; }
  .pcard__notes { font-size: 0.78rem; }
  .pcard__add {
    padding: 9px 14px;
    font-size: 0.58rem;
    letter-spacing: 0.2em;
  }
  .pcard__more { font-size: 0.6rem; }
}

@media (max-width: 560px) {
  .cbox {
    padding: 20px;
  }
  .cart__summary,
  .checkout__summary {
    padding: 24px;
  }
  .cline {
    grid-template-columns: 80px 1fr;
    gap: 16px;
  }
  .cline__row h3 {
    font-size: 1.2rem;
  }

  /* ==========================================================
     Checkout — small-phone refinements (≤ 560 px)
     ----------------------------------------------------------
     Trims the horizontal cushion so the checkout column doesn't
     eat 15%+ of a 360 px viewport, and rebalances typography +
     hit-targets for one-handed use. Every selector below is
     .checkout-scoped so home / catalog / product / cart pages
     are guaranteed unaffected.
     ========================================================== */
  .checkout {
    /* Keep enough top padding to clear the fixed mobile nav (top: 12–18 px
       + hamburger button height ≈ 56–64 px total). 92 px gives 20–30 px of
       breathing room above the first cbox on 360–430 px viewports. */
    padding: 92px 16px clamp(56px, 8vw, 80px);
  }

  /* Section header — smaller num pill + tighter head strip so the form
     fields (which are the actual work) get more room. */
  .cbox__head {
    gap: 10px;
    margin-bottom: 16px;
    padding-bottom: 12px;
  }
  .cbox__num {
    width: 28px;
    height: 28px;
    font-size: 0.72rem;
  }
  .cbox__head h2 {
    font-size: 0.95rem;
    letter-spacing: -0.005em;
  }

  /* Delivery method — on ≤ 560 px the 3-column grid (radio · title ·
     price) can't fit "Standard · 3–5 business days" + "Free over $150"
     on one row without breaking. Reflow into a 2-column grid:
       row 1: [radio] [title]
       row 2: [   ]   [price]
     The radio spans both rows and stays vertically centered. */
  .ship {
    grid-template-columns: auto 1fr;
    grid-template-rows: auto auto;
    row-gap: 4px;
    padding: 14px;
  }
  .ship input {
    grid-column: 1;
    grid-row: 1 / span 2;
    align-self: center;
  }
  .ship__title {
    grid-column: 2;
    grid-row: 1;
    font-size: 0.88rem;
    line-height: 1.3;
  }
  .ship__price {
    grid-column: 2;
    grid-row: 2;
    justify-self: start;
    font-size: 0.8rem;
    color: rgba(17, 17, 17, 0.6);
  }

  /* Order summary — tighter surface + smaller media so the price stays
     comfortably clear of the right edge on 360–390 px viewports. */
  .checkout__summary {
    padding: 22px 18px;
  }
  .checkout__summary h2 {
    font-size: 0.9rem;
    margin-bottom: 16px;
    padding-bottom: 12px;
  }
  .coline {
    grid-template-columns: 48px 1fr auto;
    gap: 12px;
  }
  .coline__media {
    width: 48px;
    height: 48px;
  }
  .coline__body h3 { font-size: 0.88rem; }
  .coline__body p { font-size: 0.6rem; letter-spacing: 0.18em; }
  .coline__price { font-size: 0.86rem; }

  .checkout__totals > div { font-size: 0.88rem; }
  .checkout__totals-line dd { font-size: 1.05rem; }
  .checkout__badges {
    flex-wrap: wrap;
    row-gap: 4px;
    font-size: 0.62rem;
  }

  /* Place-order CTA — same 60 px tap target, but lighter tracking so
     the label doesn't hit the pill edges on the narrowest phones. */
  .checkout__cta {
    height: 56px;
    font-size: 0.72rem;
    letter-spacing: 0.14em;
  }

  /* Confirmation + empty states — cap the display heading so it stops
     towering over the ~360 px viewport. Original clamp() min was
     2.4rem / 1.8rem which reads too heavy on a phone. */
  .checkout__done { margin: 48px auto; }
  .checkout__done h1 {
    font-size: clamp(1.8rem, 8vw, 2.4rem);
    line-height: 1;
    margin: 16px 0 12px;
  }
  .checkout__done p { font-size: 0.94rem; }
  .checkout__empty { margin: 48px auto; }
  .checkout__empty h2 {
    font-size: clamp(1.5rem, 7vw, 2rem);
    margin: 10px 0 20px;
  }
}

/* ==============================================================
   Toast — global bottom-center chip
   --------------------------------------------------------------
   Rendered on demand by shop-shell.js as a single-instance <div>
   appended to <body>. Structure:
     <div class="toast" role="status" aria-live="polite">
       <span class="toast__ic">😊</span>
       <span class="toast__msg">…</span>
     </div>
   Idle: hidden, translated down, opacity 0. Active (.is-show):
   visible, slides up, opacity 1. z-index 200 sits above nav (40)
   and page content, below the loader (300). Position uses
   translate3d for GPU compositing; --toast-lift keeps hover from
   causing layout thrash.
   ============================================================== */
.toast {
  position: fixed;
  left: 50%;
  bottom: clamp(24px, 4vw, 44px);
  z-index: 200;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 12px 22px 12px 14px;
  border-radius: 999px;
  background: #0b0b0b;
  color: #fff;
  font-family: var(--font-geist-sans);
  font-size: 0.86rem;
  font-weight: 600;
  letter-spacing: 0.005em;
  line-height: 1;
  white-space: nowrap;
  max-width: min(92vw, 520px);
  box-shadow:
    0 12px 40px -14px rgba(0, 0, 0, 0.55),
    0 2px 6px -2px rgba(0, 0, 0, 0.35),
    inset 0 0 0 1px rgba(255, 255, 255, 0.06);
  opacity: 0;
  visibility: hidden;
  transform: translate(-50%, 24px);
  transition:
    transform 380ms cubic-bezier(0.22, 1, 0.36, 1),
    opacity 260ms ease,
    visibility 0s linear 260ms;
  pointer-events: none;
  will-change: transform, opacity;
}

.toast.is-show {
  opacity: 1;
  visibility: visible;
  transform: translate(-50%, 0);
  pointer-events: auto;
  transition:
    transform 420ms cubic-bezier(0.22, 1, 0.36, 1),
    opacity 220ms ease,
    visibility 0s linear 0s;
}

.toast__ic {
  display: inline-grid;
  place-items: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.08);
  font-size: 1.05rem;
  line-height: 1;
  /* Keep emoji glyphs consistent across platforms. */
  font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", var(--font-geist-sans);
  /* Nudge glyph baseline so 😊 sits centered in the pill. */
  transform: translateY(0.5px);
}

.toast__msg {
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: min(80vw, 440px);
}

.toast[data-tone="soft"] {
  background: #1a1a1a;
  color: rgba(255, 255, 255, 0.92);
}

/* Reduced-motion: instant appear/disappear (still fades a touch for legibility). */
@media (prefers-reduced-motion: reduce) {
  .toast,
  .toast.is-show {
    transition: opacity 120ms ease, visibility 0s;
    transform: translate(-50%, 0);
  }
}

/* Tiny screens: tighten paddings + reduce max-width. */
@media (max-width: 440px) {
  .toast {
    padding: 10px 18px 10px 12px;
    font-size: 0.82rem;
    gap: 10px;
  }
  .toast__ic {
    width: 24px;
    height: 24px;
    font-size: 0.95rem;
  }
}

/* ==============================================================
   MOBILE FINE-TUNE — small phones (≤ 480 px)
   --------------------------------------------------------------
   Layered on top of the existing responsive cascade (1180 → 900
   → 640 → 560 → 520 → 480). Nothing above 480 px is affected.
   Consolidates every home-page section so tiny phones (down to
   the 400 px target requested for enterprise QA) get:
     • rail-tight paddings via --pad / --section-pad tokens
     • tap targets ≥ 40 px preserved on every action
     • no horizontal overflow on nav, wordmark, or legal row
     • fluid typography that never truncates or clips
   ============================================================== */
@media (max-width: 480px) {
  /* Tighten global rails so every section that consumes these
     tokens (nav, hero, shop, families, foot, product pages) breathes
     properly on 375–480 px phones without hard-coding each. */
  :root {
    --pad: 18px;
    --section-pad: 16px;
  }

  body { font-size: 15px; }

  /* -- Nav bar ------------------------------------------------ */
  .nav { top: 12px; gap: 10px; }
  .brand img { height: 42px; }
  .nav__right { gap: 8px; }
  .nav__actions { padding: 4px; gap: 2px; }
  .nav__ic { width: 36px; height: 36px; }
  .nav__ic svg { width: 16px; height: 16px; }
  .nav__sep { height: 18px; }
  .nav__bag {
    height: 36px;
    padding: 0 4px 0 10px;
    gap: 8px;
    font-size: 0.66rem;
    letter-spacing: 0.12em;
  }
  .nav__bag b {
    min-width: 24px;
    height: 24px;
    padding: 0 6px;
    font-size: 0.68rem;
  }
  .icon-circle { width: 40px; height: 40px; }
  .icon-circle svg { width: 16px; height: 16px; }
  .nav__burger i { left: 12px; width: 14px; }
  .nav__burger i:first-child { top: 15px; }
  .nav__burger i:last-child { top: 22px; width: 10px; }
  .nav__burger.is-open i:first-child,
  .nav__burger.is-open i:last-child { top: 18px; }
  .nav__burger.is-open i:last-child { width: 14px; }

  /* Mobile menu — nudge above the shorter nav & tighten typography. */
  .menu {
    top: 78px;
    right: 12px;
    left: 12px;
    padding: 18px 20px;
    gap: 12px;
  }
  .menu a,
  .menu button { font-size: 1rem; }

  /* -- Hero --------------------------------------------------- */
  .hero {
    padding: 96px var(--pad) 84px;
    gap: 32px;
  }
  .hero h1 {
    font-size: clamp(2.2rem, 11vw, 2.8rem);
    margin-bottom: 14px;
  }
  .hero__lede { font-size: 0.94rem; }
  .hero__cta { gap: 14px; margin-top: 20px; }
  .btn.btn--light {
    min-height: 52px;
    padding: 5px 5px 5px 20px;
    gap: 12px;
    font-size: 0.7rem;
  }
  .btn__ic { width: 40px; height: 40px; font-size: 0.9rem; }
  .ghost-link { height: 44px; font-size: 0.66rem; gap: 8px; }

  /* Sound pill — smaller and closer to the edge on tiny viewports. */
  .hero__sound {
    padding: 8px 14px 8px 12px;
    font-size: 0.62rem;
    gap: 8px;
    letter-spacing: 0.14em;
  }

  /* -- Marquee ------------------------------------------------ */
  .mrq { padding: clamp(24px, 5vw, 40px) 0; }
  .mrq__track { gap: 22px; padding-right: 22px; }
  .mrq__word { font-size: clamp(2rem, 10vw, 3rem); }
  .mrq__ic {
    width: 44px;
    height: 44px;
    font-size: 1.3rem;
  }
  .mrq__img {
    width: 96px;
    height: 64px;
  }

  /* -- Shop rail --------------------------------------------- */
  .shop { padding: 72px var(--pad) 64px; }
  .shop__head { gap: 20px; padding-bottom: 32px; }
  .shop h2,
  .talk-sec h2 { font-size: clamp(1.75rem, 7.5vw, 2.2rem); }
  .shop__intro { font-size: 0.92rem; }
  .shop__all { font-size: 0.68rem; letter-spacing: 0.16em; }
  .shop__rail {
    --card-w: 82vw;
    gap: 16px;
    margin-top: 32px;
    padding-bottom: 32px;
  }

  .card__meta { padding: 18px 18px 18px; gap: 6px; }
  .card__family { font-size: 0.56rem; letter-spacing: 0.2em; }
  .card h3 { font-size: 1rem; }
  .card__price { font-size: 0.95rem; }
  .card__notes { font-size: 0.78rem; }
  .card__foot { gap: 10px; padding-top: 12px; margin-top: 8px; }
  .card__go { width: 38px; height: 38px; font-size: 0.9rem; }
  .card__idx,
  .card__tag { font-size: 0.56rem; padding: 6px 10px; letter-spacing: 0.18em; }

  /* -- Families ---------------------------------------------- */
  .families { padding: 72px var(--pad) 64px; }
  .families__head { gap: 20px; padding-bottom: 32px; }
  .families__title h2 { font-size: clamp(1.75rem, 7.5vw, 2.2rem); }
  .families__intro { font-size: 0.9rem; }
  .families__all { font-size: 0.66rem; letter-spacing: 0.16em; }
  .families__all .arrow { width: 28px; height: 28px; }
  .families__grid { gap: 16px; margin-top: 32px; }
  .fam {
    min-height: 260px;
    padding: 20px;
    gap: 12px;
    border-radius: 20px;
  }
  .fam__idx {
    font-size: 0.54rem;
    padding: 5px 10px;
    letter-spacing: 0.22em;
  }
  .fam__body { max-width: 66%; }
  .fam__body h3 { font-size: 1.5rem; }
  .fam__notes { font-size: 0.54rem; letter-spacing: 0.2em; }
  .fam__desc { font-size: 0.78rem; max-width: 22ch; }
  .fam__go { font-size: 0.58rem; margin-top: 8px; letter-spacing: 0.18em; }
  .fam__go b { width: 30px; height: 30px; font-size: 0.8rem; }
  .fam__product { width: 34%; top: 14px; right: 14px; }

  /* -- Horizontal gallery ------------------------------------ */
  .hgallery__sticky { padding: 60px 0 40px; }
  .hgallery__head { padding: 0 var(--pad) 28px; gap: 16px; }
  .hgallery__title { font-size: clamp(1.9rem, 8vw, 2.4rem); margin: 16px 0 12px; }
  .hgallery__lede { font-size: 0.9rem; }
  .hgallery__meter { max-width: 240px; }
  .hgallery__hint { font-size: 0.66rem; letter-spacing: 0.22em; }
  /* Align the first card's left edge with the section's text rail (title +
     lede + meter all use --pad). Product images carry more visual weight
     than text, so we add a small +6 px cushion beyond --pad — the same
     editorial-rail convention used by shop.__rail on desktop — so the card
     reads as intentionally inset rather than flush.
     scroll-padding-left is paired to the same offset so scroll-snap-align:
     start still honors the padding after the user scrolls back to card 01.
     Card width trimmed to 80 vw so the added left cushion doesn't eat into
     the right-side peek that hints at more cards. */
  .hgallery__track {
    padding: 16px var(--pad) 32px calc(var(--pad) + 6px);
    scroll-padding-left: calc(var(--pad) + 6px);
    gap: 16px;
  }
  .hgallery__item { width: 80vw; }
  .hgallery__frame { height: 52vh; border-radius: 16px; }
  .hgallery__item figcaption b { font-size: 1.05rem; }
  .hgallery__item figcaption em { font-size: 0.78rem; }

  /* -- Manifesto --------------------------------------------- */
  .manifesto { padding: 80px var(--pad); }
  .manifesto__title { font-size: clamp(1.85rem, 9vw, 2.6rem); }
  .manifesto__lede { font-size: 0.92rem; }
  .manifesto__soft { font-size: 0.86rem; }
  .manifesto__eyebrow {
    font-size: 0.6rem;
    letter-spacing: 0.24em;
    padding: 6px 12px;
  }
  .manifesto__meta-txt {
    font-size: 0.58rem;
    letter-spacing: 0.2em;
  }
  .manifesto__ing--tr {
    width: 78px;
    top: 16px;
    right: 8px;
  }
  .manifesto__ing--bl {
    width: 88px;
    bottom: 16px;
    left: 8px;
  }

  /* -- Picks (bestseller + chart) ---------------------------- */
  .picks__left,
  .picks__right { padding: 36px var(--pad); }
  .picks__eyebrow,
  .picks__stock { font-size: 0.62rem; letter-spacing: 0.22em; }
  .picks__hero { width: clamp(140px, 46vw, 200px); }
  .picks__ring { width: 200px; height: 200px; }
  .picks__ring::before { inset: 16px; }
  .picks__ring::after { inset: 34px; }
  .picks__watermark { font-size: 3rem; letter-spacing: -0.03em; }
  .picks__name { font-size: 1.75rem; }
  .picks__notes { font-size: 0.62rem; letter-spacing: 0.22em; }
  .picks__blurb { font-size: 0.88rem; }
  .picks__foot { gap: 16px; padding-top: 18px; }
  .picks__priceval { font-size: 1.5rem; }
  .picks__priceunit { font-size: 0.58rem; letter-spacing: 0.2em; }
  .picks__cta {
    padding: 4px 4px 4px 18px;
    font-size: 0.62rem;
    letter-spacing: 0.2em;
  }
  .picks__cta b { width: 32px; height: 32px; font-size: 0.85rem; }

  /* Editorial chart — tightened vertical rhythm + full-width bottom CTA
     so the section reads as a proper e-commerce mini-shortlist on phones. */
  .picks__right {
    padding: 36px var(--pad) 40px;
    gap: 22px;
  }
  .picks__head { gap: 12px; }
  .picks__label { font-size: 0.62rem; letter-spacing: 0.22em; }
  .picks__title { font-size: clamp(1.75rem, 8vw, 2.4rem); line-height: 1.05; }
  .picks__lede { font-size: 0.88rem; line-height: 1.55; max-width: none; }

  /* Slightly stronger hairline than the desktop 0.14 alpha so rows feel like
     chart data on mobile where scale is smaller. */
  .picks__list { margin-top: 4px; }
  .pick,
  .pick:last-child { border-color: rgba(20, 16, 14, 0.18); }

  /* Compact chart row: rank column at 34 px to match the reduced rank type;
     price/arrow stay right, info column flexes in the middle. */
  .pick__link {
    grid-template-columns: 34px 1fr auto;
    column-gap: 12px;
    padding: 14px 0;
    align-items: center;
  }
  .pick__link:hover { padding-left: 0; }

  /* Touch feedback — subtle tap flash so the row reads as tappable on phones
     where no `:hover` fires. */
  .pick__link:active {
    background: rgba(20, 16, 14, 0.03);
  }

  /* --- List item typography — one step smaller across the board so the
     chart reads more compact / editorial. Adjusted together to preserve
     relative hierarchy (rank > name > price > notes). --- */
  .pick__rank { font-size: 1.2rem; line-height: 1; }
  .pick__info { gap: 4px; min-width: 0; }
  .pick__info h4 {
    font-size: 0.92rem;
    line-height: 1.25;
    /* Prevent narrow phones from breaking long product names in awkward
       places; wrap on token boundaries only. */
    overflow-wrap: anywhere;
  }
  .pick__info p {
    /* Tighter tracking (0.18 → 0.14 em) prevents the "WARM AMBER" orphan
       shown in QA where a 3-word notes line broke to a second line with
       only the last word. */
    font-size: 0.54rem;
    letter-spacing: 0.14em;
    line-height: 1.5;
  }
  .pick__price { font-size: 0.9rem; }
  .pick__right { gap: 10px; }

  /* "See all bestsellers" — full-width, taller CTA so it reads as the
     section's primary action rather than a floating pill. Tap area 48 px
     min-height (WCAG AA target-size). */
  .picks__all {
    align-self: stretch;
    justify-content: space-between;
    margin-top: 18px;
    padding: 6px 6px 6px 22px;
    min-height: 48px;
    font-size: 0.66rem;
    letter-spacing: 0.2em;
    background: transparent;
  }
  .picks__all b { width: 36px; height: 36px; font-size: 0.88rem; }

  /* -- Cinema (film) ----------------------------------------- */
  .cinema__sticky { padding: 64px var(--pad); }
  .cinema__intro h2 { font-size: clamp(1.9rem, 8vw, 2.6rem); }
  .cinema__intro { margin-bottom: 24px; }
  .cinema__lede { font-size: 0.9rem; }
  .cinema__frame {
    aspect-ratio: 4 / 5;
    max-height: 70vh;
    border-radius: 16px;
  }
  .cinema__badge b { font-size: 0.7rem; letter-spacing: 0.16em; }
  .cinema__badge i { font-size: 0.62rem; }

  /* ==============================================================
     PRODUCTS PAGE — mobile refinements
     --------------------------------------------------------------
     Layered on top of the existing 900/640/599 px rules for
     .pvideo / .shop-toolbar / .collection__grid. Keeps every
     products.html section on the same tight rail (--section-pad)
     as the home page's mobile treatment. Nothing above 480 px
     changes — desktop products.html renders identically.
     ============================================================== */

  /* -- Video hero (top of collection) -----------------------
     Aspect ratio + border-radius intentionally inherit from the existing
     ≤ 900 px rule (16/11 landscape, 12 px radius) — don't override here,
     the previous portrait override was reverted per QA feedback.
     --pvideo-gap sets the top clearance below the fixed nav; 88 px gives
     ~30 px of clean breathing room below a nav that sits at top: 12 px
     with a 42 px brand mark. */
  .pvideo {
    --pvideo-gap: 88px;
    padding-bottom: 24px;
  }
  .pvideo__inner { padding: 0 var(--section-pad); }
  .pvideo__eyebrow {
    padding: 6px 14px;
    gap: 8px;
    font-size: 0.52rem;
    letter-spacing: 0.14em;
    margin-bottom: 20px;
    /* Long eyebrow copy ("THE COLLECTION · 07 SIGNATURES") was pushing the
       pill wider than the viewport at 360 px. Allow the copy to wrap inside
       the pill on very narrow phones so it stays inside the rail. */
    flex-wrap: wrap;
    max-width: 100%;
  }
  /* Hide the small leading rule (—) inside the eyebrow pill on mobile —
     with the smaller pill and centered text it reads as visual clutter. */
  .pvideo__rule { display: none; }
  .pvideo__title {
    /* Reduced clamp so "MADE WITH / INTENTION. MEANT TO BE / WORN." fits
       comfortably on a 375 px viewport without breaking into more than
       four lines. Line-height loosened slightly so the accent-colored
       italic words breathe. */
    font-size: clamp(1.55rem, 8vw, 2rem);
    line-height: 1;
    margin-bottom: 20px;
  }
  .pvideo__lede {
    font-size: 0.88rem;
    line-height: 1.55;
    margin-bottom: 28px;
    max-width: none;
  }
  .pvideo__foot { gap: 18px; padding-top: 20px; }
  .pvideo__meta {
    /* 2×2 grid keeps the four data points visible without wrapping labels. */
    grid-template-columns: 1fr 1fr;
    gap: 14px 20px;
  }
  .pvideo__meta dt { font-size: 0.54rem; letter-spacing: 0.2em; }
  .pvideo__meta dd { font-size: 0.9rem; }

  /* "Just landed" featured pill — full-width so the long
     "Nectar Blush · $138" copy never overflows the button. */
  .pvideo__feat {
    align-self: stretch;
    justify-content: space-between;
    padding: 10px 10px 10px 16px;
    gap: 10px;
  }
  .pvideo__feat-lbl { font-size: 0.56rem; letter-spacing: 0.2em; }
  .pvideo__feat-name { font-size: 0.88rem; }
  .pvideo__feat-arrow { width: 30px; height: 30px; font-size: 0.85rem; }

  /* -- Toolbar (filter chips + sort) ------------------------
     Filter row is a horizontally scrollable pill on mobile. The visible
     rounded border of the pill contains the scroll, and the last chip
     naturally cuts off at the right edge — that partial-visibility is
     the standard mobile scroll affordance (same pattern as Instagram
     Stories, TikTok filters, native chip UIs). No mask fade because it
     was fading the pill's own border on the right edge and made the
     chips look like they were escaping the container. */
  .shop-toolbar {
    padding: 28px var(--section-pad) 24px;
    gap: 14px 16px;
  }
  /* Filter pill: constrained to 95% of the toolbar row width so it never
     touches the section edges; native horizontal scroll on overflow with
     the scrollbar visually hidden (webkit/gecko/edge all covered by the
     base .shop-toolbar__filters rule higher up in the file). */
  .shop-toolbar__filters {
    padding: 3px;
    max-width: 95%;
  }
  .shop-toolbar .chip {
    min-height: 38px;
    padding: 0 14px;
    font-size: 0.62rem;
    letter-spacing: 0.14em;
  }
  .shop-toolbar .chip i {
    min-width: 20px;
    height: 18px;
    padding: 0 5px;
    font-size: 0.56rem;
  }
  .shop-toolbar__sort {
    font-size: 0.62rem;
    letter-spacing: 0.18em;
    gap: 10px;
  }
  .shop-toolbar__select select {
    padding: 10px 36px 10px 16px;
    font-size: 0.66rem;
    letter-spacing: 0.04em;
  }
  .shop-toolbar__caret { right: 14px; font-size: 0.65rem; }

  /* -- Collection grid (product cards) ---------------------- */
  .collection { padding-bottom: 72px; }
  .collection__grid {
    /* Same horizontal rail as the toolbar and pvideo hero. */
    padding: 0 var(--section-pad);
    gap: 32px;
  }

  .pcard__body { padding: 16px 2px 4px; gap: 6px; }
  .pcard__row { gap: 12px; }
  .pcard__row h3 { font-size: 1.15rem; padding-bottom: 3px; }
  .pcard__price { font-size: 0.96rem; }
  .pcard__family { font-size: 0.56rem; letter-spacing: 0.22em; margin: 4px 0 2px; }
  .pcard__notes { font-size: 0.78rem; margin: 0 0 12px; }
  .pcard__idx { font-size: 0.56rem; padding: 5px 8px; letter-spacing: 0.22em; }
  .pcard__tag { font-size: 0.52rem; padding: 5px 10px; letter-spacing: 0.2em; }

  /* Card footer: on narrow phones the add-button + Details link were
     wrapping unpredictably. Enforce the exact 2-column split we want. */
  .pcard__foot {
    flex-wrap: nowrap;
    gap: 10px;
    padding-top: 12px;
  }
  .pcard__add {
    padding: 10px 14px;
    font-size: 0.58rem;
    letter-spacing: 0.2em;
    gap: 8px;
    /* Grow to fill available space so the button reads as the primary CTA;
       Details link stays intrinsic-width on the right. */
    flex: 1 1 auto;
    justify-content: center;
  }
  .pcard__more { font-size: 0.6rem; letter-spacing: 0.2em; flex-shrink: 0; }

  /* ==============================================================
     PRODUCT DETAIL PAGE (PDP) — mobile refinements
     --------------------------------------------------------------
     Layered on top of the existing ≤ 1100 px rule that already
     stacks .pdp__hero into a single column. All typography scaled
     one step down so long product names + breadcrumbs don't create
     4-line wraps on 375 px phones. Notes pyramid + rails also
     tightened to match the compact PDP typography.
     ============================================================== */

  /* Breadcrumbs — small, single-line-friendly. Padding-top clears the
     shrunken fixed nav (~54 px) with a 32 px breathing gap. */
  .crumbs {
    padding: 86px var(--section-pad) 0;
    gap: 6px;
    font-size: 0.56rem;
    letter-spacing: 0.16em;
    flex-wrap: wrap;
    line-height: 1.4;
  }
  .crumbs i { font-size: 0.7rem; }

  /* PDP hero — column stack is already handled by ≤ 1100 rule; this
     tightens the spacing + typography inside the single column. */
  .pdp__hero {
    padding: 28px var(--section-pad) 56px;
    gap: 24px;
  }
  .pdp__stage { max-width: 100%; }
  .pdp__thumbs {
    max-width: 100%;
    margin-top: 16px;
    gap: 10px;
    flex-wrap: wrap;
    justify-content: center;
  }
  .pdp__thumb { width: 56px; height: 56px; }

  /* Not-found state — enterprise QA edge case (bad ?id= in URL). */
  .pdp__missing { padding: 72px var(--section-pad); }
  .pdp__missing h1 { font-size: clamp(1.7rem, 8vw, 2.2rem); }

  /* ============================================================
     CART PAGE — mobile refinements (≤ 480 px)
     ------------------------------------------------------------
     Fixes the reported bug where the "Your bag" header collided
     with the fixed site nav (desktop clamp of 48 px min was less
     than the ~90 px effective nav bottom edge). Also tightens
     line-item, summary, and empty-state typography for phones.
     ============================================================ */
  .cart {
    padding: 100px var(--section-pad) 64px;
  }
  .cart__head { margin-bottom: 24px; }
  .cart__head .label {
    font-size: 0.58rem;
    letter-spacing: 0.2em;
  }
  .cart__head h1 {
    font-size: clamp(1.9rem, 9vw, 2.4rem);
    margin: 10px 0 12px;
  }
  .cart__lede { font-size: 0.88rem; line-height: 1.55; }

  .cart__body { gap: 24px; }

  /* Line items — smaller media column + wrap-friendly row so a long
     product name never gets crushed against the price. */
  .cline {
    grid-template-columns: 88px 1fr;
    gap: 14px;
    padding: 18px 0;
  }
  .cline__body { padding: 2px 0; gap: 10px; justify-content: flex-start; }
  .cline__row {
    flex-wrap: wrap;
    gap: 6px 12px;
    align-items: baseline;
  }
  .cline__row h3 {
    font-size: 1rem;
    overflow-wrap: anywhere;
    flex: 1 1 auto;
  }
  .cline__price {
    font-size: 0.94rem;
    flex-shrink: 0;
  }
  .cline__meta {
    font-size: 0.58rem;
    letter-spacing: 0.16em;
    margin: 4px 0 10px;
  }
  .cline__actions {
    flex-wrap: wrap;
    gap: 10px 14px;
  }
  .cline__qty {
    font-size: 0.58rem;
    letter-spacing: 0.16em;
    padding: 5px 12px;
  }
  .cline__remove {
    font-size: 0.58rem;
    letter-spacing: 0.16em;
    padding: 4px 0;
  }

  /* Summary card — full-width on mobile via the ≤ 1100 stack, so we
     compress padding + type so it doesn't dominate the fold. */
  .cart__summary { padding: 22px; border-radius: 4px; }
  .cart__summary h2 {
    font-size: 0.9rem;
    letter-spacing: 0.16em;
    margin-bottom: 14px;
    padding-bottom: 12px;
  }
  .cart__totals { gap: 8px; padding-bottom: 16px; margin-bottom: 16px; }
  .cart__totals > div { font-size: 0.86rem; }
  .cart__totals-line { font-size: 0.98rem !important; }
  .cart__totals-line dt { font-size: 0.64rem; letter-spacing: 0.16em; }
  .cart__totals-line dd { font-size: 1.15rem; }

  .cart__cta {
    height: 52px;
    font-size: 0.62rem;
    letter-spacing: 0.14em;
    gap: 8px;
  }
  .cart__hint { font-size: 0.76rem; margin: 4px 0; }
  .cart__badges {
    flex-wrap: wrap;
    gap: 6px 10px;
    font-size: 0.58rem;
    letter-spacing: 0.16em;
    margin-top: 16px;
    padding-top: 16px;
  }

  /* Empty state — same 12 vw padding overflow that .pdp__missing had. */
  .cart__empty { padding: 64px var(--section-pad); }
  .cart__empty h2 { font-size: clamp(1.7rem, 8vw, 2.2rem); }
  .cart__empty p { font-size: 0.9rem; margin-bottom: 20px; }

  .pdp__idx {
    font-size: 0.58rem;
    letter-spacing: 0.22em;
    gap: 8px;
    margin-bottom: 14px;
  }
  .pdp__idx i { width: 20px; }

  .pdp__name {
    font-size: clamp(1.75rem, 8.5vw, 2.4rem);
    line-height: 0.98;
    margin-bottom: 12px;
  }
  .pdp__concentration {
    font-size: 0.6rem;
    letter-spacing: 0.16em;
    margin-bottom: 22px;
  }
  .pdp__story {
    font-size: 0.92rem;
    line-height: 1.6;
    margin-bottom: 24px;
  }

  /* Specs — 3-col with cramped 0.9 rem dd values felt tight on 375 px.
     Compress padding + typography so the row still reads. */
  .pdp__specs {
    gap: 14px;
    padding: 18px 0;
    margin-bottom: 24px;
  }
  .pdp__specs dt {
    font-size: 0.52rem;
    letter-spacing: 0.2em;
    margin-bottom: 6px;
  }
  .pdp__specs dd { font-size: 0.82rem; }

  /* Buy row — price + CTA. Stack on very narrow phones so the pill
     doesn't collide with the price when it grows to 4 digits. */
  .pdp__buy {
    gap: 16px;
    margin-bottom: 22px;
    flex-wrap: wrap;
  }
  .pdp__price { font-size: 1.4rem; }
  .pdp__add {
    height: 48px;
    padding: 0 22px;
    font-size: 0.62rem;
    letter-spacing: 0.16em;
    gap: 8px;
    flex: 1 1 auto;
    justify-content: center;
  }
  .pdp__promise {
    font-size: 0.78rem;
    gap: 6px;
  }

  /* Notes pyramid — 1-col stack via the pre-existing ≤ 900 rule.
     Tighten padding + type so each tier card doesn't feel oversized. */
  .pyramid { padding: 56px var(--section-pad); }
  .pyramid__head { margin-bottom: 28px; }
  .pyramid__head h2 { font-size: clamp(1.75rem, 8vw, 2.2rem); }
  .pyramid__tier { padding: 22px; border-radius: 4px; }
  .pyramid__idx { top: 18px; right: 20px; font-size: 0.58rem; letter-spacing: 0.2em; }
  .pyramid__tier h3 { font-size: 1.1rem; margin-bottom: 14px; }
  .pyramid__tier li { font-size: 0.86rem; padding-left: 16px; }
  .pyramid__tier li::before { top: 10px; width: 8px; }

  /* Recently viewed / Popular pairings rails — grid already auto-fills.
     Trim padding + heading so rails don't dominate the mobile page. */
  .rail { padding: 48px var(--section-pad); }
  .rail__head { margin-bottom: 22px; }
  .rail__head h2 { font-size: clamp(1.5rem, 7.5vw, 2rem); }
  .rail__track {
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: 18px;
  }
  .rcard__meta { padding-top: 12px; }
  .rcard__meta h3 { font-size: 0.92rem; }
  .rcard__meta p { font-size: 0.56rem; letter-spacing: 0.18em; margin-bottom: 8px; }
  .rcard__price { font-size: 0.84rem; }

  /* -- Footer ------------------------------------------------ */
  .foot { padding: 56px var(--section-pad) 80px; }
  .foot__top { gap: 36px; padding-bottom: 36px; }
  .foot__col--brand { gap: 18px; }
  .foot__logo img { height: 32px; }
  .foot__lede { font-size: 0.82rem; max-width: none; }
  .foot__hd { font-size: 0.92rem; }
  .foot__hd--sm { font-size: 0.82rem; }
  .foot__col--nav a { font-size: 0.86rem; }

  /* Newsletter row: allow the button to shrink but keep both on one line.
     If email address is long the input flexes; button retains its tap area. */
  .foot__news { padding: 4px 4px 4px 12px; max-width: 100%; }
  .foot__news input { font-size: 0.82rem; }
  .foot__news input::placeholder { font-size: 0.8rem; }
  .foot__news button {
    padding: 0 8px 0 14px;
    font-size: 0.62rem;
    letter-spacing: 0.12em;
    gap: 8px;
    min-height: 36px;
  }
  .foot__news button .arrow { width: 20px; height: 20px; font-size: 0.72rem; }

  .foot__badges { gap: 12px; }
  .foot__social { width: 30px; height: 30px; }
  .foot__cf-txt { font-size: 0.56rem; letter-spacing: 0.05em; }
  .foot__select select { min-height: 42px; font-size: 0.84rem; padding: 0 36px 0 16px; }

  /* Centered wordmark — sub tracking was 0.28em (nowrap) which overflowed
     at 400 px. Loosen tracking + allow wrap so the subtitle always fits. */
  .foot__wordmark { padding: 24px 0 18px; }
  .foot__wordmark-img { height: 40px; }
  .foot__wordmark-sub {
    font-size: 0.56rem;
    letter-spacing: 0.18em;
    white-space: normal;
    text-align: center;
    line-height: 1.4;
  }

  /* Legal row — 4 links + 3 separators overflowed a single row.
     Left-align, allow wrap, hide bullet separators to avoid orphan bullets. */
  .foot__bot {
    justify-content: flex-start;
    text-align: left;
    gap: 6px 12px;
    font-size: 0.72rem;
  }
  .foot__sep { display: none; }
  .foot__copy {
    flex-basis: 100%;
    margin-top: 4px;
    font-size: 0.7rem;
  }
}

/* ==============================================================
   HERO CTA — hide secondary "Explore signatures" link < 500 px
   --------------------------------------------------------------
   On sub-500 px viewports the primary "Shop the line" button is
   sufficient; the secondary ghost link points to the same #shop
   target, so removing it declutters the hero without cost.
   Scoped to `.hero__cta` to avoid affecting any future reuse of
   `.ghost-link` elsewhere in the app.
   ============================================================== */
@media (max-width: 499.98px) {
  .hero__cta .ghost-link { display: none; }
}

/* ==============================================================
   MOBILE FINE-TUNE — very small phones (≤ 400 px)
   --------------------------------------------------------------
   Final tier layered above the ≤480 px block. Targets 360–400 px
   viewports (older iPhone SE, Galaxy Fold outer, budget Androids).
   Only overrides where the 480 px tuning still crowds or clips.
   ============================================================== */
@media (max-width: 400px) {
  :root {
    --pad: 14px;
    --section-pad: 12px;
  }

  body { font-size: 14.5px; }

  /* Nav: keep every action reachable; drop the "Bag" label so the
     bag pill collapses to just the count chip — search icon + count
     + burger still fit comfortably beside a 40 px brand mark. */
  .brand img { height: 38px; }
  .nav__actions { padding: 3px; }
  .nav__ic { width: 34px; height: 34px; }
  .nav__ic svg { width: 15px; height: 15px; }
  .nav__sep { display: none; }
  .nav__bag { padding: 0 3px 0 6px; gap: 6px; }
  .nav__bag > span { display: none; }
  .nav__bag b { min-width: 22px; height: 22px; font-size: 0.66rem; }
  .icon-circle { width: 38px; height: 38px; }

  /* Hero: tighter vertical rhythm on 400 px so the CTA + sound pill
     both stay above the fold on a 640 px-tall phone. */
  .hero { padding: 84px var(--pad) 88px; gap: 24px; }
  .hero h1 { font-size: clamp(2rem, 11.5vw, 2.5rem); }
  .hero__lede { font-size: 0.9rem; }
  .btn.btn--light { min-height: 48px; padding: 4px 4px 4px 16px; font-size: 0.66rem; }
  .btn__ic { width: 38px; height: 38px; font-size: 0.85rem; }
  .ghost-link { height: 40px; font-size: 0.62rem; }
  .hero__sound {
    right: var(--section-pad);
    bottom: 20px;
    padding: 7px 12px 7px 10px;
    font-size: 0.58rem;
  }

  /* Marquee */
  .mrq__word { font-size: clamp(1.75rem, 11vw, 2.6rem); }
  .mrq__ic { width: 40px; height: 40px; font-size: 1.15rem; }
  .mrq__img { width: 84px; height: 56px; }

  /* Shop */
  .shop h2,
  .talk-sec h2,
  .families__title h2,
  .picks__title,
  .hgallery__title,
  .cinema__intro h2,
  .manifesto__title { font-size: clamp(1.6rem, 8.5vw, 2rem); }

  .shop__rail { --card-w: 86vw; gap: 14px; }
  .card__meta { padding: 16px; }
  .card h3 { font-size: 0.95rem; }
  .card__notes { font-size: 0.74rem; }
  .card__go { width: 36px; height: 36px; }

  /* Families */
  .fam { min-height: 240px; padding: 18px; border-radius: 18px; }
  .fam__body h3 { font-size: 1.35rem; }
  .fam__desc { font-size: 0.74rem; }
  .fam__product { width: 32%; }

  /* Horizontal gallery — carry the same left-cushion pattern down to tiny
     phones, but trim card width so the right-side peek stays visible on
     360–400 px viewports where every pixel of the gutter counts. */
  .hgallery__track {
    padding-left: calc(var(--pad) + 4px);
    scroll-padding-left: calc(var(--pad) + 4px);
  }
  .hgallery__item { width: 82vw; }
  .hgallery__frame { height: 46vh; }

  /* Manifesto — decorative SVGs are pure eye-candy on this size,
     shrink further so they never obscure the wordmark. */
  .manifesto { padding: 64px var(--pad); }
  .manifesto__ing--tr { width: 64px; top: 12px; right: 6px; opacity: 0.5; }
  .manifesto__ing--bl { width: 72px; bottom: 12px; left: 6px; opacity: 0.5; }

  /* Picks */
  .picks__left,
  .picks__right { padding: 32px var(--pad); }
  .picks__hero { width: clamp(130px, 52vw, 180px); }
  .picks__ring { width: 170px; height: 170px; }
  .picks__watermark { font-size: 2.5rem; }
  .picks__name { font-size: 1.55rem; }
  .picks__priceval { font-size: 1.35rem; }
  .pick__link {
    grid-template-columns: 26px 1fr auto;
    gap: 10px;
    padding: 12px 0;
  }
  .pick__rank { font-size: 1.15rem; }
  .pick__info h4 { font-size: 0.94rem; }
  .pick__price { font-size: 0.88rem; }

  /* Cinema */
  .cinema__sticky { padding: 56px var(--pad); }
  .cinema__frame { aspect-ratio: 3 / 4; max-height: 62vh; border-radius: 14px; }

  /* Footer */
  .foot { padding: 48px var(--section-pad) 72px; }
  .foot__top { gap: 32px; }
  .foot__logo img { height: 30px; }
  .foot__lede { font-size: 0.8rem; }

  /* Newsletter — button label was still overflowing on 360 px; hide the
     word "Sign up" and lean on the arrow chip (which stays 20 px + tap area
     via the surrounding button's 36 px min-height). */
  .foot__news { padding: 4px 4px 4px 10px; }
  .foot__news input { min-height: 36px; font-size: 0.8rem; }
  .foot__news button {
    padding: 0 10px;
    min-width: 44px;
    gap: 0;
  }
  .foot__news button > span { display: none; }
  .foot__news button .arrow {
    background: transparent;
    width: 18px;
    height: 18px;
  }

  .foot__wordmark { padding: 20px 0 14px; gap: 12px; }
  .foot__wordmark-img { height: 34px; }
  .foot__wordmark-sub { font-size: 0.52rem; letter-spacing: 0.14em; }

  .foot__bot { font-size: 0.68rem; gap: 4px 10px; }
  .foot__bot a { font-size: 0.7rem; }

  /* -- Products page — tightest tier (≤ 400 px) -------------
     Video aspect intentionally inherits ≤ 900 px rule (16/11), not
     overridden here per QA. Title clamp handled by ≤ 480 rule above.
     Top gap 72 px = ~30 px clearance below the 40 px shrunken brand
     mark used at this tier. */
  .pvideo { --pvideo-gap: 72px; }
  .pvideo__title { font-size: clamp(1.4rem, 8.5vw, 1.75rem); }
  .pvideo__lede { font-size: 0.84rem; }
  .pvideo__meta { grid-template-columns: 1fr 1fr; gap: 12px 16px; }
  .pvideo__meta dt { font-size: 0.5rem; }
  .pvideo__meta dd { font-size: 0.84rem; }
  .pvideo__feat { padding: 10px 8px 10px 14px; }
  .pvideo__feat-name { font-size: 0.8rem; }

  .shop-toolbar { padding: 24px var(--section-pad) 20px; }
  .shop-toolbar .chip {
    min-height: 36px;
    padding: 0 12px;
    font-size: 0.58rem;
    letter-spacing: 0.12em;
  }
  .shop-toolbar__select select {
    padding: 9px 32px 9px 14px;
    font-size: 0.62rem;
  }

  .collection__grid { gap: 26px; padding: 0 var(--section-pad); }
  .pcard__row h3 { font-size: 1.05rem; }
  .pcard__price { font-size: 0.9rem; }
  .pcard__notes { font-size: 0.74rem; margin-bottom: 10px; }
  .pcard__add {
    padding: 10px 12px;
    font-size: 0.54rem;
    letter-spacing: 0.16em;
  }
  .pcard__more { font-size: 0.56rem; letter-spacing: 0.16em; }

  /* -- PDP page — tightest tier (≤ 400 px) -------------------
     Focus: keep breadcrumbs on a single line, prevent product name
     wrap-cascades, and shrink pyramid + rail typography a final step
     so 3-word note names ("Cambodian Oud Wood") stay on one row. */
  .crumbs {
    padding: 82px var(--section-pad) 0;
    gap: 5px;
    font-size: 0.52rem;
    letter-spacing: 0.14em;
  }
  .crumbs i { font-size: 0.66rem; }

  .pdp__hero { padding: 22px var(--section-pad) 48px; gap: 20px; }
  .pdp__thumb { width: 52px; height: 52px; }

  .pdp__idx { font-size: 0.54rem; letter-spacing: 0.2em; margin-bottom: 12px; }
  .pdp__name { font-size: clamp(1.55rem, 8vw, 2rem); }
  .pdp__concentration { font-size: 0.56rem; letter-spacing: 0.14em; margin-bottom: 18px; }
  .pdp__story { font-size: 0.86rem; line-height: 1.58; margin-bottom: 22px; }

  .pdp__specs { gap: 12px; padding: 14px 0; margin-bottom: 20px; }
  .pdp__specs dt { font-size: 0.48rem; letter-spacing: 0.18em; }
  .pdp__specs dd { font-size: 0.76rem; }

  .pdp__price { font-size: 1.25rem; }
  .pdp__add {
    height: 46px;
    padding: 0 18px;
    font-size: 0.58rem;
    letter-spacing: 0.14em;
  }
  .pdp__promise { font-size: 0.72rem; }

  .pyramid { padding: 48px var(--section-pad); }
  .pyramid__head h2 { font-size: clamp(1.55rem, 7.5vw, 1.9rem); }
  .pyramid__tier { padding: 18px; }
  .pyramid__tier h3 { font-size: 1rem; margin-bottom: 12px; }
  .pyramid__tier li { font-size: 0.8rem; padding-left: 14px; }

  .rail { padding: 40px var(--section-pad); }
  .rail__head h2 { font-size: clamp(1.4rem, 7vw, 1.8rem); }
  .rail__track {
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: 14px;
  }
  .rcard__meta h3 { font-size: 0.86rem; }
  .rcard__meta p { font-size: 0.52rem; letter-spacing: 0.16em; }
  .rcard__price { font-size: 0.78rem; }

  /* -- Cart page — tightest tier (≤ 400 px) ------------------
     Push everything one more step down. Media column shrinks to
     76 px so the body column has room for wraps of "Shaghaf Amber
     Infusion" without truncation. Header still clears the nav via
     92 px top padding (nav shrinks to ~72 px at this tier). */
  .cart { padding: 92px var(--section-pad) 56px; }
  .cart__head { margin-bottom: 20px; }
  .cart__head h1 { font-size: clamp(1.65rem, 8.5vw, 2rem); margin: 8px 0 10px; }
  .cart__lede { font-size: 0.82rem; }

  .cline { grid-template-columns: 76px 1fr; gap: 12px; padding: 16px 0; }
  .cline__row h3 { font-size: 0.94rem; }
  .cline__price { font-size: 0.88rem; }
  .cline__meta { font-size: 0.54rem; letter-spacing: 0.14em; margin: 3px 0 8px; }
  .cline__qty { font-size: 0.54rem; padding: 4px 10px; }
  .cline__remove { font-size: 0.54rem; }

  .cart__summary { padding: 18px; }
  .cart__summary h2 { font-size: 0.84rem; }
  .cart__totals > div { font-size: 0.8rem; }
  .cart__totals-line dt { font-size: 0.6rem; }
  .cart__totals-line dd { font-size: 1.05rem; }

  .cart__cta { height: 48px; font-size: 0.58rem; letter-spacing: 0.12em; }
  .cart__hint { font-size: 0.72rem; }
  .cart__badges { font-size: 0.54rem; letter-spacing: 0.14em; }

  .cart__empty { padding: 56px var(--section-pad); }
  .cart__empty h2 { font-size: clamp(1.5rem, 7.5vw, 1.9rem); }
}
