:root{
  --bg:#07090c; --bg2:#0d1116; --line:#1c232c; --ink:#e8edf2; --mute:#8593a3;
  --acc:#b6ff3c; --acc2:#3cf0ff; --c:var(--acc);
  --sans:"Space Grotesk",system-ui,sans-serif; --mono:"JetBrains Mono",ui-monospace,monospace;
  --pad:clamp(16px,4vw,48px);
}
html[data-accent="cyan"]{--acc:#3cf0ff;--acc2:#b6ff3c}
html[data-accent="amber"]{--acc:#ffb03c;--acc2:#3cf0ff}
html[data-accent="pink"]{--acc:#ff5c8a;--acc2:#3cf0ff}
html[data-accent="violet"]{--acc:#a78bfa;--acc2:#3cf0ff}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{background:var(--bg);color:var(--ink);font-family:var(--sans);line-height:1.55;overflow-x:hidden;-webkit-font-smoothing:antialiased;min-height:100vh}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0}
::selection{background:var(--acc);color:#07090c}
@media (pointer:fine){body.cur-on,body.cur-on a,body.cur-on button,body.cur-on input{cursor:none}}
:focus-visible{outline:2px solid var(--acc);outline-offset:3px;border-radius:4px}

/* stage + ambient layers */
#stage{position:fixed;inset:0;width:100%;height:100%;z-index:0;display:block}
.glowbg{position:fixed;inset:0;z-index:1;pointer-events:none;
  background:radial-gradient(ellipse at 70% 20%,color-mix(in srgb,var(--acc) 8%,transparent),transparent 55%),radial-gradient(ellipse at 10% 90%,color-mix(in srgb,var(--acc2) 7%,transparent),transparent 50%)}
.spot{--sx:50%;--sy:40%;position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.55;
  background-image:linear-gradient(color-mix(in srgb,var(--acc) 30%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--acc) 30%,transparent) 1px,transparent 1px);
  background-size:44px 44px;
  -webkit-mask-image:radial-gradient(240px circle at var(--sx) var(--sy),#000,transparent 70%);mask-image:radial-gradient(240px circle at var(--sx) var(--sy),#000,transparent 70%)}
main,header,footer{position:relative;z-index:2}

/* cursor */
.c-dot,.c-ring{position:fixed;left:0;top:0;z-index:100;pointer-events:none;border-radius:50%;opacity:0;transition:opacity .3s}
body.cur-on .c-dot,body.cur-on .c-ring{opacity:1}
.c-dot{width:6px;height:6px;margin:-3px 0 0 -3px;background:var(--acc)}
.c-ring{width:38px;height:38px;margin:-19px 0 0 -19px;border:1px solid rgba(232,237,242,.55);display:grid;place-items:center;
  font:500 9px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:#07090c;
  transition:opacity .3s,width .25s,height .25s,margin .25s,background .25s,border-color .25s}
.c-ring.is-hover{width:76px;height:76px;margin:-38px 0 0 -38px;background:var(--acc);border-color:var(--acc)}
.c-ring.is-down{width:26px;height:26px;margin:-13px 0 0 -13px}
.spark{position:fixed;z-index:99;pointer-events:none;width:8px;height:8px;margin:-4px;border:1px solid var(--acc);border-radius:50%;animation:spark .6s ease-out forwards}
@keyframes spark{to{transform:scale(9);opacity:0}}

/* page-transition curtain */
.curtain{position:fixed;inset:0;z-index:90;background:var(--bg2);display:grid;place-items:center;transform:translateY(-101%);transition:transform .5s cubic-bezier(.7,0,.2,1);pointer-events:none;border-bottom:2px solid var(--acc)}
.curtain pre{font:500 13px/1.9 var(--mono);color:var(--acc);white-space:pre-wrap;padding:0 24px;min-width:min(420px,90vw)}
.curtain pre b{color:var(--ink);font-weight:500}
html.entering .curtain{transform:none;transition:none}
html.leaving .curtain{transform:none}
html.entering main,html.leaving main{opacity:0}
main{transition:opacity .35s}

/* header */
header{position:fixed;top:0;left:0;right:0;z-index:20;display:flex;justify-content:space-between;align-items:center;gap:16px;padding:16px var(--pad);
  font:500 12px/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;backdrop-filter:blur(10px);background:linear-gradient(rgba(7,9,12,.8),rgba(7,9,12,0))}
.logo{display:flex;align-items:center;gap:10px}
.logo i{width:8px;height:8px;border-radius:50%;background:var(--acc);box-shadow:0 0 12px var(--acc);animation:pulse 2s infinite}
@keyframes pulse{50%{opacity:.35}}
nav{display:flex;align-items:center;gap:clamp(10px,2vw,26px)}
nav a{color:var(--mute);transition:color .2s;position:relative;padding:6px 0}
nav a:hover,nav a[aria-current]{color:var(--ink)}
nav a[aria-current]::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--acc)}
.kbd{border:1px solid var(--line);border-radius:8px;padding:8px 10px;color:var(--mute);background:rgba(13,17,22,.7);letter-spacing:.06em;text-transform:uppercase;font:500 11px/1 var(--mono);transition:border-color .2s,color .2s}
.kbd:hover{border-color:var(--acc);color:var(--ink)}
.bar{position:fixed;top:0;left:0;height:2px;width:100%;transform-origin:0 50%;transform:scaleX(0);background:linear-gradient(90deg,var(--acc),var(--acc2));z-index:30}

/* type + layout */
section{padding:clamp(64px,10vh,120px) var(--pad)}
.wrap{max-width:1180px;margin:0 auto}
.tag{font:500 12px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--acc);display:flex;align-items:center;gap:12px;margin-bottom:24px}
.tag::before{content:"";width:28px;height:1px;background:var(--acc)}
h1{font-size:clamp(54px,11vw,160px);line-height:.88;letter-spacing:-.05em;font-weight:700}
h1 span{display:block}
h1 .out{color:transparent;-webkit-text-stroke:1.5px var(--ink)}
h1.sm{font-size:clamp(44px,8vw,112px)}
h2{font-size:clamp(32px,5.2vw,62px);line-height:1;letter-spacing:-.03em;font-weight:700;margin-bottom:36px;max-width:16ch}
.lede{font-size:clamp(16px,1.5vw,20px);color:#b9c4d0;max-width:48ch;margin:28px 0 32px}
.narrow{max-width:min(660px,58%)}
.narrow.wider{max-width:min(760px,62%)}
.hero{min-height:100vh;min-height:100svh;display:flex;align-items:center;padding-top:110px}
.hero.short{min-height:74vh}
.hero .wrap{width:100%}
.who{font:400 13px/1.6 var(--mono);color:var(--mute);margin-bottom:22px;min-height:1.6em}
.who b{color:var(--acc);font-weight:500}
.caret{display:inline-block;width:8px;height:1em;background:var(--acc);vertical-align:-2px;animation:pulse 1s steps(1) infinite}
.cta{display:flex;flex-wrap:wrap;gap:14px}
.btn{display:inline-flex;align-items:center;gap:10px;padding:15px 24px;border-radius:999px;border:1px solid var(--line);background:rgba(13,17,22,.7);
  font:500 13px/1 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink);will-change:transform;transition:background .25s,color .25s,border-color .25s}
.btn.pri{background:var(--acc);border-color:var(--acc);color:#07090c}
.btn:hover{border-color:var(--acc)}
.hint{position:absolute;right:var(--pad);bottom:26px;font:400 11px/1.6 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mute);text-align:right}
.hint b{color:var(--acc);font-weight:500}

/* marquee */
.mq{border-block:1px solid var(--line);overflow:hidden;padding:18px 0;background:rgba(7,9,12,.6);position:relative;z-index:2}
.mq div{display:flex;gap:48px;width:max-content;animation:mq 32s linear infinite;font:700 clamp(18px,2.4vw,30px)/1 var(--sans);white-space:nowrap}
.mq span:nth-child(odd){color:transparent;-webkit-text-stroke:1px var(--mute)}
@keyframes mq{to{transform:translateX(-50%)}}

/* stats */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:22px;overflow:hidden}
.stat{background:rgba(9,12,16,.92);padding:clamp(20px,3vw,34px)}
.stat b{display:block;font-size:clamp(34px,5vw,62px);line-height:1;letter-spacing:-.04em;color:var(--acc);margin-bottom:12px;font-variant-numeric:tabular-nums}
.stat strong{display:block;font-size:16px;margin-bottom:2px}
.stat span{color:var(--mute);font-size:14px}

/* bento tiles */
.bento{display:grid;grid-template-columns:repeat(6,1fr);gap:16px}
.tile{--mx:50%;--my:50%;position:relative;grid-column:span 2;min-height:210px;border:1px solid var(--line);border-radius:22px;padding:24px;overflow:hidden;
  background:linear-gradient(160deg,rgba(18,24,31,.92),rgba(9,12,16,.92));display:flex;flex-direction:column;justify-content:flex-end;transition:border-color .3s,transform .35s cubic-bezier(.2,.7,.2,1)}
.tile.w3{grid-column:span 3}.tile.w4{grid-column:span 4}
.tile::before{content:"";position:absolute;inset:0;background:radial-gradient(380px circle at var(--mx) var(--my),color-mix(in srgb,var(--c) 24%,transparent),transparent 60%);opacity:0;transition:opacity .3s}
.tile:hover{border-color:color-mix(in srgb,var(--c) 60%,var(--line));transform:translateY(-4px)}
.tile:hover::before{opacity:1}
.tile>*{position:relative}
.tile small{position:absolute;top:22px;left:24px;font:500 11px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--c)}
.tile em{position:absolute;top:18px;right:22px;font-style:normal;font-size:22px;color:var(--mute);transition:transform .3s,color .3s}
.tile:hover em{transform:translate(4px,-4px);color:var(--c)}
.tile h3{font-size:clamp(22px,2.6vw,32px);line-height:1.05;letter-spacing:-.02em;margin-bottom:6px}
.tile p{color:#aeb9c6;font-size:15px;max-width:44ch}

/* project index rows */
.rows{border-top:1px solid var(--line);max-width:860px}
.prow{position:relative;display:grid;grid-template-columns:54px 1fr auto;gap:8px 18px;align-items:baseline;padding:26px 0;border-bottom:1px solid var(--line);transition:padding .35s cubic-bezier(.2,.7,.2,1)}
.prow::before{content:"";position:absolute;left:0;bottom:-1px;height:2px;width:100%;background:var(--c);transform:scaleX(0);transform-origin:0 50%;transition:transform .5s cubic-bezier(.2,.7,.2,1)}
.prow:hover{padding-left:16px}.prow:hover::before{transform:scaleX(1)}
.prow .num{font:500 12px/1 var(--mono);color:var(--mute);letter-spacing:.1em}
.prow h3{font-size:clamp(28px,5vw,60px);line-height:1;letter-spacing:-.035em;transition:color .3s}
.prow:hover h3{color:var(--c)}
.prow .role{font:500 11px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--c);border:1px solid color-mix(in srgb,var(--c) 45%,transparent);padding:6px 10px;border-radius:999px;white-space:nowrap}
.prow p{grid-column:2/-1;color:#aeb9c6;max-width:60ch;font-size:15px}

/* case study */
.crumbs{font:500 12px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mute);margin-bottom:26px}
.crumbs a:hover{color:var(--c)}.crumbs b{color:var(--c);font-weight:500}
.meta{display:grid;grid-template-columns:repeat(3,auto);gap:10px 40px;width:fit-content;margin-top:38px}
.meta div{font:400 11px/1.5 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mute)}
.meta strong{display:block;font:500 15px/1.4 var(--sans);letter-spacing:0;text-transform:none;color:var(--ink)}
.cols{display:grid;grid-template-columns:1.2fr 1fr;gap:clamp(24px,4vw,56px);max-width:980px}
.panel{border:1px solid var(--line);border-radius:22px;padding:clamp(20px,3vw,32px);background:rgba(9,12,16,.9)}
.panel h3{font:500 12px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--c);margin-bottom:18px}
.panel li{list-style:none;padding:12px 0 12px 22px;border-top:1px solid var(--line);position:relative;color:#c3cdd8}
.panel li:first-of-type{border-top:0;padding-top:0}
.panel li::before{content:"";position:absolute;left:0;top:21px;width:8px;height:8px;border-radius:2px;background:var(--c);transform:rotate(45deg)}
.panel li:first-of-type::before{top:9px}
.stack{display:flex;flex-wrap:wrap;gap:8px}
.stack li,.stack span{list-style:none;font:400 12px/1 var(--mono);padding:8px 11px;border-radius:6px;background:rgba(255,255,255,.06);color:#c7d1dc;border:0}
.stack li::before{display:none}.stack li{padding:8px 11px;border-top:0}
.flow{display:flex;flex-wrap:wrap;align-items:stretch;gap:10px;max-width:980px}
.node{flex:1 1 130px;border:1px solid color-mix(in srgb,var(--c) 40%,var(--line));border-radius:14px;padding:16px;background:rgba(9,12,16,.9);position:relative;font-size:15px;line-height:1.3;
  opacity:.35;transition:opacity .4s,transform .4s,box-shadow .4s}
.node small{display:block;font:500 10px/1 var(--mono);letter-spacing:.14em;color:var(--c);margin-bottom:10px}
.node.on{opacity:1;transform:translateY(-4px);box-shadow:0 10px 30px -14px var(--c)}
.pn{display:grid;grid-template-columns:1fr 1fr;gap:16px;max-width:980px}
.pn a{border:1px solid var(--line);border-radius:22px;padding:24px;background:rgba(9,12,16,.9);transition:border-color .3s,transform .3s}
.pn a:hover{border-color:var(--c2,var(--acc));transform:translateY(-3px)}
.pn small{display:block;font:500 11px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--mute);margin-bottom:10px}
.pn strong{font-size:clamp(20px,2.6vw,30px);letter-spacing:-.02em}
.pn a:last-child{text-align:right}

/* about */
.tl{max-width:760px;border-left:1px solid var(--line);margin-left:6px}
.tl article{position:relative;padding:0 0 34px 30px}
.tl article::before{content:"";position:absolute;left:-6px;top:6px;width:11px;height:11px;border-radius:50%;background:var(--bg);border:2px solid var(--acc)}
.tl small{font:500 11px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--acc)}
.tl h3{font-size:clamp(20px,2.4vw,28px);letter-spacing:-.02em;margin:8px 0 6px}
.tl p{color:#aeb9c6;max-width:58ch}
.skills{display:grid;max-width:900px;border-top:1px solid var(--line)}
.row{display:grid;grid-template-columns:180px 1fr;gap:20px;padding:22px 0;border-bottom:1px solid var(--line);align-items:baseline}
.row dt{font:500 12px/1.4 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--mute)}
.row dd{display:flex;flex-wrap:wrap;gap:8px 10px}
.chip{font-size:clamp(15px,1.5vw,18px);padding:6px 14px;border:1px solid var(--line);border-radius:999px;background:rgba(13,17,22,.75);transition:transform .25s,background .25s,color .25s,border-color .25s}
.chip i{font:500 10px/1 var(--mono);font-style:normal;letter-spacing:.08em;text-transform:uppercase;color:var(--acc);margin-left:6px}
.chip:hover{background:var(--acc);color:#07090c;border-color:var(--acc);transform:translateY(-3px) rotate(-2deg)}
.chip:hover i{color:#07090c}

/* lab */
.term{max-width:820px;border:1px solid var(--line);border-radius:16px;overflow:hidden;background:rgba(6,8,11,.95);box-shadow:0 30px 80px -40px color-mix(in srgb,var(--acc) 50%,transparent)}
.term-bar{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line);font:400 11px/1 var(--mono);color:var(--mute);letter-spacing:.08em}
.term-bar i{width:10px;height:10px;border-radius:50%;background:#2a323c}.term-bar i:first-child{background:var(--acc)}
.term-bar span{margin-left:auto}
.term-out{height:300px;overflow-y:auto;padding:16px;font:400 13px/1.7 var(--mono);color:#c3cdd8;white-space:pre-wrap;word-break:break-word}
.term-out .cmd{color:var(--ink)}.term-out .cmd::before{content:"$ ";color:var(--acc)}
.term-out .ok{color:var(--acc)}.term-out .dim{color:var(--mute)}
.term-in{display:flex;align-items:center;gap:10px;padding:12px 16px;border-top:1px solid var(--line);font:400 13px/1 var(--mono)}
.term-in b{color:var(--acc);font-weight:500}
.term-in input{flex:1;background:none;border:0;outline:0;color:var(--ink);font:inherit;min-width:0}
.toys{display:grid;grid-template-columns:1fr 1fr;gap:16px;max-width:980px}
.toy{border:1px solid var(--line);border-radius:22px;padding:clamp(20px,3vw,28px);background:rgba(9,12,16,.92)}
.toy h3{font-size:22px;letter-spacing:-.02em;margin-bottom:6px}
.toy p{color:var(--mute);font-size:14px;margin-bottom:16px}
.toy input{width:100%;background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:10px;padding:13px 14px;color:var(--ink);font:400 14px/1 var(--mono);outline:0;transition:border-color .2s}
.toy input:focus{border-color:var(--acc)}
.hash{margin-top:14px;font:400 12px/1.7 var(--mono);color:var(--acc);word-break:break-all;min-height:3.4em}
.hash span{display:inline-block;transition:color .3s}.hash span.ch{color:var(--ink)}
.meter{height:8px;border-radius:8px;background:rgba(255,255,255,.07);margin-top:16px;overflow:hidden}
.meter i{display:block;height:100%;width:0;background:var(--acc);border-radius:8px;transition:width .35s,background .35s}
.read{display:flex;justify-content:space-between;gap:12px;margin-top:10px;font:400 12px/1.5 var(--mono);color:var(--mute)}
.read b{color:var(--ink);font-weight:500}
.swatches{display:flex;gap:10px;flex-wrap:wrap}
.sw{width:42px;height:42px;border-radius:50%;border:2px solid var(--line);background:var(--s);transition:transform .25s,border-color .25s}
.sw:hover{transform:scale(1.12)}.sw[aria-pressed="true"]{border-color:var(--ink)}

/* contact */
.mail{display:inline-block;font-size:clamp(24px,5.4vw,76px);font-weight:700;letter-spacing:-.04em;line-height:1.05;word-break:break-word;
  background:linear-gradient(90deg,var(--ink) 50%,var(--acc) 50%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;transition:background-position .5s}
.mail:hover{background-position:-100% 0}
footer{padding:26px var(--pad);border-top:1px solid var(--line);display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font:400 11px/1.5 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mute);background:rgba(7,9,12,.7)}
footer a:hover{color:var(--acc)}

/* command palette */
.pal{position:fixed;inset:0;z-index:80;display:none;align-items:flex-start;justify-content:center;padding:14vh 16px 0;background:rgba(4,6,8,.7);backdrop-filter:blur(6px)}
.pal.open{display:flex}
.pal-box{width:min(560px,100%);border:1px solid var(--line);border-radius:16px;background:var(--bg2);overflow:hidden;box-shadow:0 40px 100px -30px #000}
.pal input{width:100%;background:none;border:0;border-bottom:1px solid var(--line);outline:0;padding:18px 20px;color:var(--ink);font:400 16px/1 var(--sans)}
.pal ul{max-height:46vh;overflow-y:auto;padding:8px}
.pal li{list-style:none;display:flex;justify-content:space-between;gap:12px;padding:12px 14px;border-radius:10px;font-size:15px;color:#c3cdd8}
.pal li small{font:400 11px/1.6 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--mute)}
.pal li.sel{background:color-mix(in srgb,var(--acc) 16%,transparent);color:var(--ink)}
.pal li.sel small{color:var(--acc)}
.toast{position:fixed;left:50%;bottom:28px;z-index:95;transform:translate(-50%,80px);background:var(--acc);color:#07090c;padding:12px 18px;border-radius:999px;font:500 12px/1 var(--mono);letter-spacing:.06em;text-transform:uppercase;transition:transform .4s cubic-bezier(.2,1.4,.4,1)}
.toast.show{transform:translate(-50%,0)}

/* reveal */
.rv{opacity:0;transform:translateY(34px);transition:opacity .8s cubic-bezier(.2,.7,.2,1),transform .8s cubic-bezier(.2,.7,.2,1)}
.rv.in{opacity:1;transform:none}

@media (max-width:860px){
  nav a{display:none}
  .hero{align-items:flex-end;padding-top:40vh;padding-bottom:64px}
  .hero.short{min-height:0;padding-top:36vh}
  .narrow,.narrow.wider{max-width:100%}
  .hint{display:none}
  .stats{grid-template-columns:1fr 1fr}
  .tile,.tile.w3,.tile.w4{grid-column:span 6;min-height:170px}
  .cols,.toys,.pn{grid-template-columns:1fr}
  .row{grid-template-columns:1fr;gap:10px}
  .meta{grid-template-columns:repeat(2,auto)}
  .prow{grid-template-columns:34px 1fr}
  .prow .role{grid-column:2;justify-self:start}
  .prow p{grid-column:2}
}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .mq div,.logo i,.caret{animation:none}
  .rv{opacity:1;transform:none;transition:none}
  .curtain{transition:none}
  .node{opacity:1}
}
