@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
:root{color-scheme:dark;--bg:#0b090e;--text:#eeeaf3;--muted:#a29aa9;--purple:#c5a7ed;--line:#ffffff1c}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:100px}body{margin:0;background:var(--bg);color:var(--text);font:16px/1.65 Inter,Arial,sans-serif;overflow-x:clip}a{color:inherit;text-decoration:none}button{font:inherit}a,button,summary{touch-action:manipulation}a:focus-visible,button:focus-visible,summary:focus-visible{outline:2px solid var(--purple);outline-offset:8px}.skip{position:fixed;top:-100px;left:20px;padding:12px;background:var(--purple);color:#111;z-index:100}.skip:focus{top:10px}header{height:94px;position:fixed;inset:0 0 auto;z-index:30;padding:0 3%;display:flex;align-items:center;gap:30px;background:linear-gradient(#0b090ef5,#0b090e00);transition:background .3s}body.scrolled header{background:#0b090eed;backdrop-filter:blur(16px)}.logo{font-size:19px;letter-spacing:-1px;font-weight:800}.header-note{margin-left:auto;font-size:12px;letter-spacing:1.8px;color:#c7becf}nav{display:flex;gap:48px;margin-left:55px}nav a{font-size:14px;font-weight:700;transition:color .2s}nav a:hover,nav a.active{color:var(--purple)}.languages{display:flex;align-items:center;gap:6px;font-size:12px}.languages button{background:none;border:0;color:#807786;cursor:pointer;font-size:12px;padding:7px 3px}.languages button[aria-pressed=true]{color:var(--purple)}.languages>span{color:#49424f}.side-nav{position:fixed;left:3%;bottom:11%;z-index:20;display:flex;flex-direction:column;gap:29px}.side-nav a{font-size:20px;font-weight:700;line-height:1.5;color:#d9d1e0;transition:color .2s}.side-nav a:first-child{font-size:16px}.side-nav a:hover{color:#bd83ff}.resume-link{position:fixed;right:3%;bottom:6%;display:flex;gap:9px;align-items:center;z-index:20;color:#b0a8b9;font-size:12px;letter-spacing:4px}.resume-link:hover{color:#fff}.cursor-light{position:fixed;left:-80px;top:-80px;width:160px;height:160px;border-radius:50%;background:radial-gradient(circle,#b66efb44,transparent 65%);pointer-events:none;z-index:40;will-change:transform;mix-blend-mode:screen}.hero{min-height:740px;height:100svh;max-height:1100px;position:relative;isolation:isolate;overflow:hidden}.hero-aura{position:absolute;left:50%;bottom:-5%;width:65%;height:75%;transform:translateX(-50%);z-index:-1;background:radial-gradient(ellipse,#9a4bd133,transparent 64%)}.hero:after{content:'';position:absolute;width:240px;height:440px;right:-180px;top:25%;background:#9d47df;filter:blur(75px);opacity:.4;z-index:-1}.intro{position:absolute;left:11%;top:34%;z-index:3}.hello{color:var(--purple);font-size:25px;line-height:1.3;margin:0 0 8px;letter-spacing:1px}h1{font-size:clamp(32px,3.25vw,52px);font-weight:600;line-height:1.08;letter-spacing:-1.3px;margin:0}.avatar-stage{position:absolute;left:50%;bottom:-17%;height:94%;width:57%;max-width:780px;transform:translateX(-50%);z-index:2;pointer-events:none;will-change:transform}.hero-avatar{width:100%;height:100%;object-fit:contain;object-position:bottom center;filter:drop-shadow(0 0 26px #b248d817);transform:translate(var(--avatar-x,0),var(--avatar-y,0));transition:transform .8s cubic-bezier(.2,.7,.2,1)}.hero-roles{position:absolute;top:46%;left:69%;width:30%;z-index:3}.hero-roles>.hello{font-size:22px;display:block}.role-lines{position:relative;min-height:125px}.role-lines>span{font-size:clamp(25px,3vw,45px);font-weight:700;letter-spacing:-1.4px;line-height:1.02;white-space:pre-line;display:block}.role-purple{color:#a974d9;opacity:.58;transform:translateY(-6px)}.role-white{position:absolute;top:33px;left:14px;text-shadow:0 3px 20px #0b090e99}.scroll-cue{position:absolute;left:50%;bottom:26px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;transform:translateX(-50%);font-size:9px;letter-spacing:2.5px}.scroll-cue>span{height:27px;width:16px;border:1px solid #cfb9e477;border-radius:12px;position:relative}.scroll-cue>span:after{content:'';position:absolute;width:2px;height:6px;background:#ece2f8;top:6px;left:6px;animation:scrollHint 2s infinite}.scroll-cue b{font-weight:400}.section{max-width:1250px;margin:0 auto;padding:115px 9%;position:relative}h2{font-size:clamp(40px,5vw,68px);line-height:1.1;font-weight:500;letter-spacing:-2px;white-space:pre-line;margin:0 0 60px}h3,h4,h5{line-height:1.3}p{margin:0 0 22px}.eyebrow{font-size:14px;letter-spacing:4px;color:#c2abda;font-weight:500}.about{display:grid;grid-template-columns:40% 60%;gap:30px;min-height:790px;align-items:center}.about-portrait{height:590px;position:relative;margin-left:-95px;overflow:hidden;mask-image:linear-gradient(#000 74%,transparent)}.about-portrait:before{content:'';position:absolute;inset:20% 15%;background:#773bac40;filter:blur(60px);border-radius:50%}.about-portrait img{position:relative;width:100%;height:100%;object-fit:cover;object-position:48% top;transform:rotate(-5deg) scale(1.1)}.about h2{font-size:40px;line-height:1.15;margin-bottom:30px;letter-spacing:-1.4px;color:#d9c4f1}.about p:not(.eyebrow){font-size:19px;line-height:1.7;color:#aca2b5}.about .about-lead{color:#e3dcea!important;font-size:23px!important}.services{padding-top:50px;padding-bottom:130px}.services>h2{font-size:clamp(42px,7vw,94px);font-weight:700;color:#dcd5e5;letter-spacing:-3px}.services-grid{display:grid;grid-template-columns:1fr 1fr;gap:70px}.services article{position:relative;border-top:1px dashed #b7a1cc66;padding-top:35px}.service-symbol{font-size:54px;font-weight:500;color:var(--purple)}.services h3{font-size:29px;font-weight:600;letter-spacing:-1px;margin:15px 0}.services h4{font-weight:500;font-size:19px;color:#c8b6dd;margin:0 0 20px}.services p{color:var(--muted);font-size:16px}.services h5{font-size:14px;margin:30px 0 15px;font-weight:500}.tags{display:flex;flex-wrap:wrap;gap:9px}.tags span{font-size:12px;padding:5px 11px;border:1px solid #bba2d336;border-radius:4px;color:#c4b4d3}.experience{padding-top:55px}.experience h2{text-align:center;color:var(--purple);max-width:580px;margin:0 auto 100px}.timeline article{display:grid;grid-template-columns:170px 1fr;gap:55px;position:relative;padding:0 0 72px}.timeline article:before{content:'';position:absolute;left:196px;width:1px;top:10px;bottom:0;background:linear-gradient(#c9a2ea99,#9b66bc22)}.timeline article:after{content:'';position:absolute;left:191px;top:7px;width:11px;height:11px;border-radius:50%;background:#c394e5;box-shadow:0 0 23px #ae62ed88}.when{font-size:18px;line-height:1.4;font-weight:500;color:#c99feb;text-align:right;white-space:pre-line}.job-kind{font-size:12px;letter-spacing:2px;color:#978ba1}.timeline h3{font-size:29px;font-weight:500;letter-spacing:-.8px;margin:10px 0}.timeline h4{font-size:17px;font-weight:400;color:#b999d4;margin:0 0 19px}.timeline p{font-size:16px;color:var(--muted);max-width:650px}.work{padding-top:50px}.section-title{display:flex;align-items:center;justify-content:space-between}.section-title h2{font-size:82px;letter-spacing:-3px;margin-bottom:65px}.small{font-size:11px;letter-spacing:2px}.section-title>.small{color:#897895;max-width:140px;margin-bottom:60px}.project{display:grid;grid-template-columns:1fr 1fr;gap:48px;border-top:1px solid var(--line);padding-top:42px;margin-bottom:85px}.project-info{position:relative}.project-meta{display:flex;justify-content:space-between;gap:20px;font-size:11px;letter-spacing:2px;color:#a389b8;align-items:center}.project-meta>span:last-child{font-size:57px;line-height:1;font-weight:500;letter-spacing:-4px;color:#d3b5ee}.project h3{font-size:35px;letter-spacing:-1px;margin:22px 0}.project p{color:var(--muted);font-size:16px}.project-visual,.learning-visual{min-height:350px;display:flex;flex-direction:column;justify-content:space-between;padding:27px;background:linear-gradient(135deg,#d2b5f0,#8c60b7);color:#261735;border-radius:0;transition:transform .4s}.project:hover .project-visual,.project:hover .learning-visual{transform:translateY(-6px)}.project-wordmark{font-size:clamp(42px,6vw,80px);letter-spacing:-5px;font-weight:600}.project-wordmark span{font-size:20px;letter-spacing:0;vertical-align:top}.project-caption{display:flex;justify-content:space-between;gap:20px;font-size:10px;letter-spacing:1.5px}.learning-visual{background:#17111f;border:1px solid #553c6b;color:#c8b7dd}.code-art{font-family:monospace;font-size:38px;line-height:1.5;color:#776582}.code-art span{color:#c2a0e5}.code-art b{color:#ece3f6;font-weight:400;padding-left:20px}details{margin-top:24px}summary{font-size:14px;list-style:none;display:flex;align-items:center;justify-content:space-between;cursor:pointer;border-bottom:1px solid var(--line);padding:12px 0}summary::-webkit-details-marker{display:none}summary:after{content:'+';font-size:24px;color:var(--purple)}details[open] summary:after{content:'−'}.detail{padding-top:18px}.detail h4{font-size:17px;margin:0 0 12px}.detail p{font-size:15px}.stack{padding-top:20px;padding-bottom:120px}.stack h2{text-align:center;font-weight:600;letter-spacing:-3px;font-size:64px}.stack-groups{display:flex;flex-wrap:wrap;justify-content:center;gap:16px}.stack-groups>div{display:contents}.stack-groups h3{display:none}.stack-tags{display:contents}.stack-tags>span{width:125px;min-height:125px;padding:20px 10px 15px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:13px;border:1px solid #3f2b504f;border-radius:12px;background:#17121d;font-size:13px;color:#c7bdcf;transition:transform .25s,border-color .25s}.stack-tags>span:hover{transform:translateY(-8px);border-color:#a571d9}.stack-tags img{width:43px;height:43px;object-fit:contain}.stack-tags .tech-fallback{font-size:28px;line-height:43px;color:var(--purple);font-weight:700;letter-spacing:-1px}.closing{max-width:1250px;margin:auto;padding:90px 9% 50px;border-top:1px solid var(--line)}.closing h2{font-size:clamp(65px,10vw,140px);letter-spacing:-6px;font-weight:600;line-height:1.02;margin:50px 0}.closing h2 span{color:#bb91e3}.closing-bottom{display:flex;justify-content:space-between;align-items:center;gap:25px;color:#9c8cab}.closing-bottom p{white-space:pre-line}.text-link{font-size:12px;letter-spacing:3px}.text-link:hover{color:#e5c8ff}footer{max-width:1250px;margin:0 auto;padding:32px 9% 80px;display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--line);color:#877a93;font-size:12px}footer .logo{font-size:24px;font-weight:700;color:#c3a4e4}footer .logo span{display:none}.reveal{opacity:0;transform:translateY(30px);transition:opacity .8s,transform .8s}.reveal.visible{opacity:1;transform:none}@keyframes scrollHint{0%,100%{transform:translateY(0);opacity:.4}50%{transform:translateY(6px);opacity:1}}@media(min-width:1600px){.intro{left:16%}.hero-roles{left:69%;width:26%}.avatar-stage{height:96%}}@media(max-width:1100px){header{gap:22px}nav{gap:25px;margin-left:20px}.header-note{font-size:10px}.intro{left:10%;top:33%}.hero-roles{left:70%;width:29%}.hero-roles>.hello{font-size:18px}.role-lines>span{font-size:28px}.avatar-stage{width:64%;height:94%;bottom:-13%}.services-grid{gap:35px}.about-portrait{margin-left:-40px}.about{gap:25px}.about .about-lead{font-size:20px!important}.about h2{font-size:35px}.timeline article{gap:40px}.timeline article:before{left:187px}.timeline article:after{left:182px}.section{padding-inline:10%}.project{gap:25px}.project h3{font-size:29px}.stack-tags>span{width:110px;min-height:110px}}@media(max-width:700px){header{height:77px;padding:0 6%;gap:15px}.header-note{display:none}nav{margin-left:auto;gap:17px}nav a{font-size:10px}nav a:last-child{display:none}.languages{gap:3px}.languages button{font-size:11px}.logo{font-size:17px}.side-nav,.resume-link,.cursor-light{display:none}.hero{height:850px;min-height:740px;max-height:950px}.intro{left:8%;top:140px}.hello{font-size:20px}h1{font-size:36px;letter-spacing:-1px}.avatar-stage{width:94%;height:68%;bottom:15px;max-width:580px}.hero-roles{top:300px;left:auto;right:7%;width:47%;text-align:right}.hero-roles>.hello{font-size:15px}.role-lines>span{font-size:23px;letter-spacing:-.9px}.role-white{top:28px;left:auto;right:-5px}.hero-aura{width:110%;height:65%;bottom:0}.scroll-cue{bottom:22px}.section{padding:75px 7%}.about{grid-template-columns:1fr;gap:0;min-height:0}.about-portrait{display:none}.about h2{font-size:40px}.about .about-lead{font-size:23px!important}.about p:not(.eyebrow){font-size:17px}.eyebrow{font-size:12px;letter-spacing:3px}h2{font-size:40px;margin-bottom:40px;letter-spacing:-1.5px}.services>h2{font-size:47px;letter-spacing:-2px}.services-grid{grid-template-columns:1fr;gap:50px}.services h3{font-size:28px}.service-symbol{font-size:42px}.experience h2{margin-bottom:60px}.timeline article{grid-template-columns:1fr;gap:10px;padding:0 0 45px 25px}.timeline article:before{left:0;top:10px}.timeline article:after{left:-5px;top:10px}.when{text-align:left;font-size:19px}.timeline h3{font-size:25px;line-height:1.3}.timeline h4{font-size:16px}.timeline p{font-size:16px}.section-title h2{font-size:56px;letter-spacing:-2px;margin-bottom:40px}.section-title>.small{display:none}.project{grid-template-columns:1fr;gap:25px;margin-bottom:50px;padding-top:28px}.project-visual,.learning-visual{min-height:310px}.teaching .learning-visual{grid-row:1}.project-wordmark{font-size:70px}.project h3{font-size:30px}.stack h2{font-size:39px;letter-spacing:-1.8px;margin-bottom:40px}.stack-groups{gap:10px}.stack-tags>span{width:calc((100% - 20px)/3);min-height:115px;font-size:12px;padding-inline:5px}.stack-tags img{width:37px;height:37px}.closing{padding:65px 7% 25px}.closing .eyebrow{font-size:10px;letter-spacing:1.5px}.closing h2{font-size:clamp(45px,11vw,78px);letter-spacing:-3px;margin:30px 0}.closing-bottom{align-items:start;flex-direction:column;gap:10px}footer{padding:30px 7%;gap:20px}footer>span:last-child{display:none}.reveal{transform:translateY(15px)}}@media(max-height:750px) and (min-width:701px){.hero{min-height:700px}.avatar-stage{bottom:-18%;height:98%}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{animation:none!important;transition:none!important}.cursor-light{display:none}.reveal{opacity:1;transform:none}.hero-avatar{transform:none}}
/* Two readable role states, with no overlaid text. */
.role-lines{min-height:145px;isolation:isolate}.role-lines>span{position:absolute;inset:0 auto auto 0;max-width:100%;opacity:0;transform:translateY(8px);white-space:pre-line}.role-purple{animation:rolePurple 10s infinite;color:#b288da}.role-white{animation:roleWhite 10s infinite;text-shadow:none}@keyframes roleWhite{0%,42%,100%{opacity:1;transform:translateY(0)}48%,92%{opacity:0;transform:translateY(-10px)}}@keyframes rolePurple{0%,42%,100%{opacity:0;transform:translateY(10px)}48%,92%{opacity:1;transform:translateY(0)}}@media(max-width:700px){.role-lines>span{left:auto;right:0}}@media(prefers-reduced-motion:reduce){.role-lines .role-white{opacity:1;transform:none}.role-lines .role-purple{display:none}}

.header-email{font-size:13px;letter-spacing:0;font-weight:600}.education{padding-top:0}.education h2{color:#c5a7ed}.education-grid{display:grid;grid-template-columns:1fr 1fr;gap:50px}.education-grid article{border-top:1px dashed #8f65ad88;padding-top:25px}.education-year{font-size:23px;color:#aa78cc}.education-grid h3{font-size:25px;font-weight:500;margin:15px 0}.education-grid p{font-size:16px;color:var(--muted)}.honor{font-size:11px;letter-spacing:2px;color:#d3adef}.courses{margin-top:40px;max-width:720px}.courses ul{padding-left:18px;color:var(--muted);font-size:16px;line-height:2}.language-note{font-size:14px;color:#a590b4;margin-top:20px}.contact-grid{display:grid;grid-template-columns:1.5fr 1fr 1fr;gap:30px;margin:55px 0}.contact-grid>div>span{font-size:11px;letter-spacing:2px;display:block;color:#c6a3e1;margin-bottom:12px}.contact-grid a,.contact-grid p{font-size:15px;color:#c5bccd;overflow-wrap:anywhere}.contact-grid a:hover{color:#fff}.cv-mobile{display:none}.stack-tags img[src*="github"]{filter:invert(1)}@media(max-width:1100px){.header-email{font-size:11px}nav{margin-left:10px;gap:22px}.contact-grid{grid-template-columns:1fr 1fr}.contact-grid>div:first-child{grid-column:1/-1}}@media(max-width:700px){.education-grid{grid-template-columns:1fr;gap:35px}.education h2{font-size:40px}.contact-grid{grid-template-columns:1fr;gap:24px;margin:35px 0}.cv-mobile{display:inline-block}.closing-bottom{gap:24px}nav a:last-child{display:block}nav{gap:13px}nav a{font-size:9px}.languages{gap:2px}}