/* =========================================================================
   ZEN DIVE Manila — a scuba diving landing page
   Art direction: surface glare → abyssal silence → return to light
   ========================================================================= */

:root{
  /* --- luminous turquoise palette (bright "world opening up", not an abyss) --- */
  --sand:#F1EADC;      /* warm off-white text                */
  --glare:#D2F0EB;     /* bright sunlit surface              */
  --cyan:#53D4CD;      /* luminous accent                    */
  --teal:#22A2A6;      /* transitional light                 */
  --pelagic:#1A94A8;   /* mid water                          */
  --deepcur:#157087;   /* deeper water                       */
  --twilight:#115A72;  /* deep, still alive                  */
  --abyss:#0E4A5E;     /* deepest — a bright living teal, never black */
  --gold:#EABF74;      /* warm accent — CTA                  */

  --ink:var(--sand);
  --ink-dim:rgba(241,234,220,.85);
  --ink-faint:rgba(241,234,220,.55);
  --line:rgba(210,240,235,.2);

  /* --- type --- */
  --mincho:'Shippori Mincho','Noto Serif JP',serif;
  --display:'Cormorant Garamond','Shippori Mincho',serif;
  --sans:'Zen Kaku Gothic New',system-ui,-apple-system,'Hiragino Kaku Gothic ProN',sans-serif;
  --label:'Inter','Zen Kaku Gothic New',sans-serif;
  --marc:'Marcellus','Cormorant Garamond',serif;

  /* --- water-drag easings --- */
  --e-drift:cubic-bezier(.16,1,.30,1);
  --e-buoy:cubic-bezier(.22,1,.36,1);
  --e-sink:cubic-bezier(.65,0,.35,1);
  --e-sway:cubic-bezier(.37,0,.63,1);
  --e-breath:cubic-bezier(.45,.05,.55,.95);

  /* --- driven by JS --- */
  --depth:0;   /* 0 surface .. 1 abyss (grade darkening) */
  --dive:0;    /* 0..1 depth-meter cursor position       */

  --pad:clamp(1.35rem,5vw,7rem);
  --maxw:1280px;
}

/* ---------- reset ---------- */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%;scroll-behavior:auto}
html.lenis,html.lenis body{height:auto}
.lenis.lenis-smooth{scroll-behavior:auto!important}
.lenis.lenis-stopped{overflow:hidden}
body{
  font-family:var(--sans);
  color:var(--ink);
  background:var(--abyss);
  line-height:1.75;
  font-weight:400;
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  letter-spacing:.01em;
}
img{display:block;max-width:100%;height:auto}
a{color:inherit;text-decoration:none}
button,input,select{font:inherit;color:inherit}
ul,ol{list-style:none}
::selection{background:var(--cyan);color:var(--abyss)}
:focus-visible{outline:2px solid var(--cyan);outline-offset:3px}

/* skip link */
.skip{position:fixed;top:12px;left:12px;z-index:10000;transform:translateY(-160%);
  background:var(--sand);color:var(--abyss);padding:.7rem 1.1rem;border-radius:4px;
  font-size:.85rem;letter-spacing:.04em;transition:transform .3s var(--e-drift)}
.skip:focus{transform:none}

/* ================================================================
   FIXED WATER LAYERS
   ================================================================ */
/* The water is rendered, not photographed. The canvas paints it opaquely
   (WebGL context is alpha:false), so this gradient is only ever seen when the
   shader cannot run — reduced motion, a low-end device, or a GL failure — and
   it has to stand on its own as a calm, bright sea. */
.ocean{
  position:fixed;inset:0;width:100%;height:100%;
  z-index:-3;display:block;
  background:
    radial-gradient(120% 70% at 50% -10%, rgba(194,245,238,.5), transparent 55%),
    linear-gradient(180deg, #45c6cc 0%, #2aa4b0 45%, #157087 100%);
}
/* colour grade: surface light fades and the abyss closes in as --depth rises.
   Driven per-frame by JS (main.js). No CSS transition — JS already eases it. */
.grade{
  position:fixed;inset:0;z-index:-1;pointer-events:none;
  /* kept bright & living even at depth — gentle teal wash, never a dark closing-in */
  background:
    radial-gradient(130% 100% at 50% -12%, rgba(214,244,238,calc(.10 - var(--depth)*.04)) 0%, transparent 50%),
    radial-gradient(155% 130% at 50% 46%, transparent 55%, rgba(20,112,132,calc(.05 + var(--depth)*.12)) 100%),
    linear-gradient(180deg,
      rgba(34,140,158,calc(var(--depth)*.07)) 0%,
      rgba(26,120,140,calc(.02 + var(--depth)*.13)) 100%);
}
/* No shader (phones, reduced-motion, low-end): the flat --abyss underneath reads
   far lighter than the rendered water, so text loses the page. Deepen the wash
   to land where the WebGL version sits. .has-ocean is set by main.js on mount. */
html:not(.has-ocean) .grade{
  background:
    radial-gradient(130% 100% at 50% -14%, rgba(214,244,238,calc(.09 - var(--depth)*.05)) 0%, transparent 52%),
    radial-gradient(150% 130% at 50% 44%, transparent 42%, rgba(6,38,52,calc(.34 + var(--depth)*.30)) 100%),
    linear-gradient(180deg,
      rgba(7,44,60,calc(.30 + var(--depth)*.34)) 0%,
      rgba(4,28,40,calc(.44 + var(--depth)*.36)) 100%);
}

.grain{
  position:fixed;inset:-12%;z-index:40;pointer-events:none;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  mix-blend-mode:soft-light;animation:grain 6s steps(5) infinite;will-change:transform;
}
@keyframes grain{
  0%{transform:translate(0,0)}20%{transform:translate(-4%,3%)}40%{transform:translate(3%,-4%)}
  60%{transform:translate(-3%,-2%)}80%{transform:translate(4%,2%)}100%{transform:translate(0,0)}
}

/* ---------- custom cursor ---------- */
.cursor{
  position:fixed;top:0;left:0;z-index:9998;pointer-events:none;
  width:14px;height:14px;transform:translate(-50%,-50%);
  opacity:0;transition:opacity .4s ease;
}
.cursor span{
  display:block;width:100%;height:100%;border-radius:50%;position:relative;
  border:1px solid rgba(191,227,224,.85);
  background:radial-gradient(circle at 35% 30%, rgba(191,227,224,.32), transparent 62%);
  box-shadow:0 0 0 1px rgba(3,10,20,.25);
  transition:width .45s var(--e-drift),height .45s var(--e-drift),
             background .4s ease,border-color .4s ease,transform .4s var(--e-drift);
}
/* solid high-contrast core — stays visible over bright caustics */
.cursor span::after{
  content:"";position:absolute;left:50%;top:50%;width:4px;height:4px;margin:-2px 0 0 -2px;
  border-radius:50%;background:var(--cyan);box-shadow:0 0 3px rgba(3,10,20,.9);
}
.cursor.is-hover span{width:56px;height:56px;margin:-21px;border-color:rgba(69,199,196,.9)}
.cursor.is-drag span{width:74px;height:74px;margin:-30px;background:radial-gradient(circle,rgba(69,199,196,.14),transparent 70%)}
.cursor.is-explore span{width:44px;height:44px;margin:-15px}
.cursor.is-down span{transform:scale(.8)}
.cursor__label{position:absolute;inset:0;display:grid;place-items:center;font:500 9px/1 var(--label);letter-spacing:.15em;color:var(--glare);opacity:0}
html.has-cursor,html.has-cursor *{cursor:none!important}

/* ================================================================
   PRELOADER
   ================================================================ */
.preloader{
  position:fixed;inset:0;z-index:9999;background:var(--abyss);
  display:grid;place-items:center;overflow:hidden;
  clip-path:inset(0 0 0 0);
  /* failsafe: if JS never dismisses the gate (script fails to load / throws),
     fade + disable the overlay so the page is never permanently trapped */
  animation:preloaderFailsafe .8s ease 6s forwards;
}
@keyframes preloaderFailsafe{to{opacity:0;visibility:hidden;pointer-events:none}}
.preloader::after{
  content:"";position:absolute;inset:0;
  background:radial-gradient(120% 90% at 50% 120%, rgba(12,90,120,.5), transparent 55%);
}
.preloader__inner{position:relative;text-align:center;z-index:1}
.preloader__mark{
  font-family:var(--mincho);font-weight:600;font-size:clamp(3rem,10vw,6rem);
  color:var(--sand);letter-spacing:.28em;text-indent:.28em;
  filter:drop-shadow(0 0 30px rgba(69,199,196,.25));
}
.preloader__gauge{margin-top:2.2rem;display:flex;align-items:baseline;justify-content:center;gap:.15rem;color:var(--cyan)}
.preloader__label{font:500 10px/1 var(--label);letter-spacing:.4em;margin-right:.9rem;color:var(--ink-faint);align-self:center}
.preloader__depth{font:400 2.1rem/1 var(--label);font-variant-numeric:tabular-nums;letter-spacing:.02em}
.preloader__unit{font:400 1rem/1 var(--label);color:var(--ink-dim)}
.preloader__bar{margin:1.6rem auto 0;width:min(220px,50vw);height:1px;background:var(--line);overflow:hidden}
.preloader__bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--teal),var(--cyan));box-shadow:0 0 12px var(--cyan)}
.preloader__hint{margin-top:1.4rem;font:400 12px/1 var(--sans);letter-spacing:.35em;color:var(--ink-faint)}

/* ================================================================
   DEPTH METER
   ================================================================ */
.depthmeter{
  position:fixed;right:clamp(18px,2.6vw,42px);top:50%;transform:translateY(-50%);
  z-index:60;pointer-events:none;display:flex;align-items:center;
  opacity:0;transition:opacity .8s ease;
}
.depthmeter.is-on{opacity:1}
/* solid, softly-shadowed treatment so the instrument reads on bright water */
.depthmeter__track{position:relative;width:1px;height:38vh;background:rgba(255,255,255,.4)}
/* tick labels sit to the LEFT of the line; a short dash bridges each to it */
.depthmeter__tick{
  position:absolute;right:9px;top:calc(var(--p)*100%);transform:translateY(-50%);
  text-align:right;font:500 9px/1 var(--label);letter-spacing:.1em;
  color:rgba(241,234,220,.9);white-space:nowrap;text-shadow:0 1px 7px rgba(3,26,36,.6);
}
.depthmeter__tick::before{content:"";position:absolute;right:-9px;top:50%;width:5px;height:1px;background:rgba(255,255,255,.6)}
.depthmeter__cursor{
  position:absolute;left:50%;top:calc(var(--dive)*100%);
  width:8px;height:8px;margin:-4px 0 0 -4px;border-radius:50%;
  background:var(--cyan);box-shadow:0 0 10px var(--cyan),0 0 0 3px rgba(4,26,36,.25);
}
/* live reading rides the cursor on the RIGHT of the line — opposite the labels, so they never overlap */
.depthmeter__read{
  position:absolute;left:12px;top:calc(var(--dive)*100%);transform:translateY(-50%);
  writing-mode:vertical-rl;font:600 11px/1 var(--label);font-variant-numeric:tabular-nums;
  letter-spacing:.14em;color:var(--glare);text-shadow:0 1px 8px rgba(3,26,36,.7);
}

/* ================================================================
   NAV
   ================================================================ */
.nav{
  position:fixed;top:0;left:0;width:100%;z-index:80;
  display:flex;align-items:center;justify-content:space-between;
  padding:clamp(1rem,2.2vw,1.7rem) var(--pad);
  transition:transform .6s var(--e-drift),background .5s ease,padding .5s ease;
  mix-blend-mode:normal;
}
.nav.is-hidden{transform:translateY(-100%)}
/* no distinct "header colour" — the bar stays transparent for full unity with
   the hero; legibility comes from a soft text-shadow, not a coloured band */
.nav.is-scrolled{padding-top:.85rem;padding-bottom:.85rem}
.nav__brand,.nav__links a,.nav__cta{text-shadow:0 1px 16px rgba(5,26,36,.55)}
.nav__brand{display:flex;align-items:center;gap:.6rem}
/* THE MARK — a thin circle, broken once. Nothing inside; the emptiness is the
   point (無). No brush cosplay, no fill, no badge: compass-drawn geometry, the
   same hairline weight as the depth meter and the page rules. The gap is the
   wabi — beauty carried by what is missing, and the way in. */
.maru{flex:none}
.maru circle{fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round}
/* circles must slightly EXCEED a flat text block to read as equal (optical
   overshoot): visible circle = 93.75% of this box → 27px vs the 26.2px lockup */
.nav__maru{width:1.8rem;height:1.8rem;align-self:center;color:var(--sand)}
/* Two-tier lockup, hotel-style: the city is justified to EXACTLY the width of
   the wordmark above it. That width-lock is what reads as a designed mark
   rather than two words in a row. Trailing tracking is trimmed (-.34em) so the
   optical right edges align; the city letters are spread by flex, not tracking. */
.nav__lockup{display:flex;flex-direction:column;gap:.3rem}
.nav__word{font-family:var(--label);font-weight:500;font-size:.78rem;
  letter-spacing:.34em;margin-right:-.34em;color:var(--sand);line-height:1}
.nav__city{display:flex;justify-content:space-between;font-family:var(--label);
  font-weight:500;font-size:.56rem;color:var(--ink-faint);line-height:1}
.nav__city i,.foot__city i{font-style:normal}
.preloader__maru{display:block;width:clamp(3.8rem,9vw,5.2rem);height:auto;margin:0 auto;
  color:var(--sand)}
/* same lockup as the nav — mark + wordmark on row 1, tagline fills row 2.
   Grid (not flex-wrap) because flex-basis:100% only wraps when the row is
   already full; here there's slack, so it never broke onto its own line. */
/* Column 1 is pinned to the ring's own width. With `auto` the tagline spanning
   both columns still fed into the track sizing, holding column 1 at ~99px and
   pushing the wordmark 71px off the mark. */
/* Same mark as the nav, scaled up — not just enlarged. Every measure here is
   nav's value × (1.02 / .78), the ratio of foot__word's size to nav__word's,
   so the ring-to-text overshoot and the MANILA-to-ZEN-DIVE weight match the
   nav exactly. Previously the ring (2.5rem) and city (.57rem) were sized on
   their own and drifted off that ratio — the ring read oversized and MANILA
   read undersized next to the header mark. */
.foot__brand{display:grid;grid-template-columns:2.35rem auto;column-gap:.78rem;row-gap:1.5rem;align-items:center;justify-content:start}
.foot__kanji{grid-column:1;grid-row:1;display:flex;align-items:center}
.foot__maru{display:block;width:2.35rem;height:auto;color:var(--sand)}
/* justify-self:start is load-bearing, not cosmetic. As a grid item this box
   defaults to `stretch`, so it took column 2's width — and column 2 is sized by
   the tagline spanning 1/-1 (max-width:34ch), not by the wordmark. That stretched
   the box to 233px while "ZEN DIVE" only draws 112px, and .foot__city's
   space-between then scattered M A N I L A across the full 233px: twice the
   wordmark's width. The nav never had this because .nav__lockup is a flex item,
   which shrink-wraps. Shrink-wrapping here makes the two lockups behave identically. */
.foot__lockup{grid-column:2;grid-row:1;justify-self:start;display:inline-flex;flex-direction:column;gap:.39rem;margin:0}
.foot__word{font-family:var(--label);font-weight:500;font-size:1.02rem;
  letter-spacing:.34em;margin-right:-.34em;color:var(--sand);line-height:1}
/* Same lockup as the nav: the city sits at .718/1 of the wordmark and stays in
   the quiet ink colour. Cyan and a larger size made it read as a second brand
   rather than a location line. */
.foot__city{display:flex;justify-content:space-between;font-family:var(--label);
  font-weight:500;font-size:.73rem;color:var(--ink-faint);line-height:1}
.foot__tag{grid-column:1 / -1;grid-row:2}
.nav__links{display:flex;gap:clamp(1rem,2.4vw,2.4rem)}
.nav__links a{
  position:relative;font-size:.82rem;letter-spacing:.06em;color:var(--ink-dim);
  transition:color .4s ease;padding:.3rem 0;
}
.nav__links a::after{content:"";position:absolute;left:0;bottom:0;width:0;height:1px;background:var(--cyan);transition:width .5s var(--e-drift)}
.nav__links a:hover{color:var(--sand)}
.nav__links a:hover::after{width:100%}
.nav__cta{
  display:inline-flex;align-items:center;gap:.5rem;
  padding:.6rem 1.3rem;border:1px solid var(--line);border-radius:100px;
  font-size:.82rem;letter-spacing:.05em;color:var(--sand);
  transition:border-color .4s,background .4s,color .4s;overflow:hidden;
}
.nav__cta em{font-family:var(--marc);font-style:normal;font-size:.7rem;letter-spacing:.14em;color:var(--cyan)}
.nav__cta:hover{border-color:var(--gold);background:rgba(229,182,103,.1);color:var(--gold)}
.nav__cta:hover em{color:var(--gold)}
.nav__actions{display:flex;align-items:center;gap:clamp(.7rem,1.4vw,1.1rem)}
.nav__lang{background:none;border:1px solid var(--line);border-radius:100px;padding:.42rem .7rem;
  display:flex;align-items:center;gap:.35rem;cursor:pointer;
  font:600 .66rem/1 var(--label);letter-spacing:.14em;text-shadow:0 1px 16px rgba(5,26,36,.55);
  transition:border-color .4s}
.nav__lang:hover{border-color:var(--cyan)}
.nav__lang i{font-style:normal;color:var(--ink-faint)}
.nav__lang span{color:var(--ink-faint);transition:color .3s}
html[data-lang="ja"] .nav__lang [data-l="ja"],
html[data-lang="en"] .nav__lang [data-l="en"]{color:var(--cyan)}

/* English headings look best in the refined Latin display serif */
html[data-lang="en"] .h-lg,html[data-lang="en"] .h-md,html[data-lang="en"] .hero__title,
html[data-lang="en"] .cta__title{
  font-family:var(--display);font-weight:500;letter-spacing:.005em;line-height:1.12}
html[data-lang="en"] .glow{font-style:italic}
.nav__burger{display:none;flex-direction:column;gap:5px;width:34px;height:34px;background:none;border:0;cursor:pointer;align-items:center;justify-content:center}
.nav__burger span{width:22px;height:1.5px;background:var(--sand);transition:transform .4s var(--e-drift),opacity .3s}
.nav.is-open .nav__burger span:nth-child(1){transform:translateY(3.5px) rotate(45deg)}
.nav.is-open .nav__burger span:nth-child(2){transform:translateY(-3px) rotate(-45deg)}

/* ================================================================
   SHARED TYPE / LAYOUT
   ================================================================ */
.section{position:relative;z-index:1}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--pad)}

.kicker{
  font-family:var(--label);font-weight:500;font-size:.72rem;
  letter-spacing:.34em;text-transform:uppercase;color:var(--cyan);
  display:flex;align-items:center;gap:.9rem;margin-bottom:1.6rem;
}
.kicker::before{content:"";width:34px;height:1px;background:var(--cyan);opacity:.7}

.h-lg{font-family:var(--mincho);font-weight:600;line-height:1.34;
  font-size:clamp(1.55rem,5.4vw,4.3rem);letter-spacing:.02em;color:var(--sand)}
.h-md{font-family:var(--mincho);font-weight:600;line-height:1.4;
  font-size:clamp(1.4rem,4.4vw,3.2rem);letter-spacing:.02em;color:var(--sand)}
/* CJK typography: strict kinsoku (禁則) so a line never starts with 。 or a
   small kana — kills the amateur lone 「る。」/「う。」orphan tell. Headings wrap
   only when they must (narrow mobile); on desktop the authored <br> controls
   the lines and the relaxed max-widths keep them on one line each. */
.h-lg,.h-md,.hero__title,.cta__title,.stay__ttl{
  line-break:strict;text-wrap:balance}
/* Japanese body: break at natural phrase (文節) boundaries so a line never ends
   mid-word — auto-phrase is what stops "18m / まで" and "手元のこ / の一枚".
   Chrome/Edge 119+; elsewhere it falls back to normal CJK wrapping + kinsoku.
   text-wrap:pretty additionally keeps a lone character off the last line. */
p,li,dd,dt,em,b,figcaption,summary,
.hero__lead,.offer__hook,.offers__lead,
.course__hook,.course__why,.course__meta,.course__ul li,
.sched b,.stay__note,.trust__body p,.cta__lead{
  word-break:auto-phrase;text-wrap:pretty}

.glow{color:var(--cyan);position:relative;text-shadow:0 0 34px rgba(83,212,205,.5)}

/* keep body copy legible over the bright water/video backgrounds */
.hero__lead,.offers__lead,.access__text p,
.kicker{text-shadow:0 1px 12px rgba(5,24,34,.4)}

/* .lines splits a heading into one span per character, so the browser may break
   between any two of them — that is what produced "日曜の夜に / はダイバー。".
   .nw marks the 文節 that must stay whole; the line then breaks between them. */
.nw{white-space:nowrap}

/* line-reveal scaffold (JS wraps into .line > .line-inner) */
.lines{overflow:visible}
.lines .line{display:block;overflow:hidden;padding-bottom:.04em}
.lines .line-inner{display:block}
/* initial hidden state is owned by GSAP (js/main.js) — a CSS % transform here
   would be read back as pixels and fight the yPercent tween. */

/* generic reveals (JS-driven) */
html.js [data-reveal]{opacity:0}

/* image / video clip reveal */
html.js [data-clip]{overflow:hidden}
html.js [data-clip] img,html.js [data-clip] video{transform:scale(1.24);clip-path:inset(0 0 100% 0)}

/* background video fills its container like a cover image */
.bgvid{display:block;width:100%;height:100%;object-fit:cover}

/* buttons */
.btn{
  position:relative;display:inline-flex;align-items:center;gap:.6rem;
  padding:1rem 2rem;border-radius:100px;font-size:.9rem;letter-spacing:.06em;
  font-weight:500;overflow:hidden;transition:transform .5s var(--e-drift),color .4s,box-shadow .5s;
}
.btn em{font-family:var(--marc);font-style:normal}
.btn--gold{background:var(--gold);color:#26170a;box-shadow:0 10px 40px -12px rgba(229,182,103,.6)}
.btn--gold::after{content:"";position:absolute;inset:0;background:linear-gradient(120deg,transparent 30%,rgba(255,255,255,.5),transparent 70%);transform:translateX(-120%)}
.btn--gold:hover{box-shadow:0 16px 50px -10px rgba(229,182,103,.75)}
.btn--gold:hover::after{transform:translateX(120%);transition:transform 1.1s var(--e-drift)}
.btn--ghost{border:1px solid var(--line);color:var(--sand)}
.btn--ghost:hover{border-color:var(--cyan);color:var(--cyan)}
.btn--block{width:100%;justify-content:center;margin-top:.6rem}

/* ================================================================
   HERO
   ================================================================ */
.hero{min-height:100svh;display:flex;flex-direction:column;justify-content:center;
  /* the scroll cue and the meta line are absolutely placed at the bottom, so the
     flowing content needs room reserved under it or the buttons sit on the fold */
  padding:14vh var(--pad) clamp(9.5rem,21vh,13rem);overflow:hidden}
.hero__media{position:absolute;inset:0;z-index:-1;overflow:hidden}
.hero__media img,.hero__media video{width:100%;height:100%;object-fit:cover;object-position:60% 45%;
  opacity:.94;filter:saturate(1.08)}
.hero__media::after{content:"";position:absolute;inset:0;
  background:
    linear-gradient(90deg,rgba(4,24,34,.82) 0%,rgba(4,24,34,.52) 45%,transparent 78%),
    linear-gradient(180deg,rgba(4,24,34,.58) 0%,transparent 28%,rgba(7,42,56,.78) 100%)}
/* hero kicker sits on bright, busy video — make it high-contrast */
#hero .kicker{color:var(--sand);text-shadow:0 2px 20px rgba(4,18,28,.95),0 0 3px rgba(4,18,28,.6)}
#hero .kicker::before{background:var(--cyan);opacity:1}
.hero__inner{max-width:960px;position:relative}
.hero__title{font-family:var(--mincho);font-weight:600;color:var(--sand);
  font-size:clamp(1.72rem,5.2vw,4.8rem);line-height:1.32;letter-spacing:.015em;
  margin:1.2rem 0 2rem;text-shadow:0 6px 40px rgba(3,15,30,.85),0 2px 12px rgba(3,15,30,.7)}
.hero__lead{max-width:34em;font-family:var(--mincho);font-weight:500;color:var(--sand);
  font-size:clamp(.88rem,1.45vw,1.18rem);line-height:1.95;letter-spacing:.04em;
  padding-left:clamp(.85rem,1.6vw,1.25rem);border-left:2px solid var(--cyan);
  text-shadow:0 2px 20px rgba(3,15,30,1),0 1px 6px rgba(3,15,30,.98),0 0 32px rgba(3,15,30,.9)}
.hero__actions{display:flex;flex-wrap:wrap;gap:1rem;margin-top:2.6rem}
.hero__scroll{position:absolute;left:50%;transform:translateX(-50%);bottom:2.2rem;display:flex;flex-direction:column;align-items:center;gap:.5rem;color:var(--ink-dim);font:500 9px/1 var(--label);letter-spacing:.3em;text-shadow:0 1px 12px rgba(4,18,28,.7)}
.hero__scroll-jp{font-family:var(--sans);letter-spacing:.3em;font-size:9px}
.hero__scroll i{width:1px;height:46px;background:linear-gradient(var(--cyan),transparent);position:relative;overflow:hidden}
.hero__scroll i::after{content:"";position:absolute;top:0;left:0;width:100%;height:40%;background:var(--cyan);animation:scrolldrop 2.4s var(--e-sink) infinite}
@keyframes scrolldrop{0%{transform:translateY(-100%)}60%,100%{transform:translateY(260%)}}
.hero__meta{position:absolute;right:var(--pad);bottom:2.4rem;display:flex;flex-direction:column;align-items:flex-end;gap:.4rem;text-align:right;font:400 10px/1.6 var(--label);letter-spacing:.18em;color:var(--ink-faint)}

/* ================================================================
   INTERLUDE (type as image)
   ================================================================ */

/* ================================================================
   CONTRAST
   ================================================================ */

/* ================================================================
   DESCENT
   ================================================================ */

/* ================================================================
   EXPERIENCE
   ================================================================ */

/* ================================================================
   MARQUEE
   ================================================================ */
@keyframes marquee{to{transform:translateX(-50%)}}

/* ================================================================
   GALLERY
   ================================================================ */
.gallery{padding:clamp(4rem,8vh,7rem) 0}
.gallery .wrap{margin-bottom:clamp(2rem,4vh,3.4rem)}
.gallery .h-md{max-width:none}
/* a reef that drifts past on its own — the track holds two copies of the set,
   so translating it by exactly half loops seamlessly */
.gallery__marquee{overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent);
          mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent)}
.gallery__track{display:flex;width:max-content;gap:clamp(.6rem,1.2vw,1.2rem);
  animation:reefDrift 45s linear infinite;will-change:transform}
/* No pause on hover. The drift is meant to read as current, not as a carousel
   waiting to be inspected — and the cursor rests over this band on the way down
   the page, so pausing made the reef stall for no reason the visitor asked for. */
@keyframes reefDrift{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
.gallery__item{position:relative;border-radius:2px;flex:none;margin:0;overflow:hidden;
  width:clamp(230px,25vw,390px);height:clamp(300px,42vw,520px)}
.gallery__item img,.gallery__item video{width:100%;height:100%;object-fit:cover;transition:transform 1.2s var(--e-drift),filter 1.2s ease}
.gallery__item:hover img,.gallery__item:hover video{transform:scale(1.06);filter:saturate(1.15)}
.gallery__item figcaption{position:absolute;left:1rem;bottom:1rem;font:400 .72rem/1.3 var(--label);letter-spacing:.08em;color:var(--sand);opacity:0;transform:translateY(8px);transition:.5s var(--e-drift);text-shadow:0 2px 12px rgba(0,0,0,.6)}
.gallery__item:hover figcaption{opacity:1;transform:none}
/* desktop: explicit tiling so the 4×2 mosaic fills with no dead column */
@media (min-width:1025px){
}

/* ================================================================
   OFFERS
   ================================================================ */
.offers{padding:clamp(4.5rem,9vh,8rem) 0}
.offers .h-lg{max-width:none;margin-bottom:1.8rem}
.offers__lead{max-width:32em;color:var(--ink-dim);font-family:var(--mincho);line-height:2.05;margin-bottom:7vh}
.offers__grid{display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(1rem,2vw,1.6rem);max-width:var(--maxw);margin:0 auto;padding:0 var(--pad)}
.offer{
  position:relative;padding:clamp(1.8rem,3vw,2.8rem);
  background:linear-gradient(165deg,rgba(8,63,92,.5),rgba(3,13,26,.66));
  border:1px solid rgba(191,227,224,.22);border-radius:6px;overflow:hidden;
  box-shadow:0 26px 60px -34px rgba(2,8,17,.92);
  transition:transform .7s var(--e-drift),border-color .5s,box-shadow .6s;
}
.offer::before{content:"";position:absolute;inset:0;background:radial-gradient(120% 80% at 100% 0%,rgba(69,199,196,.14),transparent 55%);opacity:0;transition:opacity .6s}
.offer:hover{transform:translateY(-8px);border-color:rgba(69,199,196,.45);box-shadow:0 34px 70px -30px rgba(2,8,17,.95)}
.offer:hover::before{opacity:1}
.offer--feature{background:linear-gradient(165deg,rgba(229,182,103,.16),rgba(3,13,26,.7));border-color:rgba(229,182,103,.42);
  box-shadow:0 26px 70px -30px rgba(229,182,103,.26),0 22px 56px -34px rgba(2,8,17,.9)}
.offer--feature:hover{border-color:rgba(229,182,103,.65);box-shadow:0 34px 80px -26px rgba(229,182,103,.34),0 22px 56px -34px rgba(2,8,17,.9)}
.offer__idx{font-family:var(--marc);font-size:.9rem;letter-spacing:.2em;color:var(--cyan);margin-bottom:1.4rem}
.offer--feature .offer__idx{color:var(--gold)}
.offer__ribbon{position:absolute;top:1.6rem;right:1.6rem;font:500 .66rem/1 var(--label);letter-spacing:.2em;color:var(--gold);border:1px solid rgba(229,182,103,.5);border-radius:100px;padding:.4rem .8rem}
.offer__name{font-family:var(--mincho);font-weight:600;font-size:clamp(1.35rem,2.4vw,1.9rem);color:var(--sand);letter-spacing:.03em}
.offer__tag{font-family:var(--label);font-size:.74rem;letter-spacing:.16em;color:var(--cyan);margin:.5rem 0 1.4rem;text-transform:uppercase}
.offer__hook{font-family:var(--mincho);color:var(--ink-dim);line-height:1.95;margin-bottom:1.8rem}
.offer__inc{margin-bottom:2rem}
.offer__inc li{position:relative;padding:.5rem 0 .5rem 1.4rem;font-size:.86rem;color:var(--ink-dim);border-top:1px solid rgba(191,227,224,.08)}
.offer__inc li::before{content:"";position:absolute;left:0;top:1.05rem;width:6px;height:6px;border:1px solid var(--cyan);border-radius:50%}
.offer__foot{display:flex;align-items:flex-end;justify-content:space-between;flex-wrap:wrap;gap:.5rem 1rem;padding-top:1.4rem;border-top:1px solid var(--line)}
.offer__dur{font-size:.78rem;color:var(--ink-faint);letter-spacing:.06em;white-space:nowrap}
.offer__price{font-family:var(--label);font-weight:500;font-size:1.5rem;color:var(--sand);white-space:nowrap}
.offer__price em{font-style:normal;font-size:.72rem;color:var(--ink-faint);margin-left:.2rem;white-space:nowrap}

/* ================================================================
   COURSES — the PADI ladder, as a set of doors that open
   ================================================================ */
.courses{padding:clamp(3rem,6vh,5rem) 0 0}
.courses .h-md{max-width:none;margin-bottom:1.6rem}
.courses__lead{max-width:50ch;color:var(--ink-dim);font-family:var(--mincho);line-height:2.05;margin-bottom:7vh}
.courses__list{max-width:var(--maxw);margin:0 auto 3.4rem;padding:0 var(--pad)}
/* THE LADDER — the certification path drawn the way a dive computer draws a dive.
   Reference: the Subsurface / Shearwater profile view — a filled descent curve, a
   depth scale down the side, the depth called out where it changes. The levels
   ARE depths here (18 / 30 / 40m), so the chart states a fact rather than
   decorating one, and it rhymes with the depth meter already on screen. */
.ladder{position:relative;margin:clamp(3.4rem,6vw,5.5rem) 0 0;padding:0 0 0 3.2rem;
  height:clamp(250px,27vw,340px)}
/* absolute children resolve against the padding box, so inset:0 already starts
   at the content edge — the left gutter is the axis's alone */
.ladder__graph{position:absolute;inset:0;width:100%;height:100%}
.ladder__vgraph{display:none}
.ladder__area{fill:url(#ladderFill)}
.ladder__line{fill:none;stroke:rgba(83,212,205,.72);stroke-width:1.6;
  stroke-linejoin:round;stroke-linecap:round}
.ladder__grid{stroke:rgba(210,240,235,.09);stroke-width:1}

/* depth scale — the graph's own axis, tucked in the left gutter */
.ladder__axis{position:absolute;left:-3.2rem;top:var(--y);transform:translateY(-50%);
  font:500 .58rem/1 var(--label);letter-spacing:.14em;color:var(--ink-faint);opacity:.7}

.ladder__steps{list-style:none;margin:0;padding:0;position:absolute;inset:0}
.ladder__steps li{position:absolute;left:var(--x);top:var(--y);width:0}
.ladder__dot{position:absolute;left:-4.5px;top:-4.5px;width:9px;height:9px;border-radius:50%;
  background:var(--sand);opacity:.8}
/* the label hangs above its own point on the curve */
.ladder__label{position:absolute;left:0;bottom:1.15rem;transform:translateX(-50%);
  width:max-content;max-width:min(13rem,21vw);text-align:center}
.ladder__lv{display:block;font:500 .6rem/1 var(--label);letter-spacing:.2em;
  color:var(--ink-faint);margin-bottom:.5rem}
.ladder b{display:block;font-family:var(--mincho);font-weight:600;letter-spacing:.03em;
  font-size:clamp(.92rem,1.4vw,1.1rem);line-height:1.4;color:var(--ink-dim)}
.ladder em{display:block;font:400 .72rem/1.55 var(--sans);font-style:normal;
  color:var(--ink-faint);margin-top:.4rem}
/* the step this page puts you on */
.ladder .is-here .ladder__dot{background:var(--cyan);opacity:1;
  box-shadow:0 0 0 4px rgba(83,212,205,.18),0 0 20px rgba(83,212,205,.6)}
.ladder .is-here .ladder__lv{color:var(--cyan)}
.ladder .is-here b{color:var(--sand)}

@media (max-width:900px){
  /* the same dive, rotated 90°: on a phone the scroll direction IS the descent,
     so the profile runs down the page. Depth becomes the x-axis; the labels sit
     to the right of their own plateau, level with the dot. */
  .ladder{height:clamp(340px,104vw,440px);padding:0;margin-top:clamp(3.6rem,10vw,5rem)}
  .ladder__graph{display:none}
  .ladder__vgraph{display:block;position:absolute;inset:0;width:100%;height:100%}
  /* depth read horizontally is nonsense on a phone — the per-level copy
     (18mまで / 30mまで) already carries the numbers, so the axis goes */
  .ladder__axis{display:none}
  .ladder__steps li{left:var(--mx);top:var(--my)}
  .ladder__label{left:.95rem;bottom:auto;top:50%;transform:translateY(-50%);
    text-align:left;max-width:52vw}
}

/* the band that opens the certification part of the list */
.courses__band{padding:clamp(3rem,5vw,4.6rem) 0 clamp(1.4rem,2vw,2rem);border-top:1px solid var(--line)}
/* a group that is one line of text long does not need a full band's air */
.courses__band--tight{padding:clamp(2.2rem,3.6vw,3.2rem) 0 0}
.courses__band--tight .kicker{margin-bottom:0}
.courses__band--tight + .tier__note{margin-top:clamp(1rem,1.6vw,1.3rem)}
.courses__band .kicker{margin-bottom:1.1rem}
/* a band's lead is one short line about the group — it does not need the reading
   measure body copy does, and 50ch broke it onto two lines */
.courses__band .courses__lead{margin-bottom:0;max-width:none}
.course__cols--one{grid-template-columns:1fr;max-width:60ch}

/* Quick facts + the ✓/✗ pair that every tour product page uses: what the price
   covers, and — stated first-hand rather than left to be discovered — what it
   does not. Both live inside the course card so the price never sits alone. */
/* the four conditions read as a spec table: ruled box, one cell each */
@media (max-width:720px){
}
   /* the facts table already closes with a rule */

/* --- price simulator ---------------------------------------------------
   Two columns on desktop: the things you change on the left, the number they
   add up to pinned on the right. Every booking site converged on this shape
   for the same reason — a total that scrolls away while you are configuring
   makes you guess, and guessing is what the simulator exists to stop. */
/* Spacing scale. Measured before this existed: 0, 7, 11, 13, 21, 22, 30, 37px
   between neighbouring things — every gap decided on its own, and a <legend>
   left touching its control because the reset had stripped its margin and
   nothing replaced it. Four steps, used everywhere, so the next addition
   inherits the rhythm instead of inventing another number. */
.sim{
  --sim-label: .625rem;   /* a label to the control it names */
  --sim-block: 1.75rem;   /* one control block to the next */
  --sim-group: 2.5rem;    /* the controls to the next group of content */
  --sim-row:   .75rem;    /* rows inside the summary card */

  margin-top:clamp(2.4rem,4.5vw,3.2rem);display:grid;
  column-gap:clamp(1.8rem,3.5vw,3rem);
  row-gap:1.2rem;
  grid-template-columns:minmax(0,1fr) minmax(300px,25rem);
  grid-template-rows:auto auto;
  align-items:start}

.sim__choices{grid-column:1;grid-row:1;display:grid;gap:var(--sim-block);min-width:0}
.sim__field{display:grid;gap:var(--sim-label)}
/* fieldset children do not inherit the parent grid, so the legend needs the
   gap applied directly — this is the one that was sitting at 0. */
.sim__seggroup .sim__legend{display:block;margin-bottom:var(--sim-label)}
.sim__legend{font:500 .66rem/1 var(--label);letter-spacing:.16em;color:var(--ink-faint)}
/* Segmented control for the headcount.
   Apple HIG names the bug this replaces: "it doesn't look good if content fills
   some segments but not others" — the discount label was sizing each segment,
   so "1" collapsed to a narrow egg beside three wide pills. Fixed by making the
   grid decide the width (Carbon: match every tab to the widest) and by giving
   every segment both lines, with the base option saying what it is instead of
   sitting empty.

   Selected state is a FILL, not a border. On a dark surface a border-only
   indicator reduces "selected" to a hue shift on a 1px line — nearly no area,
   and it has to clear WCAG 1.4.11's 3:1 on a stroke that anti-aliasing eats.
   Fill + brighter label + heavier weight gives three redundant cues. */
.sim__seggroup{border:0;padding:0;margin:0;min-width:0}
/* Columns follow the number of options, not a hardcoded 4. The people row has
   four and the rooms row three; a fixed repeat(4) left the rooms row with an
   empty fourth column, so "3" read as twice the width of "1". Carbon's
   equal-width rule only holds if the track count matches the child count. */
.seg__row{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);
  border:1px solid rgba(210, 240, 235, .18);border-radius:8px;overflow:hidden}
.seg{position:relative;display:grid;align-content:center;justify-items:center;gap:.15rem;
  min-height:54px;padding:.55rem .35rem;cursor:pointer;text-align:center;
  background-color:transparent;
  transition:background-color .25s ease,color .25s ease,box-shadow .25s ease}
.seg + .seg{border-left:1px solid rgba(210, 240, 235, .15)}
.seg input{position:absolute;opacity:0;width:1px;height:1px;margin:0;pointer-events:none}
.seg__n{font:500 .95rem/1.1 var(--label);letter-spacing:.04em;color:var(--ink-dim);
  font-variant-numeric:tabular-nums;transition:color .2s}
.seg__sub{font-family:var(--label);font-size:.62rem;letter-spacing:.05em;color:var(--ink-faint);
  line-height:1.2;transition:color .2s}
.seg:hover{background-color:rgba(83, 212, 205, .08)}
.seg:hover .seg__n{color:var(--sand)}
.seg.is-on{background-color:rgba(229, 182, 103, .18);
  box-shadow:inset 0 0 14px rgba(234, 191, 116, .18)}
.seg.is-on .seg__n{color:var(--gold);font-weight:600}
.seg.is-on .seg__sub{color:var(--gold);opacity:.95}
/* A count the party physically cannot use. Booking and Expedia both grey out at
   the bound rather than removing the option, so the row keeps its shape and the
   limit is legible instead of mysterious. Until this existed the disabled "1室"
   was pixel-identical to the selectable "3室" — the control claimed a choice it
   would not honour. */
.seg.is-off{opacity:.32;cursor:not-allowed}
.seg.is-off:hover{background:none}
.seg.is-off:hover .seg__n{color:var(--ink-dim)}
/* Keyboard focus has to be visible even though the input itself is hidden. */
.seg:focus-within{outline:2px solid var(--cyan);outline-offset:-2px}

.sim__chips{display:flex;flex-wrap:wrap;gap:.5rem}
.sim__chip{appearance:none;background:none;cursor:pointer;
  border:1px solid var(--line);border-radius:100px;padding:.5rem 1.05rem;
  font:500 .8rem/1.35 var(--label);letter-spacing:.05em;color:var(--ink-dim);
  display:flex;flex-direction:column;align-items:center;gap:.12rem;
  transition:border-color .35s,color .35s,background .35s}
.sim__chip i{font-style:normal;font-size:.6rem;letter-spacing:.06em;color:var(--ink-faint)}
.sim__chip:hover{border-color:var(--cyan);color:var(--sand)}
.sim__chip.is-on{border-color:var(--gold);color:var(--gold);background:rgba(229,182,103,.09)}
.sim__chip.is-on i{color:var(--gold);opacity:.8}
.sim__chip.is-off{opacity:.3;cursor:not-allowed;border-style:dashed}
.sim__chip.is-off:hover{border-color:var(--line);color:var(--ink-dim)}

/* Rooms get the photograph. Choosing where you sleep from three words is a
   worse decision than choosing it from three pictures, and the pictures were
   already in the repo. */
/* The room you chose, shown large. 16:9 rather than the near-square the image
   defaults to: a configurator preview is wide so the choices stay above the
   fold beneath it, and this one was pushing the swatches off screen. */
/* 21:9 and capped. At 16:9 across the full column the room photo dominated a
   section whose subject is a price — it is the evidence for a choice, not the
   hero. The swatches below carry name, capacity and rate, so the preview only
   has to confirm which room is selected. */
.sim__preview{margin:0 0 var(--sim-label);position:relative;border-radius:4px;overflow:hidden;
  border:1px solid var(--line);max-height:220px}
.sim__previewart{display:block;width:100%;aspect-ratio:21/9;object-fit:cover}
.sim__previewcap{position:absolute;left:0;right:0;bottom:0;display:flex;flex-wrap:wrap;
  align-items:baseline;gap:.2rem .7rem;padding:1.2rem .8rem .6rem;
  background:linear-gradient(to top,rgba(3,20,30,.86),rgba(3,20,30,0))}
.sim__previewname{font:500 .88rem/1.25 var(--label);letter-spacing:.04em;color:var(--sand)}
.sim__previewmeta{font-family:var(--label);font-size:.68rem;letter-spacing:.08em;color:var(--ink-faint)}
.sim__previewrate{margin-left:auto;font-family:var(--label);font-size:.78rem;
  letter-spacing:.03em;color:var(--sand)}

/* Swatches: small, because the preview is doing the showing. */
.sim__rooms{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.6rem}
.sim__room{appearance:none;background:none;cursor:pointer;text-align:left;padding:0;
  border:1px solid var(--line);border-radius:4px;overflow:hidden;
  display:grid;gap:.1rem;transition:border-color .35s,background .35s}
.sim__room:hover{border-color:var(--cyan)}
.sim__room.is-on{border-color:var(--gold);background:rgba(229,182,103,.07)}
.sim__roomart{width:100%;height:clamp(52px,6vw,68px);object-fit:cover;display:block;
  filter:saturate(.85) brightness(.9);transition:filter .5s}
.sim__room.is-on .sim__roomart{filter:none}
.sim__roomname{font:500 .74rem/1.3 var(--label);letter-spacing:.03em;color:var(--sand);
  padding:.45rem .6rem 0}
.sim__roommeta{font-family:var(--label);font-size:.6rem;letter-spacing:.06em;
  color:var(--ink-faint);padding:0 .6rem}
.sim__roomdelta{font-family:var(--label);font-size:.66rem;letter-spacing:.03em;
  color:var(--ink-dim);padding:.1rem .6rem .55rem}
.sim__room.is-on .sim__roomdelta{color:var(--sand)}

.sim__warn{font-family:var(--label);font-size:.74rem;letter-spacing:.04em;color:var(--gold)}

/* The summary sticks while the choices scroll past it. */
.sim__summary{position:sticky;top:clamp(5rem,9vh,7rem);grid-column:2;grid-row:1 / span 2}
.sim__card{border:1px solid rgba(229,182,103,.24);border-radius:4px;
  padding:clamp(1.4rem,2.4vw,1.8rem);background:rgba(3,18,28,.68);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  box-shadow:0 20px 48px -12px rgba(0,0,0,.6)}
.sim__label{display:block;font:500 .7rem/1 var(--label);letter-spacing:.16em;
  text-transform:uppercase;color:var(--ink-faint);margin-bottom:var(--sim-row)}
/* The one figure on this card that has to be read, not admired.
   It was set in Marcellus at weight 500. Marcellus ships 400 and nothing else,
   so the browser was manufacturing the 500 — the same outline mechanically
   fattened, measured at 257.6px against the real 400's 250.3px, identical to
   what it produces for 700. Fake weight thickens strokes evenly and blunts the
   joins, which is what made the digits look swollen.
   Marcellus is also an inscriptional Roman face: its numerals are wide and
   circular, drawn to be carved rather than scanned. And it was the only price
   on the page not set in --label — the room rates, the breakdown and the
   per-person line all use it already. tabular-nums so the total does not
   reflow its own digits every time a choice changes it. */
.sim__total{display:block;font-family:var(--label);font-weight:500;
  font-variant-numeric:tabular-nums;
  font-size:clamp(1.8rem,2.5vw,2.3rem);line-height:1.05;color:var(--gold);letter-spacing:.02em}
/* A brief lift on change, so a click reads as cause and effect. */
@keyframes simBump{0%{transform:translateY(.18em);opacity:.35}100%{transform:none;opacity:1}}
.sim__total.is-changed{animation:simBump .42s var(--e-drift)}
@media (prefers-reduced-motion:reduce){.sim__total.is-changed{animation:none}}
.sim__per[hidden]{display:none}
.sim__per{display:block;margin-top:.45rem;font-family:var(--label);font-size:.82rem;
  letter-spacing:.04em;color:var(--sand);opacity:.9}

/* The saving, stated in money next to the total — the discount on the chips
   says the rate is lower, this says what that came to. */
/* [hidden] loses to an explicit display value, so a solo booking rendered an
   empty coloured pill. */
.sim__saved[hidden]{display:none}
.sim__saved{display:inline-block;margin-top:.5rem;padding:.2rem .6rem;border-radius:2px;
  background:rgba(83,212,205,.08);border:1px solid rgba(83,212,205,.35);color:var(--cyan);
  font-family:var(--label);font-size:.68rem;letter-spacing:.06em;white-space:nowrap}
.sim__lines{display:none;list-style:none;margin-top:var(--sim-block);padding-top:var(--sim-row);border-top:1px solid var(--line)}
.sim__lines li{display:grid;grid-template-columns:1fr auto;gap:.1rem .8rem;align-items:baseline;
  padding:.5rem 0;font-family:var(--label);font-size:.74rem;letter-spacing:.02em;color:var(--ink-dim)}
.sim__lines i{grid-column:1;font-style:normal;font-size:.64rem;color:var(--ink-faint)}
.sim__lines b{grid-row:1;grid-column:2;font-weight:500;color:var(--sand);white-space:nowrap}

.sim__cta{width:100%;justify-content:center;margin-top:clamp(1.1rem,1.8vw,1.5rem);
  border-radius:3px;font-weight:600;letter-spacing:.1em;padding:.92rem 1.6rem;
  background:var(--gold);color:#071720;border:1px solid rgba(255,255,255,.2);
  box-shadow:0 8px 24px -6px rgba(229,182,103,.35);transition:all .35s cubic-bezier(.2,.8,.2,1)}
.sim__cta:hover{background:#edd099;box-shadow:0 12px 30px -4px rgba(229,182,103,.5);transform:translateY(-1px)}
.sim__ctashort,.sim__perbar{display:none}
.sim__perbar i{font-style:normal}
/* What is currently configured, in one line — the shape Booking.com puts in its
   occupancy trigger ("大人2名 · 子供0名 · 1部屋"). This is where the party-to-room
   spread is stated, now that the room segments no longer carry a second line. */
.sim__short{display:block;margin-top:.45rem;font-family:var(--label);font-size:.72rem;
  letter-spacing:.08em;color:var(--ink-faint)}

/* What the visitor is buying, listed without a price against each line. The
   completeness is the argument; the individual amounts are not the visitor's
   problem and putting them here would invite line-by-line haggling. */
/* Both lists side by side. An all-in claim needs its edge drawn — without the
   exclusions, "everything is included" gets disproved at the bar and takes the
   rest of the page's credibility with it. */
/* No margin here: .sim__choices already spaces its children with a grid gap,
   and adding one on top produced 68px where 28px was intended. */
.sim__whats{
  grid-column:1;
  grid-row:2;
  display:block;
  margin-top:.8rem;
  padding-top:1.1rem;
  border-top:1px solid var(--line);
}
.sim__excl{list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:.5rem 1.6rem}
@media (max-width:900px){
  .sim__excl{grid-template-columns:repeat(2, minmax(0, 1fr))}
}
@media (max-width:640px){
  .sim__whats{padding-top:1rem;margin-top:0}
  .sim__excl{grid-template-columns:1fr;gap:.4rem}
}
.sim__excl li{position:relative;padding-left:1.1rem;font-family:var(--label);
  font-size:.73rem;line-height:1.55;letter-spacing:.02em;color:var(--ink-faint)}
.sim__excl li::before{content:"•";position:absolute;left:0;top:-.05rem;color:var(--cyan);
  font-size:.9rem;opacity:.8}
.sim__excl .sim__incltitle{grid-column:1/-1;padding-left:0!important;margin-bottom:.45rem;
  font-size:.72rem!important;letter-spacing:.12em!important;color:var(--sand)!important;font-weight:500;
  display:flex;align-items:center;gap:.4rem}
.sim__excl .sim__incltitle::before{content:""!important}
.sim__note{margin-top:var(--sim-row);font-family:var(--mincho);font-size:.74rem;line-height:1.85;
  color:var(--ink-faint)}

@media (max-width:900px){
  .sim{grid-template-columns:1fr;grid-template-rows:auto;gap:1.4rem}
  .sim__choices{grid-column:auto;grid-row:auto}
  .sim__whats{
    grid-column:auto;
    grid-row:auto;
    margin-top:0;
    padding-top:1.2rem;
  }
  .sim__summary{
    grid-column:auto;
    grid-row:auto;
    position:static;
    top:auto;
    bottom:auto;
    z-index:1;
    margin:0;
    padding:0;
    background:none;
    pointer-events:auto;
  }
  .sim__card{
    background:rgba(3,18,28,.78);
    border:1px solid rgba(229,182,103,.24);
    border-radius:4px;
    box-shadow:0 16px 40px -10px rgba(0,0,0,.5);
    padding:1.15rem 1.25rem 1.1rem;
    display:grid;
    grid-template-columns:1fr auto;
    gap:.25rem .8rem;
    align-items:baseline;
  }
  .sim__label{
    grid-column:1;
    display:block;
    font:500 .68rem/1 var(--label);
    letter-spacing:.16em;
    text-transform:uppercase;
    color:var(--ink-faint);
    margin:0;
  }
  .sim__total{
    grid-column:1;
    font-size:1.85rem;
    line-height:1.05;
    letter-spacing:.02em;
    color:var(--gold);
  }
  .sim__per{display:none}
  .sim__short{display:none}
  .sim__perbar{
    grid-column:2;
    grid-row:1;
    justify-self:end;
    display:flex;
    align-items:center;
    gap:.35rem;
    font-family:var(--label);
    font-size:.74rem;
    letter-spacing:.06em;
    color:var(--sand);
    opacity:.85;
  }
  .sim__perbar i{display:none}
  .sim__saved[hidden]{display:none}
  .sim__saved{
    grid-column:2;
    grid-row:2;
    justify-self:end;
    display:inline-block;
    margin:0;
    padding:.18rem .55rem;
    border-radius:2px;
    background:rgba(83,212,205,.08);
    border:1px solid rgba(83,212,205,.35);
    color:var(--cyan);
    font-family:var(--label);
    font-size:.66rem;
    letter-spacing:.05em;
    white-space:nowrap;
  }
  .sim__lines{display:none}
  .sim__cta{
    grid-column:1/-1;
    width:100%;
    margin-top:.6rem;
    display:flex;
    justify-content:center;
    align-items:center;
    padding:.88rem 1.4rem;
    font-size:.88rem;
    font-weight:600;
    letter-spacing:.12em;
    border-radius:3px;
    background:var(--gold);
    border:1px solid rgba(255,255,255,.2);
    box-shadow:0 8px 24px -6px rgba(229,182,103,.35);
    color:#071720;
    transition:all .35s cubic-bezier(.2,.8,.2,1);
  }
  .sim__cta:hover{background:#edd099;box-shadow:0 12px 30px -4px rgba(229,182,103,.5);transform:translateY(-1px)}
  .sim__note{
    grid-column:1/-1;
    display:block;
    margin-top:.45rem;
    font-family:var(--sans);
    font-size:.72rem;
    line-height:1.6;
    color:var(--ink-faint);
    text-align:center;
  }
  .sim__ctalong{display:inline}
  .sim__ctashort{display:none}
}
@media (max-width:380px){
  .sim__card{padding:1rem .95rem}
  .sim__total{font-size:1.65rem}
  .sim__cta{padding:.8rem 1.2rem;font-size:.84rem}
}
@media (max-width:560px){
  .sim__rooms{grid-template-columns:1fr;gap:.5rem}
  .sim__room{grid-template-columns:88px 1fr;grid-template-rows:auto auto auto;align-items:center}
  .sim__roomart{grid-row:1/4;height:100%;min-height:70px}
  .sim__roomname{padding:.55rem .7rem 0 .1rem}
  .sim__roommeta,.sim__roomdelta{padding-left:.1rem}
}
}
/* the single-occupancy line is a price, so it lives with the price */
.course__price-alt{color:var(--gold);opacity:.85;margin-top:.25rem}
@media (max-width:820px){
}



/* One rule per group, drawn by the band that opens it. The rows inside a group
   do not repeat it — a rule under the boxed LEVEL 1 card, another under the band
   heading and another under the first row read as three fences in a row. */
.course{border-top:1px solid var(--line)}
.courses__band + .course{border-top:none}
.course--lead + .courses__band{border-top:none}
/* priced rows disclose a panel; named-only rows do not, so their head is 2 cols */
.course--plain .course__head{grid-template-columns:auto 1fr}
.course__head{
  display:grid;grid-template-columns:auto 1fr auto auto;align-items:center;
  gap:clamp(1rem,3vw,2.6rem);padding:clamp(1.5rem,2.6vw,2.2rem) 0;
  list-style:none;cursor:pointer;transition:color .5s var(--e-drift);
}
.course__head::-webkit-details-marker{display:none}
.course__head--static{cursor:default;grid-template-columns:auto 1fr}
/* min-width keeps the names column starting at the same x on every card, so
   "はじめての人へ" on LEVEL 1 does not shove its title out of line with LEVEL 2's */
.course__step{font:500 .68rem/1 var(--label);letter-spacing:.24em;color:var(--cyan);
  white-space:nowrap;min-width:clamp(4.5rem,8vw,8.5rem)}
.course--spec .course__step{color:var(--gold)}
.course__names{display:flex;flex-direction:column;gap:.42rem;min-width:0}
.course__jp{font-family:var(--mincho);font-weight:600;font-size:clamp(1.12rem,2.1vw,1.62rem);
  color:var(--sand);letter-spacing:.04em;line-height:1.35;transition:color .5s var(--e-drift)}
/* the line under each name sells the level — not a translation of it */
.course__why{font:400 .82rem/1.5 var(--sans);font-style:normal;letter-spacing:.03em;color:var(--ink-dim)}
.course__price{font-family:var(--label);font-weight:500;font-size:clamp(1.05rem,1.7vw,1.35rem);
  color:var(--sand);white-space:nowrap;text-align:right;line-height:1.2}
.course__price i{display:block;font-style:normal;font-size:.7rem;color:var(--ink-faint);margin-top:.4rem;letter-spacing:.04em;font-family:var(--sans)}
/* plus → minus */
.course__mark{position:relative;width:15px;height:15px;flex:none}
.course__mark::before,.course__mark::after{
  content:"";position:absolute;left:0;top:7px;width:15px;height:1px;background:var(--cyan);
  transition:transform .55s var(--e-drift),opacity .4s
}
.course__mark::after{transform:rotate(90deg)}
.course[open] .course__mark::after{transform:rotate(0);opacity:0}
.course__head:hover .course__jp{color:var(--glare)}
.course__head:hover .course__mark::before,.course__head:hover .course__mark::after{background:var(--glare)}

/* Course facts as a spec sheet: label and value, always the same four rows, so
   two courses can be compared by running your eye down the same lines. Prose
   lists made the reader parse sentences to find the one number they wanted. */
/* One row per card. Two fixed columns left three specs as 2 + 1, with a hole
   beside the last one; auto-flow fits however many there are onto one line. */
.spec{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:0 clamp(1.6rem,4vw,4rem);
  margin-bottom:clamp(1.8rem,3vw,2.4rem)}
.spec__row{display:grid;grid-template-columns:4.6rem 1fr;gap:1rem;align-items:baseline;
  padding:.9rem 0;border-top:1px solid rgba(191,227,224,.12)}
.spec dt{font:500 .66rem/1.9 var(--label);letter-spacing:.18em;color:var(--ink-faint)}
.spec dd{margin:0;font-size:1rem;color:var(--sand);letter-spacing:.03em}
.course__note{margin-top:1.2rem;font-size:.8rem;line-height:1.85;color:var(--ink-faint)}

/* Levels past Advanced: named so the ladder is visible, but with no price and no
   spec sheet. Almost nobody books a Divemaster off a landing page — the detail
   only pushed LEVEL 1, the course this page exists to sell, further down. */
.tier__list{list-style:none;margin:0;padding:0;display:grid;gap:1.05rem}
.tier__list li{display:grid;grid-template-columns:clamp(4.5rem,8vw,8.5rem) minmax(0,17rem) 1fr;
  gap:.25rem 1.4rem;align-items:baseline}
/* same column and colour as .course__step, so a level reads the same anywhere */
.tier__lv{font:500 .68rem/1 var(--label);letter-spacing:.24em;color:var(--cyan);white-space:nowrap}
.tier__list b{font-family:var(--mincho);font-weight:600;font-size:1.02rem;
  color:var(--ink-dim);letter-spacing:.04em}
.tier__list em{font:400 .8rem/1.5 var(--sans);font-style:normal;color:var(--ink-faint)}
.tier__note{margin-top:1.9rem;font-size:.85rem;line-height:1.9;color:var(--ink-faint)}
.tier__link{color:var(--cyan);text-decoration:none;padding-bottom:.12em;
  border-bottom:1px solid rgba(83,212,205,.4);transition:color .4s var(--e-drift),border-color .4s var(--e-drift)}
.tier__link:hover{color:var(--glare);border-bottom-color:rgba(210,240,235,.6)}
@media (max-width:720px){
  .spec{grid-template-columns:1fr;gap:0}
  .spec__row{grid-template-columns:4.2rem 1fr;padding:.8rem 0}
}

/* open rows become a solid panel — body copy over the live caustics is unreadable */
.course[open]{
  border-top-color:transparent;border-radius:6px;
  padding:0 clamp(1.5rem,2.6vw,2.6rem);
  background:linear-gradient(180deg,rgba(5,34,47,.9),rgba(3,24,35,.94));
  box-shadow:0 30px 70px -40px rgba(2,8,17,.92);
}
.course[open] + .course{border-top-color:transparent}
/* clipped so a closing <details> wipes cleanly — the always-open panel never
   animates, and clipping it cut the "いちばん多い形" tag off at the card edge */
.course__panel{overflow:hidden}
.course__panel--static{overflow:visible}
.course__inner{padding:0 0 clamp(2rem,3.4vw,3rem);max-width:none}
.course__hook{font-family:var(--mincho);color:var(--ink-dim);line-height:2.05;max-width:34em;margin-bottom:2.4rem}
.course__cols{display:grid;grid-template-columns:1fr 1fr;gap:clamp(1.6rem,3.4vw,3.4rem)}
.course__ttl{font:500 .7rem/1 var(--label);letter-spacing:.22em;color:var(--cyan);margin-bottom:1rem}
.course--spec .course__ttl{color:var(--gold)}
.course__ul li{position:relative;padding:.62rem 0 .62rem 1.5rem;font-size:.86rem;line-height:1.9;
  color:var(--ink-dim);border-top:1px solid rgba(191,227,224,.08)}
.course__ul li::before{content:"";position:absolute;left:0;top:1.18rem;width:6px;height:6px;
  border:1px solid var(--cyan);border-radius:50%}
.course--spec .course__ul li::before{border-color:var(--gold)}
/* numbered steps: no rules between them — the hairlines used to run straight
   through the 01/02/03 markers. Spacing separates them instead, and the marker
   line-box matches the first text line so it sits on the same baseline. */
.course__ul--num{counter-reset:cstep}
.course__ul--num li{border-top:none;padding:0 0 0 2.3rem;margin-top:1.15rem}
.course__ul--num li:first-child{margin-top:0}
.course__ul--num li::before{content:counter(cstep,decimal-leading-zero);counter-increment:cstep;
  border:none;border-radius:0;width:auto;height:auto;top:0;left:0;
  font:500 .66rem/1.634rem var(--label);letter-spacing:.06em;color:var(--ink-faint)}
.course__meta{margin-top:1.8rem;padding-top:1.2rem;border-top:1px solid var(--line);
  font-size:.76rem;line-height:1.9;color:var(--ink-faint);letter-spacing:.05em}

/* the first door is already open */
.course--lead{
  border:1px solid rgba(229,182,103,.42);border-radius:6px;
  background:linear-gradient(165deg,rgba(229,182,103,.13),rgba(3,13,26,.66));
  padding:0 clamp(1.5rem,2.6vw,2.6rem);margin-bottom:1.4rem;
  box-shadow:0 26px 70px -34px rgba(229,182,103,.24),0 22px 56px -36px rgba(2,8,17,.9);
}
.course--lead .course__step{color:var(--gold)}
.course--lead .course__ttl{color:var(--gold)}
.course--lead .course__ul li::before{border-color:var(--gold)}
.course--lead .course__ul--num li::before{border:none}

/* LEVEL 2 gets the same card, a shade deeper — same family, still second in line.
   It also means the rule that would otherwise sit under it is unnecessary. */
.course--card{
  border:1px solid rgba(229,182,103,.3);border-radius:6px;
  background:linear-gradient(165deg,rgba(229,182,103,.09),rgba(3,13,26,.8));
  padding:0 clamp(1.5rem,2.6vw,2.6rem);margin-bottom:1.4rem;border-top-width:1px;
  box-shadow:0 26px 70px -34px rgba(229,182,103,.15),0 22px 56px -36px rgba(2,8,17,.9);
}
.course--card .course__step{color:var(--gold)}
.course--card + .courses__band{border-top:none}
@media (max-width:720px){.course--card{padding:0 1.6rem}}

/* ================================================================
   ACCESS
   ================================================================ */
.access{padding:clamp(4.5rem,9vh,8rem) 0}
.access__wrap{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2rem,5vw,6rem);align-items:start}
.access__text .h-md{max-width:none}
/* :not(.kicker) is the fix, not decoration. The kicker is also a <p>, so this
   rule was giving it a 2rem top margin and pushing the whole left column down
   32px — while the schedule beside it started at the container top. The two
   columns were aligned; only their contents were not. */
.access__text p:not(.kicker){margin-top:2rem;max-width:32em;color:var(--ink-dim);font-family:var(--mincho);line-height:2.1}

/* Lodging, laid out the way resort sites do it (SAVU South Alor / Solitude
   Acacia): the photograph is the product, so it takes the space, and each frame
   carries one short label instead of a paragraph. Kept as "an example" so a
   change of hotel never makes the page a lie. */
/* the rule is drawn inside the gutter, not across the whole .wrap, so it lines up
   with the course rules directly above it rather than overhanging them */
.stay{position:relative;padding-top:clamp(3rem,6vw,5rem);margin-top:clamp(3rem,6vw,5rem)}
.stay::before{content:"";position:absolute;top:0;left:var(--pad);right:var(--pad);
  height:1px;background:var(--line)}
.stay__ttl{font-family:var(--mincho);font-weight:600;font-size:clamp(1.5rem,3.2vw,2.5rem);
  color:var(--sand);letter-spacing:.04em;line-height:1.5;margin-bottom:.6rem}
.stay__lead{font-family:var(--mincho);font-size:clamp(.84rem,1.1vw,.92rem);
  color:var(--ink-faint);letter-spacing:.04em;line-height:1.8;margin-bottom:clamp(1.8rem,3.2vw,2.6rem)}
.stay__shots{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(.7rem,1.4vw,1.3rem)}
.stay__shots figure{margin:0;position:relative;overflow:hidden;border-radius:3px}
.stay__shots img{width:100%;height:clamp(260px,32vw,460px);object-fit:cover;
  transition:transform 1.4s var(--e-drift)}
.stay__shots figure:hover img{transform:scale(1.05)}
.stay__shots figcaption{position:absolute;left:1rem;bottom:.9rem;
  font:500 .72rem/1.3 var(--label);letter-spacing:.14em;color:var(--sand);
  text-shadow:0 2px 14px rgba(0,0,0,.75)}
.stay__note{margin-top:1.6rem;font-size:.86rem;line-height:1.9;color:var(--ink-faint)}
.stay__note b{font-weight:500;font-family:var(--label);font-size:1.05rem;color:var(--sand)}

/* The two days as one continuous descent: a single rail runs the whole way,
   each step is a node on it, and the two days are told apart by the node colour
   (cyan on day one, gold on day two) rather than by a break in the line —
   pattern per Eleken's timeline rules: 2–3 levels of hierarchy, consistent
   rhythm, phases separated by weight rather than by cutting the flow. */
/* rail offset and gutter share one source of truth, so the dots can never drift
   off the line when a breakpoint changes the padding */
.sched{position:relative;--rail:clamp(.45rem,1vw,.7rem);--gutter:clamp(2.2rem,4vw,3rem);
  padding-left:var(--gutter)}
.sched::before{
  content:"";position:absolute;left:var(--rail);top:.9rem;bottom:.9rem;width:1px;
  background:linear-gradient(180deg,
    rgba(83,212,205,.15) 0%, var(--cyan) 6%, var(--cyan) 50%,
    var(--gold) 54%, var(--gold) 94%, rgba(229,182,103,.15) 100%);
}
.sched__day{position:relative;padding:0;border:none}
.sched__day + .sched__day{margin-top:clamp(2.4rem,4vw,3.4rem)}
.sched__label{position:relative;font:500 .7rem/1 var(--label);letter-spacing:.24em;
  color:var(--cyan);margin-bottom:1.6rem}
.sched__day:last-child .sched__label{color:var(--gold)}
/* the day marker: a larger ringed node — centred on the rail's 1px column */
.sched__label::before{
  content:"";position:absolute;left:calc(var(--rail) - var(--gutter) - 5px);
  top:-2px;width:11px;height:11px;border-radius:50%;
  background:var(--abyss);border:2px solid var(--cyan);
  box-shadow:0 0 0 4px rgba(14,74,94,.55);
}
.sched__day:last-child .sched__label::before{border-color:var(--gold)}

/* Each row is now a single line — time, then the step. The old gap was sized to
   separate three-line rows that carried a description underneath; at one line
   it left the timeline stretched out with nothing in the gaps. */
.sched__list{display:grid;gap:clamp(1.1rem,1.7vw,1.4rem)}
/* 5rem gives comfortable room for ranges like "8:30〜14:00" */
.sched__list li{position:relative;display:grid;grid-template-columns:5rem 1fr;
  gap:1.2rem;align-items:baseline}
.sched__list li::before{
  content:"";position:absolute;left:calc(var(--rail) - var(--gutter) - 2.5px);
  top:.62rem;width:6px;height:6px;border-radius:50%;background:var(--cyan);
  box-shadow:0 0 0 3px rgba(14,74,94,.75);
}
.sched__day:last-child .sched__list li::before{background:var(--gold)}
/* the final step is the destination — a filled, ringed node */
.sched__day:last-child .sched__list li:last-child::before{
  width:10px;height:10px;left:calc(var(--rail) - var(--gutter) - 4.5px);
  top:.5rem;box-shadow:0 0 0 4px rgba(14,74,94,.75),0 0 16px 2px rgba(229,182,103,.55);
}
.sched__time{font:500 .72rem/1.9 var(--label);letter-spacing:.12em;color:var(--ink-faint);white-space:nowrap}
/* The clock time is the whole column now. It used to sit under a time-of-day
   label ("早朝" over "5:00頃"), which said the same thing twice and cost a line
   per row. The one row without a fixed hour — certification, on the Sunday
   evening — keeps 夕方 / Evening here instead of inventing a time for it. */
.sched__time i{display:block;font-style:normal;font-size:.72rem;letter-spacing:.06em;
  color:var(--cyan)}
/* wide enough for the longest value, "8:00–15:00", in either language */
html[data-lang="en"] .sched__list li{grid-template-columns:5.4rem 1fr}
/* the same sentence runs about 1.6x longer in English, so the measure that keeps
   Japanese at one line per sentence has to widen or every line doubles */
html[data-lang="en"] .access__text p,
html[data-lang="en"] .why__lead,
html[data-lang="en"] .offers__lead,
html[data-lang="en"] .gear__lead,
html[data-lang="en"] .trust__body p{max-width:56ch}
html[data-lang="en"] .hero__lead{max-width:52ch}
.sched b{display:block;font-weight:500;font-size:1.02rem;color:var(--sand);letter-spacing:.04em}

/* ================================================================
   WHY GET CERTIFIED — the difference between being pulled through
   the shallows and exploring three dimensions on your own.
   ================================================================ */
.why{padding:clamp(4.5rem,9vh,8rem) 0}
.why .h-lg{max-width:none;margin-bottom:1.6rem}
.why__lead{max-width:38em;color:var(--ink-dim);font-family:var(--mincho);line-height:2.05;margin-bottom:clamp(2.8rem,5vw,4.2rem)}
.why__compare{display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(2rem,5vw,4.5rem);align-items:start}
.why__card{position:relative;padding-top:clamp(1.4rem,2.4vw,2rem);display:flex;flex-direction:column}
.why__card--intro{border-top:1px solid var(--line)}
.why__card--cert{border-top:2px solid var(--gold)}
.why__badge{font:500 .68rem/1 var(--label);letter-spacing:.18em;color:var(--ink-faint);margin-bottom:.6rem;display:inline-block}
.why__badge--gold{color:var(--gold)}
.why__title{font-family:var(--mincho);font-weight:600;font-size:clamp(1.35rem,2.2vw,1.8rem);color:var(--sand);margin-bottom:.35rem;letter-spacing:.03em}
.why__sub{font-size:.84rem;color:var(--ink-faint);line-height:1.6;margin-bottom:1.4rem}
.why__points{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.why__points li{display:grid;grid-template-columns:5.2rem 1fr;gap:1rem;align-items:baseline;padding:.85rem 0;border-top:1px solid rgba(191,227,224,.1);font-size:.9rem;line-height:1.65}
.why__prop{font:500 .68rem/1 var(--label);letter-spacing:.14em;color:var(--ink-faint);text-transform:uppercase}
.why__points p{margin:0;color:var(--ink-dim)}
.why__card--cert .why__points p b{color:var(--sand);font-weight:500}
@media (max-width:820px){
  .why__compare{grid-template-columns:1fr;gap:2.8rem}
  .why__points li{grid-template-columns:4.6rem 1fr;gap:.75rem}
}

/* ================================================================
   GEAR — the argument is the asymmetry: a column of things we carry
   against the one thing you do. Nothing else needs to be said.
   ================================================================ */
.gear{padding:clamp(4.5rem,9vh,8rem) 0}
.gear .h-lg{max-width:none;margin-bottom:1.6rem}
.gear__lead{max-width:32em;color:var(--ink-dim);font-family:var(--mincho);line-height:2.05;margin-bottom:clamp(2.6rem,5vw,4rem)}
.gear__cols{display:grid;grid-template-columns:1.35fr 1fr;gap:clamp(2rem,5vw,5rem);align-items:start}
.gear__ttl{font:500 .7rem/1 var(--label);letter-spacing:.22em;color:var(--cyan);margin-bottom:1.4rem}
.gear__ttl--alt{color:var(--gold)}
/* an icon per line — six identical ticks told you nothing about the six things */
.gear__list li{display:grid;grid-template-columns:26px 1fr;gap:1.1rem;align-items:center;
  padding:.9rem 0;font-size:.95rem;line-height:1.75;color:var(--ink-dim);
  border-top:1px solid rgba(191,227,224,.1)}
.gear__list li:first-child{border-top:none;padding-top:0}
.gear__ic{width:26px;height:26px;color:var(--cyan);opacity:.92;overflow:visible}
.gear__yours{
  position:relative;padding:clamp(2.2rem,4vw,3.2rem) clamp(1.8rem,3.5vw,2.8rem);
  border-top:2px solid var(--gold);border-bottom:1px solid rgba(229,182,103,.24);
  background:linear-gradient(180deg,rgba(229,182,103,.08) 0%,rgba(229,182,103,.02) 100%);
  display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;
}
.gear__yours .gear__ttl--alt{margin-bottom:1.2rem;letter-spacing:.26em}
.gear__one{font-family:var(--mincho);font-weight:600;color:var(--gold);
  font-size:clamp(3.6rem,9vw,5.6rem);line-height:1.08;letter-spacing:.08em;
  text-shadow:0 0 46px rgba(229,182,103,.38)}
.gear__note{margin-top:1.1rem;font-family:var(--mincho);font-size:.92rem;color:var(--sand);letter-spacing:.14em;opacity:.85}
.gear__subnote{margin-top:1.4rem;padding-top:1rem;border-top:1px dashed rgba(191,227,224,.15);font-size:.82rem;line-height:1.8;color:var(--ink-faint);letter-spacing:.03em}
@media (max-width:820px){
  .gear__cols{grid-template-columns:1fr;gap:2.2rem}
  .gear__yours{padding:2.6rem 1.8rem}
}

/* ================================================================
   TRUST
   ================================================================ */
.trust{padding:clamp(4rem,8vh,7rem) 0}
.trust .h-md{max-width:none;margin-bottom:clamp(3rem,6vw,5rem)}
/* the claim ("a Japanese PADI instructor") and its proof (the two of them in
   kit, under the PADI flag) sit side by side — copy alone was asking to be
   taken on faith */
.trust__wrap{max-width:820px}
.trust__media{display:grid;grid-template-columns:1fr 1fr;gap:clamp(.65rem,1.2vw,.95rem);margin-bottom:clamp(1.4rem,2.5vw,2rem)}
.trust__shot{margin:0;overflow:hidden;border-radius:6px;position:relative;background:rgba(4,24,36,.6)}
.trust__shot--wide{grid-column:1/-1}
.trust__shot img,.trust__shot video{display:block;width:100%;object-fit:cover;
  filter:saturate(1.02) contrast(1.01) brightness(1.03)}
.trust__shot--wide video{height:clamp(220px,26vw,340px);object-position:50% 38%}
.trust__shot--boat img{height:clamp(180px,20vw,260px);object-position:50% 12%}
.trust__shot--prep img{height:clamp(180px,20vw,260px);object-position:50% 25%}
/* The cool wash ties the photo to the water, but multiply over the whole frame
   was dulling the faces. Keep it to the lower half, where there are no faces. */
.trust__shot::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,transparent 42%,rgba(3,15,30,.26) 100%)}
.padi{margin:0;padding-top:clamp(1.2rem,2vw,1.6rem);
  border-top:1px solid var(--line);
  display:flex;align-items:center;gap:clamp(.9rem,2vw,1.4rem);flex-wrap:wrap}
.padi__mark{display:block;width:clamp(96px,11vw,132px);height:auto;flex:none;
  /* the PNG is flat white; dimming it keeps the mark from out-shouting the wordmark */
  opacity:.72}
/* 24em cut the second sentence mid-way and made a two-sentence note three
   lines long. Wide enough that each .sent gets its own line. */
.padi__note{font-family:var(--mincho);font-size:.8rem;line-height:1.9;color:var(--ink-faint);
  max-width:32em;margin:0}
@media (max-width:720px){
  .padi{gap:.9rem}
  .padi__note{font-size:.76rem}
}

/* ================================================================
   CTA (return to light)
   ================================================================ */
.cta{padding:16vh var(--pad) 12vh;text-align:center;position:relative;overflow:hidden}
/* a bright reef surfaces behind the finale — the beautiful world you're booking */
.cta__media{position:absolute;inset:0;z-index:-2;overflow:hidden}
.cta__media video,.cta__media img{width:100%;height:100%;object-fit:cover;opacity:.5}
.cta__media::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(9,52,68,.5) 0%,rgba(11,66,88,.4) 40%,rgba(9,52,68,.72) 100%)}
/* return to light: surface glare + a warm shaft of gold breaking the surface */
.cta::before{content:"";position:absolute;inset:0;z-index:-1;
  background:
    radial-gradient(100% 82% at 50% 8%, rgba(210,240,235,.2), transparent 55%),
    radial-gradient(62% 52% at 50% -4%, rgba(233,191,116,.18), transparent 62%)}
.cta__inner{max-width:640px;margin:0 auto}
.cta .kicker{justify-content:center}
.cta__title{font-family:var(--mincho);font-weight:600;color:var(--sand);
  font-size:clamp(1.6rem,6.4vw,4.4rem);line-height:1.3;letter-spacing:.02em;margin-bottom:1.6rem}
.cta__lead{color:var(--ink-dim);font-family:var(--mincho);line-height:2.1;margin-bottom:2.4rem;max-width:34em;margin-left:auto;margin-right:auto}
.cta__ig{
  background:rgba(3,18,28,.68);
  border:1px solid rgba(229,182,103,.24);
  border-radius:6px;
  padding:clamp(1.4rem,3.5vw,2.6rem);
  backdrop-filter:blur(12px);
  -webkit-backdrop-filter:blur(12px);
  box-shadow:0 20px 48px -12px rgba(0,0,0,.55);
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:1rem;
  max-width:520px;
  margin:0 auto;
}
.cta__ig-btn{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:.55rem;
  font-size:clamp(.82rem,1.3vw,1.02rem);
  padding:1rem 1.2rem;
  width:100%;
  white-space:nowrap;
}
.cta__ig-ic{width:20px;height:20px;flex:none}
.cta__ig-handle{
  font-family:var(--label);
  font-size:.82rem;
  letter-spacing:.12em;
  color:var(--cyan);
  transition:color .3s;
}
.cta__ig-handle:hover{color:var(--gold)}
.cta__ig-guide{
  width:100%;
  margin-top:.3rem;
  padding-top:1.2rem;
  border-top:1px solid var(--line);
  text-align:left;
}
.cta__ig-guide-ttl{
  display:block;
  font-family:var(--label);
  font-size:.72rem;
  letter-spacing:.12em;
  color:var(--sand);
  font-weight:500;
  margin-bottom:.65rem;
}
.cta__ig-list{list-style:none;padding:0;margin:0;display:grid;gap:.45rem}
.cta__ig-list li{
  position:relative;
  padding-left:1.1rem;
  font-size:.84rem;
  color:var(--ink-dim);
  line-height:1.65;
}
.cta__ig-list li::before{
  content:"•";
  position:absolute;
  left:0;
  top:-.02rem;
  color:var(--cyan);
}
.cta__note{text-align:center;font-size:.8rem;color:var(--ink-faint);letter-spacing:.03em;margin-top:.2rem;line-height:1.7}

/* ================================================================
   FOOTER
   ================================================================ */
.foot{position:relative;z-index:1;padding:10vh var(--pad) 3vh;border-top:1px solid var(--line);background:linear-gradient(180deg,transparent,rgba(3,15,30,.6))}
.foot__top{max-width:var(--maxw);margin:0 auto;display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:clamp(2rem,4vw,4rem);padding-bottom:7vh}
.foot__tag{font-family:var(--mincho);color:var(--ink-dim);line-height:1.9;max-width:34ch}
.foot__nav{display:flex;flex-direction:column;gap:1rem}
.foot__nav a,.foot__contact a{font-size:.88rem;color:var(--ink-dim);transition:color .4s;width:fit-content}
.foot__nav a:hover,.foot__contact a:hover{color:var(--cyan)}
.foot__contact{display:flex;flex-direction:column;gap:1rem}
.foot__contact span{font-family:var(--label);font-size:.68rem;letter-spacing:.24em;color:var(--ink-faint)}
.foot__bottom{max-width:var(--maxw);margin:0 auto;padding-top:2.5rem;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;gap:1rem;justify-content:space-between;font:400 .74rem/1 var(--label);letter-spacing:.1em;color:var(--ink-faint)}

/* ================================================================
   KINETIC — Phase 1 : buoyant type · immersive menu · scroll-flow
   ================================================================ */
/* per-glyph buoyant reveal unit (JS wraps headings into .line > .line-inner > .ch) */
.ch{display:inline-block;will-change:transform}

/* S8 — the water stirs a touch as you scroll (grain lifts with --flow) */
.grain{opacity:calc(.05 + var(--flow,0) * .055)}

/* ---- desktop menu trigger (mobile keeps the burger) ---- */
.nav__menu{
  display:none;width:40px;height:34px;background:none;border:0;cursor:pointer;
  flex-direction:column;align-items:flex-end;justify-content:center;gap:5px;
  filter:drop-shadow(0 1px 16px rgba(5,26,36,.55));
}
.nav__menu span{display:block;height:1.5px;background:var(--sand);
  transition:width .4s var(--e-drift),transform .4s var(--e-drift),opacity .3s}
.nav__menu span:nth-child(1){width:22px}
.nav__menu span:nth-child(2){width:14px}
.nav__menu span:nth-child(3){width:19px}
.nav__menu:hover span{width:22px}
html.imm-open .nav__menu span:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
html.imm-open .nav__menu span:nth-child(2){opacity:0}
html.imm-open .nav__menu span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg);width:22px}

/* keep the trigger clickable (as an ✕) above the open overlay; quiet the rest */
html.imm-open .nav{z-index:110}
html.imm-open .nav__links,html.imm-open .nav__cta{opacity:0;pointer-events:none;transition:opacity .3s}

/* ---- full-screen immersive menu (looking up through bright water) ---- */
.immersive{
  position:fixed;inset:0;z-index:95;pointer-events:none;
  display:flex;flex-direction:column;justify-content:center;
  padding:14vh var(--pad) 9vh;
  clip-path:inset(0 0 100% 0);
  transition:clip-path .9s var(--e-sink);
  background:linear-gradient(180deg,rgba(11,74,96,.93),rgba(9,52,68,.95));
}
html.imm-open .immersive{pointer-events:auto;clip-path:inset(0 0 0% 0)}
.immersive__bg{
  position:absolute;inset:0;z-index:-2;background-size:cover;background-position:center;
  opacity:0;transform:scale(1.08);transition:opacity .8s ease,transform 6s var(--e-drift);
  filter:saturate(1.06);
}
.immersive.has-preview .immersive__bg{opacity:.34;transform:scale(1.14)}
.immersive__scrim{position:absolute;inset:0;z-index:-1;
  background:
    radial-gradient(120% 88% at 78% 14%, rgba(69,199,196,.16), transparent 55%),
    linear-gradient(180deg, rgba(6,34,46,.5), rgba(6,34,46,.72));}
.immersive__nav{display:flex;flex-direction:column;gap:clamp(.05rem,1vh,.7rem);
  max-width:var(--maxw);margin:0 auto;width:100%}
.imm-link{
  position:relative;display:flex;align-items:baseline;gap:1.3rem;width:fit-content;
  font-family:var(--mincho);font-weight:600;color:var(--sand);
  font-size:clamp(2rem,7vw,5rem);line-height:1.18;letter-spacing:.04em;padding:.35rem 0;
  opacity:0;transform:translateY(46px);
  transition:opacity .6s var(--e-drift),transform .8s var(--e-buoy),color .45s;
}
html.imm-open .imm-link{opacity:1;transform:none;transition-delay:calc(.16s + var(--i) * .06s)}
.imm-link__idx{font-family:var(--marc);font-size:.9rem;color:var(--cyan);letter-spacing:.12em;opacity:.65;align-self:flex-start;margin-top:.4rem}
.immersive.has-preview .imm-link{color:var(--ink-faint)}
.imm-link:hover,.imm-link:focus-visible{color:var(--sand)}
.imm-link:hover .imm-link__idx{color:var(--gold);opacity:1}
html[data-lang="ja"] .imm-link__en,html[data-lang="en"] .imm-link__jp{display:none}
html[data-lang="en"] .imm-link{font-family:var(--display);font-weight:500;letter-spacing:.01em}
.immersive__foot{position:absolute;left:var(--pad);right:var(--pad);bottom:5vh;
  display:flex;justify-content:space-between;gap:1rem;
  font:400 10px/1 var(--label);letter-spacing:.24em;color:var(--ink-faint)}
@media (max-width:600px){.immersive__foot{flex-direction:column;gap:.5rem;align-items:flex-start}}

.gallery{overflow:hidden}

/* ---- S4 · hold-to-dive charge (feedback only; native click untouched) ---- */
.has-hold{position:relative}
/* fill paints above the button's own background but below its text (z-index:-1),
   so the label never needs a wrapper — critical since a <button>/<a> label is a
   bare text node that can't be z-indexed directly. */
.hold-fill{
  position:absolute;left:0;bottom:0;width:100%;height:calc(var(--fill,0) * 100%);
  pointer-events:none;z-index:-1;border-radius:inherit;
  background:linear-gradient(180deg,rgba(255,255,255,.42),rgba(255,255,255,.12));
}
.btn--ghost .hold-fill{background:linear-gradient(180deg,rgba(83,212,205,.34),rgba(83,212,205,.1))}
.hold-ring{
  position:absolute;right:12px;top:50%;transform:translateY(-50%);
  width:24px;height:24px;pointer-events:none;opacity:0;z-index:2;transition:opacity .3s var(--e-drift);
}
.has-hold.is-holding .hold-ring{opacity:.9}
.hold-ring svg{width:100%;height:100%;transform:rotate(-90deg)}
.hold-ring .hr-t{fill:none;stroke:rgba(38,23,10,.28);stroke-width:2.5}
.hold-ring .hr-p{fill:none;stroke:#26170a;stroke-width:2.5;stroke-linecap:round;transition:stroke-dashoffset .05s linear}
.btn--ghost .hold-ring .hr-t{stroke:rgba(210,240,235,.3)}
.btn--ghost .hold-ring .hr-p{stroke:var(--cyan)}
.has-hold.is-charged{box-shadow:0 0 0 1.5px var(--cyan),0 16px 50px -10px rgba(83,212,205,.55)}

/* ---- ACCESS · route line drawn on scroll ---- */
/* the route line runs through the circles' centres — give each circle an opaque
   disc behind its letter so the line reads as connecting them, not crossing them */

/* ================================================================
   RESPONSIVE
   ================================================================ */
@media (max-width:1024px){
  .nav__links{display:none}
  .nav__burger{display:flex}
  .nav__links.is-open{
    display:flex;flex-direction:column;gap:1.6rem;position:fixed;inset:0;z-index:-1;
    background:rgba(3,15,30,.96);backdrop-filter:blur(10px);align-items:center;justify-content:center;
  }
  .nav__links.is-open a{font-size:1.4rem;font-family:var(--mincho);color:var(--sand)}
  .access__wrap{grid-template-columns:1fr;gap:3rem}
  .offers__grid{grid-template-columns:1fr;max-width:560px}
  .course__cols{grid-template-columns:1fr;gap:2rem}
  .foot__top{grid-template-columns:1fr 1fr}
  .depthmeter{display:none}
}
@media (max-width:600px){
  .hero__meta{display:none}
  .foot__top{grid-template-columns:1fr;gap:3rem}
  .nav__cta{display:none}
  .hero__actions{flex-direction:column;align-items:flex-start}
  .btn{width:100%;justify-content:center}
  /* course rows: step over name, price and marker on the closing line */
  .course__head{grid-template-columns:1fr auto;gap:.5rem 1rem;padding:1.5rem 0}
  .course__step{grid-column:1/-1;grid-row:1}
  .course__names{grid-column:1/-1;grid-row:2}
  .course__price{grid-column:1;grid-row:3;text-align:left;font-size:1.05rem}
  .course__mark{grid-column:2;grid-row:3;justify-self:end;align-self:end;margin-bottom:.3rem}
}

/* ================================================================
   REDUCED MOTION — genuinely reduced path
   ================================================================ */
@media (prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
  html.js [data-reveal]{opacity:1}
  html.js .lines .line-inner,html.js .lines .ch{transform:none!important}
  html.js [data-clip] img,html.js [data-clip] video{transform:none;clip-path:none}
  .grain,.hero__scroll i::after{display:none}
  /* immersive menu: appear/disappear instantly, links present with no stagger */
  .immersive,.imm-link{transition:none!important}
  html.imm-open .imm-link{transition-delay:0s!important}
  .preloader{display:none}
}

/* Six rooms stacked vertically ran ~2,000px down a phone — a very long scroll for
   the part of the weekend nobody books the trip for. Swipe instead: one room fills
   the screen, the next peeks in, and the whole section costs one card of height.
   The negative margin bleeds the strip to the screen edge so the peek is visible. */
@media (max-width:900px){
  .stay__shots{
    display:flex;gap:.9rem;
    overflow-x:auto;overscroll-behavior-x:contain;
    scroll-snap-type:x mandatory;scroll-padding-inline:var(--pad);
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
    margin-inline:calc(var(--pad) * -1);padding-inline:var(--pad)}
  .stay__shots::-webkit-scrollbar{display:none}
  .stay__shots figure{flex:0 0 84%;scroll-snap-align:center}
  .stay__shots img{height:clamp(240px,62vw,400px)}
}

/* the price card ends on its action */
.course__cta{margin-top:clamp(1.8rem,3vw,2.4rem)}
@media (max-width:720px){
  .course__cta .btn{width:100%;justify-content:center}
}

/* a new sentence starts on a new line — lead copy reads as separate beats
   rather than one block that has to be untangled */
.sent{display:block}
.sent + .sent{margin-top:.15em}

/* ================================================================
   SP — the small screen was running on desktop's spacing scale, which
   reads as cramped. One rhythm, tuned for a 390px viewport.
   ================================================================ */
@media (max-width:720px){
  :root{--pad:1.7rem}                       /* page gutter 21.6px → 27.2px */


  /* was 1.6rem — tighter than every other section's gutter (--pad: 1.7rem),
     so the gold border read as crowding the copy instead of framing it */
  .course--lead{padding:0 2rem}
  .course--card{padding:0 2rem}
  .course__inner{padding-bottom:2.6rem}
  .course__hook{margin-bottom:2rem}
  .course__cols{gap:2.4rem}
  .course__ul li{padding-top:.66rem;padding-bottom:.66rem}

  .spec{grid-auto-flow:row;grid-auto-columns:auto}
  .sched{--gutter:2rem}
  .sched__list{gap:1.1rem}
  .sched__list li{grid-template-columns:5.2rem 1fr;gap:.9rem}
  html[data-lang="en"] .sched__list li{grid-template-columns:1fr;gap:.3rem}

  /* name over line, never beside it — "ダイブマスター" is short enough to fit next
     to its line and the mixed rhythm read as a layout accident */
  .tier__list li{grid-template-columns:1fr;gap:.4rem}

  .stay{padding-top:3.4rem;margin-top:3.4rem}
  .stay__shots{gap:.9rem}


  .hero__lead{line-height:2.1}

  /* portrait crops ~74% of a 16:9 frame away horizontally. The montage's subject
     (the turtle) sits left of centre, so the window has to move left with it. */
  .hero__media video,.hero__media img{object-position:38% 50%}

  /* Section rhythm in rem, not vh. At 9vh a tall phone (844px) produced 76px of
     padding on each side — a 152–184px hole between sections, ~20% of the
     viewport spent on nothing. Fixed values keep the rhythm the same on every
     handset instead of scaling with screen height. */
  /* the hero reserves room for the absolutely-placed scroll cue + meta line;
     21vh was over-reserving on tall phones and left a 464px hole below the fold */
  .hero{padding-bottom:clamp(7rem,14vh,9rem)}
  .offers,.access,.trust,.gear,.why,.faq{padding:3.4rem 0}
  .gallery{padding:3rem 0}
  .cta{padding-top:3.4rem}
  .courses{padding:2.2rem 0 0}
  .courses__list{margin-bottom:1.6rem}
  .trust .h-md{margin-bottom:2rem}
  .gallery .wrap{margin-bottom:2rem}
}



/* ---------------------------------------------------------------------------
   ANILAO — where the diving happens, and how close it is.

   The argument is proximity, so the map reads at a glance: two dots and a line.
   Depth is carried by contour spacing alone, after Atlas of Design's reading of
   `Le pertuis d'Antioche` — line pattern instead of soundings. Everything below
   the route is scenery and is weighted to stay there.
   --------------------------------------------------------------------------- */
.anilao{margin-top:clamp(3rem,7vw,6rem);display:grid;
  grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);
  gap:clamp(2rem,5vw,4.5rem);align-items:center}
@media (max-width:860px){.anilao{grid-template-columns:1fr;gap:2rem}}

.anilao__map{margin:0}
.anilao__svg{display:block;width:100%;height:auto}
.anilao__land{fill:rgba(214,238,236,.10);stroke:rgba(191,227,224,.30);stroke-width:1;
  vector-effect:non-scaling-stroke}
/* A scale bar, in the chart's own register: hairline, quiet, and the only
   thing on the map that is a measurement rather than a place. */
.anilao__scale line{stroke:rgba(191,227,224,.34);stroke-width:1;vector-effect:non-scaling-stroke}
.anilao__scale text{font-family:var(--label);font-size:9.5px;letter-spacing:.12em;fill:var(--ink-faint)}
.anilao__grid line{stroke:rgba(191,227,224,.07);stroke-width:1;vector-effect:non-scaling-stroke}

/* Dashed, because it is a drive and not a border. */
.anilao__route{fill:none;stroke:var(--gold);stroke-width:1.5;stroke-dasharray:4 7;
  stroke-linecap:round;vector-effect:non-scaling-stroke}
.anilao__dot--from{fill:none;stroke:var(--ink-dim);stroke-width:1.4;vector-effect:non-scaling-stroke}
.anilao__dot--to{fill:var(--gold)}
/* Two rings on the destination, none on the origin: the eye should land on
   where you are going, not where you already are. */
.anilao__halo{fill:none;stroke:rgba(229,182,103,.28);stroke-width:1;vector-effect:non-scaling-stroke}
.anilao__halo--in{fill:rgba(229,182,103,.12);stroke:rgba(229,182,103,.42)}
.anilao__city{font-family:var(--label);font-size:14px;letter-spacing:.09em;fill:var(--ink-dim)}
.anilao__city--to{fill:var(--gold);font-weight:500;font-size:17px}
/* The chart convention, and the detail that says these are real coordinates and
   not a shape somebody liked. */
.anilao__coord{font-family:var(--label);font-size:9.5px;letter-spacing:.14em;fill:var(--ink-faint)}
.anilao__drive{font-family:var(--label);font-size:18px;font-weight:500;letter-spacing:.06em;fill:var(--sand)}
.anilao__km{font-family:var(--label);font-size:12.5px;letter-spacing:.08em;fill:var(--ink-faint)}
.anilao__sea{font-family:var(--label);font-size:10.5px;letter-spacing:.26em;fill:var(--ink-faint);opacity:.7}

/* Two sentences and a footnote. The three stat blocks this replaces were true
   and completely unmoving — a by-the-numbers panel proves a place is impressive
   without ever putting the reader inside it. */
.anilao__lead{font-family:var(--mincho);font-size:clamp(1.05rem,1.9vw,1.42rem);
  line-height:1.95;letter-spacing:.03em;color:var(--ink-dim);margin:0}
.anilao__lead--hit{margin-top:1.1rem;color:var(--sand)}
.anilao__cred{margin-top:clamp(1.6rem,3.5vw,2.4rem);padding-top:clamp(1rem,2vw,1.3rem);
  border-top:1px solid var(--line);
  font-family:var(--label);font-size:.66rem;line-height:2;letter-spacing:.08em;
  color:var(--ink-faint)}

/* ---------------------------------------------------------------------------
   FAQ — frequently asked questions
   Accordion with fine hairlines, matching the site's quiet editorial tone.
   --------------------------------------------------------------------------- */
.faq{padding:clamp(4.5rem,8vh,7.5rem) 0}
.faq .h-md{margin-bottom:clamp(2.4rem,4vw,3.6rem)}
.faq__list{max-width:clamp(40rem,60vw,54rem);display:flex;flex-direction:column}
.faq__item{border-top:1px solid var(--line);transition:border-color .4s}
.faq__item:last-child{border-bottom:1px solid var(--line)}
.faq__q{
  list-style:none;cursor:pointer;display:grid;grid-template-columns:auto 1fr auto;
  gap:1.1rem;align-items:center;padding:clamp(1.2rem,2.2vw,1.6rem) 0;
  user-select:none;
}
.faq__q::-webkit-details-marker{display:none}
.faq__n{font:500 .82rem/1 var(--label);color:var(--cyan);letter-spacing:.08em}
.faq__q b{font-family:var(--sans);font-weight:500;font-size:clamp(.98rem,1.35vw,1.15rem);color:var(--sand);line-height:1.6;letter-spacing:.02em;transition:color .35s}
.faq__q:hover b{color:var(--cyan)}
.faq__icon{position:relative;width:14px;height:14px;flex:none}
.faq__icon::before,.faq__icon::after{content:"";position:absolute;left:0;top:6px;width:14px;height:1px;background:var(--cyan);transition:transform .4s var(--e-drift),opacity .3s}
.faq__icon::after{transform:rotate(90deg)}
.faq__item[open] .faq__icon::after{transform:rotate(0);opacity:0}
.faq__a{padding:0 0 clamp(1.4rem,2.2vw,1.8rem) 2.2rem}
.faq__a p{font-family:var(--mincho);font-size:clamp(.88rem,1.15vw,.98rem);line-height:2.05;color:var(--ink-dim);letter-spacing:.02em;margin:0}
@media (max-width:640px){
  .faq__q{gap:.8rem;padding:1.1rem 0}
  .faq__a{padding:0 0 1.2rem 1.6rem}
}

