.dot-grid{display:flex;align-items:center;justify-content:center;height:100%;width:100%;position:relative}.dot-grid__wrap{width:100%;height:100%;position:relative}.dot-grid__canvas{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none}.target-cursor-wrapper{position:fixed;top:0;left:0;width:0;height:0;pointer-events:none;z-index:9999;mix-blend-mode:difference;transform:translate(-50%,-50%)}.target-cursor-dot{position:absolute;left:50%;top:50%;width:4px;height:4px;background:#fff;border-radius:50%;transform:translate(-50%,-50%);will-change:transform}.target-cursor-corner{position:absolute;left:50%;top:50%;width:12px;height:12px;border:3px solid #fff;will-change:transform}.corner-tl{transform:translate(-150%,-150%);border-right:none;border-bottom:none}.corner-tr{transform:translate(50%,-150%);border-left:none;border-bottom:none}.corner-br{transform:translate(50%,50%);border-left:none;border-top:none}.corner-bl{transform:translate(-150%,50%);border-right:none;border-top:none}.glitch{color:#fff;font-size:clamp(2rem,10vw,8rem);white-space:nowrap;font-weight:900;position:relative;margin:0 auto;-webkit-user-select:none;user-select:none;cursor:pointer}.glitch:after,.glitch:before{content:attr(data-text);position:absolute;top:0;color:#fff;background-color:#120f17;overflow:hidden;clip-path:inset(0 0 0 0)}.glitch:not(.enable-on-hover):after{left:10px;text-shadow:var(--after-shadow, -10px 0 red);animation:animate-glitch var(--after-duration, 3s) infinite linear alternate-reverse}.glitch:not(.enable-on-hover):before{left:-10px;text-shadow:var(--before-shadow, 10px 0 cyan);animation:animate-glitch var(--before-duration, 2s) infinite linear alternate-reverse}.glitch.enable-on-hover:after,.glitch.enable-on-hover:before{content:"";opacity:0;animation:none}.glitch.enable-on-hover:hover:after{content:attr(data-text);opacity:1;left:10px;text-shadow:var(--after-shadow, -10px 0 red);animation:animate-glitch var(--after-duration, 3s) infinite linear alternate-reverse}.glitch.enable-on-hover:hover:before{content:attr(data-text);opacity:1;left:-10px;text-shadow:var(--before-shadow, 10px 0 cyan);animation:animate-glitch var(--before-duration, 2s) infinite linear alternate-reverse}@keyframes animate-glitch{0%{clip-path:inset(20% 0 50% 0)}5%{clip-path:inset(10% 0 60% 0)}10%{clip-path:inset(15% 0 55% 0)}15%{clip-path:inset(25% 0 35% 0)}20%{clip-path:inset(30% 0 40% 0)}25%{clip-path:inset(40% 0 20% 0)}30%{clip-path:inset(10% 0 60% 0)}35%{clip-path:inset(15% 0 55% 0)}40%{clip-path:inset(25% 0 35% 0)}45%{clip-path:inset(30% 0 40% 0)}50%{clip-path:inset(20% 0 50% 0)}55%{clip-path:inset(10% 0 60% 0)}60%{clip-path:inset(15% 0 55% 0)}65%{clip-path:inset(25% 0 35% 0)}70%{clip-path:inset(30% 0 40% 0)}75%{clip-path:inset(40% 0 20% 0)}80%{clip-path:inset(20% 0 50% 0)}85%{clip-path:inset(10% 0 60% 0)}90%{clip-path:inset(15% 0 55% 0)}95%{clip-path:inset(25% 0 35% 0)}to{clip-path:inset(30% 0 40% 0)}}.text-type{display:inline-block;white-space:pre-wrap}.text-type__cursor{margin-left:.25rem;display:inline-block;opacity:1}.text-type__cursor--hidden{display:none}.scroll-float{overflow:hidden}.scroll-float-text{display:inline-block;font-size:clamp(1.6rem,8vw,10rem);font-weight:900;text-align:center;line-height:1.5}.char{display:inline-block}.parallax{position:relative;overflow:hidden}.scroller{display:flex;white-space:nowrap;text-align:center;font-family:sans-serif;font-size:2.25rem;font-weight:700;letter-spacing:-.02em;filter:drop-shadow(0 1px 1px rgba(0,0,0,.1))}.scroller span{flex-shrink:0}@media(min-width:768px){.scroller{font-size:5rem;line-height:5rem}}.pixel-canvas{width:100%;height:100%;display:block}.pixel-card{height:400px;width:300px;position:relative;overflow:hidden;display:grid;place-items:center;aspect-ratio:4 / 5;border:1px solid #27272a;border-radius:25px;isolation:isolate;transition:border-color .2s cubic-bezier(.5,1,.89,1);-webkit-user-select:none;user-select:none}.pixel-card:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;aspect-ratio:1;background:radial-gradient(circle,#09090b,transparent 85%);opacity:0;transition:opacity .8s cubic-bezier(.5,1,.89,1)}.pixel-card:hover:before,.pixel-card:focus-within:before{opacity:1}:root{--bg: #0d0d0d;--bg-raise: #121212;--txt: #f4f4f4;--dim: #8a8a8a;--dimmer: #5c5c5c;--line: #242424;--accent: #ff4b33;--mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--ease: cubic-bezier(.16, 1, .3, 1);color-scheme:dark}*{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}::selection{background:var(--accent);color:var(--bg)}body{background:var(--bg);color:var(--txt);font-family:var(--mono);font-size:15px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}a{color:var(--txt);text-decoration:none;transition:color .25s var(--ease)}a:hover{color:var(--accent)}a:focus-visible,button:focus-visible{outline:1px solid var(--accent);outline-offset:3px}button{font-family:var(--mono);background:none;border:0;color:inherit;cursor:pointer}.wrap{max-width:1200px;margin:0 auto;padding:0 24px}.dotgrid-bg{position:fixed;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;opacity:.8}main,nav,footer{position:relative;z-index:1}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}nav{position:fixed;top:0;left:0;right:0;z-index:100;height:64px;background:#0d0d0d00;border-bottom:1px solid transparent;transition:background .35s var(--ease),border-color .35s var(--ease)}nav.scrolled{background:#0d0d0de0;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-bottom-color:var(--line)}nav .wrap{height:64px;display:flex;align-items:center;justify-content:space-between;gap:16px}.logo{font-weight:800;font-size:16px;letter-spacing:.04em;flex-shrink:0}.logo .caret{color:var(--accent);animation:blink 1.1s steps(1) infinite}.nav-right{display:flex;align-items:center;gap:22px}.nav-links{display:flex;gap:22px;font-size:13px}.nav-links a{color:var(--dim)}.nav-links a:hover{color:var(--accent)}.nav-links a:before{content:"[ ";color:var(--dimmer)}.nav-links a:after{content:" ]";color:var(--dimmer)}.resume-btn{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--accent);border:1px solid var(--accent);padding:7px 14px;flex-shrink:0;transition:background .2s var(--ease),color .2s var(--ease);white-space:nowrap}.resume-btn:hover{background:var(--accent);color:var(--bg)}.hero{min-height:100dvh;display:flex;align-items:center;padding-top:64px}.hero-role{font-size:13px;color:var(--dim);margin-bottom:20px}h1{font-size:clamp(40px,8.5vw,104px);font-weight:800;line-height:1.02;letter-spacing:-.03em;text-transform:uppercase}h1 .line{display:block;padding-bottom:.08em}.hero-sub{margin-top:28px;max-width:52ch;color:var(--dim);font-size:15px;min-height:3.2em}.hero-cta{display:inline-block;margin-top:36px;font-size:14px;color:var(--txt);border:1px solid var(--line);padding:13px 26px;transition:border-color .25s var(--ease),color .25s var(--ease),transform .15s var(--ease)}.hero-cta:hover{border-color:var(--accent);color:var(--accent)}.hero-cta:active{transform:translateY(1px)}.block-cursor{color:var(--accent);animation:blink 1.1s steps(1) infinite}.hero-role,.hero-sub,.hero-cta{animation:fade-up .9s var(--ease) both}.hero-sub{animation-delay:.55s}.hero-cta{animation-delay:.9s}@keyframes fade-up{0%{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}.reveal{opacity:0;transform:translateY(30px);transition:opacity .8s var(--ease),transform .8s var(--ease)}.reveal.in{opacity:1;transform:none}section{padding:120px 0}.sec-head{display:flex;align-items:baseline;gap:18px;margin-bottom:64px}.sec-head .num{font-size:13px;color:var(--accent);font-weight:500}.sec-head .scroll-float{overflow:hidden;margin:0}.sec-head .scroll-float-text{font-family:var(--mono);font-size:clamp(24px,3.4vw,38px);font-weight:800;letter-spacing:-.02em;text-transform:lowercase;text-align:left;line-height:1.25;color:var(--txt)}.sec-head .rule{flex:1;height:1px;background:var(--line)}.work-stack{display:flex;flex-direction:column;gap:28px;padding-bottom:6vh}.stack-card.panel{position:sticky;top:calc(88px + var(--i, 0) * 26px);min-height:20rem;padding:0;border:1px solid var(--line);background-color:var(--bg-raise);box-shadow:0 -10px 40px #0000008c;display:grid;grid-template-columns:1.1fr 1fr}.panel .viz{position:relative;overflow:hidden;border-right:1px solid var(--line);min-height:20rem}.panel .viz canvas{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block}.panel .meta{padding:30px 28px;display:flex;flex-direction:column;gap:12px}.panel-idx{font-size:12px;color:var(--dimmer)}.panel h3{font-size:22px;font-weight:700;letter-spacing:-.01em}.panel .stack{font-size:11.5px;color:var(--dimmer)}.panel p{font-size:13.5px;color:var(--dim);max-width:70ch}.panel .stat{font-size:12px;color:var(--dimmer);display:flex;flex-wrap:wrap;gap:6px 0}.panel .stat span{color:var(--txt);font-weight:500}.panel .stat span+span:before{content:" + ";color:var(--accent);font-weight:400}.panel .links{margin-top:auto;padding-top:10px;display:flex;gap:18px;font-size:13px}.panel .links a{color:var(--dim);position:relative;z-index:1}.panel .links a:hover{color:var(--accent)}.panel .links a:before{content:"[ ";color:var(--dimmer)}.panel .links a:after{content:" ]";color:var(--dimmer)}.exp-grid{display:grid;grid-template-columns:4fr 8fr;gap:64px;align-items:start}.exp-nav{display:flex;flex-direction:column;border-left:1px solid var(--line);position:relative}.exp-fill{position:absolute;left:-1px;top:0;width:1px;height:64px;background:var(--accent);transform:translateY(calc(var(--active, 0) * 64px));transition:transform .35s var(--ease)}.exp-nav button{text-align:left;height:64px;padding:0 0 0 22px;font-size:13px;color:var(--dimmer);transition:color .3s var(--ease)}.exp-nav button .co{display:block;font-size:14px;font-weight:700;color:inherit;line-height:1.3}.exp-nav button .yr{display:block;font-size:11px;margin-top:2px;line-height:1.3}.exp-nav button:hover{color:var(--dim)}.exp-nav button.is-active{color:var(--txt)}.exp-nav button.is-active .yr{color:var(--accent)}.exp-item{display:flex;flex-direction:column;gap:14px;animation:exp-in .45s var(--ease)}@keyframes exp-in{0%{opacity:0;transform:translateY(24px)}to{opacity:1;transform:none}}.exp-when{font-size:12px;color:var(--dimmer)}.exp-item h3{font-size:clamp(22px,2.6vw,30px);font-weight:800;letter-spacing:-.02em}.exp-role{font-size:14px;color:var(--accent)}.exp-points{list-style:none}.exp-points li{font-size:13.5px;color:var(--dim);max-width:58ch;padding-left:20px;position:relative}.exp-points li+li{margin-top:10px}.exp-points li:before{content:"+";position:absolute;left:0;color:var(--accent)}.exp-tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px}.exp-tags span{font-size:11px;color:var(--dimmer);border:1px solid var(--line);padding:4px 10px}.ticker{border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:22px 0;margin-bottom:64px}.ticker .scroller{font-family:var(--mono);font-size:clamp(22px,3.2vw,44px);line-height:1.3;font-weight:800;letter-spacing:-.02em;color:var(--dim);filter:none}.ticker .parallax+.parallax{margin-top:10px}.ticker .parallax:nth-child(2) .scroller{color:var(--dimmer);-webkit-text-stroke:1px var(--dimmer);-webkit-text-fill-color:transparent}@media(min-width:768px){.ticker .scroller{font-size:clamp(22px,3.2vw,44px);line-height:1.3}}.skills-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px}.pixel-card.skill-group{width:100%;height:auto;aspect-ratio:auto;display:block;position:relative;border:1px solid var(--line);border-radius:0;background:var(--bg-raise);padding:28px;-webkit-user-select:auto;user-select:auto}.pixel-card.skill-group:hover{border-color:#3d3d3d}.pixel-card.skill-group:before{display:none}.pixel-card.skill-group .pixel-canvas{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;opacity:.3}.skill-inner{position:relative;z-index:1}.skill-group h3{font-size:13px;font-weight:700;color:var(--dim);margin-bottom:18px;text-transform:lowercase}.skill-group h3 b{color:var(--accent);font-weight:500;margin-right:8px}.skill-tags{display:flex;flex-wrap:wrap;gap:10px}.tag{font-size:12px;color:var(--dim);border:1px solid var(--line);padding:7px 12px}.tag:hover{border-color:var(--accent);color:var(--txt)}.skill-group .tag{opacity:0;transform:translateY(10px);transition:opacity .5s var(--ease),transform .5s var(--ease),border-color .25s var(--ease),color .25s var(--ease);transition-delay:calc(var(--i) * 35ms)}.reveal.in .skill-group .tag{opacity:1;transform:none}.skill-group .tag:hover{transition-delay:0ms}.about-bio{max-width:68ch}.about-bio p{font-family:var(--mono);font-size:clamp(16px,2vw,22px);line-height:1.65;font-weight:500;color:var(--txt)}.about-bio p+p{margin-top:20px;color:var(--dim)}.type-line{margin-top:36px;font-size:14px;color:var(--dimmer)}.type-line .typed{color:var(--accent)}.contact{text-align:center;padding:160px 0 140px}.contact .num{font-size:13px;color:var(--accent)}.contact h2{margin-top:8px}.contact h2 .glitch{font-family:var(--mono);font-size:clamp(30px,6vw,72px);font-weight:800;letter-spacing:-.03em;line-height:1.05;color:var(--txt)}.contact h2 .glitch:after,.contact h2 .glitch:before{background-color:var(--bg);color:var(--txt)}.contact .email{display:inline-block;margin-top:34px;font-size:clamp(16px,2.4vw,24px);color:var(--dim);position:relative}.contact .email:after{content:"";position:absolute;left:0;bottom:-4px;height:1px;width:100%;background:var(--accent);transform:scaleX(0);transform-origin:left;transition:transform .4s var(--ease)}.contact .email:hover{color:var(--txt)}.contact .email:hover:after{transform:scaleX(1)}.socials{margin-top:44px;display:flex;justify-content:center;gap:26px;font-size:13px}.socials a{color:var(--dim)}.socials a:before{content:"[ ";color:var(--dimmer)}.socials a:after{content:" ]";color:var(--dimmer)}footer{border-top:1px solid var(--line);padding:28px 0}footer .wrap{display:flex;justify-content:space-between;font-size:12px;color:var(--dimmer)}@media(max-width:860px){section{padding:88px 0}.skills-grid{grid-template-columns:1fr}.stack-card.panel{grid-template-columns:1fr;position:static}.panel .viz{border-right:0;border-bottom:1px solid var(--line);min-height:220px}.exp-grid{display:block}.exp-nav{flex-direction:row;overflow-x:auto;border-left:0;border-bottom:1px solid var(--line);margin-bottom:40px}.exp-fill{display:none}.exp-nav button{height:auto;padding:12px 16px 12px 0;white-space:nowrap}}@media(max-width:640px){.nav-links{gap:10px;font-size:11px}.resume-btn span{display:none}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.block-cursor,.logo .caret,.exp-item,.hero-role,.hero-sub,.hero-cta{animation:none}.reveal,.skill-group .tag{opacity:1;transform:none;transition:none}.dotgrid-bg{display:none}}
