/* ═══════════════════════════════════════════════════════════
   MASTRY — Sparkling Water with Mastic
   Minimalist editorial · Chios × Japan
   Palette: images/colors-no-black.json (aesthetic colors)
   ═══════════════════════════════════════════════════════════ */

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

:root{
  /* dark "espresso" palette (from fable-minimal-remake). Token names kept, so
     every downstream var() flips to dark at once. --paper is now the espresso
     PAGE (dark); light-on-dark FOREGROUND text uses --ink (parchment). */
  /* SUPER-DARK espresso night (user call 2026-07-23: "the black was better").
     Page returns to the deep espresso; raised surfaces sit a clear step above
     it so depth survives, and the warm candle accents stay — they pop harder
     on black. */
  --paper:#14100C;          /* espresso page — near-black, warm */
  --paper-deep:#1E1812;     /* surface / card, a step above paper */
  --ink:#F0E8D8;            /* parchment text ink */
  --ink-soft:#C4B99F;       /* dim parchment */
  --muted:#A89A7E;          /* muted parchment */
  --hairline:rgba(232,210,170,.18); /* gilded hairline — the cheap candle cue */
  --olive:#A9B87A;          /* mastic olive, lifted */
  --olive-deep:#97A66B;     /* mastic olive, lifted mid */
  --resin:#E8D9A0;          /* mastic resin, lifted */
  --resin-milk:#241C10;     /* mastic surface tint */
  --dark:#0E0B08;           /* deepest surface — keeps shadow depth */
  --dark-2:#1A1410;         /* raised deep surface */
  --sage:#93AFB5;           /* mineral blue, muted vs the warm paper */
  --cream:#E4AA5E;          /* candle amber */
  --jp-blue:#93AFB5;        /* mineral blue — Japan accent */
  --gr-olive:#A9B87A;       /* mastic olive — Greece accent */
  --clay:#C98B5F;           /* clay, lifted */
  --sun:#D9A441;            /* sun, lifted */
  --creek:#93AFB5;          /* mineral blue, muted */
  --mist:#221A10;           /* raised surface — marquee band */
  --wash-sage:#1C1610;      /* warm wash, a step above paper */
  --wash-sky:#1A1510;       /* warm wash — hero top */

  /* candle accents */
  --amber:#E4AA5E;
  --amber-glow:rgba(228,170,94,.5);
  --amber-soft:rgba(228,170,94,.16);
  --surface-raised:#241C12;

  /* flavour theming (swapped by JS — dark-safe mid-tones) */
  --fl-wash:#221A0E;
  --fl-accent:#A9B87A;
  --fl-deep:#93AFB5;

  --nav-h:76px;
  --ease:cubic-bezier(.22,1,.36,1);
  --serif:'Cormorant Garamond',serif;
  --sans:'Inter',sans-serif;
  --jp:'Noto Serif JP',serif;
}

/* ═══════════════════════════════════════════════════════════════════════════
   LIGHT THEME (day). The <head> boot script sets data-theme from the visitor's
   local time (bright out = light, dark out = dark). Dark is the default :root
   above; this overrides the tokens for daylight, so every var() consumer flips
   at once. The hero FRAMES and their overlays (the transparent nav + the "In
   Chios." card) sit over photographs, so they are pinned light in BOTH themes
   below — they must not flip with the page. The footer's --dark background is
   dark in both palettes (a deliberate anchor), so its logo/hover are re-pointed
   light. ═══════════════════════════════════════════════════════════════════ */
:root[data-theme="light"]{
  --paper:#F9F5E9;          /* rice-paper */
  --paper-deep:#F6F4EE;     /* stone-snow */
  --ink:#1D2E18;            /* pine-needle */
  --ink-soft:#30352C;       /* mountain-shadow */
  --muted:#777061;          /* stone-taupe */
  --hairline:#E6E0D1;       /* limestone */
  --olive:#6B7A32;          /* olive-core */
  --olive-deep:#46552A;     /* olive-moss */
  --resin:#DED38E;          /* mastic-resin */
  --resin-milk:#F7F4D8;     /* mastic-milk */
  --dark:#1F2A1C;           /* charcoal-green — footer anchor stays dark */
  --dark-2:#26341C;         /* olive-shadow */
  --sage:#A8B88A;           /* light-sage */
  --cream:#F4E8C1;          /* warm-cream */
  --jp-blue:#6D9DAA;        /* mineral-blue — Japan accent */
  --gr-olive:#91964F;       /* mastic-olive — Greece accent */
  --clay:#C3936C;           /* clay-sun */
  --sun:#C6A548;            /* sun-muted */
  --creek:#659F90;          /* water-creek */
  --mist:#EEF2D7;           /* olive-mist */
  --wash-sage:#F4F7EF;      /* sage-wash */
  --wash-sky:#F3FAFC;       /* sky-frost */
  --amber:#6B7A32;
  --amber-glow:rgba(107,122,50,.30);
  --amber-soft:rgba(107,122,50,.10);
  --surface-raised:#EEF2D7;
  --fl-wash:#F7F4D8;
  --fl-accent:#91964F;
  --fl-deep:#596532;
  color-scheme:light;
  scrollbar-color:#B8C79E #F9F5E9;
}
/* solid nav (scrolled into the light content) → light bar; its ink flips via tokens */
[data-theme="light"] .nav.solid{background:rgba(249,245,233,.85);}
/* order form + native controls read as daylight */
[data-theme="light"] .order{color-scheme:light;}
[data-theme="light"] .fg select option{background:var(--paper);color:var(--ink);}
/* footer stays a dark anchor in daylight → keep its logo + link-hover LIGHT */
[data-theme="light"] .footer__logo,
[data-theme="light"] .footer__links a:hover{color:#F9F5E9;}
/* FRAME OVERLAYS pinned light in daylight too — they sit over photos, not the page */
[data-theme="light"] .nav:not(.solid) .nav__logo,
[data-theme="light"] .nav:not(.solid) .nav__links a:hover,
[data-theme="light"] .nav:not(.solid) .nav__links a.active,
[data-theme="light"] .nav:not(.solid) .nav__cta{color:#F0E8D8;}   /* nav stays light while over the photo */
[data-theme="light"] .nav:not(.solid) .nav__burger span{background:#F0E8D8;}

html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;}
body{
  font-family:var(--sans);
  font-weight:300;
  background:var(--paper);
  color:var(--ink);
  line-height:1.6;
}
/* candle vignette — a soft pool of warm light breathing at the top of the
   night page; the umber paper alone reads "brown", the glow makes it
   "candle-lit". Dark theme only; daylight keeps flat rice-paper. */
:root:not([data-theme="light"]) body{
  background:
    radial-gradient(120% 85% at 50% -10%, rgba(228,170,94,.10), transparent 55%),
    var(--paper);
}
body{
  /* `clip`, not `hidden`: hidden forces overflow-y to `auto`, making body a
     scroll container that breaks the cinematic hero's position:sticky pinning. */
  overflow-x:clip;
  -webkit-font-smoothing:antialiased;
}
::selection{background:var(--olive);color:var(--paper);}
img{max-width:100%;display:block;}

/* quiet global details */
html{scrollbar-color:var(--sage-soft,#B8C79E) var(--paper);scrollbar-width:thin;}
::-webkit-scrollbar{width:12px;}
::-webkit-scrollbar-track{background:var(--paper);}
::-webkit-scrollbar-thumb{background:#B8C79E;border-radius:8px;border:3px solid var(--paper);}
::-webkit-scrollbar-thumb:hover{background:var(--olive);}
:focus-visible{outline:2px solid var(--olive);outline-offset:3px;border-radius:2px;}
input,select,textarea{accent-color:var(--olive);}

/* ── progress hairline ── */
#progress{position:fixed;top:0;left:0;height:2px;width:0;background:var(--olive);z-index:900;}

/* ── loader ── */
#loader{
  position:fixed;inset:0;z-index:999;background:var(--paper);
  transition:opacity .9s var(--ease),visibility .9s;
}
#loader.done{opacity:0;visibility:hidden;}
/* DISPERSE OUTWARD (owner 2026-07-25): on handoff the splash CONTENTS bloom
   outward and soften as the paper fades — it disperses to reveal the hero
   instead of a flat crossfade.
   CRITICAL: the transform/filter go on the CONTENTS, never on #loader itself —
   a filter/transform on #loader makes it the containing block for the
   position:fixed bottle, which snaps it several px at the exact handoff moment
   (measured 4px left / 13px up) and breaks the "bottle never moves" promise.
   NOTE: the bloom uses the independent `scale` property, NOT `transform` —
   placeSpin() writes an INLINE `transform:none` on the wrap to cancel the
   pre-JS centring fallback, and an inline style beats any stylesheet rule, so a
   THE BOTTLE NEVER SCALES. It is pinned 1:1 on the hero bottle (verified by
   silhouette overlay against frames/0001.webp), so any bloom on it makes it
   visibly larger than the hero bottle at the exact moment they cross-dissolve —
   which reads as "the sizes don't match". The bottle therefore only fades, in
   place, at its exact hero size; the OUTWARD DISPERSE is carried by the paper
   and the wordmark around it. */
.loader__spinwrap{
  transform-origin:center center;
  transition:opacity .9s var(--ease);
}
#loader.done .loader__spinwrap{opacity:0;}
/* impatient exit: same single composite fade, just quicker (script.js matches
   FAST_FADE to this). Equal specificity + later source order wins the duration. */
#loader.done--fast{transition:opacity .45s var(--ease),visibility .45s;}
#loader.done--fast .loader__spinwrap{transition:opacity .45s var(--ease);}
/* handoff step 1: wordmark + status settle out IN PLACE before the bottle
   flies, so the eye stays on the bottle. animation:none releases the `rise`
   forwards-held opacity so the transition has a live 1->0 to run against
   (the before-change style still includes the animation per spec). */
#loader.is-leaving .loader__load{               /* the wordmark disperses too — blooms + softens as it settles out */
  animation:none;opacity:0;transform:scale(1.12);filter:blur(6px);transform-origin:center center;
  transition:opacity .5s var(--ease),transform .5s var(--ease),filter .5s var(--ease);
}
#loader.is-leaving .loader__dots i{animation:none;}
/* (no bare `#loader img` rule here — a leftover logo rule with
   mix-blend-mode:multiply once outranked #loaderSpin and multiplied the
   bottle to BLACK on the dark splash. The spin img styles itself below.) */
/* Fly wrapper — owns the bottle-box SIZE and carries the splash→hero FLIP
   transform at dismissal. We transform THIS, never the img: the img's `rise`
   keyframes hold a forwards fill that would override a transform set on the
   img itself. transform-origin stays the default 50% 50% — the FLIP algebra in
   script.js is solved for the centre origin. */
/* JS (inline placeSpin) pins this onto the hero bottle's on-screen spot and sets
   left/top/width/height in px every frame it matters. These are only the pre-JS
   fallback (JS runs on first paint, so they're rarely seen). */
.loader__spinwrap{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:min(210px,44vw);aspect-ratio:2/3;}
.loader__spinwrap.is-flying{
  /* the glide: translate+scale only, slow with a long soft arrival (expo-out
     family), NO overshoot — an overshoot would swing past the spot the hero
     bottle is about to occupy; glass doesn't bounce. JS supplies the measured
     target transform; this transition plays it. The crossfade overlaps the
     second half, so the slow glide adds zero lockout. */
  transition:transform 1.4s cubic-bezier(.16,1,.3,1);
}
/* breathe layer — NO LONGER ANIMATED (owner 2026-07-25: "the bottle in the loading
   screen is offset"). The swell existed because the OLD baked asset came to rest
   early and a motionless bottle read as frozen. The canvas bottle now spins for the
   whole wait, so the swell bought nothing — and it cost alignment: scaling this
   inner layer to 1.007 made the bottle perpetually ~0.7% LARGER than the
   hero-exact box placeSpin pins (≈1.8px on a 259px bottle), pulsing in and out of
   register with the hero bottle it has to overlay, then snapping back to 1 at the
   handoff. Held at scale(1) the loader bottle is the hero bottle's exact size at
   every instant. */
.loader__breathe{width:100%;height:100%;}
#loaderSpin{
  /* bottle spin loop — a CANVAS fed from a 64-frame sprite sheet by the inline
     head driver (never <video>: iOS can refuse video autoplay and paint a play
     button). Frames are baked on the matching paper color, so no blending
     needed. The still background (label-front, same first frame, set inline)
     paints instantly while the sheet streams in. */
  /* display:block is LOAD-BEARING (owner 2026-07-25: "the bottle is offset").
     A <canvas> is display:inline by default, so it sat on the parent's text
     BASELINE — the 25.6px line box pushed it exactly 16px DOWN inside the
     hero-pinned wrapper (and overflowed the bottom by the same 16px), putting
     the splash bottle 16px below the hero bottle it has to overlay. The wrapper
     itself always measured perfect, which is why this hid from rect checks on
     .loader__spinwrap — measure #loaderSpin, not its parent. */
  display:block;
  width:100%;height:100%;               /* fills .loader__spinwrap, which owns the sizing */
  background-size:cover;background-position:center;
  /* NO mask here: it would force a per-frame composite on mobile Safari (the
     splash jank). The frames are drawn on the exact paper color in RGB, so
     their edges are invisible without one. */
  pointer-events:none;user-select:none;-webkit-user-select:none;
  /* NO width tricks on the img (owner 2026-07-24: dock 1:1 with the hero
     bottle) — the FLIP's uniform height-match is the whole size story. */
  opacity:0;animation:rise .45s var(--ease) 0s forwards;   /* on screen fast — the splash may only last ~2.4s */
}
/* NOTE: the spin loop is deliberately NOT hidden under prefers-reduced-motion —
   many Windows machines report it via "animation effects: off", which was
   hiding the loading screen's centerpiece from real visitors (and the owner). */
/* Big vertical LOADING on the LEFT edge, reading bottom-to-top, animated dots —
   a graphic-design counterweight to the bottle pinned right (owner 2026-07-25). */
.loader__load{
  position:fixed;inset:0;z-index:2;pointer-events:none;
  opacity:0;animation:loadfade 1s var(--ease) .3s forwards;
}
/* POINT-ANCHORED (owner 2026-07-25): the rotated wordmark is centred on (left,top)
   regardless of how long the word is, so a bigger LOADING can NEVER drift into the
   bottle. left/top = the column's visual centre. */
.loader__loadrot{
  position:absolute;
  left:clamp(285px,45vw,530px);            /* column centre X (desktop) — moved right */
  top:44%;                                  /* column centre Y (desktop) */
  transform:translate(-50%,-50%) rotate(-90deg);transform-origin:center;
  display:inline-flex;align-items:baseline;gap:.1em;white-space:nowrap;
}
.loader__loadword{
  font-family:var(--sans);font-weight:800;text-transform:uppercase;
  font-size:clamp(2.2rem,9vmin,4.6rem);letter-spacing:.14em;line-height:.9;
  color:var(--ink);
}
.loader__dots{
  font-family:var(--sans);font-weight:800;line-height:.9;color:var(--ink);
  font-size:clamp(2.2rem,9vmin,4.6rem);letter-spacing:.02em;
}
.loader__dots i{font-style:normal;animation:dotpulse 1.4s infinite;}
.loader__dots i:nth-child(2){animation-delay:.2s;}
.loader__dots i:nth-child(3){animation-delay:.4s;}
@keyframes loadfade{from{opacity:0;}to{opacity:1;}}
/* MOBILE (owner 2026-07-25): vertical LOADING moved DOWN and kept clear of the
   bottle on the left. Sized in proportion to the bottle rather than the old
   15vmin, which read oversized on a phone (owner: "too big — ratio it"): the
   hero bottle is 0.319 of the frame height, so ~10vmin keeps the wordmark's
   cap-height a similar fraction of the bottle as it is on desktop. */
@media (max-width:760px){
  /* NO scaleY here (owner 2026-07-25 "something's off"): stretching the glyphs
     non-uniformly thickened the vertical strokes but not the horizontals, so the
     letterforms were literally misshapen. Presence comes from TRACKING + weight,
     never from distortion. Optically centred on the bottle (its centre sits at
     ~47% of the viewport), so the two read as one composition. */
  /* Wordmark only (owner 2026-07-25: no line/streak). Quiet label beside the
     bottle — small, light, widely tracked, undistorted — with the dots kept as
     the loading cue so the screen still reads as "working". */
  .loader__loadrot{
    left:calc(clamp(104px,30vw,215px) + env(safe-area-inset-left,0px)); top:47%;
    transform:translate(-50%,-50%) rotate(-90deg);
  }
  /* SERIF, UPRIGHT (owner 2026-07-25: tried a handwriting font — "corny"; tried
     the calligraphic italic — "not italic"). Cormorant Garamond at light weight,
     upright, widely tracked: the site's own display face, so the loader speaks
     the same voice as the rest of the page and costs no extra webfont. The
     serif's broader letterforms are also the honest way to get width — a
     different typeface, never a scaleY stretch, which misshapes the glyphs. */
  .loader__loadword{
    font-family:var(--serif);font-weight:300;
    font-size:clamp(2rem,9.4vmin,3.8rem);
    text-transform:uppercase;letter-spacing:.32em;padding-left:.32em;
    color:var(--ink);opacity:.92;
  }
  .loader__dots{
    font-family:var(--serif);font-weight:300;
    font-size:clamp(2rem,9.4vmin,3.8rem);
    letter-spacing:.2em;opacity:.5;
  }
}
/* iPHONE landscape: the notch eats the left edge — push the column clear of it. */
@media (max-width:930px) and (orientation:landscape){
  .loader__loadrot{ left:calc(clamp(200px,35vw,395px) + env(safe-area-inset-left,0px)); top:46%; }
  .loader__loadword,.loader__dots{ font-size:clamp(1.9rem,11vmin,3.4rem); }
}
/* scroll fully locked while the splash is up (script.js lifts it AFTER the
   fade completes). position:fixed is the iOS belt-and-braces: Safari can
   ignore overflow:hidden for touch scrolling in the gap before script.js
   attaches its touchmove blocker; a fixed body physically cannot scroll.
   Safe because the page is always at scrollY 0 while the class is on. */
html.is-loading{overflow:hidden;}
html.is-loading body{position:fixed;inset:0;width:100%;overflow:hidden;touch-action:none;overscroll-behavior:none;}
@keyframes dotpulse{0%,60%,100%{opacity:.2;}30%{opacity:1;}}
@media (prefers-reduced-motion: reduce){.loader__dots i{animation:none;}}
@keyframes rise{from{opacity:0;transform:translateY(16px);}to{opacity:1;transform:translateY(0);}}

/* ── nav ── */
.nav{
  position:fixed;top:0;left:0;right:0;height:var(--nav-h);z-index:500;
  display:flex;align-items:center;gap:40px;padding:0 clamp(20px,5vw,64px);
  border-bottom:1px solid transparent;
  transition:background .4s,border-color .4s,box-shadow .4s,transform .45s var(--ease);
}
.nav.hidden{transform:translateY(-100%);}
.nav.solid{
  background:rgba(20,16,12,.85);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
  border-bottom-color:var(--hairline);
}
.nav__logo{
  margin-right:auto;display:flex;align-items:baseline;gap:12px;text-decoration:none;color:var(--ink);
  font-weight:700;font-size:1.05rem;letter-spacing:.3em;
}
.nav__logo-jp{font-family:var(--jp);font-weight:300;font-size:.62rem;letter-spacing:.28em;color:var(--muted);}
.nav__links{display:flex;gap:36px;}
.nav__links a{
  font-size:.78rem;font-weight:500;letter-spacing:.08em;text-decoration:none;color:var(--muted);
  transition:color .25s;position:relative;
}
.nav__links a:hover{color:var(--ink);}
.nav__links a.active{color:var(--ink);}
.nav__links a.active::after{
  content:"";position:absolute;left:50%;bottom:-9px;width:4px;height:4px;border-radius:50%;
  background:var(--olive);transform:translateX(-50%);
}
.nav__cta{
  font-size:.75rem;font-weight:600;letter-spacing:.1em;text-decoration:none;color:var(--paper);
  background:var(--ink);padding:11px 22px;border-radius:100px;transition:background .3s,transform .3s;
}
.nav__cta:hover{background:var(--olive-deep);transform:translateY(-1px);}
/* ── language switch (EN / 日本語) — lives in the nav, over the hero ── */
.nav__lang{
  display:flex;align-items:center;gap:7px;
  background:none;border:0;cursor:pointer;padding:4px 2px;
  font-family:var(--sans);font-size:.72rem;font-weight:500;letter-spacing:.14em;
  color:var(--ink);
  margin-right:-14px;   /* nudge toward the right edge (owner ask); flex gap
                           otherwise holds it a full 40px off its neighbour */
}
.nav__lang i{font-style:normal;opacity:.35;}
.nav__lang span{opacity:.42;transition:opacity .25s;}
.nav__lang span.on{opacity:1;}
.nav:not(.solid) .nav__lang{color:var(--ink);text-shadow:0 1px 2px rgba(8,12,7,.45);}
[data-theme="light"] .nav:not(.solid) .nav__lang{color:#F0E8D8;}
/* Japanese mode: titles set in the JP serif so kana/kanji keep the brand's
   editorial weight (Cormorant has no Japanese glyphs — without this swap the
   headings fall back to a system font mid-page) */
html:lang(ja){--serif:'Noto Serif JP',serif;}

.nav__burger{display:none;background:none;border:0;cursor:pointer;width:34px;height:30px;position:relative;transition:opacity .45s var(--ease);}
/* the burger stays OUT of the film: invisible while the nav rides transparent
   over the cinematic hero, fades in with the solid nav once the journey ends */
.nav:not(.solid) .nav__burger{opacity:0;pointer-events:none;}
.nav__burger span{
  position:absolute;left:4px;right:4px;height:1.5px;background:var(--ink);transition:transform .35s var(--ease),top .35s;
}
.nav__burger span:first-child{top:10px;}
.nav__burger span:last-child{top:19px;}
.nav__burger.open span:first-child{top:14px;transform:rotate(45deg);}
.nav__burger.open span:last-child{top:14px;transform:rotate(-45deg);}

/* ── shared section bits ── */
.section{padding:clamp(90px,12vw,150px) clamp(20px,7vw,110px);}
.section__eyebrow{
  font-size:.72rem;font-weight:600;letter-spacing:.3em;text-transform:uppercase;color:var(--olive);
  margin-bottom:22px;
}
.section__eyebrow--light{color:var(--sage);}
.section__title{
  font-family:var(--serif);font-weight:400;font-size:clamp(2.1rem,4.4vw,3.6rem);
  line-height:1.12;letter-spacing:.01em;margin-bottom:30px;
}
.section__title em{font-style:italic;color:var(--olive-deep);}
.section__title--light{color:var(--paper);}
.section__title--light em{color:var(--resin);}

.btn{
  display:inline-block;font-size:.8rem;font-weight:600;letter-spacing:.08em;text-decoration:none;
  padding:15px 32px;border-radius:100px;transition:transform .3s var(--ease),background .3s,color .3s,border-color .3s;
  cursor:pointer;border:1px solid transparent;font-family:var(--sans);
}
.btn--solid{background:var(--ink);color:var(--paper);}
.btn--solid:hover{background:var(--olive-deep);transform:translateY(-2px);}
.btn--ghost{border-color:var(--ink);color:var(--ink);background:transparent;}
.btn--ghost:hover{background:var(--ink);color:var(--paper);transform:translateY(-2px);}

/* reveal on scroll */
.reveal{opacity:0;transform:translateY(26px);transition:opacity .9s var(--ease),transform .9s var(--ease);}
.reveal.in{opacity:1;transform:none;}
/* opacity-only reveal for elements the scroll engine moves */
.reveal--fade{opacity:0;transition:opacity 1.1s var(--ease);}
.reveal--fade.in{opacity:1;}
[data-speed],[data-drift],[data-rotate]{will-change:transform;}

/* ═══ HERO — scroll-scrub cinematic (minimalist: no overlay text) ═══
   A tall scroll TRACK (#cine) whose inner stage is position:sticky, so the
   screen stays pinned while scrolling scrubs the 505 rendered frames onto the
   canvas. The frames carry the whole hero — only a wordless scroll cue on top. */
/* height enlarged from 520vh to absorb the underwater "slow zone" (scrubber.js
   SLOW): the extra travel goes to the water frames so everything else keeps its
   original scroll speed. Keep in sync with SLOW.factor/band. */
.cine{position:relative;height:666vh;background:#0f150e;}
.cine__sticky{
  /* dvh: the pinned stage must fill the REAL viewport at every moment — with
     svh, the strip iOS frees when its URL bar collapses mid-scroll showed as a
     bare parchment band under the film ("not full screen"). vh = fallback for
     browsers without dynamic units. */
  position:sticky;top:0;height:100vh;height:100dvh;overflow:hidden;
  background:#121a12;                       /* dark base — no white flash before frame 1 */
}
#heroCanvas{position:absolute;inset:0;width:100%;height:100%;display:block;}
/* faint top scrim only — keeps the transparent nav legible over bright frames */
.cine__scrim{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(12,17,11,.34) 0%,transparent 16%);
}

/* brand line — the ONLY text on the hero: the standalone hero's minimalist
   bottom-center credit, a letterspaced serif wordmark over a small sub-line,
   sitting quietly over the film for its whole run. Fixed parchment (the
   footage isn't themed); a soft shadow keeps it legible on bright sky frames. */
.cine__brand{
  position:absolute;left:50%;bottom:max(6vh,env(safe-area-inset-bottom));
  transform:translateX(-50%);pointer-events:none;user-select:none;
  color:#F4EFE6;font-family:Georgia,"Times New Roman",serif;
  font-size:14px;letter-spacing:.42em;text-indent:.42em;
  opacity:.85;text-align:center;
  text-shadow:0 1px 2px rgba(8,12,7,.45),0 2px 24px rgba(8,12,7,.4);
}
.cine__brand small{
  display:block;margin-top:.6em;
  font-size:9px;letter-spacing:.3em;text-indent:.3em;opacity:.6;
}

/* scroll-down cue — modern and wordless: a hairline vertical guide with a
   SUBTLE streak of light dropping down it on a steady, seamless loop, ending
   in a quiet chevron. No glow theatrics, no text — just consistent downward
   motion. Lower third, above the brand credit, phone and desktop alike.
   Fades away the moment the journey starts moving (scroll or auto-glide). */
.cine__hint{
  position:absolute;left:50%;
  bottom:calc(max(6vh,env(safe-area-inset-bottom)) + 84px);
  transform:translateX(-50%);
  opacity:.8;
  transition:opacity .8s var(--ease);pointer-events:none;user-select:none;
}
/* the guide — a flat hairline; overflow clips the streak's run-in/out */
.cine__hint i{
  position:relative;
  display:block;margin:0 auto;width:1px;height:54px;
  background:rgba(244,239,230,.16);
  overflow:hidden;
}
/* the streak — a soft slip of light, travelling top to bottom at constant
   speed (linear + symmetric keyframes = no pause, no lurch: consistent) */
.cine__hint i::before{
  content:"";position:absolute;left:0;top:0;width:1px;height:22px;
  background:linear-gradient(transparent,rgba(255,255,255,.85) 55%,transparent);
  animation:hintStreak 2.4s linear infinite;
}
/* chevron below the line (on the container — the line clips its overflow) */
.cine__hint::after{
  content:"";position:absolute;left:50%;bottom:-5px;
  width:6px;height:6px;
  border-right:1px solid rgba(244,239,230,.5);border-bottom:1px solid rgba(244,239,230,.5);
  transform:translateX(-50%) rotate(45deg);
}
@keyframes hintStreak{
  0%   {transform:translateY(-22px);opacity:0;}
  20%  {opacity:1;}
  80%  {opacity:1;}
  100% {transform:translateY(54px);opacity:0;}
}
/* reduced motion: keep the cue (line + chevron), park the streak */
@media (prefers-reduced-motion: reduce){
  .cine__hint i::before{animation:none;opacity:0;}
}
body.cine-moving .cine__hint{opacity:0;}

/* Otherwise the hero is pure: nothing over the frames but the faint nav scrim.
   The scrub is scroll-CONTROLLED (not auto-motion), so it stays on under
   prefers-reduced-motion — the track keeps its full height + range. */

/* transparent nav sits over the DARK cinematic hero → light text (fable default
   is dark, for its light hero). `.nav.solid` (in the content below) stays dark. */
.nav:not(.solid){text-shadow:0 1px 22px rgba(0,0,0,.4);}
.nav:not(.solid) .nav__logo{color:var(--ink);}
.nav:not(.solid) .nav__logo-jp{color:rgba(240,232,216,.72);}
.nav:not(.solid) .nav__links a{color:rgba(240,232,216,.82);}
.nav:not(.solid) .nav__links a:hover,
.nav:not(.solid) .nav__links a.active{color:var(--ink);}
.nav:not(.solid) .nav__cta{
  background:rgba(240,232,216,.14);color:var(--ink);
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);
}
.nav:not(.solid) .nav__burger span{background:var(--ink);}

/* ═══ MARQUEE ═══ */
.marquee{
  border-top:1px solid var(--hairline);border-bottom:1px solid var(--hairline);
  overflow:hidden;padding:18px 0;background:var(--mist);
}
.marquee__track{display:flex;white-space:nowrap;width:max-content;animation:marquee 36s linear infinite;}
.marquee:hover .marquee__track{animation-play-state:paused;}
.marquee__track span{
  font-family:var(--serif);font-size:1.02rem;letter-spacing:.24em;text-transform:uppercase;color:var(--muted);
}
.mk-gr{color:var(--gr-olive);}
.mk-jp{color:var(--jp-blue);}
.mk-craft{color:var(--clay);}
.mk-resin{color:var(--sun);}
@keyframes marquee{to{transform:translateX(-50%);}}

/* ═══ STORY ═══ */
.story{max-width:1300px;margin:0 auto;text-align:center;}
.story .section__title{margin-bottom:70px;}
.story__grid{
  display:grid;grid-template-columns:1fr auto 1fr;gap:clamp(28px,4vw,64px);
  text-align:left;align-items:stretch;margin-bottom:90px;
}
.story__label{
  font-size:.72rem;font-weight:600;letter-spacing:.3em;text-transform:uppercase;color:var(--gr-olive);
  margin-bottom:16px;display:flex;align-items:center;gap:10px;
}
.story__label::before{
  content:"";width:8px;height:8px;background:currentColor;transform:rotate(45deg);flex:none;
}
.story__label--jp{color:var(--jp-blue);}
.story__head{font-family:var(--serif);font-weight:500;font-size:1.7rem;margin-bottom:16px;}
.story__col p:last-child{color:var(--ink-soft);font-size:.97rem;}
.story__col em{font-family:var(--serif);font-style:italic;}
.story__divider{display:flex;flex-direction:column;align-items:center;gap:18px;}
.story__divider-line{flex:1;width:1px;background:var(--hairline);}
.story__divider-seal{width:64px;mix-blend-mode:multiply;opacity:.9;}

.stats{
  list-style:none;display:grid;grid-template-columns:repeat(4,1fr);
  border-top:1px solid var(--hairline);padding-top:44px;gap:20px;
}
.stats__num{
  display:block;font-family:var(--serif);font-weight:300;
  font-size:clamp(2.6rem,5vw,4rem);line-height:1;color:var(--ink);
  transition:transform .4s var(--ease);
}
.stats li:nth-child(1) .stats__num{color:var(--creek);}
.stats li:nth-child(2) .stats__num{color:var(--sun);}
.stats li:nth-child(3) .stats__num{color:var(--olive);}
.stats li:nth-child(4) .stats__num{color:var(--clay);}
.stats li:hover .stats__num{transform:translateY(-4px);}
.stats__cap{
  display:block;margin-top:10px;font-size:.72rem;font-weight:500;
  letter-spacing:.22em;text-transform:uppercase;color:var(--muted);
}

/* ═══ ESSENCE — the story stripped to one line + the stats (fable-minimal-remake) ═══ */
.essence{text-align:center;}
.essence__line{
  font-family:var(--serif);font-weight:400;color:var(--ink);
  font-size:clamp(1.9rem,4vw,3.2rem);line-height:1.25;letter-spacing:.01em;
  margin:0 auto clamp(48px,7vw,84px);max-width:22em;
}
.essence__line em{font-style:italic;color:var(--olive-deep);}
.essence .stats{max-width:820px;margin:0 auto;}
.stats__n{ /* static twin of .stats__num — the numbers no longer count up */
  display:block;font-family:var(--serif);font-weight:300;
  font-size:clamp(2.6rem,5vw,4rem);line-height:1;color:var(--ink);
}
.stats li:nth-child(1) .stats__n{color:var(--creek);}
.stats li:nth-child(2) .stats__n{color:var(--sun);}
.stats li:nth-child(3) .stats__n{color:var(--olive);}
.stats li:nth-child(4) .stats__n{color:var(--clay);}

/* ═══ CERTIFICATE OF COMPOSITION — the essence as an assay certificate ═══
   Scientific-minimalist: double hairline frame, specimen plate (currentColor
   engraving), dotted-leader assay, Chios↔Japan coordinate rule. Mono is a
   garnish — values, units, coords, captions only, never sentences. All colour
   from tokens so both themes flip free. */
.cert{
  --mono:"SF Mono",ui-monospace,"Cascadia Code",Consolas,monospace;
  position:relative;max-width:840px;margin:0 auto;
  padding:clamp(34px,5vw,60px) clamp(20px,5vw,56px);
  border:1px solid var(--hairline);
}
.cert::before{content:"";position:absolute;inset:6px;border:1px solid var(--hairline);pointer-events:none;}
/* the card itself stays put — its CHILDREN carry the staggered reveal on .in */
.cert.reveal{opacity:1;transform:none;transition:none;}
.cert__caption{
  font-family:var(--sans);font-weight:600;font-size:.62rem;letter-spacing:.34em;
  text-transform:uppercase;line-height:1.6;color:var(--muted);
  margin:0 0 clamp(30px,5vw,48px);
}
.cert .stats{max-width:660px;margin:0 auto;border-top:0;padding-top:0;gap:18px;}
.cert .stats__n{font-size:clamp(2.8rem,6vw,4.2rem);font-variant-numeric:tabular-nums;}
.cert .stats__cap{margin-top:12px;font-size:.62rem;}
.stat__unit{
  display:block;margin-top:7px;font-family:var(--mono);
  font-size:.6rem;letter-spacing:.05em;color:var(--muted);
}

/* — specimen plate beside the assay — */
.cert__mid{
  display:grid;grid-template-columns:minmax(130px,190px) minmax(0,1fr);
  gap:clamp(26px,6vw,60px);align-items:center;
  max-width:640px;margin:clamp(36px,6vw,54px) auto 0;
}
.plate__art{width:100%;max-width:190px;margin:0 auto;color:var(--ink);}
.plate__art svg{display:block;width:100%;height:auto;overflow:visible;}
.plate__art path,.plate__art circle{
  fill:none;stroke:currentColor;stroke-width:1.35;
  stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;
}
.plate__art .fruit{color:var(--olive);}
.plate__art .resin{color:var(--sun);}
.plate__fig{
  margin-top:14px;font-family:var(--mono);font-size:.6rem;
  letter-spacing:.12em;color:var(--muted);text-align:center;
}
.plate__fig i{font-family:var(--serif);font-style:italic;font-size:1.25em;letter-spacing:.01em;color:var(--ink-soft);}

.cert__data{text-align:left;}
.assay__per{
  font-family:var(--mono);font-size:.62rem;letter-spacing:.26em;text-transform:uppercase;
  color:var(--ink-soft);margin:0 0 14px;text-align:center;
}
.assay__per span{font-family:var(--serif);color:var(--muted);}
.assay{list-style:none;margin:0;}
.assay__row{display:flex;align-items:baseline;padding:8px 2px;border-top:1px solid var(--hairline);}
.assay__row:last-child{border-bottom:1px solid var(--hairline);}
.assay__k{
  font-family:var(--sans);font-size:.7rem;font-weight:500;
  letter-spacing:.11em;text-transform:uppercase;color:var(--ink-soft);white-space:nowrap;
}
.assay__row--sub .assay__k{
  font-family:var(--serif);font-style:italic;font-size:.92rem;text-transform:none;
  letter-spacing:.01em;font-weight:400;color:var(--muted);padding-left:1.3em;
}
.assay__lead{flex:1 1 auto;height:0;margin:0 .7em;border-bottom:1px dotted var(--hairline);transform:translateY(-.18em);}
.assay__v{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:.7rem;letter-spacing:.04em;color:var(--ink);white-space:nowrap;}
.assay__fig{display:inline-block;min-width:1.4em;text-align:right;}
.assay__u{display:inline-block;min-width:2.6em;text-align:left;margin-left:.45em;color:var(--muted);}

/* — footnote (labelling thresholds — a fact, not a virtue) — */
.cert__note{
  max-width:520px;margin:clamp(30px,5vw,44px) auto 0;
  font-family:var(--sans);font-size:.6rem;line-height:1.7;letter-spacing:.02em;color:var(--muted);
}

/* — motion: engraving draw-on + staggered certificate (observer adds .in) — */
@media (prefers-reduced-motion:no-preference){
  .cert .plate__art path,.cert .plate__art circle{
    stroke-dasharray:1;stroke-dashoffset:1;transition:stroke-dashoffset 1.3s var(--ease);
  }
  .cert.in .plate__art path,.cert.in .plate__art circle{stroke-dashoffset:0;}
  .cert .plate__art .art-leaves *{transition-delay:.18s;}
  .cert .plate__art .resin *{transition-delay:.5s;}
  .cert .plate__art .fruit *{transition-delay:.7s;}

  .cert__caption,.cert .stats li,.cert__plate,.assay__per,.assay__row,.cert__note{
    opacity:0;transform:translateY(12px);
    transition:opacity .8s var(--ease),transform .8s var(--ease);
  }
  .cert.in .cert__caption,.cert.in .stats li,.cert.in .cert__plate,.cert.in .assay__per,
  .cert.in .assay__row,.cert.in .cert__note{opacity:1;transform:none;}
  .cert.in .cert__caption{transition-delay:.05s;}
  .cert.in .stats li:nth-child(1){transition-delay:.12s;}
  .cert.in .stats li:nth-child(2){transition-delay:.18s;}
  .cert.in .stats li:nth-child(3){transition-delay:.24s;}
  .cert.in .stats li:nth-child(4){transition-delay:.30s;}
  .cert.in .cert__plate{transition-delay:.36s;}
  .cert.in .assay__per{transition-delay:.42s;}
  .cert.in .assay__row:nth-child(1){transition-delay:.48s;}
  .cert.in .assay__row:nth-child(2){transition-delay:.54s;}
  .cert.in .assay__row:nth-child(3){transition-delay:.60s;}
  .cert.in .assay__row:nth-child(4){transition-delay:.66s;}
  .cert.in .assay__row:nth-child(5){transition-delay:.72s;}
  .cert.in .assay__row:nth-child(6){transition-delay:.78s;}
  .cert.in .cert__note{transition-delay:.86s;}
}

/* — ≤760px: plate stacks over the assay, stats 2-col, tighter frame — */
@media (max-width:760px){
  .cert{padding:clamp(24px,7vw,40px) clamp(16px,6vw,30px);}
  .cert::before{inset:5px;}
  .cert .stats{grid-template-columns:repeat(2,1fr);gap:30px 18px;}
  .cert__mid{grid-template-columns:1fr;gap:26px;}
  .plate__art{max-width:150px;}
  .cert__data{max-width:420px;margin:0 auto;width:100%;}
  .assay__k{letter-spacing:.08em;}
}

/* ═══ DRIFTLINE — outlined type scrubbed by scroll ═══ */
.driftline{
  overflow:hidden;padding:clamp(40px,6vw,80px) 0 0;pointer-events:none;user-select:none;
}
.driftline span{
  display:block;width:max-content;white-space:nowrap;
  font-family:var(--serif);font-weight:400;text-transform:uppercase;
  font-size:clamp(2.8rem,7vw,6.2rem);line-height:1.16;letter-spacing:.1em;
  color:transparent;-webkit-text-stroke:1px #D8D1C1;   /* stone-light */
}
.driftline span:nth-child(2){margin-left:-6vw;-webkit-text-stroke-color:#B8C79E;} /* sage-soft */
@supports not (-webkit-text-stroke:1px #000){
  .driftline span{color:var(--hairline);}
}

/* ═══ FLAVOURS ═══ */
.flavours{
  background:var(--fl-wash);
  transition:background 1s var(--ease);
}
.flavours__head{max-width:1300px;margin:0 auto;text-align:center;}
.flavours__head .section__title{margin-bottom:clamp(40px,6vw,80px);}
.flavours__stage{
  max-width:1300px;margin:0 auto;display:grid;grid-template-columns:1fr 1fr;
  align-items:center;gap:clamp(30px,5vw,80px);
}
.flavours__bottlewrap{position:relative;height:min(72vh,680px);display:flex;justify-content:center;}
.flavours__halo{
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:min(400px,86%);aspect-ratio:1;border-radius:50%;
  border:1px solid var(--fl-accent);opacity:.35;transition:border-color 1s;
}
.flavours__halo::after{
  content:"";position:absolute;inset:26px;border-radius:50%;
  border:1px dashed var(--fl-accent);opacity:.5;transition:border-color 1s;
  animation:spinslow 70s linear infinite;
}
@keyframes spinslow{to{transform:rotate(360deg);}}
.flavours__bottle{
  position:absolute;top:0;height:100%;width:auto;object-fit:contain;
  mix-blend-mode:multiply;opacity:0;transform:translateY(18px) scale(.985);
  transition:opacity .7s var(--ease),transform .7s var(--ease);
  filter:drop-shadow(0 34px 34px rgba(38,52,28,.13));
  pointer-events:none;
}
.flavours__bottle.is-active{opacity:1;transform:none;}

.flavours__list{display:flex;flex-direction:column;border-top:1px solid var(--hairline);}
.flavours__tab{
  display:flex;align-items:baseline;gap:22px;width:100%;text-align:left;
  background:none;border:0;border-bottom:1px solid var(--hairline);cursor:pointer;
  padding:20px 6px;font-family:var(--sans);color:var(--muted);
  transition:color .3s,padding-left .35s var(--ease);
}
.flavours__tab:hover{color:var(--ink);padding-left:14px;}
.flavours__tab.is-active{color:var(--ink);}
.flavours__no{font-size:.72rem;font-weight:600;letter-spacing:.18em;color:var(--fl-accent);transition:color 1s;}
.flavours__name{
  font-family:var(--serif);font-weight:500;font-size:clamp(1.5rem,2.4vw,2.1rem);line-height:1.1;
}
.flavours__tab.is-active .flavours__name{font-style:italic;}
.flavours__dot{
  width:10px;height:10px;border-radius:50%;margin-left:auto;align-self:center;flex:none;
  opacity:.55;transform:scale(.8);transition:opacity .3s,transform .4s var(--ease);
}
.flavours__tab:hover .flavours__dot,.flavours__tab.is-active .flavours__dot{opacity:1;transform:scale(1.15);}
.flavours__tab[data-flavour="original"] .flavours__dot{background:#91964F;} /* mastic-olive */
.flavours__tab[data-flavour="yuzu"] .flavours__dot{background:#C6A548;}     /* sun-muted   */
.flavours__tab[data-flavour="ume"] .flavours__dot{background:#C3936C;}      /* clay-sun    */
.flavours__tab[data-flavour="hinoki"] .flavours__dot{background:#527748;}   /* forest-pine */

.flavours__detail{padding-top:34px;}
.flavours__jp{
  font-family:var(--jp);font-weight:400;font-size:.86rem;letter-spacing:.4em;
  color:var(--fl-deep);margin-bottom:16px;transition:color 1s;
}
.flavours__desc{max-width:46ch;font-size:.99rem;color:var(--ink-soft);margin-bottom:22px;}
.flavours__notes{list-style:none;display:flex;gap:10px;flex-wrap:wrap;}
.flavours__notes li{
  font-size:.72rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;
  padding:8px 16px;border:1px solid var(--fl-accent);border-radius:100px;color:var(--fl-deep);
  transition:border-color 1s,color 1s;
}

/* ═══ SEAL ═══ */
.seal{background:var(--dark);color:var(--paper);}
.seal__inner{
  max-width:1300px;margin:0 auto;display:grid;grid-template-columns:.9fr 1.1fr;
  gap:clamp(40px,6vw,100px);align-items:center;
}
.seal__paper{
  width:min(420px,100%);aspect-ratio:1;border-radius:50%;background:var(--paper);
  display:flex;align-items:center;justify-content:center;margin:0 auto;
  box-shadow:0 30px 80px rgba(0,0,0,.35),0 0 130px rgba(222,211,142,.16);
}
.seal__paper img{width:86%;mix-blend-mode:multiply;}
.seal__legend{list-style:none;counter-reset:seal;margin-top:14px;}
.seal__legend li{
  counter-increment:seal;position:relative;padding:20px 0 20px 64px;
  border-bottom:1px solid rgba(249,245,233,.14);
  font-size:.95rem;color:rgba(249,245,233,.72);font-weight:300;
  transition:padding-left .4s var(--ease),background .4s;
}
.seal__legend li:hover{padding-left:74px;background:rgba(249,245,233,.03);}
.seal__legend li:hover span{color:var(--resin);}
.seal__legend li span{transition:color .35s;}
.seal__legend li::before{
  content:counter(seal,decimal-leading-zero);
  position:absolute;left:0;top:22px;
  font-size:.72rem;font-weight:600;letter-spacing:.18em;color:var(--resin);
}
.seal__legend li span{
  display:block;font-family:var(--serif);font-weight:500;font-size:1.25rem;
  color:var(--paper);margin-bottom:4px;
}

/* ═══ SCENERY ═══ */
.scenery{padding:clamp(90px,12vw,150px) 0 0;}
.scenery__head{text-align:center;padding:0 clamp(20px,7vw,110px);}
.scenery__head .section__title{margin-bottom:clamp(40px,6vw,70px);}
.scenery__frame{
  position:relative;width:100%;height:clamp(320px,58vw,72vh);overflow:hidden;
  background:var(--paper-deep);border-top:1px solid var(--hairline);border-bottom:1px solid var(--hairline);
}
.scenery__slide{
  position:absolute;left:0;right:0;top:-48px;bottom:-48px;   /* headroom for scroll parallax */
  opacity:0;transition:opacity .7s var(--ease);
  pointer-events:none;
}
.scenery__slide.is-active{opacity:1;pointer-events:auto;}
.scenery__slide img{
  width:100%;height:100%;object-fit:cover;object-position:center;
}
.scenery__slide.is-active img{animation:drift 4s var(--ease) forwards;}
@keyframes drift{from{transform:scale(1.06);}to{transform:scale(1);}}
.scenery__slide figcaption{
  position:absolute;left:clamp(20px,5vw,60px);bottom:calc(48px + clamp(18px,4vw,44px));
  background:rgba(249,245,233,.9);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  border:1px solid var(--hairline);border-radius:14px;padding:14px 22px;
  font-family:var(--serif);font-size:clamp(1rem,1.6vw,1.25rem);font-style:italic;color:var(--ink);
  max-width:min(70%,420px);
}
.scenery__slide figcaption span{
  display:block;font-family:var(--sans);font-style:normal;font-size:.68rem;font-weight:600;
  letter-spacing:.26em;text-transform:uppercase;color:var(--olive);margin-bottom:6px;
}
.scenery__dots{
  position:absolute;right:clamp(20px,5vw,60px);bottom:clamp(22px,4.4vw,48px);
  display:flex;gap:8px;z-index:5;
}
.scenery__dots button{
  width:34px;height:4px;border-radius:4px;border:0;cursor:pointer;
  background:rgba(29,46,24,.22);transition:background .4s;padding:0;
}
.scenery__dots button.is-active{background:var(--olive);}
.scenery__dots button:hover{background:var(--olive-deep);}

/* ═══ RITUAL ═══ */
.ritual{background:var(--wash-sage);}
.ritual__wrap{max-width:1300px;margin:0 auto;text-align:center;}
.ritual .section__title{margin-bottom:clamp(44px,6vw,80px);}
.ritual__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(24px,3vw,44px);text-align:left;}
.ritual__step{border-top:1px solid var(--hairline);padding-top:26px;position:relative;}
.ritual__step::before{
  content:"";position:absolute;top:-1px;left:0;width:46px;height:3px;background:var(--acc,var(--olive));
  transition:width .5s var(--ease);
}
.ritual__step:hover::before{width:100%;}
.ritual__step:nth-child(1){--acc:#91964F;} /* mastic-olive */
.ritual__step:nth-child(2){--acc:#6D9DAA;} /* mineral-blue */
.ritual__step:nth-child(3){--acc:#C3936C;} /* clay-sun     */
.ritual__no{
  font-size:.72rem;font-weight:600;letter-spacing:.22em;color:var(--acc,var(--olive));
  display:block;margin-bottom:18px;
}
.ritual__step h3{font-family:var(--serif);font-weight:500;font-size:1.5rem;margin-bottom:12px;}
.ritual__step p{font-size:.95rem;color:var(--ink-soft);}

/* ═══ ORDER / CONTACT ═══ */
.order__inner{
  max-width:1200px;margin:0 auto;display:grid;grid-template-columns:.85fr 1.15fr;
  gap:clamp(40px,6vw,90px);align-items:start;
}
.order__left .section__title{margin-bottom:24px;}
.order__sub{max-width:38ch;color:var(--ink-soft);font-size:.98rem;margin-bottom:38px;}
.order__info{display:flex;flex-direction:column;gap:20px;}
.order__info div{border-top:1px solid var(--hairline);padding-top:14px;}
.order__info dt{
  font-size:.68rem;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--olive);margin-bottom:5px;
}
.order__info dd{font-family:var(--serif);font-size:1.15rem;color:var(--ink);}

.order__form{
  display:flex;flex-direction:column;gap:24px;
  background:var(--paper-deep);border:1px solid var(--hairline);border-radius:20px;
  padding:clamp(26px,3.4vw,44px);
}
.fg{display:flex;flex-direction:column;gap:8px;}
.fg-row{display:grid;grid-template-columns:2fr 1fr;gap:20px;}
.fg label{
  font-size:.68rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.fg input,.fg select,.fg textarea{
  font-family:var(--sans);font-weight:300;font-size:1rem;color:var(--ink);
  background:transparent;border:0;border-bottom:1px solid var(--hairline);
  padding:11px 2px;outline:none;transition:border-color .3s;border-radius:0;
  -webkit-appearance:none;appearance:none;
}
.fg select{cursor:pointer;}
.fg textarea{resize:vertical;min-height:64px;}
.fg input:focus,.fg select:focus,.fg textarea:focus{border-bottom-color:var(--olive);}
.fg input::placeholder,.fg textarea::placeholder{color:var(--muted);}
.order__form .btn{margin-top:8px;align-self:flex-start;}
/* ── order flow modal — accept the terms, review the order, place it.
   (replaced the inline consent checkbox; the ACCEPT click is the recorded
   acknowledgment.) Mirrors the merch lightbox pattern: fixed veil + card. ── */
.ordm{
  position:fixed;inset:0;z-index:800;background:rgba(14,11,8,.6);
  display:flex;align-items:center;justify-content:center;padding:20px;
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
}
.ordm[hidden]{display:none;}
.ordm__card{
  position:relative;background:var(--paper);border:1px solid var(--hairline);
  border-radius:22px;max-width:560px;width:100%;max-height:88vh;overflow-y:auto;
  padding:clamp(22px,4vw,34px);
}
.ordm__close{
  position:absolute;top:10px;right:14px;background:none;border:0;cursor:pointer;
  font-size:1.6rem;line-height:1;color:var(--muted);transition:color .2s;
}
.ordm__close:hover{color:var(--ink);}
.ordm__title{font-family:var(--serif);font-weight:500;font-size:1.5rem;margin-bottom:14px;color:var(--ink);}
.ordm__body p{font-size:.9rem;color:var(--ink-soft);line-height:1.7;margin-bottom:12px;}
.ordm__body a{color:var(--olive);text-decoration:underline;}
.ordm__summary{margin:6px 0 14px;}
.ordm__summary div{display:flex;justify-content:space-between;gap:14px;padding:9px 0;border-bottom:1px solid var(--hairline);font-size:.9rem;}
.ordm__summary dt{color:var(--muted);flex:none;}
.ordm__summary dd{color:var(--ink);text-align:right;word-break:break-word;white-space:pre-line;}
.ordm__note{font-size:.78rem;color:var(--muted);}
.ordm__actions{display:flex;justify-content:flex-end;gap:12px;margin-top:16px;flex-wrap:wrap;}
.ordm__ghost{background:transparent;border:1px solid var(--hairline);color:var(--ink-soft);}
.ordm__ghost:hover{border-color:var(--muted);color:var(--ink);}
.order__note{font-size:.78rem;letter-spacing:.04em;color:var(--muted);}
.order__ok{font-family:var(--jp);font-weight:400;font-size:.98rem;color:var(--olive-deep);}
.order__err{font-size:.88rem;line-height:1.6;color:#9A6B43;border-left:2px solid #9A6B43;padding-left:12px;}
.order__err a{color:inherit;text-decoration:underline;}

/* ═══ FOOTER ═══ */
.footer{
  /* background matches the panorama art's exact green so the art and the
     footer read as one continuous piece (no CSS scallop edge — the art
     carries its own seigaiha band) */
  background:#212C21;color:rgba(249,245,233,.6);
  padding:0 0 36px;position:relative;
  /* gilded seam: the footer art's green meets the candle-umber page on an
     intentional hairline instead of a bare hue boundary */
  border-top:1px solid rgba(232,210,170,.22);
}
/* NIGHT theme only: sink the footer to a deeper green so it settles into the
   dark page. Daylight keeps #212C21 (matches the panorama art's green band). */
:root:not([data-theme="light"]) .footer{background:#161E16;}
/* NIGHT seam: the panorama's bottom green band (#212e23) meets the darker night
   footer. Overlay a scrim sized to the art (fixed 3:1, full-bleed) that fades
   transparent→#161E16 across only the art's bottom ~10% solid-green filler,
   dissolving the hue step into a seamless join. Day needs no scrim (bg matches
   the art), so this is night-only and leaves the wave crests untouched. */
:root:not([data-theme="light"]) .footer::before{
  content:"";position:absolute;left:0;top:0;width:100%;
  aspect-ratio:1800/600;pointer-events:none;
  background:linear-gradient(to bottom,transparent 90%,#161E16 100%);
}
/* the original footer art — Fuji to the ruins of Chios, full-bleed across the
   top of the footer, flush against its upper edge */
.footer__art{
  display:block;width:100%;height:auto;margin:0 0 44px;
}
.footer__top,.footer__bottom{margin-left:clamp(20px,7vw,110px);margin-right:clamp(20px,7vw,110px);}
.footer__top{
  display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap;
  padding-bottom:34px;border-bottom:1px solid rgba(249,245,233,.14);
}
.footer__logo{
  font-weight:700;font-size:1rem;letter-spacing:.3em;color:var(--ink);text-decoration:none;
}
.footer__links{display:flex;gap:28px;flex-wrap:wrap;}
.footer__links a{
  font-size:.78rem;font-weight:500;letter-spacing:.08em;color:rgba(249,245,233,.6);
  text-decoration:none;transition:color .25s;
}
.footer__links a:hover{color:var(--ink);}
/* ── i18n BLOCKS: one chosen language at a time ──
   Long-form pages (care.html / legal.html) ship BOTH languages as duplicated
   .i18n-en / .i18n-ja blocks and switch purely on the <html lang> attribute —
   the same attribute script.js's dictionary switcher sets on index/mobile, so
   the whole site agrees on one source of truth. Only tagged elements
   participate — decorative Japanese brand accents (logo kana, eyebrows) carry
   no tag and never switch. Static default lang="en" = correct no-JS fallback. */
html[lang="ja"] .i18n-en{display:none!important;}
html[lang="en"] .i18n-ja{display:none!important;}

/* legal row — customer care / legal / tokushoho / support, on every page */
.footer__legal{
  display:flex;gap:22px;flex-wrap:wrap;justify-content:flex-start;
  margin:20px clamp(20px,7vw,110px) 0;
  padding-bottom:22px;border-bottom:1px solid rgba(249,245,233,.14);
}
.footer__legal a{
  font-size:.72rem;letter-spacing:.06em;color:rgba(249,245,233,.45);
  text-decoration:none;transition:color .25s;
}
.footer__legal a:hover{color:var(--ink);}
.footer__bottom{
  display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;
  padding-top:26px;font-size:.75rem;letter-spacing:.06em;
}

/* ═══ RESPONSIVE ═══ */
@media (max-width:1000px){
  .hero__inner{grid-template-columns:1fr;text-align:center;padding-top:30px;}
  .hero__copy{display:flex;flex-direction:column;align-items:center;order:2;}
  .hero__stage{order:1;height:min(52vh,480px);}
  .hero__vertical{display:none;}
  .hero__sub{margin-left:auto;margin-right:auto;}
  .flavours__stage{grid-template-columns:1fr;}
  .flavours__bottlewrap{height:min(56vh,480px);}
  .seal__inner{grid-template-columns:1fr;}
  .order__inner{grid-template-columns:1fr;}
  .story__grid{grid-template-columns:1fr;}
  .story__divider{flex-direction:row;max-width:340px;margin:0 auto;width:100%;}
  .story__divider-line{height:1px;width:auto;flex:1;}
}
@media (max-width:760px){
  .nav__links{
    position:fixed;top:var(--nav-h);left:0;right:0;flex-direction:column;gap:0;
    background:var(--paper);
    /* border only when OPEN — a collapsed max-height:0 panel still paints its
       border, which read as a stray 1px line under the nav over the hero */
    max-height:0;overflow:hidden;transition:max-height .5s var(--ease);
  }
  .nav__links.open{max-height:340px;border-bottom:1px solid var(--hairline);}
  .nav__links a{padding:18px clamp(20px,5vw,64px);border-top:1px solid var(--hairline);font-size:.9rem;}
  .nav__cta{display:none;}
  .nav__burger{
    display:block;
    transition:opacity .45s var(--ease),width .45s var(--ease),margin-left .45s var(--ease);
  }
  /* over the hero the burger is hidden — collapse its slot (width + one flex
     gap) so the EN/日本語 switch rides the RIGHT edge of the film; both ease
     back when the solid nav brings the burger in. The switch's global -14px
     nudge (tightens it toward the burger) resets here, or it overshoots past
     the nav padding to ~6px from the glass. */
  .nav:not(.solid) .nav__burger{width:0;margin-left:-40px;}
  .nav__lang{transition:margin-right .45s var(--ease);}
  .nav:not(.solid) .nav__lang{margin-right:0;}
  .stats{grid-template-columns:repeat(2,1fr);row-gap:40px;}
  .ritual__grid{grid-template-columns:1fr;}
  .find__form{flex-direction:column;}
  .find__form .btn{width:100%;}
  .hero__actions{justify-content:center;}
}

/* ═══ REDUCED MOTION ═══ */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto;}
  .reveal{opacity:1;transform:none;transition:none;}
  .marquee__track{animation:none;}
  .hero__scrollcue{display:none;}
  #bubbles{display:none;}
  .hero__blob{animation:none;}
  .flavours__halo::after{animation:none;}
  .reveal--fade{opacity:1;transition:none;}
  .nav.hidden{transform:none;}
}
