body{margin:0;font-size:14px}
img{max-width:100%}
[hidden]{display:none!important}

/* Layout: a fixed portal tunnel; chapters are layers in one fixed 3D stage that the page scroll flies you through (Z-scroll); fixed chrome (logo, chapter label, depth meter, chapter rail) sits on top. */
:root{
  --void:#000000;
  --bone:#F0EEE8;
  --ash:#B0ABA5;
  --volt:#E8FF47;
  --violet:#A35CF0;
  --line:rgba(240,238,232,.12);
  --scrim:rgba(0,0,0,.62);
  --display:Fraunces,"Iowan Old Style",Georgia,serif;
  --ui:"Space Grotesk","Helvetica Neue",Arial,sans-serif;
  --mono:"Space Mono",ui-monospace,Menlo,Consolas,monospace;
  color-scheme:dark;
}
html{background:var(--void);scroll-snap-type:y proximity}
body{background:var(--void);color:var(--bone);font-family:var(--mono);overflow-x:hidden}
body::before{content:"";position:fixed;inset:0 0 auto;height:env(safe-area-inset-top,0px);z-index:10;background:var(--void)}
#portal{position:fixed;inset:0;width:100%;height:100%;z-index:0;pointer-events:none}
.chrome{position:fixed;z-index:5}
:focus-visible{outline:2px solid var(--volt);outline-offset:4px}
a{color:inherit}

/* fixed chrome */
.logo{top:calc(18px + env(safe-area-inset-top,0px));left:max(22px,env(safe-area-inset-left,0px));display:block;width:44px;height:44px;display:grid;place-items:center;border-radius:50%;transition:transform .5s cubic-bezier(.2,.7,.1,1)}
.logo:hover{transform:rotate(-14deg) scale(1.06)}
.logo svg{width:36px;height:36px}
.chapter{top:calc(30px + env(safe-area-inset-top,0px));right:max(24px,env(safe-area-inset-right,0px));font:400 11px/1 var(--mono);letter-spacing:.3em;text-transform:uppercase;color:var(--ash);display:flex;gap:10px;align-items:center}
.chapter b{font-weight:400;color:var(--bone);display:inline-block;min-width:1ch;transition:opacity .3s}
.depth{bottom:calc(24px + env(safe-area-inset-bottom,0px));left:max(24px,env(safe-area-inset-left,0px));display:flex;align-items:center;gap:14px;font:400 11px/1 var(--mono);letter-spacing:.24em;text-transform:uppercase;color:var(--ash)}
.depth .track{width:120px;height:2px;background:var(--line);position:relative;overflow:hidden}
.depth .fill{position:absolute;inset:0;background:var(--volt);transform-origin:left;transform:scaleX(0)}
.depth output{color:var(--bone);letter-spacing:.08em;min-width:4ch;font-variant-numeric:tabular-nums}

.rail{top:50%;right:max(14px,env(safe-area-inset-right,0px));transform:translateY(-50%);display:flex;flex-direction:column;gap:2px}
.rail button{all:unset;cursor:pointer;display:flex;align-items:center;justify-content:flex-end;gap:12px;height:30px;padding:0 10px;color:var(--ash)}
.rail .nm{font:400 11px/1 var(--mono);letter-spacing:.22em;text-transform:uppercase;opacity:0;transform:translateX(8px);transition:opacity .25s,transform .25s;white-space:nowrap}
.rail .dot{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.5;transition:all .35s cubic-bezier(.2,.7,.1,1)}
.rail:hover .nm,.rail button:focus-visible .nm{opacity:1;transform:none}
.rail button:hover{color:var(--bone)}
.rail button[aria-current=true]{color:var(--volt)}
.rail button[aria-current=true] .dot{opacity:1;height:22px;border-radius:3px}
.rail button:focus-visible{outline-offset:0}

/* chapters */
/* Z-scroll: the page scroll only drives a camera; every chapter is a layer in one fixed 3D stage */
.stage{position:fixed;inset:0;z-index:2;perspective:1200px;perspective-origin:50% 50%;overflow:hidden;pointer-events:none}
section{position:absolute;inset:0;display:flex;align-items:center;padding-block:88px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));box-sizing:border-box;visibility:hidden;will-change:transform,opacity;transform-origin:50% 50%}
.runway{position:relative;z-index:0}
.runway .snap{scroll-snap-align:start}
.inner{width:100%;max-width:1120px;margin:0 auto;padding:0 clamp(0px,5vw,72px);box-sizing:border-box}
.kicker{font:400 11px/1 var(--mono);letter-spacing:.38em;text-transform:uppercase;color:var(--violet);margin:0 0 28px}
.kicker.volt{color:var(--volt)}
h2{font:300 clamp(46px,6.4vw,92px)/.98 var(--display);letter-spacing:-.015em;margin:0;text-wrap:balance}
h2 em{font-style:italic;color:var(--volt)}
.lede{font:400 15px/1.75 var(--mono);color:var(--bone);max-width:56ch;margin:32px 0 0}

/* entry */
#entry{justify-content:center;text-align:center;flex-direction:column}
.mark{width:min(620px,84vw);max-width:100%;display:block;margin:0 auto;cursor:default}
.mark{--fill:.5}
/* phones have no hover, so the mark shows at its full, hovered brightness */
@media (hover:none){ .mark{--fill:.95} }
.mark path{fill:var(--bone);fill-opacity:var(--fill);stroke:var(--bone);stroke-width:1.2;stroke-opacity:0;transition:fill-opacity .6s}
.mark.drawing path{stroke-dasharray:1;stroke-dashoffset:1;fill-opacity:0;stroke-opacity:.8;animation:draw 2.6s cubic-bezier(.5,.1,.2,1) forwards,fillin 1.2s 2.1s forwards}
.mark:hover path{fill-opacity:.95}
@keyframes draw{to{stroke-dashoffset:0}}
@keyframes fillin{to{fill-opacity:var(--fill);stroke-opacity:0}}
.tag{font:400 12px/1 var(--mono);letter-spacing:.45em;text-transform:uppercase;color:var(--violet);margin:28px 0 0;padding-left:.45em}
.enter{all:unset;cursor:pointer;margin-top:56px;display:inline-flex;flex-direction:column;align-items:center;gap:14px;font:400 11px/1 var(--mono);letter-spacing:.3em;text-transform:uppercase;color:var(--ash);padding:8px 12px}
.enter:hover{color:var(--bone)}
.enter .cue{width:1px;height:44px;background:linear-gradient(var(--volt),transparent);transform-origin:top;animation:cue 2.2s ease-in-out infinite}
@keyframes cue{0%{transform:scaleY(0);opacity:1}60%{transform:scaleY(1);opacity:1}100%{transform:scaleY(1);opacity:0}}

/* practice */
.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:48px;max-width:860px}
.disc{all:unset;box-sizing:border-box;cursor:pointer;position:relative;display:flex;flex-direction:column;gap:12px;padding:26px 26px 28px;border:1px solid var(--line);background:var(--scrim);backdrop-filter:blur(6px);transition:border-color .35s,background .35s,transform .5s cubic-bezier(.2,.7,.1,1)}
.disc .num{font:400 11px/1 var(--mono);letter-spacing:.3em;color:var(--violet)}
.disc .t{font:400 22px/1.15 var(--ui);letter-spacing:-.01em;color:var(--bone);transition:color .3s}
.disc .d{font:400 13px/1.65 var(--mono);color:var(--ash)}
.disc .glyph{position:absolute;top:22px;right:22px;width:30px;height:30px;opacity:.35;transition:opacity .35s,transform 1.2s cubic-bezier(.2,.7,.1,1)}
.disc:hover,.disc:focus-visible{border-color:rgba(232,255,71,.45);transform:translateY(-3px)}
.disc:hover .glyph,.disc:focus-visible .glyph{opacity:.9;transform:rotate(90deg)}
.disc[aria-pressed=true]{border-color:var(--volt);background:rgba(10,11,4,.78)}
.disc[aria-pressed=true] .t{color:var(--volt)}
.disc[aria-pressed=true] .glyph{opacity:1}
.hint{font:400 11px/1.6 var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--ash);margin-top:20px}

/* vault, artifacts, team */
.solo{display:grid;grid-template-columns:minmax(0,420px);margin-top:48px}
.tile{position:relative;perspective:900px}
.tile .card{position:relative;aspect-ratio:4/3;max-width:100%;border:1px solid var(--line);overflow:hidden;transform:rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg));transition:transform .5s cubic-bezier(.2,.7,.1,1),border-color .4s;background:#060606}
.tile.tall .card{aspect-ratio:3/4}
.tile .card::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(var(--ang,35deg),rgba(240,238,232,.035) 0 1px,transparent 1px 11px)}
.tile .card::after{content:"";position:absolute;inset:0;background:radial-gradient(circle at var(--mx,50%) var(--my,50%),rgba(232,255,71,.16),transparent 45%);opacity:0;transition:opacity .4s}
.tile:hover .card{border-color:rgba(232,255,71,.45)}
.tile:hover .card::after{opacity:1}
.tile .ring{position:absolute;left:50%;top:50%;width:46%;aspect-ratio:1;transform:translate(-50%,-50%);border-radius:50%;border:1px solid rgba(232,255,71,.22);box-shadow:0 0 0 18px rgba(232,255,71,.03),0 0 0 19px rgba(232,255,71,.12),0 0 0 44px rgba(147,51,234,.025),0 0 0 45px rgba(147,51,234,.14);transition:transform .9s cubic-bezier(.2,.7,.1,1)}
.tile:hover .ring{transform:translate(-50%,-50%) scale(1.18)}
.tile .cap{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding-top:16px;font:400 17px/1.3 var(--ui);color:var(--bone)}
.tile .cap span:last-child{font:400 11px/1 var(--mono);letter-spacing:.24em;color:var(--ash)}

/* placeholder media, used until real photos are in projects data */
.ph{position:absolute;inset:0;background:#060606;display:grid;place-items:center}
.ph::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(var(--ang,35deg),rgba(240,238,232,.04) 0 1px,transparent 1px 11px)}
.ph::after{content:"";position:absolute;left:50%;top:50%;width:38%;aspect-ratio:1;transform:translate(-50%,-50%);border-radius:50%;border:1px solid rgba(232,255,71,.22);box-shadow:0 0 0 16px rgba(232,255,71,.03),0 0 0 17px rgba(232,255,71,.12),0 0 0 40px rgba(147,51,234,.025),0 0 0 41px rgba(147,51,234,.14)}
.ph span{position:relative;z-index:1;font:400 11px/1 var(--mono);letter-spacing:.2em;color:var(--ash)}

/* vault carousel */
#vault h2{font-size:clamp(40px,4.8vw,68px)}
.carousel{--cw:clamp(170px,18vw,240px);position:relative;height:calc(var(--cw)*1.25 + 70px);margin-top:16px;perspective:1300px;touch-action:pan-y;cursor:grab;user-select:none;-webkit-user-select:none}
.carousel.dragging{cursor:grabbing}
.swipe{margin:18px 0 0;font:400 11px/1 var(--mono);letter-spacing:.3em;text-transform:uppercase;color:var(--ash)}
.swipe .sw-arrow{display:inline-block;color:var(--volt);animation:nudge 2.4s ease-in-out infinite}
.swipe .sw-arrow:first-child{animation-name:nudgeL}
@keyframes nudge{0%,100%{transform:translateX(0)}50%{transform:translateX(4px)}}
@keyframes nudgeL{0%,100%{transform:translateX(0)}50%{transform:translateX(-4px)}}.carousel:focus-visible{outline-offset:8px}
.orbit{position:absolute;left:50%;top:50%;width:0;height:0;transform-style:preserve-3d}
.work{all:unset;box-sizing:border-box;position:absolute;left:0;top:0;width:var(--cw);aspect-ratio:4/5;margin-left:calc(var(--cw) / -2);margin-top:calc(var(--cw) * -.625);border:1px solid var(--line);background:#050505;overflow:hidden;cursor:pointer;backface-visibility:hidden;-webkit-backface-visibility:hidden;transition:border-color .3s}
.work img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.work .ph span{display:none}
.work .wcap{position:absolute;left:0;right:0;bottom:0;padding:28px 16px 14px;background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.88));font:400 15px/1.2 var(--ui);color:var(--bone)}
.work.front{border-color:rgba(232,255,71,.65)}
.work:focus-visible{outline:2px solid var(--volt);outline-offset:4px}
.car-bar{display:flex;align-items:center;justify-content:center;gap:16px 20px;flex-wrap:wrap}
.round{all:unset;box-sizing:border-box;cursor:pointer;width:44px;height:44px;border-radius:50%;border:1px solid var(--line);display:grid;place-items:center;color:var(--bone);background:var(--scrim);transition:border-color .3s,color .3s}
.round:hover{border-color:var(--volt);color:var(--volt)}
.car-meta{display:flex;flex-direction:column;align-items:center;gap:7px;min-width:220px;text-align:center}
.car-count{font:400 11px/1 var(--mono);letter-spacing:.3em;color:var(--violet);font-variant-numeric:tabular-nums}
.car-title{font:italic 300 28px/1.1 var(--display);color:var(--bone)}
.car-sub{font:400 11px/1 var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--ash)}
.go{all:unset;box-sizing:border-box;cursor:pointer;display:inline-flex;align-items:center;gap:10px;min-height:44px;padding:0 20px;border-radius:999px;background:var(--volt);color:var(--void);font:500 14px/1 var(--ui);transition:background .25s}
.go:hover{background:var(--bone)}

/* travelling to a project star */
.stage,.chapter,.rail,.depth{transition:opacity .6s ease,filter .6s ease}
body.travelling .stage,body.travelling .chapter,body.travelling .rail,body.travelling .depth{opacity:0;filter:blur(6px);pointer-events:none}

/* project page */
.project{position:fixed;inset:0;z-index:20;overflow-y:auto;overscroll-behavior:contain;background:var(--void);opacity:0;transform:scale(.965);transition:opacity .7s ease,transform 1s cubic-bezier(.2,.7,.1,1)}
.project.shown{opacity:1;transform:none}
.p-top{position:sticky;top:0;z-index:2;display:flex;justify-content:space-between;align-items:center;gap:16px;padding-top:calc(18px + env(safe-area-inset-top,0px));padding-bottom:18px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));background:linear-gradient(var(--void) 65%,rgba(0,0,0,0))}
.back{all:unset;box-sizing:border-box;cursor:pointer;display:inline-flex;align-items:center;gap:10px;min-height:44px;padding:0 20px 0 16px;border:1px solid var(--line);border-radius:999px;font:400 11px/1 var(--mono);letter-spacing:.24em;text-transform:uppercase;color:var(--bone);transition:border-color .3s,color .3s}
.back:hover{border-color:var(--volt);color:var(--volt)}
.p-count{font:400 11px/1 var(--mono);letter-spacing:.3em;color:var(--violet);font-variant-numeric:tabular-nums}
.p-body{max-width:1120px;margin:0 auto;padding-top:24px;padding-bottom:120px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));display:flex;flex-direction:column;gap:48px}
.p-head h1{font:300 clamp(52px,8vw,120px)/.95 var(--display);font-style:italic;letter-spacing:-.02em;margin:0;color:var(--volt);text-wrap:balance}
.p-meta{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px;margin:0;padding:22px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.p-meta dt{font:400 11px/1 var(--mono);letter-spacing:.24em;text-transform:uppercase;color:var(--ash);margin-bottom:10px}
.p-meta dd{margin:0;font:400 16px/1.4 var(--ui);color:var(--bone)}
.p-hero{position:relative;margin:0;aspect-ratio:16/9;max-width:100%;border:1px solid var(--line);overflow:hidden}
.p-hero img{width:100%;height:100%;object-fit:cover;display:block}
.p-text{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,6fr);gap:40px}
.p-lead{font:300 clamp(24px,2.6vw,34px)/1.3 var(--display);margin:0;text-wrap:balance}
.p-paras{display:flex;flex-direction:column;gap:18px}
.p-paras p{margin:0;font:400 15px/1.75 var(--mono);color:var(--bone);max-width:60ch;white-space:pre-line}
.p-paras a{color:var(--volt);text-underline-offset:3px;overflow-wrap:anywhere}
.p-text.no-lead{grid-template-columns:minmax(0,1fr)}
.p-text.no-lead .p-paras{max-width:68ch}
.p-text.no-lead .p-paras p:first-child{font:400 clamp(18px,1.7vw,22px)/1.6 var(--ui);max-width:none}
.vid{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:#000;border:0}
.yt{all:unset;cursor:pointer;position:absolute;inset:0;display:grid;place-items:center;background:#000}
.yt img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.8;transition:opacity .3s}
.yt:hover img,.yt:focus-visible img{opacity:1}
.yt:focus-visible{outline:2px solid var(--volt);outline-offset:-2px}
.yt-play{position:relative;width:72px;height:72px;border-radius:50%;background:var(--volt);box-shadow:0 0 0 10px rgba(232,255,71,.18)}
.yt-play::after{content:"";position:absolute;left:29px;top:24px;border-style:solid;border-width:12px 0 12px 19px;border-color:transparent transparent transparent var(--void)}
.p-gallery{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.p-gallery figure{margin:0;display:flex;flex-direction:column;gap:10px}
.p-gallery figure.wide{grid-column:1 / -1}
.p-gallery .frame{position:relative;aspect-ratio:4/3;max-width:100%;border:1px solid var(--line);overflow:hidden}
.p-gallery figure.wide .frame{aspect-ratio:21/9}
.p-gallery img{width:100%;height:100%;object-fit:cover;display:block}
.p-gallery figcaption{font:400 12px/1.5 var(--mono);color:var(--ash)}
.p-credits{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:18px 24px;margin:0}
.p-credits dt{font:400 11px/1 var(--mono);letter-spacing:.24em;text-transform:uppercase;color:var(--ash);margin-bottom:8px}
.p-credits dd{margin:0;font:400 16px/1.4 var(--ui)}
.p-next{all:unset;box-sizing:border-box;cursor:pointer;display:flex;justify-content:space-between;align-items:baseline;gap:20px;flex-wrap:wrap;padding:32px 0;border-top:1px solid var(--line)}
.p-next .lbl{font:400 11px/1 var(--mono);letter-spacing:.3em;text-transform:uppercase;color:var(--ash)}
.p-next .nt{font:italic 300 clamp(36px,5vw,64px)/1 var(--display);color:var(--bone);transition:color .3s,transform .5s cubic-bezier(.2,.7,.1,1)}
.p-next:hover .nt,.p-next:focus-visible .nt{color:var(--volt);transform:translateX(-8px)}

/* contact */
#contact .inner{text-align:center}
#contact h2{font-size:clamp(68px,11vw,150px);letter-spacing:-.025em}
#contact .lede{margin-left:auto;margin-right:auto}
.mail{display:inline-flex;align-items:center;gap:6px;margin-top:44px;border:1px solid var(--line);background:var(--scrim);backdrop-filter:blur(6px);padding:6px 6px 6px 24px;border-radius:999px;transition:border-color .3s}
.mail:hover,.mail:focus-within{border-color:var(--volt)}
.mail a{font:400 13px/1 var(--mono);letter-spacing:.2em;color:var(--bone);text-decoration:none;padding:12px 4px;user-select:all}
.mail a:hover{color:var(--volt)}
.mail button{all:unset;cursor:pointer;width:44px;height:44px;border-radius:50%;display:grid;place-items:center;color:var(--void);background:var(--volt);transition:background .25s,transform .4s}
.mail button:hover{background:var(--bone)}
.mail button.done{transform:rotate(360deg)}
.reach{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:14px;margin-top:44px}
.reach .mail{margin-top:0}
.reach .go{min-height:58px;padding:0 26px;text-decoration:none}
.socials{list-style:none;display:flex;justify-content:center;gap:clamp(28px,5vw,56px);margin:40px 0 0;padding:0}
.soc{display:flex;flex-direction:column;align-items:center;gap:8px;text-decoration:none;color:var(--bone)}
.soc-ring{position:relative;width:60px;height:60px;border-radius:50%;border:1px solid var(--line);background:var(--scrim);display:grid;place-items:center;transition:border-color .35s,transform .5s cubic-bezier(.2,.7,.1,1)}
/* a mote orbiting the ring, like the ones drifting in the tunnel */
.soc-ring::before{content:"";position:absolute;inset:-1px;border-radius:50%;background:conic-gradient(from 0deg,transparent 0 80%,rgba(232,255,71,.55) 92%,transparent 100%);-webkit-mask:radial-gradient(circle,transparent 29px,#000 29.5px);mask:radial-gradient(circle,transparent 29px,#000 29.5px);opacity:0;transition:opacity .35s;animation:orbit 3.2s linear infinite}
.soc-ring svg{width:30px;height:30px;overflow:visible}
.soc-core{transform-origin:16px 16px;transform-box:view-box;transition:transform .5s cubic-bezier(.2,.7,.1,1)}
.soc-lbl{font:400 11px/1 var(--mono);letter-spacing:.3em;text-transform:uppercase;color:var(--bone);margin-top:4px}
.soc-h{font:400 11px/1 var(--mono);letter-spacing:.12em;color:var(--ash)}
.soc:hover .soc-ring,.soc:focus-visible .soc-ring{border-color:rgba(232,255,71,.55);transform:translateY(-3px)}
.soc:hover .soc-ring::before,.soc:focus-visible .soc-ring::before{opacity:1}
.soc:hover .soc-core,.soc:focus-visible .soc-core{transform:scale(1.5)}
.soc:hover .soc-lbl,.soc:focus-visible .soc-lbl{color:var(--volt)}
.soc:focus-visible{outline:none}
.soc:focus-visible .soc-ring{outline:2px solid var(--volt);outline-offset:4px}
@keyframes orbit{to{transform:rotate(360deg)}}
/* touch screens can't hover, so the rings keep a faint orbit */
@media (hover:none){ .soc-ring::before{opacity:.6} }

@media (max-width:760px){
  .grid{gap:8px;margin-top:28px}
  .disc{gap:8px;padding:16px 14px 18px}
  .disc .t{font-size:16px;line-height:1.2;padding-right:22px}
  .disc .d{font-size:11.5px;line-height:1.55}
  .disc .glyph{top:13px;right:12px;width:20px;height:20px}
  #practice .kicker{margin-bottom:18px}
  #practice h2{font-size:clamp(38px,11vw,46px)}
  .p-meta,.p-text,.p-gallery{grid-template-columns:minmax(0,1fr)}
  .p-gallery figure.wide{grid-column:auto}
  .rail{display:none}
  .depth .track{width:72px}
  section{padding-block:96px}
  .reach{margin-top:32px;gap:10px}
  .mail{padding-left:18px}
  .mail a{letter-spacing:.1em}
  .socials{margin-top:28px}
}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .mark.drawing path{animation:none;stroke-opacity:0;fill-opacity:var(--fill)}
  .enter .cue,.swipe .sw-arrow,.soc-ring::before{animation:none}
  .tile .card,.disc,.tile .ring{transition:none}
}
