/* ==========================================================================
   WISHtoGo -- one stylesheet, no build step.
   Written logical-first (inline-start/end, padding-inline) so the Hebrew RTL
   pages need no overrides: switching dir="rtl" on <html> flips the whole site.
   ========================================================================== */

/* Brand palette is deliberately just three colours -- WISHtoGo purple #854bb3,
   white and black. Everything else here is a tint or shade of those, so nothing
   introduces a fourth hue. The capsule family colours further down are the only
   exception: those are the real printed label colours on the products. */
:root {
  /* ground -- black, not a tinted near-black */
  --ink: #0b0b0d;
  --ink-soft: #17171a;
  --plum: #100c14;
  --plum-2: #1d1424;
  --paper: #ffffff;
  --mist: #f5f4f7;
  --mist-2: #e7e4ec;

  /* brand */
  --violet: #854bb3;
  --violet-lit: #9a67c4;
  --violet-deep: #4a2a64;
  --violet-haze: #cbaee4;

  /* capsule families -- the actual label colours on the capsules */
  --fam-pink: #e79cba;
  --fam-blue: #8f9bd6;
  --fam-green: #8fb98a;
  --fam-yellow: #e2be48;

  /* text on light */
  --fg: #0b0b0d;
  --fg-2: #5b5b6280;
  --fg-mid: #4a4a52;
  --rule: #0b0b0d14;

  /* type -- Montserrat for Latin, Rubik for Hebrew. Two weights carry the
     design: Black (900) for display, Light (300) for reading copy. */
  --sans: 'Montserrat', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --sans-he: 'Rubik', 'Montserrat', system-ui, 'Segoe UI', sans-serif;
  --font: var(--sans);

  /* rhythm */
  --gut: clamp(20px, 5vw, 56px);
  --sec-y: clamp(72px, 11vw, 160px);
  --max: 1240px;
  --r: 18px;
  --r-lg: 28px;

  /* MIT diagram */
  --mit-epi: #f1e9f8;
  --mit-derm: #dccbec;
  --mit-line: #ffffff90;
  --mit-cap: #b98fd8;
  --mit-head: #4a2a64;
  --mit-handle: #0b0b0d;
  --mit-glow: #854bb3;
  --mit-text: #5b5b62;

  --ease: cubic-bezier(.22, .61, .36, 1);
}

html[lang='he'] { --font: var(--sans-he); }

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

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0;
  font-family: var(--font);
  font-size: clamp(16px, 1.05vw, 17px);
  font-weight: 300;
  line-height: 1.68;
  color: var(--fg);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}
b, strong { font-weight: 700; }

img, svg, video { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; }
ul, ol { margin: 0; padding: 0; list-style: none; }
p { margin: 0 0 1em; }

:focus-visible {
  outline: 2px solid var(--violet-lit);
  outline-offset: 3px;
  border-radius: 4px;
}

.sr, .skip:not(:focus) {
  position: absolute; width: 1px; height: 1px; padding: 0;
  margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
.skip:focus {
  position: fixed; inset-block-start: 12px; inset-inline-start: 12px; z-index: 200;
  width: auto; height: auto; clip-path: none; margin: 0;
  padding: 10px 18px; background: var(--paper); color: var(--fg);
  border-radius: 999px; box-shadow: 0 8px 30px #0003;
}

.wrap { width: 100%; max-width: var(--max); margin-inline: auto; padding-inline: var(--gut); }

/* ------------------------------------------------------------ typography */
/* Display type is Black (900) -- the heavy pole of the two-weight system. */
.display {
  margin: 0 0 .5em;
  font-size: clamp(2rem, 4.4vw, 3.4rem);
  line-height: 1.08;
  letter-spacing: -.025em;
  font-weight: 900;
  text-wrap: balance;
}
html[lang='he'] .display { letter-spacing: -.01em; line-height: 1.18; }

.display-xl { font-size: clamp(2.3rem, 5.6vw, 4.4rem); }
.display-hero { font-size: clamp(2.6rem, 8vw, 6rem); letter-spacing: -.035em; }
html[lang='he'] .display-hero { letter-spacing: -.015em; }

/* the \n line breaks in headlines only apply once there is room for them */
@media (max-width: 620px) { .display br { display: none; } }

.kicker {
  margin: 0 0 1em;
  font-size: .72rem;
  letter-spacing: .2em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--violet);
}
html[lang='he'] .kicker { letter-spacing: .1em; }

/* Reading copy is Light (300) -- the thin pole. */
.lede {
  font-size: clamp(1.06rem, 1.5vw, 1.3rem);
  font-weight: 300;
  line-height: 1.54;
  color: var(--fg-mid);
  max-width: 56ch;
  text-wrap: pretty;
}
.body { max-width: 62ch; color: var(--fg-mid); font-weight: 300; }
.mini-h {
  margin: 0 0 .7em; font-size: .72rem; font-weight: 700;
  letter-spacing: .16em; text-transform: uppercase; color: var(--fg-mid);
}
html[lang='he'] .mini-h { letter-spacing: .05em; }
.mono { font-variant-numeric: tabular-nums; font-size: .86rem; color: var(--fg-mid); }
.note { font-size: .88rem; color: var(--fg-mid); }
.center { text-align: center; }

/* footnote asterisk on the MicroCurrent and Blue heads (not yet sold in the
   US) -- see usPending in catalog.mjs and headName() in pages.mjs. Explained by
   an inline chip in the two places the asterisk is the reader's FIRST sight of
   it: under each head's own name on the Technology Heads page, and under the
   heads strip on the home page. Elsewhere the asterisk travels alone, which was
   also true of the home page until 2026-09-16 -- it showed a starred name with
   nothing anywhere on the page to say what the star meant. */
.us-star { color: var(--violet); font-weight: 900; }
.tone-ink .us-star, .tone-plum .us-star { color: var(--violet-haze); }
.us-note-inline {
  display: inline-block; margin: .4em 0 1.1em;
  padding: 7px 14px; max-width: none;
  background: #854bb31a; border: 1px solid #854bb340; border-radius: 999px;
  color: var(--violet); font-size: .84rem; font-weight: 700;
}
.tone-mist .us-note-inline { background: #854bb314; }

/* the brochure's pull-line: brand purple, Black weight, no quote marks */
.pull {
  margin: 1.8em 0 0; max-width: 34ch;
  font-size: clamp(1.16rem, 1.9vw, 1.6rem); font-weight: 900;
  line-height: 1.22; letter-spacing: -.02em; color: var(--violet);
}
html[lang='he'] .pull { letter-spacing: -.005em; line-height: 1.3; }

/* "Skincare Simplified" — the brand slogan, set apart from the descriptive line */
.foot-slogan {
  margin: 0 0 1em; font-size: .82rem; font-weight: 500;
  letter-spacing: .2em; text-transform: uppercase; color: var(--violet-haze);
}

/* ---------------------------------------------------------------- buttons */
.btn {
  display: inline-flex; align-items: center; justify-content: center;
  gap: .5em; min-height: 48px; padding: 0 26px;
  border: 1px solid transparent; border-radius: 999px;
  background: var(--violet); color: #fff;
  font-size: .95rem; font-weight: 900; letter-spacing: -.01em;
  cursor: pointer; white-space: nowrap;
  /* --mx/--my are set by the magnetic-button script (site.js) on pointer
     move, so hover/press states below can layer a scale on top without a
     second transform stomping the pull-toward-cursor offset. */
  transform: translate(var(--mx, 0), var(--my, 0));
  transition: background .25s var(--ease), transform .18s var(--ease), color .25s var(--ease);
}
.btn:hover { background: var(--violet-lit); }
.btn:active { transform: translate(var(--mx, 0), var(--my, 0)) scale(.96); }
.btn-ghost { background: transparent; color: var(--violet); border-color: #854bb355; }
.btn-ghost:hover { background: #854bb314; border-color: var(--violet); }
.btn-sm { min-height: 38px; padding: 0 18px; font-size: .86rem; }
.row-btns { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 1.6em; }

/* ----------------------------------------------------------------- header */
/* Fixed, not sticky: the bar has to float OVER the hero. Sticky keeps it in
   flow, which pushed the plum hero down and left the white logo on white. Every
   first-section has enough block-start padding to clear it. */
.hdr {
  position: fixed; inset-block-start: 0; inset-inline: 0; z-index: 100;
  background: #0b0b0d00;
  transition: background .35s var(--ease), backdrop-filter .35s var(--ease), border-color .35s var(--ease);
  border-block-end: 1px solid transparent;
}
.hdr.is-stuck {
  background: #0b0b0dd9;
  -webkit-backdrop-filter: saturate(180%) blur(20px);
  backdrop-filter: saturate(180%) blur(20px);
  border-block-end-color: #ffffff14;
}
/* pages that open on a light hero need the bar legible from the first pixel */
body:not(.p-index) .hdr { background: #0b0b0dd9; -webkit-backdrop-filter: saturate(180%) blur(20px); backdrop-filter: saturate(180%) blur(20px); }

.hdr-in {
  display: flex; align-items: center; gap: clamp(12px, 2.4vw, 32px);
  max-width: var(--max); margin-inline: auto;
  padding: 12px var(--gut);
}
.hdr-logo img { width: clamp(140px, 14vw, 190px); height: auto; }
.hdr-nav { display: flex; gap: clamp(10px, 1.7vw, 26px); margin-inline-start: auto; }
.hdr-link {
  font-size: .88rem; font-weight: 500; color: #ffffffb8; white-space: nowrap;
  padding: 6px 2px; transition: color .2s var(--ease);
}
.hdr-link:hover, .hdr-link.is-current { color: #fff; }
.hdr-end { display: flex; align-items: center; gap: 10px; margin-inline-start: auto; }
.hdr-nav + .hdr-end { margin-inline-start: 0; }

/* Language control: a button reading "Change language" that opens a chooser. */
.langbox { position: relative; }
/* Filled, not a faint outline. As a transparent pill with a thin white border it
   did not read as a control at all, especially inside the mobile menu. */
.lang {
  display: inline-flex; align-items: center; gap: 7px; min-height: 36px; padding: 0 15px;
  background: #ffffff1f; border: 1px solid #ffffff4d; border-radius: 999px;
  font-size: .8rem; font-weight: 700; color: #fff; cursor: pointer; white-space: nowrap;
  transition: background .2s var(--ease), border-color .2s var(--ease), color .2s var(--ease);
}
.lang:hover, .lang[aria-expanded='true'] { background: var(--violet); border-color: var(--violet); }
.lang svg { flex: 0 0 auto; opacity: .95; }
/* Header only: a small round globe button, no label. The sheet and footer
   variants keep their visible "Change language" text -- there the button
   isn't competing for space beside a logo and nav links. */
.hdr-end .lang { gap: 0; width: 34px; min-height: 34px; padding: 0; justify-content: center; }
.hdr-end .lang span { display: none; }
/* In the mobile sheet it is a full-width purple button, unmistakably tappable. */
.sheet .lang {
  min-height: 48px; padding: 0 22px; font-size: .95rem;
  background: var(--violet); border-color: var(--violet);
}
.sheet .lang:hover { background: var(--violet-lit); border-color: var(--violet-lit); }

.langmenu {
  position: absolute; inset-block-start: calc(100% + 8px); inset-inline-end: 0; z-index: 10;
  min-width: 150px; padding: 6px;
  background: #17171aef; -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px);
  border: 1px solid #ffffff1f; border-radius: 14px;
  box-shadow: 0 20px 50px #0b0b0d80;
}
.langmenu[hidden] { display: none; }
.langmenu a {
  display: block; padding: 9px 12px; border-radius: 9px;
  font-size: .9rem; color: #ffffffc0;
}
.langmenu a:hover { background: #ffffff14; color: #fff; }
.langmenu a[aria-current='true'] { color: #fff; font-weight: 700; }
.langmenu a[aria-current='true']::after { content: ' ✓'; color: var(--violet-haze); }

/* in the mobile sheet the chooser opens upward and sits inline */
.sheet .langbox { align-self: start; margin-block-start: 26px; }
.sheet .langmenu { inset-block-start: auto; inset-block-end: calc(100% + 8px); inset-inline-start: 0; inset-inline-end: auto; }

.burger {
  display: none; width: 42px; height: 42px; padding: 0;
  background: none; border: 0; cursor: pointer;
  align-items: center; justify-content: center;
}
.burger-lines { display: block; width: 20px; height: 12px; position: relative; }
.burger-lines i {
  position: absolute; inset-inline: 0; height: 1.5px; background: #fff; border-radius: 2px;
  transition: transform .3s var(--ease), opacity .2s var(--ease);
}
.burger-lines i:first-child { top: 0; }
.burger-lines i:last-child { bottom: 0; }
.burger[aria-expanded='true'] .burger-lines i:first-child { transform: translateY(5.2px) rotate(45deg); }
.burger[aria-expanded='true'] .burger-lines i:last-child { transform: translateY(-5.2px) rotate(-45deg); }

@media (max-width: 1080px) {
  .hdr-nav, .hdr-cta { display: none; }
  .burger { display: inline-flex; }
}

.sheet {
  position: fixed; inset: 0; z-index: 99;
  display: flex; flex-direction: column; justify-content: center; gap: 4px;
  padding: 88px var(--gut) 40px;
  background: #0b0b0df2;
  -webkit-backdrop-filter: blur(26px); backdrop-filter: blur(26px);
  overflow-y: auto;
}
.sheet[hidden] { display: none; }
.sheet-nav { display: flex; flex-direction: column; }
.sheet-link {
  padding: 14px 0; border-block-end: 1px solid #ffffff14;
  font-size: clamp(1.3rem, 5vw, 1.9rem); font-weight: 900; letter-spacing: -.02em; color: #fff;
}
.sheet-link.is-current { color: var(--violet-haze); }
/* Layout only. The look comes from .lang, which this button also carries. */
.sheet-lang { align-self: start; margin-block-start: 26px; }
body.nav-open { overflow: hidden; }

/* --------------------------------------------------------------- sections */
.sec { padding-block: var(--sec-y); position: relative; }
.tone-plum { background: var(--plum); color: #fff; }
.tone-ink { background: var(--ink); color: #fff; }
.tone-mist { background: var(--mist); }
.tone-plum .lede, .tone-ink .lede, .tone-plum .body, .tone-ink .body { color: #ffffffb0; }
.tone-plum .kicker, .tone-ink .kicker { color: var(--violet-haze); }
.tone-plum .mini-h, .tone-ink .mini-h { color: #ffffff8c; }
.tone-ink .btn-ghost, .tone-plum .btn-ghost { color: #fff; border-color: #ffffff44; }
.tone-ink .btn-ghost:hover, .tone-plum .btn-ghost:hover { background: #ffffff14; border-color: #fff; }

.sec-h { margin-block-end: clamp(36px, 5vw, 68px); max-width: 46ch; }
.sec-h.is-center { margin-inline: auto; text-align: center; }
.sec-h.is-center .lede { margin-inline: auto; }

/* reveal on scroll */
[data-reveal] {
  opacity: 0; transform: translateY(18px);
  transition: opacity .7s var(--ease) var(--d, 0ms), transform .7s var(--ease) var(--d, 0ms);
}
[data-reveal].in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { opacity: 1; transform: none; transition: none; }
}

/* Photos/video settle from a slight zoom as they reveal -- covers every
   figure sitewide (split-media, phero-media, anatomy, protocols, the award
   and quotes portraits...) without touching the spinner, which is a <div>,
   not a <figure>, so it's naturally excluded. */
figure[data-reveal] img, figure[data-reveal] video,
[data-reveal] figure img, [data-reveal] figure video {
  transform: scale(1.06);
  transition: transform 1s var(--ease) var(--d, 0ms);
}
figure[data-reveal].in img, figure[data-reveal].in video,
[data-reveal].in figure img, [data-reveal].in figure video { transform: scale(1); }
@media (prefers-reduced-motion: reduce) {
  figure[data-reveal] img, figure[data-reveal] video,
  [data-reveal] figure img, [data-reveal] figure video { transform: none; transition: none; }
}

/* ------------------------------------------------------------------- hero */
.hero {
  position: relative; isolation: isolate;
  min-height: 100svh; display: flex; flex-direction: column; align-items: stretch;
  padding-block: 92px 44px;
  background: var(--plum); color: #fff; overflow: hidden;
}
.hero-glow {
  position: absolute; inset: -20% -10% auto; height: 120%; z-index: -1;
  background:
    radial-gradient(58% 46% at 50% 34%, #854bb359 0%, #854bb300 68%),
    radial-gradient(40% 34% at 78% 68%, #854bb324 0%, #854bb300 70%),
    radial-gradient(46% 40% at 16% 74%, #cbaee41f 0%, #cbaee400 72%);
  filter: blur(6px);
}
/* Everything in the hero is sized against viewport HEIGHT as well as width, so
   the whole thing lands inside one screen at 1440x900 -- the most common desktop
   window there is. A `1fr` grid row cannot do this job: the device is an <img>,
   so its intrinsic aspect sets the row's min-content height and the row grows
   past the fold instead of shrinking. Only an explicit svh cap constrains it. */
.hero-in {
  display: grid; justify-items: center; align-content: center; text-align: center;
  gap: clamp(6px, 1.2vw, 16px); width: 100%;
}
.hero-kicker { color: var(--violet-haze); }
.hero .display-hero {
  margin: 0; max-width: 18ch;
  font-size: clamp(2.1rem, min(8vw, 10.5svh), 6rem);
}
.hero-stage { width: 100%; display: grid; place-items: center; }
/* The stage is sized explicitly, and the sprite layer fills it, so both the
   still frame and the sprite occupy exactly the same box. */
.hero-stage .spin {
  height: min(34svh, 560px); aspect-ratio: var(--spin-aspect);
  width: auto; max-width: min(100%, 620px);
}
.hero-stage .spin-img {
  height: 100%; width: 100%; object-fit: contain; margin-inline: auto;
}
@supports not (height: 1svh) {
  .hero .display-hero { font-size: clamp(2.1rem, min(8vw, 10.5vh), 6rem); }
  .hero-stage .spin { height: min(34vh, 560px); }
}
.hero-foot { display: grid; justify-items: center; gap: 4px; }
.hero-foot .lede { color: #ffffffb5; max-width: 52ch; margin: 0; }
.hero-foot .row-btns { justify-content: center; }

.award-flag {
  position: absolute; inset-block-end: 22px; inset-inline-start: 50%;
  transform: translateX(-50%); margin: 0;
  font-size: .7rem; letter-spacing: .16em; text-transform: uppercase; color: #ffffff70;
}
.award-flag span { display: inline-flex; align-items: center; gap: 8px; }
.award-flag span::before, .award-flag span::after {
  content: ''; width: 26px; height: 1px; background: #ffffff40;
}
@media (max-width: 700px) { .award-flag { display: none; } }

/* ------------------------------------------------------- the 360 spinner */
.spin {
  position: relative; width: 100%; touch-action: pan-y;
  cursor: grab; user-select: none; -webkit-user-select: none;
}
.spin:active { cursor: grabbing; }
.spin-img {
  width: 100%; height: auto;
  filter: drop-shadow(0 34px 46px #0b0b0dbb);
  pointer-events: none;
  transition: opacity .3s var(--ease);
}
/* The sprite sheet layer. It sits on top of the still first frame and fades in
   once the single sprite request has loaded, so nothing is ever half-drawn. */
.spin-sheet {
  position: absolute; inset: 0;
  background-repeat: no-repeat;
  background-size: calc(var(--spin-cols) * 100%) calc(var(--spin-rows) * 100%);
  filter: drop-shadow(0 34px 46px #0b0b0dbb);
  opacity: 0; transition: opacity .35s var(--ease);
  pointer-events: none;
}
.spin.is-ready .spin-sheet { opacity: 1; }
.spin.is-ready .spin-img { opacity: 0; }
.spin-hint {
  position: absolute; inset-block-end: -6px; inset-inline-start: 50%;
  transform: translateX(-50%);
  display: inline-flex; align-items: center; gap: 7px;
  font-size: .72rem; letter-spacing: .12em; text-transform: uppercase;
  color: #ffffff85; pointer-events: none;
  transition: opacity .4s var(--ease);
}
.spin.is-touched .spin-hint { opacity: 0; }
/* Sprite failed to decode: the still frame is all there is, so stop inviting a
   drag that will not do anything. */
.spin.is-static { cursor: default; }
.spin.is-static .spin-hint { opacity: 0; }

/* ----------------------------------------------- scrubbable product film --
 * The exploded view on /device. It plays on its own and can be dragged through,
 * so it is grabbable like the spinners -- but unlike them it is a <video>, and
 * a video that fails to decode is not a thing that happens. It sits on the
 * light `mist` section, and the clip's own background is white, so the card is
 * white rather than the spinners' translucent panel. */
.scrub {
  width: min(380px, 92vw);
  margin: clamp(28px, 4vw, 44px) auto 0;
  position: relative;
  border-radius: var(--r-lg); overflow: hidden;
  background: #fff;
  cursor: grab; touch-action: pan-y; user-select: none; -webkit-user-select: none;
}
.scrub.is-scrubbing { cursor: grabbing; }
.scrub-v { display: block; width: 100%; height: auto; }
/* No caption. It carried "Drag to take apart", which named one direction of a
   two-direction gesture and, in Hebrew, read as dismantling a machine. The hint
   earned its place when this was a sprite that sat still until touched; the
   video plays on its own, so the drag is a bonus nobody needs told about. The
   grab cursor is affordance enough for anyone looking for it. */

.phero .spin-hint { color: var(--fg-2); }
.phero .spin-img { filter: drop-shadow(0 26px 40px #0b0b0d33); }

/* ------------------------------------------------------------- page heros */
/* The whole page hero is dark. It used to be a gradient that switched to white
   part-way down, which sliced long white headlines in half: the top of the
   letters sat on purple and the bottom on white. Never reintroduce a colour
   stop inside this block. */
.phero {
  padding-block: clamp(104px, 13vw, 168px) clamp(56px, 8vw, 104px);
  background: var(--plum);
  position: relative; isolation: isolate; overflow: hidden;
}
/* a soft brand glow instead of a hard split, so it still has depth */
.phero::before {
  content: ''; position: absolute; inset: -30% -10% auto; height: 150%; z-index: -1;
  background:
    radial-gradient(50% 40% at 24% 20%, #854bb34d 0%, #854bb300 70%),
    radial-gradient(46% 38% at 84% 72%, #cbaee426 0%, #cbaee400 72%);
}
.phero-in { display: grid; gap: clamp(28px, 5vw, 60px); align-items: center; }
.phero-text { max-width: 62ch; color: #fff; }
.phero-text .kicker { color: var(--violet-haze); }
.phero-text .lede { color: #ffffffb5; }
.phero-media {
  border-radius: var(--r-lg); overflow: hidden;
  background: var(--paper);
  box-shadow: 0 30px 80px #0b0b0d33;
}
/* .phero-media-in is a plain pass-through wrapper that exists only so the
   scroll-parallax (site.js, [data-parallax]) has a transform of its own to
   drive -- one independent of .phero-media's own reveal transform (fade +
   slide-in), so the two never fight over the same "transform" declaration. */
.phero-media-in { height: 100%; }
.phero-media-in > img { width: 100%; }
.phero-media-in .spin { aspect-ratio: var(--spin-aspect); padding: 18px; }
.phero-media-in .spin-img { width: 100%; height: 100%; object-fit: contain; }
.phero-media-in .spin-sheet { inset: 18px; }
@media (min-width: 900px) {
  .phero-in { grid-template-columns: 1fr .92fr; }
}

/* ------------------------------------------------------------------ stats */
/* Equal columns, and each item STRETCHES to fill its column.
   Two bugs lived here: `auto-fit` with a min width gave uneven gaps, and then
   `justify-items: center` shrank every block to its own text width, so a short
   label like "מדינות" floated in a sea of air while a long one nearly touched
   its neighbour. Stretch + centred text keeps every item rhythmically equal.
   Six items now (was four): 3x2 reads as a clean grid, where 4-across would
   have left the fifth and sixth stranded alone on a half-empty final row. */
.stats {
  display: grid; gap: clamp(22px, 3.4vw, 40px);
  grid-template-columns: repeat(2, 1fr);
  justify-items: stretch; align-items: start;
  text-align: center;
}
@media (min-width: 760px) { .stats { grid-template-columns: repeat(3, 1fr); } }
.stats li { width: 100%; }
.stats-inline { grid-template-columns: repeat(3, 1fr); }
/* Solid colour, deliberately. This used to be gradient-clipped text
   (background-clip: text + color: transparent), which rendered the figures as
   empty boxes. A statistic that does not appear is worse than a plain one. */
.stat-v {
  display: block; font-size: clamp(2.1rem, 4.6vw, 3.4rem);
  font-weight: 900; letter-spacing: -.03em; line-height: 1;
  font-variant-numeric: tabular-nums;
  color: #fff;
}
.stat-l { display: block; margin-block-start: .6em; font-size: .9rem; color: #ffffffa0; max-width: 19ch; margin-inline: auto; text-wrap: balance; }
.sec-stats { padding-block: clamp(48px, 7vw, 88px); }
.stats-inline { margin-block-start: 2em; }
.stats-inline .stat-v { color: var(--violet-haze); }

/* ------------------------------------------------------------- split rows */
.split { display: grid; gap: clamp(30px, 5vw, 72px); align-items: center; }
.split-media { margin: 0; border-radius: var(--r-lg); overflow: hidden; }
/* no forced aspect: these are editorial frames and cropping them loses the shot */
.split-media img { width: 100%; height: auto; }
.split-media img { width: 100%; }
@media (min-width: 900px) {
  .split { grid-template-columns: 1fr 1.05fr; }
  .split.is-reverse .split-text { order: 2; }
  .split-media.is-tall { aspect-ratio: 4/5; }
  .split-media.is-tall img { height: 100%; object-fit: cover; }
}

/* ------------------------------------------------------------------ cards */
.cards-3 { display: grid; gap: clamp(14px, 2vw, 22px); grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.cards-5 { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.card {
  padding: clamp(24px, 3vw, 34px);
  background: var(--paper); border: 1px solid var(--rule); border-radius: var(--r);
  transition: transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease);
}
.card:hover { transform: translateY(-5px); box-shadow: 0 20px 46px #0b0b0d14; }
.tone-ink .card:hover, .tone-plum .card:hover { box-shadow: 0 20px 46px #00000040; border-color: #ffffff2e; }
.tone-ink .card, .tone-plum .card { background: #ffffff09; border-color: #ffffff14; }
.card h3 { margin: 0 0 .5em; font-size: 1.14rem; font-weight: 900; letter-spacing: -.016em; }
.card p { margin: 0; color: var(--fg-mid); font-size: .95rem; }
.tone-ink .card p, .tone-plum .card p { color: #ffffffa8; }
.card-n {
  display: block; margin-block-end: 1.4em;
  font-size: .78rem; font-weight: 700; letter-spacing: .1em; color: var(--violet);
  font-variant-numeric: tabular-nums;
}

/* ------------------------------------------------------------------ steps */
.steps { display: grid; gap: clamp(20px, 3vw, 34px); grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); }
.steps li { position: relative; padding-block-start: 26px; border-block-start: 1px solid var(--rule); }
.tone-ink .steps li, .tone-plum .steps li { border-block-start-color: #ffffff1f; }
.step-n {
  display: block; margin-block-end: 1em;
  font-size: .8rem; font-weight: 700; letter-spacing: .1em; color: var(--violet);
  font-variant-numeric: tabular-nums;
}
.tone-ink .step-n, .tone-plum .step-n { color: var(--violet-haze); }
.steps h3 { margin: 0 0 .45em; font-size: 1.1rem; font-weight: 900; letter-spacing: -.014em; }
.steps p { margin: 0; font-size: .95rem; color: var(--fg-mid); }
.tone-ink .steps p, .tone-plum .steps p { color: #ffffffa8; }
.steps-media {
  margin-block-start: clamp(40px, 6vw, 80px);
  border-radius: var(--r-lg); overflow: hidden; aspect-ratio: 21/9;
}
.steps-media img { width: 100%; height: 100%; object-fit: cover; }
@media (max-width: 700px) { .steps-media { aspect-ratio: 4/3; } }

/* ------------------------------------------------------------ heads strip */
.heads-strip {
  display: grid; gap: clamp(18px, 2.6vw, 30px);
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  margin-block-end: clamp(34px, 5vw, 56px);
}
/* There are FOUR heads, and auto-fit above resolves to three columns across a
 * wide range of widths -- which left the fourth alone on its own row, centred
 * under a full row of three. `is-pairs` was already on the element in pages.mjs
 * but had no rule anywhere, so it did nothing. Four items divide evenly by two
 * and by four and never by three, so those are the only counts allowed here. */
.heads-strip.is-pairs { grid-template-columns: repeat(2, 1fr); }
@media (min-width: 1040px) { .heads-strip.is-pairs { grid-template-columns: repeat(4, 1fr); } }

.heads-strip li { text-align: center; transition: transform .3s var(--ease); }
.heads-strip li:hover { transform: translateY(-5px); }
.head-shot {
  border-radius: var(--r); overflow: hidden; background: #fff;
  margin-block-end: 18px; position: relative;
}
.head-shot::after {
  content: ''; position: absolute; inset-block-end: 0; inset-inline: 0; height: 3px;
  background: var(--accent, var(--violet));
}
.head-shot img { transition: transform .5s var(--ease); }
.heads-strip li:hover .head-shot img { transform: scale(1.06); }
.heads-strip h3 { margin: 0 0 .2em; font-size: 1.16rem; font-weight: 900; }
.heads-strip .mono { color: var(--accent, var(--violet-haze)); margin-block-end: .6em; }
.heads-strip p:last-child { margin: 0; font-size: .93rem; color: #ffffffa8; }

/* -------------------------------------------------------------- LED grid --
   Previously had NO rules at all -- it rendered as a bare bulleted list.
   Styled to match the .card family it sits beside on the home page. */
.led-grid {
  display: grid; gap: clamp(14px, 2vw, 22px);
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
.led-grid li {
  padding: clamp(22px, 3vw, 30px);
  background: #ffffff09; border: 1px solid #ffffff17; border-radius: var(--r);
  transition: transform .3s var(--ease), background .3s var(--ease), border-color .3s var(--ease);
}
.led-grid li:hover { transform: translateY(-5px); background: #ffffff12; border-color: #ffffff2e; }
.led-grid h3 { margin: 0 0 .5em; font-size: 1.1rem; font-weight: 900; letter-spacing: -.014em; color: #fff; }
.led-grid p { margin: 0; font-size: .93rem; color: #ffffffa8; }

/* --------------------------------------------------------- head detail row */
.head-row { display: grid; gap: clamp(28px, 5vw, 72px); align-items: center; }
.head-media {
  margin: 0; border-radius: var(--r-lg); overflow: hidden; background: #fff;
  border: 1px solid var(--rule);
}
.head-text .kicker { color: var(--accent); }
.head-best, .head-pair { margin-block-start: 2em; }
@media (min-width: 900px) {
  .head-row { grid-template-columns: .9fr 1.1fr; }
  .head-row.is-reverse .head-media { order: 2; }
}

.tags { display: flex; flex-wrap: wrap; gap: 8px; }
.tags li {
  padding: 5px 12px; border-radius: 999px;
  border: 1px solid var(--rule); background: #0b0b0d08;
  font-size: .8rem; color: var(--fg-mid);
}
.tone-ink .tags li, .tone-plum .tags li { background: #ffffff0d; border-color: #ffffff1f; color: #ffffffb0; }
/* The "Key actives" tags on each capsule's own detail section (unlike the
   plain <li> tags elsewhere) are buttons that open the ingredient dialog --
   reusing .ing-tile for the shared click handler, but sized down to match
   the compact pill look of every other .tags row instead of .ing-tile's own
   much bigger card style (built for the standalone glossary explorer). */
.ing-tags li { padding: 0; }
.ing-tags .ing-tile {
  all: unset; display: inline-block; cursor: pointer;
  padding: 5px 12px; font-size: inherit; color: inherit;
  border-radius: 999px; transition: background .2s var(--ease);
}
.ing-tags .ing-tile:hover { background: #854bb31a; }
.tone-ink .ing-tags .ing-tile:hover, .tone-plum .ing-tags .ing-tile:hover { background: #ffffff1a; }

/* Head names range from "Red Technology Head" to "Magnetic Pulse Technology
   Head" -- a flex-wrap row sized every pill to its own text, so the row read
   as mismatched oval sizes rather than one consistent set of chips. A grid
   with a single repeated track size gives every chip THE SAME width, however
   long its name, instead of just a shared minimum. */
.pair-chips { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px; }
/* li is a flex row of one: a percentage height on the <a> itself proved
   unreliable against a stretched grid-item's computed height across
   engines, whereas a flex child's default cross-axis stretch is not. This
   is what keeps same-row chips the same height when one wraps to 2 lines
   and its neighbour doesn't. */
.pair-chips li { border-radius: 999px; display: flex; }
.pair-chips li a {
  flex: 1; display: flex; align-items: center; justify-content: center;
  box-sizing: border-box; text-align: center;
  padding: 6px 15px; border-radius: 999px;
  font-size: .84rem; font-weight: 900;
  /* Belt-and-braces: even with short names, one guaranteed line keeps every
     chip's height identical no matter how narrow the column gets. */
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  background: var(--fam, #0b0b0d0d);
  border: 1px solid #0b0b0d1a;
  transition: transform .2s var(--ease);
}
.pair-chips li a:hover { transform: translateY(-1px); }
.fam-pink { --fam: #e79cba30; }
.fam-blue { --fam: #8f9bd630; }
.fam-green { --fam: #8fb98a30; }
.fam-yellow { --fam: #e2be4830; }
.tone-ink .pair-chips li a { border-color: #ffffff26; color: #fff; }

/* --------------------------------------------------------- capsule grids */
.filters { margin-block-end: clamp(26px, 4vw, 44px); }
.filter-row { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  min-height: 38px; padding: 0 16px;
  border: 1px solid var(--rule); border-radius: 999px;
  background: transparent; font-size: .86rem; font-weight: 500;
  cursor: pointer;
  transition: background .2s var(--ease), color .2s var(--ease), border-color .2s var(--ease);
}
.chip:hover { border-color: #854bb366; }
.chip.is-on { background: var(--violet); border-color: var(--violet); color: #fff; }
.tone-ink .chip { border-color: #ffffff26; color: #ffffffc0; }
.tone-ink .chip.is-on { background: #fff; border-color: #fff; color: var(--ink); }

.cap-grid {
  display: grid; gap: clamp(12px, 1.8vw, 20px);
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
.cap-card {
  display: block; /* now an <a>, which defaults to inline -- was an <article> before */
  border: 1px solid var(--rule); border-radius: var(--r);
  overflow: hidden; background: var(--paper);
  transition: transform .3s var(--ease), box-shadow .3s var(--ease), opacity .3s var(--ease);
}
.cap-card:hover { transform: translateY(-3px); box-shadow: 0 18px 44px #0b0b0d1f; }
.cap-card[hidden] { display: none; }
.cap-shot { background: linear-gradient(160deg, var(--fam, #fff), #fff 72%); padding: 8px; }
.cap-body { padding: 18px 20px 22px; }
.cap-name { margin: 0 0 .35em; font-size: 1.06rem; font-weight: 900; letter-spacing: -.014em; }
.cap-lead { margin: 0 0 1em; font-size: .9rem; color: var(--fg-mid); }
.cap-body .tags li { font-size: .72rem; padding: 3px 9px; }
.empty { margin-block-start: 2em; color: var(--fg-mid); }

.cap-detail { display: grid; gap: clamp(24px, 5vw, 64px); align-items: center; scroll-margin-block-start: 90px; }
.cap-detail-media {
  margin: 0; border-radius: var(--r-lg); overflow: hidden;
  background: linear-gradient(150deg, var(--fam, var(--mist)), #fff 74%);
  padding: clamp(14px, 3vw, 34px);
}
.cap-meta { display: grid; gap: 28px; margin-block-start: 2.2em; }
@media (min-width: 620px) { .cap-meta { grid-template-columns: 1.4fr .8fr; } }
@media (min-width: 900px) {
  .cap-detail { grid-template-columns: .78fr 1.22fr; }
  .cap-detail.is-reverse .cap-detail-media { order: 2; }
}

/* ------------------------------------------------- ingredient explorer + dialog */
.explorer { max-width: 900px; margin-inline: auto; }
.explorer-tabs { justify-content: center; margin-block-end: clamp(26px, 4vw, 42px); }
.explorer-set { display: none; }
.explorer-set.is-on { display: block; }
.ing-tiles { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(215px, 1fr)); }
.ing-tile {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  width: 100%; padding: 16px 18px; text-align: start; cursor: pointer;
  background: #ffffff0a; border: 1px solid #ffffff1f; border-radius: 14px;
  color: #fff;
  transition: background .2s var(--ease), border-color .2s var(--ease), transform .2s var(--ease);
}
.ing-tile:hover { background: #ffffff14; border-color: var(--violet-haze); transform: translateY(-2px); }
/* same tiles on a light section (the skincare page) */
.ing-tiles.is-light .ing-tile { background: #0b0b0d06; border-color: var(--rule); color: var(--fg); }
.ing-tiles.is-light .ing-tile:hover { background: #854bb30f; border-color: var(--violet); }
.ing-tiles.is-light .ing-more { color: var(--violet); }
.ing-name { font-size: .95rem; font-weight: 500; }
.ing-more { font-size: 1.1rem; color: var(--violet-haze); flex: 0 0 auto; }
.explorer-note { margin-block-start: 2em; text-align: center; color: #ffffff8c; }

.ingdlg {
  max-width: 56ch; width: calc(100% - 2 * var(--gut));
  padding: clamp(26px, 4vw, 40px); border: 0; border-radius: var(--r-lg);
  background: var(--paper); color: var(--fg);
  box-shadow: 0 40px 100px #0b0b0d59;
}
.ingdlg::backdrop { background: #0b0b0dbb; -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); }
.ingdlg-t { margin: 0 0 .6em; font-size: 1.3rem; font-weight: 900; letter-spacing: -.02em; }
.ingdlg-b { margin: 0; color: var(--fg-mid); }
.ingdlg-x {
  position: absolute; inset-block-start: 14px; inset-inline-end: 14px;
  width: 38px; height: 38px; display: grid; place-items: center;
  background: none; border: 0; border-radius: 50%; cursor: pointer; color: var(--fg-mid);
}
.ingdlg-x:hover { background: #0b0b0d0d; color: var(--fg); }

.pair-chips li.is-best a { border-color: var(--violet); font-weight: 700; }
.pair-all { margin: 0 0 .8em; font-size: .9rem; color: #ffffffa8; }
.head-pair .note { margin-block-end: .9em; }

/* --------------------------------------------------------------- glossary */
.gloss { border-block-start: 1px solid var(--rule); max-width: 76ch; margin-inline: auto; }
.tone-ink .gloss { border-block-start-color: #ffffff1f; }
.gloss li { border-block-end: 1px solid var(--rule); }
.tone-ink .gloss li { border-block-end-color: #ffffff1f; }
.gloss-t {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  width: 100%; padding: 20px 2px; background: none; border: 0;
  text-align: start; font-size: 1.02rem; font-weight: 900; letter-spacing: -.012em;
  cursor: pointer;
}
.gloss-t i {
  position: relative; flex: 0 0 auto; width: 13px; height: 13px;
}
.gloss-t i::before, .gloss-t i::after {
  content: ''; position: absolute; inset-block-start: 6px; inset-inline: 0;
  height: 1.5px; background: currentColor; border-radius: 2px;
  transition: transform .3s var(--ease), opacity .2s var(--ease);
}
.gloss-t i::after { transform: rotate(90deg); }
.gloss-t[aria-expanded='true'] i::after { transform: rotate(0); opacity: 0; }
.gloss-d { padding: 0 2px 22px; max-width: 68ch; }
.gloss-d[hidden] { display: none; }
.gloss-d p { margin: 0; color: var(--fg-mid); font-size: .96rem; }
.tone-ink .gloss-d p { color: #ffffffa8; }

/* -------------------------------------------------------------- protocols */
.proto-list { display: grid; gap: clamp(20px, 3vw, 30px); grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); margin-block-end: clamp(30px, 4vw, 52px); }
.proto-list > li { transition: transform .3s var(--ease); }
.proto-list > li:hover { transform: translateY(-5px); }
.proto-list figure { margin: 0 0 20px; border-radius: var(--r); overflow: hidden; aspect-ratio: 4/3; }
.proto-list figure img { width: 100%; height: 100%; object-fit: cover; transition: transform .5s var(--ease); }
.proto-list > li:hover figure img { transform: scale(1.06); }
.proto-combo { display: flex; align-items: center; gap: 8px; margin-block-end: .8em; font-size: .82rem; color: var(--fg-mid); flex-wrap: wrap; }
.dot { width: 9px; height: 9px; border-radius: 50%; background: var(--accent, var(--violet)); flex: 0 0 auto; }
.proto-list h3 { margin: 0 0 .4em; font-size: 1.16rem; font-weight: 900; letter-spacing: -.016em; }
.proto-list p { margin: 0; font-size: .94rem; color: var(--fg-mid); }

.proto-row { display: grid; gap: clamp(26px, 5vw, 68px); align-items: center; }
.proto-media { margin: 0; border-radius: var(--r-lg); overflow: hidden; aspect-ratio: 5/4; }
.proto-media img { width: 100%; height: 100%; object-fit: cover; }
.proto-parts { display: flex; align-items: center; gap: 14px; margin-block-end: 1.6em; flex-wrap: wrap; }
.proto-parts .part { display: flex; align-items: center; gap: 10px; font-size: .88rem; }
.proto-parts .part img {
  width: 62px; height: 62px; object-fit: contain; border-radius: 12px;
  background: linear-gradient(150deg, var(--fam, var(--mist)), #fff 74%);
  padding: 4px;
}
.proto-parts .plus { color: var(--fg-2); font-size: 1.2rem; }
@media (min-width: 900px) {
  .proto-row { grid-template-columns: 1fr 1fr; }
  .proto-row.is-reverse .proto-media { order: 2; }
}

/* ---------------------------------------------------------------- builder */
.builder { max-width: 900px; margin-inline: auto; }
.builder .filter-row { justify-content: center; margin-block-end: clamp(24px, 4vw, 40px); }
.builder-set { display: none; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
.builder-set.is-on { display: grid; }
.builder-set li {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 14px; border: 1px solid #ffffff1f; border-radius: 14px;
  background: #ffffff09;
}
.b-cap img {
  width: 46px; height: 46px; object-fit: contain; border-radius: 10px;
  background: linear-gradient(150deg, var(--fam, #fff), #fff 74%); padding: 3px;
}
.b-txt { display: grid; gap: 2px; font-size: .92rem; }
.b-head { display: flex; align-items: center; gap: 6px; font-size: .78rem; color: #ffffff8c; }
.b-link { margin-inline-start: auto; color: #ffffff8c; font-size: 1.1rem; }
html[dir='rtl'] .b-link { transform: scaleX(-1); }
.b-link:hover { color: #fff; }
.builder .note { margin-block-start: 2em; text-align: center; color: #ffffff80; }

/* ------------------------------------------------------------- anatomy */
.anat { display: grid; gap: clamp(28px, 5vw, 64px); align-items: start; }
.anat-media { margin: 0; border-radius: var(--r-lg); overflow: hidden; background: #fff; border: 1px solid var(--rule); position: sticky; inset-block-start: 96px; }
.anat-list { display: grid; gap: clamp(22px, 3vw, 34px); }
.anat-list li {
  padding-block-start: 22px; border-block-start: 1px solid var(--rule);
  transition: border-color .3s var(--ease), padding-inline-start .3s var(--ease);
}
.anat-list li:hover { border-block-start-color: var(--violet); padding-inline-start: 10px; }
.anat-n { display: block; margin-block-end: .9em; font-size: .78rem; font-weight: 700; letter-spacing: .1em; color: var(--violet); }
.anat-list h3 { margin: 0 0 .4em; font-size: 1.14rem; font-weight: 900; letter-spacing: -.016em; }
.anat-list p { margin: 0; color: var(--fg-mid); font-size: .96rem; }
@media (min-width: 900px) { .anat { grid-template-columns: .95fr 1.05fr; } }
@media (max-width: 899px) { .anat-media { position: static; } }

.gal { display: grid; gap: clamp(10px, 1.6vw, 18px); grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); }
.gal li { border-radius: var(--r); overflow: hidden; background: #fff; border: 1px solid var(--rule); }
.gal-3 { grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); margin-block-start: clamp(20px, 3vw, 34px); }
.gal-4 { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); margin-block-end: clamp(38px, 5vw, 68px); }
.gal-3 li, .gal-4 li { aspect-ratio: 4/3; }
.gal-3 li img, .gal-4 li img { width: 100%; height: 100%; object-fit: cover; }
.gal-4 li img { object-fit: contain; background: #fff; }
.tone-ink .gal li, .tone-mist .gal li { border-color: #ffffff1f; }

.acc-wide, .quotes-media {
  margin: clamp(34px, 5vw, 60px) 0 0; border-radius: var(--r-lg); overflow: hidden;
  aspect-ratio: 16/9;
}
.acc-wide img, .quotes-media img { width: 100%; height: 100%; object-fit: cover; }
@media (max-width: 700px) { .acc-wide, .quotes-media { aspect-ratio: 4/3; } }

.split-tight { margin-block-start: clamp(34px, 5vw, 60px); align-items: center; }
.sec-packs .split-media img { width: 100%; height: auto; }

/* "Part of the family" strip. All three marks are WHITE artwork, so the strip
   carries its own dark band rather than each logo carrying a black plate. */
.family {
  margin-block: clamp(46px, 6vw, 76px) 0; margin-inline: auto;
  max-width: 760px; text-align: center;
  background: var(--ink); border-radius: var(--r-lg);
  padding: clamp(28px, 4vw, 44px) clamp(20px, 4vw, 48px);
}
.family .mini-h { color: #ffffff8c; }
.family-marks {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  gap: clamp(28px, 5vw, 56px);
}
/* Optical sizing, not one shared height. Two of these are wordmarks and one is a
   square symbol: at a common height the square rendered 38px wide against the
   wordmarks' 173px, which read as a broken row rather than a set. */
.family-marks img {
  width: auto; max-width: 132px; height: 26px; object-fit: contain;
  opacity: .82; transition: opacity .2s var(--ease);
}
.family-marks .is-square img { height: 42px; max-width: 56px; }
.family-marks li:hover img { opacity: 1; }

/* zoomable packshot tiles */
.gal-zoom li { position: relative; }
.gal-btn {
  display: block; width: 100%; padding: 0; border: 0; background: none; cursor: zoom-in;
  position: relative; overflow: hidden;
}
.gal-btn img { transition: transform .5s var(--ease); }
.gal-btn:hover img, .gal-btn:focus-visible img { transform: scale(1.07); }
.gal-zoom-i {
  position: absolute; inset-block-end: 10px; inset-inline-end: 10px;
  width: 32px; height: 32px; display: grid; place-items: center;
  border-radius: 50%; background: #ffffffdd; color: var(--fg);
  opacity: 0; transform: translateY(4px);
  transition: opacity .25s var(--ease), transform .25s var(--ease);
}
.gal-btn:hover .gal-zoom-i, .gal-btn:focus-visible .gal-zoom-i { opacity: 1; transform: none; }

.lbx {
  max-width: min(92vw, 1000px); width: auto; padding: 0; border: 0;
  border-radius: var(--r-lg); background: var(--paper); overflow: visible;
}
.lbx::backdrop { background: #0b0b0de6; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.lbx-img { width: 100%; height: auto; max-height: 84vh; object-fit: contain; border-radius: var(--r-lg); cursor: zoom-out; }
.lbx-x {
  position: absolute; inset-block-start: -14px; inset-inline-end: -14px; z-index: 2;
  width: 40px; height: 40px; display: grid; place-items: center;
  background: var(--paper); color: var(--fg); border: 0; border-radius: 50%; cursor: pointer;
  box-shadow: 0 8px 26px #0b0b0d59;
}
.lbx-x:hover { background: var(--violet); color: #fff; }

.acc-grid { display: grid; gap: clamp(16px, 2.4vw, 26px); grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.acc-grid-3 { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.acc-shot { border-radius: var(--r); overflow: hidden; background: #fff; border: 1px solid var(--rule); margin-block-end: 16px; }
.acc-grid h3 { margin: 0 0 .35em; font-size: 1.06rem; font-weight: 900; }
.acc-grid p { margin: 0; font-size: .92rem; color: var(--fg-mid); }

/* ---------------------------------------------------------- MIT diagram
   Real product photo above a drawn skin cross-section. */
.mit { margin: 0; }
.mit svg { width: 100%; height: auto; display: block; }

/* Flat vector diagram on a white card. Replaced a photo composite that read as a
   pasted cut-out; see the note in pages.mjs mitDiagram(). */
.mit-svg {
  display: block; width: 100%; max-width: 340px; margin-inline: auto;
  background: #fff; border-radius: var(--r-lg); padding: 10px;
}
.mit-num circle { fill: var(--violet); }
.mit-num text {
  fill: #fff; font: 700 12px var(--font); text-anchor: middle;
}
/* `direction: ltr` so text-anchor means the GEOMETRIC end, not the logical one.
   Inherited rtl made `end` anchor on the left and the label ran off the viewBox.
   Hebrew glyphs still shape right-to-left within the run, so this is safe. */
.mit-lay-t text {
  direction: ltr;
  fill: var(--mit-text); font: 500 10px var(--font);
  letter-spacing: .08em;
}
html[lang='en'] .mit-lay-t text { text-transform: uppercase; }
/* A legend under the photo, not connector lines pinned over it. Absolutely
   positioned callouts overflowed the panel on every narrow width. */
.mit-legend {
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: 10px 22px; margin: 14px 0 0;
  font-size: .74rem; letter-spacing: .08em; text-transform: uppercase; color: var(--mit-text);
}
.mit-legend li { display: flex; align-items: center; gap: 7px; }
.mit-legend b {
  display: grid; place-items: center; width: 19px; height: 19px; border-radius: 50%;
  background: var(--violet); color: #fff; font-size: .68rem; font-weight: 700;
}

.mit { max-width: 420px; margin-inline: auto; }

.mit figcaption {
  margin-block-start: 14px; text-align: center;
  font-size: .76rem; letter-spacing: .12em; text-transform: uppercase; color: var(--fg-2);
}
.mit-flow path { stroke-dasharray: 5 13; animation: flow 1.9s linear infinite; }
.mit-flow path:nth-child(2) { animation-duration: 1.5s; }
.mit-flow path:nth-child(4), .mit-flow path:nth-child(5) { animation-duration: 2.4s; opacity: .55; }
@keyframes flow { to { stroke-dashoffset: -36; } }
.mit-arc path { animation: pulse 3s var(--ease) infinite; }
@keyframes pulse { 50% { opacity: .25; } }
@media (prefers-reduced-motion: reduce) {
  .mit-flow path, .mit-arc path { animation: none; }
}

/* --------------------------------------------------------------- prose 2 */
.prose-2 { columns: 2; column-gap: clamp(28px, 4vw, 60px); margin-block-end: clamp(38px, 5vw, 66px); }
.prose-2 .body { max-width: none; }
@media (max-width: 780px) { .prose-2 { columns: 1; } }

/* Two-by-two, not four-across. Four in a row wrapped to 3 + 1 orphan at common
   widths, which read as a mistake. */
.mech { display: grid; gap: clamp(16px, 2.4vw, 26px); grid-template-columns: 1fr; max-width: 860px; margin-inline: auto; }
@media (min-width: 620px) { .mech { grid-template-columns: 1fr 1fr; } }
.mech li {
  padding: clamp(22px, 3vw, 30px); border: 1px solid var(--rule); border-radius: var(--r);
  transition: transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease);
}
.mech li:hover { transform: translateY(-4px); box-shadow: 0 18px 40px #0b0b0d14; border-color: #854bb355; }
.mech-n { display: block; margin-block-end: 1.2em; font-size: .78rem; font-weight: 700; letter-spacing: .1em; color: var(--violet); }
.mech h3 { margin: 0 0 .4em; font-size: 1.08rem; font-weight: 900; }
.mech p { margin: 0; font-size: .93rem; color: var(--fg-mid); }

/* ---------------------------------------------------------------- awards */
.award-block { display: grid; gap: clamp(28px, 5vw, 64px); align-items: center; }
.award-logo { width: 96px; height: auto; margin: 0 0 22px; opacity: .92; }
.award-media { margin: 0; border-radius: var(--r-lg); overflow: hidden; background: #fff; }
@media (min-width: 900px) { .award-block { grid-template-columns: 1fr 1fr; } }

/* ---------------------------------------------------------------- quotes */
.quotes { display: grid; gap: clamp(18px, 2.6vw, 28px); grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); }
.quotes li { padding: clamp(26px, 3.4vw, 38px); background: var(--mist); border-radius: var(--r); }
.quotes blockquote { margin: 0 0 1.4em; }
.quotes blockquote p { margin: 0; font-size: 1.04rem; line-height: 1.6; letter-spacing: -.01em; }
.quotes blockquote p::before { content: ''; }
.quotes blockquote p::after { content: ''; }
.quote-by { margin: 0; display: grid; gap: 2px; font-size: .86rem; }
.quote-by span { color: var(--fg-mid); }

/* -------------------------------------------------------------- products */
.prod { display: grid; gap: clamp(28px, 5vw, 68px); align-items: center; scroll-margin-block-start: 90px; }
/* Bottle first, carton tucked into the corner. Both open in the lightbox. */
.prod-media { position: relative; margin: 0; }
.prod-media img { width: 100%; height: auto; }
.prod-shot {
  display: block; width: 100%; padding: 0; border: 0; cursor: zoom-in;
  border-radius: var(--r-lg); overflow: hidden; background: #fff; position: relative;
}
.prod-box {
  position: absolute; inset-block-end: -14px; inset-inline-end: -10px;
  width: 34%; max-width: 150px; padding: 6px; border: 1px solid var(--rule);
  border-radius: 14px; background: #fff; cursor: zoom-in;
  box-shadow: 0 14px 34px #0b0b0d1f;
  transition: transform .3s var(--ease);
}
.prod-box:hover { transform: translateY(-3px); }
@media (max-width: 620px) { .prod-box { position: static; width: 46%; margin-block-start: 12px; inset: auto; } }

/* side-by-side product chooser */
.compare { display: grid; gap: clamp(14px, 2.4vw, 26px); grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); max-width: 780px; margin-inline: auto; }
.compare-card {
  display: grid; justify-items: center; text-align: center; gap: 4px;
  padding: clamp(22px, 3vw, 32px);
  border: 1px solid var(--rule); border-radius: var(--r); background: var(--paper);
  transition: transform .3s var(--ease), box-shadow .3s var(--ease), border-color .2s var(--ease);
}
.compare-card:hover { transform: translateY(-4px); border-color: #854bb355; box-shadow: 0 20px 46px #0b0b0d14; }
.compare-shot { display: block; width: 62%; margin-block-end: 10px; }
.compare-kind { font-size: .7rem; letter-spacing: .16em; text-transform: uppercase; color: var(--violet); }
.compare-name { font-size: 1.2rem; font-weight: 900; letter-spacing: -.02em; }
.compare-lead { font-size: .92rem; color: var(--fg-mid); max-width: 28ch; }
.facts { display: grid; gap: 10px; margin-block-start: 1.8em; }
.facts li { position: relative; padding-inline-start: 22px; font-size: .95rem; color: var(--fg-mid); }
.facts li::before {
  content: ''; position: absolute; inset-inline-start: 0; inset-block-start: .62em;
  width: 7px; height: 7px; border-radius: 50%; background: var(--violet);
}
.ing-block { margin-block-start: clamp(46px, 6vw, 84px); }
.ing-block .note { margin-block-end: 1.4em; }
@media (min-width: 900px) {
  .prod { grid-template-columns: 1fr 1fr; }
  .prod.is-reverse .prod-media { order: 2; }
}

.rec {
  margin-block-start: clamp(38px, 5vw, 64px);
  padding: clamp(24px, 3.4vw, 36px);
  border: 1px solid #ffffff1f; border-radius: var(--r);
  background: #ffffff09; max-width: 72ch;
}
.rec p { margin: 0; color: #ffffffb0; }
.rec p + p { margin-block-start: 1.4em; }
.sec-stock .rec { border-color: var(--rule); background: var(--mist); }
.sec-stock .rec p { color: var(--fg-mid); }

/* ----------------------------------------------------------------- films */
.films { display: grid; gap: clamp(26px, 4vw, 44px); grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
/* one film embedded inside another section, e.g. the home-page ritual block */
.films-single { grid-template-columns: 1fr; max-width: 900px; margin: clamp(38px, 5vw, 68px) auto 0; }
.films-single h2 { font-size: 1.06rem; }
/* No fixed aspect and no `cover`: most of these films are vertical social cuts,
   and a 16/9 frame with object-fit:cover chopped the top and bottom off them.
   The video sizes itself; the frame follows. */
.film { position: relative; border-radius: var(--r); overflow: hidden; background: #000; margin-block-end: 18px; }
.film video { width: 100%; height: auto; display: block; max-height: 78svh; object-fit: contain; }
/* is-vertical (catalog.mjs films[].vertical): a 9:16 phone clip stretched to
   the width of a landscape-shaped card, then capped by max-height above,
   left it pillarboxed -- black bars down both sides, the .film background
   showing through. Capping the CARD's width instead, sized for a portrait
   clip, lets height:auto reach the video's true height with nothing to
   contain against, so there is no gap left over to show as a bar. */
.film.is-vertical { max-width: 380px; margin-inline: auto; }
.film.is-vertical video { max-height: none; }
.film-play {
  position: absolute; inset: 0; display: grid; place-items: center;
  width: 100%; border: 0; background: #0b0b0d3d; color: #fff; cursor: pointer;
  transition: background .3s var(--ease), opacity .3s var(--ease);
}
.film-play::before {
  content: ''; position: absolute; width: 66px; height: 66px; border-radius: 50%;
  background: #ffffff26; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border: 1px solid #ffffff4d;
}
.film-play svg { position: relative; }
.film-play:hover { background: #0b0b0d26; }
.film.is-playing .film-play { opacity: 0; pointer-events: none; }
.films h2 { margin: 0 0 .3em; font-size: 1.2rem; font-weight: 900; letter-spacing: -.016em; }
.films p { margin: 0; color: var(--fg-mid); font-size: .95rem; }

/* ------------------------------------------------------------- stockists */
.find { max-width: 460px; margin-block-end: clamp(26px, 4vw, 42px); }
.find-lab { display: block; margin-block-end: .6em; font-size: .8rem; font-weight: 900; letter-spacing: .1em; text-transform: uppercase; color: var(--fg-mid); }
.find-in {
  width: 100%; min-height: 50px; padding: 0 18px;
  font: inherit; color: inherit;
  border: 1px solid var(--rule); border-radius: 999px; background: var(--mist);
}
.find-in:focus { background: #fff; border-color: var(--violet); outline: none; box-shadow: 0 0 0 3px #854bb326; }
.stock { display: grid; gap: 10px; }
.stock li {
  display: flex; align-items: center; justify-content: space-between; gap: 18px;
  padding: 18px clamp(18px, 2.4vw, 26px);
  border: 1px solid var(--rule); border-radius: var(--r); background: var(--paper);
  transition: border-color .2s var(--ease);
}
.stock li:hover { border-color: #854bb340; }
.stock li[hidden] { display: none; }
.stock-n { margin: 0 0 .2em; font-size: 1.06rem; font-weight: 900; letter-spacing: -.014em; }
.stock-a { margin: 0; font-size: .9rem; color: var(--fg-mid); }

/* ---------------------------------------------------------------- contact */
.contact { display: grid; gap: clamp(32px, 5vw, 68px); align-items: start; }
@media (min-width: 900px) { .contact { grid-template-columns: 1.25fr .75fr; } }
.form-grid { display: grid; gap: 18px; }
@media (min-width: 600px) { .form-grid { grid-template-columns: 1fr 1fr; } }
.fld { margin: 0 0 18px; display: grid; gap: 7px; }
.fld label { font-size: .84rem; font-weight: 900; color: var(--fg-mid); }
.fld input, .fld select, .fld textarea {
  width: 100%; min-height: 50px; padding: 13px 16px;
  font: inherit; color: inherit;
  background: var(--mist); border: 1px solid var(--rule); border-radius: 14px;
}
.fld textarea { min-height: 130px; resize: vertical; }
.fld input:focus, .fld select:focus, .fld textarea:focus {
  background: #fff; border-color: var(--violet); outline: none; box-shadow: 0 0 0 3px #854bb326;
}
.fld input[aria-invalid='true'] { border-color: #c0392b; box-shadow: 0 0 0 3px #c0392b1f; }
.fld-check { display: flex; align-items: center; gap: 10px; }
.fld-check input { width: 20px; min-height: 20px; height: 20px; padding: 0; flex: 0 0 auto; accent-color: var(--violet); }
.fld-check label { font-weight: 400; }
.form-actions { margin-block: 1.6em 0; }
.form-note { min-height: 1.5em; font-size: .93rem; }
.form-note.is-ok { color: #1e7a4d; }
.form-note.is-err { color: #c0392b; }
.contact-side { padding: clamp(24px, 3vw, 34px); background: var(--mist); border-radius: var(--r); }
.contact-side p { margin: 0 0 1.4em; }
.contact-side a { color: var(--violet); }
.contact-org { color: var(--fg-mid); font-size: .9rem; }
.contact-side .mini-h + p { margin-block-end: 2em; }

/* ------------------------------------------------------------------ legal */
.sec-legal { padding-block-start: clamp(120px, 15vw, 190px); }
.legal { max-width: 72ch; margin-inline: auto; }
.legal p { color: var(--fg-mid); }
.legal-meta { margin-block-start: 2.6em; padding-block-start: 1.6em; border-block-start: 1px solid var(--rule); font-size: .9rem; }
.legal-meta a { color: var(--violet); }

/* ---------------------------------------------------------------- end cta */
.sec-end { text-align: center; }
/* 34ch here was computed against .end-cta's OWN (body-size) font, not the
   h2's much larger display-xl font -- so the box was only ~290px, and the
   headline wrapped across three or four lines instead of one or two: tall
   and narrow instead of the short, wide block it should read as. A child's
   own max-width can't widen it past a narrower parent, so the fix has to be
   on the container itself; the lede keeps its own narrower 52ch reading width. */
.end-cta { max-width: min(94vw, 980px); margin-inline: auto; }
.end-cta .lede { margin-inline: auto; max-width: 52ch; }
.end-cta .row-btns { justify-content: center; }

/* ----------------------------------------------------------------- footer */
.foot { background: var(--ink); color: #fff; padding-block: clamp(52px, 7vw, 88px) 26px; }
.foot-in { display: grid; gap: clamp(30px, 4vw, 52px); }
@media (min-width: 760px) { .foot-in { grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr; } }
.foot-brand img { width: 150px; margin-block-end: 20px; }
.foot-tag { margin: 0 0 .8em; color: #ffffffc0; max-width: 30ch; }
.foot-meta { margin: 0; font-size: .82rem; color: #ffffff70; }
/* Synoia credited separately, because the WISHtoGo wordmark is used alone */
.foot-by {
  display: inline-flex; align-items: center; gap: 10px; margin-block-start: 1.4em;
  font-size: .74rem; letter-spacing: .16em; text-transform: uppercase; color: #ffffff70;
}
.foot-by img { width: 104px; height: auto; opacity: .8; }
.foot-by:hover img { opacity: 1; }
.foot-h { margin: 0 0 1.1em; font-size: .74rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: #ffffff70; }
html[lang='he'] .foot-h { letter-spacing: .05em; }
.foot-col li { margin-block-end: .7em; }
.foot-col a { font-size: .92rem; color: #ffffffbb; transition: color .2s var(--ease); }
.foot-col a:hover { color: #fff; }
.foot-social { display: flex; flex-wrap: wrap; gap: 12px; margin-block-start: 1.2em; }
.foot-social a { font-size: .82rem; color: #ffffff8c; }
.foot-social a:hover { color: #fff; }
.foot-base {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px;
  margin-block-start: clamp(38px, 5vw, 60px); padding-block-start: 24px;
  border-block-start: 1px solid #ffffff14;
}
.foot-base p { margin: 0; font-size: .8rem; color: #ffffff70; }
.foot-lang { border-color: #ffffff26; }

/* ==========================================================================
   EXPERIMENTAL -- interactive home-page pass (not yet approved for commit).
   Video-first hero, ticker, animated stat counters, magnetic buttons and a
   pinned scrollytelling "why" rail, in the spirit of glo2facial.com. Brand
   tokens (colour/type/radius) all come from the variables above -- nothing
   here introduces a new hue or typeface.
   ========================================================================== */

/* ------------------------------------------------------------- hero video */
.hero-video { background: var(--ink); padding-block-end: 96px; }
.hero-media {
  position: absolute; inset: 0; z-index: -2; overflow: hidden;
  background: var(--plum);
}
.hero-bg-video {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center 30%;
}
/* Dark at top (header) and bottom (text), lighter in the middle so the film
   still reads as a film rather than as wallpaper. */
.hero-scrim {
  position: absolute; inset: 0;
  background:
    linear-gradient(#0b0b0dcc 0%, #0b0b0d4d 32%, #0b0b0d59 62%, #0b0b0dee 100%);
}
.hero-video .hero-glow { z-index: -1; mix-blend-mode: screen; }
.hero-video .hero-in { align-self: flex-end; padding-block-end: clamp(18px, 3vw, 34px); }
.hero-video.hero { align-items: stretch; }

.hero-mute {
  position: absolute; inset-block-start: calc(92px + 14px); inset-inline-end: var(--gut);
  z-index: 2; width: 42px; height: 42px; padding: 0;
  display: grid; place-items: center; border-radius: 50%;
  background: #ffffff1a; border: 1px solid #ffffff33;
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
  color: #fff; cursor: pointer;
  transition: background .2s var(--ease), border-color .2s var(--ease);
}
.hero-mute:hover { background: #ffffff33; border-color: #fff; }
.hero-mute .i-on { display: none; }
.hero-mute[aria-pressed='false'] .i-on { display: block; }
.hero-mute[aria-pressed='false'] .i-off { display: none; }
@media (max-width: 700px) { .hero-mute { inset-block-start: calc(64px + 10px); } }

@media (min-width: 900px) {
  .hero-video .hero-in { align-self: center; padding-block-end: 0; }
}

/* the spinner's own quiet section, right after the hero -- moved off the
   video, which made it feel stuck/unresponsive to drag (a video, buttons and
   a draggable card all sharing one stacking context fought each other). */
.sec-spin { padding-block: clamp(40px, 6vw, 72px); }
.sec-film { padding-block: clamp(40px, 6vw, 72px); }
.spin-showcase {
  width: min(320px, 78vw); margin-inline: auto;
  padding: 22px 26px 14px;
  background: #ffffff0d; border: 1px solid #ffffff1f; border-radius: var(--r-lg);
}
.spin-showcase .spin-img,
.spin-showcase .spin-sheet { filter: drop-shadow(0 22px 32px #0b0b0d80); }

/* A spinner in a LIGHT section drops the card chrome above -- a 5%-white wash
 * and a near-black shadow are tuned for the ink tone and read as grime on mist.
 * Used by the handset turntable beside the ritual steps on the home page. */
/* Width is per-instance, because the crops differ in shape: the handset
 * turntable is nearly square and looks bloated at a landscape width. Callers
 * set --spin-w; 560px stays the default. */
.spin-showcase-flat {
  width: min(var(--spin-w, 560px), 92vw);
  margin-block-start: clamp(28px, 4vw, 44px);
  padding: 0; background: none; border: 0;
}
/* .spin has no height of its own -- it borrows it from the still first frame,
 * and .spin-sheet is absolutely positioned inside that. The hero spinners get
 * away with it because they load eagerly. This one is below the fold and lazy,
 * so before the still arrives the box is 0px tall, the sprite has nothing to
 * fill, and the section collapses. Worse, a zero-height box may never satisfy
 * the 0.25 IntersectionObserver threshold, so it can stay collapsed: no height
 * -> never observed -> never loaded -> no height. Declaring the ratio up front
 * breaks that loop, the same way .phero-media-in does for the hero. */
.spin-showcase-flat .spin { aspect-ratio: var(--spin-aspect); }
.spin-showcase-flat .spin-img { width: 100%; height: 100%; object-fit: contain; }
.spin-showcase-flat .spin-img,
.spin-showcase-flat .spin-sheet { filter: drop-shadow(0 18px 26px #0b0b0d26); }

.hero-scroll {
  position: absolute; inset-block-end: 74px; inset-inline-start: 50%;
  transform: translateX(-50%);
  display: grid; place-items: center; width: 34px; height: 34px;
  color: #ffffffb0; border: 1px solid #ffffff33; border-radius: 50%;
  animation: heroScrollCue 2.2s var(--ease) infinite;
}
.hero-scroll:hover { color: #fff; border-color: #fff; }
@keyframes heroScrollCue { 0%, 100% { transform: translate(-50%, 0); } 50% { transform: translate(-50%, 6px); } }
@media (prefers-reduced-motion: reduce) { .hero-scroll { animation: none; } }
@media (max-width: 700px) { .hero-scroll { display: none; } }

/* soft violet glow that trails the pointer, hero only (site.js) */
.hero-cursor-glow {
  position: absolute; z-index: -1; width: 420px; height: 420px; border-radius: 50%;
  background: radial-gradient(circle, #cbaee42e 0%, #cbaee400 70%);
  transform: translate(-50%, -50%); pointer-events: none;
  opacity: 0; transition: opacity .4s var(--ease);
}
.hero-cursor-glow.is-on { opacity: 1; }

/* ------------------------------------------------------------------ ticker */
.ticker {
  overflow: hidden; background: var(--ink); border-block-end: 1px solid #ffffff14;
  padding-block: 14px;
}
.ticker-track {
  display: flex; width: max-content; gap: 48px;
  animation: tickerScroll 32s linear infinite;
}
html[dir='rtl'] .ticker-track { animation-direction: reverse; }
.ticker:hover .ticker-track { animation-play-state: paused; }
.ticker-item {
  display: inline-flex; align-items: baseline; gap: 8px; white-space: nowrap;
  font-size: .82rem; letter-spacing: .04em; color: #ffffff90;
}
.ticker-item b { font-size: 1rem; font-weight: 900; color: var(--violet-haze); }
@keyframes tickerScroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) {
  .ticker { overflow-x: auto; }
  .ticker-track { animation: none; }
}

/* --------------------------------------------------- pinned "why" rail --
   Mobile/default: .why-layout is a plain block, so .cards-3 renders exactly
   as it always has. From 1000px the rail becomes a sticky column tracking
   whichever card is centred in view (site.js toggles .is-active). */
.why-rail { display: none; }
@media (min-width: 1000px) {
  .why-layout { display: grid; grid-template-columns: 168px 1fr; gap: clamp(24px, 4vw, 56px); align-items: start; }
  .why-rail {
    display: block; position: sticky; top: 140px;
  }
  .why-rail-n {
    display: block; font-size: 5rem; font-weight: 900; line-height: 1;
    letter-spacing: -.03em; color: var(--violet-haze); font-variant-numeric: tabular-nums;
    transition: opacity .3s var(--ease);
  }
  .cards-3.why-list { grid-template-columns: 1fr; gap: 28px; }
  .why-item {
    opacity: .45; transform: none; transition: opacity .45s var(--ease);
  }
  .why-item.is-active { opacity: 1; }
}
@media (min-width: 1000px) and (prefers-reduced-motion: reduce) {
  .why-item, .why-rail-n { transition: none; }
}

/* ------------------------------------------------------------ RTL nudges */
html[dir='rtl'] .award-flag { transform: translateX(50%); }
html[dir='rtl'] .spin-hint { transform: translateX(50%); }
html[dir='rtl'] .spin-hint svg { transform: scaleX(-1); }
