html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis [data-lenis-prevent],.lenis [data-lenis-prevent-wheel],.lenis [data-lenis-prevent-touch],.lenis [data-lenis-prevent-vertical],.lenis [data-lenis-prevent-horizontal]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-behavior:allow-discrete;transition-property:overflow;transition-duration:1ms}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 500;font-display:swap;src:url(/assets/fonts/jetbrainsmono-latin-ext.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 500;font-display:swap;src:url(/assets/fonts/jetbrainsmono-latin.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:400 700;font-display:swap;src:url(/assets/fonts/spacegrotesk-latin-ext.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Space Grotesk;font-style:normal;font-weight:400 700;font-display:swap;src:url(/assets/fonts/spacegrotesk-latin.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Grotesk Fallback;font-weight:400;src:local(Arial),local(ArialMT);size-adjust:107.6%;ascent-override:91.45%;descent-override:27.14%;line-gap-override:0%}@font-face{font-family:Space Grotesk Fallback;font-weight:500;src:local(Arial),local(ArialMT);size-adjust:106.4%;ascent-override:92.48%;descent-override:27.44%;line-gap-override:0%}@font-face{font-family:Space Grotesk Fallback;font-weight:700;src:local(Arial Bold),local(Arial-BoldMT);size-adjust:102.35%;ascent-override:96.14%;descent-override:28.53%;line-gap-override:0%}@font-face{font-family:JetBrains Mono Fallback;font-weight:400 500;src:local(Courier New),local(CourierNewPSMT);size-adjust:100%;ascent-override:102%;descent-override:30%;line-gap-override:0%}:root{--ink:#05050a;--ink2:#0a0912;--violet:#a78bfa;--magenta:#e879f9;--text:#ece9f6;--muted:#948dae;--line:#a78bfa21;--mono:"JetBrains Mono","JetBrains Mono Fallback",ui-monospace,SFMono-Regular,Menlo,monospace;--disp:"Space Grotesk","Space Grotesk Fallback",system-ui,-apple-system,sans-serif;--pad:clamp(20px,5vw,88px);--header-h:72px}*{box-sizing:border-box}html:not(.lenis){scroll-behavior:smooth}body{background:var(--ink);color:var(--text);font-family:var(--disp);-webkit-font-smoothing:antialiased;margin:0;font-weight:400;overflow-x:hidden}body.locked{overflow:hidden}a{color:inherit}body:before{content:"";z-index:0;pointer-events:none;background-image:linear-gradient(var(--line) 1px,transparent 1px), linear-gradient(90deg,var(--line) 1px,transparent 1px);opacity:.5;background-size:64px 64px;position:fixed;inset:0}.glow{filter:blur(120px);z-index:0;pointer-events:none;border-radius:50%;transition:opacity 1.2s;position:fixed}.glow.a{background:#7c3aed38;width:720px;height:520px;top:-180px;right:-120px}.glow.b{background:#ec48991c;width:560px;height:440px;bottom:-160px;left:-140px}.has-scene .glow{opacity:0}.scene{z-index:0;pointer-events:none;opacity:0;width:100%;height:100lvh;transition:opacity 1.4s;display:block;position:fixed;top:0;left:0;right:0}.scene.is-on{opacity:1}:is(main,section)[tabindex="-1"]:focus{outline:none}.has-scene :is(#hero .status,#hero .lede,#hero .hops,.eyebrow>span,.about p,.row h3,.row p,.row .repo,.spec li,.note,.tl .yr,.tl .body>*,.mailto,.links>*,footer>span),.has-scene.scene-behind #hero h1{position:relative}.lens-copy{z-index:-1;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.trace-packet{z-index:-1;pointer-events:none;opacity:0;width:9px;height:9px;box-shadow:0 0 10px 3px var(--magenta),0 0 22px 6px #e879f959;background:#fff;border-radius:50%;margin:-4.5px 0 0 -4.5px;position:absolute;top:0;left:0}.trace-packet.landed{animation:.5s ease-out forwards land}@keyframes land{to{opacity:0;box-shadow:0 0 16px 9px var(--magenta),0 0 36px 16px #e879f900}}.has-motion header{overflow:clip}.progress,.progress-head{pointer-events:none;position:absolute;bottom:0;left:0}.progress{transform-origin:0;background:linear-gradient(90deg,var(--violet),var(--magenta));height:1px;right:0;transform:scaleX(0)}.progress-head{opacity:0;width:6px;height:6px;box-shadow:0 0 6px 2px var(--magenta),0 0 14px 4px #e879f959;background:#fff;border-radius:50%;margin:0 0 -2.5px -3px;transition:opacity .3s}.has-motion .secnav{position:relative}.has-motion .secnav a[aria-current=location]{border-color:#0000}.secnav-line{opacity:0;pointer-events:none;background:var(--violet);transform-origin:0;width:100px;height:1px;transition:transform .5s cubic-bezier(.2,.7,.2,1),opacity .3s;position:absolute;bottom:0;left:0}.has-motion .magnet{transition-property:color,background-color,border-color}.has-motion :is(#work,#projects) .row{--d:calc(var(--i,0) * 90ms + .15s);transition:background .3s,opacity .6s ease var(--d),translate .7s cubic-bezier(.2,.7,.2,1) var(--d)}.has-motion :is(#work,#projects):not(.in) .row{opacity:0;translate:0 18px}.has-motion .row.tilt{position:relative}.has-motion .row.tilt:before{content:"";z-index:-1;pointer-events:none;opacity:0;background:radial-gradient(360px 90px at var(--mx,50%) var(--my,50%),#a78bfa1c,transparent);transition:opacity .45s;position:absolute;inset:0}.has-motion .row.is-tilting:before{opacity:1}@property --sheen{syntax:"<number>";inherits:false;initial-value:0}.has-motion #handson{position:relative}.has-motion #handson .spec li{--d:calc(var(--i,0) * var(--step,70ms) + var(--delay,.22s));transition:opacity 0s linear var(--d),--sheen .45s}.has-motion #handson:not(.in) .spec li{opacity:0}.has-motion .spec li.tilt{background:radial-gradient(240px circle at var(--mx,50%) var(--my,50%),rgb(167 139 250/calc(var(--sheen) * .16)),transparent 70%)}.has-motion .spec li.is-tilting{--sheen:1}.term-caret{opacity:0;pointer-events:none;background:var(--magenta);width:9px;height:1.1em;position:absolute;top:0;left:0;box-shadow:0 0 8px #e879f999}.has-motion .tl{--rail:calc(-1 * min(28px, var(--pad) * .5));position:relative}.tl-rail,.tl-head{left:var(--rail);pointer-events:none;position:absolute;top:0}.tl-rail{transform-origin:top;background:linear-gradient(var(--violet),var(--magenta));width:1px;margin-left:-.5px;bottom:0;transform:scaleY(0)}.tl-head{opacity:0;width:7px;height:7px;box-shadow:0 0 8px 2px var(--magenta);background:#fff;border-radius:50%;margin:-3.5px 0 0 -3.5px;transition:opacity .3s}.has-motion .tl .item{position:relative}.has-motion .tl .item:before,.has-motion .tl .item:after{content:"";left:var(--rail);pointer-events:none;box-sizing:border-box;border-radius:50%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;position:absolute;top:calc(clamp(20px,2.6vw,30px) + .55em)}.has-motion .tl .item:before{background:var(--ink);border:1px solid #a78bfa73}.has-motion .tl .item:after{background:var(--magenta);box-shadow:0 0 10px var(--magenta);opacity:0;transition:opacity .35s,transform .35s;transform:scale(.4)}.has-motion .tl .item.lit:after{opacity:1;transform:none}#loader{z-index:100;background:var(--ink);flex-direction:column;justify-content:center;align-items:center;gap:22px;transition:opacity .6s,visibility .6s;display:flex;position:fixed;inset:0}#loader.done{opacity:0;visibility:hidden}#loader .lbl{font-family:var(--mono);letter-spacing:.34em;color:var(--muted);text-transform:uppercase;font-size:11px}#loader .num{font-family:var(--mono);color:var(--violet);font-size:clamp(48px,11vw,96px);font-weight:500;line-height:1}#loader .bar{background:#a78bfa2e;width:min(320px,60vw);height:1px;position:relative;overflow:hidden}#loader .bar i{background:var(--magenta);transition:right .12s linear;position:absolute;inset:0 100% 0 0}.wrap{z-index:1;position:relative}header{z-index:50;padding:22px var(--pad);font-family:var(--mono);letter-spacing:.26em;text-transform:uppercase;background:#05050ab3;background:color-mix(in srgb,var(--ink) 70%,transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);justify-content:space-between;align-items:center;font-size:11px;display:flex;position:fixed;top:0;left:0;right:0}.header-solid header{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--ink)}.skip{top:12px;left:var(--pad);z-index:150;font-family:var(--mono);letter-spacing:.26em;text-transform:uppercase;color:var(--text);background:var(--ink);border:1px solid var(--violet);padding:10px 14px;font-size:11px;text-decoration:none;position:fixed;transform:translateY(calc(-100% - 24px))}.skip:focus{transform:none}header .mark{color:var(--violet);text-decoration:none}header .mark b{color:var(--magenta);font-weight:500}.secnav{letter-spacing:.12em;gap:clamp(12px,1.6vw,26px);display:flex}.secnav a{color:var(--muted);border-bottom:1px solid #0000;gap:6px;padding-bottom:3px;text-decoration:none;transition:all .2s;display:inline-flex;position:relative}.secnav a:hover{color:var(--text)}.secnav a[aria-current=location]{color:var(--violet);border-color:var(--violet)}@media (width<=1200px){.secnav .lbl{display:none}}@media (width<=768px){.secnav{display:none}}.lang{border:1px solid #a78bfa3d;border-radius:2px;gap:2px;display:flex;overflow:hidden}.lang button{cursor:pointer;font:inherit;letter-spacing:.2em;color:var(--muted);background:0 0;border:0;padding:6px 11px;transition:all .2s}.lang button:hover{color:var(--text)}.lang button[aria-pressed=true]{color:var(--violet);background:#a78bfa24}.lang button:focus-visible{outline:2px solid var(--magenta);outline-offset:-2px}section{padding:clamp(90px,13vh,150px) var(--pad);max-width:1400px;scroll-margin-top:var(--header-h);margin:0 auto}.eyebrow{font-family:var(--mono);letter-spacing:.32em;text-transform:uppercase;color:var(--muted);align-items:center;gap:14px;margin:0 0 34px;font-size:11px;font-weight:400;display:flex}.eyebrow:after{content:"";background:var(--line);flex:1;height:1px}.eyebrow span{color:var(--magenta)}.about .eyebrow{letter-spacing:-.015em;max-width:30ch;margin:0 0 1.1em;font-size:clamp(1.15rem,2.2vw,1.9rem);line-height:1.48}#hero{flex-direction:column;justify-content:center;max-width:1400px;min-height:100svh;padding-top:120px;padding-bottom:48px;display:flex}.status{font-family:var(--mono);letter-spacing:.24em;text-transform:uppercase;color:var(--muted);align-self:flex-start;align-items:center;gap:9px;margin-bottom:32px;font-size:11px;display:inline-flex}.status i{background:var(--magenta);border-radius:50%;width:6px;height:6px;animation:2.4s infinite pulse;box-shadow:0 0 #e879f999}@keyframes pulse{70%{box-shadow:0 0 0 9px #e879f900}to{box-shadow:0 0 #e879f900}}h1{letter-spacing:-.035em;max-width:11.016em;margin:0 0 30px;font-size:clamp(2.4rem,6.4vw,5.6rem);font-weight:700;line-height:1.02}h1 em{color:var(--violet);font-style:normal}.lede{color:var(--muted);max-width:35.896em;margin:0;font-size:clamp(1rem,1.5vw,1.24rem);line-height:1.62}.hops{margin-top:clamp(44px,7vh,84px)}.hops svg{width:100%;height:auto;display:block;overflow:visible}.path{fill:none;stroke:var(--magenta);stroke-width:1.4px;stroke-linecap:round;filter:drop-shadow(0 0 7px #e879f980);stroke-dasharray:1200;stroke-dashoffset:1200px}.ready .path{animation:2.2s cubic-bezier(.45,0,.15,1) forwards draw}@keyframes draw{to{stroke-dashoffset:0}}.rail{stroke:#a78bfa29;stroke-width:1px}.node{fill:var(--ink);stroke:var(--violet);stroke-width:1.4px;opacity:0}.node.end{stroke:var(--magenta)}.ready .node{animation:.45s cubic-bezier(.2,1.4,.4,1) forwards pop}@keyframes pop{0%{opacity:0;transform:scale(.4)}to{opacity:1;transform:scale(1)}}.hoplbl{font-family:var(--mono);letter-spacing:.2em;fill:var(--muted);opacity:0;font-size:10px}.hopms{font-family:var(--mono);letter-spacing:.06em;fill:var(--violet);opacity:0;font-size:11px}.ready .hoplbl,.ready .hopms{animation:.45s forwards fadein}@keyframes fadein{to{opacity:.9}}.hops figcaption{font-family:var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin-top:18px;font-size:10.5px}@media (width<=1200px){.hoplbl{font-size:12px}.hopms{font-size:13px}}@media (width<=1024px){.hoplbl{font-size:14px}.hopms{font-size:15px}}@media (width<=900px){.hoplbl{font-size:16px}.hopms{font-size:17px}}@media (width<=768px){.hops{margin-left:0;margin-right:0}.hopms{transform:translateY(6px)}.hoplbl{font-size:18px}.hopms{font-size:19px}}@media (width<=620px){.hoplbl{font-size:22px}.hopms{font-size:23px}}@media (width<=560px){.hoplbl{font-size:24px}.hopms{font-size:25px}}@media (width<=500px){.hoplbl{font-size:27px}.hopms{font-size:28px}}@media (width<=420px){.hoplbl{font-size:32px}.hopms{font-size:33px}}@media (width<=360px){.hoplbl{font-size:37px}.hopms{font-size:34px}}.rv{opacity:0;transition:opacity .8s,transform .8s cubic-bezier(.2,.7,.2,1);transform:translateY(22px)}.rv.in{opacity:1;transform:none}.about p{letter-spacing:-.015em;max-width:19.23em;margin:0 0 1.1em;font-size:clamp(1.15rem,2.2vw,1.9rem);line-height:1.48}.about p:last-child{color:var(--muted);max-width:33.332em;font-size:clamp(.98rem,1.4vw,1.14rem);line-height:1.66}.rows{border-top:1px solid var(--line)}.row{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,3fr) minmax(0,7fr);gap:clamp(16px,4vw,64px);padding:clamp(24px,3.4vw,40px) 0;transition:background .3s;display:grid}.row:hover{background:#a78bfa09}.row h3{font-family:var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--violet);margin:0;font-size:clamp(.95rem,1.5vw,1.18rem);font-weight:500}.row p{color:var(--muted);max-width:37.178em;margin:0;font-size:clamp(.95rem,1.2vw,1.06rem);line-height:1.66}.row .stack{font-family:var(--mono);letter-spacing:.08em;margin:14px 0 0;font-size:clamp(.78rem,1vw,.86rem)}.row .repo{font-family:var(--mono);letter-spacing:.02em;text-transform:none;color:var(--muted);border-bottom:1px solid #a78bfa4d;margin-top:12px;padding-bottom:2px;font-size:clamp(.78rem,1vw,.86rem);text-decoration:none;transition:all .25s;display:inline-block}.row .repo:hover{color:var(--violet);border-color:var(--violet)}.spec{grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));gap:0 clamp(24px,5vw,72px);margin:0;padding:0;list-style:none;display:grid}.spec li{font-family:var(--mono);letter-spacing:.04em;border-bottom:1px solid var(--line);color:var(--text);align-items:baseline;gap:14px;padding:14px 0;font-size:clamp(.82rem,1.1vw,.94rem);display:flex}.spec li:before{content:"—";color:var(--magenta);flex:none}.note{color:var(--muted);max-width:34.614em;margin:26px 0 0;font-size:.95rem;line-height:1.66}.tl{gap:0;display:grid}.tl .item{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,2fr) minmax(0,8fr);gap:clamp(16px,4vw,56px);padding:clamp(20px,2.6vw,30px) 0;display:grid}.tl .item:first-child{border-top:1px solid var(--line)}.tl .yr{font-family:var(--mono);letter-spacing:.14em;color:var(--magenta);font-size:.86rem}.tl .body strong{margin-bottom:5px;font-size:clamp(1rem,1.4vw,1.16rem);font-weight:500;display:block}.tl .body span{color:var(--muted);font-size:.95rem;line-height:1.6}#contact{padding-bottom:clamp(70px,10vh,120px)}.mailto{letter-spacing:-.03em;color:var(--text);word-break:break-all;border-bottom:1px solid #a78bfa4d;padding-bottom:6px;font-size:clamp(1.5rem,5vw,3.4rem);font-weight:700;text-decoration:none;transition:all .25s;display:inline-block}.mailto:hover{color:var(--magenta);border-color:var(--magenta)}.links{font-family:var(--mono);letter-spacing:.24em;text-transform:uppercase;flex-wrap:wrap;gap:28px;margin-top:38px;font-size:11.5px;display:flex}.links a{color:var(--muted);border-bottom:1px solid #0000;padding-bottom:3px;text-decoration:none;transition:all .2s}.links a:hover{color:var(--violet);border-color:var(--violet)}a:focus-visible,button:focus-visible{outline:2px solid var(--magenta);outline-offset:3px;border-radius:1px}footer{padding:26px var(--pad);border-top:1px solid var(--line);font-family:var(--mono);letter-spacing:.22em;text-transform:uppercase;color:var(--muted);flex-wrap:wrap;justify-content:space-between;gap:12px;font-size:10.5px;display:flex}@media (width<=760px){.row,.tl .item{grid-template-columns:1fr;gap:10px}h1{max-width:none}}@media (prefers-reduced-motion:reduce){html:not(.lenis){scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}.path{stroke-dashoffset:0}.node,.hoplbl,.hopms{opacity:.9}.rv{opacity:1;transform:none}}
