/* =============================================================
 *  Landing v2 — Lacoste-inspired: airy, premium, big clean type,
 *  a floating interactive 3D garment, colour-shifting stage.
 *  Mobile-first.
 * ============================================================= */
/* Fonts are loaded via <link> in index.html <head> (parallel discovery) — a CSS
   @import here would force the browser to fetch v2.css first, THEN the fonts,
   serialising the critical path. */

:root {
  --stage-bg: #2f5d4a;          /* on-brand deep pine — first paint; shifts per garment (landing3d.js) */
  --gold: #b78a2e;              /* TRUEF accent */
  --ink: #18181a;               /* near-black — identical to the studio's UI black */
  --paper: #ffffff;
  --muted: rgba(255,255,255,.7); /* hero text on the colour stage (stays white)   */
  --line: rgba(255,255,255,.35); /* hero rule on the colour stage (stays white)    */
  --gut: clamp(18px, 5vw, 64px);
  --ease: cubic-bezier(.22, 1, .36, 1);
  --maxw: 1400px;
}

* { margin: 0; padding: 0; box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
  font-family: "Archivo", system-ui, sans-serif;
  color: var(--ink); background: #fff;
  -webkit-font-smoothing: antialiased; overflow-x: hidden;
}
img, video, canvas { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }

/* ---------------------------------------------------------- nav --- */
.v2nav {
  position: fixed; inset: 0 0 auto 0; z-index: 50;
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  padding: 16px var(--gut); color: #fff;
}
.v2nav .menu { display: flex; flex-direction: column; gap: 4px; width: 26px; cursor: pointer; }
.v2nav .menu span { height: 2px; background: currentColor; border-radius: 2px; }
.v2nav .mark {
  grid-column: 2; justify-self: center;
  font-weight: 800; letter-spacing: .26em; text-transform: uppercase;
  font-size: clamp(12px, 1.4vw, 15px);
}
.v2nav .acct { grid-column: 3; justify-self: end; width: 22px; height: 22px;
  border: 1.5px solid currentColor; border-radius: 50%; position: relative; }
.v2nav .acct::after { content: ""; position: absolute; inset: 4px 4px auto; height: 7px;
  border: 1.5px solid currentColor; border-bottom: 0; border-radius: 7px 7px 0 0; }

/* --- logo: framed-T mark + TRUeF wordmark (the lowercase e is the signature) --- */
.v2nav .mark { display: inline-flex; align-items: center; gap: 9px; }
.v2nav .navmark { width: 19px; height: 19px; flex: none; }
.v2nav .navword { font-weight: 800; letter-spacing: .05em; font-size: clamp(13px, 1.5vw, 16px); }
.navword .e, .word .e { text-transform: lowercase; }
.word { font-weight: 800; }   /* bolder for the hero wordmark logo */

/* -------------------------------------------------------- hero --- */
.hero-stage {
  position: relative; min-height: 100vh; min-height: 100svh;
  background: var(--stage-bg);
  transition: background 1.1s var(--ease);
  display: grid; grid-template-columns: 1fr; align-items: center;
  overflow: hidden;
}

.hero-copy {
  position: relative; z-index: 3; color: #fff;
  padding: 0 var(--gut); padding-top: 26vh;
  pointer-events: none;
}
.hero-copy .eyebrow { pointer-events: auto; }
.word {
  font-weight: 700; text-transform: uppercase; line-height: .92;
  letter-spacing: .01em; font-size: clamp(40px, 11.5vw, 132px);
  max-width: 12ch; text-shadow: 0 2px 30px rgba(0,0,0,.12);
}
.hero-line { height: 1px; background: var(--line); margin: 26px 0 22px; max-width: 360px; }
.hero-sub { display: flex; gap: 16px; align-items: center; pointer-events: auto;
  font-weight: 600; letter-spacing: .22em; text-transform: uppercase; font-size: 13px; }
.hero-sub a { opacity: .85; transition: opacity .25s; padding: 4px 0; }
.hero-sub a.on, .hero-sub a:hover { opacity: 1; }
.hero-sub .sep { opacity: .5; }
.hero-cap { margin-top: 26px; color: var(--muted); font-size: 12.5px;
  letter-spacing: .14em; text-transform: uppercase; min-height: 1.2em; }
.hero-cap b { color: #fff; font-weight: 600; }

/* kinetic typography: staggered reveal on load + caption pop on each garment swap */
.hero-copy .word, .hero-copy .hero-line, .hero-copy .hero-sub, .hero-copy .hero-cap {
  opacity: 0; transform: translateY(16px); transition: opacity .8s var(--ease), transform .8s var(--ease);
}
.hero-copy.reveal .word { opacity: 1; transform: none; transition-delay: .05s; }
.hero-copy.reveal .hero-line { opacity: 1; transform: none; transition-delay: .18s; }
.hero-copy.reveal .hero-sub { opacity: 1; transform: none; transition-delay: .28s; }
.hero-copy.reveal .hero-cap { opacity: 1; transform: none; transition-delay: .38s; }
@keyframes capPop { 0% { opacity: 0; transform: translateY(8px); } 100% { opacity: 1; transform: none; } }
.hero-cap.cap-pop { animation: capPop .5s var(--ease); }

/* the floating garment */
.hero-garment {
  position: absolute; inset: 0; z-index: 2;
  display: grid; place-items: center; pointer-events: auto;
}
#garment3d { width: 100%; height: 100%; display: block; cursor: grab; }
#garment3d:active { cursor: grabbing; }
.garment-shadow {
  position: absolute; bottom: 11%; left: 50%; width: min(34vw, 360px); height: 26px;
  transform: translateX(-50%); border-radius: 50%;
  background: radial-gradient(ellipse at center, rgba(0,0,0,.28), transparent 70%);
  filter: blur(6px); z-index: 1; pointer-events: none;
}
/* instant poster — a clean tee shown the moment the page opens (never a blank hero);
   fades out once the live 3D garment has rendered. Stays put if WebGL is unavailable. */
.hero-poster {
  position: absolute; left: 50%; top: 49%; transform: translate(-50%, -50%);
  height: 62%; width: auto; max-width: 88%; object-fit: contain; z-index: 3;
  pointer-events: none; opacity: 1; transition: opacity .45s var(--ease);
  filter: drop-shadow(0 26px 38px rgba(0,0,0,.16));
}
.hero-stage.hero-ready .hero-poster { opacity: 0; pointer-events: none; }
/* Seamless swap: the garment fades very slightly while the next colour + print apply,
   then settles. No scale/translate — movement looks like a glitch on a looped carousel. */
.hero-stage #garment3d { transition: opacity .45s var(--ease); }
.hero-stage.swapping #garment3d {
  opacity: 0;
  transition: opacity .12s ease;
}
.hero-stage.room-3d.swapping #garment3d { opacity: 0; transition: opacity .12s ease; }
.hero-stage.room-3d .garment-shadow { display: none; }

/* hide the studio-only injected hint/reset on the landing */
.hero-garment .g3d-hint, .hero-garment .g3d-reset { display: none !important; }

.scroll-cue { position: absolute; left: 50%; bottom: 18px; transform: translateX(-50%);
  z-index: 4; width: 26px; height: 3px; border-radius: 3px; background: rgba(255,255,255,.6); }

/* desktop: copy left, garment right */
@media (min-width: 860px) {
  .hero-copy { padding-top: 0; max-width: 52%; align-self: center; }
  .hero-stage { align-content: center; }
  .hero-garment { left: 42%; }
  .garment-shadow { left: auto; right: 12%; }
}

/* ── Studio page (page 2) — photography studio background + dark overlay ── */
.studio-hero {
  position: relative; min-height: 100vh; min-height: 100svh;
  background: url('/static/media/studio_bg.jpg') center 30% / cover no-repeat;
  color: #fff;
  display: grid; grid-template-columns: 1fr; align-items: center;
  overflow: hidden;
}
.studio-hero > * { position: relative; z-index: 2; }

/* colour-cycling dark overlay — sits on top of the photo, under the grid */
.studio-tint {
  position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background: var(--studio-bg, rgba(0,0,0,.62));
  transition: background 1.4s var(--ease);
}

/* perspective room behind the garment — same grid as the hero */
.studio-room {
  position: absolute; inset: 0; z-index: 0; overflow: hidden; pointer-events: none;
  perspective: 760px; perspective-origin: 50% 46%;
}
/* wall + floor grid re-use .room-grid from the hero rules */
.studio-room .room-wall  { opacity: .82; }
.studio-room .room-floor { opacity: .92; }

/* soft centred spotlight behind the garment — left side on desktop (garment is left) */
.studio-room-glow {
  position: absolute; inset: 0;
  background: radial-gradient(54% 46% at 28% 44%,
    rgba(255,255,255,.18) 0%, rgba(255,255,255,.05) 36%, transparent 66%);
}
@media (max-width: 859px) {
  .studio-room-glow { background: radial-gradient(64% 44% at 50% 44%,
    rgba(255,255,255,.22) 0%, rgba(255,255,255,.07) 34%, transparent 64%); }
}

/* headline — Titan One base; size + position controlled by .studio-copy .studio-headline */
.studio-headline {
  font-family: 'Titan One', system-ui, sans-serif !important;
  font-weight: 400;
  text-transform: uppercase; color: #fff;
  margin-left: auto; margin-right: auto;
}

/* garment: centred, takes up most of the stage height */
.studio-garment {
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  display: flex; align-items: center; justify-content: center;
}
#gallery3d {
  width: min(54vw, 520px); height: min(80vw, 760px);
  display: block; flex: none; cursor: grab; pointer-events: auto;
}
#gallery3d:active { cursor: grabbing; }
.studio-shadow {
  position: absolute; bottom: 10%; left: 50%; transform: translateX(-50%);
  width: min(28vw, 260px); height: 18px; border-radius: 50%;
  background: radial-gradient(ellipse at center, rgba(0,0,0,.45), transparent 70%);
  filter: blur(7px);
}

/* studio copy: full-section overlay, children pinned independently */
.studio-copy {
  position: absolute; inset: 0; z-index: 3; pointer-events: none;
}

/* headline: pinned near the top — same .word graffiti style, sized to fit the sentence */
.studio-copy .studio-headline {
  position: absolute;
  top: clamp(22px, 3vh, 44px); left: var(--gut);
  text-align: left;
  font-size: clamp(36px, 8vw, 88px);
  max-width: none;
  line-height: 1.0;
  pointer-events: auto;
}

.studio-copy .studio-subtext {
  position: absolute;
  top: clamp(140px, 20vh, 210px); left: var(--gut); right: var(--gut);
  max-width: 38ch;
  text-align: left;
  font-family: 'Archivo', sans-serif;
  font-size: clamp(13px, 2vw, 17px);
  font-weight: 700;
  color: rgba(255,255,255,0.95);
  line-height: 1.6;
  letter-spacing: 0.03em;
  pointer-events: none;
}

.studio-copy .hero-line { display: none; }

/* nav: pinned to the bottom */
.studio-copy .hero-sub {
  position: absolute;
  bottom: clamp(28px, 5vh, 56px); left: 0; right: 0;
  display: flex; justify-content: center; gap: 16px;
  padding-bottom: env(safe-area-inset-bottom, 0px);
  pointer-events: auto;
}

@media (min-width: 860px) {
  #gallery3d { width: min(42vw, 480px); height: min(62vw, 700px); }
  .studio-garment { justify-content: center; padding-left: 0; }
  .studio-shadow { left: 50%; transform: translateX(-50%); right: auto; }
  /* headline is ~88px × 3 lines on desktop — push subtext clear of it */
  .studio-copy .studio-subtext { top: clamp(295px, 35vh, 390px); }
}

@media (max-width: 859px) {
  .studio-copy .studio-headline { font-size: clamp(32px, 9vw, 56px); text-align: left; }
  .studio-garment { align-items: flex-start; justify-content: center; padding-top: max(14vh, 110px); padding-left: 0; }
  .studio-shadow { left: 50%; transform: translateX(-50%); right: auto; }
  #gallery3d { width: 88vw; height: 120vw; touch-action: pan-y; }
}

/* ── Studio smoke — gentle puffs rising from the floor ── */
.studio-smoke {
  position: absolute; inset: 0; z-index: 0;
  overflow: hidden; pointer-events: none;
}
.sp {
  position: absolute; border-radius: 50%;
  background: radial-gradient(circle at 38% 35%, rgba(210,215,225,.16) 0%, transparent 62%);
  filter: blur(48px); opacity: 0;
  will-change: transform, opacity;
}
@keyframes smokeRise {
  0%   { opacity: 0;    transform: translateY(0)     translateX(0)            scale(.65); }
  18%  { opacity: 1; }
  72%  { opacity: .40; }
  100% { opacity: 0;    transform: translateY(-110px) translateX(var(--sdx,0)) scale(2.1); }
}
.sp1 { width:340px; height:340px; left: 4%;  bottom:14%; --sdx:-14px; animation:smokeRise 17s ease-in-out 0s   infinite; }
.sp2 { width:420px; height:420px; left:22%;  bottom: 4%; --sdx: 24px; animation:smokeRise 21s ease-in-out 4.5s infinite; }
.sp3 { width:280px; height:280px; left:52%;  bottom:20%; --sdx:-18px; animation:smokeRise 15s ease-in-out 8s   infinite; }
.sp4 { width:370px; height:370px; left:38%;  bottom: 6%; --sdx: 20px; animation:smokeRise 19s ease-in-out 2s   infinite; }
.sp5 { width:300px; height:300px; left:68%;  bottom:16%; --sdx: -8px; animation:smokeRise 16s ease-in-out 11s  infinite; }
.sp6 { width:250px; height:250px; left:14%;  bottom:30%; --sdx: 16px; animation:smokeRise 13s ease-in-out 6s   infinite; }
@media (prefers-reduced-motion: reduce) { .sp { animation: none !important; } }

/* ── Dry-ice floor fog — wide flat ellipses that hug the ground ── */
.ff {
  position: absolute; border-radius: 50%;
  /* bright cool white; flat ellipse shape so it reads as ground-level cloud */
  background: radial-gradient(ellipse at 50% 55%,
    rgba(210,225,245,.52) 0%,
    rgba(200,218,240,.22) 42%,
    transparent 70%);
  filter: blur(52px); opacity: 0;
  will-change: transform, opacity;
}
@keyframes fogDrift {
  0%   { opacity: 0;    transform: translateY(0)     translateX(0)           scale(1.0); }
  14%  { opacity: .9; }
  50%  { opacity: .85;  transform: translateY(-10px) translateX(calc(var(--fdx,16px) * .55)) scale(1.08); }
  86%  { opacity: .7; }
  100% { opacity: 0;    transform: translateY(-20px) translateX(var(--fdx,16px)) scale(1.18); }
}
/* each fog blob: very wide, flat (short height), sitting on the bottom */
.ff1 { width:640px; height:130px; left:-8%;  bottom:0%;  --fdx: 44px;  animation: fogDrift 24s ease-in-out 0s   infinite; }
.ff2 { width:520px; height:110px; left:15%;  bottom:1%;  --fdx:-38px;  animation: fogDrift 29s ease-in-out 5s   infinite; }
.ff3 { width:700px; height:150px; left:36%;  bottom:0%;  --fdx: 28px;  animation: fogDrift 20s ease-in-out 10s  infinite; }
.ff4 { width:460px; height:105px; left:55%;  bottom:2%;  --fdx:-50px;  animation: fogDrift 26s ease-in-out 3s   infinite; }
.ff5 { width:580px; height:125px; left:8%;   bottom:1%;  --fdx: 56px;  animation: fogDrift 22s ease-in-out 13s  infinite; }
.ff6 { width:420px; height: 95px; left:68%;  bottom:0%;  --fdx:-24px;  animation: fogDrift 27s ease-in-out 7s   infinite; }
.ff7 { width:610px; height:140px; left:24%;  bottom:2%;  --fdx: 36px;  animation: fogDrift 18s ease-in-out 16s  infinite; }
.ff8 { width:480px; height:115px; left:48%;  bottom:1%;  --fdx:-42px;  animation: fogDrift 31s ease-in-out 1s   infinite; }
@media (prefers-reduced-motion: reduce) { .ff { animation: none !important; } }

/* ── Stage spotlight — slow sweeping cone + matching floor pool ── */
.studio-spotlight {
  position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
}
/* the cone: tall narrow triangle of warm light, rotates around its top centre */
.spl-beam {
  position: absolute;
  top: -4%; left: 50%;
  width: 660px; height: 108%;
  margin-left: -330px;
  background: linear-gradient(
    to bottom,
    rgba(255,248,195,.11) 0%,
    rgba(255,245,185,.06) 38%,
    transparent 72%
  );
  clip-path: polygon(38% 0%, 62% 0%, 92% 100%, 8% 100%);
  filter: blur(7px);
  transform-origin: 50% 0%;
  will-change: transform;
  animation: beamSweep 18s ease-in-out infinite;
}
@keyframes beamSweep {
  0%, 100% { transform: rotate(-22deg); opacity: .82; }
  25%       { opacity: 1; }
  50%       { transform: rotate(22deg);  opacity: .90; }
  75%       { opacity: 1; }
}
/* elliptical pool on the floor that tracks the beam's landing point */
.spl-pool {
  position: absolute;
  bottom: 1%; left: 50%;
  width: 300px; height: 64px;
  margin-left: -150px;
  border-radius: 50%;
  background: radial-gradient(ellipse at center,
    rgba(255,248,190,.30) 0%,
    rgba(255,245,175,.10) 50%,
    transparent 72%
  );
  filter: blur(16px);
  will-change: transform;
  animation: poolSweep 18s ease-in-out infinite;
}
@keyframes poolSweep {
  0%, 100% { transform: translateX(-215px) scaleX(.72); opacity: .72; }
  50%       { transform: translateX(215px)  scaleX(.72); opacity: .92; }
}

@media (prefers-reduced-motion: reduce) {
  .spl-beam, .spl-pool { animation: none !important; }
}

/* ── Camera flash ── */
.cam-flash {
  position: absolute; inset: 0; z-index: 9;
  background: #fff; opacity: 0; pointer-events: none;
}
/* single soft bloom — like a photographer's light catching the room */
@keyframes camFlash {
  0%   { opacity: 0; }
  10%  { opacity: 0.32; }
  100% { opacity: 0; }
}
.cam-flash.firing {
  animation: camFlash 1.1s ease-out forwards;
}

/* ── How It Works (page 2) ── */
/* ── How It Works — premium 3-step, reveal on enter ─────────────── */
.hiw {
  position: relative; overflow: hidden; color: #18181a;
  padding: clamp(64px, 11vh, 132px) var(--gut);
  background:
    radial-gradient(120% 90% at 50% -8%, rgba(183,138,46,.12), transparent 62%),
    #fff;
}
.hiw::before {  /* gold hairline along the top edge */
  content: ""; position: absolute; left: 0; right: 0; top: 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgba(183,138,46,.55), transparent);
}
.hiw-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; }

/* heading */
.hiw-head { margin: 0 0 clamp(34px, 6vh, 64px); max-width: 34rem; }
.hiw-eyebrow {
  display: inline-flex; align-items: center; gap: 10px; margin: 0 0 16px;
  font: 700 12px/1 'Archivo', sans-serif; letter-spacing: .34em; text-transform: uppercase;
  color: #8a6410;   /* deeper gold: passes contrast as small text on white */
}
.hiw-eyebrow::before { content: ""; width: 26px; height: 1px; background: var(--gold); opacity: .85; }
.hiw-heading {
  margin: 0; font-family: 'Titan One', sans-serif; font-weight: 400;
  font-size: clamp(25px, 5.2vw, 50px); line-height: 1.06; letter-spacing: -.01em;
  color: #18181a; text-wrap: balance;
}

/* layout */
.hiw-grid { display: grid; grid-template-columns: 1fr; gap: clamp(34px, 5vh, 56px); align-items: start; }

/* timeline */
.hiw-steps { list-style: none; margin: 0; padding: 0; position: relative; display: grid; gap: clamp(22px, 3.4vh, 36px); }
.hiw-steps::before {  /* gold line threading the numbers */
  content: ""; position: absolute; top: 10px; bottom: 10px;
  left: calc(clamp(46px, 12vw, 62px) / 2); width: 2px; transform: translateX(-50%);
  background: linear-gradient(180deg, var(--gold), rgba(183,138,46,.22));
}
.hiw-step {
  position: relative; display: grid;
  grid-template-columns: clamp(46px, 12vw, 62px) 1fr;
  gap: clamp(16px, 4vw, 26px); align-items: start;
}
.hiw-num {
  position: relative; z-index: 1; justify-self: center;
  width: clamp(46px, 12vw, 62px); height: clamp(46px, 12vw, 62px);
  display: grid; place-items: center; border-radius: 50%;
  font-family: 'Titan One', sans-serif; font-size: clamp(24px, 6.5vw, 38px); line-height: 1;
  color: var(--gold);
  background: #fff;
  border: 1.5px solid rgba(183,138,46,.6);
  box-shadow: 0 0 0 6px #fff, 0 10px 24px rgba(24,24,26,.12);
}
.hiw-text { padding-top: clamp(2px, 1vh, 7px); }
.hiw-title { margin: 0 0 7px; font-size: clamp(18px, 2.4vw, 23px); font-weight: 800; color: #18181a; letter-spacing: -.01em; }
.hiw-desc { margin: 0; max-width: 44ch; font-size: clamp(14px, 1.7vw, 15.5px); line-height: 1.6; color: #4c4c50; }

/* proof strip + cta */
.hiw-foot { margin-top: clamp(30px, 5vh, 44px); }
.hiw-strip {
  list-style: none; display: flex; flex-wrap: wrap; gap: 10px 26px;
  margin: 0 0 clamp(22px, 3.5vh, 30px); padding-top: clamp(18px, 2.6vh, 24px);
  border-top: 1px solid rgba(24,24,26,.12);
}
.hiw-strip li { font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: #565659; }
.hiw-strip li strong { color: #8a6410; font-weight: 800; }
.hiw-cta {
  display: inline-flex; align-items: center; gap: 10px; min-height: 52px; padding: 0 32px;
  font: 800 13.5px/1 'Archivo', sans-serif; letter-spacing: .18em; text-transform: uppercase;
  color: #0b0b0c; background: var(--gold); border-radius: 3px;
  box-shadow: 0 12px 30px rgba(183,138,46,.28);
  transition: transform .25s var(--ease), box-shadow .25s var(--ease);
}
.hiw-cta span { transition: transform .25s var(--ease); }
.hiw-cta:hover { transform: translateY(-2px); box-shadow: 0 18px 40px rgba(183,138,46,.42); }
.hiw-cta:hover span { transform: translateX(4px); }

/* contained garment visual */
.hiw-show { display: flex; flex-direction: column; align-items: center; gap: 14px; }
.hiw-card {
  position: relative; width: min(82vw, 320px); aspect-ratio: 4 / 5;
  border-radius: 14px; overflow: hidden;
  background: linear-gradient(180deg, #17120a, #0d0d0e);
  border: 1px solid rgba(183,138,46,.22); box-shadow: 0 40px 90px rgba(0,0,0,.55);
}
.hiw-base { width: 100%; height: 100%; object-fit: cover; display: block; }
.hiw-seal {
  position: absolute; right: 12px; bottom: 12px; display: grid; place-items: center; text-align: center; gap: 1px;
  width: 78px; height: 78px; border-radius: 50%;
  border: 1.5px solid var(--gold); background: rgba(11,11,12,.9); transform: rotate(-8deg);
}
.hiw-seal b { font-family: 'Titan One', sans-serif; font-size: 12px; color: var(--gold); }
.hiw-seal span { font-size: 7.5px; letter-spacing: .08em; text-transform: uppercase; color: rgba(255,255,255,.8); }
.hiw-ship { margin: 0; font-size: 12.5px; letter-spacing: .04em; color: rgba(255,255,255,.5); }

/* reveal-on-enter (armed by JS only — visible by default) */
.hiw.is-armed .hiw-reveal { opacity: 0; transform: translateY(24px); transition: opacity .7s var(--ease), transform .7s var(--ease); }
.hiw.is-armed.in .hiw-reveal { opacity: 1; transform: none; }
.hiw.in .hiw-show { transition-delay: .06s; }
.hiw.in .hiw-step:nth-child(1) { transition-delay: .12s; }
.hiw.in .hiw-step:nth-child(2) { transition-delay: .20s; }
.hiw.in .hiw-step:nth-child(3) { transition-delay: .28s; }
.hiw.in .hiw-foot { transition-delay: .34s; }

/* desktop: copy left, garment right */
@media (min-width: 860px) {
  .hiw-grid { grid-template-columns: 1.08fr .92fr; gap: clamp(48px, 6vw, 96px); align-items: center; }
  .hiw-copy { order: 1; }
  .hiw-show { order: 2; }
  .hiw-card { width: min(34vw, 420px); }
}

/* reduced motion / no-JS: everything visible, no transforms */
@media (prefers-reduced-motion: reduce) {
  .hiw-reveal { opacity: 1 !important; transform: none !important; }
}

/* ── The Collection (gallery2, now page 4) ── */
.gallery2 {
  position: relative; overflow: hidden; background: #000; color: #fff;
  aspect-ratio: 47 / 25;
  min-height: 60vw;
  display: grid; align-items: center;
  padding: 0 var(--gut);
}
@media (max-width: 860px) {
  .gallery2 { aspect-ratio: unset; min-height: 70vh; min-height: 70svh; }
}
.gallery-bg-video { position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:0; pointer-events:none; }
.gallery2::after { content:""; position:absolute; inset:0; background:rgba(0,0,0,.55); z-index:1; pointer-events:none; }
.gallery2 > *:not(.gallery-bg-video) { position:relative; z-index:2; }
.gallery2-copy { padding-top: 24vh; }
.gallery2-copy .word { font-size: clamp(28px, 7vw, 64px); }
@media (min-width: 860px) {
  .gallery2-copy { padding-top: 0; max-width: 52%; }
  /* Fit the reels section to the screen on desktop. The 47/25 aspect-ratio combined
     with min-height:60vw was deriving a width (~1541px on a 1366 screen) wider than
     the viewport, overflowing horizontally. Fill the viewport instead. */
  .gallery2 { aspect-ratio: auto; min-height: 100vh; min-height: 100svh; }
}

/* arrow + CTA row on second hero */
.g2-cta-row { display: flex; align-items: center; gap: 16px; margin-top: 28px; flex-wrap: wrap; }
.g2-arrow { height: 22px; width: auto; flex: none; }

/* ── Collection section — Möbius strip ── */
.collection-section {
  background: #0a0a0a;
  padding: clamp(48px, 7vw, 96px) var(--gut);
}
.collection-section .cta-row {
  max-width: var(--maxw); margin: 40px auto 0; display: flex; justify-content: center;
}

/* Möbius override — canvas fills section, heading sits behind the ring at the top */
.collection-section.mobius-section {
  position: relative;
  height: 100vh;
  height: 100svh;
  min-height: 100vh;
  min-height: 100svh;
  padding: 0;
  overflow: hidden;
  /* white photo-studio backdrop (#1) with a readability scrim: strong at the top
     behind the heading, light through the middle so the studio shows, moderate at
     the bottom behind the CTA + möbius. */
  background:
    linear-gradient(180deg, rgba(8,8,11,.82) 0%, rgba(8,8,11,.40) 24%, rgba(8,8,11,.30) 55%, rgba(8,8,11,.62) 100%),
    url('/static/media/collection-studio.jpg') center / cover no-repeat #111 !important;
  text-align: center;
}
/* Heading sits in the MIDDLE of the section, on top of the ring */
.mobius-heading {
  position: absolute;
  top: 50%; transform: translateY(-50%);
  left: 0; right: 0;
  z-index: 4;
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 0 var(--gut);
  pointer-events: none;
}
.mobius-eyebrow {
  font: 600 11px/1 var(--font-ui, 'Titan One', sans-serif);
  letter-spacing: .18em;
  text-transform: uppercase;
  color: rgba(255,255,255,.5);
  margin-bottom: 14px;
}
.mobius-title {
  color: #fff;
  font-size: clamp(22px, 5vw, 58px);
  margin-bottom: 14px;
  text-shadow: 0 2px 18px rgba(0,0,0,.55);   /* legible over the ring behind it */
}
.mobius-sub {
  color: #fff;
  font-size: clamp(14px, 1.1vw, 16px);
  font-weight: 700;                           /* bolder + solid white so it's clearly visible */
  margin-bottom: 0;
  font-family: var(--font-ui, sans-serif);
  text-shadow: 0 2px 14px rgba(0,0,0,.6);
}
/* Canvas fills the entire section; ring rendered on top of the heading */
.mobius-wrap {
  position: absolute;
  inset: 0;
  overflow: hidden;
  z-index: 2;
}
.mobius-wrap canvas {
  display: block;
  width: 100%;
  height: 100%;
  cursor: grab;
  touch-action: pan-y;
}
.mobius-wrap canvas.is-grabbing { cursor: grabbing; }
#collectionLabels {
  position: absolute;
  inset: 0;
  pointer-events: none;
  overflow: hidden;
}
.mobius-label {
  position: absolute;
  transform: translate(-50%, calc(-100% - 14px));
  background: rgba(10,10,10,.88);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  color: #fff;
  padding: 8px 14px 10px;
  border-radius: 6px;
  font: 600 13px/1.3 var(--font-ui, sans-serif);
  pointer-events: none;
  opacity: 0;
  transition: opacity .15s;
  white-space: nowrap;
  letter-spacing: .03em;
}
.mobius-label.show { opacity: 1; }
.mobius-kicker {
  display: block;
  font-size: 9px;
  color: #ff5500;
  letter-spacing: .16em;
  text-transform: uppercase;
  margin-bottom: 3px;
}
.mobius-enter {
  display: inline-block;
  margin-left: 6px;
  color: #ff5500;
  font-size: 11px;
  font-weight: 700;
}
/* CTA sits at the bottom of the section, above the canvas */
.collection-section.mobius-section .cta-row {
  position: absolute;
  bottom: 32px;
  left: 0; right: 0;
  margin: 0;
  z-index: 3;
  display: flex;
  justify-content: center;
}
@media (max-width: 600px) {
  .collection-section.mobius-section { height: 100svh; min-height: 100svh; }
}
/* Desktop browser ONLY: shrink the collection heading a lot so the (bigger) Möbius
   strip has room to weave around the words. Mobile sizes above are untouched.
   The <h2> also carries .word (the ~150px throw-up logo style), so these selectors
   are scoped under .mobius-heading to win on specificity. */
@media (min-width: 860px) {
  .mobius-heading .mobius-title   { font-size: clamp(34px, 3.6vw, 54px); line-height: 1; margin-bottom: 12px; }
  .mobius-heading .mobius-sub     { font-size: 14px; }
  .mobius-heading .mobius-eyebrow { font-size: 10px; margin-bottom: 10px; }
  /* ring stays centred + symmetrical (no offset) */
}

/* ── Phone-only type tweaks (≤600px). Desktop + tablet untouched. ── */
@media (max-width: 600px) {
  /* landing hero headline a touch bigger */
  .hero-copy .word { font-size: clamp(52px, 15vw, 132px); }
  /* second-page (Collection) heading — centred + a touch bigger */
  .mobius-heading .mobius-title { font-size: clamp(26px, 7.2vw, 40px); line-height: 1.06; }
  /* phone: heading sits in the upper-middle (off the ring centre, lower than the very top) */
  .mobius-heading { top: 15%; transform: none; }
}

/* ---- rolodex: 2D shirts that have been done ---- */
.rolodex { position: relative; max-width: var(--maxw); margin: 8px auto 0; display: flex; align-items: center; }
.rdx-track { display: flex; gap: 14px; overflow-x: auto; scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch; scrollbar-width: none; padding: 14px calc(50% - 90px); width: 100%; }
.rdx-track::-webkit-scrollbar { display: none; }
.rdx-card { flex: 0 0 180px; scroll-snap-align: center; color: var(--ink);
  border-radius: 16px; overflow: hidden;
  opacity: .45; transform: scale(.9); transition: transform .4s var(--ease), opacity .4s var(--ease); }
.rdx-card.on { opacity: 1; transform: scale(1); }
.rdx-shot { border-radius: 0; overflow: hidden; background: transparent; aspect-ratio: 4 / 5;
  box-shadow: none; }
.rdx-shot img { width: 100%; height: 100%; object-fit: cover; }
.rdx-shot img.raw { object-fit: contain; padding: 12%; background: #f1f0ec; }
.rdx-cap { display: flex; justify-content: space-between; align-items: baseline; padding: 13px 4px 0; }
.rdx-cap b { font-weight: 700; letter-spacing: .01em; text-transform: uppercase; font-size: 14px; }
.rdx-cap span { font-size: 12px; color: #8b8b82; letter-spacing: .04em; }
.rdx-arrow { position: absolute; top: 40%; z-index: 5; width: 46px; height: 46px; border-radius: 50%;
  border: 1px solid rgba(0,0,0,.12); background: rgba(255,255,255,.92); -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px); font-size: 22px; line-height: 1; color: var(--ink); cursor: pointer;
  display: grid; place-items: center; box-shadow: 0 4px 16px rgba(0,0,0,.10); transition: transform .2s; }
.rdx-arrow:hover { transform: scale(1.08); }
.rdx-arrow.prev { left: 8px; } .rdx-arrow.next { right: 8px; }
.rdx-dots { display: flex; gap: 4px; justify-content: center; margin: 20px 0 0; flex-wrap: wrap; max-width: var(--maxw); }
.rdx-dot { width: 20px; height: 20px; border-radius: 50%; border: 0; background: rgba(0,0,0,.20);
  background-clip: content-box; padding: 6px; cursor: pointer; transition: background .25s; }
.rdx-dot.on { background: var(--ink); background-clip: content-box; }

.motion-head { max-width: var(--maxw); margin: 60px auto 18px; display: flex; align-items: baseline; gap: 12px; }
.motion-head h3 { font-size: clamp(20px, 3vw, 30px); font-weight: 700; text-transform: uppercase; letter-spacing: -.01em; }
.motion-head span { color: #8b8b82; font-size: 13px; letter-spacing: .04em; }

@media (max-width: 720px) {
  .rdx-card { flex-basis: 52vw; }
  .rdx-track { padding: 14px calc(50% - 26vw); }
  .rdx-arrow { display: none; }   /* swipe on phones */
}

.gallery2 .cta-row { max-width: var(--maxw); margin: 40px auto 0; display: flex; justify-content: center; }
.btn-pill { display: inline-flex; align-items: center; gap: .6em; padding: 16px 34px;
  border-radius: 100px; background: var(--ink); color: #fff; font-weight: 600;
  letter-spacing: .12em; text-transform: uppercase; font-size: 13px; transition: transform .3s var(--ease); }
.btn-pill:hover { transform: translateY(-2px); }

/* ------------------------------------------------------- footer --- */
/* Clean white base band under the dark site — a thin gold hairline marks the
   seam with the dark section above and ties the brand accent in. */
.v2foot { background:#fff; color:#18181a; padding:52px var(--gut) 36px; text-align:center;
  border-top:1px solid rgba(183,138,46,.4); }
.foot-inner { display:flex; flex-direction:column; align-items:center; gap:16px; }
.foot-brand { display:flex; align-items:center; gap:10px; }
.foot-mark { width:30px; height:30px; border-radius:7px; flex:none; }
.foot-wordmark { font-family:'Titan One',system-ui,sans-serif; font-size:15px;
  letter-spacing:.1em; color:#18181a; text-transform:uppercase; }
.foot-tagline { font-size:12px; color:#565659; letter-spacing:.05em;
  text-transform:uppercase; margin:0; }
.foot-socials { display:flex; gap:8px; align-items:center; margin-top:2px; }
/* 44px tap targets (mobile), dark icons, hover lifts + goes brand-gold */
.foot-social { color:#3a3a3c; display:flex; align-items:center; justify-content:center;
  width:44px; height:44px; border-radius:50%;
  transition:color .2s ease, background-color .2s ease, transform .2s cubic-bezier(.2,.8,.3,1); }
.foot-social:hover { color:#b78a2e; background:rgba(183,138,46,.1); transform:translateY(-2px); }
.foot-copy { font-size:11px; color:#5f5f63; letter-spacing:.03em; margin:6px 0 0; }
@media (prefers-reduced-motion: reduce) {
  .foot-social { transition:color .2s ease, background-color .2s ease; }
  .foot-social:hover { transform:none; }
}


/* TRUEF throw-up logo — hero wordmark (designed logo) */
.word{
  font-family:'Titan One',system-ui,sans-serif; font-weight:400;
  text-transform:uppercase; line-height:.9; letter-spacing:.005em;
  font-size:clamp(46px,12.5vw,150px); max-width:12ch;
  color:#faf7f2; -webkit-text-stroke:3px #15151a; paint-order:stroke fill;
  text-shadow:
    .018em .018em 0 #15151a,.036em .036em 0 #15151a,.054em .054em 0 #15151a,
    .072em .072em 0 #15151a,.09em .09em 0 #15151a,.108em .108em 0 #15151a,
    .126em .126em 0 #15151a,.144em .144em 0 #15151a,
    .17em .21em .12em rgba(0,0,0,.32);
}

/* logo to top-left, beside the hamburger menu */
.v2nav{ display:flex; align-items:center; gap:12px; }
.v2nav .mark{ justify-self:start; }
.v2nav .acct{ margin-left:auto; }
/* logo: smaller + softer so it blends into the hero */
.v2nav .mark{ color: rgba(255,255,255,.84); text-shadow: 0 1px 10px rgba(0,0,0,.16); }
.v2nav .navmark{ width: 18px; height: 18px; }
.v2nav .navword{ font-size: clamp(12px, 1.3vw, 14px); letter-spacing: .04em; }
/* hero tagline + blurb */
.hero-tag{ font-weight:800; text-transform:uppercase; letter-spacing:.13em;
  font-size:clamp(13px,1.7vw,19px); color:rgba(255,255,255,.95); margin-top:16px; }
.hero-blurb{ font-weight:500; font-size:clamp(12px,1.35vw,15px); color:rgba(255,255,255,.72);
  margin-top:7px; max-width:34ch; line-height:1.5; }
/* top-left logo = the throw-up wordmark — a touch bigger + thicker (bolder read) */
.v2nav .navword{ font-family:'Titan One', system-ui, sans-serif; font-weight:400;
  letter-spacing:.02em; font-size:clamp(19px,2.1vw,25px);
  -webkit-text-stroke:1px rgba(0,0,0,.4); }
.v2nav .mark{ color:#fff; }                 /* full white so the bigger logo reads strong */
.v2nav .navmark{ width:27px; height:27px; }
/* ============================================================
 *  HERO 3D SPACE — a lit studio room BEHIND the floating garment.
 *  Back-wall grid + a perspective FLOOR whose lines recede to a
 *  horizon, a soft SPOTLIGHT pool behind the garment, an edge
 *  VIGNETTE for depth. The whole room rides the cycling --stage-bg
 *  colour; the grid/glow are white-alpha so they read on every
 *  colourway. Pure CSS/DOM — decoupled from the WebGL camera, so it
 *  can NEVER fight a drag (this is what was reintroducing the glitch).
 * ============================================================ */
.hero-stage{ background: #000; }

/* Background video — sits behind everything, no upscaling, loops */
.hero-bg-video{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:contain; z-index:0; pointer-events:none;
  display:block;
}
@media (max-width:859px){
  /* landscape video (752×400) would letterbox badly on portrait phones — crop to fill instead */
  .hero-bg-video{ object-fit:cover; }
}
@media (min-width:860px){
  /* Desktop/browser: fill the entire screen (was object-fit:contain, which letterboxed). */
  .hero-bg-video{ object-fit:cover; }
}

.hero-room{
  position:absolute; inset:0; z-index:0; overflow:hidden; pointer-events:none;
  perspective:760px; perspective-origin:60% 46%;
}
.room-grid{
  position:absolute; left:50%; will-change:transform;
  background-image:
    linear-gradient(rgba(255,255,255,.17) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.17) 1px, transparent 1px);
}
/* BACK WALL — fine grid that fades up + toward the centre light */
.room-wall{
  top:-12%; width:220%; height:86%; transform:translateX(-50%);
  background-size:62px 62px; opacity:.92;
  -webkit-mask-image:radial-gradient(135% 108% at 50% 94%, #000 10%, transparent 78%);
          mask-image:radial-gradient(135% 108% at 50% 94%, #000 10%, transparent 78%);
}
/* FLOOR — grid laid down in perspective, receding to the horizon (brighter +
   denser than the wall so the recession reads through the foreshortening) */
.room-floor{
  bottom:-4%; width:250%; height:130%;
  transform:translateX(-50%) rotateX(80deg); transform-origin:50% 100%;
  background-size:78px 78px; opacity:1;
  background-image:
    linear-gradient(rgba(255,255,255,.26) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.26) 1px, transparent 1px);
  -webkit-mask-image:linear-gradient(to top, #000 0%, rgba(0,0,0,.6) 30%, transparent 70%);
          mask-image:linear-gradient(to top, #000 0%, rgba(0,0,0,.6) 30%, transparent 70%);
}
/* studio SPOTLIGHT pool behind the garment — gentle, so it lifts the grid
   rather than washing it out */
.room-glow{
  position:absolute; inset:0; will-change:transform;
  background:radial-gradient(54% 48% at 60% 42%,
    rgba(255,255,255,.20) 0%, rgba(255,255,255,.06) 34%, transparent 66%);
}
/* edge VIGNETTE — frames the scene + pushes the centre back */
.room-vignette{
  position:absolute; inset:0;
  background:radial-gradient(128% 120% at 60% 42%,
    transparent 36%, rgba(0,0,0,.15) 70%, rgba(0,0,0,.42) 100%);
}
/* mobile: garment is centred, so centre the light + tighten the room */
@media (max-width:859px){
  .hero-room{ perspective-origin:50% 48%; }
  .room-glow{ background:radial-gradient(64% 46% at 50% 44%,
    rgba(255,255,255,.30) 0%, rgba(255,255,255,.09) 32%, transparent 64%); }
  .room-vignette{ background:radial-gradient(130% 120% at 50% 44%,
    transparent 38%, rgba(0,0,0,.14) 72%, rgba(0,0,0,.40) 100%); }
}

/* bigger, softer contact shadow so the garment reads as floating ABOVE the floor */
.garment-shadow{
  bottom:13%; width:min(42vw, 420px); height:34px;
  background:radial-gradient(ellipse at center, rgba(0,0,0,.32), transparent 72%);
  filter:blur(10px);
}
@media (min-width:860px){ .garment-shadow{ right:10%; bottom:15%; } }

/* ============================================================
 *  HERO 3D DEPTH PASS — floor reflection, grounded shadow,
 *  directional key + rim light, depth-of-field + atmosphere.
 *  Pure CSS/DOM (everything below the garment, z<2), decoupled
 *  from the WebGL camera — so it can NEVER fight a drag.
 * ============================================================ */

/* #4 — vertical luminance + atmosphere: the backdrop stops reading as a flat swatch
   (lighter through the middle where the garment sits, deeper at the top + floor). */
.room-lum{
  position:absolute; inset:0; pointer-events:none;
  background:linear-gradient(to bottom,
    rgba(0,0,0,.20) 0%, rgba(0,0,0,.05) 17%,
    transparent 42%, transparent 60%,
    rgba(0,0,0,.10) 82%, rgba(0,0,0,.27) 100%);
}

/* #3 — KEY light: directional, off-axis (upper-left) instead of a centred blob */
.room-glow{
  background:radial-gradient(60% 70% at 36% 20%,
    rgba(255,255,255,.22) 0%, rgba(255,255,255,.06) 40%, transparent 66%);
}
/* #3 — RIM / back light: a tight bright pool right behind the garment so its
   silhouette separates from the backdrop. The garment canvas sits ON TOP of this,
   so only the edges catch the light — instant volume. */
.room-halo{
  position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(21% 26% at 60% 43%,
    rgba(255,255,255,.40) 0%, rgba(255,255,255,.11) 46%, transparent 70%);
}
/* #4 — soft light haze for air around the pool */
.room-haze{
  position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(46% 40% at 52% 32%, rgba(255,255,255,.09), transparent 70%);
  filter:blur(8px);
}

/* #4 — depth of field: the room recedes (soft) so the floating garment is the
   only razor-sharp plane — exactly how a camera renders depth. */
.room-wall{ filter:blur(2px); }
.room-floor{ filter:blur(1.4px); }

/* #1 — FLOOR REFLECTION: a soft colour-bleed of the garment onto the matte floor.
   The colour is set per-garment by landing3d.js via --garment-reflect. */
.garment-reflect{
  position:absolute; bottom:11%; left:50%; transform:translateX(-50%);
  width:min(38vw,392px); height:74px; border-radius:50%;
  background:radial-gradient(ellipse at center,
    var(--garment-reflect, transparent) 0%, transparent 68%);
  opacity:.32; filter:blur(17px); z-index:1; pointer-events:none;
  transition:background 1s var(--ease), opacity 1s var(--ease);
}

/* #2 — GROUNDED contact shadow: a dark AO core right under the hem + a soft wide
   falloff, flattened so it sits ON the floor (replaces the single detached ellipse). */
.garment-shadow{
  bottom:12%; width:min(40vw,408px); height:30px;
  background:
    radial-gradient(ellipse 42% 100% at center, rgba(0,0,0,.44) 0%, transparent 60%),
    radial-gradient(ellipse at center, rgba(0,0,0,.30) 0%, transparent 72%);
  filter:blur(9px);
}

@media (min-width:860px){
  /* desktop: garment sits right-of-centre — anchor the reflection + shadow under it */
  .garment-reflect{ left:auto; right:10%; bottom:13%; }
  .garment-shadow{ right:10%; bottom:14%; }
}
@media (max-width:859px){
  /* mobile: lighter depth-of-field for perf; centre the key + rim on the centred garment */
  .room-wall{ filter:blur(1.3px); }
  .room-floor{ filter:blur(1px); }
  .room-glow{ background:radial-gradient(64% 64% at 34% 22%,
    rgba(255,255,255,.24) 0%, rgba(255,255,255,.07) 38%, transparent 64%); }
  .room-halo{ background:radial-gradient(26% 26% at 50% 45%,
    rgba(255,255,255,.40) 0%, rgba(255,255,255,.12) 46%, transparent 70%); }
}

/* ============================================================
 *  #5 — LIVING LIGHT + DEPTH PARALLAX (the space feels lit + alive)
 * ============================================================ */
/* The studio breathes: the spotlight pulses + the haze drifts. We animate the
   glow's OPACITY only (the parallax JS owns its transform) and the haze freely
   (JS never touches it). Calm + slow; off for reduced-motion users. */
@media (prefers-reduced-motion: no-preference){
  .room-glow{ animation: keyBreathe 11s ease-in-out infinite; }
  .room-haze{ animation: hazeDrift 15s ease-in-out infinite; }
}
@keyframes keyBreathe{ 0%,100%{ opacity:.9 } 50%{ opacity:1 } }
@keyframes hazeDrift{
  0%,100%{ opacity:.8; transform:translate3d(0,0,0) scale(1); }
  50%    { opacity:1;  transform:translate3d(0,-1.4%,0) scale(1.05); }
}
/* Depth parallax couples the GROUND: the contact shadow + colour reflection nudge
   with the room (--ground-shift set by the parallax loop) so the floor reads as one
   connected plane under the garment. Keeps the existing -50% centring. */
.garment-reflect{ transform: translateX(calc(-50% + var(--ground-shift, 0px))); }
.garment-shadow{  transform: translateX(calc(-50% + var(--ground-shift, 0px))); }

/* ============================================================
 *  3D POLISH PASS — more depth + tactility (additive, no engine
 *  changes). Extruded nav logo, glassy bevelled CTA, cursor-tilt
 *  Collection cards, a one-time cinematic "lights on" open, and a
 *  soft top key on the garment. All reduced-motion-safe.
 * ============================================================ */

/* — nav wordmark: a small 3D extrude so even the logo has depth — */
.v2nav .navword{
  color:rgba(255,255,255,.82);
  text-shadow: 0 1px 8px rgba(0,0,0,.45);
  -webkit-text-stroke: 0;
}

/* — CTA pill: bevel + lift, presses in on tap — */
.btn-pill{
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.18),
    inset 0 -2px 0 rgba(0,0,0,.35),
    0 12px 26px -12px rgba(0,0,0,.55);
  transition:transform .25s var(--ease), box-shadow .25s var(--ease);
}
.btn-pill:hover{ transform:translateY(-2px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22), inset 0 -2px 0 rgba(0,0,0,.4), 0 18px 34px -14px rgba(0,0,0,.6); }
.btn-pill:active{ transform:translateY(0); box-shadow:inset 0 2px 5px rgba(0,0,0,.5); }

/* — Collection cards: a real 3D tilt toward the cursor (JS sets the rotate + glare) — */
.rolodex{ perspective:1200px; }
.rdx-card{ transform-style:preserve-3d; }
.rdx-shot{ position:relative; will-change:transform;
  transform:rotateX(0) rotateY(0);
  transition:transform .25s var(--ease), box-shadow .3s var(--ease); }
.rdx-card.on .rdx-shot{ box-shadow:none; }
.rdx-shot::after{        /* soft glare that tracks the tilt (--gx/--gy from JS) */
  content:""; position:absolute; inset:0; border-radius:inherit; pointer-events:none;
  background:radial-gradient(42% 60% at var(--gx,50%) var(--gy,0%), rgba(255,255,255,.30), transparent 60%);
  opacity:0; transition:opacity .3s var(--ease); mix-blend-mode:screen; }
.rdx-card.tilting .rdx-shot::after{ opacity:1; }

/* — soft TOP KEY on the garment: studio light catching the shoulders/print — */
.garment-key{
  position:absolute; left:50%; top:23%; transform:translateX(-50%);
  width:min(30vw,300px); height:30%; z-index:3; pointer-events:none;
  background:radial-gradient(ellipse at 50% 0%, rgba(255,255,255,.17), transparent 66%);
  mix-blend-mode:screen; filter:blur(6px); }
@media (min-width:860px){ .garment-key{ left:auto; right:18%; } }

/* room gently blooms in on load — garment wrapper is NOT animated (poster lives there) */
.hero-stage.intro .hero-room{ animation:roomOn 1.2s var(--ease) both; }
@keyframes roomOn{ 0%{ opacity:0; } 100%{ opacity:1; } }

@media (prefers-reduced-motion: reduce){
  .hero-stage.intro .hero-room{ animation:none; }
}

/* ============================================================
 *  TAMED + LEGIBLE + ADAPTIVE NAV  (2026-06-22)
 *  Pairs with the on-brand deep BACKDROPS in landing3d.js. The
 *  stage now always lands dark enough for white copy; here we
 *  (a) promote the hero statement to a real display headline,
 *  (b) anchor + scrim the copy so it's legible on every cycle
 *      and never fights the floating garment, (c) let the fixed
 *  nav flip to ink once it crosses onto the white gallery.
 * ============================================================ */

/* — hero statement — Anton = bold condensed graffiti headline — */
.hero-copy .hero-tag{
  margin-top:0; max-width:14ch;
  font-family:'Anton', system-ui, sans-serif;
  font-weight:400; text-transform:uppercase;
  font-size:clamp(54px, 10vw, 110px); line-height:.95; letter-spacing:.02em;
  color:#fff; text-wrap:balance;
  text-shadow:0 3px 32px rgba(0,0,0,.55), 0 1px 4px rgba(0,0,0,.40);
}
.hero-copy .hero-blurb{
  margin-top:18px; max-width:36ch;
  font-family:'Anton', system-ui, sans-serif;
  font-weight:400; text-transform:uppercase; letter-spacing:.04em;
  font-size:clamp(14px, 1.6vw, 20px); line-height:1.45;
  color:#fff;
  text-shadow:0 1px 14px rgba(0,0,0,.50);
}
.hero-sub a{ opacity:.92; color:#fff; font-weight:700; }
.hero-sub a.on, .hero-sub a:hover{ opacity:1; }
.hero-cap{ color:rgba(255,255,255,.85); }
.hero-cap b{ color:#fff; }

/* — entrance: a SELF-RUNNING CSS animation (never gated on a JS class) so the copy
 *   is guaranteed to end visible even if JS/reveal never fires. The animation wins
 *   over the legacy `.reveal` opacity:0 default, and its resting state is opacity:1.
 *   reduced-motion users get the instant-visible fallback below. — */
@media (prefers-reduced-motion: no-preference){
  .hero-copy .word{ animation:heroCopyIn .8s var(--ease) .05s both; }
  .hero-copy .hero-blurb{ animation:heroCopyIn .8s var(--ease) .16s both; }
  .hero-copy .hero-line{ animation:heroCopyIn .8s var(--ease) .24s both; }
  .hero-copy .hero-sub{ animation:heroCopyIn .8s var(--ease) .30s both; }
}
@keyframes heroCopyIn{ from{ opacity:0; transform:translateY(16px); } to{ opacity:1; transform:none; } }

/* reveal must never gate visibility on headless / hidden tabs — show all at once */
@media (prefers-reduced-motion: reduce){
  .hero-copy .word, .hero-copy .hero-tag, .hero-copy .hero-blurb,
  .hero-copy .hero-line, .hero-copy .hero-sub, .hero-copy .hero-cap{
    opacity:1 !important; transform:none !important; transition:none !important;
  }
}

/* — MOBILE: anchor the copy to the bottom, over the room's darkest band
 *   (room-lum deepens the floor) so the white copy never sits on the white
 *   shirt — this kills the flagged low-contrast overlap. — */
@media (max-width:859px){
  /* Fix scroll: OrbitControls sets touch-action:none on the canvas, blocking page scroll. */
  .hero-garment, #garment3d { pointer-events: none; }

  /* Hero background fills the full screen */
  .hero-stage{ min-height:100vh; min-height:100svh; }

  /* Garment: contained box bottom-right */
  .hero-garment{
    top:auto; left:auto; right:0; bottom:0;
    width:44vw; height:66vw;
  }
  .hero-garment::after{ display:none; }

  /* Bottom scrim to keep text legible over the 3D canvas */
  .hero-stage::before{
    content:""; position:absolute; bottom:0; left:0; right:0; height:60%;
    background:linear-gradient(to top, rgba(0,0,0,.70) 0%, rgba(0,0,0,.32) 48%, transparent 84%);
    z-index:1; pointer-events:none;
  }

  /* Hero copy: left side, bottom-left; padding-right keeps it clear of the garment */
  .hero-copy{
    padding-top:0; align-self:end;
    text-align:left;
    padding-left:var(--gut);
    padding-right:46vw;
    padding-bottom:calc(4vh + env(safe-area-inset-bottom));
  }
  .hero-copy .hero-tag{ font-size:clamp(40px, 11vw, 60px); }
  .hero-copy .hero-blurb{ max-width:22ch; margin-left:0; font-size:clamp(13px,3.5vw,17px); }
  .hero-line{ margin-left:0; margin-right:auto; max-width:160px; }
  .hero-sub{ justify-content:flex-start; font-size:14px; }

  /* Scroll cue hidden on mobile */
  .scroll-cue{ display:none; }

  /* Gallery: lighter overlay so the bg video actually reads */
  .gallery2::after{ background:rgba(0,0,0,.30); }
  .gallery2-head{ text-align:right; }
  .gallery2-head h2{ font-size:clamp(20px, 5.5vw, 32px); }
  .gallery2-head p{ margin-left:auto; }
}

/* — adaptive nav: ink-on-glass once past the hero (white sections) — */
.v2nav{ transition:background .35s var(--ease), color .35s var(--ease), box-shadow .35s var(--ease); }
.v2nav.on-light{
  color:var(--ink);
  background:rgba(255,255,255,.82);
  -webkit-backdrop-filter:saturate(1.4) blur(12px);
          backdrop-filter:saturate(1.4) blur(12px);
  box-shadow:0 1px 0 rgba(0,0,0,.06), 0 8px 24px -18px rgba(0,0,0,.4);
}
.v2nav.on-light .mark{ color:var(--ink); }
.v2nav.on-light .navword{ color:var(--ink); text-shadow:none; -webkit-text-stroke:1px rgba(0,0,0,.16); }
.v2nav.on-light .menu span{ background:var(--ink); }
.v2nav.on-light .acct{ border-color:var(--ink); }

/* — tile flash tints: muted on-brand stone/sage (only seen before a clip loads) — */
.tile:nth-child(8n+1){--t:#e6e3da} .tile:nth-child(8n+2){--t:#dfe4d8} .tile:nth-child(8n+3){--t:#dde2da}
.tile:nth-child(8n+4){--t:#e4ddd0} .tile:nth-child(8n+5){--t:#e8e3d6} .tile:nth-child(8n+6){--t:#dcdcd5}
.tile:nth-child(8n+7){--t:#e1ddd4} .tile:nth-child(8n+8){--t:#d9d6cd}

/* — Video bg is always dark → keep hero copy white regardless of light-stage — */
@media (min-width:860px){
  .hero-stage.light-stage .hero-copy { color: #fff; text-shadow: 0 2px 20px rgba(0,0,0,.5); }
  .hero-stage.light-stage .hero-copy .hero-tag,
  .hero-stage.light-stage .hero-copy .hero-blurb,
  .hero-stage.light-stage .hero-copy .word { color: #fff; }
  .hero-stage.light-stage .hero-copy .hero-sub { color: rgba(255,255,255,.9); }
  .hero-stage.light-stage .hero-cap { color: rgba(0,0,0,.55); }
}

/* ─── COLLECTION BAND — rolodex on its own bg video ─────────────────────── */
.collection-band{
  position:relative; overflow:hidden;
  padding: 0 0 clamp(24px, 4vw, 48px);
}
.collection-bg-video{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; z-index:0; pointer-events:none;
}
.collection-band::after{
  content:""; position:absolute; inset:0;
  background:rgba(0,0,0,.48); z-index:1; pointer-events:none;
}
.collection-band .rolodex,
.collection-band .rdx-dots{ position:relative; z-index:2; }

/* On mobile: hide the ghost poster so only the live 3D shows. */
@media (max-width:859px){
  .hero-poster{ display:none; }
}

/* ─── ROLODEX — frosted glass cards, video shows through ─────────────────────
 *  Semi-transparent background + backdrop-filter blur so the collection video
 *  is visible behind each card. No neon colors — clean and premium.
 * ─────────────────────────────────────────────────────────────────────────── */
.rdx-shot{ background:transparent; }
.rdx-shot img:not(.raw){ object-fit:contain; padding:4%; }
.rdx-shot img.raw{ object-fit:contain; padding:5%; background:transparent; }

/* ─── Cards: semi-transparent so the section video shows through ─────── */
.rdx-track .rdx-card{
  background: rgba(255,255,255,0.08);
  -webkit-backdrop-filter: blur(2px);
          backdrop-filter: blur(2px);
  border: 1px solid rgba(255,255,255,0.15);
}
.rdx-card.on{
  box-shadow: 0 0 0 2px rgba(255,255,255,.55), 0 22px 48px -20px rgba(0,0,0,.4);
  background: rgba(255,255,255,0.10);
}
.collection-band .rdx-cap b{ color: #fff; }
.collection-band .rdx-cap span{ color: rgba(255,255,255,.75); }

/* Video card — fills its shot the same way images do */
.rdx-video { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: inherit; }

/* Mobile: restore original gallery overlay + text alignment */
@media (max-width:859px){
  .gallery2::after{ background: rgba(0,0,0,.30); }
  .gallery2-head{ text-align: right; }
  .gallery2-head p{ margin-left: auto; }
}

/* ─── Hero headline — no border, just bigger ─────────────────────────────── */
.hero-copy .word{
  font-size: clamp(32px, 7.5vw, 90px);
  line-height: 1.08;
  max-width: 20ch;
}

/* ─── "Create" CTA — red rounded-rect button in the hero ────────────────── */
.hero-sub a.on{
  display: inline-block;
  border: 2.5px solid #e8001d;
  border-radius: 50px;
  padding: 8px 22px;
  color: #fff;
  box-shadow: 0 0 18px 2px rgba(232,0,29,.35);
  transition: box-shadow .25s var(--ease), background .25s var(--ease);
}
.hero-sub a.on:hover{
  background: rgba(232,0,29,.15);
  box-shadow: 0 0 28px 4px rgba(232,0,29,.5);
}

/* ── Effects layer ────────────────────────────────────────────────────────── */

/* 9. Portal CTA */
.portal-fired{
  transform:scale(0.94) !important;
  opacity:.65 !important;
  transition:transform .15s ease, opacity .15s ease !important;
}

/* ── How It Works overrides — placed LAST so they survive the section being
   restructured: the studio photo shown at FULL strength (no lightening wash).
   Safe because the photo is a bright studio (~206/255 avg in the copy zone), so
   the section still reads light and the dark HIW text stays legible on it. ── */
.hiw {
  background:
    radial-gradient(120% 90% at 50% -6%, rgba(183,138,46,.10), transparent 62%),
    url('/static/media/hiw-studio.jpg') center / cover no-repeat #fff !important;
}
.hiw-show { display: none !important; }              /* remove the olive-hoodie model */
.hiw-grid { grid-template-columns: 1fr !important; } /* copy fills the row now the visual is gone */

/* ============================================================
 *  WHITE THEME — fully REMOVED 2026-07-06 (Luke's call, second pass).
 *  He rejected the light hero (wanted the MP4 video back) and then the
 *  ink-black section headlines ("everything black is terrible"), so the
 *  whole site-wide light conversion is gone: hero/collection/studio/
 *  gallery are back on the original dark theme with the off-white
 *  outlined display type. The white footer + How-It-Works above were
 *  separate, Luke-approved conversions and remain.
 * ============================================================ */

/* ============================================================
 *  RED FLOWER — brand accent (2026-07-06, Luke's call).
 *  The campaign's red brush flower (#E32B25, the locked TRUEF red)
 *  is the site's accent mark: it's the favicon, and every primary
 *  CTA blooms red on hover/focus. Additive only — no layout change.
 * ============================================================ */
.btn-pill:hover, .btn-pill:focus-visible,
.hiw-cta:hover, .hiw-cta:focus-visible {
  box-shadow: 0 0 0 2px rgba(227,43,37,.55), 0 10px 34px rgba(227,43,37,.30);
  transition: box-shadow .3s cubic-bezier(.22,1,.36,1);
}
@media (prefers-reduced-motion: reduce) {
  .btn-pill:hover, .hiw-cta:hover { transition: none; }
}

/* — NAV BRAND LOCKUP: red flower + "Truef." script wordmark (2026-07-06).
     The script letters ride currentColor so the nav's on-light flip
     recolours them (white over the dark hero → ink over light sections);
     the square full-stop stays TRUEF red in both states. — */
.navword-svg { height: 30px; width: auto; display: block; }
.v2nav .navmark { width: 30px; height: 30px; }
@media (max-width: 640px) {
  .navword-svg { height: 24px; }
  .v2nav .navmark { width: 24px; height: 24px; }
}
