/* ============================================================
   SOFA STUDIO — design source of truth.
   This :root block IS the style guide. Living reference:
   https://sofastudio.com.au/styleguide/ (theme-served, reads :root live).
   Reuse existing component classes (.btn / .btn-primary / .btn-accent[=inverse]
   / .btn-ghost / .btn-line / .filter-pill); never invent ad-hoc button/colour styles.
   The old website/style-guide.md is RETIRED (archived 2026-06-25).
   ============================================================ */
/* ─────────────────────────────────────────────────────────────────────
   Sofa Studio — wireframe stylesheet  (v3 type system, 2026-05-08)
   Logo: Bauhaus Bugler (currently SVG stand-in — Bagel Fat One vector).
   Editorial display: Lusitana (serif). [comment fixed 2026-06-14 — token --font-display is Lusitana, not Fraunces]
   UI / body / nav / labels: Inter.
   Modular scale: 1.333 (perfect fourth) from 16px base.
   ───────────────────────────────────────────────────────────────────── */

:root {
  /* ── palette ── warmer ink, deeper accents ── */
  --bg:          #FAF7F0;
  --surface:     #FFFFFF;
  --ink:         #1C1714;
  --ink-muted:   #6B635A;
  --ink-soft:    #9C9388;
  --line:        #E8E1D2;
  --line-soft:   #F0EAD8;
  --hover:       #F4EFE5;

  /* a quiet brand accent — used sparingly (eyebrow rules, focus rings, sale badges) */
  --accent:      #6E4A2A;     /* warm tobacco */
  --accent-soft: #B89878;

  /* electric accent - the neon tier (Dave 2026-07-14) */
  --neon:      #00E0C7;   /* extra-attention CTA fill */
  --neon-soft: #8CDFD2;   /* attention tier fill (subdued aqua) */
  --neon-deep: #063D37;   /* text, borders + rollover fill for both */

  --ok:    #2EBE54;   /* traffic-light green — in stock */
  --warn:  #F5A623;   /* traffic-light amber — on the way */
  --crit:  #D0421B;   /* traffic-light red — used for destructive actions */

  /* ── radii ── slightly softer all-round ── */
  --r-sm: 4px;
  --r:    10px;
  --r-lg: 16px;
  --r-xl: 24px;

  /* ── layout ── narrower container, generous breathing gutter ── */
  --container: 1080px;          /* -5% to keep wordmark off the edge */
  --gutter: clamp(3rem, 9vw, 10rem);
  /* Below the container width the gutter above is the ONLY thing holding text
     off the glass. Any class that also sets the `padding` SHORTHAND (.section,
     .section-tight, .page-head, .site-header__row, .nav-shelf__row) resets
     left/right to 0 at equal specificity, so those containers ran flush to the
     screen edge on a phone. One named mobile inset, re-asserted at the end of
     this file so it outranks every shorthand. */
  --gutter-mobile: 1.25rem;
  /* the header carries an extra inline pad so the wordmark never sits on the edge */
  --header-extra-pad: clamp(0.5rem, 2vw, 2.5rem);

  /* ── motion ── */
  --t-fast: 140ms cubic-bezier(.2,.7,.3,1);
  --t-base: 320ms cubic-bezier(.2,.7,.3,1);
  --t-slow: 540ms cubic-bezier(.2,.7,.3,1);

  /* ── elevation ── soft, never harsh ── */
  --shadow-sm:  0 1px 2px rgba(28,23,20,0.04);
  --shadow:     0 8px 24px -10px rgba(28,23,20,0.10), 0 2px 6px -2px rgba(28,23,20,0.05);
  --shadow-lg:  0 24px 60px -20px rgba(28,23,20,0.18), 0 6px 14px -6px rgba(28,23,20,0.08);

  /* ── modular scale 1.333 from 16px ── */
  --fs-xs:    0.75rem;     /* 12.0  — micro labels, captions */
  --fs-sm:    0.8125rem;   /* 13.0  — utility nav, fine print */
  --fs-base:  1rem;        /* 16.0  — body */
  --fs-md:    1.125rem;    /* 18.0  — lede paragraph */
  --fs-lg:    1.333rem;    /* 21.3  — large body / pull quote */
  --fs-xl:    1.777rem;    /* 28.4  — h3, panel titles */
  --fs-2xl:   2.369rem;    /* 37.9  — h2 */
  --fs-3xl:   3.157rem;    /* 50.5  — page H1 */
  --fs-4xl:   4.209rem;    /* 67.4  — desktop hero baseline */
  --fs-5xl:   5.61rem;     /* 89.7  — clamp max for hero on very wide */

  /* ── font stacks ── */
  --font-display: 'Lusitana', 'Iowan Old Style', Georgia, serif;
  --font-body:    'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-mono:    ui-monospace, "SF Mono", Menlo, monospace;

  /* -- spacing scale -- 4px base (2026-09-04, design-system-consolidation S2) -- */
  --sp-1: 4px;
  --sp-2: 8px;
  --sp-3: 12px;
  --sp-4: 16px;
  --sp-5: 24px;
  --sp-6: 32px;
  --sp-7: 48px;
  --sp-8: 64px;

  /* -- breakpoints -- DOCUMENTATION tokens. A media query cannot read a custom
     property, so the three canonical widths are written literally in the @media
     rules and recorded here; website\tools\css-lint.py fails if a new width appears. -- */
  --bp-sm: 600px;
  --bp-md: 880px;
  --bp-lg: 1080px;

  /* -- layers -- named stacking tiers; never a bare z-index -- */
  --z-base: 0;
  --z-raised: 10;
  --z-header: 100;
  --z-overlay: 200;
  --z-modal: 900;

  color-scheme: light;
}

* { box-sizing: border-box; margin: 0; padding: 0; }
html { -webkit-text-size-adjust: 100%; }
body {
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-body);
  font-size: var(--fs-base);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-feature-settings: 'ss01' on, 'cv11' on, 'kern' on;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
main { flex: 1; }
img, svg { display: block; max-width: 100%; }
button { font: inherit; cursor: pointer; background: none; border: 0; color: inherit; }
input, select, textarea { font: inherit; color: inherit; }
a { color: inherit; text-decoration: none; }
a:hover { color: var(--ink-muted); }
::selection { background: var(--ink); color: var(--bg); }

/* ── headings: Lusitana editorial serif ── */
h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: 400;
  line-height: 1.08;
  letter-spacing: -0.015em;
  color: var(--ink);
}
h1 {
  font-size: clamp(2.5rem, 5.6vw, var(--fs-3xl));
  letter-spacing: -0.02em;
  font-weight: 400;
}
h2 {
  font-size: clamp(1.777rem, 3.6vw, var(--fs-2xl));
  letter-spacing: -0.018em;
  font-weight: 400;
}
h3 {
  font-size: var(--fs-xl);
  letter-spacing: -0.012em;
  font-weight: 400;
}
h4 {
  font-size: var(--fs-lg);
  font-weight: 700;
  letter-spacing: -0.008em;
}
em, i, .italic {
  font-style: italic;
}

p  { font-size: var(--fs-base); }
.lede {
  font-family: var(--font-body);
  font-size: var(--fs-md);
  line-height: 1.55;
  color: var(--ink-muted);
  max-width: 38em;
  font-weight: 400;
}
.muted { color: var(--ink-muted); }
.soft  { color: var(--ink-soft); }
.tabular { font-variant-numeric: tabular-nums; }

/* eyebrow — the small uppercase label above hero / section heads */
.eyebrow {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-soft);
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
}
.eyebrow::before {
  content: '';
  display: inline-block;
  width: 1.5rem;
  height: 1px;
  background: currentColor;
  opacity: 0.6;
}

.container     { max-width: var(--container); margin: 0 auto; padding-left: var(--gutter); padding-right: var(--gutter); }
.section       { padding: clamp(4rem, 9vw, 8rem) 0; }
.section-tight { padding: clamp(2.5rem, 5.5vw, 4rem) 0; }
.section-head  { display: grid; gap: 0.65rem; margin-bottom: clamp(2rem, 4vw, 3rem); max-width: 36em; }
.section-head .eyebrow { color: var(--accent); }
.section-head h2 { max-width: 18ch; text-wrap: balance; }
.section-head p  { color: var(--ink-muted); max-width: 38em; }
.divider { border: 0; border-top: 1px solid var(--line); margin: 0; }

/* ── story panel — full-bleed editorial moment ── */
.story {
  position: relative;
  margin: clamp(3rem, 6vw, 5rem) 0;
  border-radius: var(--r-xl);
  overflow: hidden;
  background:
    radial-gradient(120% 100% at 70% 30%, #EDE3CB 0%, #DACBA9 60%, #C5B48E 100%);
  min-height: clamp(22rem, 42vw, 34rem);
  display: grid;
  align-items: end;
  padding: clamp(1.75rem, 4vw, 3.5rem);
  isolation: isolate;
}
.story::before {
  content: '';
  position: absolute; inset: 0;
  background-image: radial-gradient(rgba(28,23,20,0.05) 1px, transparent 1px);
  background-size: 4px 4px;
  mix-blend-mode: multiply;
  opacity: 0.6;
  z-index: -1;
}
.story::after {
  content: '';
  position: absolute; left: 0; right: 0; bottom: 0;
  height: 60%;
  background: linear-gradient(180deg, transparent, rgba(28,23,20,0.18));
  z-index: -1;
}
/* photo variant — overrides the gradient, dims for text legibility */
.story--photo {
  background-size: cover;
  background-position: center;
}
.story--photo::before {
  background-image: linear-gradient(95deg, rgba(28,23,20,0.55) 0%, rgba(28,23,20,0.35) 45%, rgba(28,23,20,0.10) 80%);
  mix-blend-mode: normal;
  opacity: 1;
}
.story--photo .story__title,
.story--photo .story__sub { color: #FFFFFF; }
.story--photo .btn-ghost {
  border-color: #FFFFFF;
  color: #FFFFFF;
}
.story--photo .btn-ghost:hover { background: #FFFFFF; color: var(--ink); }

.story__copy {
  max-width: 28rem;
  color: var(--ink);
}
.story__title {
  font-family: var(--font-display);
  font-size: clamp(2rem, 4.4vw, 3.4rem);
  font-weight: 400;
  line-height: 1.04;
  letter-spacing: -0.02em;
  text-wrap: balance;
}
.story__sub {
  margin-top: 1rem;
  font-size: var(--fs-md);
  color: var(--ink);
  max-width: 32ch;
  line-height: 1.5;
}
.story__cta { margin-top: 1.5rem; }
.wordmark {
  display: inline-flex;
  align-items: center;
  color: var(--ink);
}
.wordmark img {
  height: 26.4px;             /* Dave 2026-08-10: +10% (was 24px; 2026-07-07 +20% from 20px) */
  width: auto;
  display: block;
}
.site-footer .wordmark img { height: 19px; }

@media (max-width: 880px) {
  .wordmark img { height: 26.4px; } /* Dave 2026-08-10: +10%, matches header bump */
}

/* ─── popover motion (shared: sign-in, account menu, cart) ─── */
@keyframes popover-in {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ─── segmented toggle (sign-in popover: Sign in / Create account) ─── */
.auth-toggle {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 0.2rem;
  margin-bottom: 1rem;
}
.auth-toggle button {
  padding: 0.45rem 0.75rem;
  border-radius: 999px;
  font-size: var(--fs-sm);
  text-align: center;
  color: var(--ink);
}
.auth-toggle button[aria-pressed="true"] {
  background: var(--ink);
  color: var(--bg);
}

/* ─── sign-in popover (Dave 2026-08-31) ─────────────────────────────────────
   Replaces the retired sign-in PAGE. It is position:fixed and PLACED FROM THE
   CLICK POINT by initSigninPop() in app.js, which writes left/top inline — so
   this rule must never set them itself. The box is the one the cart and account
   popovers already use (--surface on --line, --r-lg, --shadow-lg, popover-in)
   and the contents are styleguide components only: .auth-toggle, .field,
   .field-label, .input, .btn .btn-primary .btn-block. No new tokens, no one-off
   colours.

   The mock-SSO popover's rules stood here until 2026-08-31. Its markup was
   deleted on 2026-08-17 and the CSS had been dead ever since; it is DELETED
   rather than renamed, so the canonical no-mock-auth assertion keeps meaning
   exactly what it says. */
.signin-pop {
  position: fixed;
  left: 0;
  top: 0;
  width: min(340px, calc(100vw - 1.5rem));
  max-height: calc(100vh - 2rem);
  overflow-y: auto;
  background: var(--surface);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg);
  padding: 1rem 1.1rem 1.1rem;
  z-index: 120;                      /* over the cart popover (90) and the shelf */
  display: none;
  animation: popover-in 180ms ease-out;
}
.signin-pop[data-open="true"] { display: block; }
.signin-pop[hidden] { display: none; }
.signin-pop__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  margin-bottom: 0.85rem;
}
.signin-pop__head strong {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
}
.signin-pop__close {
  font-size: 1.25rem;
  line-height: 1;
  padding: 0.15rem 0.45rem;
  border-radius: 999px;
  color: var(--ink-muted);
}
.signin-pop__close:hover { background: var(--hover); color: var(--ink); }
.signin-pop .field { margin-bottom: 0.85rem; }

/* `.field` (display:block) and `.signin-pop__who` (display:flex) OUT-SPECIFY the
   [hidden] attribute, so a hidden row still rendered - step 2 showed the address
   twice, as the "who" line AND as the email field that line replaces, which made
   the popover look like a different box (Dave 2026-09-01). Same class of bug as
   `.nav-shelf__row[hidden]` further down. Specificity (0,2,0) beats `.field`; no
   !important needed. */
.signin-pop [hidden] { display: none; }
.signin-pop__row { display: grid; grid-template-columns: 1fr 1fr; gap: 0.6rem; }
.signin-pop__check {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: -0.25rem 0 0.9rem;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
}
.signin-pop__check input { accent-color: var(--ink); }
.signin-pop .btn-block { width: 100%; }
.signin-pop__link {
  display: block;
  width: 100%;
  margin-top: 0.7rem;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  text-align: center;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.signin-pop__link:hover { color: var(--ink); }
.signin-pop__fine {
  margin: 0 0 0.85rem;
  font-size: 0.7rem;
  line-height: 1.4;
  color: var(--ink-muted);
}
.signin-pop__form[hidden] { display: none; }
.signin-pop__msg {
  margin: 0 0 0.85rem;
  padding: 0.55rem 0.7rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--hover);
  font-size: var(--fs-xs);
  line-height: 1.4;
}
.signin-pop__msg[data-tone="bad"] {
  border-color: var(--crit);
  background: transparent;
  color: var(--crit);
}
.signin-pop__msg[hidden] { display: none; }
/* Provider buttons (Sign in with Google / Apple / Facebook / Microsoft). A
   button exists ONLY when that provider's credentials are configured, so this
   never styles a dead control. Brand marks keep their own colours (each
   provider's brand guidelines require it); the button chrome is ours. */
.signin-pop__providers { display: grid; gap: 0.5rem; }
.signin-pop__provider {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
  padding: 0.7rem 0.9rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--surface);
  color: var(--ink);
  font-size: var(--fs-sm);
  text-decoration: none;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.signin-pop__provider:hover { border-color: var(--ink); background: var(--hover); }
.signin-pop__provider:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.signin-pop__provider svg { flex: none; width: 16px; height: 16px; }
.signin-pop__or {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0.9rem 0 0.85rem;
  color: var(--ink-soft);
  font-size: var(--fs-xs);
}
.signin-pop__or::before, .signin-pop__or::after { content: ''; flex: 1; height: 1px; background: var(--line); }

/* The email captured in step 1, shown back on step 2 with a way to change it. */
/* The one link to the other door. Replaces the segmented selector: a sentence, not
   a control that claims state. Existing tokens only. */
.signin-pop__alt {
  margin-top: 0.7rem;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  text-align: center;
}
.signin-pop__alt .signin-pop__link {
  display: inline;
  width: auto;
  margin: 0;
  font-size: inherit;
}

/* Trade opt-in fields — indented under their checkbox so they read as belonging to
   it, not as two more fields everyone has to consider. Existing tokens only. */
.signin-pop__trade {
  margin: 0.15rem 0 0.85rem;
  padding-left: 0.85rem;
  border-left: 2px solid var(--line);
}
.signin-pop__trade .signin-pop__fine { margin-top: -0.35rem; }

.signin-pop__who {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.5rem;
  margin: -0.15rem 0 0.9rem;
  padding-bottom: 0.6rem;
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-sm);
}
.signin-pop__who > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.signin-pop__who .signin-pop__link { flex: none; width: auto; margin: 0; }

@media (max-width: 480px) {
  .signin-pop { width: calc(100vw - 1.5rem); padding: 0.9rem 1rem 1rem; }
  .signin-pop__row { grid-template-columns: 1fr; }
}

/* ─── footer ─── */
.site-footer {
  background: var(--bg);
  border-top: 1px solid var(--line);
  padding: 4rem 0 2rem;
  font-size: var(--fs-sm);
}
.site-footer__inner {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 3rem;
  margin-bottom: 2.5rem;
  align-items: center;
}
.site-footer__newsletter {
  max-width: 360px;
  width: 100%;
  display: grid;
  gap: 0.5rem;
}
.site-footer__newsletter form {
  display: flex;
  gap: 0.5rem;
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 0.4rem;
  background: var(--surface);
}
.site-footer__newsletter input {
  flex: 1;
  border: 0;
  outline: none;
  background: transparent;
  padding: 0.4rem 0.75rem;
  font-size: var(--fs-sm);
}
.site-footer__newsletter button {
  padding: 0.4rem 1rem;
  border-radius: 999px;
  background: var(--ink);
  color: var(--bg);
  font-size: var(--fs-sm);
  transition: background var(--t-fast), transform var(--t-fast);
}
.site-footer__newsletter button:hover { background: var(--ink-muted); transform: translateY(-1px); }
.site-footer__newsletter button:active { transform: translateY(1px); }
.site-footer__newsletter label {
  font-family: var(--font-display);
  font-weight: 400;
  font-style: italic;
  font-size: var(--fs-md);
  color: var(--ink);
  letter-spacing: -0.005em;
  line-height: 1.4;
  margin-bottom: 0.4rem;
}
.site-footer__links {
  list-style: none;
  display: flex;
  gap: 1.75rem;
  align-items: center;
  padding-top: 1.5rem;
  border-top: 1px solid var(--line);
  flex-wrap: wrap;
}
.site-footer .colophon {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 1rem;
  padding-top: 1rem;
  color: var(--ink-muted);
  font-size: var(--fs-xs);
}
@media (max-width: 720px) {
  .site-footer__inner { grid-template-columns: 1fr; gap: 2rem; }
}

/* ─── buttons ─── refined hierarchy, slower transitions ─── */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.76rem 1.32rem;     /* -20% offset all round. Dave 2026-06-25 */
  border-radius: 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 500;
  letter-spacing: 0.01em;
  border: 2px solid transparent;
  cursor: pointer;
  transition: background var(--t-base), color var(--t-base), border-color var(--t-base), transform var(--t-fast), box-shadow var(--t-base);
  white-space: nowrap;
}
.btn:active { transform: translateY(1px); }
.btn-primary {
  background: var(--ink);
  color: var(--bg);
  border-color: var(--ink);
  box-shadow: var(--shadow-sm);
}
.btn-primary:hover {
  background: var(--bg);
  color: var(--ink);
  border-color: var(--ink);
  box-shadow: var(--shadow);
  transform: translateY(-1px);
}
/* accent — the INVERSE of primary: light fill + ink label, for dark / photo surfaces. Dave 2026-06-25 */
.btn-inverse, .btn-accent {
  background: var(--surface);
  color: var(--ink);
  border-color: var(--ink);
  box-shadow: var(--shadow-sm);
}
.btn-inverse:hover, .btn-accent:hover {
  background: var(--ink);
  color: var(--bg);
  border-color: var(--ink);
  box-shadow: var(--shadow);
  transform: translateY(-1px);
}
.btn-attention {
  background: var(--neon-soft);
  color: var(--neon-deep);
  border-color: var(--neon-deep);
  box-shadow: var(--shadow-sm);
}
.btn-attention:hover {
  background: var(--neon-deep);
  color: var(--neon-soft);
  border-color: var(--neon-deep);
  box-shadow: var(--shadow);
  transform: translateY(-1px);
}
.btn-neon {
  background: var(--neon);
  color: var(--neon-deep);
  border-color: var(--neon-deep);
  box-shadow: var(--shadow-sm);
}
.btn-neon:hover {
  background: var(--neon-deep);
  color: var(--neon);
  border-color: var(--neon-deep);
  box-shadow: var(--shadow);
  transform: translateY(-1px);
}
.btn-ghost {
  background: transparent;
  color: var(--ink);
  border-color: var(--ink);
}
.btn-ghost:hover { background: var(--ink); color: var(--bg); }
.btn-line {
  background: transparent;
  color: var(--ink);
  border: 0;
  padding: 0.4rem 0;
  position: relative;
  border-radius: 0;
}
.btn-line::after {
  content: '';
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 1px;
  background: var(--ink);
  transform-origin: left;
  transition: transform var(--t-base);
}
.btn-line:hover { color: var(--ink); }
.btn-line:hover::after { transform: scaleX(0.6); }
.btn-block { width: 100%; }
.btn-lg { padding: 0.88rem 1.48rem; font-size: var(--fs-base); }

/* ─── inputs ─── */
.field { display: block; margin-bottom: 1.25rem; }
.field-label {
  display: block;
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  color: var(--ink-muted);
  margin-bottom: 0.5rem;
  font-weight: 500;
}
.input, .select, .textarea {
  display: block;
  width: 100%;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: 0.75rem 1rem;
  font-size: var(--fs-base);
  color: var(--ink);
  transition: border-color var(--t-fast);
}
.input:focus, .select:focus, .textarea:focus { outline: none; border-color: var(--ink); }
.textarea { resize: vertical; min-height: 8rem; }
.row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
@media (max-width: 600px) { .row-2 { grid-template-columns: 1fr; } }

/* ─── tile (compact card, used in featured + clearance + search + related) ─── */
.tile {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
  transition: border-color var(--t-base), transform var(--t-base), box-shadow var(--t-base);
  position: relative;
}
.tile:hover {
  border-color: var(--ink);
  transform: translateY(-3px);
  box-shadow: var(--shadow);
}
.tile a { display: block; color: inherit; }
.tile__media {
  position: relative;
  aspect-ratio: 4 / 3;
  background: var(--line-soft);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.tile__media::after {
  content: '';
  position: absolute; inset: 0;
  background-image:
    radial-gradient(rgba(28,23,20,0.05) 1px, transparent 1px);
  background-size: 4px 4px;
  mix-blend-mode: multiply;
  opacity: 0.55;
  pointer-events: none;
}
.tile__media svg { width: 56%; height: 56%; opacity: 0.42; transition: transform var(--t-slow); }
.tile:hover .tile__media svg { transform: scale(1.04); }
.tile__media.has-photo { background: var(--line-soft); }
.tile__media.has-photo::after { display: none; }
.tile__media.has-photo img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--t-slow);
}
.tile:hover .tile__media.has-photo img { transform: scale(1.04); }
.tile__body {
  padding: 1.1rem 1.25rem 1.35rem;
  display: grid;
  gap: 0.15rem;
}
.tile__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-md);
  letter-spacing: -0.012em;
  color: var(--ink);
}
.tile__meta  { font-size: var(--fs-sm); color: var(--ink-muted); }
.tile__price { font-size: var(--fs-base); margin-top: 0.6rem; font-variant-numeric: tabular-nums; font-weight: 500; }

.ph-sofa     { background: linear-gradient(180deg, #F0EAD8 0%, #E8E2D7 100%); }
.ph-chaise   { background: linear-gradient(180deg, #ECE6D4 0%, #DED5C0 100%); }
.ph-modular  { background: linear-gradient(180deg, #ECE5D2 0%, #DFD7C5 100%); }
.ph-chair    { background: linear-gradient(180deg, #F4EFE5 0%, #ECE5D2 100%); }
.ph-recliner { background: linear-gradient(180deg, #EDE6D5 0%, #E0D9C7 100%); }
.ph-cushion  { background: linear-gradient(180deg, #F2EDDF 0%, #E0D6C0 100%); }
.ph-fabric   { background: repeating-linear-gradient(45deg, #E8E2D7 0 6px, #DCD4C2 6px 12px); }
.ph-leather  { background: radial-gradient(circle at 30% 30%, #C9B79A 0%, #8C7A60 100%); }

.grid-products {
  display: grid;
  gap: 1.25rem;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
}

/* ─── full-width category list — single column, photo dominates, no chrome ─── */
.list-products {
  display: grid;
  gap: 0;                             /* edge-to-edge, no vertical gap */
}
.product-block {
  display: block;
  border-radius: 0;                    /* no rounded chrome — pure photo */
  overflow: hidden;
  position: relative;
  isolation: isolate;
  transition: transform var(--t-base);
}
.product-block:hover { transform: none; }
.product-block__media {
  position: relative;
  aspect-ratio: 20 / 9;             /* shorter — ~20% less height than 16/9 */
  max-height: calc(100svh - 270px); /* first tile clears the fold; caps all tiles equally. Dave 2026-06-25 */
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--line-soft);
  overflow: hidden;
}
.product-block__media::after {
  /* dark gradient at the bottom-left so the overlay text reads */
  content: '';
  position: absolute; inset: 0;
  background: linear-gradient(105deg, rgba(28,23,20,0.42) 0%, rgba(28,23,20,0.18) 45%, rgba(28,23,20,0) 75%);
  pointer-events: none;
  z-index: 1;
}
.product-block__media > svg {
  width: 30%; height: 60%;
  opacity: 0.5;
  position: relative;
  z-index: 0;
}
.product-block__media.has-photo > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
  transition: transform var(--t-slow);
}
.product-block:hover .product-block__media.has-photo > img { transform: scale(1.03); }
.product-block__media.has-photo::after {
  /* stronger gradient when there's a real photo behind it — text needs to read */
  background: linear-gradient(105deg, rgba(28,23,20,0.55) 0%, rgba(28,23,20,0.28) 45%, rgba(28,23,20,0.05) 78%);
}
.product-block__overlay {
  position: absolute;
  inset: 0;
  z-index: 2;
  padding: clamp(1.25rem, 3vw, 2.25rem);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: flex-start;
  gap: 0.85rem;
  pointer-events: none;
}
.product-block__copy { color: #FFFFFF; max-width: 26rem; }
.product-block__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.6rem, 3.2vw, 2.55rem);
  letter-spacing: -0.02em;
  line-height: 1.04;
  color: #FFFFFF;
}
.product-block__title em { font-style: italic; }
.product-block__meta {
  color: rgba(255,255,255,0.82);
  font-size: var(--fs-sm);
  margin-top: 0.35rem;
}
.product-block__cta {
  pointer-events: auto;   /* CTA is now .btn .btn-accent; only placement remains here */
  align-self: flex-start;
}
/* whole-tile hover = subtle cue only (image already zooms) */
.product-block:hover .product-block__cta { box-shadow: 0 6px 18px -8px rgba(28,23,20,0.55); }
@media (max-width: 720px) {
  .product-block__media { aspect-ratio: 4 / 3; }
}

/* full-bleed wrapper — escapes .container so photos run edge-to-edge */
.full-bleed {
  width: 100vw;
  position: relative;
  left: 50%;
  right: 50%;
  margin-left: -50vw;
  margin-right: -50vw;
  max-width: 100vw;
}

/* ─── hero ─── editorial-register, type-led ─── */
.hero {
  padding: clamp(3.5rem, 7vw, 6.5rem) 0 clamp(3rem, 6vw, 5rem);
}
.hero__row {
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: clamp(2.5rem, 5vw, 5rem);
  align-items: center;     /* visually balanced — type centred against image */
}
.hero__copy { max-width: none; }
.hero__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 1.6rem;
}
.hero__eyebrow::before {
  content: '';
  display: inline-block;
  width: 1.6rem; height: 1px;
  background: currentColor;
  opacity: 0.65;
}
.hero__title {
  font-family: var(--font-display);
  font-weight: 400;
  /* tame the upper bound so the title doesn't blow past the column on big screens */
  font-size: clamp(2.5rem, 5.4vw, 4.25rem);
  line-height: 1.05;
  letter-spacing: -0.018em;
  color: var(--ink);
  max-width: 18ch;
}
.hero__title em {
  font-style: italic;
  color: var(--ink);
}
.hero__sub {
  margin-top: clamp(1.25rem, 2.5vw, 1.75rem);
  max-width: 32ch;
  color: var(--ink-muted);
  font-family: var(--font-body);
  font-size: clamp(1.0625rem, 1.35vw, 1.25rem);
  font-weight: 400;
  line-height: 1.5;
  letter-spacing: -0.005em;
}
.hero__cta-row {
  display: flex;
  gap: 0.75rem;
  margin-top: clamp(2rem, 3.5vw, 2.75rem);
  flex-wrap: wrap;
  align-items: center;
}
.hero__caption {
  margin-top: 2.25rem;
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  color: var(--ink-soft);
  text-transform: uppercase;
}

.hero__media {
  position: relative;
  aspect-ratio: 5 / 6;
  border-radius: var(--r-xl);
  overflow: hidden;
  background:
    radial-gradient(120% 100% at 30% 25%, #F2EAD3 0%, #E8DDC1 45%, #D9CDB1 100%);
  box-shadow: var(--shadow);
}
.hero__media::after {
  /* subtle film-grain — only shows when there's no photo behind it */
  content: '';
  position: absolute; inset: 0;
  background-image:
    radial-gradient(rgba(28,23,20,0.06) 1px, transparent 1px),
    radial-gradient(rgba(255,255,255,0.04) 1px, transparent 1px);
  background-size: 3px 3px, 4px 4px;
  background-position: 0 0, 1px 2px;
  mix-blend-mode: multiply;
  opacity: 0.7;
  pointer-events: none;
}
.hero__media.has-photo::after { display: none; }
.hero__media svg {
  position: absolute;
  inset: 0;
  margin: auto;
  width: 60%; height: 60%;
  opacity: 0.42;
  color: var(--ink);
}
.hero__media.has-photo img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

@media (max-width: 880px) {
  .hero__row { grid-template-columns: 1fr; gap: 2rem; }
  .hero__media { aspect-ratio: 4 / 3; }
}

/* ─── home category strip ─── */
.category-strip {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 1.25rem;
  margin-top: 2.5rem;
}
.category-strip a {
  display: flex;
  flex-direction: column;
  gap: 0.85rem;
  padding: 1rem 1rem 1.4rem;
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--surface);
  transition: border-color var(--t-base), transform var(--t-base), box-shadow var(--t-base);
}
.category-strip a:hover {
  border-color: var(--ink);
  transform: translateY(-3px);
  box-shadow: var(--shadow);
}
.category-strip__media {
  position: relative;
  aspect-ratio: 1;
  border-radius: var(--r);
  display: flex; align-items: center; justify-content: center;
  overflow: hidden;
}
.category-strip__media::after {
  content: '';
  position: absolute; inset: 0;
  background-image: radial-gradient(rgba(28,23,20,0.05) 1px, transparent 1px);
  background-size: 4px 4px;
  mix-blend-mode: multiply;
  opacity: 0.55;
}
.category-strip__media svg {
  position: relative;
  width: 64%; height: 64%;
  opacity: 0.5;
  transition: transform var(--t-slow);
}
.category-strip a:hover .category-strip__media svg { transform: scale(1.05); }
.category-strip__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-md);
  letter-spacing: -0.012em;
  color: var(--ink);
}
@media (max-width: 980px) { .category-strip { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 600px) { .category-strip { grid-template-columns: 1fr 1fr; } }

/* ─── PDP ─── */
.pdp {
  display: grid;
  grid-template-columns: minmax(0, 1fr) clamp(320px, 36%, 380px);   /* photo | selection -- selection widened 2026-09-30 so range-list names fit on one line */
  gap: clamp(1.5rem, 3.5vw, 3rem);
  align-items: start;
}
.pdp__gallery {
  position: sticky;
  top: 100px;
  display: grid;
  gap: 0.75rem;
}
.pdp__main-img {
  aspect-ratio: 16 / 9; /* 2026-09-24 Dave: match the 16:9 lifestyle route output - never crop the photo */
  border-radius: var(--r-lg);
  display: flex; align-items: center; justify-content: center;
  overflow: hidden;
  position: relative;
}
.pdp__main-img.has-photo { background: var(--line-soft); }
.pdp__main-img.has-photo img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--t-base);
}
/* PDP main image — cursor only changes after a first click (per Dave 2026-05-10) */
.pdp__main-img.has-photo { cursor: default; }
.pdp__main-img.has-photo:hover img { transform: none; }

/* idle: regular cursor (above). Armed: magnifying-glass-plus appears. */
.pdp__main-img[data-zoom-state="armed"] {
  cursor: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32' fill='none'><circle cx='13' cy='13' r='9' fill='white' stroke='%231C1714' stroke-width='2'/><path d='M20 20l8 8' stroke='%231C1714' stroke-width='3' stroke-linecap='round'/><path d='M9 13h8M13 9v8' stroke='%231C1714' stroke-width='2' stroke-linecap='round'/></svg>") 13 13, zoom-in;
}

/* zoomed: magnifying-glass-minus (click again exits). Pan with grabbing during drag. */
.pdp__main-img[data-zoom-state="zoomed"] {
  cursor: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32' fill='none'><circle cx='13' cy='13' r='9' fill='white' stroke='%231C1714' stroke-width='2'/><path d='M20 20l8 8' stroke='%231C1714' stroke-width='3' stroke-linecap='round'/><path d='M9 13h8' stroke='%231C1714' stroke-width='2' stroke-linecap='round'/></svg>") 13 13, zoom-out;
}
.pdp__main-img[data-zoom-state="zoomed"].is-dragging { cursor: grabbing; }
.pdp__main-img[data-zoom-state="zoomed"] img {
  transition: none;
  user-select: none;
  -webkit-user-drag: none;
}

/* swatch-cell — once selected (aria-pressed=true), hover cursor becomes zoom (second click → loupe) */
.swatch-cell[aria-pressed="true"] {
  cursor: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32' fill='none'><circle cx='13' cy='13' r='9' fill='white' stroke='%231C1714' stroke-width='2'/><path d='M20 20l8 8' stroke='%231C1714' stroke-width='3' stroke-linecap='round'/><path d='M9 13h8M13 9v8' stroke='%231C1714' stroke-width='2' stroke-linecap='round'/></svg>") 13 13, zoom-in;
}

/* circular fabric loupe — small popover, NOT a full window */
.swatch-loupe {
  position: fixed;
  z-index: 200;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.55rem;
  animation: loupe-in 200ms cubic-bezier(.2,.7,.3,1);
  transform-origin: center bottom;
  pointer-events: auto;
}
.swatch-loupe__circle {
  width: 240px;
  height: 240px;
  border-radius: 50%;
  background-color: var(--line-soft);
  background-size: 130%;
  background-position: center;
  border: 6px solid #FFFFFF;
  box-shadow:
    0 22px 40px rgba(0,0,0,0.22),
    0 6px 14px rgba(0,0,0,0.10),
    inset 0 0 0 1px rgba(28,23,20,0.08);
}
.swatch-loupe__caption {
  font-family: var(--font-display);
  font-size: var(--fs-md);
  color: var(--ink);
  background: rgba(255,255,255,0.96);
  padding: 0.4rem 0.95rem;
  border-radius: 999px;
  border: 1px solid var(--line);
  letter-spacing: -0.01em;
  white-space: nowrap;
  box-shadow: 0 4px 10px rgba(0,0,0,0.06);
}
@keyframes loupe-in {
  from { opacity: 0; transform: scale(0.78); }
  to   { opacity: 1; transform: scale(1); }
}
.swatch-loupe.is-closing { animation: loupe-out 160ms ease forwards; }
@keyframes loupe-out {
  to { opacity: 0; transform: scale(0.9); }
}
@media (max-width: 480px) {
  .swatch-loupe__circle { width: 200px; height: 200px; }
}

/* ── zoom popup ── popup-style window, not a full takeover ── */
.zoom {
  position: fixed;
  inset: 0;
  background: rgba(28, 23, 20, 0.45);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  z-index: 200;
  display: none;
  align-items: center;
  justify-content: center;
  padding: clamp(1rem, 3vw, 2rem);
  animation: zoom-fade 180ms ease-out;
}
.zoom[data-open="true"] { display: flex; }
.zoom__panel {
  position: relative;
  display: flex;
  flex-direction: column;
  width: min(820px, 94vw);
  height: min(640px, 84vh);     /* explicit height — flex:1 child needs it to claim space */
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: 0 40px 80px -20px rgba(0,0,0,0.40), 0 12px 24px -8px rgba(0,0,0,0.20);
  overflow: hidden;
  animation: zoom-pop 200ms cubic-bezier(.2,.7,.3,1.05);
}
.zoom__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 0.75rem;
  padding: 0.85rem 1rem 0.75rem 1.25rem;
  border-bottom: 1px solid var(--line);
  flex: none;
}
.zoom__caption {
  font-family: var(--font-display);
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
  color: var(--ink);
  line-height: 1.2;
}
.zoom__close {
  width: 32px;
  height: 32px;
  border-radius: 999px;
  background: transparent;
  color: var(--ink-muted);
  font-size: 1.4rem;
  line-height: 1;
  display: grid;
  place-items: center;
  transition: background var(--t-fast), color var(--t-fast);
  cursor: pointer;
  flex: none;
}
.zoom__close:hover { background: var(--hover); color: var(--ink); }

.zoom__viewport {
  position: relative;
  flex: 1;
  overflow: hidden;
  background:
    repeating-conic-gradient(#F0EAD8 0% 25%, #F4EFE5 0% 50%) 50% / 24px 24px;
  cursor: grab;
  user-select: none;
}
.zoom__viewport[data-zoomed="true"] { cursor: grab; }
.zoom__viewport[data-zoomed="false"] { cursor: zoom-in; }
.zoom__viewport.is-dragging { cursor: grabbing; }
.zoom__img {
  position: absolute;
  top: 50%;
  left: 50%;
  max-width: 100%;
  max-height: 100%;
  transform-origin: center center;
  transform: translate(-50%, -50%) scale(1);
  transition: transform 80ms ease-out;
  -webkit-user-drag: none;
  pointer-events: none;
  /* The translate(-50%,-50%) baseline is replaced by the JS transform on first paint. */
}
.zoom__viewport.is-dragging .zoom__img { transition: none; }

.zoom__tools {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.65rem 1rem;
  border-top: 1px solid var(--line);
  flex: none;
  background: var(--bg);
}
.zoom__btn {
  width: 32px;
  height: 32px;
  border: 1px solid var(--line);
  background: var(--surface);
  border-radius: 999px;
  color: var(--ink);
  font-size: 1rem;
  line-height: 1;
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.zoom__btn:hover { border-color: var(--ink); background: var(--hover); }
.zoom__btn--text {
  width: auto;
  padding: 0 0.85rem;
  font-size: var(--fs-sm);
  font-weight: 500;
  margin-left: 0.5rem;
}
.zoom__level {
  font-size: var(--fs-sm);
  font-variant-numeric: tabular-nums;
  color: var(--ink-muted);
  min-width: 3.5rem;
  text-align: center;
}
@keyframes zoom-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes zoom-pop {
  from { opacity: 0; transform: scale(0.96) translateY(8px); }
  to   { opacity: 1; transform: scale(1) translateY(0); }
}
.pdp__thumbs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.5rem; }
.pdp__thumb {
  aspect-ratio: 1;
  border-radius: var(--r);
  border: 1px solid var(--line);
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: border-color var(--t-fast);
}
.pdp__thumb:hover, .pdp__thumb[aria-selected="true"] { border-color: var(--ink); }
.pdp__title {
  font-family: var(--font-display);
  font-size: clamp(1.75rem, 3vw, 2.4rem);   /* compact for 1/3 column */
  margin-bottom: 0.25rem;
  letter-spacing: -0.018em;
  line-height: 1.05;
  font-weight: 400;
}
.pdp__sub  {
  color: var(--ink-muted);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  margin-bottom: 1rem;
  max-width: 28em;
  line-height: 1.45;
}
.pdp__price {
  font-size: var(--fs-lg);
  margin-bottom: 0.15rem;
  font-variant-numeric: tabular-nums;
  font-weight: 500;
  letter-spacing: -0.01em;
}
.pdp__price .price-from,
.pdp__price .price-in {
  font-size: 0.6em;
  font-weight: 500;
  color: var(--ink-muted);
  letter-spacing: 0.01em;
  margin-right: 0.35em;
  vertical-align: 0.14em;
}
/* cover line named after the price -- "in Premium leather" (Dave 2026-08-21) */
.pdp__price .price-in { margin-right: 0; margin-left: 0.45em; }
.pdp__price-note { font-size: 0.7rem; color: var(--ink-muted); margin-bottom: 1rem; }
.pdp__group { margin: 1.1rem 0; }
.pdp__group-head { margin-bottom: 0.5rem; }
.pdp__group-label { font-size: 0.7rem; }
.segmented { gap: 0.35rem; }
.segmented button { padding: 0.55rem 0.4rem; font-size: var(--fs-xs); }
/* tighter cover-line spacing in the narrower rail */
.pdp .cover-line { margin-bottom: 1rem; }
.pdp .cover-line__head { margin-bottom: 0.4rem; }
.pdp .cover-line__name { font-size: var(--fs-sm); }
.pdp .cover-line__blurb { font-size: var(--fs-xs); }
.pdp .swatch-row { gap: 0.4rem 0.5rem; }
.pdp .swatch-cell { width: 28px; }
.pdp .swatch-cell .swatch { width: 24px; height: 24px; }
.pdp .swatch-cell__name { font-size: 0.625rem; }
.pdp .avail { padding: 0.7rem 0.85rem; margin: 1rem 0 0.6rem; gap: 0.25rem; }
.pdp .avail__head { font-size: var(--fs-xs); }
.pdp .avail__line { font-size: var(--fs-xs); }
.pdp .avail__alt  { font-size: var(--fs-xs); }
.pdp .avail-legend { font-size: 0.65rem; margin-bottom: 0.85rem; gap: 0.6rem; }
.pdp .studio-note { font-size: var(--fs-xs); margin: 0.4rem 0 0.85rem; padding-left: 0; border-left: none; }
.pdp__panel .btn-lg { padding: 0.85rem 1.2rem; font-size: var(--fs-sm); }
.pdp__panel .row { gap: 0.5rem !important; }
.pdp__group-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 0.75rem;
}
.pdp__group-label { font-size: var(--fs-xs); color: var(--ink-muted); font-weight: 500; text-transform: none; letter-spacing: 0; }
.pdp__group-value { font-size: var(--fs-sm); font-weight: 500; }

.pdp-piece {
  display: grid;
  justify-items: center;
  gap: 0.65rem;
  margin: clamp(1.25rem, 3vw, 2rem) 0;
}
.pdp-piece__diagram {
  width: 100%;
  height: clamp(120px, 18vw, 180px);
  display: grid;
  grid-template-rows: 100%;    /* definite track so a tall (three-quarter) drawing is contained, 2026-09-25 */
  grid-template-columns: 100%;
  place-items: center;
  color: var(--ink);
}
.pdp-piece__diagram img,
.pdp-piece__diagram svg {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.pdp-piece__dim,
.pdp-variant__dim {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.05em;
  color: var(--ink-muted);
  font-variant-numeric: tabular-nums;
}

.segmented {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: 0.5rem;
}
.segmented button {
  padding: 0.7rem 0.5rem;
  border: 2px solid var(--line);
  border-radius: 0;   /* pill — match styleguide .btn (Dave 2026-07-14) */
  background: var(--surface);
  font-size: var(--fs-sm);
  text-align: center;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.segmented button:hover { border-color: var(--ink); }
.segmented button[aria-pressed="true"] {
  background: var(--ink);
  color: var(--bg);
  border-color: var(--ink);
}

/* square control family - Dave 2026-07-14
   toggle-filter = multi-select/cumulative | slider = mutually exclusive (also
   section tabs) | dropdown = compact pick-one with an arrow-divot in the border.
   All square, 2px, one language with the buttons. */
.toggle-filter {
  padding: 0.58rem 1.1rem;
  border: 2px solid var(--line);
  background: var(--surface);
  color: var(--ink-muted);
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 500;
  letter-spacing: var(--ls-btn);
  text-transform: uppercase;
  cursor: pointer;
  transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast);
}
.toggle-filter:hover { border-color: var(--ink); color: var(--ink); }
.toggle-filter[aria-pressed="true"] { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.slider {
  position: relative;
  display: flex;
  width: max-content;
  max-width: 100%;
  border: 2px solid var(--ink);
  background: var(--surface);
  overflow: hidden;
}
.slider__fill {
  position: absolute; top: 0; left: 0; height: 100%;
  background: var(--ink); z-index: 2; pointer-events: none;
  transition: transform var(--t-base);
}
.slider__cream {
  position: absolute; top: 0; left: 0; height: 100%;
  display: flex; z-index: 3; pointer-events: none;
  transition: clip-path var(--t-base);
}
.slider__opt {
  flex: 0 0 auto;
  padding: 0.6rem 1.2rem;
  background: none; border: 0; border-radius: 0;
  border-left: 2px solid transparent;
  appearance: none; -webkit-appearance: none;
  color: var(--ink);
  font-family: var(--font-body); font-size: var(--fs-xs); font-weight: 500;
  letter-spacing: var(--ls-btn); text-transform: uppercase;
  white-space: nowrap; cursor: pointer;
  position: relative; z-index: 1;
}
/* Divider between two tabs is ALWAYS the right-hand tab's own left border — a
   single element/property, coloured either by its own :hover or by the
   preceding tab's :hover (next-sibling selector). Never two independently
   computed edges from two different elements, so the shared line can't
   render a pixel apart depending on which side triggered it. First tab's
   left border is removed outright (would duplicate the bar's own left
   edge); last tab has no following sibling so its right side is never
   drawn (would duplicate the bar's own right edge). */
.slider__opt:first-of-type { border-left: 0; }
.slider__opt:not(:first-of-type):hover,
.slider__opt:hover + .slider__opt {
  border-left-color: var(--ink);
}
.slider__cream span {
  display: flex; align-items: center; justify-content: center; height: 100%;
  color: var(--bg);
  font-family: var(--font-body); font-size: var(--fs-xs); font-weight: 700;
  letter-spacing: var(--ls-btn); text-transform: uppercase; white-space: nowrap;
}
.dropdown { position: relative; }
.dropdown__t {
  position: relative; width: 100%;
  padding: 0.62rem 1.15rem;
  background: var(--surface); color: var(--ink);
  font-family: var(--font-body); font-size: var(--fs-xs); font-weight: 500;
  letter-spacing: var(--ls-btn); text-transform: uppercase;
  cursor: pointer; border: 2px solid var(--ink); border-bottom: 0; z-index: 2;
}
.dropdown__edge {
  position: absolute; left: -2px; right: -2px; top: calc(100% - 2px);
  height: 11px; overflow: visible; pointer-events: none;
}
.dropdown__edge path { fill: none; stroke: var(--ink); stroke-width: 2px; vector-effect: non-scaling-stroke; }
.dropdown.is-open .dropdown__edge { opacity: 0; }
.dropdown__menuwrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--t-base); }
.dropdown.is-open .dropdown__menuwrap { grid-template-rows: 1fr; }
.dropdown__menu { overflow: hidden; min-height: 0; background: var(--surface); border: 2px solid var(--ink); border-top: 0; }
.dropdown__opt {
  display: block; width: 100%;
  padding: 0.56rem 1.15rem;
  background: none; border: 0; color: var(--ink);
  font-family: var(--font-body); font-size: var(--fs-xs); font-weight: 500;
  letter-spacing: var(--ls-btn); text-transform: uppercase; cursor: pointer;
  transition: background var(--t-fast), color var(--t-fast);
}
.dropdown__opt + .dropdown__opt { box-shadow: inset 0 1px 0 var(--line); }
.dropdown__opt:hover, .dropdown__opt[aria-selected="true"] { background: var(--ink); color: var(--bg); }

/* ─── cover lines (PDP + samples) — name + blurb stack, then swatches ─── */
.cover-line { margin-bottom: 1.5rem; }
.cover-line__head {
  margin-bottom: 0.6rem;
}
.cover-line__name {
  font-weight: 600;
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
  line-height: 1.2;
}
.cover-line__blurb {
  color: var(--ink-muted);
  font-size: var(--fs-sm);
  margin-top: 0.15rem;
  line-height: 1.4;
}

.swatch-row {
  display: grid;
  grid-template-columns: repeat(7, max-content);
  justify-content: start;
  gap: 0.5rem 0.7rem;
}
@media (max-width: 720px) { .swatch-row { grid-template-columns: repeat(7, max-content); } }
@media (max-width: 480px) { .swatch-row { grid-template-columns: repeat(7, max-content); } }

.swatch-cell {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.3rem;
  cursor: pointer;
  width: 32px;
}
.swatch-cell .swatch {
  position: relative;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1px solid var(--line);
  transition: transform var(--t-fast), box-shadow var(--t-fast);
}
.swatch-cell:hover .swatch { transform: scale(1.06); }
.swatch-cell[aria-pressed="true"] .swatch {
  box-shadow: 0 0 0 2px var(--bg), 0 0 0 3px var(--ink);
}
.swatch-cell .swatch[data-stock="in_stock"]::after,
.swatch-cell .swatch[data-stock="incoming"]::after {
  content: '';
  position: absolute;
  bottom: 0;
  right: 0;
  width: 7px; height: 7px;
  border-radius: 50%;
  border: 1.5px solid var(--surface);
}
.swatch-cell .swatch[data-stock="in_stock"]::after { background: var(--ok); }
.swatch-cell .swatch[data-stock="incoming"]::after { background: var(--warn); }
.swatch-cell__name {
  font-size: 0.6875rem;   /* 11px */
  color: var(--ink-muted);
  text-align: center;
  line-height: 1.15;
}

/* ─── PDP availability ─── */
.avail {
  display: grid;
  gap: 0.4rem;
  padding: 1rem 1.1rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--surface);
  margin: 1.5rem 0 1rem;
}
.avail__head {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: var(--fs-sm);
  font-weight: 600;
}
.avail__dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  display: inline-block;
}
.avail__dot.ok   { background: var(--ok); }
.avail__dot.warn { background: var(--warn); }
.avail__dot.mto  { background: var(--ink-soft); }
.avail__line { font-size: var(--fs-sm); color: var(--ink); }
.avail__alt  { font-size: var(--fs-sm); color: var(--ink-muted); margin-top: 0.25rem; }

.avail-legend {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  margin-bottom: 1rem;
}
.avail-legend span { display: inline-flex; align-items: center; gap: 0.4rem; }
.avail-legend .dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }

.studio-note {
  display: flex;
  gap: 0.6rem;
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  font-style: italic;
  margin: 0.75rem 0 1.25rem;
  padding-left: 0.75rem;
  border-left: 1px solid var(--line);
}

@media (max-width: 880px) {
  .pdp { grid-template-columns: 1fr; }
  .pdp__gallery { position: static; }
}

/* ─── PDP detail blocks (visible, not hidden in dropdowns) ─── */
.detail-blocks {
  display: grid;
  gap: clamp(1.5rem, 3vw, 2rem);
  margin-top: clamp(2rem, 5vw, 3rem);
}
.detail-block {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: clamp(1.25rem, 2.5vw, 1.75rem);
}
.detail-block h4 {
  font-size: var(--fs-md);
  font-weight: 600;
  margin-bottom: 1rem;
  letter-spacing: -0.01em;
}
.detail-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 1.25rem;
}
.detail-cell {
  display: grid;
  gap: 0.4rem;
  align-content: start;
}
.detail-cell__icon {
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  color: var(--ink);
}
.detail-cell__icon svg { width: 28px; height: 28px; stroke-width: 1.4; }
.detail-cell__title { font-weight: 500; font-size: var(--fs-sm); }
.detail-cell__value { font-size: var(--fs-sm); color: var(--ink-muted); }

/* warranty triple */
.warranty-strip {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
  text-align: center;
}
.warranty-strip > div {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--bg);
}
.warranty-strip strong {
  display: block;
  font-size: clamp(1.5rem, 3vw, 2.25rem);
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1;
}
.warranty-strip span { font-size: var(--fs-xs); color: var(--ink-muted); margin-top: 0.4rem; display: block; letter-spacing: 0.04em; text-transform: uppercase; }

/* delivery timeline */
.delivery-timeline {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  margin-top: 0.5rem;
}
.delivery-stage {
  padding: 0.75rem 0.4rem 0;
  border-top: 2px solid var(--ink);
  font-size: var(--fs-sm);
}
.delivery-stage strong { display: block; font-weight: 600; font-size: var(--fs-sm); }
.delivery-stage span { font-size: var(--fs-xs); color: var(--ink-muted); }
@media (max-width: 720px) { .delivery-timeline { grid-template-columns: 1fr 1fr; } }

/* care: row of icons + actions */
.care-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 1.25rem;
}
.care-row > div {
  display: flex;
  gap: 0.75rem;
  align-items: flex-start;
}
.care-row svg { width: 22px; height: 22px; flex: none; opacity: 0.85; }
.care-row strong { display: block; font-weight: 500; font-size: var(--fs-sm); }
.care-row span { font-size: var(--fs-sm); color: var(--ink-muted); }

/* ─── cart / checkout ─── */
.cart-row {
  display: grid;
  grid-template-columns: 96px 1fr auto auto;
  gap: 1.25rem;
  padding: 1.5rem 0;
  border-bottom: 1px solid var(--line);
  align-items: center;
}
.cart-row__media { aspect-ratio: 1; border-radius: var(--r); background: var(--line-soft); }
.cart-row__body { display: grid; gap: 0.55rem; align-content: center; }
.cart-row__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-lg);
  letter-spacing: -0.012em;
  line-height: 1.1;
  color: var(--ink);
}
.cart-row__meta  { color: var(--ink-muted); font-size: var(--fs-sm); }
.cart-row__lead  { color: var(--ink); font-size: var(--fs-xs); letter-spacing: 0.01em; }
.cart-row__price { font-variant-numeric: tabular-nums; font-size: var(--fs-md); font-weight: 500; align-self: center; min-width: 5.5rem; text-align: right; }

/* per-row editable selectors (size + cover) */
.cart-row__opts {
  display: grid;
  grid-template-columns: minmax(140px, 200px) minmax(140px, 240px);
  gap: 0.5rem;
}
.cart-row__opt {
  display: grid;
  gap: 0.25rem;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
}
.cart-row__opt span { letter-spacing: 0.04em; }
.cart-row__opt select {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: 0.45rem 0.6rem;
  font-size: var(--fs-sm);
  color: var(--ink);
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='none' stroke='%231C1714' stroke-width='1.4'><path d='m1 1 5 5 5-5'/></svg>");
  background-repeat: no-repeat;
  background-position: right 0.6rem center;
  background-size: 10px;
  padding-right: 1.85rem;
  cursor: pointer;
  transition: border-color var(--t-fast);
}
.cart-row__opt select:hover  { border-color: var(--ink); }
.cart-row__opt select:focus  { outline: none; border-color: var(--ink); }

/* qty + trash group on right */
.cart-row__controls { display: flex; align-items: center; gap: 0.5rem; }
.qty {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--line);
  border-radius: 999px;
  overflow: hidden;
  background: var(--surface);
}
.qty button { padding: 0.4rem 0.75rem; line-height: 1; color: var(--ink); font-size: 1rem; }
.qty button:hover { background: var(--hover); }
.qty span { padding: 0 0.6rem; min-width: 1.5rem; text-align: center; font-variant-numeric: tabular-nums; font-size: var(--fs-sm); }
.cart-row__trash {
  width: 36px; height: 36px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  color: var(--ink-muted);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
}
.cart-row__trash svg { width: 16px; height: 16px; }
.cart-row__trash:hover { border-color: var(--crit); color: var(--crit); background: var(--hover); }

@media (max-width: 720px) {
  .cart-row {
    grid-template-columns: 72px 1fr;
    gap: 0.85rem;
  }
  .cart-row__controls { grid-column: 2; justify-self: start; }
  .cart-row__price    { grid-column: 2; justify-self: start; text-align: left; min-width: 0; }
  .cart-row__opts     { grid-template-columns: 1fr 1fr; }
}

/* ─── postcode delivery check (cart summary) ─── */
.postcode-form {
  margin: 1.25rem 0 1rem;
  padding: 1rem 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  display: grid;
  gap: 0.5rem;
}
.postcode-form > label {
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  letter-spacing: 0.04em;
}
.postcode-row {
  display: flex;
  gap: 0.5rem;
  align-items: stretch;
}
.postcode-row input {
  flex: 1;
  padding: 0.55rem 0.8rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  font-size: var(--fs-base);
  font-variant-numeric: tabular-nums;
  background: var(--surface);
  letter-spacing: 0.04em;
}
.postcode-row input:focus { outline: none; border-color: var(--ink); }
.postcode-row .btn { padding: 0 1rem; font-size: var(--fs-sm); }
.postcode-result {
  font-size: var(--fs-sm);
  line-height: 1.4;
  padding-top: 0.15rem;
}
.postcode-result strong { font-weight: 600; }

.summary {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: 1.5rem;
  position: sticky;
  top: 100px;
}
.summary-row { display: flex; justify-content: space-between; padding: 0.4rem 0; font-variant-numeric: tabular-nums; }
.summary-row.total { font-weight: 600; font-size: var(--fs-md); padding-top: 0.85rem; border-top: 1px solid var(--line); margin-top: 0.5rem; }
.summary-note { font-size: var(--fs-xs); color: var(--ink-muted); margin-top: 1rem; }

.layout-checkout { display: grid; grid-template-columns: 1.5fr 1fr; gap: 3rem; align-items: start; }
@media (max-width: 880px) { .layout-checkout { grid-template-columns: 1fr; } }

/* ─── checkout summary lines (item / qty / unit / line) ─── */
.checkout-line {
  display: grid;
  grid-template-columns: 1fr auto auto auto;
  gap: 0.85rem;
  align-items: baseline;
  padding: 0.55rem 0;
  border-bottom: 1px dashed var(--line-soft);
  font-size: var(--fs-sm);
}
.checkout-line:last-child { border-bottom: 0; }
.checkout-line--head {
  font-size: var(--fs-xs);
  letter-spacing: 0.05em;
  color: var(--ink-muted);
  text-transform: uppercase;
  padding-bottom: 0.4rem;
  border-bottom: 1px solid var(--line);
}
.checkout-line__name {
  display: grid;
  gap: 0.1rem;
  min-width: 0;
}
.checkout-line__name strong {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-base);
  letter-spacing: -0.01em;
}
.checkout-line__name .muted {
  font-size: var(--fs-xs);
}
.checkout-line span:not(.checkout-line__name):not(.muted) { white-space: nowrap; }

/* ─── payment method tabs ─── */
.pay-tabs {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0.4rem;
  margin-bottom: 1rem;
}
.pay-tab {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.35rem;
  padding: 0.65rem 0.5rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--surface);
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  cursor: pointer;
  transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast);
}
.pay-tab svg { width: 24px; height: 24px; }
.pay-tab:hover { border-color: var(--ink); color: var(--ink); }
.pay-tab[aria-pressed="true"] {
  border-color: var(--ink);
  background: var(--bg);
  color: var(--ink);
  box-shadow: inset 0 0 0 1px var(--ink);
}
@media (max-width: 600px) {
  .pay-tabs { grid-template-columns: repeat(2, 1fr); }
}

.pay-pane { display: none; }
.pay-pane[data-active="true"] { display: block; }
.pay-wallet-btn { padding: 1rem 1.5rem; }

/* ─── order tracking ─── */
.order-stages {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 0;
  position: relative;
}
.order-stage {
  padding: 1rem 0.5rem 0;
  border-top: 2px solid var(--line);
  text-align: left;
  font-size: var(--fs-sm);
}
.order-stage[data-state="done"]    { border-top-color: var(--ink); color: var(--ink); }
.order-stage[data-state="current"] { border-top-color: var(--ink); color: var(--ink); }
.order-stage[data-state="pending"] { color: var(--ink-soft); }
.order-stage strong { display: block; font-weight: 600; }
.order-stage span { font-size: var(--fs-xs); color: var(--ink-muted); }
@media (max-width: 720px) { .order-stages { grid-template-columns: 1fr 1fr; } }

/* ─── chatbot ─── */
.bot-fab {
  position: fixed;
  bottom: 1.5rem;
  right: 1.5rem;
  z-index: 110;                                                  /* above sticky header (80) and cart popover (90) */
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--ink);
  color: var(--bg);
  display: grid;
  place-items: center;
  box-shadow: 0 10px 24px rgba(0,0,0,0.14);
  opacity: 0.5;                                                   /* quiet idle state */
  transition: transform var(--t-base), box-shadow var(--t-base), opacity var(--t-base);
}
.bot-fab:hover { transform: scale(1.04); box-shadow: 0 14px 32px rgba(0,0,0,0.18); opacity: 1; }
.bot-fab[aria-expanded="true"] { opacity: 1; }
.bot-fab[aria-expanded="true"] { transform: scale(0.95); }
.bot-fab svg { width: 22px; height: 22px; stroke-width: 1.7; }

/* Unread reply indicator — shown when a bot reply lands while the panel is
   minimised. Pulls user back to a waiting conversation. */
.bot-fab[data-unread]::after {
  content: attr(data-unread);
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: 999px;
  background: #c0392b;
  color: #fff;
  font: 600 11px/20px var(--font-ui, system-ui, sans-serif);
  text-align: center;
  box-shadow: 0 2px 6px rgba(0,0,0,0.18);
  pointer-events: none;
}
.bot-fab[data-unread] { opacity: 1; }

.bot-panel {
  position: fixed;
  bottom: 5.5rem;
  right: 1.5rem;
  width: min(360px, calc(100vw - 3rem));
  max-height: calc(100vh - 8rem);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg);
  display: none;
  flex-direction: column;
  overflow: hidden;                /* clip rounded corners cleanly */
  z-index: 110;                    /* above sticky header so scrolling never clips it */
  transform-origin: bottom right;
  animation: bot-pop 220ms cubic-bezier(.2,.9,.3,1.1);
}
.bot-panel[data-open="true"] { display: flex; }
@keyframes bot-pop {
  from { opacity: 0; transform: scale(0.96) translateY(6px); }
  to   { opacity: 1; transform: scale(1) translateY(0); }
}
.bot-panel__head {
  padding: 0.75rem 1rem;
  border-bottom: 1px solid var(--line);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 0.5rem;
  flex: none;
  background: var(--surface);
}
.bot-panel__head strong { font-weight: 600; font-size: var(--fs-sm); }
.bot-panel__head button { font-size: 1.1rem; line-height: 1; padding: 0.25rem 0.5rem; border-radius: 999px; color: var(--ink-muted); flex: none; }
.bot-panel__head button:hover { background: var(--hover); color: var(--ink); }
.bot-stream {
  flex: 1;
  padding: 1rem 1.25rem;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  min-height: 16rem;
  max-height: 22rem;
}
.bot-msg {
  max-width: 86%;
  padding: 0.6rem 0.85rem;
  border-radius: var(--r-lg);
  font-size: var(--fs-sm);
  line-height: 1.45;
  animation: bot-msg-in 220ms ease;
}
.bot-msg.them { background: var(--line-soft); align-self: flex-start; border-bottom-left-radius: 4px; }
.bot-msg.me   { background: var(--ink); color: var(--bg); align-self: flex-end; border-bottom-right-radius: 4px; }
@keyframes bot-msg-in {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: translateY(0); }
}
.bot-typing {
  align-self: flex-start;
  padding: 0.65rem 0.9rem;
  border-radius: var(--r-lg);
  background: var(--line-soft);
  display: inline-flex;
  gap: 4px;
  align-items: center;
  border-bottom-left-radius: 4px;
}
.bot-typing span {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--ink-muted);
  animation: bot-bounce 1100ms infinite ease-in-out;
}
.bot-typing span:nth-child(2) { animation-delay: 140ms; }
.bot-typing span:nth-child(3) { animation-delay: 280ms; }
@keyframes bot-bounce {
  0%, 60%, 100% { transform: translateY(0); opacity: 0.5; }
  30%           { transform: translateY(-4px); opacity: 1; }
}
.bot-chips { display: none; }   /* per Dave 2026-05-10 — sample/suggested questions removed */
.bot-chip {
  font-size: var(--fs-xs);
  padding: 0.4rem 0.75rem;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  cursor: pointer;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.bot-chip:hover { border-color: var(--ink); background: var(--hover); }
.bot-input {
  border-top: 1px solid var(--line);
  padding: 0.6rem 0.9rem;
  display: flex;
  gap: 0.5rem;
  align-items: center;
  background: var(--surface);
  flex: none;
}
.bot-input input { flex: 1 1 auto; min-width: 0; border: 0; outline: none; background: transparent; font-size: var(--fs-sm); padding: 0.3rem 0; }
.bot-input button {
  padding: 0.45rem 0.95rem;
  border-radius: 999px;
  background: var(--ink);
  color: var(--bg);
  font-size: var(--fs-sm);
  flex: none;
  white-space: nowrap;
}
.bot-input button:disabled { background: var(--ink-soft); cursor: not-allowed; }
.bot-stream { padding: 0.85rem 1rem; min-height: 12rem; max-height: none; }
.bot-chips  { padding: 0.4rem 0.9rem 0.5rem; }

/* ─── sample picker (cart-based) ─── */
.sample-line { margin-bottom: 1.75rem; padding-bottom: 1.5rem; border-bottom: 1px solid var(--line); }
.sample-line:last-child { border-bottom: 0; }
.sample-line__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-bottom: 0.75rem;
}
.sample-line__title { font-weight: 600; font-size: var(--fs-md); letter-spacing: -0.01em; }
.sample-line__blurb { color: var(--ink-muted); font-size: var(--fs-sm); }
.sample-line__price { font-size: var(--fs-sm); color: var(--ink-muted); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* ─── samples page — two-column layout with live chosen-list ─── */
.samples-head { text-align: center; }
.samples-layout {
  display: grid;
  grid-template-columns: 1fr 320px;
  gap: clamp(1.5rem, 3.5vw, 3rem);
  align-items: start;
  padding: 0 0 clamp(3rem, 6vw, 5rem);
}
@media (max-width: 880px) {
  .samples-layout { grid-template-columns: 1fr; }
}

.samples-main .sample-line {
  margin-bottom: clamp(1rem, 2vw, 1.5rem);
  padding-bottom: clamp(0.75rem, 1.5vw, 1.25rem);
  border-bottom: 1px solid var(--line);
}
.samples-main .sample-line:last-child { border-bottom: 0; }
.samples-main .sample-line__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 0.85rem;
  margin-bottom: 0.65rem;
}
.samples-main .sample-line__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
}
.samples-main .sample-line__blurb {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  margin-top: 0.15rem;
  line-height: 1.4;
  font-weight: 400;
}
.samples-main .sample-line__price {
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-muted);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.samples-main .swatch-row {
  grid-template-columns: repeat(auto-fill, max-content);
  gap: 0.65rem 0.85rem;
}
.samples-main .swatch-cell { width: 36px; gap: 0.35rem; }
.samples-main .swatch-cell .swatch { width: 32px; height: 32px; }
.samples-main .swatch-cell__name { font-size: 0.7rem; line-height: 1.1; }

/* right rail — sticky chosen-pack list */
.samples-chosen {
  position: sticky;
  top: clamp(1rem, 4vh, 2.5rem);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: 1.25rem;
  display: grid;
  gap: 1rem;
  align-self: start;
  box-shadow: var(--shadow-sm);
}
.samples-chosen__head { padding-bottom: 0.85rem; border-bottom: 1px solid var(--line); }
.samples-chosen__eyebrow {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin-bottom: 0.35rem;
}
.samples-chosen__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-lg);
  letter-spacing: -0.012em;
  margin: 0;
}
.samples-chosen__list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 0.6rem;
  max-height: 22rem;
  overflow-y: auto;
}
.samples-chosen__empty {
  padding: 1.25rem 0.5rem;
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  text-align: center;
  line-height: 1.5;
}
.samples-chosen__item {
  display: grid;
  grid-template-columns: 36px 1fr 26px;
  gap: 0.65rem;
  align-items: center;
  padding: 0.45rem 0;
  border-bottom: 1px solid var(--line-soft);
}
.samples-chosen__item:last-child { border-bottom: 0; }
.samples-chosen__chip {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 1px solid var(--line);
  background-color: var(--line-soft);
}
.samples-chosen__meta {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
  min-width: 0;
}
.samples-chosen__name {
  font-family: var(--font-display);
  font-size: var(--fs-sm);
  letter-spacing: -0.005em;
  color: var(--ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.samples-chosen__price {
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  font-variant-numeric: tabular-nums;
}
.samples-chosen__remove {
  width: 24px;
  height: 24px;
  border-radius: 999px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink-muted);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: border-color var(--t-fast), color var(--t-fast);
}
.samples-chosen__remove:hover { border-color: var(--crit); color: var(--crit); }
.samples-chosen__remove svg { width: 12px; height: 12px; }

.samples-chosen__foot { display: grid; gap: 0.6rem; padding-top: 0.85rem; border-top: 1px solid var(--line); }
.samples-chosen__row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-size: var(--fs-sm);
  color: var(--ink-muted);
}
.samples-chosen__row--total {
  color: var(--ink);
  font-size: var(--fs-md);
  padding-top: 0.5rem;
  border-top: 1px solid var(--line-soft);
}
.samples-chosen__row--total strong { font-family: var(--font-display); font-weight: 400; font-size: var(--fs-lg); }
.samples-chosen__note { margin: 0; font-size: 0.7rem; color: var(--ink-muted); text-align: center; line-height: 1.4; }
@media (max-width: 880px) {
  .samples-chosen { position: static; }
}

/* ─── clearance ─── */
.condition-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.7rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 0.25rem 0.6rem;
  border-radius: 999px;
  background: var(--line-soft);
  color: var(--ink);
  font-weight: 500;
}
.condition-badge[data-condition="new"]        { background: #DDEBE1; color: #2A5A40; }
.condition-badge[data-condition="ex-display"] { background: #EBE3D2; color: #6B5C36; }
.condition-badge[data-condition="seconds"]    { background: #F0DCD3; color: #74392A; }
.product-block__overlay .condition-badge { display: inline-flex; }
.product-block__overlay .was { color: rgba(255,255,255,0.65); }

.was {
  text-decoration: line-through;
  color: var(--ink-soft);
  margin-right: 0.5rem;
  font-weight: 400;
}

/* ─── reveal-on-scroll polish layer ─── */
.reveal {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 700ms cubic-bezier(.2,.7,.3,1), transform 700ms cubic-bezier(.2,.7,.3,1);
  will-change: opacity, transform;
}
.reveal.is-revealed { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}

/* ─── small utilities ─── */
.flow > * + * { margin-top: 1rem; }
.flow-tight > * + * { margin-top: 0.5rem; }
.stack { display: grid; gap: 1.5rem; }
.row { display: flex; gap: 1rem; align-items: center; flex-wrap: wrap; }
.between { justify-content: space-between; }
.text-center { text-align: center; }
.hidden { display: none !important; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }

.empty-state {
  text-align: center;
  padding: 4rem 1rem;
  color: var(--ink-muted);
}
.empty-state h3 { font-size: var(--fs-xl); color: var(--ink); margin-bottom: 0.5rem; }
.empty-state .btn { margin-top: 1.25rem; }

.page-head { padding: clamp(0.15rem, 0.3vw, 0.25rem) 0 clamp(0.4rem, 0.75vw, 0.6rem); }
.page-head .eyebrow { margin-bottom: 0.6rem; }
.page-head h1 {
  font-family: var(--font-display);
  font-size: clamp(1.85rem, 3.6vw, 2.7rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
  font-weight: 400;
  margin-top: 0.3rem;            /* kill default h1 0.67em margin — tighten space above title. Dave 2026-06-25 */
  margin-bottom: 0.3rem;         /* tighten space below title */
  max-width: 18ch;
  text-wrap: balance;
}
.page-head .lede { margin-top: 0.25rem; margin-bottom: 0.3rem; max-width: 38em; font-size: var(--fs-sm); }

/* ── centred variant for category pages ── */
.page-head--centered {
  text-align: center;
  padding-bottom: clamp(0.6rem, 1.25vw, 1rem);
}
.page-head--centered h1 { margin-left: auto; margin-right: auto; }
.page-head--centered .lede { margin-left: auto; margin-right: auto; }

/* ── filter pill row ── */
.filter-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.4rem;
  margin-top: clamp(0.3rem, 0.6vw, 0.5rem);
}
.filter-row:empty { display: none; }
.filter-pill {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 500;
  letter-spacing: 0.005em;
  padding: 0.25rem 1.1rem;       /* -25% pill height (was 0.55rem). Dave 2026-06-25 */
  border: 2px solid var(--line);
  border-radius: 0;
  background: var(--surface);
  color: var(--ink);
  cursor: pointer;
  transition: border-color var(--t-base), background var(--t-base), color var(--t-base);
  white-space: nowrap;
}
.filter-pill:hover { border-color: var(--ink); }
.filter-pill[aria-pressed="true"] {
  background: var(--ink);
  color: var(--bg);
  border-color: var(--ink);
}

.search-row {
  display: flex;
  gap: 0.5rem;
  align-items: center;
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 0.4rem 0.5rem 0.4rem 1rem;
  background: var(--surface);
}
.search-row input { flex: 1; border: 0; outline: none; background: transparent; padding: 0.4rem 0; font-size: var(--fs-base); }
/* The magnifying glass is part of the layout — it doesn't shift, hide, or swap to an X
   on focus or input. Suppress the WebKit "Cancel" affordance for any input that ends up
   as type=search inside a .search-row, just in case. */
.search-row__icon { color: var(--ink-muted); flex-shrink: 0; }
.search-row__btn {
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border: 0;
  border-radius: 999px;
  background: var(--ink);
  color: var(--bg);
  cursor: pointer;
  flex-shrink: 0;
  transition: background var(--t-base);
}
.search-row__btn:hover { background: var(--ink-rich, var(--ink)); }
.search-row__btn svg { width: 18px; height: 18px; }
.search-row input[type="search"]::-webkit-search-cancel-button,
.search-row input[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
  appearance: none;
}

.prose { max-width: 56ch; }
.prose h2 { font-size: var(--fs-xl); margin-top: 2.5rem; margin-bottom: 0.75rem; }
.prose h3 { font-size: var(--fs-lg); margin-top: 1.5rem; margin-bottom: 0.5rem; }
.prose p, .prose li { color: var(--ink-muted); }
.prose ul { padding-left: 1.25rem; }
.prose li { margin-bottom: 0.4rem; }
.prose dl { display: grid; grid-template-columns: max-content 1fr; gap: 0.75rem 1.5rem; }
.prose dt { color: var(--ink); font-weight: 500; }

.panel {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: clamp(1.5rem, 3vw, 2rem);
}
.inline-note { font-size: var(--fs-xs); color: var(--ink-muted); }

.split-2 {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: 3rem;
  align-items: start;
}
@media (max-width: 880px) {
  .split-2 { grid-template-columns: 1fr; gap: 2rem; }
  .order-stages { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 600px) {
  .order-stages { grid-template-columns: 1fr; }
}

/* ─── gift cards ─── */
.gift-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 0.75rem;
}
.gift-card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: 1.25rem;
  text-align: center;
  cursor: pointer;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.gift-card:hover { border-color: var(--ink); }
.gift-card[aria-pressed="true"] { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.gift-card strong { display: block; font-size: var(--fs-xl); font-weight: 700; letter-spacing: -0.025em; }
.gift-card span { font-size: var(--fs-xs); color: var(--ink-muted); margin-top: 0.25rem; display: block; }
.gift-card[aria-pressed="true"] span { color: rgba(250, 247, 242, 0.7); }
.nav-drawer__suggest {
  position: static;
  right: auto;
  top: auto;
  width: 100%;
  margin-top: -0.35rem;
  margin-bottom: 0.6rem;
  max-height: 46vh;
}
.nav-drawer__suggest[data-show="true"] { display: block; }

/* ─── home page — editorial register, photo-led ─── */

/* Category hero (shop.html) — same overlay pattern as home-hero but shorter,
   so the user lands on a clean editorial moment (photo + title + filters)
   instead of an empty header band followed by a cropped first product.
   Added 2026-05-19. */
.shop-hero {
  position: relative;
  width: 100vw;
  margin-left: 50%;
  transform: translateX(-50%);
  height: clamp(58vh, 62vh, 78vh);
  min-height: 420px;
  overflow: hidden;
  isolation: isolate;
  margin-bottom: clamp(2rem, 5vw, 4rem);
}
.shop-hero__media { position: absolute; inset: 0; z-index: 0; }
.shop-hero__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.shop-hero::after {
  content: '';
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(28,23,20,0.10) 0%, rgba(28,23,20,0.55) 100%);
  z-index: 1;
}
.shop-hero__copy {
  position: relative;
  z-index: 2;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding-bottom: clamp(1.75rem, 4vw, 3rem);
  color: #FFFFFF;
  text-align: center;
}
.shop-hero__copy h1 { margin-left: auto; margin-right: auto; }
.shop-hero__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(2.6rem, 6vw, 4.6rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: #FFFFFF;
  max-width: 22ch;
  text-wrap: balance;
}
.shop-hero__sub {
  margin: 0.65rem auto 0;
  font-size: clamp(0.95rem, 1.25vw, 1.1rem);
  line-height: 1.5;
  color: rgba(255,255,255,0.92);
  max-width: 44ch;
}
.filter-row--on-hero {
  margin-top: clamp(0.85rem, 1.6vw, 1.25rem);
  justify-content: center;
}
.filter-row--on-hero .filter-pill {
  background: rgba(255,255,255,0.92);
  color: var(--ink);
  border-color: transparent;
}
.filter-row--on-hero .filter-pill:hover { border-color: rgba(255,255,255,0.95); background: #FFFFFF; }
.filter-row--on-hero .filter-pill[aria-pressed="true"] {
  background: var(--ink);
  color: #FFFFFF;
  border-color: var(--ink);
}

/* 1. quiet hero — single photo, type sits over the bottom-left third */
.home-hero {
  position: relative;
  width: 100vw;
  margin-left: 50%;
  transform: translateX(-50%);
  height: clamp(72vh, 80vh, 92vh);
  min-height: 520px;
  overflow: hidden;
  isolation: isolate;
  margin-bottom: clamp(2rem, 5vw, 4rem);
}
.home-hero__media {
  position: absolute;
  inset: 0;
  z-index: 0;
}
.home-hero__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.home-hero::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(28,23,20,0) 35%, rgba(28,23,20,0.45) 100%);
  z-index: 1;
}
.home-hero__copy {
  position: relative;
  z-index: 2;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding-bottom: clamp(2.5rem, 5vw, 4.5rem);
  color: #FFFFFF;
}
.home-hero__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(3.75rem, 8.4vw, 6.9rem);   /* +50% per Dave 2026-05-19 */
  line-height: 1.04;
  letter-spacing: -0.02em;
  color: #FFFFFF;
  max-width: 18ch;
  text-wrap: balance;
}
.home-hero__title em { font-style: normal; }   /* italic stripped per Dave 2026-05-19 */
.home-hero__sub {
  margin-top: 1rem;
  font-size: clamp(1.5rem, 2vw, 1.8rem);       /* +50% per Dave 2026-05-19 */
  line-height: 1.5;
  color: rgba(255,255,255,0.88);
  max-width: 36ch;
}
.home-hero__cta {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  margin-top: 1.85rem;
  flex-wrap: wrap;
}
.home-hero__cta .btn-line { color: #FFFFFF; }
.home-hero__cta .btn-line::after { background: #FFFFFF; }
.home-hero__cta .btn-primary { background: #FFFFFF; color: var(--ink); }
.home-hero__cta .btn-primary:hover { background: var(--ink); color: #FFFFFF; }

/* 2. editorial intro line */
.home-intro {
  padding: clamp(2.5rem, 5vw, 4rem) 0 clamp(0.5rem, 1.5vw, 1.5rem);
  text-align: center;
}
.home-intro__line {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(1.25rem, 2.2vw, 1.7rem);
  line-height: 1.35;
  color: var(--ink);
  max-width: 32ch;
  margin: 0 auto;
  text-wrap: balance;
}

/* 3. featured pieces wrap */
.home-after-list {
  text-align: center;
  margin-top: clamp(1.5rem, 3vw, 2.5rem);
  margin-bottom: clamp(2.5rem, 5vw, 4rem);
}

/* 4. materials library teaser */
.home-materials {
  padding: clamp(3rem, 6vw, 5rem) 0;
  display: grid;
  gap: clamp(1.75rem, 3.5vw, 2.5rem);
}
.home-materials__head { text-align: center; max-width: 36em; margin: 0 auto; }
.home-materials__head h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.75rem, 3vw, 2.4rem);
  letter-spacing: -0.018em;
  margin-bottom: 0.5rem;
}
.home-materials__head p { color: var(--ink-muted); font-size: var(--fs-md); }
.home-materials__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(0.85rem, 1.8vw, 1.25rem);
}
.home-material {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1.1rem 1.25rem;
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--surface);
  transition: border-color var(--t-fast), background var(--t-fast);
}
.home-material:hover { border-color: var(--ink); background: var(--hover); }
.home-material__chip {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid var(--line);
  flex: none;
}
.home-material strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
  color: var(--ink);
}
.home-material span {
  display: block;
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  margin-top: 0.15rem;
}
.home-materials__sample {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1.5rem;
  flex-wrap: wrap;
  padding: 1rem 1.25rem;
  background: var(--bg);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  text-align: center;
}
.home-materials__sample span { font-size: var(--fs-sm); color: var(--ink-muted); }
@media (max-width: 720px) {
  .home-materials__grid { grid-template-columns: 1fr; }
}

/* 5. craft block */
.home-craft {
  padding: clamp(3rem, 6vw, 5rem) 0;
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: clamp(2rem, 4.5vw, 4rem);
  align-items: center;
}
.home-craft__media {
  border-radius: var(--r-xl);
  overflow: hidden;
  aspect-ratio: 4 / 5;
  background: var(--line-soft);
}
.home-craft__media img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.home-craft__copy h2 {
  font-family: var(--font-display);
  font-size: clamp(1.85rem, 3.2vw, 2.6rem);
  letter-spacing: -0.018em;
  font-weight: 400;
  margin-bottom: 1rem;
}
.home-craft__copy p {
  color: var(--ink-muted);
  font-size: var(--fs-md);
  line-height: 1.55;
  max-width: 36em;
  margin-bottom: 1rem;
}
.home-craft__copy .btn-line { margin-top: 0.5rem; }
@media (max-width: 880px) {
  .home-craft { grid-template-columns: 1fr; }
  .home-craft__media { aspect-ratio: 4 / 3; }
}

/* 6. trade panel — quieter than the previous boxed panel */
.home-trade {
  padding: clamp(2.5rem, 5vw, 4rem) 0 clamp(3.5rem, 6vw, 5rem);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  flex-wrap: wrap;
  border-top: 1px solid var(--line);
}
.home-trade__copy h3 {
  font-family: var(--font-display);
  font-size: var(--fs-xl);
  font-weight: 400;
  letter-spacing: -0.012em;
  margin-bottom: 0.25rem;
}
.home-trade__copy p { color: var(--ink-muted); font-size: var(--fs-base); margin: 0; }

/* ─── PDP — Variants strip (line silhouettes of THIS product's sizes) ─── */
.pdp-variants {
  margin: clamp(2.5rem, 5vw, 4rem) 0 clamp(3rem, 5.5vw, 4.5rem);
  padding-top: clamp(1.5rem, 3vw, 2.25rem);
  border-top: 1px solid var(--line);
}
.pdp-variants__head {
  margin-bottom: clamp(1.25rem, 2.5vw, 1.75rem);
  max-width: 36em;
}
.pdp-variants__eyebrow {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin-bottom: 0.5rem;
}
.pdp-variants__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.6rem, 2.8vw, 2.2rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
}
.pdp-variants__list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.pdp-variant {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.55rem;
  padding: clamp(1.5rem, 3vw, 2.25rem) 1rem;
  border-right: 1px solid var(--line);
  background: transparent;
  color: var(--ink);
  text-align: center;
  transition: background var(--t-base);
  cursor: pointer;
}
.pdp-variant:last-child { border-right: 0; }
.pdp-variant:hover { background: var(--hover); }
.pdp-variant.is-active { background: var(--bg); }
.pdp-variant.is-active .pdp-variant__label { font-weight: 500; }
.pdp-variant__icon {
  width: 100%;
  max-width: 200px;
  height: clamp(96px, 8vw, 140px);
  display: grid;
  place-items: center;
  color: var(--ink);
  opacity: 0.9;
}
.pdp-variant__icon svg { width: 100%; height: 100%; }
.pdp-variant__label {
  font-family: var(--font-display);
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
  color: var(--ink);
  margin-top: 1rem;
}
.pdp-variant__dim {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.05em;
  color: var(--ink-muted);
  font-variant-numeric: tabular-nums;
}
@media (max-width: 720px) {
  .pdp-variants__list { grid-template-columns: 1fr; }
  .pdp-variant { border-right: 0; border-bottom: 1px solid var(--line); }
  .pdp-variant:last-child { border-bottom: 0; }
}

/* --- PDP: mechanism toggle (2026-07-27) ---
   Sits directly above the size selector and only renders when a range actually
   offers more than one mechanism, so single-mechanism PDPs are untouched.
   Reuses the styleguide .filter-pill component -- no bespoke button styling;
   the two rules below only adapt it from <button> to <a>. */
.pdp-mech {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin-bottom: 0.75rem;
}
.pdp-mech__pill { display: inline-block; text-decoration: none; }
.pdp-mech__pill.is-active {
  background: var(--ink);
  color: var(--bg);
  border-color: var(--ink);
}

/* --- PDP: "In this range", grouped by piece shape (2026-07-27) ---
   The flat .pdp-variants__list grid stays the default; .has-groups switches it
   to a stack of titled groups, each carrying the same grid + rules as before. */
#pdp-variants-list.has-groups {
  display: block;
  border-top: 0;
  border-bottom: 0;
}
.pdp-vgroup + .pdp-vgroup { margin-top: clamp(1.5rem, 3vw, 2.25rem); }
.pdp-vgroup__title {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin: 0 0 0.5rem;
}
.pdp-vgroup__count {
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.05em;
  opacity: 0.65;
}
.pdp-vgroup__list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.pdp-vgroup__list .pdp-variant:last-child { border-right: 0; }
@media (max-width: 720px) {
  .pdp-vgroup__list { grid-template-columns: 1fr; }
  .pdp-vgroup__list .pdp-variant { border-right: 0; border-bottom: 1px solid var(--line); }
  .pdp-vgroup__list .pdp-variant:last-child { border-bottom: 0; }
}

/* ─── PDP — How it's made (graphic-led, no text table) ─── */
.pdp-make {
  margin: 0 0 clamp(3rem, 6vw, 5rem);
  padding-top: clamp(1.5rem, 3vw, 2.25rem);
  border-top: 1px solid var(--line);
}
.pdp-make__head {
  margin-bottom: clamp(1.5rem, 3vw, 2.25rem);
  max-width: 36em;
}
.pdp-make__eyebrow {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin-bottom: 0.5rem;
}
.pdp-make__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.85rem, 3.4vw, 2.6rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
}
.pdp-make__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.pdp-make__cell {
  display: grid;
  justify-items: center;
  gap: 0.85rem;
  padding: clamp(2rem, 4vw, 3rem) 1rem;
  border-right: 1px solid var(--line);
  text-align: center;
}
.pdp-make__cell:last-child { border-right: 0; }
.pdp-make__icon {
  width: 80px;
  height: 60px;
  display: grid;
  place-items: center;
  color: var(--ink);
  opacity: 0.95;
}
.pdp-make__icon svg { width: 100%; height: 100%; }
.pdp-make__label {
  font-family: var(--font-display);
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
  color: var(--ink);
}
@media (max-width: 720px) {
  .pdp-make__grid { grid-template-columns: 1fr 1fr; }
  .pdp-make__cell:nth-child(2n) { border-right: 0; }
  .pdp-make__cell:nth-child(-n+2) { border-bottom: 1px solid var(--line); }
}

/* ─── PDP — Warranty (icons + numerals) ─── */
.pdp-warranty {
  margin: 0 0 clamp(3rem, 6vw, 5rem);
  padding-top: clamp(1.5rem, 3vw, 2.25rem);
  border-top: 1px solid var(--line);
}
.pdp-warranty__head {
  margin-bottom: clamp(1.5rem, 3vw, 2.25rem);
  max-width: 36em;
}
.pdp-warranty__eyebrow {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin-bottom: 0.6rem;
}
.pdp-warranty__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.85rem, 3.4vw, 2.6rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
}
.pdp-warranty__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.pdp-warranty__cell {
  display: grid;
  justify-items: center;
  gap: 0.4rem;
  padding: clamp(2rem, 4vw, 3rem) 1.25rem;
  border-right: 1px solid var(--line);
  text-align: center;
}
.pdp-warranty__cell:last-child { border-right: 0; }
.pdp-warranty__icon {
  width: 64px;
  height: 56px;
  display: grid;
  place-items: center;
  color: var(--ink);
  margin-bottom: 0.55rem;
}
.pdp-warranty__icon svg { width: 100%; height: 100%; }
.pdp-warranty__num {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(2.8rem, 5.5vw, 4.5rem);
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--ink);
}
.pdp-warranty__yrs {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-md);
  color: var(--ink-muted);
  margin-top: 0.1rem;
}
.pdp-warranty__what {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-muted);
  margin-top: 0.5rem;
}
@media (max-width: 720px) {
  .pdp-warranty__grid { grid-template-columns: 1fr; }
  .pdp-warranty__cell { border-right: 0; border-bottom: 1px solid var(--line); }
  .pdp-warranty__cell:last-child { border-bottom: 0; }
}

/* ─────────────────────────────────────────────────────────────────────
   Social, video, and gallery surfaces (added 2026-05-11)
   ───────────────────────────────────────────────────────────────────── */

/* ─── footer social cluster ─── quiet row in the colophon strip ─── */
.site-footer .colophon { gap: 1.25rem 1.5rem; }
.site-footer .colophon .social-cluster {
  display: inline-flex;
  align-items: center;
  gap: 0.85rem;
  margin-left: auto;
}
.site-footer .colophon .social-cluster .social-icon {
  width: 22px;
  height: 22px;
  display: grid;
  place-items: center;
  color: var(--ink-muted);
  border-radius: 999px;
  transition: color var(--t-base), transform var(--t-fast);
}
.site-footer .colophon .social-cluster .social-icon svg {
  width: 18px;
  height: 18px;
}
.site-footer .colophon .social-cluster a.social-icon:hover {
  color: var(--ink);
  transform: translateY(-1px);
}
.site-footer .colophon .social-cluster .social-icon.is-placeholder {
  color: var(--ink-soft);
  cursor: default;
}
@media (max-width: 720px) {
  .site-footer .colophon .social-cluster {
    margin-left: 0;
    width: 100%;
    padding-top: 0.6rem;
    border-top: 1px dashed var(--line-soft);
  }
}

/* ─── reusable: video tile (16:9, click-to-load placeholder) ─── */
.video-tile {
  position: relative;
  aspect-ratio: 16 / 9;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
  display: grid;
  cursor: pointer;
  transition: border-color var(--t-base), transform var(--t-fast);
}
.video-tile:hover { border-color: var(--ink-soft); }
.video-tile.is-placeholder { cursor: default; }
.video-tile.is-placeholder:hover { border-color: var(--line); }
.video-tile__poster {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(120% 120% at 30% 25%, rgba(255,255,255,0.55), transparent 60%),
    linear-gradient(135deg, #efe9d9 0%, #d8cfb8 50%, #b8a87f 100%);
}
/* poster-tone variants — cycled across the care-video grid so 4
   placeholder tiles read as distinct content, not loading skeletons */
.video-tile.tone-cream .video-tile__poster {
  background:
    radial-gradient(120% 120% at 30% 25%, rgba(255,255,255,0.55), transparent 60%),
    linear-gradient(135deg, #f6f0df 0%, #e8ddc1 60%, #c9b89a 100%);
}
.video-tile.tone-oat .video-tile__poster {
  background:
    radial-gradient(120% 120% at 30% 25%, rgba(255,255,255,0.5), transparent 60%),
    linear-gradient(135deg, #e8e0c9 0%, #c9b89a 55%, #9c8c70 100%);
}
.video-tile.tone-chestnut .video-tile__poster {
  background:
    radial-gradient(120% 120% at 30% 25%, rgba(255,255,255,0.45), transparent 60%),
    linear-gradient(135deg, #c9a986 0%, #9c7553 55%, #6e4a2a 100%);
}
.video-tile.tone-tobacco .video-tile__poster {
  background:
    radial-gradient(120% 120% at 30% 25%, rgba(255,255,255,0.4), transparent 60%),
    linear-gradient(135deg, #8b6443 0%, #5a3d24 50%, #2e1d0f 100%);
}
.video-tile.tone-tobacco .video-tile__meta,
.video-tile.tone-chestnut .video-tile__meta { color: #FAF7F0; }
.video-tile__poster img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.video-tile__play {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  z-index: 2;
}
.video-tile__play svg {
  width: 56px;
  height: 56px;
  background: rgba(28,23,20,0.55);
  color: #FAF7F0;
  padding: 14px;
  border-radius: 999px;
  backdrop-filter: blur(2px);
  transition: background var(--t-base), transform var(--t-fast);
}
.video-tile:hover .video-tile__play svg { background: rgba(28,23,20,0.85); transform: scale(1.05); }
.video-tile__meta {
  position: absolute;
  left: 1rem;
  right: 1rem;
  bottom: 0.95rem;
  z-index: 3;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  color: #FAF7F0;
  text-shadow: 0 1px 2px rgba(0,0,0,0.4);
}
.video-tile__title {
  font-family: var(--font-display);
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
}
.video-tile__duration {
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  opacity: 0.85;
}
.video-tile.is-placeholder .video-tile__play svg {
  background: rgba(28,23,20,0.25);
}
.video-tile.is-placeholder::before {
  content: 'Filming soon';
  position: absolute;
  top: 0.85rem;
  right: 0.85rem;
  z-index: 3;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.85);
  background: rgba(28,23,20,0.45);
  padding: 0.35rem 0.7rem;
  border-radius: 999px;
}

/* video-tile blurb caption beneath the tile */
.video-card { display: grid; gap: 0.6rem; }
.video-card__blurb {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  line-height: 1.5;
  max-width: 38ch;
}

/* ─── care-page video grid ─── */
.care-videos {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 2rem 1.5rem;
}
@media (max-width: 720px) {
  .care-videos { grid-template-columns: 1fr; }
}

/* ─── about-page hero film ─── */
.about-film { display: grid; gap: 1.25rem; max-width: 760px; }
.about-film__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.85rem, 3.4vw, 2.6rem);
  letter-spacing: -0.018em;
  line-height: 1.1;
  margin-bottom: 0.25rem;
}
.about-film__caption {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-md);
  color: var(--ink-muted);
}

/* ─── studio.html (gallery page) ─── */
.studio-section { padding: 4rem 0 3rem; }
.studio-section + .studio-section { border-top: 1px solid var(--line); }
.studio-section__head {
  display: grid;
  gap: 0.6rem;
  margin-bottom: 2.25rem;
  max-width: 600px;
}
.studio-section__head h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.85rem, 3.4vw, 2.6rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
}
.studio-section__head p {
  font-family: var(--font-body);
  font-size: var(--fs-md);
  color: var(--ink-muted);
  line-height: 1.55;
}

.studio-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.25rem;
}
@media (max-width: 980px) { .studio-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .studio-grid { grid-template-columns: 1fr; } }

.studio-card {
  position: relative;
  aspect-ratio: 4 / 5;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
  display: grid;
}
.studio-card.is-tall { aspect-ratio: 3 / 4; }
.studio-card img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.studio-card__caption {
  position: absolute;
  left: 1rem;
  right: 1rem;
  bottom: 1rem;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #FAF7F0;
  text-shadow: 0 1px 3px rgba(0,0,0,0.4);
  display: flex;
  justify-content: space-between;
  gap: 1rem;
}

/* honest empty state — never "coming soon" theatre */
.studio-empty {
  border: 1px dashed var(--line);
  border-radius: var(--r-lg);
  padding: clamp(2.5rem, 6vw, 4.5rem) clamp(1.5rem, 4vw, 3rem);
  display: grid;
  gap: 1rem;
  text-align: left;
  max-width: 720px;
  background: linear-gradient(180deg, var(--surface) 0%, var(--bg) 100%);
}
.studio-empty__title {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-lg);
  color: var(--ink);
  letter-spacing: -0.005em;
}
.studio-empty__copy {
  font-family: var(--font-body);
  font-size: var(--fs-md);
  color: var(--ink-muted);
  line-height: 1.55;
}
.studio-empty__cta { margin-top: 0.4rem; }

/* In-real-homes specific — slightly looser, more editorial spacing */
.studio-grid--in-homes .studio-card { aspect-ratio: 4 / 5; }
.studio-grid--in-homes .studio-card:nth-child(3n+1) { aspect-ratio: 4 / 6; }
.studio-grid--in-homes .studio-card__product {
  position: absolute;
  top: 1rem;
  left: 1rem;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.04em;
  background: rgba(28,23,20,0.55);
  color: #FAF7F0;
  padding: 0.3rem 0.65rem;
  border-radius: 999px;
  text-decoration: none;
  backdrop-filter: blur(2px);
}

/* ─── press list (atelier discipline — no logo carousel) ─── */
.press-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 0;
}
.press-item {
  display: grid;
  grid-template-columns: minmax(140px, 180px) 1fr minmax(120px, auto);
  gap: 1.5rem 2rem;
  padding: clamp(1.5rem, 3vw, 2.25rem) 0;
  border-bottom: 1px solid var(--line);
  align-items: baseline;
}
.press-item:last-child { border-bottom: 0; }
.press-item__outlet {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-md);
  color: var(--ink);
  letter-spacing: -0.005em;
}
.press-item__title {
  font-family: var(--font-body);
  font-size: var(--fs-md);
  line-height: 1.45;
  color: var(--ink);
}
.press-item__title a {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px solid var(--line);
  padding-bottom: 0.1rem;
  transition: border-color var(--t-base);
}
.press-item__title a:hover { border-bottom-color: var(--ink); }
.press-item__date {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-muted);
  text-align: right;
}
.press-item__pull {
  grid-column: 1 / -1;
  margin-top: 0.75rem;
  padding: 0.75rem 0 0 1rem;
  border-left: 2px solid var(--line);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-md);
  color: var(--ink-muted);
  line-height: 1.55;
  max-width: 65ch;
}
@media (max-width: 720px) {
  .press-item { grid-template-columns: 1fr; gap: 0.4rem; }
  .press-item__date { text-align: left; }
}

/* ─── journal list (atelier alternative to lookbook) ─── */
.journal-list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 2.5rem 1.75rem;
}
.journal-card {
  display: grid;
  gap: 1rem;
  text-decoration: none;
  color: inherit;
  transition: transform var(--t-fast);
}
.journal-card:hover { transform: translateY(-2px); }
.journal-card__media {
  aspect-ratio: 4 / 5;
  overflow: hidden;
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line);
}
.journal-card__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--t-slow);
}
.journal-card:hover .journal-card__media img { transform: scale(1.025); }
.journal-card__meta {
  display: flex;
  justify-content: space-between;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-muted);
}
.journal-card__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.25rem, 1.8vw, 1.55rem);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--ink);
}
.journal-card__lede {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  line-height: 1.55;
  max-width: 40ch;
}

/* ─── PDP inline media-gallery video tile (Article-pattern) ─── */
.pdp__gallery .pdp__main-img.is-video {
  position: relative;
  cursor: pointer;
  overflow: hidden;
}
.pdp__gallery .pdp__main-img.is-video::after {
  content: '';
  position: absolute;
  inset: 0;
  background: rgba(28,23,20,0.18);
  pointer-events: none;
}
.pdp__gallery .pdp__main-img.is-video .pdp-video-play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 64px;
  height: 64px;
  display: grid;
  place-items: center;
  background: rgba(28,23,20,0.6);
  color: #FAF7F0;
  border-radius: 999px;
  z-index: 2;
  pointer-events: none;
}
.pdp__gallery .pdp__main-img.is-video .pdp-video-play svg { width: 26px; height: 26px; }

/* video thumb in the thumb strip — show a small play overlay */
.pdp__thumb.is-video { position: relative; }
.pdp__thumb.is-video::before {
  content: '';
  position: absolute;
  inset: 0;
  background: rgba(28,23,20,0.18);
  border-radius: inherit;
  pointer-events: none;
}
.pdp__thumb.is-video::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 22px;
  height: 22px;
  margin: -11px 0 0 -11px;
  background: rgba(28,23,20,0.7);
  border-radius: 999px;
  z-index: 1;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23FAF7F0'><path d='M8 5.5v13l11-6.5-11-6.5Z'/></svg>");
  background-size: 14px;
  background-repeat: no-repeat;
  background-position: 53% center;
}

/* ─── PDP "in real homes" strip — UGC pulled from social.js ─── */
.pdp-irh {
  margin-top: clamp(3rem, 5vw, 4.5rem);
  padding-top: clamp(2.5rem, 4vw, 3.5rem);
  border-top: 1px solid var(--line);
}
.pdp-irh__head {
  display: grid;
  gap: 0.4rem;
  margin-bottom: 2rem;
  max-width: 600px;
}
.pdp-irh__head h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.85rem, 3.2vw, 2.4rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
}
.pdp-irh__head p {
  font-family: var(--font-body);
  font-size: var(--fs-md);
  color: var(--ink-muted);
}
.pdp-irh__strip {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}
@media (max-width: 720px) {
  .pdp-irh__strip { grid-template-columns: repeat(2, 1fr); }
}
.pdp-irh__card {
  position: relative;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface);
}
.pdp-irh__card img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.pdp-irh__caption {
  position: absolute;
  left: 0.85rem;
  right: 0.85rem;
  bottom: 0.85rem;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #FAF7F0;
  text-shadow: 0 1px 3px rgba(0,0,0,0.4);
  display: flex;
  justify-content: space-between;
  gap: 0.75rem;
}
.pdp-irh__more {
  margin-top: 1.5rem;
}

/* ─── PDP reviews-with-photos (atelier discipline — quiet, below fold) ─── */
.pdp-reviews {
  margin-top: clamp(3rem, 5vw, 4.5rem);
  padding-top: clamp(2.5rem, 4vw, 3.5rem);
  border-top: 1px solid var(--line);
}
.pdp-reviews__head {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 1.5rem 2rem;
  align-items: end;
  margin-bottom: 2rem;
}
.pdp-reviews__head h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.85rem, 3.2vw, 2.4rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
}
.pdp-reviews__avg {
  text-align: right;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  letter-spacing: 0.04em;
}
.pdp-reviews__avg strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-xl);
  color: var(--ink);
  letter-spacing: -0.015em;
}
.pdp-reviews__list {
  display: grid;
  gap: 0;
}
.pdp-review {
  display: grid;
  grid-template-columns: minmax(80px, 100px) 1fr;
  gap: 1.5rem 2rem;
  padding: clamp(1.5rem, 3vw, 2.25rem) 0;
  border-bottom: 1px solid var(--line);
}
.pdp-review:last-child { border-bottom: 0; }
.pdp-review__photo {
  aspect-ratio: 1 / 1;
  border-radius: var(--r);
  overflow: hidden;
  background: var(--surface);
  border: 1px solid var(--line);
}
.pdp-review__photo img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.pdp-review__body { display: grid; gap: 0.6rem; }
.pdp-review__meta {
  display: flex;
  gap: 1rem;
  align-items: center;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-muted);
}
.pdp-review__stars {
  letter-spacing: 0.1em;
  color: var(--ink);
  font-size: 0.85rem;
}
.pdp-review__title {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-md);
  color: var(--ink);
  line-height: 1.35;
}
.pdp-review__copy {
  font-family: var(--font-body);
  font-size: var(--fs-base);
  color: var(--ink);
  line-height: 1.55;
  max-width: 60ch;
}
.pdp-review__author {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--ink-muted);
}
@media (max-width: 720px) {
  .pdp-review { grid-template-columns: 1fr; gap: 0.85rem; }
  .pdp-review__photo { max-width: 140px; }
  .pdp-reviews__head { grid-template-columns: 1fr; }
  .pdp-reviews__avg { text-align: left; }
}

/* contact-page social-find block */
.contact-find {
  display: grid;
  gap: 0.6rem;
}
.contact-find__label {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-md);
  color: var(--ink-muted);
}
.contact-find .social-cluster {
  display: inline-flex;
  gap: 0.85rem;
  align-items: center;
}
.contact-find .social-cluster .social-icon {
  width: 32px;
  height: 32px;
  display: grid;
  place-items: center;
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 999px;
  transition: background var(--t-base), color var(--t-base), border-color var(--t-base);
}
.contact-find .social-cluster .social-icon svg { width: 18px; height: 18px; }
.contact-find .social-cluster a.social-icon:hover {
  background: var(--ink);
  color: var(--bg);
  border-color: var(--ink);
}
.contact-find .social-cluster .social-icon.is-placeholder {
  color: var(--ink-soft);
  border-style: dashed;
  cursor: default;
}

/* ─────────────────────────────────────────────────────────────────────
   Spec drawing — Vitra-register technical drawings on the PDP.
   Pure black hairline on warm-paper background.
   2026-05-11 added (death-march imagery refinement).
   ───────────────────────────────────────────────────────────────────── */

.pdp-spec {
  margin-top: clamp(3rem, 6vw, 5rem);
  padding-top: clamp(2.5rem, 5vw, 4rem);
  border-top: 1px solid var(--line);
}
.pdp-spec__head { display: grid; gap: 0.65rem; margin-bottom: clamp(1.75rem, 3.5vw, 2.5rem); max-width: 36em; }
.pdp-spec__eyebrow {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--accent);
}
.pdp-spec__title { font-size: clamp(1.6rem, 3vw, var(--fs-2xl)); }
.pdp-spec__lede  { color: var(--ink-muted); font-size: var(--fs-md); max-width: 38em; line-height: 1.55; }
.pdp-spec__drawing {
  background: #FCFAF3;                     /* warm paper */
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: clamp(1.5rem, 3vw, 2.5rem);
  color: #1C1714;                          /* INK — diagrams use currentColor */
}
.diagram-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(1rem, 2.5vw, 2rem);
  align-items: center;
}
.diagram-row svg {
  width: 100%; height: auto;
  max-height: 320px;
}
.diagram-cell {
  display: grid;
  gap: 0.6rem;
  justify-items: center;
}
.diagram-cell--wide { grid-column: 1 / -1; }
.diagram-cell__label {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
@media (max-width: 720px) {
  .diagram-row { grid-template-columns: 1fr; gap: 1.5rem; }
  .diagram-cell--wide { grid-column: auto; }
}

/* PDP gallery — main image + 4-thumb strip — bind to product photography */
.pdp__main-img.has-photo,
.pdp__thumb.has-photo {
  background: var(--surface);
  position: relative;
  overflow: hidden;
}
.pdp__main-img.has-photo > img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.pdp__thumb {
  position: relative;
  aspect-ratio: 16 / 9; /* match .pdp__main-img so the thumb shows the same framing */
  padding: 0;          /* kill inherited button padding that inset + cropped the photo */
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  overflow: hidden;
  cursor: pointer;
  transition: border-color var(--t-fast);
}
.pdp__thumb.has-photo > img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.pdp__thumb[aria-selected="true"] {
  border-color: var(--ink);
  box-shadow: 0 0 0 1px var(--ink);
}
.pdp__thumb:hover { border-color: var(--ink-muted); }

/* Cart row media — bound to product hero on cart page */
.cart-row__media.has-photo {
  background: var(--surface);
  overflow: hidden;
  border-radius: var(--r);
}
.cart-row__media.has-photo > img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}

/* Tile media — bound to product hero on shop / search / clearance */
.tile__media.has-photo {
  background: var(--surface);
  overflow: hidden;
}
.tile__media.has-photo > img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--t-base);
}
.tile:hover .tile__media.has-photo > img {
  transform: scale(1.03);
}

/* Variants strip — give the SVG silhouettes more breathing room and a
   centered baseline so the size differences read at a glance */
.pdp-variant__icon svg {
  width: 100%; height: auto;
  max-height: 80px;
  display: block;
  margin: 0 auto;
}

/* ─────────────────────────────────────────────────────────────────────
   Trade mode (added 2026-05-11)
   Subheader strip + "Building for:" picker + trade pages.
   Only present when SOFASTUDIO_TRADE.isTrade() returns true; injected
   by assets/trade.js. Visual register: quiet, slightly recessed strip
   directly under the main site header.
   ───────────────────────────────────────────────────────────────────── */

.trade-subheader {
  position: relative;
  background: #F2EDDF;                                        /* warm paper, one step deeper than surface */
  border-bottom: 1px solid var(--line);
  font-family: var(--font-ui, var(--font-body));
  font-size: var(--fs-sm);
  z-index: 70;
}
.trade-subheader__row {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  padding: 0.5rem 0;
  min-height: 44px;
}
.trade-subheader__badge {
  display: inline-flex;
  align-items: center;
  height: 22px;
  padding: 0 0.55rem;
  background: var(--ink);
  color: var(--bg);
  border-radius: 4px;
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 600;
  flex-shrink: 0;
}
.trade-subheader__nav {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  margin: 0;
  padding: 0;
  list-style: none;
  flex-wrap: wrap;
}
.trade-subheader__nav a {
  color: var(--ink-muted);
  text-decoration: none;
  padding: 0.25rem 0;
  border-bottom: 1px solid transparent;
  transition: color var(--t-base), border-color var(--t-base);
  white-space: nowrap;
}
.trade-subheader__nav a:hover { color: var(--ink); }
.trade-subheader__nav a[aria-current="page"] {
  color: var(--ink);
  border-bottom-color: var(--ink);
}
.trade-subheader__picker {
  margin-left: auto;
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.6rem;
  flex-shrink: 0;
}
.trade-subheader__picker-label {
  color: var(--ink-muted);
  font-size: var(--fs-xs);
  letter-spacing: 0.01em;
  white-space: nowrap;
}
.trade-subheader__picker-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.3rem 0.7rem;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: 999px;
  font: inherit;
  color: var(--ink);
  cursor: pointer;
  transition: border-color var(--t-base), background var(--t-base);
  max-width: 22rem;
}
.trade-subheader__picker-btn:hover { border-color: var(--ink-soft); }
.trade-subheader__picker-btn[aria-expanded="true"] { border-color: var(--ink); }
.trade-subheader__picker-btn > span[data-picker-current] {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 12rem;
}
.trade-subheader__picker-count {
  display: inline-grid;
  place-items: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  background: var(--ink);
  color: var(--bg);
  border-radius: 999px;
  font-size: 11px;
  font-weight: 600;
  line-height: 1;
}
.trade-subheader__picker-menu {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  min-width: 320px;
  max-width: 380px;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: var(--r-md, 8px);
  box-shadow: 0 18px 40px rgba(0,0,0,0.08);
  padding: 0.4rem;
  display: grid;
  gap: 2px;
  z-index: 200;
}
.trade-subheader__picker-menu .picker-item {
  display: grid;
  gap: 2px;
  padding: 0.55rem 0.7rem;
  background: transparent;
  border: 0;
  border-radius: var(--r-sm, 6px);
  text-align: left;
  cursor: pointer;
  color: var(--ink);
  text-decoration: none;
  font: inherit;
}
.trade-subheader__picker-menu .picker-item:hover { background: var(--surface); }
.trade-subheader__picker-menu .picker-item.is-active { background: #F4EBD2; }
.trade-subheader__picker-menu .picker-item.is-active strong { color: var(--ink); }
.trade-subheader__picker-menu .picker-item__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
}
.trade-subheader__picker-menu .picker-item strong { font-weight: 600; }
.trade-subheader__picker-menu .picker-item__badge {
  font-size: 11px;
  color: var(--ink-muted);
  font-weight: 500;
  white-space: nowrap;
}
.trade-subheader__picker-menu .picker-item__note {
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  line-height: 1.35;
}
.trade-subheader__picker-menu .picker-item--new {
  border-top: 1px solid var(--line);
  margin-top: 0.25rem;
  padding-top: 0.6rem;
  color: var(--ink);
  font-weight: 500;
}

@media (max-width: 720px) {
  .trade-subheader__row {
    flex-wrap: wrap;
    gap: 0.75rem;
  }
  .trade-subheader__nav { order: 3; width: 100%; gap: 1rem; }
  .trade-subheader__picker { order: 2; margin-left: auto; }
  .trade-subheader__picker-btn { max-width: 16rem; }
  .trade-subheader__picker-menu { right: -1rem; min-width: 280px; }
}

/* ─── Trade pages — shared shell (clients, orders, resources) ─── */

.trade-page-head {
  padding-top: clamp(2rem, 4vw, 3rem);
  padding-bottom: clamp(1.5rem, 3vw, 2rem);
}
.trade-page-head h1 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(2rem, 3.6vw, 2.6rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
  margin-bottom: 0.4rem;
}
.trade-page-head .muted { color: var(--ink-muted); font-size: var(--fs-md); }

.trade-tabs {
  display: flex;
  gap: 1.25rem;
  border-bottom: 1px solid var(--line);
  margin-bottom: 1.5rem;
}
.trade-tabs a {
  padding: 0.6rem 0;
  color: var(--ink-muted);
  text-decoration: none;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  font-size: var(--fs-sm);
  transition: color var(--t-base), border-color var(--t-base);
}
.trade-tabs a:hover { color: var(--ink); }
.trade-tabs a[aria-current="page"] {
  color: var(--ink);
  border-bottom-color: var(--ink);
  font-weight: 500;
}

/* ─── client list grid ─── */
.client-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 1rem;
}
.client-card {
  display: grid;
  gap: 0.55rem;
  padding: 1.1rem 1.15rem;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: var(--r-md, 8px);
  text-decoration: none;
  color: var(--ink);
  transition: border-color var(--t-base), transform var(--t-fast);
}
.client-card:hover { border-color: var(--ink-soft); transform: translateY(-1px); }
.client-card__name { font-weight: 600; font-size: var(--fs-md); line-height: 1.2; }
.client-card__contact { color: var(--ink-muted); font-size: var(--fs-xs); }
.client-card__notes {
  color: var(--ink-muted);
  font-size: var(--fs-sm);
  line-height: 1.4;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.client-card__stats {
  display: flex;
  gap: 0.85rem;
  flex-wrap: wrap;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  border-top: 1px solid var(--line);
  padding-top: 0.6rem;
  margin-top: 0.25rem;
}
.client-card__stat strong { color: var(--ink); font-weight: 600; }
.client-card.is-active-pick {
  border-color: var(--ink);
  box-shadow: 0 0 0 2px rgba(28,23,20,0.04);
}

.client-actions-row {
  display: flex;
  gap: 0.5rem;
  margin-top: 0.4rem;
}
.client-actions-row .btn-line { font-size: var(--fs-xs); }

/* ─── new-client modal ─── */
.trade-modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(28,23,20,0.4);
  display: grid;
  place-items: center;
  z-index: 300;
  padding: 1rem;
}
.trade-modal-backdrop[hidden] { display: none; }
.trade-modal {
  width: 100%;
  max-width: 480px;
  background: var(--bg);
  border-radius: var(--r-lg, 12px);
  padding: 1.5rem;
  box-shadow: 0 24px 60px rgba(0,0,0,0.2);
}
.trade-modal h3 { margin-bottom: 0.4rem; font-family: var(--font-display); font-weight: 400; font-size: 1.4rem; }
.trade-modal .muted { color: var(--ink-muted); font-size: var(--fs-sm); margin-bottom: 1rem; }
.trade-modal .field { margin-bottom: 0.75rem; }
.trade-modal .field-label { font-size: var(--fs-xs); color: var(--ink-muted); margin-bottom: 0.25rem; display: block; }
.trade-modal .input,
.trade-modal .textarea {
  width: 100%;
  border: 1px solid var(--line);
  border-radius: var(--r-sm, 6px);
  padding: 0.5rem 0.75rem;
  font: inherit;
  background: var(--bg);
}
.trade-modal__actions {
  display: flex;
  gap: 0.5rem;
  justify-content: flex-end;
  margin-top: 1rem;
}

/* ─── trade orders list ─── */
.trade-order-list { display: grid; gap: 0.75rem; }
.trade-order-row {
  display: grid;
  grid-template-columns: 72px 1fr auto;
  gap: 1rem;
  align-items: center;
  padding: 1rem 1.15rem;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: var(--r-md, 8px);
  text-decoration: none;
  color: var(--ink);
  transition: border-color var(--t-base);
}
.trade-order-row:hover { border-color: var(--ink-soft); }
.trade-order-row__media {
  width: 72px;
  height: 72px;
  border-radius: var(--r-sm, 6px);
  background: var(--surface);
  display: grid;
  place-items: center;
  color: var(--ink-soft);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  overflow: hidden;
}
.trade-order-row__title { font-weight: 600; }
.trade-order-row__meta { color: var(--ink-muted); font-size: var(--fs-sm); margin-top: 0.15rem; }
.trade-order-row__tag {
  display: inline-block;
  margin-top: 0.4rem;
  font-size: 11px;
  color: var(--ink-muted);
  background: var(--surface);
  padding: 0.15rem 0.5rem;
  border-radius: 999px;
}
.trade-order-row__price {
  text-align: right;
  font-weight: 600;
}
.trade-order-row__price small {
  display: block;
  font-weight: 400;
  color: var(--ink-muted);
  font-size: var(--fs-xs);
}
.status-pill {
  display: inline-block;
  font-size: 11px;
  padding: 0.18rem 0.55rem;
  border-radius: 999px;
  font-weight: 600;
  letter-spacing: 0.02em;
}
.status-pill--in-production { background: #F4EBD2; color: #6E5526; }
.status-pill--dispatched    { background: #DCE9D8; color: #2E5326; }
.status-pill--delivered     { background: var(--surface); color: var(--ink-muted); }

/* ─── trade filter bar ─── */
.trade-filter-bar {
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
  margin-bottom: 1rem;
}
.trade-filter-bar select,
.trade-filter-bar input {
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 0.35rem 0.85rem;
  background: var(--bg);
  font: inherit;
  color: var(--ink);
  font-size: var(--fs-sm);
}

/* ─── trade resources page ─── */
.trade-resource-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 1rem;
}
.trade-resource {
  padding: 1.25rem 1.35rem;
  border: 1px solid var(--line);
  border-radius: var(--r-md, 8px);
  background: var(--bg);
}
.trade-resource h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 1.1rem;
  margin-bottom: 0.4rem;
}
.trade-resource p {
  color: var(--ink-muted);
  font-size: var(--fs-sm);
  line-height: 1.5;
  margin-bottom: 0.75rem;
}
.tier-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-sm);
  margin-top: 0.5rem;
}
.tier-table th, .tier-table td {
  text-align: left;
  padding: 0.55rem 0.4rem;
  border-bottom: 1px solid var(--line);
}
.tier-table th { color: var(--ink-muted); font-weight: 500; font-size: var(--fs-xs); }
.tier-table tr.is-yours td { background: #F4EBD2; }
.tier-table tr.is-yours td:first-child { font-weight: 600; }

/* ─── cart page "Building for:" header (trade only) ─── */
/* [hidden] must win over the flex display below — without this the "Building for" trade banner
   rendered for EVERY visitor, signed-out included (2026-09-05). */
.cart-trade-context[hidden] { display: none; }
.cart-trade-context {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.85rem 1.15rem;
  margin-bottom: 1.5rem;
  background: #F4EBD2;
  border: 1px solid #E0D4B0;
  border-radius: var(--r-md, 8px);
}
.cart-trade-context__label {
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-weight: 600;
}
.cart-trade-context__client { font-weight: 600; font-size: var(--fs-md); }
.cart-trade-context__address { color: var(--ink-muted); font-size: var(--fs-xs); margin-top: 0.15rem; }

/* Care-page poster fallback — when no youtubeId and a curated photo IS
   available, treat the tile as a lifestyle still rather than a tone gradient */
.video-tile.has-photo .video-tile__poster { opacity: 1; }
.video-tile.has-photo .video-tile__poster img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.video-tile.has-photo::before { display: none; }

/* About-film placeholder — when fallback poster is in, drop the tone gradient */
.video-tile.is-placeholder.has-photo {
  background: transparent;
}
.video-tile.is-placeholder.has-photo::before,
.video-tile.is-placeholder.has-photo::after { display: none; }

/* Trade-page hero image — quiet, generous, sits above the page-head */
.page-hero-image {
  margin: 0 auto clamp(2rem, 4vw, 3rem);
  max-width: var(--container);
  padding: 0 var(--gutter);
}
.page-hero-image img {
  width: 100%;
  aspect-ratio: 21 / 9;
  object-fit: cover;
  border-radius: var(--r-lg);
  display: block;
}
@media (max-width: 720px) {
  .page-hero-image img { aspect-ratio: 16 / 10; border-radius: var(--r); }
}

/* ─── consent banner (consent.js) ────────────────────────────────────
   Per Dave 2026-05-19: slim copy + two buttons (Customise, Accept(NN)).
   ~50% smaller dialogue width and padding vs prior; font + button size
   unchanged. Customise expands the panel inline (above the buttons),
   pauses the auto-accept countdown, and turns Accept into
   "Accept selection". Replaceable by Cookiebot CMP at any point. */
.ss-consent {
  position: fixed;
  left: 50%;
  bottom: clamp(0.75rem, 2vw, 1.25rem);
  transform: translateX(-50%);
  z-index: 9000;
  width: min(380px, calc(100vw - 1.5rem));   /* ~50% of prior 720px */
  background: var(--bg);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--shadow);
  padding: 0.7rem 0.85rem;                   /* compact; font kept same */
  font-size: var(--fs-sm);
  line-height: 1.5;
}
.ss-consent__text { margin: 0 0 0.6rem; color: var(--ink); }
.ss-consent__text a { color: var(--ink); text-decoration: underline; }
.ss-consent__choices {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 0.75rem;
  margin: 0 0 0.6rem;
  padding: 0.55rem 0.65rem;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
}
.ss-consent__choices[hidden] { display: none; }
.ss-consent__choices label {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
}
.ss-consent__choices label small {
  color: var(--ink-soft);
  font-size: 11px;
  margin-left: 0.15rem;
}
.ss-consent__buttons {
  display: flex;
  gap: 0.5rem;
  justify-content: flex-end;
  align-items: center;
}
.ss-consent .btn {
  padding: 0.5rem 0.9rem;
  font-size: var(--fs-xs);
}
.ss-consent__count {
  font-variant-numeric: tabular-nums;
  opacity: 0.85;
  margin-left: 0.15rem;
}
@media (max-width: 480px) {
  .ss-consent {
    width: calc(100vw - 1.25rem);
    padding: 0.65rem 0.75rem;
  }
  .ss-consent__buttons { justify-content: stretch; }
  .ss-consent__buttons .btn { flex: 1 1 auto; }
}

/* ─── clearance modal — detail popup with photo gallery, longer copy,
       and a zoom overlay. Added 2026-05-19 (Dave dump). ─── */
.clearance-tile { cursor: pointer; }
.clearance-tile:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; border-radius: var(--r); }

.clr-modal {
  position: fixed;
  inset: 0;
  z-index: 8500;
  display: grid;
  place-items: center;
  padding: clamp(1rem, 3vw, 2.5rem);
}
.clr-modal__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(28,23,20,0.55);
  backdrop-filter: blur(2px);
}
.clr-modal__panel {
  position: relative;
  z-index: 1;
  background: var(--bg);
  border-radius: var(--r-lg);
  max-width: 1080px;
  width: 100%;
  max-height: calc(100vh - clamp(2rem, 6vw, 5rem));
  overflow: hidden;
  box-shadow: var(--shadow-lg);
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
}
@media (max-width: 880px) {
  .clr-modal__panel { grid-template-columns: 1fr; max-height: 92vh; overflow-y: auto; }
}
.clr-modal__close {
  position: absolute;
  top: 0.75rem; right: 0.85rem;
  z-index: 3;
  width: 36px; height: 36px;
  display: grid; place-items: center;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: 999px;
  font-size: 22px;
  line-height: 1;
  color: var(--ink);
  cursor: pointer;
}
.clr-modal__close:hover { background: var(--hover); }

.clr-modal__gallery {
  display: grid;
  grid-template-rows: 1fr auto;
  gap: 0.5rem;
  background: var(--line-soft);
  padding: 0.5rem;
}
.clr-modal__hero {
  position: relative;
  width: 100%;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: var(--r);
  background: var(--line-soft);
  cursor: zoom-in;
  padding: 0;
}
.clr-modal__hero img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--t-slow);
}
.clr-modal__hero:hover img { transform: scale(1.02); }
.clr-modal__thumbs {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 0.4rem;
}
.clr-modal__thumb {
  padding: 0;
  border: 2px solid transparent;
  border-radius: var(--r-sm);
  overflow: hidden;
  aspect-ratio: 1;
  background: var(--line-soft);
  cursor: pointer;
}
.clr-modal__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.clr-modal__thumb.is-active { border-color: var(--ink); }
.clr-modal__thumb:hover { border-color: var(--ink-muted); }

.clr-modal__body {
  padding: clamp(1.25rem, 2.5vw, 2rem);
  overflow-y: auto;
  display: grid;
  align-content: start;
  gap: 0.55rem;
}
.clr-modal__head {
  display: flex;
  justify-content: space-between;
  gap: 0.75rem;
  align-items: flex-start;
}
.clr-modal__title {
  font-family: var(--font-display);
  font-size: clamp(1.6rem, 3vw, 2.2rem);
  letter-spacing: -0.018em;
  line-height: 1.06;
  margin: 0;
}
.clr-modal__meta { color: var(--ink-muted); font-size: var(--fs-sm); margin: 0; }
.clr-modal__price {
  font-family: var(--font-display);
  font-size: clamp(1.4rem, 2.4vw, 1.9rem);
  margin: 0.35rem 0;
}
.clr-modal__price .was {
  font-size: 0.7em;
  color: var(--ink-soft);
  text-decoration: line-through;
  margin-right: 0.5rem;
}
.clr-modal__note { color: var(--ink); font-size: var(--fs-sm); margin: 0.25rem 0 0; }
.clr-modal__details { color: var(--ink-muted); font-size: var(--fs-sm); margin: 0.4rem 0 0; line-height: 1.6; }

.clr-modal__dims,
.clr-modal__history {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.4rem 1rem;
  margin: 0.85rem 0 0;
  font-size: var(--fs-xs);
  border-top: 1px solid var(--line);
  padding-top: 0.65rem;
}
.clr-modal__dims div,
.clr-modal__history div {
  display: flex; justify-content: space-between;
  gap: 0.5rem;
  border-bottom: 1px dashed var(--line);
  padding-bottom: 0.25rem;
}
.clr-modal__dims dt,
.clr-modal__history dt { color: var(--ink-muted); }
.clr-modal__dims dd,
.clr-modal__history dd { color: var(--ink); margin: 0; }

.clr-modal__actions {
  display: flex;
  gap: 0.6rem;
  flex-wrap: wrap;
  margin-top: 1rem;
}

/* Zoom overlay above the modal */
.clr-zoom {
  position: fixed;
  inset: 0;
  z-index: 9000;
  background: rgba(0,0,0,0.92);
  display: grid;
  place-items: center;
  cursor: zoom-out;
  padding: clamp(1rem, 3vw, 3rem);
}
.clr-zoom img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  display: block;
}
.clr-zoom__close {
  position: absolute;
  top: 1rem; right: 1rem;
  width: 40px; height: 40px;
  display: grid; place-items: center;
  background: rgba(255,255,255,0.92);
  border: 0;
  border-radius: 999px;
  font-size: 24px;
  line-height: 1;
  color: var(--ink);
  cursor: pointer;
}

/* ─────────────────────────────────────────────────────────────────────────
   Leather guide page (/leather/) — sheet-driven. Tokens only, no ad-hoc values.
   2026-07-01 (D-083): restraint-first. ONE ranges table grouped into 3 price
   tiers (centred, click-to-enlarge swatches, no counts); minimal grade/finish
   explainers below. No accent-stripe field, no durability pips, no cons column.
   ───────────────────────────────────────────────────────────────────────── */

.leather-h   { margin-top: clamp(2.5rem, 6vw, 4rem); }

/* our ranges — ONE comparison table, grouped by price tier, all cells centred */
.leather-rtable-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--surface);
  box-shadow: var(--shadow-sm);
}
.leather-rtable {
  width: 100%;
  border-collapse: collapse;
  min-width: 700px;
  font-size: var(--fs-sm);
}
.leather-rtable thead th {
  text-align: center;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  padding: 1rem;
  border-bottom: 1px solid var(--line);
  white-space: nowrap;
  background: var(--bg);
}
.leather-rtable tbody tr:not(.leather-rtable__band) { transition: background var(--t-fast); }
.leather-rtable tbody tr:not(.leather-rtable__band):hover { background: var(--hover); }
.leather-rtable td,
.leather-rtable tbody th {
  padding: 1rem;
  border-top: 1px solid var(--line-soft);
  vertical-align: middle;
  text-align: center;
  font-weight: 400;
}
.leather-rtable__band th {
  text-align: center;
  background: var(--bg);
  color: var(--accent);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-xs);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  padding: 0.7rem 1rem;
  border-top: 1px solid var(--line);
}
.leather-rtable__range {
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  line-height: 1.1;
  color: var(--ink);
  white-space: nowrap;
}
.leather-rtable__wears { color: var(--ink); }
.leather-rtable__note {
  color: var(--ink-muted);
  max-width: 26em;
  margin: 0 auto;
  line-height: 1.5;
}
.leather-tag {
  display: inline-block;
  font-size: var(--fs-xs);
  letter-spacing: 0.02em;
  color: var(--accent);
  border: 1px solid var(--accent-soft);
  border-radius: var(--r-sm);
  padding: 0.12rem 0.5rem;
  white-space: nowrap;
}
.leather-dots { display: flex; flex-wrap: nowrap; gap: 6px; justify-content: center; margin: 0 auto; } /* 2026-07-08: all colours on one row, Dave directive -- was wrapping past 2 rows on 9-colour ranges */
.leather-dot {
  width: 18px; height: 18px; border-radius: 50%;
  border: 1px solid rgba(0,0,0,0.1);
  box-shadow: var(--shadow-sm);
  padding: 0;
  cursor: pointer;
  transition: transform var(--t-fast);
}
.leather-dot:hover { transform: scale(1.2); }
.leather-dot:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.leather-cta { margin-top: 1.75rem; text-align: center; }
.leather-cta .btn { white-space: normal; }
.leather-swatch-modal {
  position: fixed; inset: 0; z-index: 1000;
  display: flex; align-items: center; justify-content: center;
  background: rgba(28,23,20,0.55);
  padding: 2rem;
}
.leather-swatch-modal[hidden] { display: none; }
.leather-swatch-modal__inner {
  background: var(--surface);
  border-radius: var(--r-lg);
  padding: 1.5rem;
  box-shadow: var(--shadow-lg);
  text-align: center;
  margin: 0;
}
.leather-swatch-modal__chip {
  display: block;
  width: min(70vw, 320px);
  height: min(70vw, 320px);
  border-radius: var(--r);
  border: 1px solid var(--line);
}
.leather-swatch-modal__name {
  margin-top: 1rem;
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  color: var(--ink);
}
.leather-swatch-modal__close {
  position: absolute; top: 1.25rem; right: 1.5rem;
  background: none; border: 0;
  color: var(--bg); font-size: 2rem; line-height: 1;
  cursor: pointer;
}
.leather-explain { margin-top: clamp(2rem, 5vw, 3.25rem); }
/* Dave 2026-07-07: Interior Design tab intro — centred narrow text block,
   same pattern as the other coverings panels' short intros. */
.cov-design { max-width: 640px; margin-left: auto; margin-right: auto; text-align: center; }
/* Dave 2026-07-07: Interior Design advice/trade sub-toggle — reuses the same
   pill component, just smaller margins since it's nested in a panel, not the
   page hero. */
.cov-switch.cov-subswitch { margin: -55px auto 1.75rem; } /* Dave 2026-07-07: raised — halves the gap to the main pillbox. Chained selector so it beats the later, equal-specificity base .cov-switch rule regardless of source order. */
.cov-design__view[hidden] { display: none; }
.cov-design p { color: var(--ink-muted); }
.leather-explain__title {
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  margin-bottom: 0.9rem;
  text-align: center;
}
.leather-tiles {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 1rem;
}
.leather-tile { margin: 0; text-align: center; }
.leather-tile__art {
  border-radius: var(--r);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  border: 1px solid var(--line);
  background: var(--surface);
}
.leather-tile__art svg { display: block; width: 100%; height: auto; }
.leather-tile__art img { display: block; width: 100%; height: auto; aspect-ratio: 170 / 120; object-fit: cover; }
.leather-tile figcaption { padding-top: 0.6rem; }
.leather-tile__name { display: block; font-weight: 600; color: var(--ink); font-size: var(--fs-sm); }
.leather-tile__note { display: block; color: var(--ink-muted); font-size: var(--fs-xs); margin-top: 0.15rem; line-height: 1.35; }
.leather-tile__flag { display: inline-block; margin-top: 0.3rem; font-size: var(--fs-xs); color: var(--ink-soft); letter-spacing: 0.02em; }
.leather-tile.is-quiet .leather-tile__art { opacity: 0.5; }
.leather-tile.is-quiet .leather-tile__name { color: var(--ink-muted); font-weight: 500; }
.leather-anchor {
  text-align: center;
  max-width: 46ch;
  margin: clamp(1.5rem, 4vw, 2.5rem) auto 0;
  font-family: var(--font-display);
  font-size: var(--fs-md);
  line-height: 1.4;
  color: var(--ink);
}

/* ═══════════════════════════════════════════════════════════════════════════
   HOME HIERARCHY REWORK — 2026-07-02
   King-grammar product monuments · plaque system (kicker→name→line→one CTA) ·
   label type tier · 100vw scrollbar-bug fix · section rhythm.
   One labeled cascade-final block; consolidate into base blocks at next pass.
   ═══════════════════════════════════════════════════════════════════════════ */
:root {
  --fs-label: 0.8125rem;               /* 13px — kicker/label tier */
  --ls-label: 0.18em;                  /* label tracking (refs run .14–.2em) */
  --section-pad: clamp(4rem, 8vw, 7rem);
}

/* label/kicker — the structural glue tier every reference uses */
.kicker {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-label);
  font-weight: 500;
  letter-spacing: var(--ls-label);
  text-transform: uppercase;
  color: var(--accent);
}

/* 100vw scrollbar bug fix — full-bleed = true 100%, no 6px shift */
.full-bleed {
  width: 100%;
  left: 0; right: 0;
  margin-left: 0; margin-right: 0;
  max-width: none;
}
.home-hero {
  width: 100%;
  margin-left: 0;
  transform: none;
  margin-bottom: 0;                    /* panes butt to hero — zero-gap stack */
}

/* hero restraint pass — image leads, type recedes, ONE decision */
.home-hero__kicker { margin-bottom: 0.9rem; color: rgba(255,255,255,0.85); }
.home-hero__title { font-size: clamp(2.75rem, 5vw, 4.25rem); }
.home-hero__sub {
  font-size: clamp(1.05rem, 1.4vw, 1.25rem);
  line-height: 1.55;
  color: rgba(255,255,255,0.9);
  max-width: 52ch;
}

/* product monuments — full-viewport pane, centred plaque, parallax window */
.product-block__media {
  aspect-ratio: auto;
  height: clamp(560px, 88svh, 940px);
  max-height: none;
}
.product-block__media.has-photo > img {
  /* r4: WIDTH-fit — the full image width (sofa incl. arms + baked margins) is
     always visible; the 4:3 aspect vs the wide pane creates a natural vertical
     overhang that the scroll parallax travels through. cover-fit + narrow pane
     was amputating the arms (Dave catch 2026-07-02). */
  inset: auto;
  left: 0;
  top: 50%;
  width: 100%;
  height: auto;
  object-fit: unset;
  transform: translateY(-50%);
  will-change: transform;
  transition: none;
}
.product-block__media::after,
.product-block__media.has-photo::after {
  background: linear-gradient(180deg,
    rgba(28,23,20,0) 42%, rgba(28,23,20,0.22) 68%, rgba(28,23,20,0.58) 100%);
}
.product-block__overlay {
  justify-content: flex-end;
  align-items: center;
  text-align: center;
  padding-bottom: clamp(2.5rem, 6vh, 4.5rem);
  gap: 1.1rem;
}
.product-block__copy { max-width: 44rem; }
.product-block__kicker { color: rgba(255,255,255,0.8); margin-bottom: 0.55rem; }
.product-block__title { font-size: clamp(2rem, 3.1vw, 2.7rem); }
.product-block__meta {
  font-size: var(--fs-base);
  color: rgba(255,255,255,0.85);
  margin-top: 0.5rem;
}
.product-block__cta { align-self: center; }

/* section rhythm — whitespace lives inside sections; hairlines join them */
.home-after-list {
  margin-top: clamp(1.75rem, 3vw, 2.5rem);
  margin-bottom: 0;
  padding-bottom: clamp(2.5rem, 5vw, 4rem);
}
.home-materials { border-top: 1px solid var(--line); padding: var(--section-pad) 0; }
.home-materials__head .kicker { margin-bottom: 0.75rem; }
.home-craft { padding: 0 0 var(--section-pad); }
.home-craft__copy .kicker { margin-bottom: 0.75rem; }
.home-trade .kicker { margin-bottom: 0.5rem; }

@media (prefers-reduced-motion: reduce) {
  .product-block__media.has-photo > img { height: 100%; top: 0; transform: none !important; }
}
@media (max-width: 720px) {
  .product-block__media { height: clamp(480px, 72svh, 640px); }
  .home-hero__title { font-size: clamp(2.3rem, 9vw, 3rem); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ROUND 2 — 2026-07-02 · Dave redlines
   B&B header behaviour (persistent · transparent-over-hero · condensing) ·
   B&B button grammar (squared, uppercase, tracked) · TRUE fixed-window panes
   (clip-path + position:fixed — the measured King mechanism) · shop head plaque.
   Cascade-final; supersedes the pane-image rules in the round-1 block above.
   ═══════════════════════════════════════════════════════════════════════════ */
:root { --ls-btn: 0.14em; }

/* — buttons: B&B grammar, our palette (site-wide) — */
.btn {
  border-radius: 0;
  text-transform: uppercase;
  font-size: var(--fs-label);
  letter-spacing: var(--ls-btn);
  font-weight: 500;
  padding: 0.85rem 1.7rem;
}
.product-block__cta { padding: 0.8rem 1.6rem; }   /* placement size; grammar from .btn .btn-accent */
.filter-pill { border-radius: 0; text-transform: uppercase; font-size: var(--fs-xs); letter-spacing: var(--ls-btn); }

/* — pane depth, take 3 (Dave r3 2026-07-02): bg-attachment:fixed retired —
     imperceptible on flat renders + main-thread paint. Final mechanism =
     scroll-driven translateY on a 175%-height img (see r1 rule above + the
     front-page parallax script). Measured King reference: image fully
     viewport-pinned (relative drop = 100% of scroll); ours runs ~33% within
     the 37.5% overhang budget. — */

/* — shop / category head: plaque grammar — */
.page-head--centered { padding: clamp(2.5rem, 5vw, 4rem) 0 clamp(1.5rem, 3vw, 2.25rem); }
.page-head--centered .kicker { margin-bottom: 0.6rem; }
.page-head--centered h1 { font-size: clamp(2.2rem, 3.6vw, 3rem); font-weight: 400; }
.page-head--centered .lede { font-size: var(--fs-md); color: var(--ink-muted); }
.page-head--centered .filter-row { justify-content: center; margin-top: 1.5rem; }

/* — round-3 (Dave 2026-07-02): monument panes get AIR — inset gallery, not
     edge-to-edge billboard. Cutout renders at full viewport width overwhelm;
     Jardan-style breathing frame + separation, King plaque + fixed-bg kept.
     Applies to home + category lists (shared .list-products). — */
/* r5 (Dave 2026-07-02): back to the King grammar — FULL-BLEED, ZERO-GAP tile
   stack. The subject-width problem is owned by the IMAGERY now (width-fit
   keeps the whole sofa; the 60-72% subject rule is met by wider-framed
   assets, not by insetting the pane). */
.list-products { padding: 0; gap: 0; }
.product-block__media { height: clamp(500px, 76svh, 840px); }
/* r5: 1440px monument cap removed — full-bleed per Dave */

/* — round-4 (Dave 2026-07-02): SPLIT-PANEL HERO (Jardan grammar) — photo + solid
     ink panel carrying the type. Cutout renders cannot hold white type reliably;
     the panel guarantees contrast and looks authored. Old .home-hero rules dormant. — */
.home-hero2 {
  display: grid;
  grid-template-columns: 3fr 2fr;
  min-height: clamp(540px, 82svh, 880px);
}
.home-hero2__media { position: relative; overflow: hidden; background: var(--line-soft); }
.home-hero2__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.home-hero2__panel {
  background: var(--ink);
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  gap: 1.1rem;
  padding: clamp(2.5rem, 4vw, 5rem);
}
.home-hero2__panel .kicker { color: var(--accent-soft); }
.home-hero2__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(2.5rem, 3.8vw, 3.6rem);
  line-height: 1.08;
  letter-spacing: -0.01em;
  color: #FFFFFF;
  text-wrap: balance;
}
.home-hero2__sub {
  font-size: clamp(1rem, 1.2vw, 1.15rem);
  line-height: 1.6;
  color: rgba(255,255,255,0.82);
  max-width: 38ch;
}
.home-hero2__cta { margin-top: 0.6rem; }
@media (max-width: 880px) {
  .home-hero2 { grid-template-columns: 1fr; }
  .home-hero2__media { min-height: 52svh; }
}

/* r4b: hero crop — the current composite render stacks three sofas; focus the
   frame on the lower (complete) composition until a dedicated hero asset exists */
.home-hero2__media img { object-position: center 82%; }

/* r4c: hero framing — zoom the composite render onto its bottom (complete) sofa;
   keeps the grey studio atmosphere, removes the floating-sofa clutter above.
   Interim until a dedicated single-subject hero asset ships. */
.home-hero2__media img {
  object-position: center bottom;
  transform: scale(1.45);
  transform-origin: 50% 92%;
}

/* r4d: plaque legibility on PALE renders — stronger, earlier scrim + soft text
   shadow; dark renders deepen only slightly. */
.product-block__media::after,
.product-block__media.has-photo::after {
  background: linear-gradient(180deg,
    rgba(28,23,20,0) 30%, rgba(28,23,20,0.28) 62%, rgba(28,23,20,0.74) 100%);
}
.product-block__copy, .product-block__copy .kicker { text-shadow: 0 1px 14px rgba(28,23,20,0.35); }

/* r4e: hero zoom +, kill the sliver of the upper sofa at pane top */
.home-hero2__media img { transform: scale(1.62); transform-origin: 50% 95%; }

/* r4f: plaque holds on WHITE renders — deeper scrim + crisper text shadow */
.product-block__media::after,
.product-block__media.has-photo::after {
  background: linear-gradient(180deg,
    rgba(28,23,20,0) 36%, rgba(28,23,20,0.38) 66%, rgba(28,23,20,0.84) 100%);
}
.product-block__copy, .product-block__copy .kicker {
  text-shadow: 0 1px 3px rgba(28,23,20,0.5), 0 2px 24px rgba(28,23,20,0.45);
}

/* r4g: scrim concentrated into the plaque zone — white plaque must hold on
   white renders (Brighton). Curve verified by eye on the palest pane. */
.product-block__media::after,
.product-block__media.has-photo::after {
  background: linear-gradient(180deg,
    rgba(28,23,20,0) 46%, rgba(28,23,20,0.5) 68%, rgba(28,23,20,0.92) 100%);
}

/* r5b: pin hero zoom to the true bottom edge — origin 95% left a white strip
   of pane background visible under the image (caught by eye) */
.home-hero2__media img { transform-origin: 50% 100%; transform: scale(1.62); }
/* hero framing: bias the crop to the dominant lower sofa of the composite */
.home-hero__media img { object-position: center 72%; }

/* r7b: hero copy legibility on the pale image zones (kicker sat unshadowed on
   the sofa back) — same shadow recipe as the pane plaques */
.home-hero__copy, .home-hero__copy .kicker {
  text-shadow: 0 1px 3px rgba(28,23,20,0.45), 0 2px 24px rgba(28,23,20,0.4);
}

/* r9b: hover-zoom bug — the legacy :hover scale(1.03) REPLACED the new
   translateY(-50%) centering (transforms are not additive), shoving the
   photo half out of the pane on shop-page tiles. Zoom retired; centering
   preserved on hover. */
.product-block:hover .product-block__media.has-photo > img { transform: translateY(-50%); }

/* Landing hero refinement — 2026-08-07. Centre the proposition and keep both
   primary landing actions together over the selected leather macro. */
/* Raised ~20% per Dave 2026-08-10 — copy sat too low/centered. */
.home-hero__copy {
  align-items: center;
  justify-content: center;
  padding-top: var(--header-h, 88px);
  padding-bottom: 0;
  text-align: center;
  transform: translateY(-16vh);
}
.home-hero__title,
.home-hero__sub { margin-left: auto; margin-right: auto; }
.home-hero__cta { justify-content: center; }
.home-hero__cta .home-hero__browse {
  border-color: rgba(255,255,255,0.82);
  color: #FFFFFF;
  background: rgba(28,23,20,0.18);
  backdrop-filter: blur(3px);
}
.home-hero__cta .home-hero__browse:hover {
  border-color: #FFFFFF;
  background: #FFFFFF;
  color: var(--ink);
}
@media (max-width: 600px) {
  .home-hero__copy { padding-top: var(--header-h, 72px); }
  .home-hero__cta { gap: 0.75rem; }
}

/* ─── Coverings page — Leather/Fabric slider + split finish columns ─── */
.cov-switch { max-width: 300px; margin: 1.5rem auto 0; }
.cov-panel[hidden] { display: none; }
.leather-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(1rem, 3vw, 2rem);
  align-items: start;
}
.leather-split .leather-rtable--split { min-width: 0; }
.leather-split .leather-rtable--split .leather-rtable__range { font-size: var(--fs-md); white-space: normal; }
.leather-split .leather-rtable--split td,
.leather-split .leather-rtable--split tbody th { padding: 0.8rem 0.7rem; }
.leather-split .leather-rtable--split .leather-rtable__note { max-width: 18em; }
.leather-col__cap {
  caption-side: top;
  text-align: center;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-sm);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--accent);
  padding: 0 0.2rem 0.6rem;
}
@media (max-width: 760px) {
  .leather-split { grid-template-columns: 1fr; gap: 2.25rem; }
}

/* ─── Coverings head — h1 removed; lede promoted to centred hero line ─── */
.cov-head {
  text-align: center;
  /* Dave 2026-07-07 (r4): heading + pillbox sit as one tight group (small
     fixed gap, not a huge flexible row). Bias above centre via asymmetric
     bottom padding: shift-up = padding-bottom / 2, so 28.57vh bottom padding
     raises the group ~1/7 (14.29vh) of the viewport height (Dave 2026-07-07 r5,
     up from the earlier 6vh/3vh bias). min-height/padding both transition so
     the group can animate up to a compact "docked" header once a tab is
     picked (.cov-head.is-docked, wired in the tab-select JS below). */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(1.25rem, 2.5vw, 1.75rem);
  min-height: calc(100svh - 4.9rem); /* 4.9rem = measured live header height (~78.5px) */
  padding: 0 0 57.14vh; /* Dave 2026-07-07 (r6): raised again by the same amount (another ~1/7 viewport height) */
  transition: min-height 825ms ease, padding 825ms ease; /* Dave 2026-07-07 (r6): +50% (was 550ms) */
}
.cov-head.is-docked {
  min-height: 0;
  padding: 2rem 0 1.5rem;
}
@media (prefers-reduced-motion: reduce) { .cov-head { transition: none; } }
.cov-head .lede {
  font-family: var(--font-display);
  font-size: clamp(1.92rem, 5.4vw, calc(var(--fs-2xl) * 1.2));
  line-height: 1.15;
  color: var(--ink);
  max-width: none;
  margin: 0;
}

/* ─── Coverings: unified hide diagram (restored 2026-07-07 — Dave: round-1 wrongly
   replaced the whole hide cross-section with the 3 bars; bars are the depth-range
   INDICATOR, drawn inline inside the SVG, not a stand-in for the diagram) ─── */
.cov-hide { margin: 0 auto; max-width: 900px; }
.cov-hide svg,
.cov-hide img { display: block; width: 100%; height: auto; }
.cov-hide .cov-hide__tall { display: none; }
@media (max-width: 640px) {
  .cov-hide .cov-hide__wide { display: none; }
  .cov-hide .cov-hide__tall { display: block; max-width: 420px; margin: 0 auto; }
}
.cov-fab-tiles { grid-template-columns: repeat(3, minmax(0, 1fr)); max-width: 780px; margin-left: auto; margin-right: auto; }
@media (max-width: 640px) { .cov-fab-tiles { grid-template-columns: 1fr; } }
.cov-cta-note { display: block; margin-top: 0.5rem; font-size: 0.78rem; color: var(--ink-soft); text-align: center; }
.leather-cta .btn[disabled] { opacity: 0.55; cursor: default; }
.leather-dot { position: relative; transition: transform 0.12s ease, box-shadow 0.12s ease; }
body.cov-ordering .leather-dot { box-shadow: 0 0 0 2px var(--bg), 0 0 0 3px var(--line); }
body.cov-ordering .leather-dot:hover { transform: scale(1.18); }
body.cov-ordering .leather-dot.is-sel { box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px var(--ink); transform: scale(1.1); }
body.cov-ordering .leather-dot.is-sel::after { content: "\2713"; position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 11px; text-shadow: 0 0 3px rgba(0, 0, 0, 0.55); }
.cov-orderbar { position: sticky; bottom: 14px; z-index: 40; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 1rem; background: var(--ink); color: var(--bg); border-radius: 999px; padding: 0.6rem 1.3rem; margin: 1.5rem auto 0; width: fit-content; max-width: 96%; box-shadow: 0 8px 28px rgba(0, 0, 0, 0.2); }
.cov-orderbar[hidden] { display: none; }
.cov-orderbar__credit { color: var(--accent-soft); font-size: 0.78rem; }
.cov-orderbar .btn { padding: 0.5rem 1.1rem; }
.cov-orderbar__cancel { background: none; border: none; color: var(--accent-soft); cursor: pointer; font-size: 0.8rem; }
.cov-orderbar__cancel:hover { color: var(--bg); }


/* ─── FAQ hub + how-it-works (2026-07-06) ─── */
.faq-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.2rem; max-width: 760px; margin: 0 auto 2.4rem; }
@media (max-width: 560px) { .faq-cards { grid-template-columns: 1fr; } }
.faq-card { display: block; background: var(--surface); border: 1px solid var(--line); border-radius: 12px; padding: 1.15rem 1.3rem; text-decoration: none; transition: border-color 0.15s ease, transform 0.15s ease; }
.faq-card:hover { border-color: var(--accent-soft); transform: translateY(-1px); }
.faq-card__name { display: block; font-family: var(--font-display); font-size: 1.15rem; color: var(--ink); }
.faq-card__note { display: block; margin-top: 0.2rem; font-size: 0.82rem; color: var(--ink-muted); }
.faq-group { max-width: 760px; margin: 0 auto 2.2rem; }
.faq-group__title { text-align: center; margin: 0 0 0.9rem; }
.hiw-steps { list-style: none; counter-reset: hiw; max-width: 640px; margin: 0 auto 2.6rem; padding: 0; }
.hiw-steps li { counter-increment: hiw; position: relative; padding: 0 0 1.6rem 3.4rem; }
.hiw-steps li::before { content: counter(hiw); position: absolute; left: 0; top: -0.2rem; width: 2.1rem; height: 2.1rem; border-radius: 50%; background: var(--ink); color: var(--bg); display: flex; align-items: center; justify-content: center; font-size: 0.85rem; font-weight: 600; }
.hiw-steps li::after { content: ""; position: absolute; left: 1.02rem; top: 2.1rem; bottom: 0.2rem; width: 1px; background: var(--line); }
.hiw-steps li:last-child::after { display: none; }
.hiw-steps__name { display: block; font-family: var(--font-display); font-size: 1.12rem; color: var(--ink); }
.hiw-steps__note { display: block; margin-top: 0.15rem; font-size: 0.86rem; color: var(--ink-muted); max-width: 44em; }

/* ─── Coverings slider expansion + dot tooltips (2026-07-06) ─── */
.leather-col__sub { display: block; font-family: var(--font-body); font-weight: 400; font-size: 0.72rem; letter-spacing: 0.02em; text-transform: none; color: var(--ink-muted); margin-top: 0.25rem; }
.leather-tile__spec { display: block; font-size: 0.72rem; color: var(--ink-soft); margin-top: 0.2rem; }
/* ─── Coverings switch: sliding segmented control (2026-07-06) ─── */
.cov-switch.segmented {
  position: relative;
  display: inline-flex;
  flex-wrap: nowrap;
  max-width: none;
  gap: 0;
  padding: 4px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  box-shadow: inset 0 1px 3px rgba(28, 23, 20, 0.05), var(--shadow-sm);
  /* Dave 2026-07-07 (r2): the +25% scale reduced by 20% nets to 1.0 (no-op) -> removed. */
}
.cov-switch.segmented button {
  position: relative;
  z-index: 1;
  border: 0;
  background: transparent;
  border-radius: 999px;
  padding: 0.62rem clamp(0.9rem, 2.5vw, 1.6rem);
  font-family: var(--font-body);
  /* Dave 2026-07-07 (r2): net +60% over var(--fs-sm) (was +100%, reduced by 20%). */
  font-size: calc(var(--fs-sm) * 1.6);
  font-weight: 500;
  letter-spacing: 0.01em;
  color: var(--ink-muted);
  white-space: nowrap;
  cursor: pointer;
  transition: color var(--t-base);
}
.cov-switch.segmented button:hover { color: var(--ink); border-color: transparent; background: transparent; }
.cov-switch.segmented button[aria-pressed="true"] { background: transparent; color: var(--bg); }
.cov-switch.segmented button:focus-visible { outline: 2px solid var(--accent-soft); outline-offset: 2px; }
.cov-switch__thumb {
  position: absolute;
  z-index: 0;
  top: 4px;
  bottom: 4px;
  left: 0;
  width: 0;
  border-radius: 999px;
  background: var(--ink);
  box-shadow: 0 2px 8px rgba(28, 23, 20, 0.28);
  transition: transform var(--t-base), width var(--t-base);
  will-change: transform, width;
}
@media (prefers-reduced-motion: reduce) {
  .cov-switch__thumb, .cov-switch.segmented button { transition: none; }
}
@media (max-width: 430px) {
  .cov-switch.segmented button { font-size: calc(var(--fs-xs) * 1.6); padding: 0.55rem 0.7rem; }
}
.leather-dot::before { content: attr(data-name); position: absolute; left: 50%; bottom: calc(100% + 9px); transform: translateX(-50%) translateY(4px) scale(0.96); background: var(--ink); color: var(--bg); font-family: var(--font-body); font-size: 0.72rem; font-weight: 500; letter-spacing: 0.02em; line-height: 1; padding: 0.38rem 0.62rem; border-radius: 999px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.16s ease, transform 0.16s ease; z-index: 30; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18); }
.leather-dot:hover::before, .leather-dot:focus-visible::before { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); }
@media (min-width: 761px) { .leather-rtable-wrap { overflow: visible; } }

/* ─── Coverings panel fade (Dave 2026-07-07 r2, replaces the slide) + 5-pill
   overflow safety (2026-07-06). ~0.5s total: 250ms fade-out the old panel, then
   250ms fade-in the new one (sequential, so only one panel ever occupies layout
   space — no double-stacking jump). */
.cov-fade-out { animation: covFadeOut 275ms ease forwards; } /* Dave 2026-07-07 (r6): +10% (was 250ms) */
.cov-fade-in { animation: covFadeIn 275ms ease forwards; }  /* Dave 2026-07-07 (r6): +10% (was 250ms) */
@keyframes covFadeOut { from { opacity: 1; } to { opacity: 0; } }
@keyframes covFadeIn { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .cov-fade-out, .cov-fade-in { animation: none; } }
.cov-switch.segmented { max-width: 100%; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.cov-switch.segmented::-webkit-scrollbar { display: none; }

/* ═══════════════════════════════════════════════════════════════════════════
   WooCommerce checkout & cart — brand form styling
   Added 2026-07-07 (Dave: "checkout page sucks — make it professional").
   Maps WooCommerce's generated markup onto the existing :root tokens and the
   .input / .btn-primary / .panel grammar. No new tokens introduced.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── notices: rebrand WC's blue/green full-bleed bars into quiet brand cards ── */
.woocommerce-notices-wrapper,
.woocommerce-form-login-toggle,
.woocommerce form.login,
.woocommerce form.checkout_coupon {
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}
.woocommerce-message,
.woocommerce-info,
.woocommerce-error,
.woocommerce-noreviews {
  background: var(--surface);
  border: 1px solid var(--line);
  border-left: 3px solid var(--accent);
  border-radius: var(--r);
  padding: 0.9rem 1.15rem;
  margin: 0 0 1.25rem;
  color: var(--ink);
  font-size: var(--fs-sm);
  list-style: none;
  box-shadow: var(--shadow-sm);
  display: flex;
  align-items: center;
  gap: 0.75rem 1rem;
  flex-wrap: wrap;
}
.woocommerce-message { border-left-color: var(--ok); }
.woocommerce-error   { border-left-color: var(--crit); }
.woocommerce-message::before,
.woocommerce-info::before,
.woocommerce-error::before,
.woocommerce-noreviews::before { content: none; display: none; }
.woocommerce-message a,
.woocommerce-info a,
.woocommerce-error a { color: var(--accent); font-weight: 500; }
.woocommerce-error li { list-style: none; margin: 0; }
.woocommerce-message .button,
.woocommerce-info .button,
.woocommerce-error .button { margin-left: auto; }

/* ── labels (exclude checkbox labels) ── */
.woocommerce-checkout .form-row > label:not(.checkbox):not(.woocommerce-form__label-for-checkbox),
.woocommerce form.checkout .form-row > label:not(.checkbox):not(.woocommerce-form__label-for-checkbox) {
  display: block;
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  color: var(--ink-muted);
  margin-bottom: 0.5rem;
  font-weight: 500;
}
.woocommerce-checkout .form-row .required { color: var(--accent); border: 0; text-decoration: none; }
.woocommerce-checkout .form-row .optional { color: var(--ink-soft); }

/* ── text inputs / textareas / selects → the .input grammar ── */
.woocommerce-checkout .form-row input.input-text,
.woocommerce-checkout .form-row textarea,
.woocommerce-checkout .form-row select,
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce #order_comments {
  display: block;
  width: 100%;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: 0.75rem 1rem;
  font-size: var(--fs-base);
  font-family: var(--font-body);
  color: var(--ink);
  line-height: 1.4;
  transition: border-color var(--t-fast), box-shadow var(--t-fast);
  box-shadow: none;
}
.woocommerce-checkout .form-row textarea,
.woocommerce #order_comments { min-height: 6rem; resize: vertical; }
.woocommerce-checkout .form-row input.input-text:focus,
.woocommerce-checkout .form-row textarea:focus,
.woocommerce-checkout .form-row select:focus,
.woocommerce #order_comments:focus {
  outline: none;
  border-color: var(--ink);
  box-shadow: 0 0 0 3px rgba(110, 74, 42, 0.10);
}
/* kill Chrome's blue autofill wash */
.woocommerce-checkout .form-row input:-webkit-autofill,
.woocommerce-checkout .form-row input:-webkit-autofill:hover,
.woocommerce-checkout .form-row input:-webkit-autofill:focus {
  -webkit-text-fill-color: var(--ink);
  -webkit-box-shadow: 0 0 0 1000px var(--surface) inset;
  box-shadow: 0 0 0 1000px var(--surface) inset;
  caret-color: var(--ink);
}
/* validation */
.woocommerce-checkout .form-row.woocommerce-invalid input.input-text,
.woocommerce-checkout .form-row.woocommerce-invalid select { border-color: var(--crit); }
.woocommerce-checkout .form-row.woocommerce-validated input.input-text { border-color: var(--ok); }

/* ── country / state select2 → match the .input look ── */
.woocommerce-checkout .select2-container .select2-selection--single {
  height: auto;
  min-height: 3rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--surface);
  display: flex;
  align-items: center;
}
.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__rendered {
  line-height: 1.4;
  padding: 0.75rem 1rem;
  color: var(--ink);
}
.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow {
  height: 100%;
  right: 0.75rem;
}
.woocommerce-checkout .select2-container--default.select2-container--focus .select2-selection--single,
.woocommerce-checkout .select2-container--open .select2-selection--single { border-color: var(--ink); }
.select2-dropdown { border-color: var(--line); }
.select2-container--default .select2-results__option--highlighted[aria-selected] { background: var(--ink); }

/* ── field rhythm ── */
.woocommerce-checkout .form-row { margin: 0 0 1.25rem; }
.woocommerce-checkout .col2-set .col-1,
.woocommerce-checkout .col2-set .col-2 { width: 100%; float: none; padding: 0; }

/* ── order review table ── */
.woocommerce-checkout-review-order-table { width: 100%; border-collapse: collapse; margin: 0; font-size: var(--fs-sm); }
.woocommerce-checkout-review-order-table th,
.woocommerce-checkout-review-order-table td {
  padding: 0.7rem 0;
  border-bottom: 1px solid var(--line);
  text-align: left;
  vertical-align: top;
}
.woocommerce-checkout-review-order-table thead th {
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-muted);
  font-weight: 500;
}
.woocommerce-checkout-review-order-table td:last-child,
.woocommerce-checkout-review-order-table th:last-child { text-align: right; font-variant-numeric: tabular-nums; }
.woocommerce-checkout-review-order-table .cart_item .product-name { color: var(--ink); }
.woocommerce-checkout-review-order-table tfoot th { font-weight: 500; color: var(--ink-muted); }
.woocommerce-checkout-review-order-table tfoot .order-total th,
.woocommerce-checkout-review-order-table tfoot .order-total td {
  font-size: var(--fs-md);
  font-weight: 700;
  color: var(--ink);
  border-bottom: none;
  padding-top: 0.9rem;
}
.woocommerce-checkout-review-order-table ul.woocommerce-shipping-methods,
.woocommerce-checkout-review-order-table #shipping_method,
.woocommerce-checkout-review-order-table td ul { list-style: none; margin: 0; padding: 0; }
.woocommerce-checkout-review-order-table ul.woocommerce-shipping-methods li { list-style: none; margin: 0; }

/* ── payment box → panel grammar, kill bullets & triangle ── */
.woocommerce-checkout #payment {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: clamp(1.25rem, 2.5vw, 1.75rem);
  margin-top: 1.25rem;
}
.woocommerce-checkout #payment ul.payment_methods {
  list-style: none;
  margin: 0 0 1rem;
  padding: 0;
  border-bottom: 1px solid var(--line);
}
.woocommerce-checkout #payment ul.payment_methods li {
  list-style: none;
  margin: 0;
  padding: 0.75rem 0;
}
.woocommerce-checkout #payment ul.payment_methods li label { font-weight: 500; color: var(--ink); }
.woocommerce-checkout #payment div.payment_box {
  background: var(--hover);
  border-radius: var(--r);
  color: var(--ink-muted);
  font-size: var(--fs-sm);
  padding: 1rem;
  margin: 0.5rem 0 0;
}
.woocommerce-checkout #payment div.payment_box::before { display: none; }
.woocommerce-checkout #payment .woocommerce-privacy-policy-text { color: var(--ink-muted); font-size: var(--fs-xs); }
.woocommerce-checkout #payment .woocommerce-privacy-policy-text p { color: var(--ink-muted); }

/* ── Place order → primary CTA (btn-primary · block · lg) ── */
.woocommerce-checkout #payment #place_order,
.woocommerce #place_order {
  display: block;
  width: 100%;
  float: none;
  background: var(--ink);
  color: var(--bg);
  border: 0;
  border-radius: 0;
  text-transform: uppercase;
  letter-spacing: var(--ls-btn);
  font-weight: 500;
  font-family: var(--font-body);
  font-size: var(--fs-base);
  line-height: 1.2;
  padding: 0.95rem 1.5rem;
  margin-top: 1rem;
  cursor: pointer;
  transition: background var(--t-fast), transform var(--t-fast);
}
.woocommerce-checkout #payment #place_order:hover,
.woocommerce #place_order:hover { background: #2c2622; }
.woocommerce-checkout #payment #place_order:active,
.woocommerce #place_order:active { transform: translateY(1px); }

/* ── coupon input on cart ── */
.woocommerce-cart td.actions .coupon input.input-text,
.woocommerce-cart td.actions .coupon input#coupon_code {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: 0.7rem 1rem;
  min-width: 12rem;
  font-size: var(--fs-base);
}
/* ═══ end WooCommerce checkout & cart brand styling ═══ */

/* ─────────────────────────────────────────────────────────────────────────
   Contact page — minimal Claude-style enquiry chat  (page-contact.php, D-094)
   Reuses the site helpbot's bubble language (.bot-msg / .bot-typing), scaled
   up, on one large composer. All values from :root tokens — no new colours.
   ───────────────────────────────────────────────────────────────────────── */
.cchat-page {
  min-height: 64vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(2.5rem, 7vw, 6rem) var(--gutter);
}
.cchat-wrap {
  width: 100%;
  max-width: 720px;
  margin: 0 auto;
  text-align: center;
}
.cchat-email {
  display: inline-block;
  font-size: var(--fs-md);
  font-weight: 500;
  letter-spacing: 0.01em;
  color: var(--ink);
  text-decoration: none;
  padding-bottom: 3px;
  border-bottom: 1px solid var(--line);
  transition: color var(--t-fast), border-color var(--t-fast);
}
.cchat-email:hover { color: var(--accent); border-color: var(--accent-soft); }
.cchat-title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(2rem, 4.5vw, var(--fs-3xl));
  line-height: 1.08;
  color: var(--ink);
  margin: 1.25rem 0 2.25rem;
}
.cchat { text-align: left; }
.cchat__stream {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  margin-bottom: 1rem;
  max-height: 46vh;
  overflow-y: auto;
  padding: 0.25rem;
}
.cchat__stream:empty { display: none; }
/* scale the shared bot bubbles up for this larger surface */
.cchat__stream .bot-msg   { font-size: var(--fs-base); max-width: 88%; padding: 0.75rem 1rem; }
.cchat__stream .bot-typing { padding: 0.75rem 1rem; }
.cchat__composer {
  display: flex;
  align-items: flex-end;
  gap: 0.75rem;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-xl);
  padding: 0.9rem 0.9rem 0.9rem 1.35rem;
  box-shadow: var(--shadow-lg);
  transition: border-color var(--t-fast), box-shadow var(--t-base);
}
.cchat__composer:focus-within { border-color: var(--accent-soft); }
.cchat__input {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  outline: none;
  background: transparent;
  resize: none;
  font-family: var(--font-body);
  font-size: var(--fs-md);
  line-height: 1.5;
  color: var(--ink);
  max-height: 40vh;
  padding: 0.55rem 0;
}
.cchat__input::placeholder { color: var(--ink-soft); }
.cchat__send.btn {
  flex: none;
  width: 46px;
  height: 46px;
  padding: 0;
  border-radius: 999px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.cchat__send.btn svg { width: 20px; height: 20px; }
.cchat__send.btn:disabled { opacity: 0.45; cursor: not-allowed; }
@media (max-width: 640px) {
  .cchat-title { margin-bottom: 1.75rem; }
  .cchat__composer { border-radius: var(--r-lg); }
}

/* ══════════════════════════════════════════════════════════════════
   /warranty/ — delivery-zone tool + 3-zone AU map  (D-095)
   Zone colours from :root tokens; no new palette introduced.
   ══════════════════════════════════════════════════════════════════ */
.wz { --wz-metro: var(--ink); --wz-regional: var(--accent-soft); --wz-remote: var(--accent); }
.wz__grid { display: grid; grid-template-columns: 1.05fr 0.95fr; gap: clamp(1.5rem, 4vw, 3rem); align-items: center; }
@media (max-width: 820px) { .wz__grid { grid-template-columns: 1fr; } }
.wz__title { font-size: var(--fs-xl); font-weight: 400; margin: 0.4rem 0 0.6rem; }
.wz__intro { margin-bottom: 1.1rem; max-width: 34em; }
.wz__row { display: grid; grid-template-columns: 1fr auto; gap: 0.6rem; max-width: 380px; }
.wz__input { letter-spacing: 0.1em; }
.wz__result { margin-top: 1.4rem; padding-top: 1.2rem; border-top: 1px solid var(--line); }
.wz__badge { display: inline-block; font-size: var(--fs-xs); letter-spacing: 0.1em; text-transform: uppercase; font-weight: 600; padding: 0.4rem 0.85rem; border-radius: 999px; background: var(--hover); color: var(--ink-muted); }
.wz__badge--metro    { background: var(--wz-metro); color: var(--bg); }
.wz__badge--regional { background: var(--wz-regional); color: var(--ink); }
.wz__badge--remote   { background: var(--wz-remote); color: var(--bg); }
.wz__rule { font-size: var(--fs-md); color: var(--ink); margin: 0.85rem 0 0.5rem; }
.wz__acl { margin: 0; }
.wz__legend { list-style: none; margin: 1rem 0 0; padding: 0; display: grid; gap: 0.55rem; }
.wz__leg { display: flex; align-items: center; gap: 0.6rem; font-size: var(--fs-sm); color: var(--ink-muted); transition: opacity var(--t-fast); }
.wz__leg strong { color: var(--ink); font-weight: 500; }
.wz__swatch { width: 14px; height: 14px; border-radius: 4px; flex: 0 0 auto; }
.wz__leg--metro .wz__swatch    { background: var(--wz-metro); }
.wz__leg--regional .wz__swatch { background: var(--wz-regional); }
.wz__leg--remote .wz__swatch   { background: var(--wz-remote); border-radius: 999px; }
.wz__mapwrap svg { display: block; width: 100%; height: auto; max-width: 460px; margin: 0 auto; }

.auz__land   { fill: var(--line-soft); stroke: var(--ink-soft); stroke-width: 1.5; stroke-linejoin: round; transition: fill var(--t-base), opacity var(--t-base); }
.auz__remote { fill: var(--accent); opacity: 0.16; transition: opacity var(--t-base); }
.auz__metro circle { fill: var(--ink); opacity: 0.9; transition: opacity var(--t-base); }

.wz[data-zone="metro"] .auz__land        { opacity: 0.45; }
.wz[data-zone="metro"] .auz__remote      { opacity: 0.06; }
.wz[data-zone="metro"] .auz__metro circle { opacity: 1; }
.wz[data-zone="metro"] .wz__leg--regional,
.wz[data-zone="metro"] .wz__leg--remote  { opacity: 0.4; }

.wz[data-zone="regional"] .auz__land     { fill: var(--accent-soft); opacity: 1; }
.wz[data-zone="regional"] .auz__remote   { opacity: 0.06; }
.wz[data-zone="regional"] .auz__metro circle { opacity: 0.3; }
.wz[data-zone="regional"] .wz__leg--metro,
.wz[data-zone="regional"] .wz__leg--remote { opacity: 0.4; }

.wz[data-zone="remote"] .auz__remote     { opacity: 0.85; }
.wz[data-zone="remote"] .auz__land       { opacity: 0.55; }
.wz[data-zone="remote"] .auz__metro circle { opacity: 0.25; }
.wz[data-zone="remote"] .wz__leg--metro,
.wz[data-zone="remote"] .wz__leg--regional { opacity: 0.4; }

/* ── Founder feedback affordance (founder-only; ss-founder-fb.js) ──────────
   Loaded ONLY for logged-in admins — invisible to customers by construction.
   Tokens only, no ad-hoc colour (styleguide :root is the source of truth). */
.ss-ff-bar{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;
  margin-top:.5rem;padding-top:.5rem;border-top:1px solid var(--line)}
.ss-ff-btn{appearance:none;background:transparent;border:0;padding:0;
  font-family:var(--font-body);font-size:var(--fs-xs);color:var(--ink-soft);
  cursor:pointer;transition:color var(--t-fast)}
.ss-ff-btn:hover{color:var(--accent)}
.ss-ff-form{flex:0 0 100%;margin-top:.5rem}
.ss-ff-input{width:100%;box-sizing:border-box;font-family:var(--font-body);
  font-size:var(--fs-sm);color:var(--ink);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:.5rem;resize:vertical}
.ss-ff-input:focus{outline:0;border-color:var(--ink)}
.ss-ff-row{display:flex;align-items:center;gap:.5rem;margin-top:.4rem}
.ss-ff-save{appearance:none;font-family:var(--font-body);font-size:var(--fs-xs);
  color:var(--bg);background:var(--ink);border:1px solid var(--ink);
  border-radius:var(--r-sm);padding:.3rem .7rem;cursor:pointer}
.ss-ff-save[disabled]{opacity:.5;cursor:default}
.ss-ff-cancel{appearance:none;font-family:var(--font-body);font-size:var(--fs-xs);
  color:var(--ink-muted);background:transparent;border:1px solid var(--line);
  border-radius:var(--r-sm);padding:.3rem .7rem;cursor:pointer}
.ss-ff-msg{font-size:var(--fs-xs);color:var(--crit)}
.ss-ff-done{font-size:var(--fs-xs);color:var(--ink-muted)}
.ss-ff-applied{flex:0 0 100%;margin-top:.5rem;padding:.5rem .6rem;
  background:var(--line-soft);border-left:2px solid var(--line);
  border-radius:var(--r-sm);color:var(--ink-muted)}
.ss-ff-applied-head{display:block;font-family:var(--font-body);font-size:var(--fs-xs);
  font-weight:600;color:var(--ink-soft);letter-spacing:.02em}
.ss-ff-applied-text{margin-top:.25rem;font-family:var(--font-body);font-size:var(--fs-sm);
  color:var(--ink-muted);white-space:pre-wrap;line-height:1.45}
.ss-ff-applied.is-queued{border-left-color:var(--warn)}

.ss-cart-thumb {
  width: 72px; height: 72px; object-fit: contain; padding: 4px; display: block;
  border-radius: var(--r-sm); border: 1px solid var(--line); background: var(--hover);
}

.woocommerce-checkout-review-order-table .ss-co-line { display: flex; gap: 0.75rem; align-items: center; }
.woocommerce-checkout-review-order-table .ss-co-thumb {
  width: 56px; height: 56px; flex: 0 0 56px; object-fit: contain; padding: 3px;
  border-radius: var(--r-sm); border: 1px solid var(--line); background: var(--hover);
}
.woocommerce-checkout-review-order-table .ss-co-text { min-width: 0; }

/* ══ Leather ranges — editorial redesign (Dave 2026-07-09) ══════════════════
   CSS-only restyle of the sheet-driven .leather-split tables in the Leather
   panel into an open, stacked, editorial layout. No markup/data change;
   .leather-dot buttons, the hidden trade-only row and the order CTA are intact. */
#cov-panel-leather .leather-split{ position:relative; gap:0; align-items:start; }
#cov-panel-leather .leather-split::before{ content:""; position:absolute; top:2px; bottom:2px; left:50%; width:1px; background:var(--line); }
#cov-panel-leather .leather-col{ padding:0 clamp(1.25rem,3.4vw,3.4rem); }
#cov-panel-leather .leather-col:first-child{ padding-left:0; }
#cov-panel-leather .leather-col:last-child{ padding-right:0; }
#cov-panel-leather .leather-rtable-wrap{ border:0; border-radius:0; background:none; box-shadow:none; overflow:visible; }
#cov-panel-leather .leather-col__cap{ display:block; caption-side:top; text-align:left;
  font-family:var(--font-body); font-weight:700; font-size:var(--fs-md); letter-spacing:0.12em;
  text-transform:uppercase; color:var(--ink);
  padding:0 0 clamp(0.85rem,2vw,1.1rem); margin-bottom:clamp(0.4rem,1.4vw,0.7rem);
  border-bottom:1px solid var(--line); }
#cov-panel-leather .leather-col__sub{ font-family:var(--font-body); font-weight:400;
  font-size:var(--fs-sm); letter-spacing:0; text-transform:none; color:var(--ink-muted); margin-top:0.5rem; }
#cov-panel-leather .leather-rtable--split,
#cov-panel-leather .leather-rtable--split tbody{ display:block; min-width:0; }
#cov-panel-leather .leather-rtable--split tr:not([hidden]){ display:block; padding:clamp(1rem,2.3vw,1.35rem) 0; border-top:1px solid var(--line); }
#cov-panel-leather .leather-rtable--split tbody tr:not([hidden]):first-child{ border-top:0; }
#cov-panel-leather .leather-rtable--split tbody tr:hover{ background:none; }
#cov-panel-leather .leather-rtable--split th,
#cov-panel-leather .leather-rtable--split td{ display:block; padding:0; border:0; text-align:left; vertical-align:baseline; }
#cov-panel-leather .leather-rtable--split .leather-rtable__range{ font-family:var(--font-display); font-size:var(--fs-xl); line-height:1.05; color:var(--ink); white-space:normal; }
#cov-panel-leather .leather-rtable--split .leather-rtable__note{ text-align:left; max-width:34em; margin:0.5rem 0 0; color:var(--ink-muted); font-size:var(--fs-sm); line-height:1.55; }
#cov-panel-leather .leather-dots{ justify-content:flex-start; margin:0.95rem 0 0; }
#cov-panel-leather .leather-dot{ width:23px; height:23px; box-shadow:inset 0 0 0 1px rgba(0,0,0,.12), 0 1px 4px rgba(28,23,20,.14); }
@media (max-width:760px){
  #cov-panel-leather .leather-split::before{ display:none; }
  #cov-panel-leather .leather-col{ padding:0; }
}
/* ══ end leather ranges editorial redesign ═════════════════════════════════ */

/* == Fabric ranges -- same editorial block-row style as leather (Dave 2026-07-16) ==
   The fabric panel reuses the leather editorial treatment so both coverings
   tables read identically (canonical table style, see /styleguide/). Single
   column -- fabric has no finish-family split -- so no .leather-split grid/divider. */
#cov-panel-fabric .leather-rtable-wrap{ border:0; border-radius:0; background:none; box-shadow:none; overflow:visible; }
#cov-panel-fabric .leather-rtable--split,
#cov-panel-fabric .leather-rtable--split tbody{ display:block; min-width:0; }
#cov-panel-fabric .leather-rtable--split tr:not([hidden]){ display:block; padding:clamp(1rem,2.3vw,1.35rem) 0; border-top:1px solid var(--line); }
#cov-panel-fabric .leather-rtable--split tbody tr:not([hidden]):first-child{ border-top:0; }
#cov-panel-fabric .leather-rtable--split tbody tr:hover{ background:none; }
#cov-panel-fabric .leather-rtable--split th,
#cov-panel-fabric .leather-rtable--split td{ display:block; padding:0; border:0; text-align:left; vertical-align:baseline; }
#cov-panel-fabric .leather-rtable--split .leather-rtable__range{ font-family:var(--font-display); font-size:var(--fs-xl); line-height:1.05; color:var(--ink); white-space:normal; }
#cov-panel-fabric .leather-rtable--split .leather-rtable__note{ text-align:left; max-width:34em; margin:0.5rem 0 0; color:var(--ink-muted); font-size:var(--fs-sm); line-height:1.55; }
#cov-panel-fabric .leather-dots{ justify-content:flex-start; margin:0.95rem 0 0; }
#cov-panel-fabric .leather-dot{ width:23px; height:23px; box-shadow:inset 0 0 0 1px rgba(0,0,0,.12), 0 1px 4px rgba(28,23,20,.14); }
/* == end fabric ranges editorial style == */


/* ─── PDP covers: fabric / leather family expanders (Dave 2026-07-14) ───
   Two full-width expander buttons under the config selector; each slides its
   family's cover-lines open. A family only renders when it has cover data. */
.cover-fam { margin-bottom: 0.6rem; }
.cover-fam__toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  gap: 0.75rem;
  padding: 0.9rem 1.15rem;
  border: 2px solid var(--line);
  border-radius: 0;
  background: var(--surface);
  font-family: var(--font-body);
  font-size: var(--fs-base);
  font-weight: 500;
  color: var(--ink);
  cursor: pointer;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.cover-fam__toggle:hover { border-color: var(--ink); }
.cover-fam.is-open .cover-fam__toggle {
  border-color: var(--ink);
  border-bottom-left-radius: 0;
  border-bottom-right-radius: 0;
}
.cover-fam__chev {
  width: 9px; height: 9px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(45deg);
  transition: transform var(--t-base);
  flex: none;
  margin-top: -3px;
}
.cover-fam.is-open .cover-fam__chev { transform: rotate(-135deg); margin-top: 3px; }
.cover-fam__panel {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows var(--t-base);
}
.cover-fam.is-open .cover-fam__panel { grid-template-rows: 1fr; }
.cover-fam__inner { overflow: hidden; min-height: 0; }
.cover-fam.is-open .cover-fam__inner {
  padding: 1.1rem 1.15rem 0.2rem;
  border: 2px solid var(--line);
  border-top: 0;
  border-radius: 0;
}
.cover-fam__inner .cover-line:last-child { margin-bottom: 0; }
@media (prefers-reduced-motion: reduce) { .cover-fam__panel { transition: none; } }

/* ─── PDP covers: the fabric / leather tab inside the single expander
   (Dave 2026-09-09) ───
   The styleguide's .slider section-tab, in an EQUAL-WIDTH variant. The styleguide
   page builds .slider__fill / .slider__cream by measuring each option's rendered
   width in JS; that cannot work here, because this bar is created inside a
   COLLAPSED .cover-fam__panel where every offsetWidth is 0 and the fill would
   render zero-wide. Equal columns let the same two layers be positioned in pure
   CSS off one [data-kind-idx] attribute — no measurement, and correct before the
   panel has ever been opened. Two options only; a product offered in one family
   renders no bar at all. */
.slider--split { width: 100%; }
.slider--split .slider__opt { flex: 1 1 0; width: auto; justify-content: center; text-align: center; }
.slider--split .slider__fill { width: 50%; }
.slider--split .slider__cream { width: 100%; }
.slider--split .slider__cream span { flex: 1 1 0; width: auto; }
.slider--split[data-kind-idx="0"] .slider__fill  { transform: translateX(0); }
.slider--split[data-kind-idx="1"] .slider__fill  { transform: translateX(100%); }
.slider--split[data-kind-idx="0"] .slider__cream { clip-path: inset(0 50% 0 0); }
.slider--split[data-kind-idx="1"] .slider__cream { clip-path: inset(0 0 0 50%); }
.cover-kinds { margin-bottom: 1.15rem; }
.cover-kind[hidden] { display: none; }

/* The OPTION-axis bar (Franco's leg finish) is the SAME .cover-fam control, sitting
   directly under the cover one (Dave 2026-09-09) -- no separate component, so there
   is nothing to style but the panel's own bottom padding: the cover panel ends in a
   swatch row that carries its own margin, this one ends in the .segmented grid and
   would otherwise sit 0.2rem off the border. */
.cover-fam[data-fam="options"].is-open .cover-fam__inner { padding-bottom: 1.1rem; }

/* ─── PDP cover filter bar — togglable filters flush under the family toggle,
   sharing its edge; options populate from the sheet's Handle/Pile values and
   leather marks (Dave 2026-07-14) ─── */
.cover-filters {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin: 0 0 1.1rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--line);
}
.cover-filters__row { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.cover-line.is-filtered-out { display: none; }

.save-pct{font-weight:600;font-size:0.85em;margin-left:0.4rem;white-space:nowrap;opacity:0.85;}

/* ── Care guides (leather + fabric) — Dave 2026-07-16 ─────────────────────────
   Buttons open a sheet-driven care popup. Tokens only; mirrors .leather-swatch-modal. */
.care-guide-row { display: flex; flex-wrap: wrap; gap: 0.6rem; justify-content: center; margin: 1.35rem 0 0; }
.care-guide__btn { font-size: var(--fs-xs); }
.care-modal { position: fixed; inset: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; background: rgba(28,23,20,0.55); padding: 2rem; }
.care-modal[hidden] { display: none; }
.care-modal__panel { position: relative; background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--shadow-lg); width: min(92vw, 560px); max-height: 88vh; overflow: auto; padding: clamp(1.5rem, 4vw, 2.5rem); text-align: left; }
.care-modal__close { position: absolute; top: 0.6rem; right: 0.9rem; background: none; border: 0; color: var(--ink-soft); font-size: 2rem; line-height: 1; cursor: pointer; }
.care-modal__close:hover { color: var(--ink); }
.care-modal__art { margin: -0.4rem 0 1.25rem; }
.care-modal__art img { width: 100%; height: auto; display: block; border-radius: var(--r); border: 1px solid var(--line); }
.care-modal__eyebrow { display: block; font-size: var(--fs-label); letter-spacing: var(--ls-label); text-transform: uppercase; color: var(--accent); margin-bottom: 0.45rem; }
.care-modal__title { font-family: var(--font-display); font-size: var(--fs-xl); color: var(--ink); margin: 0; }
.care-modal__subtitle { color: var(--ink-muted); font-size: var(--fs-sm); margin: 0.35rem 0 0; }
.care-modal__facts { display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 1.25rem 0 0.25rem; }
.care-fact { flex: 1 1 auto; min-width: 120px; border: 1px solid var(--line); border-radius: var(--r); padding: 0.55rem 0.8rem; background: var(--bg); }
.care-fact__k { display: block; font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-soft); }
.care-fact__v { display: block; font-size: var(--fs-sm); color: var(--ink); margin-top: 0.15rem; }
.care-sec { margin-top: 1.15rem; }
.care-sec__h { font-family: var(--font-body); font-size: var(--fs-sm); text-transform: uppercase; letter-spacing: 0.1em; color: var(--accent); margin: 0 0 0.3rem; }
.care-sec__p { color: var(--ink-muted); font-size: var(--fs-base); line-height: 1.55; margin: 0; }
.care-modal__foot { margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--line); font-size: var(--fs-xs); color: var(--ink-soft); }
.care-modal__foot a { color: var(--accent); }
@media (max-width: 520px) { .care-guide__btn { flex: 1 1 100%; } }


/* ── Unified circular swatch loupe (Dave 2026-07-16) ─────────────────────────
   Replaces the polaroid .leather-swatch-modal (coverings) AND the old white
   .swatch-loupe (PDP). Circular like the dots, anchored at the clicked swatch,
   mouse-wheel zoom, thin ink border, no white card. Tokens only. */
.ss-loupe{
  position:fixed; z-index:1000; box-sizing:border-box;
  width:min(260px,72vw); height:min(260px,72vw);
  border-radius:50%;
  border:1.5px solid var(--ink);
  background-color:var(--line-soft);
  background-repeat:no-repeat; background-position:center; background-size:100% 100%;
  box-shadow:0 16px 34px rgba(28,23,20,.26), 0 5px 12px rgba(28,23,20,.12);
  cursor:zoom-in; touch-action:none;
  animation:ss-loupe-in 160ms cubic-bezier(.2,.7,.3,1);
}
.ss-loupe.is-closing{ animation:ss-loupe-out 140ms ease forwards; }
.ss-loupe__name{
  position:fixed; z-index:1001; transform:translateX(-50%);
  font-family:var(--font-body); font-weight:500; font-size:0.72rem; letter-spacing:0.02em;
  line-height:1; color:var(--bg); background:var(--ink);
  padding:0.38rem 0.62rem; border-radius:999px; white-space:nowrap;
  pointer-events:none; box-shadow:0 4px 14px rgba(0,0,0,.18);
  animation:ss-fade-in 160ms ease;
}
@keyframes ss-loupe-in{ from{opacity:0;transform:scale(.8)} to{opacity:1;transform:scale(1)} }
@keyframes ss-loupe-out{ to{opacity:0;transform:scale(.9)} }
@keyframes ss-fade-in{ from{opacity:0} to{opacity:1} }
@media (max-width:480px){ .ss-loupe{ width:min(220px,80vw); height:min(220px,80vw); } }


/* Fix 2026-07-20b: honour the style guide — accent focus rings on the sign-in
   popover buttons (guide names --accent for focus rings; matches the theme's
   .clearance-tile / .leather-dot focus-visible pattern). Inputs keep their
   existing border-colour focus. */
.auth-toggle button:focus-visible,
.signin-pop__close:focus-visible,
.signin-pop__link:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* === PDP tweaks 2026-07-21 (note/price/configs/variants/centering) === */
.segmented a.seg-item {
  padding: 0.7rem 0.5rem;
  border: 2px solid var(--line);
  border-radius: 0;
  background: var(--surface);
  font-size: var(--fs-sm);
  text-align: center;
  color: var(--ink);
  text-decoration: none;
  display: block;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.segmented a.seg-item:hover { border-color: var(--ink); }
.segmented a.seg-item.is-active { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.pdp-variant__icon img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }
.pdp-variants__head, .pdp-make__head, .pdp-features__head, .pdp-warranty__head { margin-left: auto; margin-right: auto; text-align: center; }
.pdp-reviews__head { grid-template-columns: 1fr; justify-items: center; text-align: center; }
.pdp-reviews__avg { text-align: center; }


/* PDP cover-open ITR condense (Dave 2026-07-22) */
/* .pdp-variants ("In this range") now lives INSIDE the .pdp grid. Default:
   spans the full width in its own row (unchanged look). While a cover
   dropdown (Show fabrics / Show leathers) is open the selection panel gets
   tall; instead of pushing ITR far below it, condense ITR into the left
   column beside the open panel. Desktop only (>=881px); mobile stays stacked. */
.pdp-variants { grid-column: 1 / -1; margin-top: 0; position: relative; z-index: 1; background: var(--bg); }
/* ITR now sits inside .pdp, which extends the sticky gallery containing block
   through the ITR row; the taller gallery then protrudes/bleeds over ITR on
   scroll. Drop the pin so the gallery scrolls away cleanly. (Dave 2026-07-22) */
.pdp__gallery { position: static; top: auto; }
@media (min-width: 881px) {
  /* Pin row 1 to the gallery and force ALL panel overflow into row 2, so a very
     tall panel (both dropdowns open) can never inflate row 1 and push ITR down. */
  .pdp:has(.cover-fam.is-open)             { grid-template-rows: auto 1fr; }
  .pdp:has(.cover-fam.is-open) .pdp__gallery  { grid-column: 1; grid-row: 1; }
  .pdp:has(.cover-fam.is-open) .pdp__panel    { grid-column: 2; grid-row: 1 / span 2; }
  .pdp:has(.cover-fam.is-open) .pdp-variants  { grid-column: 1; grid-row: 2; align-self: start; }
}

/* PDP buy-box: gated Add-to-cart until an item AND a cover are chosen (Dave 2026-07-22). */
#pdp-add:disabled, #pdp-add[aria-disabled="true"] { opacity: .4; cursor: not-allowed; }
/* drawer — fixed + overflow:hidden so a translated panel can never contribute
   to document scrollWidth; display:none while closed so its links are not
   counted as (invisible) sub-44px tap targets. */
.nav-drawer { position: fixed; inset: 0; z-index: 120; overflow: hidden; }
.nav-drawer[hidden] { display: none; }
.nav-drawer__scrim {
  position: absolute;
  inset: 0;
  background: rgba(28, 23, 20, 0.5);   /* --ink at 0.5, matching the header's own rgba use */
  opacity: 0;
  transition: opacity var(--t-base);
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
}
.nav-drawer[data-open="true"] .nav-drawer__scrim { opacity: 1; }
.nav-drawer__panel {
  position: absolute;
  top: 0; right: 0; bottom: 0;
  width: min(88vw, 380px);
  display: flex;
  flex-direction: column;
  background: var(--bg);
  color: var(--ink);
  border-left: 1px solid var(--line);
  box-shadow: var(--shadow-lg);
  padding: 1rem 1.15rem calc(1.5rem + env(safe-area-inset-bottom, 0px));
  padding-right: calc(1.15rem + env(safe-area-inset-right, 0px));
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  transform: translateX(100%);
  transition: transform var(--t-base);
}
.nav-drawer[data-open="true"] .nav-drawer__panel { transform: none; }
@media (prefers-reduced-motion: reduce) {
  .nav-drawer__scrim, .nav-drawer__panel { transition: none; }
}
body.nav-drawer-open { overflow: hidden; }

.nav-drawer__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 44px;
  margin-bottom: 0.25rem;
}
.nav-drawer__eyebrow {
  font-size: var(--fs-label);
  letter-spacing: var(--ls-btn);
  text-transform: uppercase;
  font-weight: 500;
  color: var(--ink-muted);
}
.nav-drawer__close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  margin-right: -0.55rem;
  border-radius: 999px;
  color: var(--ink);
  transition: background var(--t-fast);
}
.nav-drawer__close:hover { background: var(--hover); }
.nav-drawer__close:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.nav-drawer__close svg { width: 20px; height: 20px; }

/* search — pinned to the top of the drawer (Dave, locked) */
.nav-drawer__search {
  position: sticky;
  top: 0;
  z-index: 2;
  display: flex;
  gap: 0.5rem;
  align-items: stretch;
  background: var(--bg);
  padding: 0.35rem 0 0.9rem;
}
.nav-drawer__search input {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 44px;
  padding: 0.6rem 0.85rem;
  font-size: var(--fs-base);        /* 16px — below this iOS zooms the page on focus */
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  transition: border-color var(--t-fast);
  -webkit-appearance: none;
  appearance: none;
}
.nav-drawer__search input::placeholder { color: var(--ink-soft); }
.nav-drawer__search input:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-color: var(--ink);
}
.nav-drawer__search-go {
  flex: 0 0 auto;
  min-width: 44px;
  min-height: 44px;
  padding: 0 0.9rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.nav-drawer__search-go svg { width: 18px; height: 18px; }

.nav-drawer__list { list-style: none; margin: 0; padding: 0; }
.nav-drawer__list--sub {
  margin-top: 0.85rem;
  padding-top: 0.35rem;
  border-top: 1px solid var(--line);
}
.nav-drawer__link {
  display: flex;
  align-items: center;
  width: 100%;
  min-height: 52px;
  padding: 0.5rem 0;
  font-family: var(--font-body);
  font-size: var(--fs-md);
  color: var(--ink);
  text-align: left;
  border-bottom: 1px solid var(--line-soft);
  transition: color var(--t-fast), padding-left var(--t-fast);
}
.nav-drawer__list li:last-child .nav-drawer__link { border-bottom: 0; }
.nav-drawer__list--sub .nav-drawer__link {
  min-height: 48px;
  font-size: var(--fs-base);
  color: var(--ink-muted);
}
.nav-drawer__link:hover, .nav-drawer__link:focus-visible { color: var(--ink-muted); padding-left: 0.25rem; }
.nav-drawer__link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.nav-drawer__link[aria-current="page"] { font-weight: 600; color: var(--ink); }

/* ─── B. touch ergonomics, <=880px only ────────────────────────────────── */
@media (max-width: 880px) {

  /* wordmark: 195x24 (header) and 294x19 (footer) -> 44 tall */
  .wordmark { min-height: 44px; }

  /* footer links: ~92x16 -> 44 tall */
  .site-footer__links a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }
  .social-cluster { gap: 0.15rem; }
  .social-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 44px;
    min-height: 44px;
  }

  /* PDP filter toggles: 80x41 -> 44 tall */
  .toggle-filter, .filter-pill { min-height: 44px; }
  .segmented a.seg-item, .segmented button { min-height: 44px; }

  /* PDP swatches: 41 cells at 32px wide. A flat bump to 44px would overflow the
     fixed 7-column grid (7*44 + gaps = 375px inside a ~294px container), so the
     grid becomes auto-fill instead — every cell lands >=44px AND the row stays
     inside the container, holding overflowPx at 0. */
  .swatch-row,
  .pdp .swatch-row {
    grid-template-columns: repeat(auto-fill, minmax(44px, 1fr));
    gap: 0.5rem 0.5rem;
    justify-content: stretch;
  }
  .swatch-cell,
  .pdp .swatch-cell,
  .samples-main .swatch-cell {
    width: auto;
    min-width: 44px;
    min-height: 44px;
    justify-content: center;
  }

  /* --- >=13px type --- */
  .swatch-cell__name,
  .pdp .swatch-cell__name,
  .samples-main .swatch-cell__name { font-size: var(--fs-sm); line-height: 1.2; }
  .pdp .cover-line__blurb, .cover-line__blurb { font-size: var(--fs-sm); }
  .toggle-filter, .filter-pill { font-size: var(--fs-sm); }
  .segmented button, .segmented a.seg-item { font-size: var(--fs-sm); }
  .pdp .studio-note, .studio-note { font-size: var(--fs-sm); }
  .pdp-piece__dim { font-size: var(--fs-sm); }
  .price-from, .price-in { font-size: var(--fs-sm); }
  .pdp .avail__head, .pdp .avail__line, .pdp .avail__alt,
  .avail__head, .avail__line, .avail__alt { font-size: var(--fs-sm); }
  .pdp .avail-legend, .avail-legend { font-size: var(--fs-sm); }
  .pdp-warranty__what { font-size: var(--fs-sm); }
  .pdp__price-note, .pdp__group-label { font-size: var(--fs-sm); }
  .colophon, .colophon span, .social-cluster, .social-icon { font-size: var(--fs-sm); }
  .field-label, .inline-note { font-size: var(--fs-sm); }
}

/* --- mobile hardening, pass 2 (2026-07-27): residuals caught by re-measure --- */
@media (max-width: 880px) {

  /* footer links were 44 TALL but 37/35 WIDE ("Trade", "Press") */
  .site-footer__links a {
    min-width: 44px;
    justify-content: center;
  }

  /* .btn-line CTAs sat at 33px tall (home "Browse the full range", trade email) */
  .btn-line { min-height: 44px; display: inline-flex; align-items: center; }

  /* form controls: trade inputs 340x33, WP default search/select on /coverings/ */
  .input,
  .field .input,
  input[type="text"], input[type="email"], input[type="tel"],
  input[type="search"], input[type="number"], input[type="password"],
  .search-field, .search-submit, select, textarea {
    min-height: 44px;
  }
  .site-footer .colophon, .site-footer .colophon span { font-size: var(--fs-sm); }
  .pdp .pdp__price .price-from, .pdp__price .price-from,
  .pdp .pdp__price .price-in, .pdp__price .price-in { font-size: var(--fs-sm); }

  /* "Midnight" rendered 53px inside a ~49px swatch track and pushed its right
     edge to 392px (2px past the 390 viewport). Let the label wrap instead. */
  .swatch-cell__name {
    max-width: 100%;
    overflow-wrap: anywhere;
    word-break: break-word;
    hyphens: auto;
  }
  .swatch-cell { min-width: 44px; }
}

/* --- mobile hardening, pass 3 (2026-07-27): /leather/ coverings tabs ---
   Only found once the audit harness was pointed at the REAL coverings page
   (it had been probing /coverings/, a WP default archive, so this page was
   never actually measured). Six .slider__opt tabs at 174x37 with 11px labels.
   NOT touched: the SVG <text> labels inside the leather-anatomy diagrams
   (8.5-12px) — they are positioned to sit inside drawn shapes, so scaling
   them would break the diagrams. Flagged for Dave instead. */
@media (max-width: 880px) {
  .slider__opt {
    min-height: 44px;
    font-size: var(--fs-sm);
  }
  .slider__opt .slider__cream,
  .slider__cream,
  .slider__cream span { font-size: var(--fs-sm); }
}

/* ── Room Planner (/planner/) ─────────────────────────────────────────────
   The planner is an iframed Konva app (assets/planner.html) — iframed so its
   own :root scope and canvas sizing cannot collide with theme CSS/JS.
   It sits WIDER than --container (1080px): a scale drawing needs canvas room,
   so this section deliberately escapes the standard container width. */
.ss-planner {
  width: 100%;
  max-width: 1680px;
  margin: 0 auto;
  padding: 0 clamp(1rem, 3vw, 2.5rem) clamp(2rem, 4vw, 3rem);
}
.ss-planner__frame {
  display: block;
  width: 100%;
  height: calc(100vh - 200px);
  min-height: 620px;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--surface);
}
@media (max-width: 880px) {
  .ss-planner { padding-left: 0; padding-right: 0; }
  .ss-planner__frame {
    height: calc(100vh - 160px);
    min-height: 480px;
    border-left: 0;
    border-right: 0;
    border-radius: 0;
  }
}

/* ── inline editor ─────────────────────────────────────────────────────
   Compact, context-anchored editing for values already shown in-place.
   Use instead of window.prompt()/alert()/confirm() on customer surfaces. */
.inline-editor{
  display:inline-flex;align-items:center;gap:.3rem;padding:0;background:transparent;border:0;box-shadow:none;
}
.inline-editor__field{display:block}
.inline-editor__label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
.inline-editor__inputwrap{display:flex;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm)}
.inline-editor__inputwrap:focus-within{outline:2px solid var(--neon-deep);outline-offset:1px;border-color:transparent}
.inline-editor__input{width:64px;padding:.3rem .4rem;border:0;background:transparent;font:600 13px var(--font-body);line-height:1;color:var(--neon-deep);text-align:center;outline:0}
.inline-editor__save{width:30px;height:30px;display:grid;place-items:center;border:1px solid var(--neon-deep);border-radius:var(--r-sm);background:var(--neon);color:var(--neon-deep);font-weight:700;cursor:pointer}
.inline-editor__save:hover{background:var(--neon-deep);color:var(--neon)}
/* ── icon toolbar ──────────────────────────────────────────────────────
   Compact visual tools: one consistent line icon over one short label.
   Group construction actions separately from history/state actions. */
.icon-toolbar{display:inline-flex;align-items:center;gap:.25rem;padding:.35rem;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow)}
.icon-toolbar__sep{width:1px;height:30px;background:var(--line);margin:0 .15rem}
.icon-tool{min-width:58px;padding:.45rem .55rem;border-radius:var(--r-sm);display:grid;grid-template-rows:22px auto;place-items:center;gap:.2rem;color:var(--ink-muted);font-size:11px;font-weight:500}
.icon-tool:hover{background:var(--hover);color:var(--ink)}
.icon-tool[aria-pressed="true"],.icon-tool--primary{background:var(--ink);color:var(--bg)}
.icon-tool:disabled{opacity:.35;cursor:not-allowed}
.icon-tool__icon{width:20px;height:20px;display:block;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}

/* line-diagram floor-alignment in the in-range strip (SCALE-STANDARD.md, 2026-08-03) */
.pdp-variant__icon { place-items: end center; }

/* ═══ Home hero ROTATOR — 2026-08-10 ═══════════════════════════════════════════
   Two heroes share the one homepage slot: the leather landing hero (slide 1,
   markup and geometry UNCHANGED) and the electric-motion hero (slide 2).
   Slide 1 stays in normal flow and therefore still sets the height, so adding
   the rotator introduces NO geometry change to the approved leather hero.
   Progressive enhancement: with CSS but no JS, slide 1 shows and slide 2 sits
   behind it; with neither, both simply stack. ─────────────────────────────── */
.hero-rotator { position: relative; isolation: isolate; }
.hero-rotator__slide { transition: opacity .85s ease; }
.hero-rotator__slide:not(:first-child) { position: absolute; inset: 0; }
.hero-rotator__slide[aria-hidden='true']  { opacity: 0; pointer-events: none; }
.hero-rotator__slide[aria-hidden='false'] { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .hero-rotator__slide { transition: none; } }

.hero-rotator__dots {
  position: absolute; z-index: 6; left: 0; right: 0;
  bottom: clamp(14px, 2.2vh, 26px);
  display: flex; justify-content: center; gap: 10px;
}
.hero-rotator__dot {
  width: 9px; height: 9px; padding: 0; border-radius: 50%;
  border: 1px solid rgba(255,255,255,0.9); background: transparent;
  cursor: pointer; transition: background var(--t-base), transform var(--t-fast);
}
.hero-rotator__dot:hover { transform: scale(1.25); }
.hero-rotator__dot[aria-selected='true'] { background: #FFFFFF; }
/* on a light slide the dots invert so they stay visible on the pale wall */
.hero-rotator[data-tone='light'] .hero-rotator__dot { border-color: rgba(28,23,20,0.75); }
.hero-rotator[data-tone='light'] .hero-rotator__dot[aria-selected='true'] { background: var(--ink); }

/* ── slide 2: electric motion. The photograph is a pale wall, so the copy is
   INK, not white, and there is no scrim — measured contrast 13.0:1 headline /
   13.7:1 subhead, against 3:1 / 4.5:1 required. Geometry is transcribed from the
   Dave-approved flat composite (- Temp\motion-hero\flat-J-rose-C.png).
   ⚠ Every vertical offset is in cqw, NOT cqh, and the block is anchored to the
   BOTTOM. Reason: the 16:9 photograph is object-fit:cover into a taller-than-16:9
   slot, so it scales to the container WIDTH and crops off the TOP only —
   width-relative offsets measured from the bottom therefore track the sofa
   exactly, at every viewport. cqh would drift.
   ⚠ REVISED 2026-08-10 (Dave: "improve the positioning of the text and subtext";
   supersedes the flat-composite transcription for these three values only):
   gutter 1.8cqw → 4cqw (46px on a 2545 viewport read as falling off the left edge);
   sub 2.0cqw → 1.6cqw (−20% as asked, 30px → 24px at cap);
   cta margin-top 21.24cqw → 18.5cqw — the block is BOTTOM-anchored, so shrinking
   this margin moves title+sub DOWN and leaves the CTAs geometrically untouched
   (header→title clearance 72px → 151px at 2545). Text stays inside the pale
   top-left wall zone; re-measured contrast after the move. ─────────────────────────────── */
.home-hero--motion { container-type: inline-size; }
.home-hero--motion .home-hero__media img { object-position: center bottom; }
.home-hero--motion::after { background: none; }
.home-hero--motion .home-hero__copy {
  max-width: none; margin: 0;
  /* Dave 2026-08-10 redline #2: shift text+buttons RIGHT by the gap he drew between two
     orange rules — 174px on a 1982px-wide content area = 8.78% of slot width, so 4cqw
     (the redline-#1 gutter) + 8.78cqw = 12.8cqw. His viewport was ~2545 wide.
     ⚠ TAPERED, not flat 12.8cqw. Title and sub font-sizes are CAPPED (64px / 24px) above
     a ~1500px slot, so above the cap the copy stops widening while the slot keeps growing
     and the shift is free. BELOW the cap the copy scales with the slot, and a flat 12.8cqw
     drove the subhead onto the tan leather — MEASURED worst-pixel contrast 11.58:1 -> 1.01:1
     at 1440x900 and 1512x780. So the shift is capped by the space actually available:
     43.5cqw is where the sofa's back edge enters the frame at the subhead's height, and
     640px is the subhead's capped text width. The result is Dave's full shift at his width,
     tapering to no shift at all where the wall runs out. Never below the 4cqw baseline. */
  padding-left: max(4cqw, min(12.8cqw, calc(43.5cqw - 640px))); padding-right: 4cqw;
  padding-top: 0; padding-bottom: 8.487cqw;
  align-items: flex-start; justify-content: flex-end; text-align: left;
  transform: none; color: var(--ink); text-shadow: none;
}
.home-hero--motion .home-hero__title {
  color: var(--ink); font-size: clamp(26px, 4.4cqw, 64px); line-height: 1.06;
  letter-spacing: 0; max-width: none; margin: 0;
}
.home-hero--motion .home-hero__sub {
  color: var(--ink); font-size: clamp(13px, 1.6cqw, 24px); line-height: 1.45;  /* -20% on the fluid+cap (30px->24px); FLOOR held at 13px - it only engages below a ~688px container, where 11px would be under the mobile legibility floor */
  margin: 1.004cqw 0 0; max-width: none; white-space: nowrap;
}
.home-hero--motion .home-hero__cta { justify-content: flex-start; margin-top: 18.5cqw; gap: 14px; }
/* SHORT-VIEWPORT DEFECT, NOT FIXED HERE (measured 2026-08-10, logged for a separate build).
   The vertical stack is width-relative (cqw) but the slot height is viewport-relative
   (.home-hero height:clamp(72vh,80vh,92vh) = always 80vh, min-height:520px). On a WIDE +
   SHORT window the stack overflows the top: header-to-title clearance measures -4px at
   1366x630 (a 1366x768 laptop) and +10px at 1440x700. Both were -48px and -36px BEFORE
   this session's 18.5cqw + minus-20pc change, so this is already much improved, not new.
   A guard that shrinks this margin at short slots WAS built and MEASURED, then REVERTED:
   it fixes the clearance (-4 to 60px) but the same short slot crops the pale wall away, so
   the copy lands on tan leather and worst-pixel contrast collapses to 1.04:1 / 1.22:1.
   Trading a 4px overlap for illegible copy is worse. The real fix is the SLOT-HEIGHT model
   (a width-aware min-height so the crop keeps the pale zone), which changes slide 1's
   geometry too - out of scope for a copy-position tweak. Do not re-derive: cqh is also a
   dead end here (container-type:inline-size establishes no block-size query container). */
.home-hero--motion .home-hero__cta .btn-primary { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.home-hero--motion .home-hero__cta .btn-primary:hover { background: var(--bg); color: var(--ink); }
/* The shelf IS the selector row on desktop — the in-page pill row would be a
   second copy of the same control, so hide it wherever the shelf is available.
   Below 880px the shelf is gone and the in-page row is the only selector UI. */
@media (min-width: 881px) { #shop-filters { display: none; } }
/* (retired 2026-08-12 r7 - the shelf IS the mobile menu now; see MOBILE HEADER MENU at the end of this file) */

/* r3 (Dave 2026-08-12): a page whose FIRST section is a graphic runs to the top
   edge, underneath the translucent header, so the bar reads as glass from the
   first paint instead of only once something has scrolled beneath it.
   --header-h is set live by the header script; this is the pre-JS fallback. */
:root { --header-h: 73px; }
.site-main > .hero-rotator:first-child,
.site-main > .home-hero:first-child,
.site-main > .home-hero2:first-child,
.site-main > .page-hero-image:first-child,
.site-main > .full-bleed:first-child { margin-top: calc(-1 * var(--header-h)); }

/* r4 (Dave 2026-08-12): shop plaque removed - the header bars are the category
   and filter UI now. The stub keeps an SEO/screen-reader H1 and the filter
   engine, and collapses to zero height wherever the shelf is available. */
.page-head--bare { padding: 0; }
@media (min-width: 881px) { .page-head--bare { padding: 0; margin: 0; } }
@media (max-width: 880px) { .page-head--bare { padding: 1rem 0 0.5rem; } }

/* r5 (Dave 2026-08-12): the bars OVERLAY the page - opening one must not shove
   the image/content down. The shelf is taken out of the header's flow and hung
   beneath the header row, so the header box stays a constant height and the
   page behind never moves. Because the shelf now paints outside the header's
   own background box it carries the same glass itself - named tokens so the two
   surfaces cannot drift apart. */
:root {
  --header-glass: rgba(28, 23, 20, 0.49);
  --header-blur: saturate(160%) blur(14px);
}

/* ═══ HOME HERO — ONE type + layout contract for BOTH landers ══════════════════
   Dave 2026-08-12, r1 → r2 → r3. Each revision supersedes the last.
   r1: "reduce the model and sofa 15%, anchored bottom left" · "move the text right,
       in line with the logo" · "update the style guide" · "leather lander follows".
   r2: "rather centre justify all hero and subtext — for both landing pages" ·
       "for rex, lower the text slightly so not so close to the header bar, but still
       above the image below" · "rex image scale down 20%, anchor bottom right".
   r3: "lower rex header and subtext so they're at the same height as the leather
       lander."

   SCALE (asset, never a CSS transform). Both reductions were made IN
   electric-motion-hero.webp: the sofa + model + contact shadow are matted off the
   plate, re-composited, and the wall/floor behind reconstructed. r1 scaled 0.85 on
   the subject's bottom-LEFT corner; r2 a further 0.80 on the resulting bottom-RIGHT
   corner. Net 0.68 of the master, applied as ONE resample from the master (never a
   resample of a resample), right edge and baseline held. A CSS transform is the wrong
   tool: it shrinks the WALL with the sofa and opens a bare wedge.

   LAYOUT — the two slides now share ONE copy block. r3 asks for the Rex headline and
   subhead to sit at the leather lander's height. The only way that holds at EVERY
   width is to give slide 2 slide 1's actual placement rule, not a matching offset:
   slide 1 is VIEWPORT-HEIGHT relative (centred in the slot, raised translateY(-16vh)),
   slide 2 was WIDTH relative (bottom-anchored, cqw), so any tuned constant matches at
   one width and drifts everywhere else — measured drift was −38px at 2180 and +108px
   at 1024 before this change.
   ⚠ Consequence, deliberate: the CTA row travels with the text, because the stack's
   height is what the centring is computed from — lifting the text while pinning the
   CTAs would need the CTAs out of flow, which changes what "centred" means. Slide 2's
   CTAs therefore leave the low over-the-sofa position tuned on 2026-08-10; that
   position belonged to the left-aligned bottom-anchored composition r1–r3 replaced.
   ⚠ RETIRED by r3: `.home-hero--motion`'s `justify-content: flex-end`,
   `padding-bottom: 8.487cqw`, `transform: none`, `margin: 1.004cqw 0 0` on the sub,
   and r2's `margin-top: 16.3cqw` on the CTA row. Retired by r2: r1's
   `--hero-inset: max(20px, calc((100cqw - --container) / 2))` (the wordmark's left
   edge) and the 2026-08-10 taper `max(4cqw, min(12.8cqw, calc(43.5cqw - 640px)))`.
   The PHONE treatment (@container max-width:700px) keeps its own bottom-anchored
   geometry — that is a measured legibility adaptation to the portrait crop, not a
   composition choice, so r3 restores it explicitly below.

   TYPE. Both slides read the same named tokens, documented on /styleguide/.
   ────────────────────────────────────────────────────────────────────────────────── */
:root {
  --hero-inset:    max(20px, 4cqw);   /* symmetric — copy centres on the slot */
  --fs-hero-title: clamp(26px, 4.4cqw, 64px);
  --fs-hero-sub:   clamp(13px, 1.6cqw, 24px);
  --lh-hero-title: 1.06;
  --lh-hero-sub:   1.45;
  --ls-hero-title: 0.05em;            /* +5% tracking, Dave 2026-08-12 r4 */
  --gap-hero-title-sub: 0.4467em;     /* headline's bottom margin — 2/3 of the old 0.67em */
  --gap-hero-sub-top:   0.6667rem;    /* subhead's top margin   — 2/3 of the old 1rem   */
}

/* Each slide is its own inline-size container so the cqw-based tokens resolve
   against the HERO SLOT (not the viewport) on slide 1 as well as slide 2. */
.home-hero { container-type: inline-size; }

/* ONE copy block, both slides — centred, same type, same vertical placement. */
.home-hero .home-hero__copy {
  width: 100%; max-width: none; margin: 0;
  padding-inline: var(--hero-inset);
  padding-top: var(--header-h, 88px);
  padding-bottom: 0;
  align-items: center;
  justify-content: center;
  text-align: center;
  transform: translateY(-16vh);          /* the raise Dave set 2026-08-10 */
}
/* ⚠ The block MARGINS are declared here, on both slides, not inherited — slide 1's
   headline is an <h1> and slide 2's is an <h2>, and slide 2's old rule zeroed them.
   That mismatch is what made the two stacks different heights, and since the copy is
   CENTRED, a different stack height lands the headline at a different y (measured
   +10px at 900 rising to +17px at 1440 — never a constant, so no offset could have
   fixed it). Values are exactly what slide 1 already computed (0.67em / 1.5em from
   the heading + paragraph rules), so slide 1 does not move and slide 2 lands on it. */
.home-hero .home-hero__title {
  font-size: var(--fs-hero-title); line-height: var(--lh-hero-title);
  letter-spacing: var(--ls-hero-title);
  margin-block: 0.67em var(--gap-hero-title-sub); margin-inline: auto;
  max-width: none;                     /* both slides — see the note below */
}
.home-hero .home-hero__sub {
  font-size: var(--fs-hero-sub); line-height: var(--lh-hero-sub);
  margin-block: var(--gap-hero-sub-top) 1.5em; margin-inline: auto;
  max-width: none; white-space: nowrap;
}
/* r4 (Dave): "raise the subtext a little, closer to the hero text, for both landers —
   close the existing gap by 1/3" and "spread out the hero text a little, like 5%".
   The gap is the SUM of two margins (headline-bottom + subhead-top), so both are cut
   to 2/3 rather than one of them to 1/3 — that keeps their ratio and lands the total
   at exactly two thirds. Tracking is +5% = 0.05em, the standard typographic reading
   (tracking is a fraction of the em). It also settles a drift: the headline was
   -0.02em on the leather lander and 0 on the electric-motion one, so the two landers
   were never tracking the same. One token now, both slides.
   ⚠ max-width is forced to none on BOTH. The leather headline carried max-width:18ch;
   at +5% tracking it measured 665px against a 669px cap and would have wrapped a few
   px later, and a wrapped headline on one slide only would break the matched heights
   r3 just established. Line length is held by the copy itself, not by a cap that one
   slide has and the other does not. */
.home-hero .home-hero__cta { justify-content: center; margin-top: 1.85rem; margin-bottom: 0; gap: 1.25rem; }

/* r5 (Dave): "for text, font, spacing, these have to be the same". Three values were
   still per-slide leftovers from before the landers shared a contract — the subhead's
   max-width and white-space, and the gap between the two CTA buttons (14px on
   electric-motion vs 20px on leather). All three now come from the shared rules above.

   ⚠ WRAPPING is the subtle one, and it is why the answer is `nowrap` rather than a
   shared max-width. Identical rules do NOT give identical layout when the copy differs
   in length: the two subheads measure 603px and 640px, so ANY shared max-width has a
   window where one has wrapped to two lines and the other has not — and because the
   copy block is CENTRED, a one-line difference moves the headline and breaks the
   matched heights. Measured at a 2181px slot: at 36ch BOTH wrap (2 lines each), at 46ch
   NEITHER does — but the 37px between them means the crossover widths differ, so a cap
   sized for one lander is wrong for the other. `nowrap` removes the crossover entirely:
   both are always one line, so the stacks are always the same height.
   Safe because the subhead's font-size floors at 13px, where the longer of the two
   measures ~347px against a ~374px phone slot. Below the phone breakpoint both revert
   to normal wrapping under ONE rule, so they still wrap identically to each other. */
@container (max-width: 700px) {
  .home-hero .home-hero__sub { white-space: normal; max-width: 30ch; }
}

/* Slide 2 only — put the CTA row back DOWN onto the sofa, WITHOUT moving the
   headline or subhead off slide 1's height.
   The copy is CENTRED, so the headline's y is a function of the STACK height: pushing
   the CTAs down with a bigger margin grows the stack and lifts the headline. The pair
   below cancels exactly. For a box of height H, padding-top P, content height C:
       content top = P + (H - P - C) / 2
   so d(top)/dC = -1/2 and d(top)/dP = +1/2. Growing the CTA margin by D (=> dC = D)
   lifts the top by D/2; adding D to padding-top puts it straight back. Net: headline
   and subhead do not move at all, and only the CTA row travels down by D.
   D = 10cqw is WIDTH-relative on purpose — the sofa is too (cover scales the photo to
   the slot's width), so the buttons hold their position on the seat as the slot grows.
   Keeping the CTAs in flow is what makes this robust: nothing here depends on knowing
   the button row's height, which changes when the labels wrap. */
.home-hero--motion .home-hero__copy { padding-top: calc(var(--header-h, 88px) + 10cqw); }
.home-hero--motion .home-hero__cta  { margin-top: calc(1.85rem + 10cqw); }

/* r5 (Dave): "also the position (vertical) of the hero and subtext on both pages" —
   so the CLEARANCE GUARD is GONE. It raised slide 2's copy by up to 48px on a wide,
   short window to keep the subhead off the sofa; any such raise is by definition a
   vertical position slide 2 has and slide 1 does not, which is exactly what the
   instruction rules out. Both landers now place the copy by ONE rule with no
   conditional adjustment.
   ⚠ KNOWN EXPOSURE, accepted deliberately: `cover` scales the photo to the slot's
   WIDTH and anchors it bottom, so the sofa's top edge rides up as a window gets wider
   or shorter, while the copy tracks HEIGHT. Measured subhead-to-sofa gap with no
   guard: 2195x1066 +16 · 1920x1080 +85 · 1920x950 +13 · 1440x900 +99 · 1366x768 +46 —
   all clear. It goes negative only above ~2000px wide AND below ~1030px tall (2180x1000
   measured -21), where the ink subhead lands on tan leather. Fixing that without
   moving the copy needs the slot-height model, which changes slide 1's geometry too.
   Do NOT reinstate a slide-2-only raise. */


/* PHONE — slide 2 only. The slot goes portrait, object-fit:cover crops the pale wall
   away and the ink copy would land on mid-tan leather, so slide 2 reverts to its
   measured white-on-scrim, bottom-anchored treatment (verified 2026-08-10).
   0-3-0 so it beats the 0-2-0 rules above regardless of source order. */
@container (max-width: 700px) {
  /* r5: the subhead's top margin is TEXT SPACING, so it is shared — the old
     per-slide 1.004cqw is gone. Only PLACEMENT (which row sits where) is
     allowed to differ on phone, and only because the portrait crop forces it. */
}

/* ═══ MOBILE HEADER MENU — the hamburger drives the shelf (Dave 2026-08-12, r7) ═══
   Was: a right-hand slide-in .nav-drawer panel (2026-07-27), a second navigation
   mechanism that looked and behaved nothing like the header. Now the hamburger
   opens the SAME shelf the desktop PRODUCTS control opens — bar A slides down from
   under the header carrying the header row's own four controls (Products / Room
   Planner / FAQ / Clearance), and PRODUCTS opens bar B (the categories) beneath it.

   LEFT-ALIGNED AND STACKED, not the desktop centred row: four uppercase labels at
   --fs-sm plus 2.25rem gaps measure ~390px, which does not fit a phone at any
   sensible size. Stacking is the only layout that holds at 320px, and the rows
   inherit .container so every label lines up with the wordmark's left edge.

   No third bar at this width — #shop-filters is still rendered in the page below
   880px, so a filters bar in the shelf would be a second copy of the same control.
   Filtering on mobile is unchanged.

   Height: desktop pins max-height to a fixed --shelf-h per bar; stacked bars have
   no fixed height, so the script measures and writes an inline max-height instead
   (and clears it above 880px so these CSS rules stay in charge there).
   RETIRED by this block: the max-width 880px .nav-shelf display:none rule above
   (now a comment where it stood), and the whole .nav-drawer component — its markup
   is gone from header.php; its CSS is left in place, unreferenced. */
/* The bars are a 46px strip on desktop, so the 0.49 header glass bleeding a little
   page through them is a texture. Stacked on a phone they are a ~160px panel laid
   over a hero, and white labels on the resulting composite measure ~3.5:1 - under
   the 4.5:1 floor. Denser glass ONLY where the panel is tall; still translucent,
   now ~9:1. Named token so the two surfaces cannot drift apart. */
:root { --header-glass-panel: rgba(28, 23, 20, 0.82); }

/* ─── PDP — Product features (range-level badges, sheet-derived) ───
   Same section idiom as .pdp-make directly below it: rule above, bordered
   cell grid, centred icon + micro-label. Icons are inline SVG on the 48px
   optical grid and take colour from --accent through currentColor.
   Column count is auto-fit because a range carries 1–7 badges. */
.pdp-features {
  margin: 0 0 clamp(3rem, 6vw, 5rem);
  padding-top: clamp(1.5rem, 3vw, 2.25rem);
  border-top: 1px solid var(--line);
}
.pdp-features__head {
  margin-bottom: clamp(1.5rem, 3vw, 2.25rem);
  max-width: 36em;
}
.pdp-features__title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.85rem, 3.4vw, 2.6rem);
  letter-spacing: -0.018em;
  line-height: 1.05;
}
.pdp-features__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.pdp-features__cell {
  display: grid;
  justify-items: center;
  gap: 0.85rem;
  padding: clamp(1.5rem, 3vw, 2.25rem) 1rem;
  border-right: 1px solid var(--line);
  text-align: center;
}
.pdp-features__cell:last-child { border-right: 0; }
.pdp-features__icon {
  display: block;
  width: 60px;
  height: 60px;                     /* matches .pdp-make__icon's 60px height so the
                                       two adjacent icon grids read as siblings */
  color: var(--ink);
}
.pdp-features__icon svg { display: block; width: 100%; height: 100%; }
.pdp-features__label {
  font-family: var(--font-display);
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
  color: var(--ink);
}

@media (max-width: 720px) {
  .pdp-features__grid { grid-template-columns: 1fr 1fr; }
  .pdp-features__cell:nth-child(2n) { border-right: 0; }
  .pdp-features__cell:nth-last-child(n+3) { border-bottom: 1px solid var(--line); }
}


/* ============================================================================
   MOBILE HEADER - centred wordmark (Dave 2026-08-13)
   <=880px ONLY: burger LEFT, wordmark CENTRED on the bar, search + cart RIGHT.
   Why anything had to move: measured at 390px BEFORE this change, the four
   right-hand controls (search 36 + account 44 + language 44 + cart 44 + gaps)
   began at x=194 and the bar's centre line is x=195 - a 130px wordmark needs
   65px clear each side, so a true centre was impossible at ANY logo size while
   all four sat on the bar. Account + language therefore move into the hamburger
   shelf (proxy rows, header.php); the real controls stay here, display:none.
   How the centring is done: the wordmark is taken OUT OF FLOW and pinned to the
   ROW's centre (.site-header__row is already position:relative), so it is a
   true geometric centre and cannot be pushed off it by either icon cluster.
   .nav-utility then spans the row and margin-right:auto pushes the burger left.
   Desktop (>=881px) is untouched - every rule below is inside the query.
   Rollback: delete this block; header.php via its .bak-20260813-012930.
   ============================================================================ */
@media (max-width: 880px) {
  /* Scoped to the header 2026-09-04: this block was authored bare as `.wordmark`,
     but footer.php uses the same class and .site-footer__inner is static, so the
     footer wordmark resolved its 50%/50% against the initial containing block and
     rendered dead centre of the viewport on every page at <=880px. */
  .site-header .wordmark {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    /* An abspos box shrink-to-fits to the space from left:50% to the row's right
       edge - i.e. HALF the row - which silently squeezed the wordmark on narrow
       phones. Pin it to its own content width, then cap it at the space actually
       free between the two clusters: 44 burger + ~90 search+cart + 8 clearance,
       doubled so the cap stays symmetric about the centre line. The SVG carries
       preserveAspectRatio="xMidYMid meet", so a capped box scales the artwork
       down rather than distorting it. */
    width: max-content;
    max-width: calc(100% - 196px);
  }
}


/* ─── MOBILE / NARROW-VIEWPORT CONTAINER INSET ───────────────────────────────
   Above --container (1080px) a .container is centred and its side padding is
   cosmetic, so the shorthand-reset classes above were never noticed. At or below
   that width the container IS the viewport, and those same classes put text hard
   against the edge of the screen (wordmark, page headings, body copy, the FAQ
   filter row). Re-assert one inset for every .container at narrow widths - last
   declaration in the file, so it outranks the shorthands at equal specificity.
   Vertical padding from .section / .section-tight is untouched: this sets the
   inline axis only. Wide-viewport composition is unchanged. */
@media (max-width: 1079px) {
  .container {
    padding-left: var(--gutter-mobile);
    padding-right: var(--gutter-mobile);
  }
}

/* ─── FAQ SELECTOR — the header shelf is the only copy ───────────────────────
   The FAQ control in the header opens bar F (the six topics), so the in-page
   .cov-slider strip on /faq/ is a second copy of the same control. Same rule the
   shop already follows for #shop-filters, applied at EVERY width because bar F is
   built on mobile too (as a branch under FAQ in bar A), not desktop-only.
   The strip stays in the DOM: its script owns panel switching and the tab buttons
   are what bar F clicks, so retiring the UI does not fork the behaviour. */
.cov-head .cov-slider-wrap { display: none; }

/* Bar F carries six labels where the categories bar carries four; at the desktop
   2.25rem gap they still fit --container, but tighten the gap so the row keeps the
   same optical rhythm as the bar it replaces. Desktop ONLY: below 881px the bars
   are flex-direction:column, so a gap here would open the stacked topics out to
   1.75rem of VERTICAL space and break rhythm with the rest of bar A. */
/* ============================================================================
   SESSION 2026-08-13 — Dave's five nav/type defects. Appended last so these win
   on source order at equal specificity, matching this file's existing convention.

   (A) DISPLAY TRACKING IS NOW A TOKEN (Dave fork A, option 3).
   Measured before this change: both home-hero slides rendered IDENTICALLY
   (Lusitana 64px / +3.2px / 497.47px for the same test string), so the two
   landers never differed - the divergence was landers (+0.05em) vs the
   styleguide H1 (-0.02em), 0.07em apart, because tracking was never tokenised.
   Display type stays deliberately LOOSE at hero sizes; everything else keeps
   the tight -0.02em. The value is unchanged (0.05em) - this only gives it a
   name so it cannot drift again, and so the styleguide can show it.
   ============================================================================ */
:root { --ls-display: 0.05em; }
.home-hero__title { letter-spacing: var(--ls-display); }

/* ============================================================================
   (B) MOBILE SHELF WAS CLIPPED SHUT - the whole menu was untappable.
   Measured at a true 387px viewport: #nav-shelf computed to max-height:0 /
   height:1px with overflow:hidden while data-open="true" and the JS had written
   an inline max-height:379px. The rows painted (they are laid out) but every
   item failed its own hit test - elementsFromPoint at the SOFAS link returned
   [h1.home-hero__title, div.home-hero__copy, section.home-hero, ...] with NO
   header element in the stack at all. So taps on the mobile menu fell straight
   through to the hero underneath. That is the real cause of both "sofas goes to
   room planner" and, with (C) below, the dead logo.
   Desktop is untouched: it keeps the --shelf-h clip and the slide transition.
   On mobile the bars are stacked and already shown/hidden per-row via [hidden],
   so the clip earns nothing there - drop it and let the rows size themselves.
   ============================================================================ */
/* ============================================================================
   (C) MOBILE LOGO WAS NOT TAPPABLE.
   .nav-utility is position:relative and is a LATER sibling than .wordmark, so
   at equal z-index it paints above it. At <=880px it is also stretched to the
   full row (332px of a 372px bar) to push the burger left, so its empty middle
   sat directly over the absolutely-centred wordmark: elementFromPoint on the
   logo returned div.nav-utility, not the <a href="/">.
   Fix hit-testing WITHOUT touching paint order or z-index (which would put the
   logo above the cart/auth popovers): make the container transparent to
   pointer events and hand them back to its real controls.
   ============================================================================ */
/* ============================================================================
   (D) DEAD-END FILTER PILLS (Dave 2026-08-13, with the facet-aware engine in
   app.js). A pill whose combination would return zero products is disabled
   rather than hidden: hiding it would make the row jump around as you select,
   and you would lose the map of what exists. Reads as "not available with what
   you have picked", not as a broken control.
   ============================================================================ */
.filter-pill:disabled {
  opacity: 0.32;
  cursor: not-allowed;
  pointer-events: none;
}

/* ============================================================================
   (F) PDP BACK CONTROL (Dave 2026-08-13) - returns to the exact shop state you
   left: category, filters, shelf bars and scroll position. Rendered by app.js
   only when there IS a state to go back to, so a PDP reached from a search
   engine or a direct link never shows a dead control.
   ============================================================================ */
.pdp-back {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 1.25rem;
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: var(--ls-btn);
  font-weight: 500;
  color: var(--ink-muted);
  text-decoration: none;
  transition: color var(--t-fast);
}
.pdp-back:hover { color: var(--ink); }

/* ============================================================================
   (G) FILTER PILL COUNTS (Dave 2026-08-13). A greyed-out pill was mysterious:
   selecting Corner disabled Compact with no reason given. It was CORRECT -
   in the published catalogue Compact sits on a single product and shares no
   other tag with anything - but the visitor could not see that. The count makes
   the control explain itself: a pill that leads nowhere reads 0 before you
   click it, so disabling it is obvious rather than janky. The header mirror
   stays label-only (buildSub reads data-label) so bar 3 keeps its clean line.
   ============================================================================ */
.filter-pill { display: inline-flex; align-items: baseline; gap: 0.45rem; }
.filter-pill__n {
  font-size: 0.85em;
  font-variant-numeric: tabular-nums;
  opacity: 0.55;
}
.filter-pill[aria-pressed="true"] .filter-pill__n { opacity: 0.75; }

/* ============================================================================
   (H) FAQ OPENS ON THE CONTENT (Dave 2026-08-13).
   .cov-head was a full-viewport intro - min-height calc(100svh - 4.9rem) plus
   57.14vh of bottom padding - carrying the "Everything you need to know about"
   line, which then animated up into a docked strip once a topic was picked.
   The line and the area are both gone: the h1 survives as .screen-reader-text
   (off-screen, so it costs no space but the page keeps its heading for search
   and screen readers), the retired .cov-slider strip stays display:none as the
   click target the header topics bar drives, and the section collapses so the
   first panel starts immediately under the header. Both states are pinned, so
   the is-docked transition can no longer reintroduce the gap.
   ============================================================================ */
.cov-head,
.cov-head.is-docked {
  min-height: 0;
  padding: 0;
  gap: 0;
  transition: none;
}

/* ══ Leather finish photos as column headers (Dave 2026-08-13) ═══════════
   The finish photos used to sit in a tile row at the FOOT of the Leather
   panel; they now OPEN it, as the background of each column's header. The
   band carries the PIGMENTED / SEMI-ANILINE label and its sub-line only —
   the spec lines were removed 2026-08-13. Everything in the Leather panel's
   two columns is CENTRE-set (band text, range names, notes and colour dots)
   so the two columns read as a matched pair. The table <caption> stays in
   the DOM (visually hidden) so each table keeps its accessible name. */
#cov-panel-leather .fin-head {
  position: relative;
  display: block;
  margin: 0 0 clamp(1.1rem, 2.4vw, 1.6rem);
  border-radius: var(--r);
  overflow: hidden;
  background-color: var(--ink);
  background-image: var(--fin-photo, none);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  box-shadow: var(--shadow-sm);
}
#cov-panel-leather .fin-head::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top,
    rgba(18,14,11,0.90) 0%,
    rgba(18,14,11,0.66) 32%,
    rgba(18,14,11,0.26) 66%,
    rgba(18,14,11,0.08) 100%);
}
#cov-panel-leather .fin-head__inner {
  position: relative;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  min-height: clamp(210px, 21vw, 270px);
  padding: clamp(1.1rem, 2.4vw, 1.6rem);
  text-align: center;
}
#cov-panel-leather .fin-head__id { width: 100%; min-width: 0; }
#cov-panel-leather .fin-head__name {
  display: block;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: clamp(1.1rem, 2.1vw, 1.45rem);
  line-height: 1.1;
  letter-spacing: var(--ls-label);
  text-transform: uppercase;
  color: var(--bg);
  text-shadow: 0 1px 12px rgba(18,14,11,0.45);
}
#cov-panel-leather .fin-head__sub {
  display: block;
  margin: 0.6rem auto 0;
  max-width: 34em;
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--fs-sm);
  line-height: 1.55;
  letter-spacing: 0;
  text-transform: none;
  color: rgba(250,247,240,0.86);
  text-shadow: 0 1px 10px rgba(18,14,11,0.45);
}
/* centre the ranges beneath — name, note and colour dots in both columns */
#cov-panel-leather .leather-rtable--split th,
#cov-panel-leather .leather-rtable--split td { text-align: center; }
#cov-panel-leather .leather-rtable--split .leather-rtable__note {
  text-align: center;
  max-width: 34em;
  margin: 0.5rem auto 0;
}
#cov-panel-leather .leather-dots { justify-content: center; }
/* the old text caption is now the screen-reader-only accessible name */
#cov-panel-leather .leather-col__cap,
#cov-panel-leather .leather-col__sub {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}
/* the column divider starts below the photo bands, not alongside them */
#cov-panel-leather .leather-split::before { top: calc(clamp(210px, 21vw, 270px) + clamp(1.1rem, 2.4vw, 1.6rem)); }
/* ══ end leather finish column headers ═════════════════════════ */
/* ============================================================================
   (I) LIGHT-SLIDE HEADER CONTRAST (Dave 2026-08-13). Reported: a header item
   goes too dark to read once the cursor rolls off it. Mechanism: the home hero
   rotator PAUSES on mouseenter and RESUMES on mouseleave, so rolling off the
   hero advances to the pale electric-motion slide, which sets
   data-hero-tone='light' and flipped every nav control to var(--ink) !important
   - dark ink painted on the header's own DARK glass bar.
   That flip dates from when the over-hero header was transparent; r7 of
   2026-07-02 neutralised that state and the bar has been rgba(28,23,20,0.49)
   ever since, so the remedy has been inverted ever since. Measured white-hero
   composite: ink on the bar = 5.4:1 at best and 3.4 / 2.7 / 2.1:1 across the
   slide's mid-tones, under the 4.5:1 floor - and it drifts as the slide
   crossfades.
   Fix is fix (E)'s principle applied to the header ROW: contrast comes from the
   SURFACE, not from luck. Labels stay white at every tone; the glass thickens to
   0.65 while a light slide shows, measuring 5.5:1 over pure white (vs 3.3:1 at
   0.49) and better over every darker tone. Dark slides keep the 0.49 glass.
   ============================================================================ */
:root { --header-glass-light: rgba(28, 23, 20, 0.65); }


/* ── slide 1: "Make it yours." (2026-08-13). The drawn lander — a photographed room
   with OUR Ollie 33930 drawn into it in graphite, and the two women photographic.
   Full build + gate: `- Temp\hero3-variety\`, handoff
   `_Session-Handoffs\2026-08-13-hero-3-drawn-sofa-variety.md`.

   ⚠ COLOUR AND SCRIM ONLY. Not one geometry value is set here, and that is deliberate:
   r3-r5 spent three rounds making every lander share ONE copy block — same type, same
   spacing, same vertical placement, because a centred stack of a different height lands
   the headline at a different y and the slides visibly jump as the rotator cross-fades.
   This slide therefore inherits the shared `.home-hero .home-hero__copy` rules untouched
   and overrides only what the IMAGE requires. The electric-motion slide is the precedent
   for the treatment and the counter-example for the method: it also re-declares its own
   cqw geometry, which is why it needed r3/r4/r5 to be brought back onto the contract.

   The image is a pale plaster wall behind the copy, so: ink type, no scrim, no
   text-shadow — exactly the electric-motion recipe, which measured 13:1 on the same
   wall. `object-position: center bottom` because the 1.895:1 master crops vertically
   into a taller slot and the bottom is where the women's bare feet are; cropping from
   the top only removes empty wall, and there is more of that than the copy needs. */
.home-hero--make::after { background: none; }
.home-hero--make .home-hero__media img { object-position: center bottom; }
.home-hero--make .home-hero__copy { color: var(--ink); text-shadow: none; }
.home-hero--make .home-hero__title,
.home-hero--make .home-hero__sub { color: var(--ink); }

/* The approved graphite moulding surrounds the semantic HTML copy as a responsive
   nine-slice. Corners keep their drawn proportions; only the straight rails stretch.
   The pseudo-element is out of flow, so the shared hero type and CTA geometry do not move. */
.home-hero--make .home-hero__framed-copy {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  isolation: isolate;
}
.home-hero--make .home-hero__framed-copy::before {
  content: '';
  position: absolute;
  z-index: -1;
  pointer-events: none;
  inset: clamp(-52px, -3.2cqw, -34px) clamp(-88px, -5.6cqw, -56px) clamp(-56px, -3.4cqw, -38px);
  border-style: solid;
  border-width: clamp(28px, 3cqw, 42px);
  border-image-source: url('make-it-yours-frame.png');
  border-image-slice: 199 326 198 323;
  border-image-width: 1;
  border-image-repeat: stretch;
}
.home-hero--make .home-hero__framed-copy > * { position: relative; z-index: 1; }
/* Same CTA pair as the electric-motion slide: primary inverts to ink-on-bg for a pale
   surface, and the secondary is `.btn-inverse` (light fill, ink label) — the component
   the styleguide defines FOR pale/photographic surfaces. Never `.btn-ghost` here: its
   ink outline on this wall is the 1.11-1.24:1 legibility defect already measured on
   slide 2, and never `.btn-line`, which is a text link, not a CTA. */
.home-hero--make .home-hero__cta .btn-primary { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.home-hero--make .home-hero__cta .btn-primary:hover { background: var(--bg); color: var(--ink); }

/* CTA ROW ONLY — moved down onto the seat, and this is the one part of the copy block a
   lander is allowed to move (D3). The headline and subhead do NOT move, by construction.

   ⚠ The defect it fixes was invisible in the artwork and only exists on the live slot.
   The composition is 1.895:1 with its subjects dead centre; the hero slot is up to 2.70:1,
   so `cover` crops ~30% off the TOP — which is exactly the headroom the centred copy stack
   needs — and the two women rise into it. MEASURED at 2181x808: the CTA row ran 379..430
   and the heads began at 342, i.e. the buttons sat across the client's face. The headline
   and subhead were never at risk (they clear by 100px+); only the CTA row dips that far.

   The cancellation is the electric-motion slide's, verbatim, because the arithmetic is the
   same: for a centred box of height H, padding P and content C, content_top = P + (H-P-C)/2,
   so d(top)/dC = -1/2 and d(top)/dP = +1/2. Growing the CTA margin by D lifts the stack by
   D/2; adding D to padding-top puts it back. Headline and subhead land exactly where the
   shared r3-r5 contract puts them on every other lander — measured unchanged at 171/278 —
   and only the buttons travel.

   D = 6cqw is DERIVED, not chosen. cqw because the image is bottom-anchored and `cover`
   scales it to the slot WIDTH, so a width-relative offset tracks the sofa at every
   viewport. The window is bounded at both ends and it is narrow: the row must clear the
   women's shoulders (source y 1010) and stay above their bare feet (source y 1355).
   Measured at 1366x520 / 1440x720 / 1920x864 / 2181x808 / 2560x800, 6cqw is the ONLY value
   of 6 / 8 / 10 that satisfies both at every one of them — 8cqw and 10cqw put the buttons
   on the feet at 1366x520 and at 2560x800. */
.home-hero--make .home-hero__copy { padding-top: calc(var(--header-h, 88px) + 6cqw); }
.home-hero--make .home-hero__cta  { margin-top: calc(1.85rem + 6cqw); }


/* — Trade Portal shelf bar (Dave 2026-08-18) —
   Bar P is bar F with three labels instead of six, so it reuses .nav-shelf /
   .nav-shelf__row / .nav-shelf__link wholesale and inherits the dark
   --header-glass-panel surface those already carry at EVERY width. That is what
   makes it legible under both header states: the contrast comes from the shelf's
   own panel, not from the bar behind it, so the light surface header and the
   transparent [data-overhero="true"] header both sit above a dark strip with the
   same white ink. No token is redefined and no colour is stated here.
   The one rule it needs is bar F's desktop gap, so the two bars that replace the
   categories bar share one optical rhythm. Desktop ONLY — below 881px the rows
   are flex-direction:column and a gap here would open the stacked links out
   vertically, exactly as the note on .nav-shelf__row--faq records. */


/* ==========================================================================
   == header ==
   The ONE home for every rule that styles the site header and its shelf:
   .site-header / .site-header__row / .nav-primary / .nav-utility /
   .nav-toggle / .nav-product / .nav-cta / .nav-shelf* / .search-inline* /
   .lang-select* / svg.lang-flag / #account-* / #cart-* / .cart-popover /
   .account-initials.
   Consolidated 2026-09-04 (design-system-consolidation, S3) out of blocks
   that had accumulated across the whole file in ~21 append-only patches,
   several silently superseding each other. Relative order inside this
   section is UNCHANGED from the pre-consolidation file, so the cascade is
   byte-for-byte the same; the file position is not.
   ORDER INSIDE THIS SECTION IS THE CASCADE. A new header rule goes in the
   matching place below - never appended to the end of the file.
   ========================================================================== */
/* ─── header ─── distinct surface, not blended into body ─── */
.site-header {
  position: sticky;
  top: 0;
  z-index: 80;     /* above bot-fab (60) so cart popover is never overlapped */
  background: var(--surface);
  backdrop-filter: saturate(150%) blur(10px);
  -webkit-backdrop-filter: saturate(150%) blur(10px);
  border-bottom: 1px solid var(--line);
  box-shadow: 0 1px 0 rgba(28,23,20,0.02);
  transition: box-shadow var(--t-base), border-color var(--t-base), transform var(--t-base);
  will-change: transform;
}
.site-header--hidden { transform: translateY(-100%); }

@media (prefers-reduced-motion: reduce) {
  .site-header { transition: box-shadow var(--t-base), border-color var(--t-base); }
}
.site-header[data-scrolled="true"] {
  box-shadow: 0 4px 16px -8px rgba(28,23,20,0.10);
  border-bottom-color: var(--line);
}
.site-header__row {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 2rem;
  padding: 0.38rem 0;        /* -50% header height per Dave 2026-06-25 (was 0.77rem) */
}
/* further -20% in footer */
.nav-primary {
  justify-self: center;
  display: flex;
  align-items: center;          /* match the row's optical centre line */
  gap: 2.25rem;
  margin: 0;                     /* reset default <ul> margin-block (was 19.5px bottom → pushed nav ~10px high off the logo). Dave 2026-06-25 */
  list-style: none;
  font-size: var(--fs-sm);
}
.nav-primary li { display: inline-flex; align-items: center; }
.nav-primary a {
  position: relative;
  display: inline-flex;
  align-items: center;
  line-height: 1;               /* drop the half-leading that pushed labels ~2px high */
  padding: 0.25rem 0;
  color: var(--ink);
  transition: color var(--t-fast);
}
.nav-primary a[aria-current="page"]::after {
  content: '';
  position: absolute;
  left: 0; right: 0; bottom: -2px;
  height: 1px; background: var(--ink);
}
.nav-primary a:hover { color: var(--ink-muted); }
.nav-utility {
  justify-self: end;
  display: flex;
  gap: 0.5rem;
  align-items: center;
  font-size: var(--fs-sm);
  position: relative;
}
.nav-utility a, .nav-utility button {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.5rem;
  border-radius: 999px;
  transition: background var(--t-fast);
}
/* Ink base for the DIRECT trigger controls only. The popovers below are nested
   inside .nav-utility but are their own light surfaces — they must set their own
   text colour so a dark-background popover button (e.g. .cart-popover__foot .btn)
   is not forced to ink and rendered dark-on-dark. (2026-07-08) */
.nav-utility > a, .nav-utility > button { color: var(--ink); }
.nav-utility .cart-popover { color: var(--ink); }
.nav-utility a:hover, .nav-utility button:hover { background: var(--hover); }
.nav-utility svg { width: 20px; height: 20px; stroke-width: 1.6; }
.cart-count { font-variant-numeric: tabular-nums; }

@media (max-width: 880px) {
  .site-header__row { grid-template-columns: auto 1fr auto; gap: 1rem; }
  .nav-primary { display: none; }
  .nav-utility { gap: 0.25rem; }
}
.account-menu {
  position: absolute;
  top: calc(100% + 0.5rem);
  right: 0;
  width: min(240px, calc(100vw - 2rem));
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg);
  padding: 0.5rem;
  z-index: 70;
  display: none;
  animation: popover-in 180ms ease-out;
}
.account-menu[data-open="true"] { display: block; }
.account-menu__head {
  padding: 0.75rem 0.85rem 0.5rem;
  border-bottom: 1px solid var(--line);
  margin-bottom: 0.4rem;
}
.account-menu__head strong { display: block; font-size: var(--fs-sm); }
.account-menu__head span { font-size: var(--fs-xs); color: var(--ink-muted); }
.account-menu a, .account-menu button {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  width: 100%;
  text-align: left;
  padding: 0.55rem 0.85rem;
  border-radius: var(--r);
  font-size: var(--fs-sm);
  color: var(--ink);
}
.account-menu a:hover, .account-menu button:hover { background: var(--hover); }
.account-menu .signout { color: var(--crit); border-top: 1px solid var(--line); margin-top: 0.4rem; padding-top: 0.65rem; border-radius: 0; }
/* ─── cart popover ─── */
.cart-popover {
  position: absolute;
  top: calc(100% + 0.5rem);
  right: 0;
  width: 320px;
  max-width: calc(100vw - 2rem);
  /* hard cap — never extend below viewport. Aggressive ceiling guarantees foot is on screen. */
  max-height: min(440px, calc(100vh - 9rem));
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg);
  z-index: 90;
  display: none;
  flex-direction: column;
  overflow: hidden;
  animation: popover-in 180ms ease-out;
}
.cart-popover[data-open="true"] { display: flex; }
.cart-popover__head {
  padding: 0.55rem 0.8rem 0.5rem;     /* -20% vertical */
  border-bottom: 1px solid var(--line);
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex: none;
}
.cart-popover__head strong {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-md);
  letter-spacing: -0.01em;
}
.cart-popover__close {
  font-size: 1.25rem;
  line-height: 1;
  padding: 0.2rem 0.5rem;
  border-radius: 999px;
  color: var(--ink-muted);
}
.cart-popover__close:hover { background: var(--hover); color: var(--ink); }
.cart-popover__body {
  flex: 1 1 auto;
  min-height: 0;                 /* enables overflow inside flex parent */
  overflow-y: auto;
  padding: 0.25rem 0;
}
.cart-popover__empty {
  padding: 1.75rem 1.25rem;
  text-align: center;
  color: var(--ink-muted);
  font-size: var(--fs-sm);
}
.cart-popover__row {
  display: block;
  padding: 0.85rem 1rem 0.95rem;
  border-bottom: 1px solid var(--line-soft);
}
.cart-popover__row:last-child { border-bottom: 0; }
.cart-popover__row-line1 {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 0.25rem;
}
.cart-popover__row-title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--fs-base);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--ink);
  flex: 1;
  min-width: 0;
}
.cart-popover__qty {
  color: var(--ink-muted);
  font-size: var(--fs-sm);
  margin-left: 0.25rem;
}
.cart-popover__row-price {
  font-size: var(--fs-sm);
  font-variant-numeric: tabular-nums;
  font-weight: 500;
  white-space: nowrap;
  color: var(--ink);
  flex: none;
}
.cart-popover__row-meta {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: var(--fs-xs);
  color: var(--ink-muted);
  line-height: 1.3;
  margin-top: 0.15rem;
}
.cart-popover__row-meta-text {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cart-popover__swatch {
  width: 12px; height: 12px;
  border-radius: 50%;
  border: 1px solid var(--line);
  display: inline-block;
  flex: 0 0 12px;
}
.cart-popover__row-lead {
  font-size: var(--fs-xs);
  color: var(--ink);
  margin-top: 0.25rem;
  letter-spacing: 0.01em;
}
.cart-popover__foot {
  padding: 0.6rem 0.75rem 0.7rem;
  border-top: 1px solid var(--line);
  background: var(--surface);
  flex: 0 0 auto;
}
/* Explicit button render - defensive against inheritance / clipping.
   The ONLY !important left in the header section, and it is load-bearing: this
   button is a .btn on a LIGHT popover surface sitting inside .nav-utility, so it
   is crossed by BOTH the header's dark-glass .nav-utility a:hover wash and the
   global .btn-primary hover. Raising the selector to (0,4,1) instead was tried on
   2026-09-04 and measurably changed the hover shadow and fill, so the declarations
   keep their weight. Every other !important in the header (18 of them) is gone. */
.cart-popover__foot .btn {
  display: flex !important; /* beats: global .btn display rules */
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 38px;
  padding: 0 1rem;
  margin: 0;
  background: var(--ink) !important; /* beats: .site-header .nav-utility a:hover (0,3,1) + .btn-primary:hover */
  color: var(--bg) !important; /* beats: .site-header .nav-utility a (0,3,1) + .btn-primary:hover */
  border: 1px solid var(--ink);
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 500;
  letter-spacing: 0.02em;
  line-height: 1;
  white-space: nowrap;
  text-align: center;
  text-decoration: none;
  box-sizing: border-box;
  box-shadow: var(--shadow-sm);
}
.cart-popover__foot .btn:hover { transform: translateY(-1px); }
/* tighten cart row internals at the narrower 320px popover (~20% smaller) */
.cart-popover__row { padding: 0.55rem 0.8rem 0.65rem; position: relative; }
.cart-popover__row-line1 { gap: 0.6rem; margin-bottom: 0.15rem; }
.cart-popover__row-title { font-size: var(--fs-sm); }
.cart-popover__qty { font-size: var(--fs-xs); }
.cart-popover__row-meta { font-size: 0.7rem; line-height: 1.25; margin-top: 0.1rem; }
.cart-popover__row-lead { font-size: 0.7rem; margin-top: 0.15rem; color: var(--ink-muted); }
/* qty + trash strip at the bottom of each row */
.cart-popover__row-controls {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 0.4rem;
  gap: 0.5rem;
}
.cart-popover__qty-ctl {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  overflow: hidden;
}
.cart-popover__qty-ctl button {
  padding: 0.2rem 0.55rem;
  line-height: 1;
  color: var(--ink);
  font-size: var(--fs-sm);
  background: transparent;
}
.cart-popover__qty-ctl button:hover { background: var(--hover); }
.cart-popover__qty-ctl span {
  padding: 0 0.45rem;
  min-width: 1.2rem;
  text-align: center;
  font-variant-numeric: tabular-nums;
  font-size: var(--fs-xs);
}
.cart-popover__remove {
  width: 26px; height: 26px;
  border-radius: 999px;
  border: 1px solid var(--line);
  color: var(--ink-muted);
  background: var(--surface);
  display: grid;
  place-items: center;
}
.cart-popover__remove:hover { border-color: var(--crit); color: var(--crit); }
.cart-popover__remove svg { width: 13px; height: 13px; }
/* ─── inline expanding search (header) ─── */
.search-inline {
  position: relative;
  display: inline-flex;
  align-items: center;
}
.search-inline__btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  border-radius: 999px;
  color: var(--ink);
  background: transparent;
  transition: background var(--t-fast);
}
.search-inline__btn:hover { background: var(--hover); }
.search-inline__btn svg { width: 20px; height: 20px; }
.search-inline__field {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  height: 38px;
  width: 0;
  padding: 0;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 999px;
  overflow: hidden;
  opacity: 0;
  pointer-events: none;
  transition: width 260ms cubic-bezier(.2,.7,.3,1), opacity 200ms ease, padding 200ms ease;
  z-index: 75;
}
.search-inline[data-open="true"] .search-inline__field {
  width: clamp(180px, 26vw, 290px);   /* -20% from prior 32vw / 360px */
  padding: 0 0.85rem 0 1rem;
  opacity: 1;
  pointer-events: auto;
}
.search-inline[data-open="true"] .search-inline__btn { background: var(--hover); }
.search-inline__field input {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  outline: none;
  background: transparent;
  font-size: var(--fs-sm);
  padding: 0.3rem 0;
  color: var(--ink);
}
.search-inline__close {
  flex: none;
  width: 22px;
  height: 22px;
  border-radius: 999px;
  font-size: 1rem;
  line-height: 1;
  color: var(--ink-muted);
  display: grid;
  place-items: center;
}
.search-inline__close:hover { background: var(--hover); color: var(--ink); }
.search-inline__suggest {
  position: absolute;
  top: calc(100% + 0.55rem);
  right: 0;
  width: clamp(220px, 30vw, 320px);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg);
  padding: 0.4rem;
  display: none;
  z-index: 75;
  max-height: 60vh;
  overflow-y: auto;
}
.search-inline[data-open="true"][data-suggest="true"] .search-inline__suggest { display: block; }
.search-inline__suggest-group {
  padding: 0.4rem 0.5rem 0.15rem;
  font-size: var(--fs-xs);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.search-inline__suggest a {
  display: flex;
  align-items: center;
  gap: 0.65rem;
  padding: 0.55rem 0.6rem;
  border-radius: var(--r);
  font-size: var(--fs-sm);
  color: var(--ink);
}
.search-inline__suggest a:hover, .search-inline__suggest a[aria-selected="true"] { background: var(--hover); }
.search-inline__suggest a strong { font-weight: 500; }
.search-inline__suggest a span { color: var(--ink-muted); font-size: var(--fs-xs); margin-left: auto; }
.search-inline__suggest-empty {
  padding: 0.85rem 0.6rem;
  font-size: var(--fs-sm);
  color: var(--ink-muted);
  text-align: center;
}
/* Suggestion thumbnail + mobile-drawer suggestion list (2026-07-27, Dave:
   'search should expand to a field and populate matches underneath'). The
   drawer field is already inline, so its list sits in flow beneath the form
   instead of floating. */
.search-inline__suggest a img {
  flex: none;
  width: 44px;
  height: 32px;
  object-fit: cover;
  border-radius: var(--r-sm);
  background: var(--hover);
}
/* ─── language selector (header) ─── */
.lang-select {
  position: relative;
  display: inline-flex;
  align-items: center;
}
.lang-select__btn {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.5rem 0.6rem;
  border-radius: 999px;
  font-size: var(--fs-xs);
  letter-spacing: 0.04em;
  color: var(--ink);
  background: transparent;
  transition: background var(--t-fast);
}
.lang-select__btn:hover { background: var(--hover); }
.lang-select__btn svg { width: 18px; height: 18px; }
.lang-select__menu {
  position: absolute;
  top: calc(100% + 0.5rem);
  right: 0;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: 0 16px 32px rgba(0,0,0,0.10);
  padding: 0.3rem;
  min-width: 140px;
  display: none;
  z-index: 70;
}
.lang-select[data-open="true"] .lang-select__menu { display: block; }
.lang-select__menu button {
  display: flex;
  width: 100%;
  align-items: center;
  justify-content: space-between;
  gap: 0.6rem;
  padding: 0.5rem 0.65rem;
  border-radius: var(--r-sm);
  font-size: var(--fs-sm);
  color: var(--ink);
  text-align: left;
}
.lang-select__menu button:hover { background: var(--hover); }
.lang-select__menu button[aria-pressed="true"]::after { content: '✓'; color: var(--ink-muted); font-size: var(--fs-xs); }
/* — header: persistent, condensing, uppercase nav — */
.site-header { transition: background var(--t-base), box-shadow var(--t-base), border-color var(--t-base); }
/* hide-on-scroll RESTORED per Dave 2026-07-02 — base .site-header--hidden translateY(-100%) applies */
.site-header__row { padding: 1.15rem 0; transition: padding var(--t-base); }
/* Dave 2026-07-07 (r5): dialled back from 1.3rem, "not quite as tall" */
.site-header[data-scrolled="true"] .site-header__row { padding: 1.15rem 0; }
/* Dave 2026-07-07 (r5): header height now CONSTANT — no more scroll-condense */
.nav-primary { font-size: var(--fs-label); }
.nav-primary a { text-transform: uppercase; letter-spacing: var(--ls-btn); font-weight: 500; }
/* r4: transparent-over-hero retired with the split-panel hero — one header
   system everywhere (sticky surface, hide-on-down / reveal-on-any-up). */
.site-header[data-overhero="true"] {
  background: transparent;
  border-bottom-color: transparent;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
.site-header[data-overhero="true"] .wordmark img { filter: brightness(0) invert(1); }
.site-header[data-overhero="true"] .nav-primary a,
.site-header[data-overhero="true"] .nav-utility > a,
.site-header[data-overhero="true"] .nav-utility > button { color: #FFFFFF; }
.site-header[data-overhero="true"] .nav-primary a:hover { color: rgba(255,255,255,0.75); }
.site-header[data-overhero="true"] .nav-utility a:hover,
.site-header[data-overhero="true"] .nav-utility button:hover { background: rgba(255,255,255,0.14); }
/* — round-2 hotfix: over-hero header text goes white, hardened (some UA/cascade
     path kept the ink colour; measured live 2026-07-02) — */
.site-header[data-overhero="true"] .nav-primary li a { color: #FFFFFF; }
.site-header[data-overhero="true"] .nav-utility > a,
.site-header[data-overhero="true"] .nav-utility > button { color: #FFFFFF; }
/* — round-3b (Dave 2026-07-02): snappy header reveal + monument width cap — */
.site-header {
  transition: transform 180ms cubic-bezier(.2,.7,.3,1),
              background var(--t-base), box-shadow var(--t-base), border-color var(--t-base);
}
/* r6 (Dave 2026-07-02): translucent header — B&B quality (theirs: rgba(0,0,0,.8)).
   Photography ghosts through the bar, so hide/unhide reads as natural motion
   rather than a solid slab appearing. Cream at .78 + stronger blur. */
.site-header {
  /* Dave 2026-07-07 (r5): darker + transparent, B&B Italia reference (theirs
     measured: rgba(0,0,0,.8)) — reusing --ink's own RGB (28,23,20), dialled to
     0.65 alpha per Dave, slightly more transparent than B&B's own 0.8. */
  background: rgba(28, 23, 20, 0.49);
  backdrop-filter: saturate(160%) blur(14px);
  -webkit-backdrop-filter: saturate(160%) blur(14px);
}
/* Header is dark now everywhere (not just over-hero) — flip nav/logo to white,
   scoped to .site-header only so the footer wordmark is untouched. */
.site-header .wordmark,
.site-header .nav-primary a,
.site-header .nav-utility > a,
.site-header .nav-utility > button { color: #FFFFFF; }.site-header .wordmark img {
 filter: brightness(0) invert(1);
 transform: translateY(-3px);
}
/* optical-align lowercase wordmark to caps nav — Dave 2026-07-13 */
.site-header .nav-primary a[aria-current="page"]::after { background: #FFFFFF; }
.site-header .nav-primary a:hover { color: rgba(255,255,255,0.75); }
.site-header .nav-utility a:hover,
.site-header .nav-utility button:hover { background: rgba(255,255,255,0.14); }
/* — r7 (Dave 2026-07-02): full-bleed hero restored (split panel retired).
     Header stays FROSTED over the hero — the translucent bar Dave liked is the
     over-photo treatment now; the old transparent [data-overhero] state is
     neutralised (incl. the hotfix). — */
.site-header[data-overhero="true"] {
  background: rgba(28, 23, 20, 0.49);
  border-bottom-color: transparent;
  backdrop-filter: saturate(160%) blur(14px);
  -webkit-backdrop-filter: saturate(160%) blur(14px);
  box-shadow: none;
}
.site-header[data-overhero="true"] .wordmark img { filter: brightness(0) invert(1); }
.site-header[data-overhero="true"] .nav-primary li a { color: #FFFFFF; }
.site-header[data-overhero="true"] .nav-primary a,
.site-header[data-overhero="true"] .nav-utility > a,
.site-header[data-overhero="true"] .nav-utility > button { color: #FFFFFF; }
.site-header[data-overhero="true"] .nav-utility a:hover,
.site-header[data-overhero="true"] .nav-utility button:hover { background: rgba(255,255,255,0.14); }
/* r9 (Dave 2026-07-02): NO line between header and photography — the frosted
   edge is the separator. Border + scrolled shadow removed in all states. */
.site-header,
.site-header[data-scrolled="true"],
.site-header[data-overhero="true"] {
  border-bottom: 0;
  box-shadow: none;
}
/* ═══ Cart / checkout / mini-cart product imagery (2026-07-08) ═══
   Thumbnails resolved server-side from the "product" sheet
   (Catalogue "cart_image" column, else hero fallback). */
.cart-popover__row-main { display: flex; gap: 0.7rem; align-items: flex-start; }
.cart-popover__thumb {
  width: 52px; height: 52px; flex: 0 0 52px;
  object-fit: contain; padding: 3px; border-radius: var(--r-sm);
  border: 1px solid var(--line); background: var(--hover);
}
.cart-popover__row-info { flex: 1; min-width: 0; }
/* ── Fix 2026-07-20: sign-in popover injected inside .nav-utility ──────────────
   The header's nav-utility hover styling (incl. the over-hero translucent-white,
   .site-header[data-overhero="true"] .nav-utility button:hover) is a descendant
   selector, so it bleeds onto the popover's buttons and overrode the account-type
   toggle's selected pill — hovering the chosen Personal/Trade button swapped its
   dark pill (var(--ink)) for translucent-white while its text stayed cream
   (var(--bg)), making the selected label vanish. The header COLOUR rules already
   use '>' to avoid this; the hover rules do not. Re-assert the popover's own
   hover + selected states above the header rules (scoped, so the real search/
   account/cart/lang icons are untouched). */
/* 2026-08-31: the sign-in popover's half of this fix is retired with the mock
   popover it was written for. .signin-pop is a direct child of <body>, so no
   .site-header descendant rule can bleed onto it and it needs no counter-rule. */

/* Same bleed on the account menu (also injected inside .nav-utility, shown when
   signed in). The over-hero .nav-utility a/button:hover translucent-white
   descendant rule out-specifies .account-menu a/button:hover, painting menu
   items and the Sign-out button white on hover. Re-assert the menu own hover;
   the #account-menu id keeps this above the header rule and scoped to the menu. */
.site-header .nav-utility #account-menu a:hover,
.site-header .nav-utility #account-menu button:hover {
  background: var(--hover);
}
/* ============================================================================
   MOBILE HARDENING — 2026-07-27 (build-orchestrator run: mobile-hardening)
   Two blocks:
     A) mobile nav drawer  — .nav-primary is display:none <=880px and had no
        replacement, so the six category links were unreachable on a phone.
     B) touch ergonomics   — >=44px tap targets and >=13px type, SCOPED to
        <=880px on purpose: 44px is a TOUCH minimum, and applying it at desktop
        would inflate the footer, the header and the 7-column swatch grid.
   All values come from :root. No ad-hoc hex, no bespoke buttons.
   Rollback: everything below this banner is additive — delete from the banner
   to EOF, or restore the .bak listed in the run report.
   ============================================================================ */

/* ─── A. mobile nav drawer ─────────────────────────────────────────────── */

/* toggle — first child of .nav-utility, so it inherits the header's existing
   white-on-dark treatment and changes no grid template. */
/* Specificity note (fixed 2026-07-27 after a desktop-1440 A/B caught this):
   a bare .nav-toggle (0,1,0) is OUT-SPECIFIED by the pre-existing
   `.nav-utility a, .nav-utility button { display:inline-flex }` (0,1,1) at
   line ~323, so `display:none` never applied and the hamburger rendered on
   desktop. `.nav-utility > .nav-toggle` (0,2,0) wins. Same trap for the icon:
   `.nav-toggle svg` tied with `.nav-utility svg {20px}` and won on source
   order at EVERY width, growing the header 1.86px sitewide — so the icon
   size now lives inside the <=880px block where it belongs. */
.nav-utility > .nav-toggle { display: none; }

@media (max-width: 880px) {
  .nav-utility > .nav-toggle { display: inline-flex; align-items: center; justify-content: center; }
  .nav-utility > .nav-toggle svg { width: 22px; height: 22px; stroke-width: 1.6; }
  /* --- 44px tap targets --- */
  
    /* header controls: 32x36 / 43x36 -> 44x44. The row padding drops to keep the
       header the same overall height it was before the bump. */
    .site-header__row { padding: 0.5rem 0; }
  .site-header[data-scrolled="true"] .site-header__row { padding: 0.5rem 0; }
  .nav-utility > a,
    .nav-utility > button {
      min-width: 44px;
      min-height: 44px;
      justify-content: center;
    }
  .lang-select__btn { min-width: 44px; min-height: 44px; justify-content: center; }
  /* type stragglers the first pass did not out-specify */
    .lang-select__btn, .lang-select__btn span { font-size: var(--fs-sm); }
}
/* ─── header search — full-row TAKEOVER (2026-07-27, Dave chose option 3) ──────
   Supersedes the leftward-expanding pill, which overlaid the nav links to its
   left (Room Planner / FAQ / Clearance): the 1080px container has no slack, so
   an expanding field had to cover something. Now the header changes MODE —
   wordmark, nav links and the other utility icons fade out, the field spans the
   whole row, and the suggestion panel sits full-width beneath it. Nothing is
   ever covered.

   State machine: app.js sets data-search on .site-header —
   open -> closing (geometry held so the close can animate) -> closed. */

.site-header__row { position: relative; }
/* things that step aside — return transition (slightly delayed so the field
   clears out of the way first) */
.wordmark,
.nav-primary,
.nav-toggle,
.nav-utility > #account-trigger,
.nav-utility > .lang-select,
.nav-utility > #cart-trigger,
.search-inline__btn { transition: opacity 200ms ease 90ms; }
.site-header[data-search="open"] .wordmark,
.site-header[data-search="open"] .nav-primary,
.site-header[data-search="open"] .nav-toggle,
.site-header[data-search="open"] .nav-utility > #account-trigger,
.site-header[data-search="open"] .nav-utility > .lang-select,
.site-header[data-search="open"] .nav-utility > #cart-trigger,
.site-header[data-search="open"] .search-inline__btn {
  opacity: 0;
  pointer-events: none;
  transition: opacity 140ms ease;
}
/* anchor the field + suggestions to the ROW, not to the 36px icon button */
.site-header[data-search="open"] .nav-utility,
.site-header[data-search="closing"] .nav-utility,
.site-header[data-search="open"] .search-inline,
.site-header[data-search="closing"] .search-inline { position: static; }
/* wipe in from the right (where the icon was) rather than animating width —
   width is auto in takeover mode, which is not animatable */
.search-inline__field {
  clip-path: inset(0 0 0 calc(100% - 38px) round 999px);
  transition: width 260ms cubic-bezier(.2,.7,.3,1),
              opacity 220ms ease,
              padding 200ms ease,
              clip-path 340ms cubic-bezier(.2,.7,.3,1);
}
.site-header[data-search="open"] .search-inline__field,
.site-header[data-search="closing"] .search-inline__field {
  left: 0;
  right: 0;
  width: auto;
  padding: 0 0.5rem 0 1.15rem;
}
.site-header[data-search="open"] .search-inline__field { clip-path: inset(0 round 999px); }
.site-header[data-search="open"] .search-inline__field input { font-size: var(--fs-base); }
.site-header[data-search="open"] .search-inline__suggest,
.site-header[data-search="closing"] .search-inline__suggest {
  left: 0;
  right: 0;
  width: auto;
}

@media (prefers-reduced-motion: reduce) {
  .search-inline__field { transition: opacity 120ms ease; clip-path: none; }
  .site-header[data-search="open"] .search-inline__field { clip-path: none; }
}
/* kill the browser's native clear button — the field already has its own close
   control, so Chrome/Safari rendered a second x next to ours (2026-07-27) */
.search-inline__field input[type="search"]::-webkit-search-cancel-button,
.search-inline__field input[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
  appearance: none;
}
/* GHOST CTA LEGIBILITY — MEASURED, NOT FIXED HERE (2026-08-10; separate item).
   The outlined ghost CTA sits on tan leather: worst-pixel contrast of its ink outline +
   ink label measures 1.11-1.24:1 across every desktop width (needs 4.5:1). Pre-existing —
   it already straddled the sofa arm at the 4cqw gutter — but the redline-#2 shift moves it
   from roughly half-on to fully-on the leather at wide viewports.
   A light-veil version (the slide-1 .home-hero__browse treatment: white label + rgba ink
   veil + blur) WAS built and MEASURED, then REVERTED: at a 0.30 veil it only reaches
   2.54-3.59:1, and closing to 4.5:1 needs a ~0.66 veil, which is a solid dark plate — at
   which point it reads as a second PRIMARY and the two CTAs stop being distinguishable.
   The correct component already exists: .btn-accent, defined in the styleguide as the
   inverse of primary (light fill) FOR DARK / PHOTOGRAPHIC SURFACES. Swapping .btn-ghost ->
   .btn-accent in front-page.php gives a light-filled button with an ink label (~14:1) and
   keeps the primary/secondary pair readable. Not done unasked: it changes the look of a
   CTA Dave has signed off, so it is his call, not a silent restyle. */
/* r5 (Dave 2026-08-12) — the legacy phone block for slide 2 is RETIRED, and with it the
   last per-slide divergence. It existed because the portrait crop put the BOTTOM-anchored
   copy on mid-tan leather (measured 1.05:1 / 1.86:1 on 2026-08-10), so the copy went white
   over a bottom-up scrim. r5 makes the vertical position identical on both landers, which
   moves slide 2's phone copy UP into the pale wall the crop still shows — where white type
   measured 1.16:1, i.e. the old remedy became the new fault. Ink at the new position
   measures 13.38 / 13.31 / 13.33:1 at 414 / 390 / 360, so slide 2 is simply ink at every
   width now: no phone colour override, no scrim, no CTA override (the ghost button it
   restyled was replaced by .btn-inverse). The general lesson: a colour remedy is pinned to
   a POSITION, so re-check it whenever the position moves. */

/* ── header tone. Over the hero the nav is white; on the pale motion
   slide that would render it invisible. The rotator sets data-hero-tone on the
   header while a light slide is showing. ──────────────────────────────────── */
.site-header[data-overhero='true'][data-hero-tone='light'] .wordmark img { filter: none; }
/* ⚠ PRODUCT is the one primary-nav item that is a <button> (it drives the shelf), not
   an <a>. The light-tone retone originally listed anchors only, so on the pale
   electric-motion slide every link went ink and PRODUCT alone stayed white — reported
   by Dave 2026-08-12. Select the CONTROL, not the element type: any a OR button inside
   .nav-primary. Same for the hover below. */
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary li a,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary a,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary button,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility > a,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility > button { color: var(--ink); }
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary a:hover,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary button:hover { color: rgba(28,23,20,0.70); }
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility a:hover,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility button:hover { background: rgba(28,23,20,0.10); }
/* ─── header PRODUCT shelf (Dave 2026-08-12, r2) ────────────────────────────
   One PRODUCT trigger replaces the four category links. The shelf slides down
   INSIDE .site-header so it inherits the header's translucent dark surface.
   Level 1 = categories. Level 2 = the current family's selectors, mirrored from
   #shop-filters (app.js still owns the filtering). r2 (Dave): caret dropped,
   shelf bars SHORTER than the header row and vertically centred, max-height
   pinned to the exact bar height so the slide eases the whole way down, and the
   now-redundant in-page selector row hidden wherever the shelf is available. */
.nav-primary .nav-product {
  display: inline-flex;
  align-items: center;
  font: inherit;
  line-height: 1;
  padding: 0.25rem 0;
  background: none;
  border: 0;
  cursor: pointer;
  color: #FFFFFF;
  text-transform: uppercase;
  letter-spacing: var(--ls-btn);
  font-weight: 500;
  transition: color var(--t-fast);
}
.nav-primary .nav-product:hover { color: rgba(255,255,255,0.75); }
.nav-shelf {
  --shelf-h: 46px;              /* deliberately shorter than the 73px header row */
  overflow: hidden;
  max-height: 0;
  border-top: 1px solid transparent;
  transition: max-height 280ms cubic-bezier(.2,.7,.3,1), border-top-color var(--t-base);
}
.nav-shelf[data-open="true"] {
  max-height: var(--shelf-h);
  border-top-color: rgba(255,255,255,0.16);
}
/* r3 (Dave): the filters bar STACKS below the categories bar - a third
   identical bar sliding down - rather than replacing it. */
.nav-shelf[data-open="true"][data-level="2"] { max-height: calc(var(--shelf-h) * 2); }
.nav-shelf__row--sub { border-top: 1px solid rgba(255,255,255,0.16); }
/* `.nav-shelf__row` sets display:flex, which OUT-SPECIFIES the [hidden] attribute's
   UA display:none (a 0,1,0 author rule beats a UA presentational hint), so a hidden
   row stays laid out. This bites at EVERY width, not just mobile: desktop clips the
   shelf to one --shelf-h from the top, so the still-laid-out level-0 root row filled
   the visible strip and PRODUCTS appeared to drop a copy of the header bar instead of
   the categories. Global, not inside a media query. */
.nav-shelf__row[hidden] { display: none; }
.nav-shelf__row {
  display: flex;
  justify-content: center;      /* horizontal centre */
  align-items: center;          /* vertical centre within the shorter bar */
  flex-wrap: nowrap;
  height: var(--shelf-h);
  padding: 0;
  gap: 2.25rem;
}
.nav-shelf__link {
  position: relative;
  display: inline-flex;
  align-items: center;
  font: inherit;
  line-height: 1;
  padding: 0;
  background: none;
  border: 0;
  cursor: pointer;
  color: #FFFFFF;
  text-transform: uppercase;
  font-size: var(--fs-label);
  letter-spacing: var(--ls-btn);
  font-weight: 500;
  transition: color var(--t-fast);
}
.nav-shelf__link:hover { color: rgba(255,255,255,0.75); }
.nav-shelf__link[aria-current="page"]::after,
.nav-shelf__link[aria-pressed="true"]::after {
  content: '';
  position: absolute;
  left: 0; right: 0; bottom: -4px;
  height: 1px;
  background: #FFFFFF;
}

@media (prefers-reduced-motion: reduce) {
  .nav-shelf { transition: none; }
}
.site-header { background: var(--header-glass); }
.nav-shelf {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background: var(--header-glass);
  backdrop-filter: var(--header-blur);
  -webkit-backdrop-filter: var(--header-blur);
}

@media (max-width: 880px) {
  .nav-shelf { display: block; background: var(--header-glass-panel); }
  /* (the [hidden] re-assertion is global now - see .nav-shelf__row above) */
    .nav-shelf__row {
      flex-direction: column;
      align-items: flex-start;
      justify-content: flex-start;
      flex-wrap: nowrap;
      height: auto;
      gap: 0;
      padding-top: 0.35rem;
      padding-bottom: 0.65rem;
    }
  /* r8 (Dave): the categories drop in DIRECTLY BENEATH the PRODUCTS item, inside
       bar A, so they read as that item opening rather than a second bar appearing
       under the whole list. The script re-parents the row; these rules undo the
       .container geometry it carries as a top-level bar and indent it as a branch.
       RETIRED by r8: the full-width hairline that separated bar B from bar A. */
    .nav-shelf__row--root > .nav-shelf__row {
      width: 100%;
      max-width: none;
      margin: 0;
      padding: 0 0 0.3rem;
    }
  .nav-shelf__row--root > .nav-shelf__row > .nav-shelf__link {
      padding-left: 1.1rem;
      font-size: var(--fs-label);
      color: rgba(255,255,255,0.88);
    }
  .nav-shelf__row--root > .nav-shelf__row > .nav-shelf__link:hover { color: #FFFFFF; }
  .nav-shelf__link {
      padding: 0.7rem 0;
      font-size: var(--fs-sm);
      letter-spacing: var(--ls-btn);
    }
  .nav-shelf__link[aria-current="page"]::after,
    .nav-shelf__link[aria-pressed="true"]::after { bottom: 0.45rem; }
  .site-header__row { grid-template-columns: 1fr; }
  .nav-utility { grid-column: 1; justify-self: stretch; width: 100%; }
  .nav-utility > .nav-toggle { margin-right: auto; }
  .nav-utility > #account-trigger,
    .nav-utility > .lang-select { display: none; }
  /* the two relocated controls, in the shelf's root bar */
    .nav-shelf__lang { display: flex; align-items: center; gap: 1.75rem; }
}
/* ============================================================================
   CART BADGE + LANGUAGE FLAGS (Dave 2026-08-13) — both viewports.
   Cart: an empty cart shows the icon ALONE (the numeral is hidden by the
   observer in header.php, which is where every writer is caught at once). With
   items, the numeral hangs off the icon's bottom-right like a comma - so it is
   anchored to .cart-icon, NOT to the 36/44px button, or it would float away
   from the glyph as the tap target grows.
   Flags: the five language flags are inline SVG from app.js. A hairline ring
   keeps the white-heavy flags (JP, KR) readable on the dark header glass.
   ============================================================================ */
.cart-icon { position: relative; display: inline-flex; align-items: center; }
.cart-count {
  position: absolute;
  left: 100%;
  bottom: -0.12em;
  margin-left: 1px;
  font-size: 11px;
  line-height: 1;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  pointer-events: none;
}
[data-cart-count][hidden] { display: none; }
/* svg.lang-flag, not .lang-flag: `.nav-utility svg { width:20px; height:20px }`
   (~line 338) is (0,1,1) and a bare .lang-flag is (0,1,0), so it lost - the flags
   came out in a 20x20 square box and the ticked row's flag was flex-shrunk to
   zero width and vanished. Tie the specificity and win on source order, and pin
   flex so a sibling tick can never squeeze it again. */
svg.lang-flag {
  display: block;
  flex: none;
  width: 18px;
  height: 12px;
  border-radius: 1px;
  /* dark ring by default: the dropdown is a LIGHT surface, where a white ring is
     invisible and the white-heavy flags (JP, KR) float. White ring only where a
     flag sits on the dark header glass. */
  box-shadow: 0 0 0 1px rgba(28,23,20,0.22);
}
.site-header .lang-select__btn svg.lang-flag,
.nav-shelf__lang svg.lang-flag { box-shadow: 0 0 0 1px rgba(255,255,255,0.38); }
.lang-select__btn { gap: 0; padding: 0.5rem; }
/* wide enough that the flag AND the aria-pressed tick sit INSIDE the panel -
   at min-width:0 the tick was pushed outside the white surface - and one fixed
   row height so the ticked row is not 7px taller than the rest. */
.lang-select__menu { min-width: 4.5rem; padding: 0.25rem; }
.lang-select__menu button {
  justify-content: center;
  gap: 0.4rem;
  padding: 0.4rem 0.5rem;
  min-height: 34px;
}
.nav-shelf__lang { display: flex; align-items: center; gap: 1.15rem; }
.nav-shelf__lang .nav-shelf__lang-btn { padding: 0.7rem 0; }
.nav-shelf__lang svg.lang-flag { width: 26px; height: 17.3px; }

@media (min-width: 881px) {
  .nav-shelf__row--faq { gap: 1.75rem; }
}

@media (max-width: 880px) {
  .nav-shelf[data-open="true"] { max-height: none; overflow: visible; }
  .nav-utility { pointer-events: none; }
  .nav-utility > * { pointer-events: auto; }
}
/* ============================================================================
   (E) SHELF CONTRAST IS NOW SELF-SUFFICIENT (Dave 2026-08-13).
   Symptom: click SOFAS and the shelf labels became unreadable. Cause: the shelf
   inherited the HEADER ROW glass, --header-glass rgba(28,23,20,0.49). The row
   can afford that because it flips its own text to --ink over a light hero
   (the [data-hero-tone="light"] rules); the shelf never did, so its
   white labels sat on a 49%-opaque panel over whatever the hero was showing.
   Measured: white on that composite over a white hero = rgb(144,140,137),
   about 2.6:1 - under the 4.5:1 floor. And the shop hero ROTATES, so the same
   label drifted in and out of legibility while you looked at it.
   Fix: the shelf gets the DENSER panel token that mobile already proved
   (--header-glass-panel, 0.82) at every width, so it is always a dark surface
   and white is always the correct ink on it - about 9:1 over the worst case.
   Same principle as the row tone flip (contrast comes from the surface, not
   from luck), applied where the surface is the panel of the shelf itself.
   ============================================================================ */
.nav-shelf { background: var(--header-glass-panel); }
.site-header[data-overhero='true'][data-hero-tone='light'] { background: var(--header-glass-light); }
.site-header[data-overhero='true'][data-hero-tone='light'] .wordmark img { filter: brightness(0) invert(1); }
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary li a,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary a,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary button,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility > a,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility > button { color: #FFFFFF; }
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary a:hover,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary button:hover { color: rgba(255,255,255,0.75); }
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility a:hover,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility button:hover { background: rgba(255,255,255,0.14); }
/* the lang control is .nav-utility > div > button, so the ">" colour rules above
   never reached it and it kept .lang-select__btn { color: var(--ink) } on the dark
   bar. Same defect, same bar - white is the correct ink on this surface. */
.site-header .lang-select__btn { color: #FFFFFF; }
/* ============================================================================
   (J) SHELF HOVER MUST NOT DIM THE SELECTED ITEM (Dave 2026-08-13, r2).
   Reported: in the header bars a SELECTED item sometimes goes too dark to read
   once the cursor has rolled off it, and looks normal again by the time you
   reach for a screenshot.
   Reproduced: hover a bar-3 filter and it drops to rgba(255,255,255,0.75) - a
   DIMMING affordance on a dark panel. Click it and the item is now the selected
   one, still wearing the dim. Chrome latches :hover on the element the pointer
   last rested on, so the dim persists after the pointer has effectively left,
   and clears on the next mousemove - which is exactly the move you make to
   capture it. So the one label that must be the most legible in the row (the
   one you just chose) is the one rendered faintest, intermittently.
   Fix: hover stops being a brightness change. Every shelf label stays #FFFFFF;
   an unselected label gets a half-alpha underline on hover instead, so the
   affordance survives without trading legibility for it. A selected label keeps
   its solid underline and full white at all times, hovered or not - the mobile
   branch at line ~7364 already reached this conclusion for the root row.
   ============================================================================ */
.nav-shelf__link:hover,
.nav-shelf__link[aria-pressed="true"]:hover,
.nav-shelf__link[aria-current="page"]:hover { color: #FFFFFF; }
.nav-shelf__link:not([aria-pressed="true"]):not([aria-current="page"]):hover::after {
  content: '';
  position: absolute;
  left: 0; right: 0; bottom: -4px;
  height: 1px;
  background: rgba(255, 255, 255, 0.45);
}
/* ============================================================================
   (K) HEADER LINKS MUST DECLARE THEIR LINK STATES (Dave 2026-08-13, r3 - the
   actual cause, from Dave's screen recording).
   The recording shows the clicked bar-2 item (CHAIRS) rendered in the browser's
   VISITED-LINK colour - dark blue/purple with a UA focus box - on the dark
   panel, while the cursor is off it, and snapping back to white the moment the
   cursor is over it. That asymmetry is the whole tell, and it is specificity:

     a:visited            = (0,1,1)   <- one pseudo-class AND one type
     .nav-shelf__link     = (0,1,0)   <- our colour
     .nav-shelf__link:hover = (0,2,0) <- wins, which is why hover looked right

   So the link-state selector out-specifies the class that carries the colour.
   Only a link you have actually been to is affected, which is why it is the
   SELECTED item every time (you selected it by going there) and why it is
   intermittent - it depends on browsing history, so it never reproduces on a
   fresh profile. Two earlier passes measured rgb(255,255,255) in-session for
   exactly that reason.
   Fix: state the colour ON the link states, at (0,2,0), so no :link / :visited
   rule from any stylesheet or engine can outrank it. Focus also gets a real
   white ring instead of the UA blue box, which is both the correct affordance
   on this surface and visible to keyboard users. Same treatment for the top
   header row, which carries the identical (0,1,1)-beats-(0,1,0) exposure.
   ============================================================================ */
.nav-shelf__link:link,
.nav-shelf__link:visited,
.nav-shelf__link:hover,
.nav-shelf__link:focus,
.nav-shelf__link:active { color: #FFFFFF; text-decoration: none; }
.nav-shelf__link:focus-visible {
  outline: 2px solid rgba(255, 255, 255, 0.9);
  outline-offset: 3px;
}
.site-header .nav-primary a:link,
.site-header .nav-primary a:visited,
.site-header .nav-primary a:active,
.site-header .nav-utility > a:link,
.site-header .nav-utility > a:visited,
.site-header .nav-utility > a:active { color: #FFFFFF; text-decoration: none; }
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary a:visited,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-utility > a:visited { color: #FFFFFF; }
/* — header Trade Portal CTA (Dave 2026-08-18) —
   Reuses .btn/.btn-ghost rather than inventing a button. The one override is
   currentColor: the header runs BOTH a light surface bar (--ink text) and a
   transparent over-hero bar (white text), and an --ink border would vanish on
   the second. Inheriting the bar's own colour keeps one rule correct in both. */
.nav-primary .nav-cta {
  padding: 0.34rem 0.86rem;
  font-size: var(--fs-label);
  line-height: 1.2;
  color: inherit;
  border-color: currentColor;
  background: transparent;
  box-shadow: none;
}.nav-primary .nav-cta:hover {

  background: currentColor;
  box-shadow: none;
  transform: none;
 color: var(--ink);
}
.site-header .nav-primary .nav-cta:hover { background: #FFFFFF; }
.site-header[data-overhero="true"] .nav-primary li a.nav-cta:hover { background: #FFFFFF; color: var(--ink); }
.nav-primary .nav-cta[aria-current="page"]::after { display: none; }
.nav-shelf__link--cta { font-weight: 600; }

@media (min-width: 881px) {
  .nav-shelf__row--portal { gap: 1.75rem; }
}
/* ============================================================================
   (K) BAR 3 SPEAKS THE DEAD-END LANGUAGE TOO (Dave 2026-08-20).
   Symptom: in the SOFAS dropdown bar, some filters could not be clicked -
   Compact after Corner, Corner after Compact. Measured on /shop/?cat=sofa with
   Corner pressed: the in-page pill read disabled, count 0, opacity 0.32; the
   mirrored bar-3 button read disabled TRUE but opacity 1, colour #FFF,
   cursor pointer - visually identical to a live control. So the guard was
   working and only its AFFORDANCE was missing: a control that looks alive and
   does nothing reads as broken, which is exactly how it was reported.
   Cause: header.php mirrors p.disabled onto the bar-3 button, but the shelf
   had no :disabled rule, and (D) above pins .nav-shelf__link colour on the
   link states at (0,2,0) so nothing dimmer could win by accident.
   Fix: same dead-end treatment the .filter-pill component already uses
   (opacity 0.32 + not-allowed) so one language covers both surfaces. Bar 3
   deliberately carries no count, so pointer-events stays AUTO here - the
   mirrored title (No sofas match this combination) is the only thing that
   can explain the dimming, and it needs hover to show.
   ============================================================================ */
.nav-shelf__link:disabled,
.nav-shelf__link[disabled] {
  opacity: 0.32;
  cursor: not-allowed;
}
.nav-shelf__link:disabled:hover,
.nav-shelf__link[disabled]:hover { color: #FFFFFF; }
.nav-shelf__link:disabled:hover::after,
.nav-shelf__link[disabled]:hover::after { content: none; }
/* ============================================================================
   HEADER NAV — ROLLOVER FEEDBACK, RESTORED  (Dave 2026-08-21)
   Root cause: two later/heavier rules outranked every nav hover rule —
     (a) `.site-header .nav-primary a:link/:visited/:active { color:#FFFFFF }`
         sits AFTER the hover rule at equal specificity, so it won for any
         element with an href; and
     (b) `.site-header[data-overhero="true"] .nav-primary li a { color:#FFFFFF }` beat it outright over the hero.
   Net effect: only PRODUCTS (a <button>, so no :link) still showed feedback,
   and the Trade Portal CTA hovered to white-on-white. These re-assert hover
   LAST and at winning weight. Tokens/values unchanged — same 75% dim the
   PRODUCTS button already used, same white-plate/ink-label CTA inversion.
   ========================================================================== */
.site-header .nav-primary a:hover,
.site-header .nav-primary a:focus-visible,
.site-header .nav-primary button:hover,
.site-header .nav-primary button:focus-visible,
.site-header[data-overhero="true"] .nav-primary li a:hover,
.site-header[data-overhero="true"] .nav-primary li a:focus-visible,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary a:hover,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary button:hover { color: rgba(255,255,255,0.75); }
/* CTA (.nav-cta) inverts instead of dimming: white plate, ink label, white
   border so nothing resizes. Must also beat (a) and (b) above. */
.site-header .nav-primary a.nav-cta:hover,
.site-header .nav-primary a.nav-cta:focus-visible,
.site-header[data-overhero="true"] .nav-primary li a.nav-cta:hover,
.site-header[data-overhero="true"] .nav-primary li a.nav-cta:focus-visible,
.site-header[data-overhero='true'][data-hero-tone='light'] .nav-primary a.nav-cta:hover {
  background: #FFFFFF;
  border-color: #FFFFFF;
  color: var(--ink);
}
/* — Trade Portal CTA: border FROZEN, only the fill and label move (Dave 2026-08-21) —
   At rest the border took `currentColor`, so rolling OFF made it follow the label's
   ink→white colour transition and flash dark before settling. The frame is the same
   white in both states, so it should never animate: pin it explicitly and drop
   border-color out of the transition list inherited from .btn. */
.site-header .nav-primary .nav-cta,
.site-header .nav-primary .nav-cta:hover,
.site-header .nav-primary .nav-cta:focus-visible,
.site-header[data-overhero="true"] .nav-primary li a.nav-cta,
.site-header[data-overhero="true"] .nav-primary li a.nav-cta:hover,
.site-header[data-overhero="true"] .nav-primary li a.nav-cta:focus-visible {
  border-color: #FFFFFF;
  transition: background var(--t-base), color var(--t-base);
}
/* — header account avatar: initials disc (Dave 2026-08-21) —
   Signed in, the account control shows the customer's initials instead of a
   glyph. Sized and stroked to sit in the same optical line as the 20px, 1.6px
   line icons either side of it (search, cart), so the utility row still reads
   as one set. Colour is inherited (currentColor), which keeps it correct on the
   dark bar and on the over-hero bar without a second rule. */
.nav-utility .account-initials {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border: 1.6px solid currentColor;
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: 0.5625rem;         /* 9px — the largest that keeps 2 chars inside a 22px disc */
  font-weight: 600;
  letter-spacing: 0.04em;
  line-height: 1;
  text-indent: 0.04em;          /* optical centring against the letter-spacing */
  user-select: none;
}

/* The header row and the shelf row both carry .container, and both set the
   padding SHORTHAND above - which resets the inline axis to 0 at (0,1,0).
   The global narrow-viewport container inset earlier in this file is also
   (0,1,0) and used to win purely by being the last thing in the file; now
   that the header lives here, the header re-states that inset for its own
   two .container elements so the result does not depend on file position. */
@media (max-width: 1079px) {
  .site-header__row,
  .nav-shelf__row { padding-left: var(--gutter-mobile); padding-right: var(--gutter-mobile); }
}

/* ==========================================================================
   == styleguide ==
   These are the /styleguide/ page's own presentation classes, moved out of
   page-styleguide.php on 2026-09-04 so the page obeys the same rule it
   documents - no inline styles, no private stylesheet. Nothing else on the
   site uses them, and they are LAST in the file on purpose: the block they
   replaced was a <style> element in the body, so it beat every equal-weight
   rule, and file position is how that is preserved.
   Two halves. First, the former <style> element, byte for byte. Second, one
   class per style="" attribute the template used to carry - a fixed class
   where the declarations were fixed, and one class PER TOKEN wherever the
   page renders a token list (chip, type sample, radius, elevation, motion),
   named by stripping the leading -- so the template can build the class name
   from the token itself rather than from a hand-written table.
   ========================================================================== */
.sg{max-width:1080px;margin:0 auto;padding:2.5rem var(--gutter) 5rem}
.sg h2{font-family:var(--font-display);font-size:var(--fs-2xl);margin:3rem 0 .35rem;font-weight:400}
.sg h2:first-of-type{margin-top:2rem}
.sg .sg-note{color:var(--ink-muted);font-size:var(--fs-sm);margin:0 0 1.4rem;max-width:46em}
.sg code{font-family:var(--font-mono);font-size:var(--fs-xs);background:var(--line-soft);padding:.12em .4em;border-radius:4px;color:var(--accent)}
.sg-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.sg-swatch{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:var(--surface)}
.sg-chip{height:64px;display:block;border-bottom:1px solid var(--line)}
.sg-swatch .m{padding:.55rem .65rem .7rem}
.sg-swatch b{font-family:var(--font-mono);font-size:var(--fs-xs);display:block}
.sg-swatch .hex{font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-muted);display:block;margin:.15rem 0}
.sg-swatch small{font-size:var(--fs-xs);color:var(--ink-soft);display:block}
.sg-type-row{display:flex;align-items:baseline;gap:1rem;border-bottom:1px solid var(--line-soft);padding:.5rem 0}
.sg-h3{font-family:var(--font-display);font-size:var(--fs-xl);font-weight:400;margin:2rem 0 .35rem}
.sg-hero .meta{min-width:340px}
.sg-type-row .meta{font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-muted);min-width:200px;flex:none}
.sg-type-row .samp{line-height:1.1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.sg-btnrow{display:flex;flex-wrap:wrap;gap:14px 18px;align-items:center;margin:.2rem 0 .4rem}
.sg-btncell{display:flex;flex-direction:column;gap:.5rem;align-items:flex-start}
.sg-radius{display:flex;gap:18px;flex-wrap:wrap}
.sg-radius div{width:104px;text-align:center}
.sg-radius .box{height:64px;background:var(--accent-soft);border:1px solid var(--accent);margin-bottom:.4rem}
.sg-elev{display:grid;gap:18px;grid-template-columns:repeat(auto-fill,minmax(170px,1fr))}
.sg-elev .card{background:var(--surface);border-radius:var(--r);padding:1.4rem .9rem;text-align:center}
.sg-motion span{display:inline-block;padding:.6rem 1rem;background:var(--ink);color:var(--bg);border-radius:999px;font-size:var(--fs-sm)}
.sg-motion span:hover{transform:translateX(40px)}
.sg-fields{max-width:360px}
.sg-fields input{width:100%}
.sg-scale{display:grid;gap:.3rem;max-width:660px}
.sg-scale__row{display:flex;align-items:center;gap:.9rem;padding:.25rem 0}
.sg-scale__bar{background:var(--accent-soft);border:1px solid var(--accent);height:18px;flex:none}
.sg-scale__bar--1{width:var(--sp-1)}
.sg-scale__bar--2{width:var(--sp-2)}
.sg-scale__bar--3{width:var(--sp-3)}
.sg-scale__bar--4{width:var(--sp-4)}
.sg-scale__bar--5{width:var(--sp-5)}
.sg-scale__bar--6{width:var(--sp-6)}
.sg-scale__bar--7{width:var(--sp-7)}
.sg-scale__bar--8{width:var(--sp-8)}
.sg-scale__meta{font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-muted)}
.sg-defs{display:grid;max-width:660px}
.sg-defs__row{display:flex;gap:.9rem;align-items:baseline;border-bottom:1px solid var(--line-soft);padding:.42rem 0;flex-wrap:wrap}
.sg-defs__tok{font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--accent);min-width:150px;flex:none}
.sg-defs__val{font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-muted);min-width:170px;flex:none}
.sg-defs__use{font-size:var(--fs-sm);color:var(--ink-soft)}
.sg-layers{display:grid;gap:6px;max-width:660px}
.sg-layer{border:1px solid var(--line);background:var(--surface);padding:.5rem .7rem;font-family:var(--font-mono);font-size:var(--fs-xs);color:var(--ink-muted)}
.sg-layer b{color:var(--accent)}
.sg-layer--1{margin-left:0}
.sg-layer--2{margin-left:var(--sp-5)}
.sg-layer--3{margin-left:calc(var(--sp-5) * 2)}
.sg-layer--4{margin-left:calc(var(--sp-5) * 3)}
.sg-layer--5{margin-left:calc(var(--sp-5) * 4)}

/* --------------------------------------------------------------------------
   Replacements for the template's former inline style attributes.
   -------------------------------------------------------------------------- */
/* --- page title ------------------------------------------------------ */
.sg-h1{font-family:var(--font-display);font-weight:400;font-size:var(--fs-3xl);margin:0 0 .4rem}

/* --- token-driven: one class per colour token the swatch grid renders - */
.sg-chip--bg{background:var(--bg)}
.sg-chip--surface{background:var(--surface)}
.sg-chip--ink{background:var(--ink)}
.sg-chip--ink-muted{background:var(--ink-muted)}
.sg-chip--ink-soft{background:var(--ink-soft)}
.sg-chip--line{background:var(--line)}
.sg-chip--line-soft{background:var(--line-soft)}
.sg-chip--hover{background:var(--hover)}
.sg-chip--accent{background:var(--accent)}
.sg-chip--accent-soft{background:var(--accent-soft)}
.sg-chip--ok{background:var(--ok)}
.sg-chip--warn{background:var(--warn)}
.sg-chip--crit{background:var(--crit)}
.sg-chip--neon{background:var(--neon)}
.sg-chip--neon-soft{background:var(--neon-soft)}
.sg-chip--neon-deep{background:var(--neon-deep)}
.sg-chip--header-glass{background:var(--header-glass)}

/* --- token-driven: one class per step of the type scale -------------- */
.sg-samp--fs-5xl{font-size:var(--fs-5xl)}
.sg-samp--fs-4xl{font-size:var(--fs-4xl)}
.sg-samp--fs-3xl{font-size:var(--fs-3xl)}
.sg-samp--fs-2xl{font-size:var(--fs-2xl)}
.sg-samp--fs-xl{font-size:var(--fs-xl)}
.sg-samp--fs-lg{font-size:var(--fs-lg)}
.sg-samp--fs-md{font-size:var(--fs-md)}
.sg-samp--fs-base{font-size:var(--fs-base)}
.sg-samp--fs-sm{font-size:var(--fs-sm)}
.sg-samp--fs-xs{font-size:var(--fs-xs)}

/* --- home-hero demo strip ------------------------------------------- */
.sg-hero{container-type:inline-size;width:calc(100vw - var(--sbw, 0px));margin-left:calc(50% - 50vw + var(--sbw, 0px) / 2);background:var(--line-soft);border-block:1px solid var(--line)}
.sg-hero__copy{padding-inline:var(--hero-inset);text-align:center;padding-block:1.1rem}
.sg-hero__title{font-family:var(--font-display);font-weight:400;font-size:var(--fs-hero-title);line-height:var(--lh-hero-title);letter-spacing:var(--ls-hero-title);margin-bottom:var(--gap-hero-title-sub)}
.sg-hero__sub{font-size:var(--fs-hero-sub);line-height:var(--lh-hero-sub);margin-top:var(--gap-hero-sub-top)}

/* --- modifiers. Each is declared AFTER the base rule it overrides and at
       the SAME specificity, so it wins on order exactly as the inline
       attribute it replaces did. .sg-note--* are (0,2,0) because the base
       `.sg .sg-note` rule above is (0,2,0) and sets the margin shorthand. */
.sg-type-row--flush{border:0}
.sg .sg-note--mt-09{margin-top:0.9rem}
.sg .sg-note--mt-1{margin-top:1rem}
.sg .sg-note--mt-12{margin-top:1.2rem}
.sg .sg-note--mt-16{margin-top:1.6rem}
.sg .sg-note--flush{margin:0}
.sg-btnrow--mt-1{margin-top:1rem}
.sg-btncell--grow{flex:1;min-width:240px}
.sg-fields--form{display:grid;gap:1rem;max-width:420px}
.sg-muted{color:var(--ink-muted)}

/* --- component demos: a live component plus a styleguide-only frame --- */
.sg-filter-row{justify-content:flex-start;margin:0}
.sg-toggles{display:flex;gap:10px;flex-wrap:wrap}
.sg-dropdown{width:240px}
.sg-scrollx{overflow-x:auto}
.sg-cover-fam{max-width:460px}
.sg-featgrid{max-width:900px}
.sg-notices{display:grid;gap:0.75rem;max-width:560px}
.sg-wire{max-width:720px;width:100%;display:block;border:1px solid var(--line);background:var(--bg)}

/* --- coverings-table demo dots: fixed sample hexes, not tokens -------- */
.sg-dot--c9a56a{background:#c9a56a}
.sg-dot--8a5a3c{background:#8a5a3c}
.sg-dot--3b3330{background:#3b3330}
.sg-dot--6b4a34{background:#6b4a34}
.sg-dot--2f2a27{background:#2f2a27}
.sg-dot--b98a55{background:#b98a55}
.sg-dot--7a5230{background:#7a5230}
.sg-dot--4a3526{background:#4a3526}

/* --- three-bar header wireframe -------------------------------------- */
.sg-hdrdemo{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;max-width:720px}
.sg-hdrdemo__bar{display:flex;align-items:center;justify-content:space-between;gap:1rem;height:44px;padding:0 1.15rem;background:var(--header-glass);color:#fff}
.sg-hdrdemo__mark{font-family:var(--font-display);font-size:var(--fs-md)}
.sg-hdrdemo__nav{display:flex;gap:1.15rem;font-size:var(--fs-xs);letter-spacing:var(--ls-btn);text-transform:uppercase}
.sg-hdrdemo__util{font-size:var(--fs-xs);opacity:.85}
.sg-hdrdemo__shelf{display:flex;align-items:center;justify-content:center;gap:1.5rem;height:28px;background:var(--header-glass);color:#fff;border-top:1px solid rgba(255,255,255,0.16);font-size:var(--fs-xs);letter-spacing:var(--ls-btn);text-transform:uppercase}
.sg-hdrdemo__cur{border-bottom:1px solid #fff}
.sg-hdrdemo__page{height:56px;background:var(--line-soft)}

/* --- nav rollover state chips ---------------------------------------- */
.sg-navstates{display:flex;gap:1rem;align-items:center;flex-wrap:wrap;background:var(--header-glass);padding:0.9rem 1.15rem;border-radius:var(--r);max-width:720px}
.sg-navstate--rest{color:#fff;font-size:var(--fs-xs);letter-spacing:var(--ls-btn);text-transform:uppercase}
.sg-navstate--hover{color:rgba(255,255,255,0.75);font-size:var(--fs-xs);letter-spacing:var(--ls-btn);text-transform:uppercase}
.sg-navstate--cta{color:#fff;border:2px solid #fff;padding:0.34rem 0.86rem;font-size:var(--fs-xs);letter-spacing:var(--ls-btn);text-transform:uppercase}
.sg-navstate--ctahover{color:var(--ink);background:#fff;border:2px solid #fff;padding:0.34rem 0.86rem;font-size:var(--fs-xs);letter-spacing:var(--ls-btn);text-transform:uppercase}

/* --- account control demo -------------------------------------------- */
.sg-acctdemo{display:flex;gap:1.5rem;align-items:center;background:var(--header-glass);padding:0.9rem 1.15rem;border-radius:var(--r);max-width:720px;color:#fff}
.sg-acct{display:inline-flex;align-items:center;gap:0.5rem}
.sg-acct__lbl{font-size:var(--fs-xs)}
.sg-acct__disc{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1.6px solid currentColor;border-radius:999px;font-family:var(--font-body);font-size:0.5625rem;font-weight:600;letter-spacing:0.04em;line-height:1}

/* --- token-driven: one class per radius token ------------------------ */
.sg-radius--r-sm{border-radius:var(--r-sm)}
.sg-radius--r{border-radius:var(--r)}
.sg-radius--r-lg{border-radius:var(--r-lg)}
.sg-radius--r-xl{border-radius:var(--r-xl)}

/* --- token-driven: one class per elevation token --------------------- */
.sg-elev--shadow-sm{box-shadow:var(--shadow-sm)}
.sg-elev--shadow{box-shadow:var(--shadow)}
.sg-elev--shadow-lg{box-shadow:var(--shadow-lg)}

/* --- token-driven: one class per motion token ------------------------ */
.sg-motion{display:flex;gap:16px;flex-wrap:wrap}
.sg-motion--t-fast{transition:transform var(--t-fast)}
.sg-motion--t-base{transition:transform var(--t-base)}
.sg-motion--t-slow{transition:transform var(--t-slow)}

/* === PDP "Available in this range" (Dave 2026-09-25) ===========================
   One .cover-fam expander replaces the size selector AND the "In this range" strip:
   a multi-select list -- line diagram (true relative width), name + dimensions,
   price, and a square .ss-check on the right that matches the 2px-line, square-
   cornered control language (.cover-fam, .filter-pill, .btn). */
.cover-fam__sum {
  margin-left: auto;
  font-size: var(--fs-sm);
  font-weight: 400;
  color: var(--ink-muted);
  text-align: right;
  line-height: 1.3;
  min-width: 0;
}
.cover-fam__toggle .cover-fam__label { flex: none; }
.pdp-range.is-open .cover-fam__inner { padding: 0 0 0.35rem; }
.pdp-range__pills:empty { display: none; }
.pdp-range__pills { padding: 0.9rem 1.15rem 0.4rem; }
.pdp-range__pills .pdp__group-label { margin-bottom: 0.5rem; }
.pdp-range__group {
  padding: 1rem 1.15rem 0.35rem;
  font-size: var(--fs-xs);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.pdp-row {
  display: grid;
  grid-template-columns: 76px minmax(0, 1fr) 20px;
  column-gap: var(--sp-3);
  align-items: center;
  width: 100%;
  min-height: 64px;
  padding: 0.65rem 1rem 0.65rem 0.75rem;
  border: 0;
  border-top: 1px solid var(--line-soft);
  background: var(--surface);
  color: var(--ink);
  font-family: var(--font-body);
  text-align: left;
  cursor: pointer;
  transition: background var(--t-fast);
}
.pdp-row:hover { background: var(--hover); }
.pdp-row.is-on { background: var(--hover); }
.pdp-row:focus-visible { outline: 2px solid var(--accent-soft); outline-offset: -2px; }
.pdp-row__img { height: 40px; display: flex; align-items: flex-end; justify-content: center; }
.pdp-row__img img { max-height: 40px; display: block; object-fit: contain; }
.pdp-row__img svg { width: 56px; height: 40px; }
.pdp-row__text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.pdp-row__name { font-size: var(--fs-base); font-weight: 400; line-height: 1.25; }
.pdp-row.is-on .pdp-row__name { font-weight: 500; }
.pdp-row__dim { font-size: var(--fs-xs); color: var(--ink-muted); font-variant-numeric: tabular-nums; }
.pdp-row__meta { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; column-gap: var(--sp-3); }
.pdp-row__price { margin-left: auto; font-size: var(--fs-sm); font-weight: 500; font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; }
.pdp-row__price .price-from { font-size: var(--fs-xs); color: var(--ink-muted); margin-right: 0.3em; }
.ss-check {
  width: 20px; height: 20px;
  box-sizing: border-box;
  border: 2px solid var(--line);
  background: var(--surface);
  display: flex; align-items: center; justify-content: center;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.ss-check svg { fill: none; stroke: var(--bg); stroke-width: 2; stroke-linecap: square; opacity: 0; }
.pdp-row:hover .ss-check { border-color: var(--ink); }
.pdp-row.is-on .ss-check { background: var(--ink); border-color: var(--ink); }
.pdp-row.is-on .ss-check svg { opacity: 1; }
.pdp-total {
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-4);
  margin-top: 1.1rem; padding-top: 0.9rem; border-top: 1px solid var(--line);
}
.pdp-total__line { font-size: var(--fs-sm); color: var(--ink-muted); }
.pdp-total__line:empty { display: none; }
.pdp-total .pdp__price { margin: 0; white-space: nowrap; }
@media (max-width: 600px) {
  .pdp-row { grid-template-columns: 68px minmax(0, 1fr) 20px; padding: 0.6rem 0.9rem 0.6rem 0.6rem; }
  .pdp-range__group { padding: 0.9rem 0.9rem 0.3rem; }
}

/* Selection list under the options (Dave 2026-09-25): piece · qty · price each.
   Reuses the cart's .qty stepper so quantity looks the same here and in the cart. */
.pdp-sel { display: flex; flex-direction: column; margin-top: 0.6rem; }
.pdp-sel__row {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  grid-template-areas: "name name" "qty price";
  column-gap: var(--sp-4);
  row-gap: 0.4rem;
  align-items: center;
  padding: 0.7rem 0;
  border-top: 1px solid var(--line-soft);
}
.pdp-sel__row:first-child { border-top: 0; }
.pdp-sel__name { grid-area: name; font-size: var(--fs-base); }
.pdp-sel__price { font-size: var(--fs-base); font-weight: 500; font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; grid-area: price; }
.pdp-sel__price .price-from { font-size: var(--fs-xs); color: var(--ink-muted); margin-right: 0.3em; font-weight: 400; }
.pdp-sel__ea { font-size: var(--fs-xs); color: var(--ink-muted); margin-left: 0.3em; font-weight: 400; }
.pdp-sel .qty { grid-area: qty; justify-self: start; }
.pdp-sel .qty button { background: transparent; border: 0; cursor: pointer; min-width: 36px; min-height: 36px; }
.pdp-sel .qty button:disabled { color: var(--ink-soft); cursor: default; }
.pdp-total { display: block; }
.pdp-total__line { display: block; }


/* Range list, one "from" + fixed row height (Dave 2026-09-30) */
.pdp-range__group { display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-3); }
.pdp-range__from { text-transform: none; letter-spacing: 0; }
.pdp-row__meta { flex-wrap: nowrap; }
.pdp-row { grid-template-columns: 68px minmax(0, 1fr) 20px; }
.pdp-row__meta { column-gap: var(--sp-2); }
.pdp-row__dim { white-space: nowrap; }
/* Range list: one line -- image, name, price, checkbox all centred (Dave 2026-09-30) */
.pdp-row__text { flex-direction: row; align-items: center; justify-content: space-between; gap: var(--sp-2); }
.pdp-row__img { align-items: center; }
/* Range list names: always one line (Dave 2026-09-30) */
.pdp-row__name { flex: 1 1 auto; min-width: 0; font-size: var(--fs-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pdp-row__price { flex: none; }
.pdp-range__cover { text-transform: none; letter-spacing: 0; color: var(--ink-muted); }
/* Top-line note sits flush over the price column, not the checkbox (Dave 2026-09-30) */
.pdp-range__from { margin-right: calc(20px + var(--sp-3) + 1rem - 1.15rem); }
/* Big piece diagram caption: name over dimensions (Dave 2026-09-30) */
.pdp-piece__dim { display: grid; justify-items: center; gap: 2px; }
.pdp-piece__name { font-size: var(--fs-sm); letter-spacing: 0; color: var(--ink); }

/* Store notice: "opening soon" bar while checkout is closed (build #1138 S1; mu-plugin 08-ss-checkout-gate.php) */
p.woocommerce-store-notice, .woocommerce-store-notice {
  background: var(--ink);
  color: var(--bg);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  letter-spacing: .02em;
  text-align: center;
  box-shadow: none;
}
.woocommerce-store-notice a, .woocommerce-store-notice__dismiss-link { color: var(--bg); text-decoration: underline; }
