/* =====================================================================
   v4.6 — IMMERSIVE GALLERY (preview): loaded only by /gallery (concept A "fly-through")
   and /gallery-b (concept B "story mode"). Dark stage everywhere: nothing is ever white while moving.
   ===================================================================== */
.vh{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
body.fx-page,body.sb-page{background:#030a1a}
body.fx-page .topbar{display:none}
body.fx-page .site-header,body.sb-page .site-header{background:#fff}
.fx-it.fx-intro,.fx-it.fx-end{width:min(620px,calc(100vw - 32px));box-sizing:border-box}
.fx-it.fx-intro{transform:translate(-50%,-50%)}
.fx-page #main,.sb-page #main{background:#030a1a;color:#c3d1ea}
.fx-kick{display:inline-block;font:700 .75rem/1.2 var(--display);letter-spacing:.2em;text-transform:uppercase;color:#7fb4ff}
.fx-btn{display:inline-flex;align-items:center;gap:8px;min-height:48px;padding:0 22px;border-radius:999px;border:0;font:700 1rem var(--display);cursor:pointer;color:#fff;text-decoration:none;-webkit-tap-highlight-color:transparent}
.fx-btn svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
.fx-go{background:linear-gradient(135deg,#2c6ad8,#1d4f9c);box-shadow:0 10px 30px -8px rgba(44,106,216,.8),inset 0 1px 0 rgba(255,255,255,.25)}
.fx-go svg path[d^="M8 5"]{fill:currentColor;stroke:none}
.fx-ghost{background:rgba(255,255,255,.08);box-shadow:inset 0 0 0 1px rgba(255,255,255,.22)}
.fx-ghost svg{width:18px;height:18px}
.fx-btn:focus-visible,.fx-ib:focus-visible,.fx:focus-visible,.fx-ph:focus-visible,.sb-cbtn:focus-visible{outline:3px solid #9cc8ff;outline-offset:3px}
.fx-ib{display:inline-grid;place-items:center;width:44px;height:44px;border-radius:50%;border:0;background:rgba(6,20,48,.72);box-shadow:inset 0 0 0 1px rgba(255,255,255,.18);color:#fff;cursor:pointer;-webkit-tap-highlight-color:transparent}
.fx-ib svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.fx-ib[aria-pressed="true"]{background:#2c6ad8}
.fx-lvchip{display:inline-block;max-width:62vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:8px 14px;border-radius:999px;background:rgba(6,20,48,.72);box-shadow:inset 0 0 0 1px rgba(127,180,255,.35);font:700 .8125rem/1.2 var(--display);color:#fff;letter-spacing:.02em}
.fx-lvchip.pop{animation:fxpop .55s cubic-bezier(.2,1.6,.4,1)}
@keyframes fxpop{0%{transform:scale(.7);opacity:0}100%{transform:none;opacity:1}}

/* ---------- concept A: fly-through stage ---------- */
.fx{position:relative;height:calc(100vh - var(--fx-top,66px));height:calc(100svh - var(--fx-top,66px));min-height:480px;overflow:hidden;outline:0;touch-action:none;user-select:none;-webkit-user-select:none;overscroll-behavior:none;
  background:radial-gradient(70% 55% at 50% 46%,#123069 0%,#0a1f44 38%,#050f26 70%,#02060f 100%)}
.fx::after{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(120% 90% at 50% 50%,transparent 55%,rgba(0,0,0,.55) 100%);z-index:600}
.fx-stars{position:absolute;inset:0;pointer-events:none;z-index:0}
.fx-world{position:absolute;inset:0;z-index:1;perspective:900px;perspective-origin:50% 48%}
.fx-it{position:absolute;left:50%;top:48%;box-sizing:border-box;transform-origin:0 0;will-change:transform,opacity;backface-visibility:hidden}
.fx-ph{display:block;padding:0;border:0;border-radius:14px;overflow:hidden;cursor:pointer;background:#16233d;box-shadow:0 30px 70px -20px rgba(0,0,0,.85),0 0 0 1px rgba(255,255,255,.08);-webkit-tap-highlight-color:transparent}
.fx-lq{position:absolute;inset:-8%;background-size:cover;background-position:center;filter:blur(12px);transform:scale(1.04)}
.fx-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .45s ease}
.fx-ph.ld .fx-img{opacity:1}
.fx-zoom{position:absolute;right:10px;bottom:10px;width:36px;height:36px;border-radius:50%;display:grid;place-items:center;background:rgba(3,10,26,.55);color:#fff;opacity:0;transition:opacity .3s}
.fx-zoom svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round}
.fx.on-ph .fx-ph[tabindex="0"] .fx-zoom{opacity:1}
.fx-ch,.fx-intro,.fx-end{padding:30px 26px;border-radius:26px;background:linear-gradient(160deg,rgba(18,48,105,.92),rgba(6,20,48,.94));box-shadow:0 40px 90px -30px rgba(0,0,0,.9),inset 0 0 0 1px rgba(127,180,255,.28);color:#c3d1ea;overflow:hidden}
.fx-ch::before,.fx-intro::before,.fx-end::before{content:"";position:absolute;left:0;right:0;top:0;height:4px;background:var(--g-tri)}
.fx-ch h2,.fx-end h2{font:800 clamp(1.9rem,1.4rem + 2.4vw,3rem)/1.05 var(--display);color:#fff;margin:10px 0 12px;letter-spacing:-.02em}
.fx-intro h1{font:800 clamp(2.4rem,1.6rem + 4vw,4.5rem)/1 var(--display);color:#fff;margin:12px 0 14px;letter-spacing:-.03em;background:linear-gradient(95deg,#fff 30%,#9cc8ff);-webkit-background-clip:text;background-clip:text;color:transparent}
.fx-ch p,.fx-intro p,.fx-end p{margin:0;font-size:1rem;line-height:1.55}
.fx-intro b{color:#fff}
.fx-lvn{position:absolute;right:-6px;top:-26px;font:800 9rem/1 var(--display);color:transparent;-webkit-text-stroke:1.5px rgba(127,180,255,.35);letter-spacing:-.05em;pointer-events:none}
.fx-chips{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:20px}
.fx-chips b{font:700 .875rem var(--display);color:#fff;padding:7px 12px;border-radius:999px;background:rgba(255,255,255,.1)}
.fx-thumbs{display:flex}
.fx-thumbs img{width:52px;height:52px;border-radius:12px;object-fit:cover;margin-left:-12px;box-shadow:0 0 0 2px #0a1f44;background:#16233d}
.fx-acts{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}
.fx-swipe{display:flex;flex-direction:column;align-items:center;gap:6px;margin-top:22px;font:700 .75rem var(--display);letter-spacing:.18em;text-transform:uppercase;color:#7fb4ff}
.fx-swipe i{width:26px;height:40px;border-radius:14px;box-shadow:inset 0 0 0 2px rgba(127,180,255,.6);position:relative}
.fx-swipe i::after{content:"";position:absolute;left:50%;top:8px;width:4px;height:8px;margin-left:-2px;border-radius:2px;background:#9cc8ff;animation:fxsw 1.4s ease-in-out infinite}
@keyframes fxsw{0%{transform:translateY(14px);opacity:0}30%{opacity:1}100%{transform:translateY(-2px);opacity:0}}
.fx-hud{position:absolute;inset:0;z-index:700;pointer-events:none}
.fx-hud button{pointer-events:auto}
.fx-prog{position:absolute;left:0;right:0;top:0;height:4px;background:rgba(255,255,255,.1)}
.fx-prog>i{position:absolute;inset:0;transform-origin:0 50%;transform:scaleX(0);background:var(--g-tri)}
.fx-prog span i{position:absolute;top:-2px;width:2px;height:8px;background:#9cc8ff;border-radius:1px}
.fx-top{position:absolute;left:12px;right:12px;top:14px;display:flex;align-items:center;gap:10px}
.fx-count{margin-left:auto;font:700 .875rem var(--display);color:#fff;font-variant-numeric:tabular-nums;text-shadow:0 1px 6px rgba(0,0,0,.6)}
.fx-cap{position:absolute;left:112px;right:84px;bottom:20px;margin:0;font:600 .9375rem/1.35 var(--display);color:#fff;text-shadow:0 1px 10px rgba(0,0,0,.8);min-height:1em}
.fx-nav{position:absolute;left:12px;bottom:14px;display:flex;gap:8px}
.fx .fx-intro .fx-swipe{transition:opacity .4s}
.fx.moved .fx-swipe{opacity:0}
@media (min-width:900px){.fx-cap{left:50%;right:auto;transform:translateX(-50%);text-align:center;max-width:60%}.fx-top{left:24px;right:24px;top:20px}.fx-nav{left:24px;bottom:24px}.fx-ph{border-radius:18px}}
/* reduced motion: a plain sideways swipe, one full-screen slide each */
.fx.rm{touch-action:auto}
.fx.rm .fx-world{display:flex;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;perspective:none;scrollbar-width:none}
.fx.rm .fx-world::-webkit-scrollbar{display:none}
.fx.rm .fx-sl{flex:0 0 100%;height:100%;display:grid;place-items:center;scroll-snap-align:center}
.fx.rm .fx-it{position:relative;left:auto;top:auto;will-change:auto;transform:none!important;opacity:1!important;max-height:calc(100% - 130px);overflow:auto}
.fx-static{padding:24px var(--gutter)}.fx-static h2{color:#fff}.fx-sgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}.fx-sgrid img{width:100%;height:auto;border-radius:8px}

/* level select dialog (A) */
.fx-levels{padding:0;border:0;background:transparent;max-width:none;max-height:none;width:100%;height:100%;color:#c3d1ea}
.fx-levels::backdrop{background:rgba(2,6,15,.82)}
.fx-lvwrap{box-sizing:border-box;width:min(560px,100%);max-height:100%;overflow:auto;margin:0 auto;padding:20px 16px 30px}
.fx-lvhead{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.fx-lvhead h2{color:#fff;font:800 1.75rem var(--display);margin:0}
.fx-lvlist{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.fx-lvlist button{display:flex;align-items:center;gap:14px;width:100%;padding:10px;border:0;border-radius:18px;background:linear-gradient(135deg,rgba(18,48,105,.95),rgba(6,20,48,.95));box-shadow:inset 0 0 0 1px rgba(127,180,255,.25);color:#fff;text-align:left;cursor:pointer;animation:fxin .4s both}
.fx-lvlist li:nth-child(2) button{animation-delay:.04s}.fx-lvlist li:nth-child(3) button{animation-delay:.08s}.fx-lvlist li:nth-child(4) button{animation-delay:.12s}.fx-lvlist li:nth-child(5) button{animation-delay:.16s}.fx-lvlist li:nth-child(6) button{animation-delay:.2s}
@keyframes fxin{from{transform:translateY(16px);opacity:0}}
.fx-lvlist img{width:72px;height:72px;border-radius:14px;object-fit:cover;flex:none}
.fx-lvlist span{display:flex;flex-direction:column;gap:2px}
.fx-lvlist small{font:700 .6875rem var(--display);letter-spacing:.16em;text-transform:uppercase;color:#7fb4ff}
.fx-lvlist b{font:800 1.125rem/1.2 var(--display);color:#fff}
.fx-lvlist em{font-style:normal;font-size:.875rem;color:#a9bde0}

/* full-screen viewer (A) */
.fx-lb{padding:0;border:0;margin:0;width:100%;height:100%;max-width:none;max-height:none;background:#02060f;color:#fff;overflow:hidden;--lbo:1}
.fx-lb::backdrop{background:#02060f}
.lb-track{position:absolute;inset:0;touch-action:none}
.lb-track.anim{transition:transform .25s cubic-bezier(.3,.7,.3,1)}
.lb-s{position:absolute;inset:0;display:grid;place-items:center;overflow:hidden}
.lb-bg{position:absolute;inset:-10%;background-size:cover;background-position:center;filter:blur(24px) brightness(.55);transform:scale(1.1)}
.lb-s img{position:relative;max-width:100vw;max-height:100vh;max-height:100dvh;width:auto;height:auto;object-fit:contain;opacity:0;transition:opacity .35s}
.lb-s img.ld{opacity:1}
.lb-top{position:absolute;left:12px;right:12px;top:12px;display:flex;justify-content:space-between;align-items:center;transition:opacity .25s;opacity:var(--lbo)}
.lb-count{font:700 .9375rem var(--display);padding:8px 14px;border-radius:999px;background:rgba(6,20,48,.72)}
.lb-cap{position:absolute;left:0;right:0;bottom:0;margin:0;padding:40px 18px 22px;font:600 .9375rem/1.4 var(--display);background:linear-gradient(transparent,rgba(2,6,15,.85));transition:opacity .25s;opacity:var(--lbo)}
.lb-nav{position:absolute;top:50%;margin-top:-22px}
.lb-prev{left:12px}.lb-next{right:12px}
.fx-lb.chrome-off .lb-top,.fx-lb.chrome-off .lb-cap,.fx-lb.chrome-off .lb-nav{opacity:0;pointer-events:none}
@media (max-width:700px){.lb-nav{display:none}}

/* ---------- concept B: story mode ---------- */
.sb-select{position:relative;overflow:hidden;padding:clamp(18px,4vw,48px) 0 40px;min-height:calc(100svh - 100px);background:radial-gradient(80% 60% at 50% 60%,#123069 0%,#0a1f44 40%,#030a1a 100%)}
.sb-glow{position:absolute;left:50%;top:58%;width:140vw;height:60vw;max-width:1600px;transform:translate(-50%,-50%);background:radial-gradient(closest-side,rgba(44,106,216,.35),transparent);pointer-events:none}
.sb-head{position:relative;text-align:center}
.sb-head h1{font:800 clamp(2.1rem,1.5rem + 3.6vw,4.25rem)/1 var(--display);margin:8px 0 8px;letter-spacing:-.03em;background:linear-gradient(95deg,#fff 30%,#9cc8ff);-webkit-background-clip:text;background-clip:text;color:transparent}
.sb-head p{margin:0 auto;max-width:44ch}.sb-head b{color:#fff}
.sb-levels{position:relative;list-style:none;margin:22px 0 0;padding:16px 10vw 28px;display:flex;gap:3vw;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.sb-levels::-webkit-scrollbar{display:none}
.sb-card{flex:0 0 80vw;max-width:380px;scroll-snap-align:center;perspective:900px}
.sb-cbtn{position:relative;display:block;width:100%;aspect-ratio:3/4.4;max-height:calc(100svh - 300px);min-height:360px;background-size:cover;background-position:center;padding:0;border:0;border-radius:24px;overflow:hidden;cursor:pointer;background-color:#16233d;color:#fff;text-align:left;box-shadow:0 30px 60px -24px rgba(0,0,0,.9),inset 0 0 0 1px rgba(255,255,255,.12);will-change:transform;transition:transform .12s linear;-webkit-tap-highlight-color:transparent}
.sb-cbtn img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.sb-shade{position:absolute;inset:0;background:linear-gradient(180deg,rgba(3,10,26,.35) 0%,transparent 28%,transparent 45%,rgba(3,10,26,.92) 100%)}
.sb-lv{position:absolute;left:16px;top:16px;font:800 .75rem var(--display);letter-spacing:.18em;text-transform:uppercase;padding:7px 12px;border-radius:999px;background:rgba(3,10,26,.6);box-shadow:inset 0 0 0 1px rgba(127,180,255,.4)}
.sb-star{position:absolute;right:16px;top:12px;font-size:1.5rem;color:rgba(255,255,255,.25);text-shadow:0 2px 8px rgba(0,0,0,.6)}
.sb-card.done .sb-star{color:#ffd24a}
.sb-ct{position:absolute;left:18px;right:18px;bottom:18px;display:flex;flex-direction:column;gap:4px}
.sb-ct b{font:800 1.75rem/1.08 var(--display);letter-spacing:-.02em;color:#fff}
.sb-ct small{font-size:.9375rem;color:#dbe7fb}
.sb-play{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;margin-top:10px;padding:10px 18px 10px 14px;border-radius:999px;background:#fff;color:#0a1f44;font:800 .9375rem var(--display)}
.sb-play svg{width:18px;height:18px;fill:currentColor}
.sb-under{display:flex;flex-direction:column;align-items:center;gap:12px}
.sb-hint{font:700 .75rem var(--display);letter-spacing:.16em;text-transform:uppercase;color:#7fb4ff}
@media (min-width:900px){.sb-levels{padding:30px calc(50vw - 190px) 40px;gap:40px}.sb-card{flex-basis:380px}}

.sb-player{padding:0;border:0;margin:0;width:100%;height:100%;max-width:none;max-height:none;background:#02060f;color:#fff;overflow:hidden}
.sb-player::backdrop{background:#02060f}
.sb-stage{position:absolute;inset:0;perspective:1100px;overflow:hidden;background:#02060f}
.sb-cube{position:absolute;inset:0;transform-style:preserve-3d}
.sb-cube.anim{transition:transform .55s cubic-bezier(.45,.05,.25,1)}
.sb-face{position:absolute;inset:0;overflow:hidden;backface-visibility:hidden;-webkit-backface-visibility:hidden;background:#0a1220}
.sb-face::after{content:"";position:absolute;inset:0;background:#000;opacity:0;pointer-events:none;transition:opacity .55s}
.sb-face.dim::after{opacity:.6}
.sb-bg{position:absolute;inset:-10%;background-size:cover;background-position:center;filter:blur(22px) brightness(.5);transform:scale(1.1)}
.sb-pic{position:absolute;top:0;bottom:0;left:0;will-change:transform}
.sb-pic img{display:block;height:100%;width:auto;max-width:none;opacity:0;transition:opacity .35s}
.sb-pic.fit{top:50%;left:50%;bottom:auto;transform:translate(-50%,-50%)!important;animation:none!important}
.sb-pic.fit img{height:auto;width:auto;max-height:100vh;max-height:100svh;max-width:100vw}
.sb-face.ld .sb-pic img{opacity:1}
.sb-pan{animation:sbpan var(--dur,6s) ease-in-out both;animation-play-state:var(--ps,running)}
@keyframes sbpan{0%,8%{transform:translate3d(0,0,0)}92%,100%{transform:translate3d(var(--px),0,0)}}
.sb-end{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;padding:30px;background:radial-gradient(80% 60% at 50% 50%,#123069,#030a1a)}
.sb-end h2{font:800 clamp(2rem,1.5rem + 3vw,3.5rem)/1.05 var(--display);color:#fff;margin:10px 0}
.sb-end .sb-stars{font-size:3rem;color:#ffd24a;letter-spacing:.1em;animation:fxpop .7s .1s cubic-bezier(.2,1.6,.4,1) both;text-shadow:0 4px 30px rgba(255,210,74,.5)}
.sb-end p{margin:0 0 18px;color:#c3d1ea}
.sb-end .fx-acts{justify-content:center}
.sb-ui{position:absolute;inset:0;pointer-events:none}
.sb-ui button{pointer-events:auto}
.sb-bars{position:absolute;left:10px;right:10px;top:10px;display:flex;gap:3px}
.sb-bars i{flex:1;height:3px;border-radius:2px;background:rgba(255,255,255,.28);overflow:hidden;position:relative}
.sb-bars i b{position:absolute;inset:0;background:#fff;transform-origin:0 50%;transform:scaleX(0)}
.sb-bars i.done b{transform:none}
.sb-top{position:absolute;left:10px;right:10px;top:22px;display:flex;align-items:center;gap:8px;z-index:3}
.sb-top .fx-lvchip{margin-right:auto}
.sb-cap{position:absolute;left:0;right:0;bottom:0;margin:0;padding:50px 18px 24px;font:600 1rem/1.4 var(--display);background:linear-gradient(transparent,rgba(2,6,15,.85));z-index:2;pointer-events:none}
.sb-cap small{display:block;font:700 .75rem var(--display);letter-spacing:.14em;text-transform:uppercase;color:#9cc8ff;margin-top:4px}
.sb-tap{position:absolute;top:80px;bottom:90px;border:0;background:transparent;padding:0;cursor:pointer;-webkit-tap-highlight-color:transparent;z-index:1}
.sb-tl{left:0;width:33%}.sb-tr{right:0;width:67%}
.sb-tap:focus-visible{outline:3px solid #9cc8ff;outline-offset:-6px}
.sb-player.ending .sb-tap{display:none}
.sb-bars,.sb-top,.sb-cap{transition:opacity .2s}
.sb-player.held .sb-bars,.sb-player.held .sb-top,.sb-player.held .sb-cap{opacity:0}

@media (prefers-reduced-motion:reduce){.fx-swipe i::after,.fx-lvchip.pop,.fx-lvlist button,.sb-end .sb-stars{animation:none}.sb-pan{animation:none}.sb-cube.anim{transition:none}.lb-track.anim{transition:none}}
