/** Shopify CDN: Minification failed

Line 1011:1 Unexpected "}"
Line 1934:0 Unexpected "@media"

**/
/* ============================================================
   MEW — RED OBJECT
   The site's design system. Every page carries `ro` on <body>,
   so the tokens below cascade to the whole document including
   the drawers. This file is the only stylesheet the site loads.

   Map
     0  base reset            8  find your red
     1  tokens                9  object of desire
     2  primitives           10  designed in detail (bento)
     3  chrome: announce     11  the formula
     4  chrome: header       12  made to be worn
     5  chrome: drawers      13  faq
     6  hero + buy card      14  footer
     7  value props          15  page templates
                             16  motion + responsive
   ============================================================ */

/* ---------- 0. BASE RESET ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body { margin: 0; -webkit-font-smoothing: antialiased; }
img, video, svg { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; padding: 0; }
input, select, textarea { font: inherit; color: inherit; }
ul, ol { margin: 0; padding: 0; list-style: none; }
h1, h2, h3, h4, p, figure, blockquote, fieldset { margin: 0; padding: 0; border: 0; }
main { display: block; }
::selection { background: var(--red); color: #fff; }
.sr-only {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0;
}

.ro {
  /* palette — red is the ground, not the accent */
  --red-deep:  #6B1220;      /* full-bleed section ground */
  --red:       #8B1E24;      /* buttons, rules, active states */
  --red-ink:   #4E0D18;      /* text on light red */
  --paper:     #FFFFFF;
  --paper-2:   #F7F4F2;      /* product stage background */
  --ink:       #1B1416;
  --ink-soft:  #6E6265;
  --line:      rgba(27,20,22,.14);
  --line-red:  rgba(255,255,255,.22);

  /* type */
  /* One family across the site, carried by weight rather than by contrast —
     Geist sits in the SF Pro lineage. -apple-system is the native fallback so
     Apple hardware renders the real thing while Geist loads. */
  --f-display: "Geist", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif;
  --f-ui:      "Geist", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif;

  --w-thin:    300;
  --w-regular: 400;
  --w-medium:  500;
  --w-bold:    600;

  --t-display: clamp(2.3rem, 4.6vw, 4.4rem);   /* AN OBJECT OF COLOUR */
  --t-section: clamp(1.9rem, 3.4vw, 3.1rem);   /* section headings */
  --t-sub:     clamp(1.05rem, 1.5vw, 1.3rem);
  --t-body:    .875rem;
  --t-label:   .6875rem;                        /* 11px — 10px was under the label floor */

  --pad: clamp(18px, 3.4vw, 56px);
  --gap: clamp(10px, 1.1vw, 16px);

  --ease: cubic-bezier(0.23, 1, 0.32, 1);

  font-family: var(--f-ui);
  color: var(--ink);
  background: var(--paper);
  font-size: var(--t-body);
  line-height: 1.6;
  font-weight: 400;
}

/* ---------- shared primitives ---------- */
/* theme.css styles bare h1/h2/h3 and <button>, so every colour here is set
   explicitly — inheritance alone loses to those element selectors. */
.ro h1, .ro h2, .ro h3 {
  font-family: var(--f-display);
  font-weight: var(--w-bold);
  text-transform: uppercase;
  letter-spacing: -.005em;     /* sans uppercase needs tightening, not tracking */
  line-height: 1.04;
  margin: 0;
  color: var(--ink);
}
.ro h1 { letter-spacing: -.02em; }
.ro p { margin: 0; }

.ro__label {                       /* KISS · SHADE: KISS · 01 OBJECT OF DESIRE */
  font-size: var(--t-label);
  letter-spacing: .22em;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--ink-soft);
}
.ro__link {                        /* DISCOVER THE STORY */
  display: inline-block;
  font-size: var(--t-label);
  letter-spacing: .2em;
  text-transform: uppercase;
  font-weight: 500;
  padding-bottom: 4px;
  border-bottom: 1px solid currentColor;
  transition: opacity .25s var(--ease);
}
.ro__link:hover { opacity: .6; }

.ro__btn {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 1.05em 2.6em;
  font-size: var(--t-label);
  letter-spacing: .22em;
  text-transform: uppercase;
  font-weight: 500;
  border: 1px solid var(--red);
  background: var(--red);
  color: #fff;
  border-radius: 0;
  transition: background .3s var(--ease), color .3s var(--ease);
}
.ro__btn:hover { background: transparent; color: var(--red); }
.ro__btn--wide { width: 100%; }
.ro__btn--outline-light {
  background: transparent; color: #fff; border-color: rgba(255,255,255,.55);
}
.ro__btn--outline-light:hover { background: #fff; color: var(--red-deep); border-color: #fff; }

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

/* red ground sections */
.ro-red { background: var(--red-deep); color: #fff; }
.ro-red h1, .ro-red h2, .ro-red h3 { color: #fff; }
.ro-red .ro__label { color: rgba(255,255,255,.62); }

/* ============================================================
   1. ANNOUNCE + HEADER
   ============================================================ */
.ro-announce {
  background: var(--red-deep); color: #fff;
  text-align: center;
  padding: .72em 1em;
  font-size: var(--t-label);
  letter-spacing: .22em;
  text-transform: uppercase;
  font-weight: 500;
}

/* ============================================================
   4. HEADER — sparse editorial bar: actions left, name centred,
   utilities right. Everything is micro-type; the wordmark carries
   the weight, exactly like a fashion house masthead.
   ============================================================ */
.ro-header {
  position: sticky; top: 0; z-index: 60;
  display: grid; grid-template-columns: 1fr auto 1fr;
  align-items: center; gap: 1rem;
  padding: clamp(14px, 1.5vw, 22px) var(--pad);
  background: var(--paper);
  border-bottom: 1px solid var(--line);
  transition: transform .45s var(--ease), background .3s var(--ease), border-color .3s var(--ease);
}
.ro-header.is-hidden { transform: translateY(-101%); }

.ro-header__left { display: flex; align-items: center; gap: clamp(1rem, 2.2vw, 2.2rem); }
.ro-header__menu { display: inline-flex; align-items: center; gap: .6rem; }
.ro-header__menu i { display: block; width: 15px; height: 1px; background: currentColor; transition: transform .3s var(--ease); }
.ro-header__menu i + i { margin-inline-start: -15px; margin-top: 5px; }
.ro-header__menu:hover i:first-child { transform: translateX(3px); }
.ro-header__menu span,
.ro-header__nav a,
.ro-header__util a,
.ro-header__util button {
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; font-weight: 500;
  white-space: nowrap;
}
.ro-header__nav { display: flex; gap: clamp(1rem, 2.2vw, 2.2rem); }
.ro-header__nav a, .ro-header__util a, .ro-header__util button {
  position: relative; padding-bottom: 2px;
}
.ro-header__nav a::after, .ro-header__util a::after, .ro-header__util button::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0;
  height: 1px; background: currentColor;
  transform: scaleX(0); transform-origin: left;
  transition: transform .35s var(--ease);
}
.ro-header__nav a:hover::after, .ro-header__util a:hover::after, .ro-header__util button:hover::after { transform: scaleX(1); }

.ro-header__logo {
  font-family: var(--f-display);
  font-size: clamp(1.5rem, 2.3vw, 2.1rem);
  letter-spacing: .2em; text-transform: uppercase;
  padding-left: .2em;                       /* optical centring against the tracking */
  line-height: 1;
}
.ro-header__util { display: flex; align-items: center; justify-content: flex-end; gap: clamp(1rem, 1.8vw, 1.9rem); }
.ro-header__util [data-cart-count] { font-variant-numeric: tabular-nums; }

/* transparent over a full-bleed opening image */
.ro-header--overlay {
  position: fixed; left: 0; right: 0;
  background: transparent; border-bottom-color: transparent; color: #fff;
}
.ro-header--overlay.is-scrolled { background: var(--paper); color: var(--ink); border-bottom-color: var(--line); }

@media (max-width: 1024px) {
  .ro-header__nav { display: none; }
  .ro-header__menu span { display: none; }
}
@media (max-width: 640px) {
  .ro-header__util a { display: none; }
  .ro-header__util button { font-size: .58rem; letter-spacing: .14em; }
  .ro-header__logo { font-size: 1.3rem; letter-spacing: .16em; }
  .ro-header { padding-inline: 16px; gap: .4rem; }
}

/* ============================================================
   FULL MENU — the drawer that replaces a mega-menu
   ============================================================ */
.drawer.drawer--full { width: min(1180px, 100vw); }
.ro-menu { display: grid; grid-template-columns: 1.1fr .9fr; gap: clamp(28px, 5vw, 80px); padding-block: clamp(24px, 4vw, 56px); }
.ro-menu__main { display: grid; align-content: start; gap: .2rem; }
.ro-menu__main a {
  display: block;
  padding: .5rem 0;
  font-family: var(--f-display);
  font-size: clamp(1.7rem, 3.4vw, 2.9rem);
  text-transform: uppercase; letter-spacing: .04em; line-height: 1.15;
  transition: color .25s var(--ease), transform .35s var(--ease);
}
.ro-menu__main a:hover { color: var(--red); transform: translateX(8px); }
.ro-menu__side { display: grid; align-content: start; gap: clamp(20px, 3vw, 34px); }
.ro-menu__side h4 { font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; font-weight: 500; color: var(--ink-soft); margin-bottom: .9rem; }
.ro-menu__side ul { display: grid; gap: .55rem; }
.ro-menu__side a { font-size: .82rem; display: flex; align-items: center; gap: .6rem; transition: color .2s; }
.ro-menu__side a:hover { color: var(--red); }
.ro-menu__side i { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.ro-menu__promo { display: block; }
.ro-menu__promo img { aspect-ratio: 4/3; object-fit: cover; background: var(--paper-2); }
.ro-menu__promo .ro__label { display: block; margin-top: .7rem; }
@media (max-width: 860px) {
  .ro-menu { grid-template-columns: 1fr; }
  .ro-menu__promo { display: none; }
}

/* ============================================================
   14. FOOTER — newsletter, links, legal, then the name
   ============================================================ */
.ro-footer { padding-top: clamp(48px, 6vw, 96px); }
.ro-footer__news {
  text-align: center;
  padding: 0 var(--pad) clamp(44px, 5vw, 76px);
  border-bottom: 1px solid var(--line-red);
}
.ro-footer__news h2 { font-size: clamp(1.8rem, 3.4vw, 3rem); margin: 1.1rem 0 2rem; }
.ro-footer__news form { display: flex; max-width: 480px; margin-inline: auto; border-bottom: 1px solid rgba(255,255,255,.45); }
.ro-footer__news input {
  flex: 1; background: none; border: 0; padding: .85em .2em;
  color: #fff; font-size: .9rem;
}
.ro-footer__news input::placeholder { color: rgba(255,255,255,.5); }
.ro-footer__news input:focus { outline: none; }
.ro-footer__news button {
  padding: 0 .4em; color: #fff;
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; font-weight: 500;
  transition: opacity .2s;
}
.ro-footer__news button:hover { opacity: .6; }
.ro-footer__news .ro-note { color: rgba(255,255,255,.68); margin-top: 1rem; }

.ro-footer__grid {
  display: grid; grid-template-columns: repeat(6, 1fr);
  gap: clamp(20px, 2.6vw, 40px);
  padding: clamp(40px, 4.6vw, 68px) var(--pad);
}
.ro-footer h3, .ro-footer h4 {
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase;
  font-weight: 500; color: rgba(255,255,255,.55); margin-bottom: 1.2rem;
}
.ro-footer ul { display: grid; gap: .7rem; }
.ro-footer li a { font-size: .8rem; color: rgba(255,255,255,.86); transition: color .2s; }
.ro-footer li a:hover { color: #fff; text-decoration: underline; text-underline-offset: 4px; }

.ro-footer__legal {
  display: flex; flex-wrap: wrap; align-items: center; gap: 1rem clamp(16px, 3vw, 40px);
  justify-content: space-between;
  padding: 1.4rem var(--pad);
  border-top: 1px solid var(--line-red);
  /* .5 alpha measured 3.98:1 on --red-deep, under the 4.5 AA floor; .68 is 6.1:1 */
  font-size: .72rem; color: rgba(255,255,255,.68);
}
.ro-footer__legal ul { display: flex; gap: clamp(14px, 2vw, 28px); }
.ro-footer__legal a:hover { color: #fff; }
.ro-footer__cur { letter-spacing: .16em; text-transform: uppercase; font-size: var(--t-label); }

/* the site ends on the name — clipped at the baseline so it reads as a mark,
   not a heading. Scaled by viewport so it always spans the full width. */
.ro-footer__wordmark {
  font-family: var(--f-display);
  font-size: clamp(5rem, 25vw, 22rem);
  line-height: .78;
  letter-spacing: .02em;
  text-transform: lowercase;
  text-align: center;
  color: #fff;
  opacity: .13;
  padding-inline: var(--pad);
  margin-bottom: -.14em;
  overflow: hidden;
  user-select: none;
}

/* the footer is the one place a phone should feel dense, not airy: two tight
   columns of links, then the newsletter across the full width */
@media (max-width: 1024px) { .ro-footer__grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 700px) {
  .ro-footer { padding-top: clamp(34px, 9vw, 52px); }
  .ro-footer__grid {
    grid-template-columns: 1fr 1fr;
    gap: 26px 18px;
    padding-block: clamp(28px, 7vw, 40px);
  }
  .ro-footer h3, .ro-footer h4 { margin-bottom: .7rem; }
  .ro-footer ul { gap: .5rem; }
  .ro-footer li a { font-size: .82rem; }
  .ro-footer__news { grid-column: 1 / -1; margin-top: .6rem; }
  .ro-footer__legal { flex-direction: column; align-items: flex-start; gap: .7rem; padding-block: 1.1rem; }
  .ro-footer__legal ul { gap: 1.1rem; }
}

/* ============================================================
   2. HERO — model · product stage · buy card
   ============================================================ */
.ro-hero {
  display: grid;
  grid-template-columns: 1.32fr 1fr .74fr;
  gap: var(--gap);
  padding: var(--gap);
  align-items: stretch;
}
.ro-hero__media { position: relative; overflow: hidden; min-height: min(84vh, 800px); background: var(--red-deep); }
/* the frame is wider than the full-body source, so cover crops vertically —
   anchor high to keep the face in, and let the crop fall below the knees. */
.ro-hero__media .ro__img { position: absolute; inset: 0; object-position: 50% 12%; }
.ro-hero__copy {
  position: absolute; left: 0; bottom: 0; z-index: 2;
  padding: clamp(20px, 2.6vw, 42px);
  color: #fff;
}
.ro-hero__copy h1 { font-size: var(--t-display); letter-spacing: -.025em; max-width: none; color: #fff; }
.ro-hero__copy .ro__label { color: rgba(255,255,255,.78); margin-top: 1rem; }
.ro-hero__scrim {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(to top, rgba(40,4,10,.55), rgba(40,4,10,0) 62%);
}

/* the product renders ship on a near-white ground, so the stage matches it —
   a tinted container would frame the image with a visible white box. */
.ro-hero__stage { position: relative; overflow: hidden; background: #FDFCFC; }
.ro-hero__stage .ro__img { position: absolute; inset: 0; object-fit: contain; padding: 4%; }

/* buy card */
.ro-buy {
  border: 1px solid var(--line);
  padding: clamp(16px, 1.5vw, 26px);
  display: flex; flex-direction: column;
  background: var(--paper);
}
.ro-buy__top { display: flex; align-items: flex-start; justify-content: space-between; }
.ro-buy__mark { font-family: var(--f-display); font-size: .95rem; letter-spacing: .16em; text-transform: uppercase; }
.ro-buy__save {
  color: var(--ink-soft); transition: color .2s;
  /* 15px icon, 44px hit area — padding out, margin back, so layout is unchanged */
  padding: 15px; margin: -15px -15px -15px 0;
}
.ro-buy__save:hover { color: var(--red); }
.ro-buy__save svg { width: 15px; height: 15px; display: block; }
.ro-buy__media { aspect-ratio: 3/4; background: #FDFCFC; margin: .9rem 0 1.3rem; }
.ro-buy__media .ro__img { object-fit: contain; padding: 6%; }
.ro-buy__name { font-family: var(--f-display); font-size: 1.9rem; text-transform: uppercase; letter-spacing: .05em; margin-top: .35rem; }
.ro-buy__price { font-size: .8rem; letter-spacing: .13em; color: var(--ink-soft); margin-top: .3rem; }
.ro-buy__shade { margin-top: 1.5rem; }
.ro-buy__dots { display: flex; gap: .55rem; margin-top: .7rem; }
.ro-buy__dot {
  width: 26px; height: 26px; border-radius: 50%;
  position: relative; transition: transform .2s var(--ease);
}
.ro-buy__dot:hover { transform: scale(1.1); }
.ro-buy__dot.is-active::after {
  content: ""; position: absolute; inset: -5px;
  border: 1px solid var(--ink); border-radius: 50%;
}
.ro-buy__qty {
  display: flex; align-items: center; justify-content: space-between;
  border: 1px solid var(--line);
  padding: .55rem 1rem;
  margin: 1.5rem 0 .7rem;
}
.ro-buy__qty button { width: 24px; font-size: 1rem; line-height: 1; color: var(--ink-soft); transition: color .2s; }
.ro-buy__qty button:hover { color: var(--ink); }
.ro-buy__qty span { font-size: .8rem; }
.ro-buy__ship {
  display: flex; gap: .6rem; align-items: flex-start;
  margin-top: 1.3rem; padding-top: 1.1rem; border-top: 1px solid var(--line);
  font-size: .72rem; line-height: 1.5; color: var(--ink-soft);
}
.ro-buy__ship svg { width: 13px; height: 13px; flex: none; margin-top: 3px; }
.ro-buy__ship b { display: block; font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; color: var(--ink); font-weight: 500; margin-bottom: .3em; }

/* ============================================================
   3. THREE VALUE PROPS
   ============================================================ */
.ro-props {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: clamp(24px, 4vw, 72px);
  padding: clamp(38px, 5vw, 70px) var(--pad);
  border-bottom: 1px solid var(--line);
}
.ro-prop { display: grid; grid-template-columns: auto 1fr; gap: clamp(14px, 1.6vw, 26px); align-items: start; }
.ro-prop__num {
  font-family: var(--f-display);
  font-size: clamp(2.2rem, 3.4vw, 3.3rem);
  line-height: .8;
  color: var(--ink);
}
.ro-prop h3 { font-size: .75rem; letter-spacing: .2em; margin-bottom: .75rem; }
.ro-prop p { color: var(--ink-soft); font-size: .8rem; line-height: 1.75; }

/* ============================================================
   4. FIND YOUR RED
   ============================================================ */
.ro-shades { padding: clamp(48px, 6vw, 86px) var(--pad) clamp(44px, 5vw, 70px); text-align: center; }
.ro-shades h2 { font-size: var(--t-section); }
.ro-shades__sub { margin-top: .9rem; }
.ro-shades__row {
  display: grid; grid-template-columns: repeat(5, 1fr);
  gap: var(--gap);
  margin: clamp(30px, 3.6vw, 52px) 0;
}
.ro-shade { display: block; color: inherit; }
.ro-shade__media { position: relative; aspect-ratio: 3/4; overflow: hidden; background: rgba(0,0,0,.14); }
.ro-shade__media .ro__img { position: absolute; inset: 0; transition: transform .9s var(--ease); }
.ro-shade:hover .ro-shade__media .ro__img { transform: scale(1.04); }

/* the product in that shade, cut out and floated over the model */
/* small enough to sit beside the lips, not over them */
.ro-shade__tube {
  position: absolute; z-index: 2;
  right: 7%; bottom: 5%;
  width: 24%; height: auto;
  filter: drop-shadow(0 14px 22px rgba(0,0,0,.45));
  transition: transform .55s var(--ease);
  pointer-events: none;
}
.ro-shade:hover .ro-shade__tube { transform: translateY(-7%); }
.ro-shade__name {
  display: flex; align-items: center; justify-content: center; gap: .5em;
  margin-top: .95rem;
  font-size: var(--t-label); letter-spacing: .22em; text-transform: uppercase; font-weight: 500;
}
.ro-shade__dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }

/* ============================================================
   5. THE OBJECT OF DESIRE
   ============================================================ */
/* copy sits on top of the image, anchored left */
.ro-desire { position: relative; overflow: hidden; min-height: min(88vh, 820px); display: flex; align-items: center; }
.ro-desire__media { position: absolute; inset: 0; }
.ro-desire__media .ro__img { position: absolute; inset: 0; object-position: 62% 50%; }
.ro-desire__scrim {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(to right, rgba(52,6,14,.78) 0%, rgba(52,6,14,.42) 42%, rgba(52,6,14,0) 72%);
}
.ro-desire__body {
  position: relative; z-index: 2;
  padding: clamp(36px, 5vw, 92px) clamp(28px, 5vw, 96px);
  max-width: 34em;
}
.ro-desire__body h2 { font-size: var(--t-section); }
.ro-desire__body p { margin: 1.5rem 0 2.1rem; color: rgba(255,255,255,.86); line-height: 1.85; max-width: 20em; }

/* ============================================================
   6. DESIGNED IN DETAIL
   ============================================================ */
/* full-width band: heading row on top, bento board underneath */
.ro-detail { padding: clamp(52px, 6vw, 96px) var(--pad); }
.ro-detail__head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: clamp(20px, 3vw, 48px);
  margin-bottom: clamp(26px, 3.2vw, 48px);
}
.ro-detail__head h2 { font-size: var(--t-section); }
.ro-detail__head p { margin-top: 1rem; color: var(--ink-soft); line-height: 1.8; max-width: 32em; }
.ro-detail__head .ro__link { flex: none; margin-bottom: .4rem; }
/* bento: an editorial board, not a table. Twelve columns let each tile take a
   different width, a different height, and its own vertical offset, so the eye
   travels instead of scanning rows. Captions sit on the image. */
.ro-detail__grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  column-gap: clamp(10px, 1.2vw, 22px);
  row-gap: clamp(16px, 2.2vw, 38px);
  align-items: start;
}
.ro-card { position: relative; }
.ro-card__media { position: relative; overflow: hidden; background: var(--paper-2); }
.ro-card__media .ro__img {
  width: 100%; height: 100%; object-fit: cover;
  transition: transform 1.1s var(--ease);
}
.ro-card:hover .ro__img { transform: scale(1.04); }

/* placement — deliberately uneven. The portrait takes half the board so the
   face reads at a glance; the pocket frame runs wide underneath it. */
.ro-card:nth-child(1) { grid-column: 1 / 7;  grid-row: 1 / 3; }
.ro-card:nth-child(1) .ro-card__media { aspect-ratio: 3/4; }

.ro-card:nth-child(2) { grid-column: 7 / 10; grid-row: 1; }
.ro-card:nth-child(2) .ro-card__media { aspect-ratio: 3/4; }

.ro-card:nth-child(3) { grid-column: 10 / 13; grid-row: 1; margin-top: clamp(26px, 4vw, 74px); }
.ro-card:nth-child(3) .ro-card__media { aspect-ratio: 1/1; }

.ro-card:nth-child(4) { grid-column: 7 / 13; grid-row: 2; margin-top: clamp(0px, .6vw, 12px); }
.ro-card:nth-child(4) .ro-card__media { aspect-ratio: 5/4; }
.ro-card:nth-child(4) .ro__img { object-position: 50% 42%; }

.ro-card h3 { font-size: var(--t-label); letter-spacing: .2em; margin: .95rem 0 .35rem; }
.ro-card p { font-size: .74rem; color: var(--ink-soft); }

/* ============================================================
   7. THE FORMULA
   ============================================================ */
.ro-formula {
  display: grid; grid-template-columns: 1fr 1.05fr 1.2fr;
  gap: clamp(20px, 2.6vw, 46px);
  padding: clamp(34px, 4vw, 62px) var(--pad) clamp(52px, 6vw, 90px);
  align-items: center;
}
.ro-formula__still { aspect-ratio: 4/5; overflow: hidden; background: var(--paper-2); }
.ro-formula__body { padding-block: clamp(10px, 2vw, 30px); }
.ro-formula__body h2 { font-size: var(--t-section); }
.ro-formula__body p { margin: 1.4rem 0 1.9rem; color: var(--ink-soft); line-height: 1.9; max-width: 20em; }
.ro-formula__cards { display: grid; gap: clamp(20px, 2.4vw, 34px); }
.ro-fcard { display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: clamp(14px, 1.6vw, 24px); }
.ro-fcard:nth-child(even) { direction: rtl; }
.ro-fcard:nth-child(even) > * { direction: ltr; }
.ro-fcard__media { aspect-ratio: 4/3; overflow: hidden; background: var(--paper-2); }
.ro-fcard h3 {
  font-size: clamp(1.15rem, 1.5vw, 1.55rem);
  letter-spacing: .07em;
  margin-bottom: .75rem;
}
.ro-fcard p { font-size: clamp(.9rem, 1.05vw, 1.05rem); color: var(--ink-soft); line-height: 1.65; }

/* ============================================================
   8. MADE TO BE WORN
   ============================================================ */
.ro-worn {
  display: grid; grid-template-columns: .78fr 2.2fr;
  gap: clamp(24px, 3.4vw, 56px);
  padding: clamp(42px, 5vw, 78px) var(--pad);
  align-items: center;
}
.ro-worn__title h2 { font-size: var(--t-section); }
.ro-worn__row { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 1.8vw, 26px); }
.ro-quote__media { aspect-ratio: 3/4; overflow: hidden; background: rgba(0,0,0,.16); }
.ro-quote blockquote {
  margin: 1rem 0 0;
  font-family: var(--f-display);
  font-style: italic;
  text-transform: none;
  letter-spacing: 0;
  font-size: .92rem;
  line-height: 1.6;
  color: rgba(255,255,255,.9);
}

/* ============================================================
   9. FAQ
   ============================================================ */
.ro-faq {
  display: grid; grid-template-columns: .58fr 2.4fr;
  gap: clamp(24px, 3.4vw, 60px);
  padding: clamp(46px, 5.5vw, 84px) var(--pad);
  align-items: start;
}
.ro-faq h2 { font-size: var(--t-section); }
.ro-faq__cols { display: grid; grid-template-columns: 1fr 1fr; gap: 0 clamp(28px, 4vw, 64px); }
.ro-faq__item { border-top: 1px solid var(--line); }
.ro-faq__item:last-child, .ro-faq__item:nth-last-child(2) { border-bottom: 1px solid var(--line); }
.ro-faq__q {
  width: 100%;
  display: flex; align-items: center; justify-content: space-between; gap: 1.5rem;
  padding: 1.15rem 0;
  text-align: left;
  font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; font-weight: 500;
}
.ro-faq__q i { font-style: normal; font-size: 1rem; color: var(--ink-soft); transition: transform .3s var(--ease); }
.ro-faq__item.is-open .ro-faq__q i { transform: rotate(45deg); }
.ro-faq__a { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .4s var(--ease); }
.ro-faq__item.is-open .ro-faq__a { grid-template-rows: 1fr; }
.ro-faq__a > div { overflow: hidden; }
.ro-faq__a p { padding-bottom: 1.2rem; color: var(--ink-soft); font-size: .8rem; line-height: 1.75; max-width: 36em; }

/* ============================================================
   11. MOTION — reveal on scroll (driven by theme.js)
   ============================================================ */
.ro .reveal { opacity: 0; transform: translateY(24px); transition: opacity .8s var(--ease), transform .8s var(--ease); transition-delay: var(--reveal-delay, 0s); }
.js .ro .reveal.is-in { opacity: 1; transform: none; }

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

/* ============================================================
   12. RESPONSIVE
   ============================================================ */
@media (max-width: 1180px) {
  .ro-hero { grid-template-columns: 1fr 1fr; }
  .ro-hero__stage { display: none; }
  .ro-formula { grid-template-columns: 1fr 1fr; }
  .ro-formula__still { grid-row: span 2; }
  .ro-worn { grid-template-columns: 1fr; }
  .ro-faq { grid-template-columns: 1fr; }
}

@media (max-width: 860px) {
  .ro-header { grid-template-columns: auto 1fr auto; padding-block: .9rem; gap: .6rem; }
  .ro-header__left { justify-self: start; }
  .ro-header__logo { justify-self: center; }
  .ro-header__util { justify-self: end; gap: .9rem; }
  .ro-header__nav { display: none; }
  .ro-header__util { gap: 1rem; }

  /* hero: image first, then the buy card as its own full-width block */
  .ro-hero { grid-template-columns: 1fr; gap: 0; padding: 0; }
  .ro-hero { padding: 0; }
  /* the picture takes the whole phone screen and fills it — no letterboxing.
     The crop is anchored on the face and the object it is holding. */
  .ro-hero__media { min-height: calc(100svh - 96px); aspect-ratio: auto; }
  .ro .ro-hero__media .ro__img,
  .ro .ro-hero__media--light .ro__img { object-fit: cover; object-position: 50% 40%; }
  .ro-hero__copy { padding: var(--pad); }
  /* no wash behind the headline — the frame is already light there */
  .ro-hero__media--light .ro-hero__scrim { background: none; }
  .ro-hero__copy { padding: clamp(18px, 5vw, 28px); }
  .ro-buy { border: 0; border-bottom: 1px solid var(--line); padding: clamp(20px, 5vw, 28px); }
  .ro-buy__media { aspect-ratio: 1; margin-inline: auto; max-width: 62%; }
  .ro-buy__dot { width: 30px; height: 30px; }          /* comfortable tap target */
  .ro-buy__qty { padding: .7rem 1rem; }
  .ro-buy__qty button { width: 40px; height: 32px; font-size: 1.2rem; }
  .ro__btn { padding: 1.15em 2.2em; }                   /* min 44px tall */

  /* the three props stay side by side on a phone: a snap strip beats three
     stacked blocks that push the shades section below the fold */
  .ro-props {
    display: flex; grid-template-columns: none;
    gap: 0;
    overflow-x: auto; scroll-snap-type: x mandatory;
    padding: clamp(26px, 7vw, 40px) 0;
    scrollbar-width: none;
  }
  .ro-props::-webkit-scrollbar { display: none; }
  .ro-prop {
    flex: 0 0 78%;
    scroll-snap-align: center;
    padding-inline: var(--pad);
    border-right: 1px solid var(--line);
  }
  .ro-prop:last-child { border-right: 0; }
  .ro-prop p { font-size: .82rem; }

  /* shades scroll horizontally instead of wrapping into a cramped 2-up */
  .ro-shades { overflow-x: hidden; }
  .ro-shades__row {
    display: flex; grid-template-columns: none;
    overflow-x: auto; scroll-snap-type: x mandatory;
    margin-inline: calc(var(--pad) * -1);
    padding-inline: var(--pad);
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .ro-shades__row::-webkit-scrollbar { display: none; }
  .ro-shade { flex: 0 0 62%; scroll-snap-align: center; }
  .ro-desire { min-height: 70vh; }
  .ro-desire__scrim { background: linear-gradient(to top, rgba(52,6,14,.85) 12%, rgba(52,6,14,.25) 70%); }
  .ro-desire__body { align-self: flex-end; padding-bottom: clamp(30px, 6vw, 60px); }

  /* bento → two columns; the tall tile keeps its emphasis by going full width */
  .ro-detail { padding-block: clamp(38px, 9vw, 56px); }
  .ro-detail__head { flex-direction: column; align-items: flex-start; gap: 1.2rem; }
  
  .ro-formula { grid-template-columns: 1fr; gap: 26px; padding-block: clamp(34px, 8vw, 48px); }
  .ro-formula__still { grid-row: auto; max-width: 68%; margin-inline: auto; }
  .ro-fcard { grid-template-columns: 1fr 1fr; }
  .ro-fcard:nth-child(even) { direction: ltr; }

  /* testimonials scroll like the shades row */
  .ro-worn { padding-block: clamp(34px, 8vw, 52px); overflow-x: hidden; }
  .ro-worn__row {
    display: flex; grid-template-columns: none;
    overflow-x: auto; scroll-snap-type: x mandatory;
    margin-inline: calc(var(--pad) * -1);
    padding-inline: var(--pad);
    scrollbar-width: none;
  }
  .ro-worn__row::-webkit-scrollbar { display: none; }
  .ro-quote { flex: 0 0 74%; scroll-snap-align: center; }

  .ro-faq { padding-block: clamp(34px, 8vw, 52px); }
  .ro-faq__cols { grid-template-columns: 1fr; }
  .ro-faq__item:nth-last-child(2) { border-bottom: 0; }
  .ro-faq__q { padding-block: 1.25rem; }               /* larger tap target */
}

@media (max-width: 560px) {
  .ro-shade { flex-basis: 74%; }
  .ro-fcard { grid-template-columns: 1fr; }
  .ro-fcard__media { order: -1; }
  .ro-footer__legal { flex-direction: column; gap: .8rem; }
}

/* ============================================================
   5. CHROME — smart header states, overlay, drawers
   theme.js toggles .is-scrolled / .is-hidden on .header and
   .is-open on .drawer / .overlay. Styling lives here only.
   ============================================================ */
.ro-header { transition: transform .4s var(--ease), box-shadow .3s var(--ease); }
.ro-header.is-scrolled { box-shadow: 0 1px 0 var(--line), 0 8px 24px rgba(27,20,22,.05); }
.ro-header.is-hidden { transform: translateY(-100%); }

.overlay {
  position: fixed; inset: 0; z-index: 90;
  background: rgba(27,10,14,.44);
  opacity: 0; visibility: hidden;
  transition: opacity .35s var(--ease), visibility .35s;
}
.overlay.is-open { opacity: 1; visibility: visible; }

.drawer {
  position: fixed; top: 0; bottom: 0; z-index: 100;
  width: min(430px, 92vw);
  background: var(--paper);
  display: flex; flex-direction: column;
  transition: transform .5s var(--ease);
}
.drawer--right { right: 0; transform: translateX(100%); }
.drawer--left  { left: 0;  transform: translateX(-100%); }
.drawer.is-open { transform: none; }
.drawer__head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 1.5rem var(--dpad, 1.5rem);
  border-bottom: 1px solid var(--line);
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; font-weight: 500;
}
.drawer__head button { color: var(--ink-soft); transition: color .2s; }
.drawer__head button:hover { color: var(--ink); }
.drawer__body { flex: 1; overflow-y: auto; padding: 1.5rem var(--dpad, 1.5rem); }
.drawer__foot { padding: 1.3rem var(--dpad, 1.5rem); border-top: 1px solid var(--line); }

.mobnav { display: grid; gap: .2rem; }
.mobnav a {
  display: block; padding: .85rem 0;
  border-bottom: 1px solid var(--line);
  font-family: var(--f-display); font-size: 1.35rem;
  text-transform: uppercase; letter-spacing: .05em;
}
.mobnav a:last-child { border-bottom: 0; }

.freeship { margin-bottom: 1.6rem; }
.freeship p { font-size: .74rem; color: var(--ink-soft); margin-bottom: .5rem; }
.freeship__bar { height: 2px; background: var(--line); overflow: hidden; }
.freeship__bar i { display: block; height: 100%; width: 74%; background: var(--red); }

.cartline { display: flex; gap: 1rem; padding: 1.1rem 0; border-bottom: 1px solid var(--line); }
.cartline img { width: 78px; flex: none; aspect-ratio: 3/4; object-fit: contain; background: var(--paper-2); }
.cartline__info { flex: 1; }
.cartline__info h4 { font-family: var(--f-display); font-size: 1.05rem; text-transform: uppercase; letter-spacing: .05em; }
.cartline__info p { font-size: .72rem; color: var(--ink-soft); margin-top: .2rem; }
.cartline b { font-size: .8rem; }
.qty { display: inline-flex; align-items: center; gap: .9rem; border: 1px solid var(--line); padding: .3rem .7rem; margin-top: .6rem; font-size: .78rem; }
.qty button { width: 18px; color: var(--ink-soft); }
.cart-upsell { display: flex; gap: .9rem; align-items: center; background: var(--paper-2); padding: .9rem; margin-top: 1.2rem; }
.cart-upsell img { width: 54px; flex: none; }
.cart-subtotal { display: flex; justify-content: space-between; margin-bottom: 1rem; font-size: .82rem; }
.cart-subtotal span:last-child { font-weight: 500; }

.search-bar { display: flex; gap: 1rem; border-bottom: 1px solid var(--ink); padding-bottom: .7rem; }
.search-bar input { flex: 1; border: 0; background: none; font-size: 1.1rem; }
.search-bar input:focus { outline: none; }

/* sticky add-to-bag (PDP) */
.sticky-atc {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 70;
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: .8rem var(--pad);
  background: var(--paper); border-top: 1px solid var(--line);
  transform: translateY(105%); transition: transform .45s var(--ease);
}
.sticky-atc.is-in { transform: none; }
.sticky-atc strong { font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; font-weight: 500; }

/* ============================================================
   15. PAGE TEMPLATES
   Shared vocabulary for every page that is not the home page.
   ============================================================ */

/* --- page head: the band under the header that names the page --- */
.ro-pagehead {
  padding: clamp(46px, 6vw, 92px) var(--pad) clamp(30px, 3.6vw, 52px);
  border-bottom: 1px solid var(--line);
}
.ro-pagehead h1 { font-size: clamp(2.2rem, 4.6vw, 4rem); }
.ro-pagehead p { margin-top: 1.1rem; color: var(--ink-soft); max-width: 40em; line-height: 1.8; }
.ro-pagehead .ro__label { display: block; margin-bottom: 1.1rem; }
.ro-pagehead--center { text-align: center; }
.ro-pagehead--center p { margin-inline: auto; }

/* image-backed page head */
.ro-pagehero {
  position: relative; overflow: hidden;
  min-height: min(58vh, 540px);
  display: flex; align-items: flex-end;
}
.ro-pagehero .ro__img { position: absolute; inset: 0; }
.ro-pagehero__scrim {
  position: absolute; inset: 0;
  background: linear-gradient(to top, rgba(40,4,10,.72), rgba(40,4,10,.05) 70%);
}
.ro-pagehero__copy { position: relative; z-index: 2; padding: clamp(26px, 4vw, 60px) var(--pad); color: #fff; }
.ro-pagehero__copy h1 { color: #fff; font-size: clamp(2.2rem, 5vw, 4.2rem); }
.ro-pagehero__copy .ro__label { color: rgba(255,255,255,.76); display: block; margin-bottom: .9rem; }

/* --- generic section --- */
.ro-section { padding: clamp(46px, 5.5vw, 88px) var(--pad); }
.ro-section--tight { padding-block: clamp(32px, 4vw, 58px); }
.ro-section__head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: clamp(20px, 3vw, 48px);
  margin-bottom: clamp(24px, 3vw, 44px);
}
.ro-section__head h2 { font-size: var(--t-section); }
.ro-section__head p { margin-top: .9rem; color: var(--ink-soft); max-width: 34em; line-height: 1.8; }
.ro-section--center { text-align: center; }
.ro-section--center .ro-section__head { flex-direction: column; align-items: center; }

/* a single wide line of type, used as a chapter break */
.ro-statement {
  padding: clamp(44px, 6vw, 96px) var(--pad);
  text-align: center;
}
.ro-statement p {
  font-family: var(--f-display);
  font-size: clamp(1.5rem, 3.2vw, 2.7rem);
  line-height: 1.28;
  letter-spacing: .02em;
  text-transform: uppercase;
  max-width: 20em; margin-inline: auto;
}
.ro-statement em { font-style: italic; text-transform: none; letter-spacing: 0; }

/* --- editorial split: image one side, copy the other --- */
.ro-split {
  display: grid; grid-template-columns: 1fr 1fr;
  align-items: center;
  gap: clamp(24px, 4vw, 76px);
  padding: clamp(32px, 4vw, 64px) var(--pad);
}
.ro-split--reverse .ro-split__media { order: 2; }
.ro-split__media { aspect-ratio: 4/5; overflow: hidden; background: var(--paper-2); }
.ro-split__body { max-width: 32em; }
.ro-split__body h2 { font-size: var(--t-section); }
.ro-split__body p { margin: 1.3rem 0 1.8rem; color: var(--ink-soft); line-height: 1.85; }
.ro-split--tint { background: var(--paper-2); }

/* --- product grid --- */
.ro-grid { display: grid; gap: clamp(16px, 2vw, 32px); }
.ro-grid--2 { grid-template-columns: repeat(2, 1fr); }
.ro-grid--3 { grid-template-columns: repeat(3, 1fr); }
.ro-grid--4 { grid-template-columns: repeat(4, 1fr); }
.ro-grid--5 { grid-template-columns: repeat(5, 1fr); }

.ro-pcard { display: block; }
.ro-pcard__media { position: relative; aspect-ratio: 3/4; overflow: hidden; background: var(--paper-2); }
.ro-pcard__media .ro__img { position: absolute; inset: 0; transition: opacity .5s var(--ease), transform .9s var(--ease); }
.ro-pcard__media .ro__img--hover { opacity: 0; }
.ro-pcard:hover .ro-pcard__media .ro__img--hover { opacity: 1; }
.ro-pcard:hover .ro-pcard__media .ro__img { transform: scale(1.03); }
.ro-pcard__tube {
  position: absolute; right: 7%; bottom: 5%; z-index: 2;
  width: 24%; filter: drop-shadow(0 14px 22px rgba(0,0,0,.42));
  transition: transform .55s var(--ease);
}
.ro-pcard:hover .ro-pcard__tube { transform: translateY(-7%); }
.ro-pcard__body { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; padding-top: .95rem; }
.ro-pcard__name { font-family: var(--f-display); font-size: 1.25rem; text-transform: uppercase; letter-spacing: .05em; }
.ro-pcard__desc { font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; color: var(--ink-soft); margin-top: .3rem; }
.ro-pcard__price { font-size: .8rem; color: var(--ink-soft); white-space: nowrap; }
.ro-pcard__quick { margin-top: .8rem; opacity: 0; transform: translateY(6px); transition: opacity .3s var(--ease), transform .3s var(--ease); }
.ro-pcard:hover .ro-pcard__quick { opacity: 1; transform: none; }
@media (hover: none) { .ro-pcard__quick { opacity: 1; transform: none; } }

/* --- PDP --- */
.ro-pdp { display: grid; grid-template-columns: 1.35fr .85fr; gap: clamp(20px, 2.4vw, 42px); padding: var(--gap); align-items: start; }
.ro-pdp__gallery { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap); }
.ro-pdp__frame { position: relative; overflow: hidden; background: #FDFCFC; aspect-ratio: 4/5; }
.ro-pdp__frame .ro__img { position: absolute; inset: 0; object-fit: contain; padding: 5%; }
.ro-pdp__frame--wide { grid-column: span 2; aspect-ratio: 16/10; }
.ro-pdp__frame--model .ro__img { object-fit: cover; padding: 0; }

.ro-spec { border-top: 1px solid var(--line); }
.ro-spec__row { display: grid; grid-template-columns: .5fr 1fr; gap: 1.5rem; padding: 1.1rem 0; border-bottom: 1px solid var(--line); }
.ro-spec__row dt { font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; font-weight: 500; color: var(--ink-soft); }
.ro-spec__row dd { margin: 0; font-size: .85rem; line-height: 1.7; }

/* numbered benefit list */
.ro-benefits { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(18px, 2.4vw, 40px); }
.ro-benefit { border-top: 1px solid var(--line); padding-top: 1.1rem; }
.ro-benefit span { font-family: var(--f-display); font-size: 1.5rem; color: var(--red); display: block; margin-bottom: .7rem; }
.ro-benefit h3 { font-size: var(--t-label); letter-spacing: .2em; margin-bottom: .5rem; }
.ro-benefit p { font-size: .78rem; color: var(--ink-soft); line-height: 1.7; }
.ro-red .ro-benefit { border-color: var(--line-red); }
.ro-red .ro-benefit span { color: #fff; }
.ro-red .ro-benefit p { color: rgba(255,255,255,.72); }

/* --- editorial / journal --- */
.ro-article { max-width: 42em; margin-inline: auto; padding: clamp(40px, 5vw, 76px) var(--pad); }
.ro-article p { margin-bottom: 1.5rem; font-size: 1rem; line-height: 1.9; color: var(--ink); }
.ro-article h2 { font-size: clamp(1.5rem, 2.4vw, 2.1rem); margin: 2.6rem 0 1.1rem; }
.ro-article blockquote {
  font-family: var(--f-display); font-style: italic;
  font-size: clamp(1.3rem, 2.2vw, 1.9rem); line-height: 1.45;
  margin: 2.4rem 0; padding-left: 1.4rem; border-left: 2px solid var(--red);
}
.ro-article figure { margin: 2.4rem 0; }
.ro-article figcaption { margin-top: .7rem; font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; color: var(--ink-soft); }

.ro-post__media { aspect-ratio: 4/3; overflow: hidden; background: var(--paper-2); }
.ro-post h3 { font-size: 1.15rem; margin: 1rem 0 .5rem; }
.ro-post p { font-size: .82rem; color: var(--ink-soft); line-height: 1.7; }
.ro-post .ro__label { display: block; margin-bottom: .6rem; }

/* --- forms --- */
.ro-form { display: grid; gap: 1.2rem; max-width: 30em; }
.ro-form--wide { max-width: none; }
.ro-field label {
  display: block; margin-bottom: .5rem;
  font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; font-weight: 500; color: var(--ink-soft);
}
.ro-field input, .ro-field textarea, .ro-field select {
  width: 100%; padding: .95em 1.05em;
  border: 1px solid var(--line); background: var(--paper);
  font-size: .875rem;
  transition: border-color .25s var(--ease);
}
.ro-field input:focus, .ro-field textarea:focus, .ro-field select:focus { outline: none; border-color: var(--red); }
.ro-field textarea { min-height: 150px; resize: vertical; }
.ro-form__row { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; }
.ro-note { font-size: .74rem; color: var(--ink-soft); line-height: 1.7; }

/* --- reviews --- */
.ro-stars { color: var(--red); letter-spacing: .14em; font-size: .8rem; }
.ro-red .ro-stars { color: #fff; }
.ro-review { border-top: 1px solid var(--line); padding: 1.6rem 0; display: grid; grid-template-columns: .4fr 1fr; gap: clamp(16px, 2.4vw, 40px); }
.ro-review__meta .ro__label { display: block; margin-top: .5rem; }
.ro-review blockquote { font-size: .95rem; line-height: 1.75; }
.ro-review__title { font-family: var(--f-display); font-size: 1.15rem; text-transform: uppercase; letter-spacing: .05em; margin-bottom: .6rem; }

/* --- stat row --- */
.ro-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(18px, 2.4vw, 40px); text-align: center; }
.ro-stat b { display: block; font-family: var(--f-display); font-size: clamp(2rem, 3.6vw, 3.2rem); font-weight: 400; }
.ro-stat span { font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; color: var(--ink-soft); }
.ro-red .ro-stat span { color: rgba(255,255,255,.66); }

/* --- shade finder quiz --- */
.ro-quiz { max-width: 46em; margin-inline: auto; text-align: center; }
.ro-quiz__progress { display: flex; gap: .5rem; justify-content: center; margin-bottom: 2.4rem; }
.ro-quiz__progress span { width: 46px; height: 2px; background: var(--line); }
.ro-quiz__progress span.is-active { background: var(--red); }
.ro-quiz__step { display: none; }
.ro-quiz__step.is-active { display: block; }
.ro-quiz__opts { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(12px, 1.6vw, 22px); margin-top: 2.2rem; }
.ro-quiz__opt {
  border: 1px solid var(--line); padding: 1.6rem 1rem;
  text-align: center; transition: border-color .25s var(--ease), background .25s var(--ease);
}
.ro-quiz__opt:hover { border-color: var(--red); background: var(--paper-2); }
.ro-quiz__opt i { display: block; width: 46px; height: 46px; border-radius: 50%; margin: 0 auto .9rem; }
.ro-quiz__opt b { display: block; font-family: var(--f-display); font-size: 1.05rem; text-transform: uppercase; letter-spacing: .05em; font-weight: 400; }
.ro-quiz__opt span { font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; color: var(--ink-soft); }

/* --- table (legal, shipping, stockists) --- */
.ro-table { width: 100%; border-collapse: collapse; font-size: .85rem; }
.ro-table th, .ro-table td { text-align: left; padding: 1rem 1.2rem 1rem 0; border-bottom: 1px solid var(--line); vertical-align: top; }
.ro-table th { font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; font-weight: 500; color: var(--ink-soft); }

/* --- misc --- */
 }

.ro-crumbs { padding: 1.1rem var(--pad) 0; font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; color: var(--ink-soft); }
.ro-crumbs a:hover { color: var(--ink); }

.ro-empty { text-align: center; padding: clamp(60px, 10vw, 140px) var(--pad); }
.ro-empty h1 { font-size: clamp(3rem, 9vw, 7rem); }
.ro-empty p { margin: 1.4rem auto 2.2rem; color: var(--ink-soft); max-width: 26em; line-height: 1.8; }

.ro-badges { display: flex; flex-wrap: wrap; gap: .6rem; justify-content: center; }
.ro-badge { border: 1px solid var(--line); padding: .7em 1.3em; font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; color: var(--ink-soft); }
.ro-red .ro-badge { border-color: var(--line-red); color: rgba(255,255,255,.8); }

/* --- responsive for page templates --- */
@media (max-width: 1180px) {
  .ro-pdp { grid-template-columns: 1fr; }
  .ro-benefits { grid-template-columns: repeat(2, 1fr); }
  .ro-grid--5 { grid-template-columns: repeat(3, 1fr); }
  .ro-grid--4 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 860px) {
  .ro-split { grid-template-columns: 1fr; gap: 22px; }
  .ro-split--reverse .ro-split__media { order: 0; }
  .ro-section__head { flex-direction: column; align-items: flex-start; }
  .ro-section--center .ro-section__head { align-items: center; }
  .ro-grid--3, .ro-grid--5 { grid-template-columns: repeat(2, 1fr); }
  .ro-pdp__gallery { grid-template-columns: 1fr; }
  .ro-pdp__frame--wide { grid-column: span 1; }
  .ro-stats { grid-template-columns: repeat(2, 1fr); gap: 26px; }
  .ro-quiz__opts { grid-template-columns: 1fr; }
  .ro-review { grid-template-columns: 1fr; gap: .9rem; }
  .ro-form__row { grid-template-columns: 1fr; }
  .ro-spec__row { grid-template-columns: 1fr; gap: .4rem; }
}
@media (max-width: 560px) {
  .ro-grid--2, .ro-grid--3, .ro-grid--4, .ro-grid--5 { grid-template-columns: 1fr; }
  .ro-benefits { grid-template-columns: 1fr; }
}

/* burger only on small screens; util labels only on large */
.ro-header__burger { display: none; }
.u-desktop { display: inline-flex; }
@media (max-width: 860px) {
  .ro-header__burger { display: inline-flex; }
  .u-desktop { display: none; }
}

/* transparent header for pages that open on a full-bleed image */
.ro-header--overlay {
  position: absolute; left: 0; right: 0;
  background: transparent; border-bottom-color: transparent;
  color: #fff;
}
.ro-header--overlay.is-scrolled { position: fixed; background: var(--paper); color: var(--ink); border-bottom-color: var(--line); }
.has-overlay-header .ro-pagehero { margin-top: calc(var(--header-h, 64px) * -1); padding-top: var(--header-h, 64px); }

/* ============================================================
   PDP REFINEMENTS — swatch chips, caption, gallery rhythm
   ============================================================ */
.ro-pdp__frame .ro__img { transition: opacity .3s var(--ease); }
.ro-pdp__caption {
  position: absolute; left: 0; bottom: 0; z-index: 2;
  padding: .8em 1.2em;
  background: rgba(255,255,255,.9);
  backdrop-filter: blur(6px);
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; font-weight: 500;
}

.ro-buy__shadehead { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; margin-bottom: .9rem; }
.ro-buy__shadehead b { font-weight: 500; color: var(--ink); }
.ro-buy__shadenote { margin-top: .9rem; }

.ro-swatches { display: grid; grid-template-columns: repeat(5, 1fr); gap: .5rem; }
.ro-swatch {
  display: grid; justify-items: center; gap: .55rem;
  padding: .7rem .2rem .6rem;
  border: 1px solid transparent;
  transition: border-color .25s var(--ease), background .25s var(--ease);
}
.ro-swatch i {
  width: 30px; height: 30px; border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.08);
  transition: transform .25s var(--ease);
}
.ro-swatch span {
  font-size: var(--t-label); letter-spacing: .12em; text-transform: uppercase;
  color: var(--ink-soft); transition: color .2s;
}
.ro-swatch:hover { background: var(--paper-2); }
.ro-swatch:hover i { transform: scale(1.08); }
.ro-swatch.is-active { border-color: var(--line); background: var(--paper-2); }
.ro-swatch.is-active i { box-shadow: inset 0 0 0 1px rgba(0,0,0,.08), 0 0 0 2px var(--paper), 0 0 0 3px var(--ink); }
.ro-swatch.is-active span { color: var(--ink); }

/* the buy card holds position while the gallery scrolls past it */
@media (min-width: 1181px) {
  .ro-pdp { align-items: start; }
  .ro-pdp > .ro-buy { position: sticky; top: calc(var(--header-h, 70px) + var(--gap)); }
}
@media (max-width: 480px) {
  .ro-swatches { grid-template-columns: repeat(3, 1fr); }
}

/* hero on a white studio frame: the copy inverts to ink and the scrim
   lightens, so the headline stays legible without dimming the image */
.ro-hero__media--light { background: #FDFCFC; }
.ro-hero__media--light .ro__img { object-position: 50% 30%; }
.ro-hero__media--light .ro-hero__scrim {
  background: linear-gradient(to top, rgba(255,255,255,.92) 6%, rgba(255,255,255,0) 46%);
}
.ro-hero__media--light .ro-hero__copy h1 { color: var(--ink); }
.ro-hero__media--light .ro-hero__copy .ro__label { color: var(--ink-soft); }

/* ============================================================
   IMAGE TREATMENT — the Zara move: pictures run to the page
   edge instead of floating as boxes inside a padded column.
   ============================================================ */

/* editorial split: the picture bleeds off the outer edge and stands taller
   than the copy beside it, so the crop reads as a spread, not a thumbnail */
.ro-split { padding-inline: 0; align-items: stretch; gap: 0; }
.ro-split__media { aspect-ratio: auto; min-height: min(78vh, 700px); }
.ro-split__body {
  align-self: center;
  padding: clamp(32px, 5vw, 78px) var(--pad);
  max-width: 38em;
}
.ro-split--tint { background: var(--paper-2); }

/* the picture side alternates, and always touches the viewport edge */
.ro-split .ro-split__media { order: 0; }
.ro-split--reverse .ro-split__media { order: 2; }

/* a section can opt its media out of the page margin entirely */
.ro-bleed { margin-inline: calc(var(--pad) * -1); }

/* full-bleed band: one picture, edge to edge, with the copy laid over it */
.ro-band {
  position: relative; overflow: hidden;
  min-height: min(86vh, 760px);
  display: flex; align-items: flex-end;
}
.ro-band .ro__img { position: absolute; inset: 0; }
.ro-band__scrim { position: absolute; inset: 0; background: linear-gradient(to top, rgba(30,6,12,.62), rgba(30,6,12,0) 62%); }
.ro-band__copy { position: relative; z-index: 2; padding: clamp(28px, 4vw, 64px) var(--pad); color: #fff; max-width: 34em; }
.ro-band__copy h2 { color: #fff; font-size: var(--t-section); }
.ro-band__copy p { margin: 1.2rem 0 1.8rem; color: rgba(255,255,255,.84); line-height: 1.8; }

/* grids of pictures sit tight to each other and to the page edge, the way a
   lookbook contact sheet does — no stranded white margin on either side */
.ro-section--sheet { padding-inline: 0; }
.ro-section--sheet .ro-grid { gap: var(--gap); padding-inline: var(--gap); }

/* every picture eases in rather than snapping on */
.ro-pcard__media .ro__img,
.ro-split__media .ro__img,
.ro-post__media .ro__img { transition: transform 1.1s var(--ease), opacity .6s var(--ease); }
.ro-split__media:hover .ro__img { transform: scale(1.02); }

@media (max-width: 860px) {
  .ro-split { grid-template-columns: 1fr; }
  .ro-split__media { min-height: min(62vh, 480px); }
  .ro-split--reverse .ro-split__media { order: 0; }
  .ro-band { min-height: min(70vh, 560px); }
}

/* ============================================================
   PDP GALLERY — thumbnail rail + single large viewer
   ============================================================ */
.ro-pdp { display: grid; grid-template-columns: 1.42fr .78fr; gap: clamp(20px, 2.6vw, 48px); padding: var(--gap) var(--gap) clamp(40px, 5vw, 80px); align-items: start; }

.ro-gallery { display: grid; grid-template-columns: 88px 1fr; gap: clamp(10px, 1vw, 16px); }
.ro-gallery__rail {
  display: grid; gap: clamp(8px, .8vw, 12px);
  align-content: start;
  max-height: min(78vh, 760px);
  overflow-y: auto;
  scrollbar-width: none;
}
.ro-gallery__rail::-webkit-scrollbar { display: none; }
.ro-thumb {
  position: relative; display: block;
  aspect-ratio: 3/4; overflow: hidden;
  background: var(--paper-2);
  outline: 1px solid transparent; outline-offset: -1px;
  transition: outline-color .25s var(--ease), opacity .25s var(--ease);
  opacity: .62;
}
.ro-thumb img { width: 100%; height: 100%; object-fit: cover; }
.ro-thumb:hover { opacity: 1; }
.ro-thumb.is-active { opacity: 1; outline-color: var(--ink); }

.ro-gallery__stage {
  position: relative; overflow: hidden;
  aspect-ratio: 4/5;
  background: var(--paper-2);
}
.ro-gallery__stage .ro__img { position: absolute; inset: 0; transition: opacity .35s var(--ease); }
.ro-gallery__cap {
  position: absolute; left: 0; bottom: 0; z-index: 2;
  padding: .85em 1.3em;
  background: rgba(255,255,255,.9);
  backdrop-filter: blur(6px);
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; font-weight: 500;
}

@media (max-width: 1180px) {
  .ro-pdp { grid-template-columns: 1fr; }
  .ro-gallery { grid-template-columns: 1fr; }
  .ro-gallery__stage { aspect-ratio: 3/4; }
  /* the rail turns into a swipeable strip under the viewer */
  .ro-gallery__rail {
    grid-auto-flow: column; grid-auto-columns: 74px;
    max-height: none; overflow-x: auto; order: 2;
  }
}

/* ============================================================
   MOTION — the part that makes it feel expensive.
   Nothing pops. Pictures uncover from the bottom while the frame
   they sit in eases out of a slight zoom, so scrolling feels like
   a camera settling rather than elements switching on.
   ============================================================ */

/* type: a shorter, softer rise than the stock reveal */
.js .ro .reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 1s var(--ease), transform 1s var(--ease);
  transition-delay: var(--reveal-delay, 0s);
  will-change: opacity, transform;
}
.js .ro .reveal.is-in { opacity: 1; transform: none; }

/* frames: a curtain from the bottom */
.js .ro .reveal-img {
  clip-path: inset(0 0 100% 0);
  transition: clip-path 1.25s var(--ease);
  transition-delay: var(--reveal-delay, 0s);
}
.js .ro .reveal-img.is-in { clip-path: inset(0 0 0 0); }

/* the picture inside settles out of a slow zoom as the curtain lifts */
.js .ro .reveal-img > .ro__img,
.js .ro .reveal-img > img {
  transform: scale(1.07);
  transition: transform 1.6s var(--ease);
  transition-delay: var(--reveal-delay, 0s);
}
.js .ro .reveal-img.is-in > .ro__img,
.js .ro .reveal-img.is-in > img { transform: scale(1); }

/* hover keeps the same slow hand */
.ro-card:hover .ro__img,
.ro-pcard:hover .ro-pcard__media .ro__img,
.ro-split__media:hover .ro__img { transform: scale(1.035); }

/* links and buttons: a wipe rather than a colour flip */
.ro__btn { position: relative; overflow: hidden; z-index: 0; }
.ro__btn::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background: var(--paper);
  transform: scaleY(0); transform-origin: bottom;
  transition: transform .45s var(--ease);
}
.ro__btn:hover::after { transform: scaleY(1); }
.ro__btn--outline-light::after { background: #fff; }

/* the announcement bar breathes once on load so the page starts alive */
.ro-announce span { display: inline-block; animation: ro-rise .9s var(--ease) both; }
@keyframes ro-rise { from { opacity: 0; transform: translateY(6px); } }

@media (prefers-reduced-motion: reduce) {
  .ro .reveal, .ro .reveal-img { opacity: 1; transform: none; clip-path: none; transition: none; }
  .ro .reveal-img > .ro__img, .ro .reveal-img > img { transform: none; transition: none; }
  .ro-announce span { animation: none; }
  .ro__btn::after { transition: none; }
}

/* ============================================================
   RHYTHM — one gutter everywhere, and real air around type.
   Hard edges are fine; hard edges at inconsistent distances are
   what read as cheap. Everything below lines up to --pad.
   ============================================================ */
.ro { --pad: clamp(20px, 4.2vw, 72px); --gap: clamp(12px, 1.3vw, 20px); }

/* grids share the page gutter instead of inventing their own */
.ro-section { padding-block: clamp(56px, 7vw, 120px); }
.ro-section--tight { padding-block: clamp(34px, 4.4vw, 66px); }
.ro-section__head { margin-bottom: clamp(26px, 3.4vw, 52px); }
.ro-detail { padding-block: clamp(60px, 7.5vw, 130px); }
.ro-detail__head { margin-bottom: clamp(28px, 3.6vw, 56px); }

/* headings get room to be headings */
.ro-pagehead { padding-block: clamp(56px, 7vw, 120px) clamp(34px, 4vw, 62px); }
.ro-statement { padding-block: clamp(60px, 8vw, 130px); }

/* the shade row and the lookbook sheets breathe at the same distance as text */
.ro-shades { padding: clamp(60px, 7vw, 120px) var(--pad) clamp(50px, 6vw, 90px); }
.ro-shades__row { gap: var(--gap); margin-block: clamp(34px, 4vw, 62px); }

/* product cards: the caption sits closer to its picture than to the next card */
.ro-pcard__body { padding-top: 1.1rem; }
.ro-grid { gap: clamp(18px, 2.2vw, 38px) var(--gap); }

/* the buy card no longer floats — it aligns to the gallery's top edge */
.ro-pdp { padding: var(--gap) var(--pad) clamp(50px, 6vw, 96px); }
.ro-buy { padding: clamp(20px, 1.9vw, 32px); }

/* full-bleed bands keep their copy on the same left rule as everything else */
.ro-desire__body, .ro-band__copy, .ro-hero__copy { padding-inline: var(--pad); }

/* ============================================================
   MOBILE — read first, tap second. Larger body type, one column
   everywhere, and horizontal strips only where a row genuinely
   helps (shades, props, quotes).
   ============================================================ */
@media (max-width: 860px) {
  .ro {
    --pad: 20px;
    --gap: 10px;
    --t-body: .9375rem;                 /* 15px — 14 is a squint on a phone */
    --t-display: clamp(2.5rem, 12vw, 3.4rem);
    --t-section: clamp(1.6rem, 8vw, 2.2rem);
    line-height: 1.65;
  }

  /* vertical rhythm halves so the page does not become a scroll marathon */
  .ro-section { padding-block: clamp(38px, 10vw, 58px); }
  .ro-section--tight { padding-block: clamp(26px, 7vw, 40px); }
  .ro-detail { padding-block: clamp(40px, 11vw, 62px); }
  .ro-pagehead { padding-block: clamp(34px, 9vw, 52px) clamp(22px, 6vw, 34px); }
  .ro-statement { padding-block: clamp(40px, 11vw, 64px); }
  .ro-statement p { font-size: clamp(1.35rem, 6.6vw, 1.9rem); }

  /* copy blocks get a comfortable measure and a bit more leading */
  .ro-split__body p, .ro-section__head p, .ro-pagehead p,
  .ro-desire__body p, .ro-band__copy p { line-height: 1.85; }
  .ro-article { padding-inline: var(--pad); }
  .ro-article p { font-size: 1rem; line-height: 1.85; }

  /* one column, one gutter */
  .ro-detail__grid { grid-template-columns: repeat(6, 1fr); row-gap: clamp(14px, 4vw, 24px); }
  .ro-card:nth-child(1) { grid-column: 1 / 7; grid-row: 1; margin-top: 0; }
  .ro-card:nth-child(1) .ro-card__media { aspect-ratio: 4/5; }
  .ro-card:nth-child(2) { grid-column: 1 / 4; grid-row: 2; margin-top: 0; }
  .ro-card:nth-child(2) .ro-card__media { aspect-ratio: 3/4; }
  .ro-card:nth-child(3) { grid-column: 4 / 7; grid-row: 2; margin-top: clamp(16px, 5vw, 30px); }
  .ro-card:nth-child(3) .ro-card__media { aspect-ratio: 1/1; }
  .ro-card:nth-child(4) { grid-column: 1 / 7; grid-row: 3; margin-top: 0; }
  .ro-card:nth-child(4) .ro-card__media { aspect-ratio: 5/4; }

  /* the PDP: viewer first, then the strip, then the decision */
  .ro-pdp { padding-inline: 0; gap: 18px; }
  .ro-crumbs { padding-inline: var(--pad); }
  .ro-gallery__stage { aspect-ratio: 1/1; }
  .ro-gallery__rail { padding-inline: var(--pad); gap: 8px; }
  .ro-buy { margin-inline: var(--pad); border: 1px solid var(--line); }
  .ro-buy__shadehead { flex-direction: column; align-items: flex-start; gap: .5rem; }

  /* forms and tables stop being desktop leftovers */
  .ro-form { max-width: none; }
  .ro-table { display: block; }
  .ro-table thead { display: none; }
  .ro-table tr { display: block; padding: 1rem 0; border-bottom: 1px solid var(--line); }
  .ro-table td { display: block; border: 0; padding: .2rem 0; }
  .ro-table td:first-child { font-family: var(--f-display); font-size: 1.05rem; text-transform: uppercase; letter-spacing: .04em; }
  .ro-table td:not(:first-child) { color: var(--ink-soft); font-size: .82rem; }

  /* the reviews list reads as a feed */
  .ro-review { padding-block: 1.3rem; }
  .ro-review__meta { display: flex; align-items: center; gap: .8rem; }
  .ro-review__meta .ro__label { margin-top: 0; }

  /* nothing hides under the sticky bar */
  body:has(.sticky-atc) { padding-bottom: 0; }
  .ro-footer { padding-bottom: 0; }
  .ro-footer__wordmark { font-size: clamp(4.4rem, 32vw, 9rem); }
  .ro-footer__news h2 { font-size: clamp(1.6rem, 8vw, 2.2rem); }
  .ro-footer__news form { max-width: none; }

  /* menu: full width, type sized for a thumb */
  .drawer.drawer--full { width: 100vw; }
  .ro-menu__main a { font-size: clamp(1.5rem, 8vw, 2.1rem); padding-block: .45rem; }
}

@media (max-width: 560px) {
  .ro-shade { flex-basis: 80%; }
  .ro-quote { flex-basis: 82%; }
  .ro-prop { flex-basis: 84%; }
  .ro-gallery__rail { grid-auto-columns: 62px; }
  .ro-swatches { grid-template-columns: repeat(5, minmax(0, 1fr)); gap: .3rem; }
  .ro-swatch { padding: .5rem .1rem; }
  .ro-swatch i { width: 26px; height: 26px; }
  .ro-swatch span { font-size: .55rem; letter-spacing: .08em; }
}

/* shop cards: the object on studio white leads, the worn shot answers on hover */
.ro-pcard__media--object { background: #FDFCFC; }
.ro-pcard__media--object > .ro__img { object-fit: contain; padding: 12% 18%; }
.ro-pcard__media--object > .ro__img--hover { object-fit: cover; padding: 0; opacity: 0; }
.ro-pcard:hover .ro-pcard__media--object > .ro__img--hover { opacity: 1; }
.ro-pcard:hover .ro-pcard__media--object > .ro__img { transform: none; }
@media (hover: none) {
  .ro-pcard__media--object > .ro__img--hover { display: none; }
}

/* ============================================================
   TYPE RETUNE — Geist
   Bodoni carried a headline on stroke contrast; a sans carries it on
   weight and tight tracking. Every place that leaned on the serif is
   re-set here: display goes bold and tight, the wordmark stays wide
   and light, and the editorial voice moves to weight 300.
   ============================================================ */

/* the mark: wide tracking, light weight — a name, not a headline */
.ro-header__logo {
  font-weight: var(--w-medium);
  letter-spacing: .34em;
  padding-left: .34em;
}
.ro-buy__mark, .ro-footer__mark { font-weight: var(--w-medium); letter-spacing: .3em; }

/* the closing wordmark reads as a mark, so it stays light and wide */
.ro-footer__wordmark { font-weight: var(--w-thin); letter-spacing: .04em; opacity: .16; }

/* the big statement is the light moment in the system */
.ro-statement p {
  font-weight: var(--w-thin);
  letter-spacing: -.015em;
  line-height: 1.2;
}
.ro-statement em { font-style: normal; font-weight: var(--w-regular); color: var(--red); }

/* product and section names: medium, tightened */
.ro-buy__name, .ro-pcard__name, .ro-shadecard__name,
.ro-review__title, .cartline__info h4 {
  font-weight: var(--w-bold);
  letter-spacing: -.01em;
}

/* the menu: large, tight, and it gets its weight from the family */
.ro-menu__main a { font-weight: var(--w-bold); letter-spacing: -.02em; }
.mobnav a { font-weight: var(--w-medium); letter-spacing: -.01em; }

/* numerals: a sans has real figures — use them */
.ro-prop__num, .ro-benefit span, .ro-stat b {
  font-weight: var(--w-thin);
  letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
}
.ro-buy__price, .ro-pcard__price, .ro-buy__qty span,
.ro-header__util [data-cart-count] { font-variant-numeric: tabular-nums; }

/* quotes lose the italic serif; they get air and a lighter weight instead */
.ro-quote blockquote, .ro-article blockquote {
  font-weight: var(--w-thin);
  font-style: normal;
  letter-spacing: -.01em;
  line-height: 1.5;
}
.ro-article blockquote { border-left-color: var(--red); }

/* micro-labels: medium weight holds up better than 400 at 11px */
.ro__label, .ro__link, .ro__btn,
.ro-header__nav a, .ro-header__util a, .ro-header__util button,
.ro-header__menu span, .ro-faq__q, .ro-footer h3, .ro-footer h4 { font-weight: var(--w-medium); }

/* body copy sits at regular; long-form gets a touch more line height */
.ro-article p { font-weight: var(--w-regular); line-height: 1.8; }

/* ============================================================
   PAGE-SPECIFIC COMPONENTS
   Each page gets a structure that belongs to its job. Reusing the
   same three blocks everywhere is what made every page feel the
   same; these exist so they do not have to.
   ============================================================ */

/* --- shop: a comparison table, because choosing between five reds
       is a comparison, not a scroll --- */
.ro-compare { width: 100%; border-collapse: collapse; }
.ro-compare th, .ro-compare td { padding: 1.1rem .9rem; border-bottom: 1px solid var(--line); text-align: left; vertical-align: middle; }
.ro-compare thead th {
  font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase;
  font-weight: var(--w-medium); color: var(--ink-soft); border-bottom-color: var(--ink);
}
.ro-compare tbody tr:hover { background: var(--paper-2); }
.ro-compare__shade { display: flex; align-items: center; gap: .8rem; font-weight: var(--w-medium); }
.ro-compare__dot { width: 22px; height: 22px; border-radius: 50%; flex: none; box-shadow: inset 0 0 0 1px rgba(0,0,0,.08); }
.ro-compare__bar { display: block; height: 3px; background: var(--line); position: relative; width: 90px; }
.ro-compare__bar i { position: absolute; inset: 0 auto 0 0; background: var(--red); }

/* --- about: a chaptered timeline, so the story reads as a sequence --- */
.ro-chapter {
  display: grid; grid-template-columns: 9rem 1fr;
  gap: clamp(20px, 3vw, 56px);
  padding: clamp(30px, 4vw, 58px) var(--pad);
  border-top: 1px solid var(--line);
}
.ro-chapter__mark { position: sticky; top: calc(var(--header-h, 70px) + 24px); align-self: start; }
.ro-chapter__mark b { display: block; font-size: 2.2rem; font-weight: var(--w-thin); letter-spacing: -.02em; line-height: 1; }
.ro-chapter__mark span { display: block; margin-top: .5rem; font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; color: var(--ink-soft); }
.ro-chapter__body { max-width: 46em; }
.ro-chapter__body h2 { font-size: clamp(1.5rem, 2.6vw, 2.3rem); margin-bottom: 1.1rem; }
.ro-chapter__body p { color: var(--ink-soft); line-height: 1.9; margin-bottom: 1.1rem; }
.ro-chapter__body figure { margin-top: 1.8rem; }
.ro-chapter__body img { width: 100%; aspect-ratio: 16/10; object-fit: cover; }

/* --- formula: the proof page. An ingredient table and a claims ledger. --- */
.ro-inci { width: 100%; border-collapse: collapse; }
.ro-inci td { padding: 1rem 1rem 1rem 0; border-bottom: 1px solid var(--line); vertical-align: top; }
.ro-inci td:first-child { font-weight: var(--w-medium); width: 34%; }
.ro-inci td:last-child { color: var(--ink-soft); }
.ro-claim { display: grid; grid-template-columns: 1fr 1fr; gap: 0 clamp(20px, 3vw, 48px); border-top: 1px solid var(--line); padding: 1.3rem 0; }
.ro-claim b { font-weight: var(--w-medium); }
.ro-claim p { color: var(--ink-soft); font-size: .82rem; line-height: 1.7; }
.ro-proof { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(18px, 2.4vw, 40px); }
.ro-proof div { border-top: 1px solid var(--line-red); padding-top: 1.1rem; }
.ro-proof b { display: block; font-size: clamp(1.8rem, 3vw, 2.6rem); font-weight: var(--w-thin); letter-spacing: -.02em; }
.ro-proof span { font-size: .8rem; color: rgba(255,255,255,.72); line-height: 1.7; display: block; margin-top: .4rem; }

/* --- lookbook: a sequence, not a grid. Frames alternate width and offset. --- */
.ro-seq { display: grid; gap: clamp(30px, 5vw, 90px); padding-block: clamp(30px, 4vw, 60px); }
.ro-seq figure { margin: 0; }
.ro-seq img { width: 100%; display: block; }
.ro-seq figcaption { margin-top: .8rem; font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; color: var(--ink-soft); }
.ro-seq--full img { aspect-ratio: 21/9; object-fit: cover; }
.ro-seq--pair { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap); align-items: end; }
.ro-seq--pair figure:first-child img { aspect-ratio: 4/5; object-fit: cover; }
.ro-seq--pair figure:last-child { padding-bottom: clamp(30px, 6vw, 90px); }
.ro-seq--pair figure:last-child img { aspect-ratio: 3/4; object-fit: cover; }
.ro-seq--offset { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap); }
.ro-seq--offset figure:first-child { padding-top: clamp(30px, 7vw, 110px); }
.ro-seq--offset img { aspect-ratio: 3/4; object-fit: cover; }

/* --- journal: one lead, then the rest --- */
.ro-lead { display: grid; grid-template-columns: 1.25fr 1fr; gap: clamp(24px, 3.4vw, 60px); align-items: center; }
.ro-lead__media img { width: 100%; aspect-ratio: 4/3; object-fit: cover; }
.ro-lead h2 { font-size: clamp(1.6rem, 3vw, 2.6rem); margin: 1rem 0; }
.ro-lead p { color: var(--ink-soft); line-height: 1.85; margin-bottom: 1.6rem; }

/* --- reviews: a rating summary you can actually read --- */
.ro-rating { display: grid; grid-template-columns: auto 1fr; gap: clamp(28px, 4vw, 70px); align-items: center; }
.ro-rating__score b { font-size: clamp(3rem, 6vw, 5rem); font-weight: var(--w-thin); letter-spacing: -.03em; line-height: 1; display: block; }
.ro-rating__bars { display: grid; gap: .5rem; max-width: 380px; }
.ro-rating__row { display: grid; grid-template-columns: 2.2rem 1fr 2.6rem; gap: .8rem; align-items: center; font-size: .75rem; color: var(--ink-soft); }
.ro-rating__track { height: 4px; background: var(--line); }
.ro-rating__track i { display: block; height: 100%; background: var(--red); }
.ro-chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.ro-chip {
  padding: .6em 1.1em; border: 1px solid var(--line);
  font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; font-weight: var(--w-medium);
  transition: border-color .2s, background .2s;
}
.ro-chip:hover { border-color: var(--ink); }
.ro-chip.is-active { background: var(--ink); color: #fff; border-color: var(--ink); }

/* --- legal: a sticky index beside the long form --- */
.ro-legal { display: grid; grid-template-columns: 15rem 1fr; gap: clamp(24px, 4vw, 70px); padding: clamp(30px, 4vw, 60px) var(--pad) clamp(50px, 6vw, 90px); }
.ro-legal__nav { position: sticky; top: calc(var(--header-h, 70px) + 24px); align-self: start; display: grid; gap: .7rem; }
.ro-legal__nav a { font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; color: var(--ink-soft); }
.ro-legal__nav a:hover { color: var(--ink); }

/* --- contact: what happens after you press send --- */
.ro-promise { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(18px, 2.4vw, 40px); }
.ro-promise div { border-top: 1px solid var(--line); padding-top: 1rem; }
.ro-promise b { display: block; font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; font-weight: var(--w-medium); margin-bottom: .5rem; }
.ro-promise p { font-size: .82rem; color: var(--ink-soft); line-height: 1.7; }

@media (max-width: 860px) {
  .ro-chapter { grid-template-columns: 1fr; gap: 12px; }
  .ro-chapter__mark { position: static; display: flex; align-items: baseline; gap: .8rem; }
  .ro-chapter__mark b { font-size: 1.5rem; }
  .ro-chapter__mark span { margin-top: 0; }
  .ro-claim, .ro-lead, .ro-rating, .ro-legal { grid-template-columns: 1fr; gap: 14px; }
  .ro-legal__nav { position: static; grid-auto-flow: column; overflow-x: auto; }
  .ro-proof, .ro-promise { grid-template-columns: 1fr; }
  .ro-seq--pair, .ro-seq--offset { grid-template-columns: 1fr; }
  .ro-seq--offset figure:first-child, .ro-seq--pair figure:last-child { padding: 0; }
  .ro-compare { display: block; overflow-x: auto; white-space: nowrap; }
}

/* ============================================================
   ONE BRAND PAGE — a jump bar, because a long page needs a map
   ============================================================ */
.ro-jump {
  position: sticky; top: var(--header-h, 64px); z-index: 40;
  display: flex; gap: clamp(14px, 2.4vw, 34px);
  padding: .9rem var(--pad);
  background: var(--paper);
  border-bottom: 1px solid var(--line);
  overflow-x: auto; scrollbar-width: none;
}
.ro-jump::-webkit-scrollbar { display: none; }
.ro-jump a {
  font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase;
  font-weight: var(--w-medium); color: var(--ink-soft); white-space: nowrap;
  padding-bottom: 2px; border-bottom: 1px solid transparent;
  transition: color .2s, border-color .2s;
}
.ro-jump a:hover { color: var(--ink); border-color: currentColor; }
[id] { scroll-margin-top: calc(var(--header-h, 64px) + 60px); }

/* ============================================================
   MOBILE PDP — the gallery becomes a full-bleed swipe deck.
   A 62px thumbnail rail on a phone is a worse control than the
   thing it controls; swiping the image is the native gesture.
   ============================================================ */
@media (max-width: 860px) {
  /* a grid track cannot shrink below its content's min-content unless told to;
     the swipe deck's intrinsic width was forcing the whole PDP to 500px and
     pushing the fifth swatch off a 390px screen */
  .ro-pdp > * { min-width: 0; }
  .ro-gallery { display: block; max-width: 100%; }
  .ro-gallery__rail { min-width: 0; }
  .ro-gallery__stage { display: none; }
  .ro-gallery__rail {
    display: flex; grid-auto-flow: unset;
    gap: 0; max-height: none;
    overflow-x: auto; scroll-snap-type: x mandatory;
    padding: 0;
  }
  .ro-gallery__rail::-webkit-scrollbar { display: none; }
  .ro-thumb {
    flex: 0 0 86%; scroll-snap-align: center;
    aspect-ratio: 4/5; opacity: 1;
    outline: 0; margin-right: 8px;
  }
  .ro-thumb:last-child { margin-right: var(--pad); }
  .ro-thumb:first-child { margin-left: var(--pad); }
  .ro-thumb.is-active { outline: 0; }

  /* the buy panel gets the price and action above the fold of its own block */
  .ro-buy__name { font-size: 1.9rem; }
  .ro-buy__price { font-size: .95rem; }
  .ro-buy .ro__btn--wide { padding-block: 1.25em; }
  .ro-jump { top: 51px; }
}

/* ============================================================
   FAMILY HERO — the poster. One picture, one argument, one action.
   ============================================================ */
.ro-fhero {
  position: relative; overflow: hidden;
  min-height: min(84vh, 780px);
  display: flex; align-items: center;
  background: #FBFAFA;
}
.ro-fhero .ro__img { position: absolute; inset: 0; object-position: 50% 62%; }
.ro-fhero__copy {
  position: relative; z-index: 2;
  padding: clamp(28px, 5vw, 90px) var(--pad);
  max-width: 34em;
}
.ro-fhero__copy h1 { font-size: var(--t-display); letter-spacing: -.025em; margin: 1rem 0 1.2rem; }
.ro-fhero__copy p { color: var(--ink-soft); line-height: 1.85; max-width: 22em; }
.ro-fhero__actions { display: flex; align-items: center; gap: clamp(16px, 2.4vw, 32px); flex-wrap: wrap; margin-top: 2rem; }

/* ============================================================
   QUICK BUY — the single glaze, one scroll under the poster
   ============================================================ */
.ro-quickbuy {
  display: grid; grid-template-columns: 1.25fr .75fr;
  gap: clamp(20px, 2.6vw, 48px);
  padding: clamp(28px, 3.4vw, 60px) var(--pad) clamp(40px, 5vw, 80px);
  align-items: center;
}
.ro-quickbuy__stage { position: relative; aspect-ratio: 16/11; background: #FDFCFC; overflow: hidden; }
.ro-quickbuy__stage .ro__img { position: absolute; inset: 0; object-fit: contain; padding: 4%; transition: opacity .35s var(--ease); }

/* ============================================================
   SWATCH — a thin square chip standing over its own name
   ============================================================ */
.ro-swatches { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: .45rem; }
.ro-swatch {
  display: grid; gap: .5rem; justify-items: stretch;
  padding: 0; border: 0; background: none;
  text-align: center;
}
.ro-swatch i {
  display: block; width: 100%; height: 34px;
  border-radius: 0;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.06);
  transition: box-shadow .25s var(--ease), transform .25s var(--ease);
}
.ro-swatch span {
  font-size: .58rem; letter-spacing: .1em; text-transform: uppercase;
  font-weight: var(--w-medium); color: var(--ink-soft);
  line-height: 1.35; white-space: normal;
  padding-bottom: 3px; border-bottom: 1px solid transparent;
  transition: color .2s, border-color .2s;
}
.ro-swatch:hover i { transform: translateY(-2px); }
.ro-swatch.is-active i { box-shadow: inset 0 0 0 1px rgba(0,0,0,.06), 0 0 0 1px var(--ink); }
.ro-swatch.is-active span { color: var(--ink); border-bottom-color: var(--ink); }

/* ============================================================
   BEFORE / AFTER — a drag comparison, because the claim is visual
   ============================================================ */
.ro-ba {
  position: relative; overflow: hidden;
  aspect-ratio: 16/10;
  background: var(--paper-2);
  touch-action: pan-y;
  user-select: none;
  cursor: ew-resize;
}
.ro-ba img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.ro-ba__before { position: absolute; inset: 0; }
.ro-ba__before img { clip-path: inset(0 calc(100% - var(--split, 50%)) 0 0); }
.ro-ba__tag {
  position: absolute; top: 0; z-index: 3;
  padding: .7em 1.1em;
  background: rgba(255,255,255,.9); backdrop-filter: blur(6px);
  font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; font-weight: var(--w-medium);
}
.ro-ba__tag--l { left: 0; }
.ro-ba__tag--r { right: 0; }
.ro-ba__handle {
  position: absolute; top: 0; bottom: 0; z-index: 4;
  left: var(--split, 50%);
  width: 44px; margin-left: -22px;
  display: grid; place-items: center;
  background: none; cursor: ew-resize;
}
.ro-ba__handle::before {
  content: ""; position: absolute; top: 0; bottom: 0; left: 50%;
  width: 1px; margin-left: -.5px; background: #fff;
  box-shadow: 0 0 0 1px rgba(0,0,0,.12);
}
.ro-ba__handle i {
  position: relative; width: 40px; height: 40px; border-radius: 50%;
  background: #fff; box-shadow: 0 2px 14px rgba(0,0,0,.22);
  display: grid; place-items: center;
}
.ro-ba__handle i::before, .ro-ba__handle i::after {
  content: ""; position: absolute; width: 0; height: 0;
  border-block: 4px solid transparent;
}
.ro-ba__handle i::before { border-right: 5px solid var(--ink); left: 11px; }
.ro-ba__handle i::after  { border-left: 5px solid var(--ink); right: 11px; }
.ro-ba__handle:focus-visible { outline: 2px solid var(--red); outline-offset: 2px; }

@media (max-width: 860px) {
  .ro-fhero { min-height: min(74vh, 620px); align-items: flex-end; }
  .ro-fhero .ro__img { object-position: 50% 42%; }
  .ro-fhero__copy { padding-bottom: clamp(26px, 7vw, 44px); }
  .ro-quickbuy { grid-template-columns: 1fr; gap: 0; padding-inline: 0; }
  .ro-quickbuy__stage { aspect-ratio: 4/3; }
  .ro-ba { aspect-ratio: 4/5; }
}

/* the set poster runs shorter than the home page: it is a chapter opener,
   not the front door */
.ro-fhero--set { min-height: min(62vh, 560px); }
.ro-fhero--set .ro__img { object-position: 50% 42%; }

/* ============================================================
   PHONE BUY BLOCK — everything the decision needs, in one view.
   Target: from the top of the buy panel, a 390×844 screen shows
   name, price, rating, shade row, quantity and the button without
   a single scroll. That means trimming vertical padding, not size.
   ============================================================ */
@media (max-width: 860px) {
  .ro-buy { padding: 18px var(--pad) 20px; margin-inline: 0; border-inline: 0; }
  .ro-buy__top { margin-bottom: .3rem; }
  .ro-buy .ro__label { font-size: .625rem; }
  .ro-buy__name { font-size: 1.75rem; margin-top: .15rem; }
  .ro-buy__price { margin-top: .15rem; }
  .ro-buy .ro-stars { margin-top: .45rem !important; }

  /* the pitch is short enough to be read in full; a sentence cut mid-word
     reads as a bug, not as restraint */
  .ro-buy > p[style*="margin-top:1.4rem"] {
    margin-top: .8rem !important;
    font-size: .84rem; line-height: 1.65;
  }

  .ro-buy__shade { margin-top: .95rem; }
  .ro-buy__shadehead { margin-bottom: .55rem; }
  .ro-swatches { gap: .35rem; }
  .ro-swatch i { height: 30px; }
  .ro-swatch span { font-size: .52rem; letter-spacing: .06em; }
  .ro-buy__shadenote { margin-top: .55rem; font-size: .72rem; }

  .ro-buy__qty { margin: .85rem 0 .55rem; padding: .5rem .9rem; }
  .ro-buy__qty button { height: 30px; }
  .ro-buy .ro__btn--wide { padding-block: 1.15em; }
  .ro-buy__ship { margin-top: .85rem; padding-top: .8rem; font-size: .7rem; }

  /* the in-card accordions start below the fold on purpose */
  .ro-buy .ro-faq__cols { margin-top: 1rem !important; }
  .ro-buy .ro-faq__q { padding-block: .95rem; }
}

/* ============================================================
   PREMIUM FEEL — the small things you notice only in aggregate
   ============================================================ */
/* reserve space so the page never lurches on load — but only behind images
   that fill their box; a contained render would show the fill as a frame */
.ro img { background: var(--paper-2); }
.ro-quickbuy__stage .ro__img,
.ro-hero__stage .ro__img,
.ro-buy__media .ro__img,
.ro-pdp__frame .ro__img,
.ro-pcard__media--object .ro__img,
.ro-card--contain .ro__img { background: transparent; }
.ro-shade__tube, .ro-pcard__tube, .cartline img, .cart-upsell img { background: transparent; }

/* links and swatches settle rather than snap */
.ro-swatch, .ro-thumb, .ro-chip, .ro__link, .ro-pcard { -webkit-tap-highlight-color: transparent; }

/* the sticky bar rides in with the same curve as everything else */
.sticky-atc { transition: transform .5s var(--ease); }

/* keyboard users get the same care as pointer users */
.ro a:focus-visible, .ro button:focus-visible {
  outline: 2px solid var(--red); outline-offset: 3px; border-radius: 1px;
}
.ro-red a:focus-visible, .ro-red button:focus-visible { outline-color: #fff; }

/* selection matches the brand rather than the browser */
.ro-red ::selection { background: #fff; color: var(--red-deep); }

/* The model fills the frame, so laying type over her fights the face. The
   portrait hero splits instead: copy holds the left on paper, the picture
   runs to the right edge. Nothing overlaps, and the face stays the subject. */
.ro-fhero--model {
  display: grid; grid-template-columns: .82fr 1.18fr;
  align-items: stretch;
  min-height: min(86vh, 800px);
  background: var(--paper);
}
/* ============================================================
   THE SET POSTER — the family on plinths, full bleed. The image
   is the section; the copy holds the pale left third the render
   already leaves empty.
   ============================================================ */



/* ============================================================
   THE AUTHORED MOMENT — one entrance, on the hero, on load.
   The picture settles out of a slow zoom while the copy rises
   in four steps. Everything else on the site stays quiet.
   ============================================================ */
.js .ro-fhero--model .ro__img {
  animation: ro-hero-settle 2.2s var(--ease) both;
}
@keyframes ro-hero-settle {
  from { transform: scale(1.045); filter: saturate(.88); }
  to   { transform: scale(1); filter: saturate(1); }
}
.js [data-hero-rise] {
  opacity: 0; transform: translateY(22px);
  animation: ro-hero-rise 1.1s var(--ease) both;
}
@keyframes ro-hero-rise { to { opacity: 1; transform: none; } }
.js [data-hero-rise]:nth-of-type(1) { animation-delay: .18s; }
.js h1[data-hero-rise] { animation-delay: .3s; }
.js p[data-hero-rise] { animation-delay: .46s; }
.js .ro-fhero__actions[data-hero-rise] { animation-delay: .62s; }
/* the hero owns the entrance; the scroll system leaves it alone */
.ro-fhero--model .reveal { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  .js .ro-fhero--model .ro__img, .js [data-hero-rise] { animation: none; opacity: 1; transform: none; }
}

/* ============================================================
   HEADER GLASS — translucency with a job: the bar stays legible
   over imagery while scrolling, the Apple way.
   ============================================================ */
.ro-header.is-scrolled {
  background: rgba(255,255,255,.84);
  -webkit-backdrop-filter: saturate(1.6) blur(14px);
  backdrop-filter: saturate(1.6) blur(14px);
}

/* ============================================================
   SWATCH REFINEMENT — lower, thinner, closer to a colour system
   ============================================================ */
.ro-swatch i { height: 26px; }
.ro-swatch { gap: .45rem; }
.ro-swatch.is-active i { box-shadow: inset 0 0 0 1px rgba(0,0,0,.06), 0 1px 0 0 var(--paper), 0 2px 0 0 var(--ink); }

/* the gallery stage answers the swatch with a settle, not a cut */
.ro-gallery__stage .ro__img { transition: opacity .35s var(--ease), transform .6s var(--ease); }
.ro-gallery__stage .ro__img[style*="opacity: 0"] { transform: scale(1.015); }

/* ============================================================
   THE BRAND VOICE — Fraunces, the face the carton itself wears.
   It belongs to the name and to poster headlines; Geist keeps
   everything that works for a living.
   ============================================================ */
.ro { --f-brand: "Fraunces", Georgia, serif; }

/* the wordmark is lowercase everywhere, exactly as printed on the box */
.ro-header__logo, .ro-buy__mark, .ro-footer__mark {
  font-family: var(--f-brand);
  font-weight: 500;
  text-transform: lowercase;
  letter-spacing: .02em;
}
.ro-header__logo { font-size: clamp(1.6rem, 2.2vw, 1.9rem); padding-left: 0; }
.ro-buy__mark { font-size: 1.05rem; }
.ro-footer__mark { font-size: 1.7rem; letter-spacing: .01em; }
.ro-footer__wordmark {
  font-family: var(--f-brand);
  font-weight: 400; font-style: italic;
  text-transform: lowercase; letter-spacing: -.01em;
  opacity: .15;
}

/* poster headlines speak Fraunces, sentence case, tight */
.ro-fhero--model .ro-fhero__copy h1,
.ro-fhero--model .ro-fhero__copy h1 { font-size: clamp(2.9rem, 5.4vw, 5.4rem); }
.ro-fhero--model .ro-fhero__copy h1 em,

/* ============================================================
   MOBILE HERO — the photograph is the screen. Copy sits on it,
   held by the white gradient the composition already offers.
   ============================================================ */
@media (max-width: 860px) {
  .ro-fhero--model { display: block; position: relative; min-height: calc(100svh - 96px); overflow: hidden; }
  .ro-fhero--model .ro__img {
    position: absolute; inset: 0;
    aspect-ratio: auto; width: 100%; height: 100%;
    object-fit: cover; object-position: 50% 18%;
  }
  .ro-fhero--model .ro-fhero__copy {
    position: absolute; inset: auto 0 0 0; z-index: 2;
    padding: 0 var(--pad) clamp(26px, 7vw, 42px);
  }
  /* the hero label used to collide with the glove; on the scrim it reads */
  .ro-fhero--model .ro-fhero__copy h1 { font-size: clamp(2.7rem, 12vw, 3.6rem); }
}

/* ============================================================
   SET BAND — the words live on the picture at every width
   ============================================================ */
@media (max-width: 860px) {
          }

/* ============================================================
   MENU — the drawer becomes a composed page: brand voice on the
   destinations, quiet columns beside them, a hairline rhythm
   ============================================================ */
.drawer--full .drawer__head { border-bottom: 0; padding-bottom: .4rem; }
.drawer--full .drawer__head span { visibility: hidden; }
.ro-menu { grid-template-columns: 1.15fr .85fr; padding-block: clamp(10px, 2vw, 28px) clamp(30px, 5vw, 56px); }
.ro-menu__main { gap: 0; align-content: start; }
.ro-menu__main a {
  font-family: var(--f-brand);
  font-weight: 400;
  text-transform: lowercase;
  letter-spacing: -.01em;
  font-size: clamp(2.1rem, 4.6vw, 3.6rem);
  line-height: 1.08;
  padding: .32em 0;
  border-bottom: 1px solid var(--line);
  transition: color .25s var(--ease), padding-left .35s var(--ease);
}
.ro-menu__main a:last-child { border-bottom: 0; }
.ro-menu__main a:hover { color: var(--red); transform: none; padding-left: .4em; }
.ro-menu__side { padding-top: .6rem; }
.ro-menu__side h4 { color: var(--ink); }
.ro-menu__side a { color: var(--ink-soft); }
@media (max-width: 860px) {
  .ro-menu { grid-template-columns: 1fr; }
  .ro-menu__main a { font-size: clamp(1.9rem, 9vw, 2.6rem); }
}

/* ============================================================
   HERO · CANONICAL — one authority, last in the cascade.
   The approved composition: full-bleed portrait, head high in
   the frame, copy anchored bottom-left on the photograph's own
   white, held by the paper gradient.
   ============================================================ */
.ro-fhero--model { align-items: flex-end; min-height: min(94vh, 900px); background: #F7F6F5; }
/* contain, not cover: the portrait keeps its own scale and its studio white
   dissolves into the band's, so the face is never zoomed by the crop */
.ro-fhero--model .ro__img { position: absolute; inset: 0; object-fit: contain; object-position: 72% 100%; }
.ro-fhero--model .ro-fhero__copy {
  position: relative; z-index: 2;
  max-width: min(620px, 46vw);
  padding-bottom: clamp(34px, 4.6vw, 72px);
}
.ro-fhero--model .ro-fhero__copy p { max-width: 24em; }
@media (max-width: 860px) {
  .ro-fhero--model { display: block; position: relative; min-height: calc(100svh - 96px); }
  .ro-fhero--model .ro__img { position: absolute; inset: 0; width: 100%; height: 100%; object-position: 50% 16%; }
  .ro-fhero--model .ro-fhero__copy {
    position: absolute; inset: auto 0 0 0;
    max-width: none;
    padding: 0 var(--pad) clamp(26px, 7vw, 42px);
  }
}

/* hero: the headline alone, no wash — it sits on the photograph's own white */
.ro-fhero--model::after { content: none; }
.ro-fhero--model .ro-fhero__copy { max-width: none; }
.ro-fhero--model .ro-fhero__copy h1 { font-size: clamp(3rem, 6vw, 6rem); }
@media (max-width: 860px) {
  .ro-fhero--model .ro-fhero__copy h1 { font-size: clamp(2.6rem, 12vw, 3.4rem); }
}

/* header: the bag icon with its count riding the corner */
.ro-header__bag { position: relative; display: inline-flex; align-items: center; }
.ro-header__bag svg { width: 19px; height: 19px; display: block; }
.ro-header__bag::after { content: none; }
.ro-header__count {
  position: absolute; top: -5px; right: -8px;
  min-width: 14px; height: 14px; padding: 0 3px;
  display: grid; place-items: center;
  background: var(--red); color: #fff;
  font-size: .5rem; font-weight: var(--w-bold); letter-spacing: 0;
  border-radius: 999px;
  font-variant-numeric: tabular-nums;
}

/* the wordmark is truly centred at every width */
@media (max-width: 860px) {
  .ro-header { grid-template-columns: 1fr auto 1fr; }
  .ro-header__left { justify-self: start; }
  .ro-header__util { justify-self: end; }
}

/* the menu, one step quieter */
.ro-menu__main a { font-size: clamp(1.7rem, 3.4vw, 2.7rem); padding: .38em 0; }
.drawer.drawer--full { width: min(980px, 100vw); }
@media (max-width: 860px) {
  .ro-menu__main a { font-size: clamp(1.6rem, 7.4vw, 2.1rem); }
}

/* ============================================================
   SITE BLUEPRINT COMPONENTS — approved 2026-08-14
   ============================================================ */

/* hero price line — the one fix the checklist demanded */
.ro-fhero__price { margin-top: 1.1rem; }

/* buy-card points: the old value props, demoted to a component */
.ro-buy__points { margin-top: 1rem; padding-top: .9rem; border-top: 1px solid var(--line); display: grid; gap: .4rem; }
.ro-buy__points li { font-size: .74rem; color: var(--ink-soft); padding-left: 1em; position: relative; }
.ro-buy__points li::before { content: "·"; position: absolute; left: 0; color: var(--red); }

/* ---------- SHADE TABS — the five as characters, one stage ---------- */
.ro-shadetabs { padding: clamp(52px, 6vw, 96px) var(--pad); }
.ro-shadetabs > h2 { font-size: var(--t-section); text-align: center; }
.ro-shadetabs__bar {
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: .5rem; max-width: 560px; margin: clamp(22px, 3vw, 36px) auto 0;
}
.ro-red .ro-swatch span { color: rgba(255,255,255,.66); }
.ro-red .ro-swatch.is-active span { color: #fff; border-bottom-color: #fff; }
.ro-red .ro-swatch.is-active i { box-shadow: inset 0 0 0 1px rgba(0,0,0,.06), 0 1px 0 0 var(--red-deep), 0 2px 0 0 #fff; }
.ro-shadetabs__panel {
  display: grid; grid-template-columns: 1.15fr .85fr;
  gap: clamp(24px, 3.4vw, 56px);
  align-items: center;
  max-width: 1060px; margin: clamp(28px, 3.6vw, 48px) auto 0;
}
.ro-shadetabs__media { position: relative; aspect-ratio: 4/3; overflow: hidden; background: rgba(0,0,0,.14); }
.ro-shadetabs__media .ro__img { position: absolute; inset: 0; transition: opacity .35s var(--ease); }
.ro-shadetabs__tube {
  position: absolute; right: 6%; bottom: 5%; z-index: 2;
  width: 17%; filter: drop-shadow(0 14px 22px rgba(0,0,0,.45));
  transition: opacity .35s var(--ease);
}
.ro-shadetabs__body h3 {
  font-family: var(--f-brand); font-weight: 400;
  text-transform: lowercase; letter-spacing: -.01em;
  font-size: clamp(2rem, 3.6vw, 3.2rem);
}
.ro-shadetabs__body .ro__label { display: block; margin-bottom: .8rem; }
.ro-shadetabs__note { margin: 1.1rem 0 1.8rem; color: rgba(255,255,255,.78); line-height: 1.8; max-width: 22em; }

/* ---------- SET SPLIT — two surfaces, hard cut, closes the page ---------- */
.ro-setsplit { display: grid; grid-template-columns: .9fr 1.1fr; min-height: min(72vh, 640px); }
.ro-setsplit__body {
  background: var(--red-deep); color: #fff;
  display: flex; flex-direction: column; justify-content: center;
  padding: clamp(32px, 5vw, 80px) var(--pad);
}
.ro-setsplit__body h2 { color: #fff; font-family: var(--f-brand); font-weight: 400; text-transform: none; letter-spacing: -.015em; font-size: clamp(2rem, 3.6vw, 3.2rem); margin: 1rem 0 1.2rem; }
.ro-setsplit__body p { color: rgba(255,255,255,.8); line-height: 1.85; max-width: 24em; }
.ro-setsplit__body .ro-fhero__actions { margin-top: 1.8rem; }
.ro-setsplit__media { position: relative; overflow: hidden; background: #F4F2F1; }
.ro-setsplit__media .ro__img { position: absolute; inset: 0; object-position: 60% 55%; }

/* ---------- BOTTOM SHEET — heavy detail without leaving ---------- */
.drawer--bottom {
  top: auto; left: 0; right: 0; bottom: 0;
  width: 100%; max-height: 78vh;
  transform: translateY(102%);
}
.drawer--bottom.is-open { transform: none; }
.ro-sheet__block { padding: 1.1rem 0; border-bottom: 1px solid var(--line); }
.ro-sheet__block:last-child { border-bottom: 0; }
.ro-sheet__block h3 { font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase; font-weight: var(--w-medium); margin-bottom: .5rem; }
.ro-sheet__block p { color: var(--ink-soft); line-height: 1.75; font-size: .84rem; }

/* ---------- PLAIN LIST — prose replaces the spec-table device ---------- */
.ro-plain { display: grid; gap: 1rem; max-width: 46em; }
.ro-plain p { color: var(--ink-soft); line-height: 1.85; }
.ro-plain strong { color: var(--ink); font-weight: var(--w-medium); }
.ro-red .ro-plain p { color: rgba(255,255,255,.78); }
.ro-red .ro-plain strong { color: #fff; }

@media (max-width: 860px) {
  .ro-shadetabs__panel { grid-template-columns: 1fr; gap: 18px; }
  .ro-shadetabs__bar { max-width: none; }
  .ro-setsplit { grid-template-columns: 1fr; }
  .ro-setsplit__media { order: -1; aspect-ratio: 16/10; }
}

/* every horizontal strip signals "more" the same way: a soft fade on the
   trailing edge, colour-matched to its own surface — one affordance, site-wide */
@media (max-width: 860px) {
  .ro-worn, .ro-gallery { position: relative; }
  .ro-worn::after, .ro-gallery::after {
    content: ""; position: absolute; top: 0; bottom: 0; right: 0; width: 44px;
    pointer-events: none; z-index: 3;
  }
  .ro-worn::after { background: linear-gradient(to left, var(--red-deep), transparent); }
  .ro-gallery::after { background: linear-gradient(to left, var(--paper), transparent); }
}

/* ============================================================
   THE PRIME VOICE — every display heading speaks the hero's
   face. What "An object of colour" wears, every big line wears:
   Fraunces, sentence case, tight. Geist keeps the working text.
   ============================================================ */
.ro h1, .ro h2, .ro h3 {
  font-family: var(--f-brand);
  font-weight: 400;
  text-transform: none;
  letter-spacing: -.015em;
  line-height: 1.08;
}

/* micro-labels that borrow heading tags keep the working voice */
.ro-benefit h3, .ro-card h3, .ro-prop h3, .ro-fcard h3, .ro-sheet__block h3 {
  font-family: var(--f-ui);
  font-weight: var(--w-medium);
  text-transform: uppercase;
  letter-spacing: .2em;
  line-height: 1.4;
}

/* product names and titles join the prime voice */
.ro-buy__name, .ro-pcard__name, .ro-review__title, .cartline__info h4, .ro-post h3 {
  font-family: var(--f-brand);
  font-weight: 400;
  text-transform: none;
  letter-spacing: -.01em;
}

/* the statement was the thin moment; it belongs to the prime voice too */
.ro-statement p {
  font-family: var(--f-brand);
  font-weight: 400;
  text-transform: none;
  letter-spacing: -.01em;
}

/* ============================================================
   BUY CARD · the decision line — name and price share one
   baseline instead of stacking, and the price carries weight
   because it is half the decision.
   ============================================================ */
.ro-buy__line {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 1.2rem; margin-top: .55rem;
}
.ro-buy__line .ro-buy__name { margin-top: 0; }
.ro-buy .ro-buy__price {
  flex: none;
  font-family: var(--f-ui);
  font-size: .95rem;
  font-weight: var(--w-medium);
  letter-spacing: .04em;
  color: var(--ink);
  margin-top: 0;
  white-space: nowrap;
}
.ro-buy .ro-buy__line + .ro-note { margin-top: .5rem; }
.ro-buy__desc { margin-top: 1.3rem; color: var(--ink-soft); line-height: 1.8; }
.ro-pdp .ro-buy__name { font-size: clamp(1.9rem, 2.4vw, 2.4rem); }

/* ============================================================
   THE LAST THREE DEVICES — each consumed exactly once, per SITE.md
   01 · the depth ladder (shop)   09 · the pinned sequence (the five)
   15 · the standing number (reviews)
   ============================================================ */

/* 01 · DEPTH LADDER — the five as one continuous scale */
.ro-ladder { padding: clamp(52px, 6vw, 96px) var(--pad); }
.ro-ladder__scale {
  position: relative; margin-top: clamp(26px, 3.4vw, 44px);
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 2px;
}
.ro-ladder__step {
  position: relative; display: block; padding: 0; border: 0; cursor: pointer;
  background: none; text-align: start; color: inherit;
}
.ro-ladder__bar {
  display: block; width: 100%; height: clamp(84px, 9vw, 132px);
  transition: transform .5s var(--ease), filter .5s var(--ease);
  transform-origin: bottom;
}
.ro-ladder__step:hover .ro-ladder__bar,
.ro-ladder__step.is-active .ro-ladder__bar { transform: scaleY(1.14); }
.ro-ladder__step:not(.is-active) .ro-ladder__bar { filter: saturate(.72); }
.ro-ladder__meta { display: block; padding-top: .7rem; }
.ro-ladder__meta b {
  display: block; font-family: var(--f-brand); font-weight: 400;
  font-size: clamp(.95rem, 1.5vw, 1.25rem); letter-spacing: -.01em; text-transform: none;
}
.ro-ladder__meta span { display: block; font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; color: var(--ink-soft); margin-top: .2rem; }
.ro-ladder__axis {
  display: flex; justify-content: space-between; margin-top: 1.4rem;
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; color: var(--ink-soft);
  border-top: 1px solid var(--line); padding-top: .8rem;
}
.ro-ladder__read {
  margin-top: clamp(20px, 2.4vw, 32px); max-width: 34em;
  color: var(--ink-soft); line-height: 1.85; min-height: 3.4em;
}
.ro-ladder__read b { color: var(--ink); font-weight: var(--w-medium); }

/* 09 · PINNED SEQUENCE — the object holds while its readings advance */
.ro-pin { position: relative; background: var(--red-deep); color: #fff; }
.ro-pin__inner { display: grid; grid-template-columns: 1.05fr .95fr; align-items: start; }
.ro-pin__media { position: sticky; top: 0; height: 100vh; overflow: hidden; }
.ro-pin__media .ro__img { position: absolute; inset: 0; }
.ro-pin__steps { padding: 0 var(--pad); }
.ro-pin__step {
  min-height: 78vh; display: flex; flex-direction: column; justify-content: center;
  padding: clamp(28px, 4vw, 56px) 0;
  opacity: .3; transition: opacity .6s var(--ease);
}
.ro-pin__step.is-on { opacity: 1; }
.ro-pin__step b {
  display: block; font-family: var(--f-brand); font-weight: 400;
  font-size: clamp(1.8rem, 3.2vw, 2.8rem); line-height: 1.1; margin-bottom: .8rem;
}
.ro-pin__step p { color: rgba(255,255,255,.76); line-height: 1.85; max-width: 26em; }
.ro-pin__step .ro__label { color: rgba(255,255,255,.5); margin-bottom: .9rem; }

/* 15 · THE STANDING NUMBER — one figure, honestly enormous */
.ro-bignum { padding: clamp(56px, 7vw, 110px) var(--pad); display: grid; gap: clamp(20px, 2.6vw, 36px); }
.ro-bignum__fig {
  font-family: var(--f-brand); font-weight: 400;
  font-size: clamp(6rem, 22vw, 17rem); line-height: .82; letter-spacing: -.03em;
  font-variant-numeric: tabular-nums;
}
.ro-bignum__body { display: grid; gap: .9rem; max-width: 36em; }
.ro-bignum__body p { color: var(--ink-soft); line-height: 1.9; }
.ro-red .ro-bignum__body p { color: rgba(255,255,255,.76); }

/* the shape a review will take — an honest wireframe, never a fake review */
.ro-preview {
  border: 1px dashed var(--line); padding: clamp(20px, 2.6vw, 34px);
  display: grid; gap: .8rem; position: relative; background: transparent;
}
.ro-preview__tag {
  position: absolute; top: -.62em; left: clamp(16px, 2vw, 26px);
  background: var(--paper); padding: 0 .6em;
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase; color: var(--ink-soft);
}
.ro-preview__line { height: 10px; background: var(--line); }
.ro-preview__line--short { width: 42%; }
.ro-preview__line--mid { width: 74%; }
.ro-preview__head { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; }
.ro-preview__head b { font-family: var(--f-brand); font-weight: 400; font-size: 1.15rem; }
.ro-preview__foot { display: flex; gap: .6rem; flex-wrap: wrap; margin-top: .4rem; }
.ro-preview__chip {
  font-size: var(--t-label); letter-spacing: .14em; text-transform: uppercase;
  border: 1px solid var(--line); padding: .38em .7em; color: var(--ink-soft);
}

@media (max-width: 860px) {
  .ro-ladder__scale { grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 1px; }
  /* five names in five phone-width columns: the longest one wraps rather
     than leaning on its neighbour */
  .ro-ladder__meta b { font-size: .74rem; line-height: 1.2; overflow-wrap: anywhere; }
  .ro-ladder__meta span { display: none; }
  .ro-pin__inner { grid-template-columns: 1fr; }
  .ro-pin__media { position: relative; height: 62vh; }
  .ro-pin__step { min-height: 0; opacity: 1; padding: clamp(22px, 6vw, 34px) 0; border-bottom: 1px solid var(--line-red); }
  .ro-pin__step:last-child { border-bottom: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .ro-ladder__bar, .ro-pin__step { transition: none; }
  .ro-pin__step { opacity: 1; }
}

/* account pages: the form and what it is for, side by side */
.ro-account { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(28px, 4vw, 72px); align-items: start; }
.ro-account .ro-plain { padding-top: .3rem; }
@media (max-width: 860px) { .ro-account { grid-template-columns: 1fr; gap: 28px; } }

/* ============================================================
   MEDIA PAIRING · no section is text alone.
   Three treatments that alternate so the page never repeats
   its own rhythm: the band (copy on the image), the aside
   (image column against a hairline), the plate (the object
   floated on colour).
   ============================================================ */

/* T1 · BAND — the copy sits on the image */
.ro-band {
  position: relative; display: flex; align-items: flex-end;
  min-height: min(74vh, 660px); overflow: hidden; background: var(--red-deep);
}
.ro-band .ro__img { position: absolute; inset: 0; }
.ro-band::after {
  content: ""; position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(to top, rgba(30,3,8,.82), rgba(30,3,8,.28) 52%, rgba(30,3,8,.04));
}
.ro-band__copy {
  position: relative; z-index: 2; color: #fff;
  padding: clamp(30px, 5vw, 82px) var(--pad);
  max-width: min(40em, 66ch);
}
.ro-band__copy h2 { color: #fff; }
.ro-band__copy p { color: rgba(255,255,255,.82); line-height: 1.9; margin-top: 1rem; }
.ro-band__copy .ro__label { color: rgba(255,255,255,.62); }
.ro-band__copy .ro-fhero__actions { margin-top: 1.7rem; }
.ro-band--tall { min-height: min(88vh, 820px); }
.ro-band--top { align-items: flex-start; }
.ro-band--top::after { background: linear-gradient(to bottom, rgba(30,3,8,.78), rgba(30,3,8,.2) 56%, rgba(30,3,8,0)); }
.ro-band--center { align-items: center; }
.ro-band--center .ro-band__copy { margin-inline: auto; text-align: center; }
.ro-band--center .ro-band__copy .ro-fhero__actions { justify-content: center; }
.ro-band--right .ro-band__copy { margin-left: auto; }
.ro-band--right::after { background: linear-gradient(to left, rgba(30,3,8,.8), rgba(30,3,8,.22) 58%, rgba(30,3,8,0)); }

/* T2 · ASIDE — a tall image against a hairline, copy carries the weight */
.ro-aside { display: grid; grid-template-columns: minmax(0, .4fr) minmax(0, .6fr); }
.ro-aside--flip { grid-template-columns: minmax(0, .6fr) minmax(0, .4fr); }
.ro-aside--flip .ro-aside__media { order: 2; }
.ro-aside__media { position: relative; overflow: hidden; background: var(--paper-2); min-height: 100%; }
.ro-aside__media .ro__img { position: absolute; inset: 0; }
.ro-aside__body {
  padding: clamp(34px, 4.6vw, 86px) var(--pad);
  border-left: 1px solid var(--line);
  display: flex; flex-direction: column; justify-content: center;
}
.ro-aside--flip .ro-aside__body { border-left: 0; border-right: 1px solid var(--line); }
.ro-aside__body > .ro__label { margin-bottom: .9rem; }
.ro-aside__body h2 { margin-bottom: 1rem; }
.ro-aside__body .ro-plain { margin-top: .4rem; }
.ro-aside--red { background: var(--red-deep); color: #fff; }
.ro-aside--red .ro-aside__body { border-color: var(--line-red); }
.ro-aside--red h2 { color: #fff; }
.ro-aside--red .ro-plain p { color: rgba(255,255,255,.78); }
.ro-aside--red .ro-plain strong { color: #fff; }
.ro-aside--red .ro__label { color: rgba(255,255,255,.6); }

/* T3 · PLATE — the object, floated, with the argument beside it */
.ro-plate { display: grid; grid-template-columns: .92fr 1.08fr; background: var(--paper-2); }
.ro-plate--flip .ro-plate__stage { order: 2; }
.ro-plate__stage {
  position: relative; display: grid; place-items: center;
  padding: clamp(34px, 5vw, 90px) clamp(24px, 3vw, 60px);
}
.ro-plate__stage img {
  width: min(64%, 330px); height: auto; position: relative; z-index: 1;
  filter: drop-shadow(0 26px 40px rgba(40,6,14,.24));
}
.ro-plate__disc {
  position: absolute; z-index: 0; width: min(74%, 380px); aspect-ratio: 1;
  background: var(--red-deep); opacity: .07;
}
.ro-plate__body {
  padding: clamp(34px, 4.6vw, 86px) var(--pad);
  display: flex; flex-direction: column; justify-content: center;
  border-left: 1px solid var(--line);
}
.ro-plate--red { background: var(--red-deep); color: #fff; }
.ro-plate--red .ro-plate__body { border-color: var(--line-red); }
.ro-plate--red h2 { color: #fff; }
.ro-plate--red .ro-plain p, .ro-plate--red p { color: rgba(255,255,255,.78); }
.ro-plate--red .ro-plain strong { color: #fff; }
.ro-plate--red .ro-plate__disc { background: #fff; opacity: .06; }

@media (max-width: 860px) {
  .ro-band { min-height: min(64vh, 520px); }
  .ro-aside, .ro-aside--flip, .ro-plate, .ro-plate--flip { grid-template-columns: 1fr; }
  .ro-aside__media { aspect-ratio: 16/10; min-height: 0; }
  .ro-aside--flip .ro-aside__media, .ro-plate--flip .ro-plate__stage { order: -1; }
  .ro-aside__body, .ro-aside--flip .ro-aside__body,
  .ro-plate__body { border: 0; border-top: 1px solid var(--line); }
  .ro-aside--red .ro-aside__body, .ro-plate--red .ro-plate__body { border-top-color: var(--line-red); }
  .ro-plate__stage { padding: clamp(26px, 7vw, 44px); }
}

/* ============================================================
   THE STRIP · unlocked by the owner 2026-08-15.
   Built to the continuous-motion rules: one lap a minute, no
   claims inside it, pauses when touched, gone under reduced
   motion with its words still legible.
   ============================================================ */
.ro-strip {
  position: relative; overflow: hidden;
  background: var(--red-deep); color: #fff;
  border-block: 1px solid rgba(255,255,255,.14);
  padding: clamp(14px, 1.5vw, 22px) 0;
}
.ro-strip__track {
  display: flex; width: max-content;
  animation: ro-strip 64s linear infinite;
}
.ro-strip:hover .ro-strip__track,
.ro-strip:focus-within .ro-strip__track { animation-play-state: paused; }
.ro-strip__set { display: flex; align-items: center; flex: none; }
.ro-strip__set span {
  display: inline-flex; align-items: center; gap: clamp(18px, 2.4vw, 34px);
  padding-inline: clamp(18px, 2.4vw, 34px);
  font-family: var(--f-brand); font-weight: 400;
  font-size: clamp(1.05rem, 1.8vw, 1.6rem);
  letter-spacing: -.005em; white-space: nowrap;
  color: rgba(255,255,255,.92);
}
.ro-strip__set i {
  display: inline-block; width: 5px; height: 5px; flex: none;
  background: currentColor; opacity: .5; transform: rotate(45deg);
}
@keyframes ro-strip { to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) {
  .ro-strip__track { animation: none; }
  .ro-strip__set:nth-child(2) { display: none; }
  .ro-strip__set { flex-wrap: wrap; justify-content: center; }
}

/* the evidence block earns a ground of its own */
.ro-proofband { position: relative; overflow: hidden; }
.ro-proofband::before {
  content: ""; position: absolute; right: -6%; top: 50%; transform: translateY(-50%);
  width: min(38%, 420px); aspect-ratio: 1; border: 1px solid rgba(255,255,255,.14);
  border-radius: 0; pointer-events: none;
}

/* the standing number keeps the object beside it */
.ro-bignum--media { position: relative; }
.ro-bignum__mark {
  position: absolute; right: var(--pad); top: 50%; transform: translateY(-50%);
  width: min(22%, 190px); height: auto; opacity: .95;
  filter: drop-shadow(0 22px 34px rgba(40,6,14,.2));
}
.ro-bignum--media .ro-bignum__body { max-width: min(36em, 62%); }
/* the ladder rests on the family, dimmed to a ground */
.ro-ladder--media { position: relative; overflow: hidden; }
.ro-ladder__ground {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  opacity: .12; filter: grayscale(1); pointer-events: none;
}
.ro-ladder--media > * { position: relative; z-index: 1; }
@media (max-width: 860px) {
  .ro-bignum__mark { position: static; transform: none; width: 34%; margin-top: 1rem; }
  .ro-bignum--media .ro-bignum__body { max-width: none; }
}

/* grounds: an image that carries a section without competing with it */
.ro-band--short { min-height: min(46vh, 420px); }
.ro-empty--media { position: relative; overflow: hidden; }
.ro-empty__ground {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  opacity: .14; filter: grayscale(1); pointer-events: none;
}
.ro-empty--media > *:not(.ro-empty__ground) { position: relative; z-index: 1; }
.ro-proofband__ground {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  opacity: .1; mix-blend-mode: luminosity; pointer-events: none;
}
.ro-proofband > *:not(.ro-proofband__ground) { position: relative; z-index: 1; }
.ro-formside {
  width: 100%; height: clamp(220px, 30vh, 340px); object-fit: cover;
  margin-bottom: clamp(26px, 3.2vw, 44px);
}
.ro-quiz__ground { display: none; }
@media (min-width: 861px) {
  .ro-quiz__ground {
    display: block; width: 100%; height: clamp(240px, 34vh, 420px);
    object-fit: cover; object-position: 50% 30%;
  }
}

/* a row of objects can stand in for a single one */
.ro-plate__stage--row img { width: auto; }
.ro-plate__row { position: relative; z-index: 1; display: flex; align-items: flex-end; gap: clamp(6px, 1vw, 14px); }
.ro-plate__row img {
  width: clamp(38px, 6.2vw, 78px); height: auto;
  filter: drop-shadow(0 18px 26px rgba(0,0,0,.34));
}

/* ============================================================
   COHESION PASS · the small things that separate a house from
   a template: one hairline, one button geometry, one head.
   ============================================================ */

/* section heads speak with one voice everywhere */
.ro-section__head {
  align-items: end;
  padding-bottom: clamp(14px, 1.6vw, 22px);
  border-bottom: 1px solid var(--line);
  margin-bottom: clamp(26px, 3vw, 46px);
}
.ro-red .ro-section__head { border-bottom-color: var(--line-red); }
.ro-section__head > div > p { margin-top: .7rem; max-width: 46ch; line-height: 1.85; }
.ro-section__head .ro__link { padding-bottom: .1rem; white-space: nowrap; }

/* buttons: one geometry, one minimum, never a lonely orphan */
.ro__btn {
  min-height: 52px; display: inline-flex; align-items: center; justify-content: center;
  text-align: center;
}
.ro-fhero__actions { display: flex; align-items: center; gap: clamp(14px, 1.8vw, 26px); flex-wrap: wrap; }
.ro-band__copy .ro__link, .ro-plate__body .ro__link, .ro-aside__body .ro__link { align-self: flex-start; }

/* the label is the brand's smallest unit; keep it exactly one size */
.ro__label { font-size: var(--t-label); letter-spacing: .2em; line-height: 1.5; }

/* headings inside media treatments hold the same scale as section heads */
.ro-band__copy h2, .ro-aside__body h2, .ro-plate__body h2 { font-size: var(--t-section); line-height: 1.06; }

/* prose rows: a hairline between them instead of empty air */
.ro-plain p { padding-bottom: .9rem; border-bottom: 1px solid var(--line); }
.ro-plain p:last-child { padding-bottom: 0; border-bottom: 0; }
.ro-red .ro-plain p, .ro-band__copy .ro-plain p, .ro-aside--red .ro-plain p, .ro-plate--red .ro-plain p { border-bottom-color: var(--line-red); }

/* every media treatment sits flush to the page edges, never floating */
.ro-band, .ro-aside, .ro-plate { margin-inline: 0; }
.ro-band + .ro-band, .ro-aside + .ro-aside, .ro-plate + .ro-plate { border-top: 1px solid var(--line); }

/* fixes found by eye on the first render of the new treatments */

/* the numbered benefits were dark-on-dark inside the red aside */
.ro-aside--red .ro-benefit span { color: rgba(255,255,255,.42); }
.ro-aside--red .ro-benefit h3 { color: #fff; }
.ro-aside--red .ro-benefit p { color: rgba(255,255,255,.74); }
.ro-aside--red .ro-benefit { border-top-color: var(--line-red); }

/* cutouts must never sit on the layout-shift backing card */
.ro-plate__stage img, .ro-plate__row img { background: transparent; }

/* the disc is a ground for the object, so it centres on it */
.ro-plate__disc {
  left: 50%; top: 50%; transform: translate(-50%, -50%);
}
.ro-plate__stage { position: relative; }

/* ============================================================
   FOOTER · stripped to the legal line and the name.
   The wordmark lifts off the floor instead of being cropped by
   it, and the whole block starts closer to the page above.
   ============================================================ */
.ro-footer { padding-top: clamp(22px, 2.6vw, 40px); }
.ro-footer__legal {
  border-top: 0;
  padding: clamp(16px, 1.8vw, 26px) var(--pad);
}
.ro-footer__legal ul { flex-wrap: wrap; }
.ro-footer__wordmark {
  font-family: var(--f-brand);
  font-weight: 400;
  letter-spacing: -.02em;
  margin-bottom: 0;
  padding-bottom: clamp(22px, 3vw, 48px);
  opacity: .16;
  overflow: visible;
  line-height: .9;
}
@media (max-width: 860px) {
  .ro-footer { padding-top: clamp(18px, 5vw, 30px); }
  .ro-footer__legal { gap: .7rem 1.2rem; justify-content: flex-start; }
  .ro-footer__wordmark { padding-bottom: clamp(18px, 6vw, 34px); }
}

/* the one thing we ask for, on its own line above the legal row */
.ro-footer__join {
  display: flex; align-items: end; justify-content: space-between;
  gap: clamp(20px, 4vw, 64px); flex-wrap: wrap;
  padding: clamp(24px, 3vw, 44px) var(--pad) clamp(22px, 2.6vw, 36px);
  border-bottom: 1px solid var(--line-red);
}
.ro-footer__join h3,
.ro-proof b {
  font-family: var(--f-brand); font-weight: 400; text-transform: none;
  letter-spacing: -.015em; font-size: clamp(1.5rem, 2.6vw, 2.2rem); color: #fff;
}
.ro-footer__join p { color: rgba(255,255,255,.7); font-size: .82rem; margin-top: .5rem; max-width: 34ch; }
.ro-footer__join form {
  display: flex; align-items: center; min-width: min(400px, 100%); flex: 0 1 400px;
  border-bottom: 1px solid rgba(255,255,255,.42);
}
.ro-footer__join input {
  flex: 1; background: none; border: 0; color: #fff; padding: .7rem 0;
  font-family: var(--f-ui); font-size: .88rem;
}
.ro-footer__join input::placeholder { color: rgba(255,255,255,.5); }
.ro-footer__join input:focus { outline: none; }
.ro-footer__join button {
  background: none; border: 0; color: #fff; cursor: pointer;
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase;
  padding: .7rem 0 .7rem 1.2rem; min-height: 44px;
}
.ro-footer__join button:hover { opacity: .7; }
@media (max-width: 860px) {
  .ro-footer__join { padding-top: clamp(20px, 6vw, 30px); }
  .ro-footer__join form { flex: 1 1 100%; }
}

/* ============================================================
   RHYTHM · the measurement said it plainly: nine different
   vertical paddings and five different left edges on one
   phone screen. A house has one gutter and one rhythm.
   ============================================================ */
.ro {
  --sp: clamp(44px, 8.5vw, 104px);   /* the section step */
  --sp-tight: clamp(30px, 6vw, 68px);
}

/* one vertical step for every section, whatever its treatment */
.ro-section, .ro-shadetabs, .ro-detail, .ro-worn, .ro-ladder,
.ro-bignum, .ro-quickbuy, .ro-faq, .ro-legal__section, .ro-quiz {
  padding-top: var(--sp); padding-bottom: var(--sp);
}
.ro-section--tight { padding-top: var(--sp-tight); padding-bottom: var(--sp-tight); }
.ro-aside__body, .ro-plate__body, .ro-band__copy {
  padding-top: var(--sp); padding-bottom: var(--sp);
}

/* one gutter for every block of text, whatever its container */
.ro-section, .ro-shadetabs, .ro-detail, .ro-worn, .ro-ladder,
.ro-bignum, .ro-faq, .ro-legal__section, .ro-quiz, .ro-crumbs,
.ro-aside__body, .ro-plate__body, .ro-band__copy, .ro-pagehead, .ro-empty {
  padding-left: var(--pad); padding-right: var(--pad);
}
/* children that used to carry the gutter now inherit it from the section */
.ro-detail > .ro-detail__head, .ro-worn > .ro-worn__title, .ro-worn > .ro-worn__row,
.ro-detail > .ro-detail__grid, .ro-shadetabs > *, .ro-ladder > *, .ro-quiz > * {
  padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0;
}

@media (max-width: 860px) {
  /* on a phone the treatments stack, so their inner padding is the rhythm */
  .ro-aside__body, .ro-plate__body, .ro-band__copy {
    padding-top: var(--sp-tight); padding-bottom: var(--sp-tight);
  }
  /* the shade cards were a 3,000px column; they become a swipeable row */
  .ro-section--center .ro-grid--5, .ro-shades__row {
    display: flex; gap: 10px; overflow-x: auto; scroll-snap-type: x mandatory;
    margin-inline: calc(var(--pad) * -1); padding-inline: var(--pad);
    scrollbar-width: none;
  }
  .ro-section--center .ro-grid--5::-webkit-scrollbar, .ro-shades__row::-webkit-scrollbar { display: none; }
  .ro-section--center .ro-grid--5 > *, .ro-shades__row > * {
    flex: 0 0 62%; scroll-snap-align: start;
  }
  .ro-crumbs { padding-block: .9rem; }
}

/* the wordmark holds both edges at every width without distorting a glyph.
   Fraunces sets "mew" at 1.8675 x its font-size, so the size that spans the
   page is exactly (width - gutters) / 1.8675. */
.ro-footer__wordmark {
  --mark-gutter: clamp(10px, 1.6vw, 26px);
  font-family: var(--f-brand);
  font-weight: 400;
  font-size: calc((100vw - (var(--mark-gutter) * 2)) / 1.8675);
  line-height: .78;
  letter-spacing: 0;
  text-transform: lowercase;
  text-align: center;
  color: #fff;
  opacity: .16;
  padding: 0 var(--mark-gutter) clamp(16px, 2.2vw, 38px);
  margin: 0;
  overflow: hidden;
  user-select: none;
}

/* a band over a pale image needs a real scrim, not a suggestion:
   white type must clear 4.5:1 on the lightest frame we own */
.ro-band::after {
  background: linear-gradient(to top, rgba(28,3,7,.9), rgba(28,3,7,.55) 45%, rgba(28,3,7,.28));
}
.ro-band--top::after { background: linear-gradient(to bottom, rgba(28,3,7,.88), rgba(28,3,7,.5) 52%, rgba(28,3,7,.24)); }
.ro-band--right::after { background: linear-gradient(to left, rgba(28,3,7,.9), rgba(28,3,7,.5) 55%, rgba(28,3,7,.22)); }
.ro-band--center::after { background: radial-gradient(120% 90% at 50% 50%, rgba(28,3,7,.62), rgba(28,3,7,.86)); }
.ro-band__copy p { color: rgba(255,255,255,.9); }
.ro-band__copy .ro-plain p { color: rgba(255,255,255,.88); }

/* the legal row reads as two clean lines on a phone, not five ragged ones */
@media (max-width: 860px) {
  .ro-footer__legal { flex-direction: column; align-items: flex-start; gap: .9rem; }
  .ro-footer__legal ul { order: -1; gap: .8rem 1.1rem; }
  .ro-footer__cur { opacity: .8; }
}

/* a scrim floor under every band: the gradient alone leaves pale frames
   unreadable, which is the difference between editorial and amateur */
.ro-band::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  background: rgba(26,3,7,.46);
}
.ro-band .ro__img { z-index: 0; }
.ro-band::after { z-index: 1; }
.ro-band__copy { z-index: 2; }

/* ============================================================
   TYPE · one rule the whole site obeys.
   Fraunces speaks (anything display-sized or brand-named).
   Geist works (labels, UI, body, prices, tables).
   Nothing else is allowed a third voice.
   ============================================================ */
.ro-header__logo,
.ro-menu__main a,
.ro-quote blockquote,
.ro-statement p,
.mobnav a,
.ro-shade__name,
.ro-shadecard__name,
.ro-pcard__name,
.ro-buy__name,
.cartline__info h4,
.ro-footer__wordmark,
.ro-pin__step b,
.ro-ladder__meta b,
.ro-bignum__fig,
.ro-footer__join h3,
.ro-proof b {
  font-family: var(--f-brand);
  font-weight: 400;
  text-transform: none;
  letter-spacing: -.012em;
}
/* the numerals that mark a sequence stay in the working face: they are
   furniture, not voice */
.ro-prop__num, .ro-benefit span, .ro-chapter__mark b { font-family: var(--f-ui); }

/* ============================================================
   HERO ON A PHONE · one frame, not two.
   Contain-fitting left the image in a box with the headline
   stranded on cream below it, which read as two broken
   sections. On a phone the picture takes the screen and the
   headline sits on it, the way the poster was designed.
   ============================================================ */
@media (max-width: 860px) {
  .ro-fhero--model {
    display: flex;                 /* an older mobile rule reset this to block,
                                      which is why flex-end never landed */
    min-height: 88vh;
    align-items: flex-end;
    background: var(--red-deep);
  }
  /* the price line was hidden on phones back when it collided with the glove;
     on the scrim it reads, so it comes back */
  .ro-fhero--model .ro-fhero__copy > .ro__label { display: block; }
  .ro-fhero--model .ro__img {
    object-fit: cover;
    object-position: 52% 12%;
  }
  .ro-fhero--model::after {
    content: ""; position: absolute; inset: 0; z-index: 1;
    background: linear-gradient(to top, rgba(26,3,7,.78), rgba(26,3,7,.22) 46%, rgba(26,3,7,0) 72%);
  }
  .ro-fhero--model .ro-fhero__copy {
    position: relative; z-index: 2;
    max-width: none;
    padding: 0 var(--pad) clamp(30px, 8vw, 56px);
  }
  .ro-fhero--model .ro-fhero__copy h1 { color: #fff; font-size: clamp(2.9rem, 13vw, 4rem); }
  .ro-fhero--model .ro-fhero__price { color: rgba(255,255,255,.82); margin-top: 1rem; }
}

/* ============================================================
   TRAITS · three marks, not three bullets. One icon family,
   one stroke, 44px of touch each, and they arrive in sequence.
   ============================================================ */
.ro-traits {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(8px, 1.6vw, 18px);
  margin-top: clamp(18px, 2.2vw, 26px);
  padding-top: clamp(16px, 2vw, 22px);
  border-top: 1px solid var(--line);
}
.ro-trait {
  display: flex; flex-direction: column; align-items: flex-start; gap: .55rem;
  min-height: 44px;
}
.ro-trait svg {
  width: 22px; height: 22px; flex: none; color: var(--red);
  transition: transform .3s var(--ease);
}
.ro-trait:hover svg { transform: translateY(-2px); }
.ro-trait span { display: block; font-size: .68rem; line-height: 1.45; color: var(--ink-soft); }
.ro-trait b {
  display: block; color: var(--ink); font-weight: var(--w-medium);
  font-size: .72rem; letter-spacing: .04em; margin-bottom: .12rem;
}
.ro-red .ro-traits, .ro-band__copy .ro-traits { border-top-color: var(--line-red); }
.ro-red .ro-trait svg { color: #fff; }
.ro-red .ro-trait b { color: #fff; }
.ro-red .ro-trait span { color: rgba(255,255,255,.72); }
@media (max-width: 420px) {
  .ro-traits { gap: 6px; }
  .ro-trait b { font-size: .66rem; }
  .ro-trait span { font-size: .62rem; }
}

/* ============================================================
   ALIGNMENT · on a phone a section head is one left-aligned
   column. The trailing link used to float right, which read as
   a stray line hanging off the paragraph.
   ============================================================ */
@media (max-width: 860px) {
  .ro-section__head, .ro-detail__head {
    flex-direction: column; align-items: flex-start; gap: .9rem;
  }
  .ro-section__head > div, .ro-detail__head > div { width: 100%; }
  .ro-section__head .ro__link, .ro-detail__head .ro__link { align-self: flex-start; }
  .ro-section--center .ro-section__head { align-items: center; }
  .ro-section--center .ro-section__head .ro__link { align-self: center; }
}

/* ============================================================
   SHADE TABS ON A PHONE · the row was five cramped chips with
   a boxed cutout. Real targets, a clear selected state, and the
   object floats free of any backing card.
   ============================================================ */
.ro-shadetabs__tube, .ro-shade__tube, .ro-pcard__tube { background: transparent; }
@media (max-width: 860px) {
  .ro-shadetabs__bar {
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 6px; margin-top: clamp(20px, 5vw, 30px);
  }
  .ro-shadetabs__bar .ro-swatch { min-height: 56px; gap: .4rem; }
  .ro-shadetabs__bar .ro-swatch i { height: 34px; }
  .ro-shadetabs__bar .ro-swatch span {
    font-size: .5rem; letter-spacing: .06em; line-height: 1.2;
    padding-bottom: .2rem; border-bottom: 1px solid transparent;
  }
  .ro-shadetabs__bar .ro-swatch.is-active span { border-bottom-color: currentColor; background: none; }
  .ro-shadetabs__panel { gap: clamp(18px, 5vw, 26px); margin-top: clamp(22px, 6vw, 34px); }
  .ro-shadetabs__media { aspect-ratio: 5/4; }
  .ro-shadetabs__tube { width: 22%; right: 5%; bottom: 6%; }
  .ro-shadetabs__body h3 { font-size: clamp(2.2rem, 11vw, 3rem); margin-top: .2rem; }
  .ro-shadetabs__note { margin: .9rem 0 1.5rem; }
  .ro-shadetabs__body .ro__btn { width: 100%; }
}

/* cutouts never sit on the layout-shift backing card. `.ro img` is (0,1,1),
   so the exception has to carry two classes to outrank it. */
.ro .ro-shadetabs__tube, .ro .ro-shade__tube, .ro .ro-pcard__tube,
.ro .ro-plate__stage img, .ro .ro-plate__row img, .ro .ro-bignum__mark,
.ro .ro-quickbuy__stage img { background: transparent; }

/* the selected shade is marked by its ring and its label, not by a white slab */
.ro-swatch.is-active { background: none; border-color: transparent; }

/* ============================================================
   INTERACTION · one motion language.
   Enter 220ms ease-out, press 120ms, nothing animates layout,
   every state is visible without hover, and the whole layer
   disappears under prefers-reduced-motion.
   ============================================================ */
.ro { --t-fast: 140ms; --t-base: 220ms; --t-slow: 320ms; }

/* buttons: a fill that sweeps from the edge you came from, and a real press */
.ro__btn {
  position: relative; overflow: hidden; isolation: isolate;
  transition: color var(--t-base) var(--ease), border-color var(--t-base) var(--ease),
              transform var(--t-fast) var(--ease);
}
.ro__btn::before {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background: var(--paper);
  transform: scaleY(0); transform-origin: bottom;
  transition: transform var(--t-base) var(--ease);
}
.ro__btn:hover { color: var(--red); }
.ro__btn:hover::before { transform: scaleY(1); transform-origin: top; }
.ro__btn:active { transform: scale(.985); }
.ro__btn--outline-light::before { background: #fff; }
.ro__btn--outline-light:hover { color: var(--red-deep); }

/* links: the rule draws instead of blinking */
.ro__link {
  position: relative; display: inline-block;
  border-bottom: 0; padding-bottom: .18em;
  transition: color var(--t-base) var(--ease);
}
.ro__link::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
  background: currentColor; transform: scaleX(1); transform-origin: right;
  transition: transform var(--t-base) var(--ease);
}
.ro__link:hover::after { transform: scaleX(0); transform-origin: right; }
.ro__link:hover { opacity: .78; }

/* focus is never removed, only made ours */
.ro a:focus-visible, .ro button:focus-visible, .ro input:focus-visible, .ro [tabindex]:focus-visible {
  outline: 2px solid var(--red); outline-offset: 3px; border-radius: 0;
}
.ro-red a:focus-visible, .ro-red button:focus-visible, .ro-band__copy a:focus-visible { outline-color: #fff; }

/* cards and swatches answer a press the way an object would */
.ro-pcard a, .ro-swatch, .ro-thumb, .ro-ladder__step { transition: transform var(--t-fast) var(--ease); }
.ro-pcard a:active, .ro-swatch:active, .ro-thumb:active, .ro-ladder__step:active { transform: scale(.99); }

/* text arrives in lines, images arrive from behind a curtain */
.js .reveal-line { overflow: hidden; }
.js .reveal-line > span {
  display: block;
  transform: translateY(110%);
  transition: transform var(--t-slow) var(--ease);
  transition-delay: var(--reveal-delay, 0s);
}
.js .reveal-line.is-in > span { transform: none; }
.js .reveal-img { overflow: hidden; }
.js .reveal-img > img, .js .reveal-img > .ro__img {
  transform: scale(1.06);
  transition: transform 900ms var(--ease), opacity 600ms var(--ease);
  opacity: 0;
}
.js .reveal-img.is-in > img, .js .reveal-img.is-in > .ro__img { transform: none; opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .ro__btn, .ro__btn::before, .ro__link::after,
  .js .reveal-line > span, .js .reveal-img > img, .js .reveal-img > .ro__img {
    transition: none !important; transform: none !important; opacity: 1 !important;
  }
}

/* touch targets: chrome links get real hit area without moving anything.
   Prose links stay inline; the guideline is for controls, not sentences. */
@media (max-width: 860px) {
  .ro-footer__legal ul a, .ro-crumbs a, .ro-header__nav a, .ro-header__util a,
  .ro-header__util button, .ro-menu__side a, .ro-jump a {
    display: inline-flex; align-items: center; min-height: 44px;
  }
  .ro-footer__legal ul { gap: .2rem 1.4rem; }
  .ro-thumb { min-width: 56px; min-height: 56px; }
  .ro-ba__handle { width: 52px; height: 52px; }
}

/* the 44px hit areas must live inside the header, not stretch it */
@media (max-width: 860px) {
  .ro-header { padding-block: 0; min-height: 58px; align-items: center; }
  .ro-header__nav a, .ro-header__util a, .ro-header__util button { min-height: 44px; }
}

/* ============================================================
   AUDIT FIXES · found by looking, confirmed by measuring.
   ============================================================ */

/* links and lead copy inherit their ground instead of being told a colour
   inline, which is how three of them ended up white on white */
.ro-red .ro__link, .ro-band__copy .ro__link,
.ro-aside--red .ro__link, .ro-plate--red .ro__link { color: #fff; }
.ro-red .ro-section__head p, .ro-aside--red .ro-section__head p,
.ro-plate--red .ro-section__head p { color: rgba(255,255,255,.74); }

/* shade descriptors were ink-soft on deep red: 2.08:1 */
.ro-red .ro-pcard__desc, .ro-band .ro-pcard__desc { color: rgba(255,255,255,.72); }
.ro-red .ro-pcard__name, .ro-red .ro-pcard__price { color: #fff; }

/* the set page's contents cards showed cutouts on opaque plates */
.ro .ro-pcard__media--object img, .ro .ro-pcard__media--object .ro__img { background: transparent; }
.ro-pcard__media--object { background: var(--paper-2); }

/* the five must all be in frame on the page named after them */
.ro-gallery__stage .ro__img[src*="family-"] { object-fit: contain; background: var(--paper-2); }

/* the menu control measured 25x6: a line pair with no box around it */
.ro-header__menu { min-height: 44px; padding-inline-end: .2rem; }
.ro-header__bag, .ro-header__util button { min-width: 44px; min-height: 44px; justify-content: center; }

/* the closing pair sat on the same top edge, so the link read 16px high */
.ro-fhero__actions { align-items: center; }
.ro-fhero__actions .ro__link { display: inline-flex; align-items: center; min-height: 52px; }

/* measure: body copy ran to 101 characters. Prose caps, heads cap wider. */
.ro-plain p, .ro-band__copy p, .ro-aside__body > p, .ro-plate__body > p { max-width: 62ch; }
.ro-section__head > div > p, .ro-detail__head p { max-width: 58ch; }
.ro-chapter__body p { max-width: 64ch; }

/* the contents cards had rules that ran past their last line into nothing */
.ro-pcard { display: flex; flex-direction: column; }
.ro-pcard__body { flex: 1; align-items: start; }

/* "The object" put two near-identical whites side by side: one ground, one seam */
.ro-aside--flip .ro-aside__media { background: var(--paper-2); }
.ro-aside__body { background: var(--paper); }

/* the quiz answers broke at different heights because one label wrapped */
.ro-quiz__opt { display: flex; flex-direction: column; justify-content: flex-start; min-height: 100%; }
.ro-quiz__opt b { display: block; min-height: 2.6em; }
.ro-quiz__step > div, .ro-quiz__opts { align-items: stretch; }

/* the newsletter line orphaned its last word in a 350px column */
.ro-footer__join p { max-width: 42ch; }
@media (min-width: 861px) { .ro-footer__join form { flex: 0 1 440px; } }

/* ============================================================
   PAIRING · a phone reads rows, not columns of single lines.
   Anything that was label-over-value now sits side by side, and
   the vertical step tightens so a section fits the thumb.
   ============================================================ */
.ro-shadetabs__line {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 1rem; border-bottom: 1px solid var(--line-red); padding-bottom: .7rem;
}
.ro-shadetabs__line h3 { margin: 0; }
.ro-shadetabs__line .ro__label { color: rgba(255,255,255,.66); white-space: nowrap; }

@media (max-width: 860px) {
  .ro { --sp: clamp(34px, 7vw, 60px); --sp-tight: clamp(26px, 5.5vw, 44px); }

  /* headings stop breaking themselves in a narrow column */
  .ro-section__head h2 br, .ro-aside__body h2 br, .ro-plate__body h2 br,
  .ro-band__copy h2 br, .ro-worn__title h2 br, .ro-setsplit__body h2 br { display: none; }

  /* the numbered benefit becomes a row: mark, then the point */
  .ro-benefit { display: grid; grid-template-columns: auto 1fr; gap: .1rem .9rem; align-items: baseline; }
  .ro-benefit span { grid-row: span 2; }
  .ro-benefit h3 { margin: 0; }

  /* evidence reads as figure then meaning, on one line */
  .ro-proof > div { display: grid; grid-template-columns: auto 1fr; gap: .2rem .9rem; align-items: baseline; }
  .ro-proof b { font-size: 1.5rem; }
  .ro-proof span { font-size: .78rem; }

  /* spec rows sit across, not stacked */
  .ro-spec__row { display: grid; grid-template-columns: 40% 1fr; gap: .2rem 1rem; align-items: baseline; }
  .ro-spec__row dt { margin: 0; }

  /* prose rows lead with their bold term inline (already inline) but tighter */
  .ro-plain { gap: .7rem; }
  .ro-plain p { padding-bottom: .7rem; line-height: 1.7; }

  /* value props: number beside the point */
  .ro-prop { grid-template-columns: auto 1fr; align-items: baseline; gap: .8rem; }

  /* section heads lose a step of air */
  .ro-section__head { margin-bottom: clamp(16px, 4vw, 26px); padding-bottom: .8rem; }
  .ro-section__head > div > p { margin-top: .5rem; }
}

/* ============================================================
   PLATES · the campaign is browsed, not scrolled past.
   A snapping deck with a counter and a progress rail, so on a
   phone it is one decisive gesture instead of five stacked jpgs.
   ============================================================ */
.ro-plates { padding: var(--sp) 0; background: var(--paper-2); overflow: hidden; }
.ro-plates__head {
  display: flex; align-items: end; justify-content: space-between; gap: 1.6rem;
  padding: 0 var(--pad) clamp(18px, 2.4vw, 30px);
}
.ro-plates__head p { color: var(--ink-soft); line-height: 1.8; max-width: 46ch; margin-top: .6rem; }
.ro-plates__nav { display: flex; align-items: center; gap: .5rem; flex: none; }
.ro-plates__count {
  display: inline-flex; align-items: baseline; gap: .35rem; margin-right: .6rem;
  font-size: var(--t-label); letter-spacing: .18em; color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
}
.ro-plates__count b { color: var(--ink); font-family: var(--f-brand); font-size: 1.05rem; letter-spacing: 0; }
.ro-plates__count i { width: 14px; height: 1px; background: var(--line); display: inline-block; }
.ro-plates__arrow {
  width: 44px; height: 44px; display: grid; place-items: center;
  border: 1px solid var(--line); background: none; color: var(--ink); cursor: pointer;
  transition: background var(--t-base) var(--ease), color var(--t-base) var(--ease), transform var(--t-fast);
}
.ro-plates__arrow svg { width: 18px; height: 18px; }
.ro-plates__arrow:hover { background: var(--ink); color: var(--paper); }
.ro-plates__arrow:active { transform: scale(.96); }
.ro-plates__arrow[disabled] { opacity: .3; pointer-events: none; }
.ro-plates__track {
  display: flex; gap: clamp(10px, 1.4vw, 20px);
  overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none;
  padding-inline: var(--pad); scroll-padding-inline: var(--pad);
}
.ro-plates__track::-webkit-scrollbar { display: none; }
.ro-plates__slide {
  flex: 0 0 clamp(240px, 30vw, 420px); scroll-snap-align: start; margin: 0;
  position: relative;
}
.ro-plates__slide img {
  width: 100%; aspect-ratio: 3/4; object-fit: cover; display: block;
  transition: transform 700ms var(--ease);
}
.ro-plates__slide:hover img { transform: scale(1.02); }
.ro-plates__slide figcaption {
  display: flex; align-items: baseline; gap: .6rem; padding-top: .7rem;
  font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase; color: var(--ink-soft);
}
.ro-plates__slide figcaption b { color: var(--ink); font-weight: var(--w-medium); }
.ro-plates__rail {
  height: 1px; background: var(--line); margin: clamp(18px, 2.4vw, 30px) var(--pad) 0;
  position: relative;
}
.ro-plates__rail i {
  position: absolute; inset: 0 auto 0 0; height: 1px; background: var(--ink);
  width: 20%; transition: transform 300ms var(--ease), width 300ms var(--ease);
}
@media (max-width: 860px) {
  .ro-plates__head { flex-direction: column; align-items: flex-start; gap: 1rem; }
  .ro-plates__slide { flex: 0 0 76%; }
  .ro-plates__nav { align-self: flex-end; }
}

/* the plate's ground was reading as a stray rectangle beside the object */
@media (max-width: 860px) {
  .ro-plate__stage { padding: clamp(30px, 9vw, 48px) var(--pad); }
  .ro-plate__stage img { width: min(52%, 210px); }
  .ro-plate__disc { width: min(60%, 240px); opacity: .05; }
  .ro-plate__row img { width: clamp(30px, 11vw, 52px); }
}

/* the bag's count rode outside the viewport once the button reached 44px:
   the badge belongs inside the control's own box */
.ro-header__count { top: 4px; right: 4px; }
@media (max-width: 860px) {
  .ro-header__util { gap: .8rem; }
  .ro-header__bag { min-width: 40px; margin-right: -6px; }
  .ro-header__count { top: 2px; right: 0; }
}
/* the last 3px: the bag's negative margin still reached past the gutter */
@media (max-width: 860px) {
  .ro-header__bag { margin-right: 0; min-width: 36px; }
  .ro-header { padding-inline: var(--pad); overflow: clip; }
}

/* the closing section carries the page's last action */
.ro-worn__actions {
  display: flex; align-items: center; gap: clamp(14px, 2vw, 26px); flex-wrap: wrap;
  padding: 0 0 clamp(22px, 3vw, 40px);
}
.ro-worn__actions .ro__link { color: #fff; }
@media (max-width: 860px) { .ro-worn__actions { padding-bottom: clamp(18px, 5vw, 28px); } }

/* ============================================================
   QUIET UI · four devices that make the site feel attended to
   without raising its voice: a progress hairline, a live index,
   a fact row, and a gallery counter.
   ============================================================ */

/* 1 · the reading line — 2px of brand at the very top */
.ro-progress {
  position: fixed; top: 0; left: 0; right: 0; height: 2px; z-index: 200;
  background: transparent; pointer-events: none;
}
.ro-progress i {
  display: block; height: 100%; width: 100%; background: var(--red);
  transform: scaleX(0); transform-origin: left;
  transition: transform 90ms linear;
}
.ro-red .ro-progress i { background: #fff; }

/* 2 · the jump rail knows where you are */
.ro-jump a { position: relative; transition: color var(--t-base) var(--ease); }
.ro-jump a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1px;
  background: currentColor; transform: scaleX(0); transform-origin: left;
  transition: transform var(--t-base) var(--ease);
}
.ro-jump a.is-here { color: var(--ink); }
.ro-jump a.is-here::after { transform: scaleX(1); }

/* 3 · facts at a glance — an icon row that replaces a paragraph */
.ro-facts {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(10px, 1.6vw, 22px);
  padding: clamp(18px, 2.4vw, 30px) 0;
  border-block: 1px solid var(--line);
}
.ro-red .ro-facts, .ro-band__copy .ro-facts { border-block-color: var(--line-red); }
.ro-fact { display: flex; flex-direction: column; gap: .5rem; }
.ro-fact svg { width: 20px; height: 20px; color: var(--red); }
.ro-red .ro-fact svg { color: #fff; }
.ro-fact b {
  font-size: .74rem; font-weight: var(--w-medium); color: var(--ink);
  letter-spacing: .02em;
}
.ro-fact span { font-size: .64rem; color: var(--ink-soft); line-height: 1.4; }
.ro-red .ro-fact b { color: #fff; }
.ro-red .ro-fact span { color: rgba(255,255,255,.7); }
@media (max-width: 520px) {
  .ro-facts { grid-template-columns: repeat(2, 1fr); gap: 14px 10px; }
}

/* 4 · the gallery says which frame you are on */
.ro-gallery__counter {
  position: absolute; left: var(--pad); bottom: 1rem; z-index: 3;
  display: inline-flex; align-items: baseline; gap: .3rem;
  font-size: var(--t-label); letter-spacing: .18em; color: var(--ink-soft);
  background: rgba(255,255,255,.86); padding: .4em .7em;
  font-variant-numeric: tabular-nums;
}
.ro-gallery__counter b { color: var(--ink); font-family: var(--f-brand); font-size: 1rem; letter-spacing: 0; }
@media (prefers-reduced-motion: reduce) { .ro-progress i { transition: none; } }

/* the set band: the copy sits high on the left of the frame, and the image
   keeps its own crop rather than being cut in half by a panel */

@media (max-width: 860px) {
      }

/* ============================================================
   THE COMPARISON · the copy leads, the action is a headline in
   its own right rather than a tag hung off the corner.
   ============================================================ */
.ro-compare-sec__head {
  display: grid; gap: .9rem; justify-items: start;
  padding-bottom: clamp(20px, 2.6vw, 34px);
  max-width: 62ch;
}
.ro-compare-sec__head h2 { font-size: var(--t-section); }
.ro-compare-sec__head p { color: var(--ink-soft); line-height: 1.85; }
.ro-headlink {
  display: inline-flex; align-items: center; gap: .7rem;
  font-family: var(--f-brand); font-weight: 400;
  font-size: clamp(1.4rem, 2.6vw, 2.1rem); letter-spacing: -.015em;
  color: var(--ink); text-decoration: none; margin-top: .3rem;
  min-height: 48px;
}
.ro-headlink span { position: relative; }
.ro-headlink span::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: .08em; height: 1px;
  background: currentColor; transform: scaleX(1); transform-origin: left;
  transition: transform var(--t-base) var(--ease);
}
.ro-headlink svg {
  width: 22px; height: 22px; flex: none; color: var(--red);
  transition: transform var(--t-base) var(--ease);
}
.ro-headlink:hover span::after { transform: scaleX(0); transform-origin: right; }
.ro-headlink:hover svg { transform: translateX(5px); }
.ro-headlink:active { transform: scale(.99); }
.ro-red .ro-headlink, .ro-band__copy .ro-headlink { color: #fff; }
.ro-red .ro-headlink svg, .ro-band__copy .ro-headlink svg { color: #fff; }
@media (max-width: 860px) {
  .ro-compare-sec__head { gap: .7rem; padding-bottom: clamp(16px, 4.5vw, 24px); }
  .ro-headlink { font-size: clamp(1.3rem, 6.4vw, 1.7rem); }
}

/* ============================================================
   THE SET · the photograph carries no wash. The title stands on
   it, and everything that has to be read sits underneath on
   paper, where reading belongs.
   ============================================================ */
.ro-setband { padding-bottom: var(--sp); background: var(--paper); }
.ro-setband__frame {
  position: relative; overflow: hidden;
  aspect-ratio: 1672 / 941;   /* the image's own proportion: nothing is cut */
  height: auto;
}
.ro-setband__frame .ro__img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: contain; object-position: 50% 50%;
  background: #fff;
}
/* the only truly empty width in this photograph is the shelf, so the title
   stands on it: centred, legible, and nothing is cropped to make room */
.ro-setband__center {
  position: absolute; inset: auto 0 0 0; z-index: 2;
  display: grid; justify-items: center; text-align: center;
  gap: clamp(6px, 1vw, 12px);
  padding: 0 var(--pad) clamp(14px, 3.2%, 44px);
}
.ro-setband__eyebrow {
  font-size: var(--t-label); letter-spacing: .28em; text-transform: uppercase;
  color: var(--ink-soft);
}
.ro-setband__title {
  margin: 0; color: var(--ink);
  font-size: clamp(2.3rem, 6vw, 5rem); line-height: .98;
  mix-blend-mode: multiply;
}
.ro-setband__center .ro__link { margin-top: clamp(4px, .8vw, 10px); }
.ro-setband__foot {
  display: grid; gap: clamp(16px, 2.2vw, 26px);
  padding: clamp(22px, 3vw, 40px) var(--pad) 0;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
}
.ro-setband__foot > p { grid-column: 1; color: var(--ink-soft); line-height: 1.8; max-width: 40ch; }
.ro-setband__meta {
  grid-column: 1; display: flex; gap: clamp(20px, 3vw, 48px); flex-wrap: wrap;
  padding-top: clamp(14px, 1.8vw, 22px); border-top: 1px solid var(--line);
}
.ro-setband__meta span { display: grid; gap: .15rem; font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: var(--ink-soft); }
.ro-setband__meta b {
  font-family: var(--f-brand); font-weight: 400; font-size: clamp(1.1rem, 1.8vw, 1.5rem);
  letter-spacing: -.01em; text-transform: none; color: var(--ink);
}
.ro-setband__foot .ro-headlink { grid-column: 2; grid-row: 1 / span 3; align-self: end; }
@media (max-width: 860px) {
  .ro-setband__foot { grid-template-columns: 1fr; gap: 14px; }
  .ro-setband__foot .ro-headlink { grid-column: 1; grid-row: auto; margin-top: .2rem; }
  .ro-setband__meta { gap: 18px 26px; }
}

/* ============================================================
   THE STORY PAGE · an opening frame, a rail that follows, and
   panels that open on a press instead of walls of prose.
   ============================================================ */

/* the opening: the campaign frame carries the title */
.ro-storyhero { position: relative; height: min(74vh, 700px); overflow: hidden; background: var(--red-deep); }
.ro-storyhero .ro__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 34%; }
.ro-storyhero::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(24,3,7,.8), rgba(24,3,7,.2) 55%, rgba(24,3,7,.05)); }
.ro-storyhero__copy { position: absolute; inset: auto 0 0 0; z-index: 2; padding: 0 var(--pad) clamp(26px, 4vw, 60px); color: #fff; }
.ro-storyhero__copy h1 { color: #fff; font-size: clamp(2.6rem, 6vw, 5rem); line-height: 1; }
.ro-storyhero__copy p { color: rgba(255,255,255,.84); margin-top: .9rem; max-width: 44ch; line-height: 1.8; }
.ro-storyhero__meta { display: flex; gap: clamp(18px, 3vw, 40px); margin-top: clamp(18px, 2.4vw, 28px); flex-wrap: wrap; }
.ro-storyhero__meta span { display: grid; gap: .1rem; font-size: .6rem; letter-spacing: .18em; text-transform: uppercase; color: rgba(255,255,255,.6); }
.ro-storyhero__meta b { font-family: var(--f-brand); font-weight: 400; font-size: 1.15rem; letter-spacing: 0; text-transform: none; color: #fff; }

/* the rail sticks under the header and marks where you are */
.ro-jump {
  position: sticky; top: var(--header-h, 58px); z-index: 40;
  display: flex; gap: clamp(14px, 2.4vw, 34px); overflow-x: auto; scrollbar-width: none;
  padding: .9rem var(--pad); background: var(--paper);
  border-bottom: 1px solid var(--line);
  font-size: var(--t-label); letter-spacing: .18em; text-transform: uppercase;
}
.ro-jump::-webkit-scrollbar { display: none; }
.ro-jump a { color: var(--ink-soft); white-space: nowrap; text-decoration: none; }

/* panels that open on a press */
.ro-acc { border-top: 1px solid var(--line); }
.ro-red .ro-acc, .ro-acc--red { border-top-color: var(--line-red); }
.ro-acc__item { border-bottom: 1px solid var(--line); }
.ro-red .ro-acc__item, .ro-acc--red .ro-acc__item { border-bottom-color: var(--line-red); }
.ro-acc__q {
  width: 100%; display: flex; align-items: center; gap: 1rem;
  padding: clamp(15px, 1.8vw, 22px) 0; background: none; border: 0; cursor: pointer;
  text-align: left; color: inherit; min-height: 56px;
}
.ro-acc__ico { width: 22px; height: 22px; flex: none; color: var(--red); }
.ro-red .ro-acc__ico, .ro-acc--red .ro-acc__ico { color: #fff; }
.ro-acc__label { flex: 1; font-family: var(--f-brand); font-weight: 400; font-size: clamp(1.05rem, 1.9vw, 1.4rem); letter-spacing: -.01em; }
.ro-acc__sign { position: relative; width: 16px; height: 16px; flex: none; }
.ro-acc__sign::before, .ro-acc__sign::after {
  content: ""; position: absolute; inset: 50% 0 auto 0; height: 1px; background: currentColor;
  transition: transform var(--t-base) var(--ease);
}
.ro-acc__sign::after { transform: rotate(90deg); }
.ro-acc__q[aria-expanded="true"] .ro-acc__sign::after { transform: rotate(0deg); }
.ro-acc__a {
  overflow: hidden; height: 0;
  transition: height var(--t-slow) var(--ease);
}
.ro-acc__a > div { padding: 0 0 clamp(16px, 2vw, 24px) calc(22px + 1rem); }
.ro-acc__a p { color: var(--ink-soft); line-height: 1.85; max-width: 62ch; }
.ro-red .ro-acc__a p, .ro-acc--red .ro-acc__a p { color: rgba(255,255,255,.78); }
.ro-acc__q:hover .ro-acc__label { opacity: .75; }
@media (prefers-reduced-motion: reduce) { .ro-acc__a { transition: none; } }
@media (max-width: 860px) {
  .ro-acc__a > div { padding-left: 0; }
  .ro-storyhero { height: 68vh; }
}

/* ============================================================
   MOBILE PROPORTION · a phone section should be a landscape
   frame with its words on or beside it, not a tall column you
   fall through. Every full-height treatment is capped.
   ============================================================ */
@media (max-width: 860px) {
  .ro-band, .ro-band--tall { min-height: 0; }
  .ro-band { display: block; }
  .ro-band .ro__img { position: relative; width: 100%; height: 46vh; object-fit: cover; }
  .ro-band::before, .ro-band::after { inset: 0 0 auto 0; height: 46vh; }
  .ro-band__copy {
    position: relative; color: var(--ink);
    padding: clamp(18px, 5vw, 26px) var(--pad) clamp(24px, 6vw, 34px);
    background: var(--paper);
  }
  .ro-band__copy h2 { color: var(--ink); }
  .ro-band__copy p, .ro-band__copy .ro-plain p { color: var(--ink-soft); }
  .ro-band__copy .ro-plain strong { color: var(--ink); }
  .ro-band__copy .ro__link { color: var(--ink); }
  .ro-band--center .ro-band__copy { text-align: left; margin-inline: 0; }
  .ro-band--center .ro-band__copy .ro-fhero__actions { justify-content: flex-start; }
  .ro-band__copy .ro__btn--outline-light { border-color: var(--red); color: var(--red); }
  .ro-band__copy .ro__btn--outline-light:hover { background: var(--red); color: #fff; }

  /* the treatments that already stack keep a landscape frame */
  .ro-aside__media { aspect-ratio: 16/10; }
  .ro-plate__stage { padding-block: clamp(26px, 7vw, 38px); }
  .ro-storyhero { height: 56vh; }
  .ro-fhero--model { min-height: 82vh; }
  .ro-pin__media { height: 46vh; }
  .ro-shadetabs__media { aspect-ratio: 5/4; }
  .ro-ba { aspect-ratio: 4/5; }
}

/* ============================================================
   LINE BREAKS · short sentences must not split into two ragged
   lines. Browsers get told to balance headings and keep prose
   from orphaning its last word.
   ============================================================ */
h1, h2, h3, .ro-buy__name, .ro-setband__title, .ro-storyhero__copy h1 { text-wrap: balance; }
p, .ro-plain p, .ro-shadetabs__note, .ro-note, .ro-fact span, .ro-trait span { text-wrap: pretty; }
.ro-shadetabs__note { max-width: 46ch; }

/* the story opens on a frame with no wash: the words sit under it on paper */
.ro-storyhero { height: auto; background: var(--paper); }
.ro-storyhero::after { content: none; }
.ro-storyhero__frame { position: relative; overflow: hidden; height: min(62vh, 620px); }
.ro-storyhero__frame .ro__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 30%; }
.ro-storyhero__copy {
  position: static; padding: clamp(22px, 3vw, 44px) var(--pad) clamp(20px, 2.6vw, 34px);
  color: var(--ink);
}
.ro-storyhero__copy h1 { color: var(--ink); }
.ro-storyhero__copy p { color: var(--ink-soft); }
.ro-storyhero__meta span { color: var(--ink-soft); }
.ro-storyhero__meta b { color: var(--ink); }
@media (max-width: 860px) { .ro-storyhero__frame { height: 46vh; } }

/* the menu's own search sits at the top of the drawer */
.ro-menu__search {
  display: flex; align-items: center; gap: .8rem;
  border-bottom: 1px solid var(--line); padding-bottom: .9rem; margin-bottom: clamp(22px, 3vw, 38px);
}
.ro-menu__search svg { width: 20px; height: 20px; color: var(--ink-soft); flex: none; }
.ro-menu__search input {
  flex: 1; border: 0; background: none; font-family: var(--f-ui); font-size: 1rem;
  color: var(--ink); padding: .5rem 0; min-height: 44px;
}
.ro-menu__search input:focus { outline: none; }
.ro-menu__search input::placeholder { color: var(--ink-soft); }

/* ============================================================
   THE MENU · a room, not a list. Destinations carry the weight,
   the five are shown rather than named, and one frame gives the
   drawer something to look at. Items arrive in sequence.
   ============================================================ */
.ro-menu {
  display: grid; gap: clamp(26px, 3.4vw, 44px);
  align-content: start;
  padding: clamp(10px, 2vw, 26px) var(--dpad, 1.5rem) clamp(30px, 4vw, 56px);
}
.ro-menu__main { display: grid; }
.ro-menu__main a {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: clamp(11px, 1.4vw, 16px) 0;
  border-bottom: 1px solid var(--line);
  font-family: var(--f-brand); font-weight: 400; text-transform: lowercase;
  font-size: clamp(1.7rem, 5.6vw, 2.6rem); letter-spacing: -.015em; line-height: 1.1;
  color: var(--ink); text-decoration: none;
  transition: color var(--t-base) var(--ease), padding-left var(--t-base) var(--ease);
}
.ro-menu__main a:first-child { border-top: 1px solid var(--line); }
.ro-menu__main a:hover { color: var(--red); padding-left: .35rem; }
.ro-menu__go {
  width: 22px; height: 8px; flex: none; position: relative; opacity: .32;
  transition: opacity var(--t-base) var(--ease), transform var(--t-base) var(--ease);
}
.ro-menu__go::before, .ro-menu__go::after {
  content: ""; position: absolute; right: 0; top: 50%; background: currentColor;
}
.ro-menu__go::before { left: 0; height: 1px; }
.ro-menu__go::after { width: 7px; height: 1px; transform-origin: right; transform: rotate(38deg) translateY(-.5px); }
.ro-menu__main a:hover .ro-menu__go { opacity: 1; transform: translateX(4px); }

/* the five, shown */
.ro-menu__shades h3, .ro-menu__foot > span {
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase;
  color: var(--ink-soft); margin-bottom: .9rem; font-family: var(--f-ui); font-weight: var(--w-medium);
}
.ro-menu__chips { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 8px; }
.ro-menu__chips a { display: grid; gap: .45rem; text-decoration: none; min-height: 44px; }
.ro-menu__chips i {
  display: block; height: 46px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.06);
  transition: transform var(--t-base) var(--ease);
}
.ro-menu__chips a:hover i { transform: translateY(-3px); }
.ro-menu__chips span {
  font-size: .54rem; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-soft);
  line-height: 1.25;
}

/* one frame to look at */
.ro-menu__feature {
  position: relative; display: block; overflow: hidden; text-decoration: none;
  aspect-ratio: 16/9;
}
.ro-menu__feature img {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 62%;
  transition: transform 900ms var(--ease);
}
.ro-menu__feature:hover img { transform: scale(1.03); }
.ro-menu__feature__copy {
  position: absolute; inset: auto 0 0 0; z-index: 2; display: grid; gap: .2rem;
  padding: clamp(14px, 2vw, 22px);
  background: linear-gradient(to top, rgba(255,255,255,.94), rgba(255,255,255,0));
}
.ro-menu__feature__copy b {
  font-family: var(--f-brand); font-weight: 400; font-size: clamp(1.05rem, 2vw, 1.35rem);
  letter-spacing: -.01em; color: var(--ink);
}
.ro-menu__feature__copy em {
  font-style: normal; font-size: .64rem; letter-spacing: .14em; text-transform: uppercase; color: var(--ink-soft);
}

/* the small print */
.ro-menu__foot {
  display: flex; flex-wrap: wrap; gap: .6rem 1.4rem;
  padding-top: clamp(16px, 2vw, 24px); border-top: 1px solid var(--line);
}
.ro-menu__foot a {
  font-size: var(--t-label); letter-spacing: .16em; text-transform: uppercase;
  color: var(--ink-soft); text-decoration: none; min-height: 44px; display: inline-flex; align-items: center;
}
.ro-menu__foot a:hover { color: var(--ink); }

/* the room assembles itself when it opens */
.js #menu-drawer .ro-menu > *, .js #menu-drawer .ro-menu__main a {
  opacity: 0; transform: translateY(14px);
  transition: opacity 420ms var(--ease), transform 420ms var(--ease);
}
.js #menu-drawer.is-open .ro-menu > *, .js #menu-drawer.is-open .ro-menu__main a {
  opacity: 1; transform: none;
}
.js #menu-drawer.is-open .ro-menu__main a:nth-child(1) { transition-delay: 60ms; }
.js #menu-drawer.is-open .ro-menu__main a:nth-child(2) { transition-delay: 110ms; }
.js #menu-drawer.is-open .ro-menu__main a:nth-child(3) { transition-delay: 160ms; }
.js #menu-drawer.is-open .ro-menu__main a:nth-child(4) { transition-delay: 210ms; }
.js #menu-drawer.is-open .ro-menu__main a:nth-child(5) { transition-delay: 260ms; }
.js #menu-drawer.is-open .ro-menu__shades { transition-delay: 300ms; }
.js #menu-drawer.is-open .ro-menu__feature { transition-delay: 340ms; }
.js #menu-drawer.is-open .ro-menu__foot { transition-delay: 380ms; }

@media (min-width: 861px) {
  .ro-menu {
    grid-template-columns: 1.15fr .85fr;
    grid-template-areas: "main feature" "shades feature" "foot foot";
    column-gap: clamp(40px, 5vw, 90px);
  }
  .ro-menu__main { grid-area: main; }
  .ro-menu__shades { grid-area: shades; }
  .ro-menu__feature { grid-area: feature; aspect-ratio: 3/4; align-self: start; }
  .ro-menu__foot { grid-area: foot; }
}
@media (prefers-reduced-motion: reduce) {
  .js #menu-drawer .ro-menu > *, .js #menu-drawer .ro-menu__main a { opacity: 1; transform: none; transition: none; }
}


/* the shade frames are used exactly as delivered: the stage takes their
   own proportion instead of cropping them to a fixed one */
.ro-shadetabs__media { aspect-ratio: 782 / 978; }
.ro-shadetabs__media .ro__img { object-fit: cover; object-position: 50% 50%; }
@media (max-width: 860px) {
  .ro-shadetabs__media { aspect-ratio: 782 / 978; }
}

/* the frame breathes around the centred title, and the figures below it
   sit on one line the way a spec strip should */
.ro-setband__foot { grid-template-columns: 1fr; justify-items: center; text-align: center; }
.ro-setband__foot > p { max-width: 46ch; }
.ro-setband__meta { justify-content: center; border-top: 0; padding-top: 0; }
.ro-setband__meta span { justify-items: center; text-align: center; }
@media (max-width: 860px) {
  .ro-setband__title { font-size: clamp(2.2rem, 11vw, 3rem); }
  .ro-setband__meta { gap: 16px 22px; }
}

/* on a phone the open band is only ~77px tall, so the title steps below the
   frame rather than crowding the objects. The photograph is never cropped. */
@media (max-width: 860px) {
  .ro-setband__center {
    position: static; padding: clamp(18px, 5vw, 26px) var(--pad) 0;
  }
  .ro-setband__frame { display: grid; }
  .ro-setband__frame .ro__img { position: static; height: auto; }
  .ro-setband__frame { aspect-ratio: auto; }
  .ro-setband__title { mix-blend-mode: normal; }
  .ro-setband__foot { padding-top: clamp(14px, 3vw, 20px); }
}

/* desktop: the title sits a little into the open band, not on its edge,
   and the section clears the sticky header when it is jumped to */
.ro-setband { scroll-margin-top: calc(var(--header-h, 58px) + 8px); }
@media (min-width: 861px) {
  .ro-setband__title { font-size: clamp(2rem, 3.6vw, 3.2rem); }
}

/* the hero line is a way in, not a caption: two destinations on one rule */
.ro-fhero__price { display: flex; align-items: center; gap: .75rem; flex-wrap: wrap; }
.ro-fhero__price a {
  font-size: var(--t-label); letter-spacing: .2em; text-transform: uppercase;
  color: inherit; text-decoration: none; position: relative;
  min-height: 44px; display: inline-flex; align-items: center;
}
.ro-fhero__price a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 12px; height: 1px;
  background: currentColor; opacity: .5;
  transform: scaleX(1); transform-origin: left;
  transition: transform var(--t-base) var(--ease), opacity var(--t-base) var(--ease);
}
.ro-fhero__price a:hover::after { transform: scaleX(0); transform-origin: right; }
.ro-fhero__price a:hover { opacity: .8; }
.ro-fhero__price span { opacity: .5; }

/* a table inside an aside must scroll in place, never widen the page */
.ro-aside__body { min-width: 0; }
@media (max-width: 860px) {
  .ro-aside__body .ro-compare { display: block; overflow-x: auto; scrollbar-width: none; }
  .ro-aside__body .ro-compare::-webkit-scrollbar { display: none; }
  .ro-aside__body .ro-compare thead, .ro-aside__body .ro-compare tbody { display: table; width: 100%; min-width: 480px; }
}


/* ============================================================
   THE NAME — wherever "mew" is written in latin, inside a sentence
   or on a shelf, it wears the face it wears on the carton. A name
   is a mark, not a word: it never inherits the working type.
   ============================================================ */
.mew {
  font-family: var(--f-brand);
  font-weight: 500;
  font-style: normal;
  text-transform: lowercase;
  letter-spacing: .01em;
  font-size: 1.03em;
}

/* ============================================================
   LANGUAGE — the site speaks two. One small object says so, and
   sits where the eye already goes for account and bag.
   ============================================================ */
.ro .ro-lang {
  position: relative;
  display: inline-flex; align-items: center; gap: .55em;
  padding: .44em .72em;
  border: 1px solid color-mix(in srgb, currentColor 24%, transparent);
  border-radius: 999px;
  line-height: 1;
  letter-spacing: .1em;
  white-space: nowrap;
  transition: border-color .35s var(--ease), background-color .35s var(--ease);
}
.ro .ro-lang::after { display: none; }         /* the header underline is for words, not for a pill */
.ro-lang::before { content: ""; position: absolute; inset: -9px -6px; }  /* a thumb-sized target around a small object */
.ro-lang span { transition: opacity .35s var(--ease); }
.ro-lang .is-on { opacity: 1; }
.ro-lang .is-off { opacity: .42; }
.ro-lang i { width: 1px; height: .78em; background: currentColor; opacity: .26; }
.ro-lang:hover { border-color: color-mix(in srgb, currentColor 55%, transparent); }
.ro-lang:hover .is-off { opacity: .85; }
.ro-header__util .ro-lang { display: inline-flex; }   /* it survives where the text links drop away */

/* the pill keeps its own geometry: the 44px target is the halo around it,
   not the box itself, or a two-word toggle inflates into a ball */
.ro-header__util a.ro-lang { min-height: 0; align-self: center; }
.ro .ro-lang::before { inset: -12px -9px; }

/* desktop-only labels stay desktop-only: the touch-target rule above must
   not out-specify them back into a crowded phone header */
@media (max-width: 860px) {
  .ro-header__util a.u-desktop { display: none; }
}

@media (max-width: 640px) {
  .ro .ro-lang { padding: .55em .8em; gap: .5em; font-size: .6rem; }
}


/* the arabic half of the toggle speaks arabic type, on either site */
.ro-lang [lang="ar"], .ro[lang] .ro-lang span:not([lang="en"]) {
  font-family: "Cairo", var(--f-ui);
  font-weight: 600;
}

/* ============================================================
   SOFT EDGES — one radius scale, applied everywhere the eye
   meets a corner. The house keeps its lines; it stops cutting.
   ============================================================ */
.ro {
  --r-xs: 8px;    /* chips, tags, small controls */
  --r-sm: 12px;   /* inputs, table cells, notes */
  --r-md: 18px;   /* cards, media, plates, quotes */
  --r-lg: 26px;   /* full-bleed frames, bands, drawers */
  --r-pill: 999px;
}

/* buttons and links that behave like buttons */
.ro__btn,
.ro-quiz__restart,
.ro-buy__qty,
.ro-header__count,
.ro-badge,
.ro-strip__tag,
.ro-facts .ro-fact,
.ro-jump a,
.ro-crumbs,
.ro-lang { border-radius: var(--r-pill); }

.ro-buy__qty button:first-child { border-radius: var(--r-pill) 0 0 var(--r-pill); }
.ro-buy__qty button:last-child  { border-radius: 0 var(--r-pill) var(--r-pill) 0; }

/* cards and their media */
.ro-pcard,
.ro-card,
.ro-shadecard,
.ro-quote,
.ro-prop,
.ro-shade,
.ro-benefit,
.ro-plate,
.ro-preview,
.ro-review,
.ro-acc__item,
.ro-faq__item,
.price-card,
.ro-bento__cell,
.ro-empty { border-radius: var(--r-md); overflow: hidden; }

.ro-pcard__media,
.ro-card__media,
.ro-shadecard__media,
.ro-quote__media,
.ro-plate__media,
.ro-thumb,
.ro-gallery__stage,
.ro-quickbuy__stage,
.ro-setband__frame,
.ro-ba,
.ro-formside,
.ro-ladder__ground,
.ro-proofband__ground { border-radius: var(--r-md); overflow: hidden; }

/* the big frames: band, aside, hero plates, pinned media */
.ro-band,
.ro-aside__media,
.ro-pin__media,
.ro-worn__row figure,
.ro-storyhero__frame,
.ro-fhero,
.ro-compare-sec .ro-ba,
.ro-strip { border-radius: var(--r-lg); overflow: hidden; }

/* fields, tables, sheets, drawers */
.ro-field input,
.ro-field select,
.ro-field textarea,
.ro-form input,
.ro-form select,
.ro-form textarea,
.ro-footer__join input,
.ro-footer__join button,
.ro-compare,
.ro-spec,
.ro-sheet,
.drawer,
.cartline { border-radius: var(--r-sm); }

.ro-sheet { border-radius: var(--r-lg) var(--r-lg) 0 0; }
.drawer { border-radius: var(--r-lg) 0 0 var(--r-lg); }
.drawer--left { border-radius: 0 var(--r-lg) var(--r-lg) 0; }

/* small marks */
.ro-swatch,
.ro-ladder__bar,
.ro-compare__bar,
.ro-compare__bar i,
.ro__label--tag { border-radius: var(--r-xs); }
.ro-ladder__bar { border-radius: var(--r-xs) var(--r-xs) 0 0; }

/* images inside rounded parents inherit the softness */
.ro-pcard__media img,
.ro-card__media img,
.ro-plate__media img,
.ro-aside__media img { border-radius: inherit; }

/* focus rings follow the shape they ring */
.ro a:focus-visible,
.ro button:focus-visible,
.ro input:focus-visible,
.ro select:focus-visible,
.ro textarea:focus-visible { border-radius: var(--r-sm); }
.ro .ro__btn:focus-visible { border-radius: var(--r-pill); }

@media (max-width: 640px) {
  .ro { --r-md: 16px; --r-lg: 20px; }
}

/* ── the quiet reassurances under the buy button ── */
.ro-assure { display: grid; gap: .55rem; margin-top: 1.1rem; }
.ro-assure li { display: flex; align-items: center; gap: .6rem; font-size: .8rem; color: var(--ink-soft); }
.ro-assure svg { width: 17px; height: 17px; flex: none; color: var(--red); }
.ro-buy__stock { margin-top: .7rem; }
.ro-buy__stock::before { content: ""; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: #2E7D5B; margin-right: .5rem; vertical-align: middle; }
.ro-buy__stock[data-stock="out"]::before { background: var(--ink-soft); }
.sticky-atc__thumb { width: 46px; height: 46px; object-fit: cover; border-radius: var(--r-sm, 12px); flex: none; }
.sticky-atc__info { min-width: 0; }
.sticky-atc__info b, .sticky-atc__info span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
