/* ELIXYR. Obsidian #161412, Dusk #28231E, Cream #EDE9E0, Sand #D4C8B0.
   Scent Tier 2: Amber #B07A35, Oud #6B2A18, Musk #7A6880, Neroli #C2703A, Verveine #4A7060 */

/* ===== SELF-HOSTED TYPE (ruling 03/07/2026: no third-party font request) =====
   Variable latin woff2 masters cover the 300-500 range used by the brand. */
@font-face{
  font-family:'Jost';font-style:normal;font-weight:300 500;font-display:swap;
  src:url(/assets/fonts/jost-latin.woff2) format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{
  font-family:'Montserrat';font-style:normal;font-weight:300 500;font-display:swap;
  src:url(/assets/fonts/montserrat-latin.woff2) format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

/* ===== DESIGN TOKENS ===== */
/* Ported from design-system/tokens (SPEC.md v1.0, locked 17/06/2026).
   This block is the single token layer; everything below consumes it. */
:root{
  /* Tier 1: core palette */
  --obsidian:#161412; --dusk:#28231E; --cream:#EDE9E0; --sand:#D4C8B0;
  /* tonal extensions for UI depth */
  --cream-hi:#F4F1EA; --sand-deep:#C2B498; --dusk-hi:#342E27;
  --hairline:rgba(22,20,18,.12); --hairline-light:rgba(237,233,224,.16);
  /* Tier 2: scent border colours (the SKU differentiator) */
  --amber:#B07A35; --oud:#6B2A18; --musk:#7A6880; --neroli:#C2703A; --verveine:#4A7060;
  --argan-oil:#E9B33D;

  /* typography: Montserrat = wordmark only, Jost = everything else. No serif, ever. */
  --font-wordmark:'Montserrat',system-ui,sans-serif;
  --font-body:'Jost',system-ui,sans-serif;
  --weight-light:300; --weight-regular:400; --weight-medium:500;
  --track-wordmark:.40em; --track-wordmark-hero:.34em;
  /* track-label amended .18em -> .25em, elevation pass 02/07/2026: one caps
     tracking for ALL microtype, wide enough to read as structure */
  --track-label:.25em; --track-body:.005em; --track-tight:.01em;
  --leading-tight:1.1; --leading-snug:1.3; --leading-body:1.65;
  /* the six sizes: nothing else exists (elevation pass, Lane 4) */
  --text-display:clamp(2.5rem,5vw,3.5rem);
  --text-h2:clamp(1.75rem,3vw,2.5rem);
  --text-h3:1.375rem;
  --text-lead:1.125rem;
  --text-body:1rem;
  --text-micro:.75rem;
  /* measures */
  --measure-display:18ch; --measure-lead:48ch; --measure-body:62ch;
  /* rhythm: one vertical beat between sections, one horizontal gutter */
  --space-section:clamp(5rem,10vh,8rem);
  --container:72rem;
  --gutter:clamp(1.4rem,5vw,4rem);

  /* spacing, radii, motion */
  --space-1:.25rem; --space-2:.5rem; --space-3:.75rem; --space-4:1rem; --space-5:1.5rem;
  --space-6:2rem; --space-7:3rem; --space-8:4rem; --space-9:6rem; --space-10:8rem;
  --radius-xs:1px; --radius-sm:2px; --radius-md:4px; --radius-lg:8px; --radius-pill:999px;
  --ease-quiet:cubic-bezier(.22,1,.36,1);
  --dur-fast:160ms; --dur-base:280ms; --dur-slow:520ms;
  --ease-sine:cubic-bezier(.445,.05,.55,.95);

  /* the hero material surface: Master Banks' macro oil-on-stone still
     (Higgsfield, approved 03/07/2026). The portrait crop takes over on
     mobile; hero.webm/hero.mp4 sit in assets/hero for the motion pass. */
  --hero-surface:url(/assets/hero/hero.jpg);
  /* site mappings onto the tokens */
  --mont:var(--font-wordmark); --jost:var(--font-body);
  --ease:var(--ease-quiet);
  /* world atmosphere depths (site-specific, darkened companions to Tier 2) */
  --amber-deep:#3A2710; --oud-deep:#2A130C; --musk-deep:#241F2A;
  --neroli-deep:#421E10; --verveine-deep:#1E2E25;
  --w:var(--sand); --w-deep:var(--obsidian);
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}

/* ===== THE TWO TYPE VOICES =====
   Display: Jost light, untracked, tight leading. Everything big.
   Label: Jost medium caps at one tracking. Every piece of microtype.
   The wordmark (Montserrat .4em) is the only third voice and lives on
   .nav-mark, .hero-mark, .loader-mark, .footer-mark alone. */
.manifesto-line,.world-title,.set-title,.ritual-title,.find-title,.result-title,.shelf-title{
  font-family:var(--font-body);font-weight:var(--weight-light);
  font-size:var(--text-display);line-height:var(--leading-tight);letter-spacing:0}
.hero-line,.world-line,.set-line,.find-sub,.ritual-sub,.footer-launch,.ritual-use{
  font-family:var(--font-body);font-weight:var(--weight-light);
  font-size:var(--text-lead);line-height:var(--leading-snug);color:var(--sand)}
.hero-eyebrow,.nav-links a,.nav-ritual,.world-element,.world-scent,.world-price,
.btn-ritual,.btn-ghost,.hero-cta,.quiz-opts button,.quiz-again,.result-scent,
.stat-label,.drawer-head p,.drawer-item-name,.drawer-total,.toast,
.shelf-eyebrow,.stage-rail-w,.stage-rail-shop,.footer-col-title,.footer-base{
  font-family:var(--font-body);font-weight:var(--weight-medium);
  font-size:var(--text-micro);letter-spacing:var(--track-label);text-transform:uppercase}
body{
  background:var(--obsidian); color:var(--cream); font-family:var(--jost);
  font-weight:300; line-height:1.6; overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
}
body[data-world="amber"]{--w:var(--amber);--w-deep:var(--amber-deep)}
body[data-world="oud"]{--w:var(--oud);--w-deep:var(--oud-deep)}
body[data-world="musk"]{--w:var(--musk);--w-deep:var(--musk-deep)}
body[data-world="neroli"]{--w:var(--neroli);--w-deep:var(--neroli-deep)}
body[data-world="verveine"]{--w:var(--verveine);--w-deep:var(--verveine-deep)}
::selection{background:var(--sand);color:var(--obsidian)}
img{max-width:100%;display:block}
button{font-family:inherit;cursor:pointer;background:none;border:none;color:inherit}
a{color:inherit;text-decoration:none}

/* ATMOSPHERE + GRAIN */
#atmosphere{position:fixed;inset:0;width:100%;height:100%;z-index:0;pointer-events:none;
  transition:opacity 1.2s var(--ease-sine)}
.grain{position:fixed;inset:-50%;width:200%;height:200%;z-index:1;pointer-events:none;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.6'/%3E%3C/svg%3E");
  animation:grain 7s steps(8) infinite}
@keyframes grain{0%,100%{transform:translate(0,0)}25%{transform:translate(-3%,2%)}50%{transform:translate(2%,-3%)}75%{transform:translate(-2%,-2%)}}

/* page glow follows world */
main::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(120% 90% at 50% 110%, var(--w-deep) 0%, transparent 60%);
  opacity:.85;transition:background 1.2s var(--ease-sine)}

/* LOADER */
.loader{position:fixed;inset:0;z-index:100;background:var(--obsidian);
  display:flex;align-items:center;justify-content:center;transition:opacity .45s var(--ease),visibility .45s}
.loader.is-done{opacity:0;visibility:hidden}
.loader-drop{position:absolute;top:18%;left:50%;width:10px;height:16px;margin-left:-5px;
  background:linear-gradient(180deg,var(--sand),var(--amber));border-radius:50% 50% 60% 60%/40% 40% 70% 70%;
  filter:blur(.3px);animation:drop .7s var(--ease) forwards}
@keyframes drop{0%{transform:translateY(0);opacity:0}15%{opacity:1}80%{transform:translateY(46vh);opacity:1}100%{transform:translateY(46vh) scaleY(.2);opacity:0}}
.loader-ripple{position:absolute;top:64%;left:50%;width:12px;height:12px;margin:-6px;border-radius:50%;
  border:1px solid var(--sand);opacity:0;animation:ripple .8s .55s var(--ease) forwards}
@keyframes ripple{0%{transform:scale(.2);opacity:.9}100%{transform:scale(26);opacity:0}}
.loader-mark{font-family:var(--mont);font-weight:400;letter-spacing:var(--track-wordmark);font-size:clamp(1.2rem,3.4vw,2rem);
  color:var(--cream);opacity:0;animation:markin .7s .45s var(--ease) forwards}
@keyframes markin{to{opacity:1}}

/* NAV: hairline chrome. Transparent over the hero, a quiet blurred bar with
   one hairline once scrolling begins (toggled by ScrollTrigger). */
.nav{position:fixed;top:0;left:0;right:0;z-index:50;display:flex;align-items:center;
  justify-content:space-between;padding:1.1rem clamp(1.2rem,4vw,3rem);
  background:transparent;border-bottom:1px solid transparent;
  transition:background .45s var(--ease),border-color .45s var(--ease)}
.nav.is-scrolled{background:rgba(22,20,18,.82);backdrop-filter:blur(12px);
  border-bottom-color:rgba(40,35,30,.9)}
.nav-mark{font-family:var(--mont);font-weight:400;letter-spacing:var(--track-wordmark);font-size:.95rem;padding-left:.4em}
.nav-links{display:flex;gap:2rem}
.nav-links a{color:var(--sand);transition:color .35s var(--ease)}
.nav-links a:hover{color:var(--cream)}
.nav-ritual{display:flex;align-items:center;gap:.55rem;color:var(--sand);transition:color .35s var(--ease)}
.nav-ritual:hover{color:var(--cream)}
.nav-ritual-count{display:inline-flex;align-items:center;justify-content:center;min-width:1.45rem;height:1.45rem;
  border:1px solid var(--sand);border-radius:50%;font-size:.62rem;letter-spacing:0;transition:.35s var(--ease)}
.nav-ritual.is-bump .nav-ritual-count{background:var(--sand);color:var(--obsidian)}

/* HERO: mobile is a centred stack with the full bottle standing beneath the
   copy; desktop is a two-column read, copy on the left grid line and the
   product at full height in the right column (audit 03/07/2026: the bottle is
   the hero, never cropped, MADE IN MOROCCO legible). */
.hero{position:relative;z-index:2;min-height:100svh;display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;
  padding:8svh 1.4rem 42svh;overflow:hidden}
.hero>*{position:relative;z-index:1}
/* the material surface: a graded macro of oil on stone. Until the asset
   lands, --hero-surface is unset and a quiet warm radial carries the depth. */
.hero-surface{position:absolute;inset:0;z-index:0;background:var(--obsidian)}
.hero-surface::before{content:"";position:absolute;inset:0;
  background-image:var(--hero-surface,radial-gradient(90% 68% at 50% 92%, #2A2016 0%, rgba(42,32,22,.4) 38%, transparent 68%));
  background-size:cover;background-position:center}
.hero-surface::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg, rgba(22,20,18,.5) 0%, rgba(22,20,18,.2) 42%, rgba(22,20,18,.82) 90%, var(--obsidian) 100%)}
/* the product in the first read: full bottle, never cropped by the section.
   Centred with flex, not transform: the .reveal entrance owns the transform. */
.hero-bottle-wrap{position:absolute;left:0;right:0;bottom:3svh;display:flex;
  justify-content:center;z-index:1;pointer-events:none}
.hero-bottle{height:min(36svh,330px);width:auto;filter:drop-shadow(0 30px 44px rgba(0,0,0,.55));
  animation:bfloat 6s var(--ease-sine) infinite alternate}
@media (min-width:841px){
  .hero{align-items:flex-start;text-align:left;padding-block:0;
    padding-inline:max(var(--gutter),calc((100vw - var(--container))/2))}
  .hero-mark{font-size:clamp(2.6rem,7.2vw,6.75rem)}
  .hero-bottle-wrap{left:auto;top:0;bottom:0;align-items:center;
    width:min(30vw,420px);
    right:max(var(--gutter),calc((100vw - var(--container))/2))}
  .hero-bottle{height:clamp(460px,64vh,560px)}
}
@keyframes bfloat{from{transform:translateY(0)}to{transform:translateY(-9px)}}
.is-reduced .hero-bottle{animation:none}
.hero-eyebrow{color:var(--sand)}
.hero-mark{font-family:var(--mont);font-weight:400;
  font-size:clamp(2.6rem,11vw,7.5rem);color:var(--cream);margin:var(--space-3) 0 var(--space-5)}
.hero-line{font-size:var(--text-h3)}
.hero-line em{font-style:normal}
.hero-cta{margin-top:var(--space-7);color:var(--cream);border:1px solid rgba(212,200,176,.45);
  padding:1rem 2.4rem;border-radius:var(--radius-pill);transition:.4s var(--ease)}
.hero-cta:hover{background:var(--cream);color:var(--obsidian);border-color:var(--cream)}

/* ===== THE LEFT GRID LINE =====
   One shared axis: content in every editorial section starts at the same x.
   Centring survives only in the hero and the quiz, the two single-focus
   moments. The axis is the max() of the gutter and the container margin. */
.manifesto,.set,.ritual,.footer,.shelf{text-align:left;
  padding-inline:max(var(--gutter),calc((100vw - var(--container))/2))}

/* MANIFESTO: an editorial pull quote on the grid line */
.manifesto{position:relative;z-index:2;padding-block:var(--space-section);background:var(--obsidian)}
.manifesto-line{max-width:var(--measure-display);margin:0}
.manifesto-line em{font-style:normal;color:var(--sand)}
.m-w{display:inline-block}

/* WORLDS */
.world-copy{max-width:30rem}
.world-element{text-shadow:0 1px 14px rgba(10,9,8,.9);color:var(--w);margin-bottom:var(--space-3);transition:color 1.2s var(--ease-sine)}
.world-title{color:var(--cream)}
.world-scent{color:var(--sand);margin:var(--space-3) 0 var(--space-5)}
.world-line{max-width:26rem}
.world-buy{display:flex;align-items:center;gap:var(--space-5);margin-top:var(--space-7);flex-wrap:wrap}
.world-price{color:var(--sand)}
.btn-ritual{color:var(--obsidian);background:var(--cream);padding:1rem 2.1rem;border-radius:var(--radius-pill);
  transition:.4s var(--ease);display:inline-block;text-align:center}
.btn-ritual:hover{background:var(--sand)}
.btn-ghost{color:var(--cream);border:1px solid rgba(237,233,224,.35);padding:.95rem 1.8rem;
  border-radius:var(--radius-pill);transition:.4s var(--ease)}
.btn-ghost:hover{border-color:var(--cream)}


/* SET */
.set{position:relative;z-index:2;min-height:90svh;display:flex;flex-direction:column;align-items:flex-start;
  justify-content:center;padding-block:var(--space-section)}
.set-row{align-self:center}
.set-title{margin:var(--space-3) 0 var(--space-5)}
/* a definite width: as a fit-content flex item this paragraph is hostage to
   SplitText re-measures (it collapsed to one word per line in the 03/07/2026
   audit); a set width ends the race in every engine */
.set-line{width:100%;max-width:min(28rem,100%)}
.set-row{display:flex;align-items:flex-end;justify-content:center;gap:clamp(.4rem,1.6vw,1.2rem);
  margin:var(--space-7) 0;perspective:800px}
.set-row img{height:clamp(170px,26vw,330px);width:auto;filter:drop-shadow(0 24px 36px rgba(0,0,0,.5));
  -webkit-box-reflect:below -6px linear-gradient(transparent 84%, rgba(0,0,0,.18))}
.set-options{display:flex;flex-direction:column;width:min(36rem,100%)}
.set-option{display:flex;align-items:center;justify-content:space-between;gap:1.2rem;flex-wrap:wrap;
  padding:1.15rem 0;border-bottom:1px solid var(--hairline-light);text-align:left}
.set-option:first-child{border-top:1px solid var(--hairline-light)}
.set-option-name{font-weight:var(--weight-light);font-size:var(--text-h3);flex:1 1 auto}
.set-option .world-price{flex:none}

/* RITUAL */
.ritual{position:relative;z-index:2;padding-block:var(--space-section)}
.ritual-title em{font-style:normal;color:var(--sand)}
.ritual-sub{max-width:var(--measure-lead);margin:var(--space-5) 0 0}
.ritual-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--space-6);max-width:62rem;
  margin:var(--space-8) 0 0}
.stat{display:flex;flex-direction:column;gap:.7rem;align-items:flex-start;text-align:left}
.stat-num{font-family:var(--font-body);font-weight:var(--weight-light);font-size:var(--text-h2);color:var(--cream)}
.stat-label{color:var(--sand);max-width:15rem;line-height:1.5;font-size:.6875rem}
.ritual-use{margin-top:var(--space-8)}

/* FIND */
.find{position:relative;z-index:2;min-height:100svh;padding:var(--space-section) var(--gutter);display:flex;
  flex-direction:column;align-items:center;text-align:center}
.find-sub{margin-top:var(--space-3)}
.quiz{margin-top:var(--space-8);width:min(46rem,100%)}
.quiz-step{display:none}
.quiz-step.is-active{display:block;animation:fadeup .7s var(--ease)}
@keyframes fadeup{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
/* one register for the quiz: the question speaks in the same caps-and-tracking
   voice as its pills, a size up for hierarchy (audit 03/07/2026, item 8) */
.quiz-q{font-family:var(--font-body);font-weight:var(--weight-medium);font-size:var(--text-body);
  letter-spacing:var(--track-label);text-transform:uppercase;margin-bottom:var(--space-6)}
.quiz-opts{display:flex;flex-wrap:wrap;gap:.9rem;justify-content:center}
.quiz-opts button{color:var(--cream);border:1px solid rgba(212,200,176,.4);padding:1rem 1.9rem;
  border-radius:var(--radius-pill);transition:.4s var(--ease)}
.quiz-opts button:hover{background:var(--cream);color:var(--obsidian);border-color:var(--cream)}
.quiz-result{animation:fadeup .8s var(--ease)}
.result-scent{color:var(--sand);margin:.8rem 0 1rem}
.result-actions{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-top:var(--space-7)}
.quiz-again{margin-top:var(--space-7);color:var(--sand);border-bottom:1px solid rgba(212,200,176,.4);padding-bottom:.2rem}

/* FOOTER: a structured map on the grid line */
.footer{position:relative;z-index:2;padding-block:var(--space-section) var(--space-7)}
.footer-grid{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:var(--space-7);
  max-width:var(--container)}
.footer-brand{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-5)}
.footer-mark{font-family:var(--mont);letter-spacing:var(--track-wordmark);font-size:1.3rem}
.footer-launch strong{color:var(--cream);font-weight:var(--weight-medium)}
.footer-col{display:flex;flex-direction:column;gap:var(--space-3);align-items:flex-start}
.footer-col-title{font-family:var(--font-body);font-weight:var(--weight-medium);
  font-size:var(--text-micro);letter-spacing:var(--track-label);text-transform:uppercase;
  color:var(--sand);margin-bottom:var(--space-2)}
.footer-col a,.footer-col span{font-size:var(--text-body);font-weight:var(--weight-light);
  color:var(--sand);transition:color .35s var(--ease)}
.footer-col a:hover{color:var(--cream)}
.footer-base{display:flex;justify-content:space-between;gap:var(--space-5);flex-wrap:wrap;
  max-width:var(--container);margin-top:var(--space-8);padding-top:var(--space-5);
  border-top:1px solid var(--hairline-light);
  font-size:var(--text-micro);letter-spacing:var(--track-label);text-transform:uppercase;
  font-weight:var(--weight-medium);color:var(--sand)}

/* RITUAL DRAWER */
.drawer-veil{position:fixed;inset:0;z-index:60;background:rgba(10,9,8,.6);backdrop-filter:blur(3px);
  opacity:0;transition:opacity .4s var(--ease)}
.drawer-veil.is-open{opacity:1}
.drawer{position:fixed;top:0;right:0;bottom:0;z-index:61;width:min(420px,92vw);background:var(--dusk);
  display:flex;flex-direction:column;transform:translateX(100%);transition:transform .9s var(--ease);
  border-left:1px solid rgba(212,200,176,.15)}
.drawer.is-open{transform:none}
.drawer-head{display:flex;align-items:center;justify-content:space-between;
  padding:1.6rem 1.8rem;border-bottom:1px solid rgba(212,200,176,.15)}
.drawer-head p{color:var(--cream)}
.drawer-close{font-size:1.6rem;line-height:1;color:var(--sand)}
.drawer-items{flex:1;overflow-y:auto;padding:1.2rem 1.8rem}
.drawer-item{display:flex;align-items:center;gap:1rem;padding:1rem 0;
  border-bottom:1px solid rgba(212,200,176,.1)}
.drawer-item-swatch{width:10px;height:42px;border-radius:99px;flex:none}
.drawer-item-info{flex:1}
.drawer-item-world{font-size:var(--text-body);font-weight:var(--weight-light);color:var(--sand)}
.drawer-item-qty{display:flex;align-items:center;gap:.7rem}
.drawer-item-qty button{width:1.7rem;height:1.7rem;border:1px solid rgba(212,200,176,.35);border-radius:50%;
  color:var(--cream);font-size:.9rem}
.drawer-item-price{font-size:var(--text-micro);letter-spacing:0;min-width:3.2rem;text-align:right}
.drawer-empty{color:var(--sand);text-align:center;padding:3rem 0}
.drawer-foot{padding:1.4rem 1.8rem 2rem;border-top:1px solid rgba(212,200,176,.15)}
.drawer-total{display:flex;justify-content:space-between;margin-bottom:1.2rem}
/* the pre-order line: quiet, present at the moment of commitment. Remove at
   launch, 20.08.2026, together with the copy on success.html. */
.drawer-preorder{font-family:var(--font-body);font-weight:var(--weight-medium);
  font-size:var(--text-micro);letter-spacing:var(--track-label);text-transform:uppercase;
  color:var(--sand);margin-bottom:1rem}
.drawer-checkout{width:100%}
.drawer-launch{margin-top:1.2rem;text-align:center}
.drawer-launch p{font-family:var(--font-body);font-style:normal;color:var(--sand);margin-bottom:1rem}
.drawer-launch strong{color:var(--cream)}
.drawer-launch .btn-ritual{width:100%}

/* THE TRIO PICKER: the buyer's three worlds, chosen in place */
.trio-modal{position:fixed;inset:0;z-index:80;display:none;align-items:center;justify-content:center;
  background:rgba(10,9,8,.78);backdrop-filter:blur(8px);padding:6vw}
.trio-modal.is-open{display:flex}
.trio-card{position:relative;width:min(26rem,100%);text-align:center;background:var(--dusk);
  border:1px solid rgba(212,200,176,.18);padding:2.6rem 2rem 2.2rem;border-radius:4px}
.trio-card h3{font-family:var(--font-body);font-weight:var(--weight-light);font-size:var(--text-h3);margin:0 0 .5rem}
.trio-sub{font-size:var(--text-body);color:var(--sand);margin-bottom:1.6rem}
.trio-close{position:absolute;top:.9rem;right:1.1rem}
.trio-opts{display:flex;flex-wrap:wrap;gap:.7rem;justify-content:center}
.trio-opt{font-family:var(--font-body);font-weight:var(--weight-medium);font-size:var(--text-micro);
  letter-spacing:var(--track-label);text-transform:uppercase;color:var(--cream);min-height:44px;
  border:1px solid rgba(212,200,176,.4);padding:.8rem 1.4rem;border-radius:var(--radius-pill);
  transition:.35s var(--ease)}
.trio-opt:hover{border-color:var(--cream)}
.trio-opt.is-on{background:var(--cream);color:var(--obsidian);border-color:var(--cream)}
.trio-count{font-family:var(--font-body);font-weight:var(--weight-medium);font-size:var(--text-micro);
  letter-spacing:var(--track-label);text-transform:uppercase;color:var(--sand);margin:1.4rem 0 1.2rem}
.trio-confirm{width:100%}
.trio-confirm:disabled{opacity:.4;cursor:default}
.trio-confirm:disabled:hover{background:var(--cream)}

/* ===== STANDALONE PAGES: checkout returns and the legal set =====
   Same tokens, same voices, no app engine: these pages stand alone. */
.page-nav{display:flex;align-items:center;justify-content:space-between;
  padding:1.1rem clamp(1.2rem,4vw,3rem);border-bottom:1px solid rgba(40,35,30,.9);
  background:rgba(22,20,18,.82)}
.page{position:relative;z-index:2;min-height:calc(100svh - 12rem);
  padding:var(--space-9) max(var(--gutter),calc((100vw - var(--container))/2)) var(--space-9)}
.page-eyebrow{color:var(--sand);margin-bottom:var(--space-3)}
.page h1{font-family:var(--font-body);font-weight:var(--weight-light);
  font-size:var(--text-display);line-height:var(--leading-tight);margin:0 0 var(--space-5)}
.page-lead{font-family:var(--font-body);font-weight:var(--weight-light);
  font-size:var(--text-lead);line-height:var(--leading-snug);color:var(--sand);max-width:var(--measure-lead)}
.page-body{max-width:var(--measure-body);margin-top:var(--space-7)}
.page-body h2{font-family:var(--font-body);font-weight:var(--weight-medium);font-size:var(--text-micro);
  letter-spacing:var(--track-label);text-transform:uppercase;color:var(--sand);
  margin:var(--space-7) 0 var(--space-3)}
.page-body p,.page-body li{font-size:var(--text-body);font-weight:var(--weight-light);
  line-height:var(--leading-body);color:var(--cream)}
.page-body ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-2);padding:0}
.page-body li{border-left:1px solid var(--hairline-light);padding-left:var(--space-4)}
.page-actions{display:flex;gap:1rem;flex-wrap:wrap;margin-top:var(--space-7)}
.legal-flag{display:inline-block;font-family:var(--font-body);font-weight:var(--weight-medium);
  font-size:var(--text-micro);letter-spacing:var(--track-label);text-transform:uppercase;
  color:var(--sand);border:1px solid rgba(212,200,176,.4);border-radius:var(--radius-pill);
  padding:.55rem 1.1rem;margin-bottom:var(--space-6)}
.page-return{text-align:center;align-items:center;display:flex;flex-direction:column;justify-content:center}
.page-return .page-lead{margin-inline:auto}
.footer-legal{display:flex;gap:var(--space-5);flex-wrap:wrap}
.footer-legal a{transition:color .35s var(--ease)}
.footer-legal a:hover{color:var(--cream)}

/* TOAST */
.toast{position:fixed;left:50%;bottom:2rem;transform:translate(-50%,200%);visibility:hidden;z-index:70;
  background:var(--cream);color:var(--obsidian);padding:.95rem 1.8rem;border-radius:var(--radius-pill);
  transition:transform .45s var(--ease)}
.toast.is-on{transform:translate(-50%,0);visibility:visible}

/* reveal default state */
.reveal{opacity:0;transform:translateY(26px)}
.no-js .reveal,.is-reduced .reveal{opacity:1;transform:none}

/* RESPONSIVE */
/* ===== MOBILE: portrait rhythm, tokens-led (B4/B5, SPEC v1.0) ===== */
@media (max-width:840px){
  :root{--hero-surface:url(/assets/hero/hero_portrait.jpg)}
  .nav-links{display:none}
  .nav{padding:1rem 1.4rem}
  .ritual-stats{grid-template-columns:repeat(2,1fr);gap:var(--space-7) var(--space-5)}
  /* touch targets: every tappable control clears 44px */
  .btn-ritual{min-height:44px;padding:.95rem 1.9rem}
  .btn-ghost{min-height:44px}
  .quiz-opts button{min-height:44px;padding:.9rem 1.6rem}
  .quiz-again{padding:.8rem .4rem}
  .nav-ritual{padding:.6rem 0}
  /* portrait spacing rhythm (type sizes are fluid tokens, no overrides needed) */
  .hero-cta{margin-top:var(--space-7)}
  .footer-grid{grid-template-columns:1fr 1fr;gap:var(--space-6)}
  .footer-brand{grid-column:1 / -1}
  .footer-base{flex-direction:column;gap:var(--space-2)}
  .world-element{margin-bottom:var(--space-3)}
  .world-scent{margin:.7rem 0 .8rem}
  .world-line{max-width:30ch}
  .world-buy{margin-top:var(--space-5);gap:var(--space-4)}
  .set-option{flex-direction:column;align-items:flex-start;gap:var(--space-2);padding:var(--space-5) 0}
  .set-option .btn-ritual{width:100%;margin-top:var(--space-2)}
  /* the shelf swipes on mobile, one world snapping at a time */
  .shelf-row{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;gap:var(--space-5);
    margin-inline:calc(-1 * var(--gutter));padding-inline:var(--gutter);
    scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .shelf-row::-webkit-scrollbar{display:none}
  .shelf-item{flex:0 0 68%;scroll-snap-align:start}
  .ritual-use{margin-top:var(--space-8)}
}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .grain,.scroll-cue,.loader-drop,.loader-ripple,.stage-kb{animation:none}
  .reveal{opacity:1;transform:none}
}
:focus-visible{outline:2px solid var(--sand);outline-offset:3px;border-radius:4px}

/* wordmark letters: a clipped rise, no blur (filters are paint-expensive and
   the masked reveal is the more couture read). The flex gap IS the wordmark
   tracking (SPEC 0.40em); letter-spacing stays off the letters or the two
   stack to a doubled 0.8em (audit 03/07/2026, wordmark colliding with the
   hero bottle). */
.hero-mark span{display:inline-flex;gap:.4em;letter-spacing:0;overflow:hidden;padding-top:.08em}
.hero-mark i{font-style:normal;display:inline-block}
.js .hero-mark i{transform:translateY(112%)}
.is-reduced .hero-mark i{transform:none}

/* ===== THE RITUAL STAGE ===== */
/* 340vh: about 2540px of travel at a 748px viewport. The 560vh original left
   roughly 800px of dead black between worlds (audit 03/07/2026); at 60vh per
   half-transition the handover reads continuous. Snap points are progress
   fractions, untouched by the compression. */
.ritual-track{position:relative;height:340vh;z-index:2}
.ritual-stage{position:sticky;top:0;height:100svh;overflow:hidden;contain:paint;isolation:isolate}
.stage-media{position:absolute;inset:0;z-index:1;overflow:hidden}
/* soft full-bleed legibility wash on the copy side, desktop only. No box edges. */
.stage-media::after{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;
  background:linear-gradient(90deg, transparent 44%, rgba(13,12,10,.44) 100%)}
.stage-plate{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;
  transform:scale(1.08);will-change:opacity,transform;filter:saturate(.96) brightness(.94)}
/* mobile image-led worlds: portrait poster layers built by app.js (B4/B5).
   The Ken Burns drift runs only on the live world; others sit still. */
.stage-poster{position:absolute;inset:0;opacity:0;overflow:hidden;will-change:opacity}
.stage-kb{position:absolute;inset:-6% -8%;background-size:cover;background-position:center 42%;
  filter:saturate(.92) brightness(.86)}
.stage-poster.is-live .stage-kb{animation:kenburns 24s ease-in-out infinite alternate}
@keyframes kenburns{from{transform:scale(1) translateY(0)}to{transform:scale(1.09) translateY(-1.6%)}}
.stage-live{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;
  filter:saturate(.92) brightness(.86)}
.is-reduced .stage-kb{animation:none}
/* ONE authored veil: the films carry their own grade, this only anchors the
   world colour at the base and protects the nav and copy edges. The old
   triple-stack (heavy veil + vignette + wash) turned the films to mud. */
.stage-veil{position:absolute;inset:0;background:
  radial-gradient(120% 80% at 50% 112%, color-mix(in srgb, var(--w-deep) 55%, transparent) 0%, transparent 50%),
  linear-gradient(180deg, rgba(13,12,10,.42) 0%, transparent 26% 68%, rgba(13,12,10,.55) 100%);
  transition:background 1.2s var(--ease-sine)}
.stage-vignette{position:absolute;inset:0;background:radial-gradient(140% 105% at 50% 50%, transparent 68%, rgba(10,9,8,.45) 100%)}
.stage-figure{position:absolute;z-index:3;left:0;width:50%;top:0;bottom:0;
  display:flex;align-items:center;justify-content:center;pointer-events:none;overflow:hidden}
.stage-halo{position:absolute;width:min(58vh,540px);aspect-ratio:1;border-radius:50%;
  background:radial-gradient(circle, color-mix(in srgb, var(--w) 42%, transparent) 0%, transparent 66%);
  filter:blur(34px);transition:background 1.2s var(--ease-sine)}
.stage-bottle{position:absolute;height:min(60vh,540px);width:auto;opacity:0;
  will-change:opacity,transform;filter:drop-shadow(0 34px 50px rgba(0,0,0,.55))}
/* grounding: a tight contact shadow under the live bottle, driven by paint() */
.stage-ground{position:absolute;left:50%;top:calc(50% + min(30vh,268px) - 6px);width:min(22vh,200px);height:24px;
  transform:translateX(-50%);opacity:0;pointer-events:none;
  background:radial-gradient(ellipse at center, rgba(8,7,6,.6) 0%, rgba(8,7,6,.25) 45%, transparent 72%);
  filter:blur(7px)}
/* the sweep band fades to nothing before it meets the clip box, so no hard
   edge ever paints against a bright film (audit follow-up 03/07/2026: the box
   edge read as a glitch over musk, the same failure that retired the sweep on
   mobile) */
.stage-sheen{position:absolute;width:min(34vh,300px);height:min(64vh,580px);overflow:hidden;pointer-events:none;opacity:0;
  -webkit-mask-image:radial-gradient(ellipse 60% 56% at 50% 50%, #000 46%, transparent 72%);
  mask-image:radial-gradient(ellipse 60% 56% at 50% 50%, #000 46%, transparent 72%)}
.stage-sheen::before{content:"";position:absolute;inset:-20%;
  background:linear-gradient(105deg, transparent 42%, rgba(237,233,224,.22) 50%, transparent 58%);
  transform:translateX(-140%)}
.stage-sheen.is-sweep{opacity:1}
.stage-sheen.is-sweep::before{animation:sweep 1.3s ease forwards}
@keyframes sweep{to{transform:translateX(140%)}}
.stage-copy{position:absolute;z-index:4;left:52%;right:6vw;top:0;bottom:0;display:flex;align-items:center}
.stage-text{position:absolute;max-width:30rem;opacity:0;transform:translateY(26px);will-change:opacity,transform}
/* the world index rail: names on the left, a legitimate exit at the bottom */
.stage-rail{position:absolute;z-index:5;left:2.2vw;top:50%;transform:translateY(-50%);
  display:flex;flex-direction:column;gap:var(--space-3);align-items:flex-start}
.stage-rail-w{color:rgba(212,200,176,.45);transition:color .35s var(--ease);padding:.2rem 0;text-align:left}
.stage-rail-w:hover{color:var(--sand)}
.stage-rail-w.is-on{color:var(--w)}
/* the exit, not a sixth world: sentence case and light weight set it apart
   from the caps-tracked world names above (audit 03/07/2026, item 9) */
.stage-rail-shop{margin-top:var(--space-5);color:var(--cream);padding:.2rem 0;
  text-transform:none;letter-spacing:.04em;font-weight:var(--weight-light);
  border-bottom:1px solid rgba(237,233,224,.35);transition:border-color .35s var(--ease)}
.stage-rail-shop:hover{border-color:var(--cream)}
.stage-dots{position:absolute;z-index:5;right:2.2vw;top:50%;transform:translateY(-50%);
  display:flex;flex-direction:column;gap:14px}
.stage-dot{width:7px;height:7px;border-radius:7px;border:1px solid rgba(237,233,224,.4);
  background:transparent;cursor:pointer;padding:0;transition:all .45s ease}
.stage-dot.is-on{height:22px;background:var(--w);border-color:var(--w)}
@media (max-width:840px){
  /* the rail is a desktop instrument. This hide must live AFTER the .stage-rail
     base rule in the cascade: an earlier display:none lost to the later
     display:flex at equal specificity and the rail sat on the bottle at 390px
     (audit 03/07/2026, item 4). The dots row is the mobile world nav. */
  .stage-rail{display:none}
  /* the integrated 9:16 renders (03/07/2026) carry the bottle inside the
     scene, so the floating packshot layer retires on mobile: two products
     were stacking at world centres under reduced motion and save-data. The
     poster IS the product shot; desktop keeps the film + packshot pair. */
  .stage-figure{display:none}
  /* the light sweep is tuned for the desktop bottle; over portrait posters its
     box edge reads as a glitch, so mobile goes without it */
  .stage-sheen{display:none}
  /* worlds copy holds the left grid line on mobile too */
  .stage-copy{left:6vw;right:6vw;top:auto;bottom:4svh;justify-content:flex-start;text-align:left}
  /* mobile copy pool: soft full-bleed wash, weighted to the copy side */
  .stage-copy::before{content:"";position:absolute;z-index:-1;inset:-14% -10vw -10% -10vw;background:radial-gradient(110% 88% at 34% 60%, rgba(13,12,10,.74) 0%, rgba(13,12,10,.32) 60%, transparent 86%)}
  .stage-media::after{opacity:0}
  .stage-text{transform:translateY(18px)}
  .world-buy{justify-content:flex-start}
  .world-line{margin:0}
  /* dots: 7px marks inside 31px touch boxes. A vertical column on the right
     edge, same grammar as desktop: the old centred row landed on the label of
     the integrated poster bottle. border-radius must exceed the padding so
     the content-box fill stays round */
  .stage-dots{right:2vw;top:50%;gap:2px}
  .stage-dot{box-sizing:content-box;width:7px;height:7px;padding:12px;border:none;border-radius:99px;
    background-color:rgba(237,233,224,.35);background-clip:content-box}
  .stage-dot.is-on{width:7px;height:22px;background:var(--w) content-box;border-color:var(--w)}
}
/* ===== THE SHELF: five worlds, one decision point ===== */
.shelf{position:relative;z-index:2;padding-block:var(--space-section);background:var(--obsidian)}
.shelf-eyebrow{color:var(--sand)}
.shelf-title{margin-top:var(--space-3)}
.shelf-row{display:grid;grid-template-columns:repeat(5,1fr);gap:var(--space-6);
  margin-top:var(--space-7);max-width:var(--container)}
.shelf-item{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2)}
.shelf-item img{height:clamp(220px,22vw,290px);width:auto;align-self:center;
  margin-bottom:var(--space-4);filter:drop-shadow(0 18px 28px rgba(0,0,0,.5));
  -webkit-box-reflect:below -5px linear-gradient(transparent 86%, rgba(0,0,0,.16))}
.shelf-item h3{font-family:var(--font-body);font-weight:var(--weight-light);font-size:var(--text-h3)}
.shelf-line{color:var(--sand);font-weight:var(--weight-light)}
.shelf-buy{display:flex;align-items:center;gap:var(--space-4);margin-top:var(--space-3)}
/* one line, always: the pill broke to two lines on desktop and three on
   mobile (audit 03/07/2026). Tracking eases to fit the shelf column. */
.shelf-buy .btn-ritual{padding:.8rem 1.4rem;white-space:nowrap;letter-spacing:.18em}

/* ===== HIDDEN BOTTLE: a secret, not a glitch. Discreet at rest, it answers
   the curious cursor with a soft sand halo. ===== */
.hb{position:absolute;height:30px;width:auto;opacity:.55;cursor:pointer;z-index:6;
  transition:opacity .4s var(--ease), transform .4s var(--ease), filter .4s var(--ease);
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.5))}
.hb:hover{opacity:1;transform:scale(1.12);
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.5)) drop-shadow(0 0 12px rgba(212,200,176,.55))}
.hb-modal{position:fixed;inset:0;z-index:90;display:none;align-items:center;justify-content:center;
  background:rgba(10,9,8,.78);backdrop-filter:blur(8px);padding:6vw}
.hb-modal.is-open{display:flex}
.hb-card{max-width:24rem;text-align:center;background:var(--dusk);border:1px solid rgba(212,200,176,.18);
  padding:2.6rem 2rem;border-radius:4px}
.hb-card h3{font-family:var(--font-body);font-weight:var(--weight-light);font-size:var(--text-h3);margin:0 0 .8rem}
.hb-card p{font-size:var(--text-body);line-height:var(--leading-body);color:var(--sand);margin:0 0 1.6rem}
.hb-card small{display:block;margin-top:1.1rem;font-size:var(--text-micro);letter-spacing:var(--track-body);color:rgba(212,200,176,.55)}
.manifesto,.set,.ritual,.find,.footer{position:relative}
/* grading debt: the musk film runs too bright for cream copy; regrade at the
   asset when the worlds are regenerated, then delete this line */
.stage-plate[data-w="musk"]{filter:saturate(.9) brightness(.76) contrast(1.03)}
.stage-text{text-shadow:0 2px 30px rgba(10,9,8,.92),0 1px 4px rgba(10,9,8,.7)}
/* desktop legibility wash behind the copy column, full-bleed and edgeless */
@media (min-width:841px){ .stage-media::after{opacity:1} }
