:root{--y:#ffd93d;--bg:#fff9e0;--ink:#111;--card:#fff;--pink:#ff6b9d;--blue:#4d96ff;--mint:#6bcb77;--r:18px;--b:3px solid var(--ink);--sh:5px 5px 0 var(--ink);--f:'Space Grotesk','Segoe UI',system-ui,sans-serif;--t:'Inter',system-ui,-apple-system,'Segoe UI',sans-serif}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scroll-padding-top:96px}
body{font-family:var(--t);background:var(--bg);color:var(--ink);line-height:1.65;background-image:radial-gradient(#11111322 1.2px,transparent 1.2px);background-size:22px 22px;overflow-x:hidden}
a{color:inherit;text-decoration:none}ul,ol{list-style:none}
h1,h2,h3,.logo,.btn{font-family:var(--f)}
:focus-visible{outline:3px solid var(--blue);outline-offset:3px}
.wrap{width:min(1120px,100% - 2.5rem);margin-inline:auto}
.i{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.nav-wrap{position:sticky;top:0;z-index:50;padding:calc(.75rem + env(safe-area-inset-top,0px)) 1.25rem .5rem}
.nav{max-width:1120px;margin:auto;background:#fff;border:var(--b);border-radius:999px;box-shadow:var(--sh);display:flex;align-items:center;justify-content:space-between;padding:.5rem .6rem;position:relative}
.logo{font-weight:700;font-size:1.2rem;display:flex;align-items:center;gap:.5rem}
.mono{background:var(--y);border:var(--b);border-radius:12px;width:38px;height:38px;display:grid;place-items:center;font-size:1.05rem}
.menu{display:flex;gap:.25rem;align-items:center}
.menu a{display:block;padding:.45rem .9rem;border-radius:999px;font:600 .95rem var(--f);border:2px solid transparent;transition:.2s}
.menu a:hover{border-color:var(--ink);background:var(--bg)}
.menu a.active{background:var(--y);border-color:var(--ink)}
.burger{display:none;width:46px;height:42px;border:var(--b);border-radius:14px;background:var(--y);cursor:pointer;position:relative;transition:background .4s,transform .25s,box-shadow .3s}
.burger:active{transform:scale(.92)}
.burger span{position:absolute;left:50%;top:50%;width:20px;height:3px;margin:-1.5px 0 0 -10px;background:var(--ink);border-radius:3px;transition:transform .55s cubic-bezier(.65,0,.35,1),opacity .25s,width .35s;will-change:transform}
.burger span:nth-child(1){transform:translateY(-7px)}
.burger span:nth-child(2){width:13px}
.burger span:nth-child(3){transform:translateY(7px)}
.burger:hover span:nth-child(2){width:20px}
.burger[aria-expanded=true]{background:var(--pink)}
.burger[aria-expanded=true] span:nth-child(1){transform:rotate(45deg)}
.burger[aria-expanded=true] span:nth-child(2){opacity:0;width:0}
.burger[aria-expanded=true] span:nth-child(3){transform:rotate(-45deg)}
.hero{display:grid;grid-template-columns:1.2fr .8fr;gap:3rem;align-items:center;min-height:calc(100svh - 90px);padding:2.5rem 0 3rem}
.badge{display:inline-flex;align-items:center;gap:.6rem;background:#fff;border:var(--b);border-radius:999px;padding:.35rem 1rem;font-weight:600;font-size:.9rem;box-shadow:3px 3px 0 var(--ink)}
.dot{width:10px;height:10px;border-radius:50%;background:var(--mint);border:2px solid var(--ink);animation:blink 1.6s infinite}
@keyframes blink{50%{opacity:.3}}
h1{font-size:clamp(2.6rem,7vw,5rem);line-height:1.05;margin:1.2rem 0;letter-spacing:-.03em}
.hl{background:var(--y);padding:0 .15em;border:var(--b);border-radius:14px;display:inline-block;transform:rotate(-2deg);box-shadow:var(--sh)}
.lead{font-size:1.15rem;max-width:520px}
.typing{font:700 1.15rem var(--f);margin:1.2rem 0;min-height:1.8em}
.caret{display:inline-block;width:3px;height:1.1em;background:var(--ink);margin-left:3px;vertical-align:-.15em;animation:caret 1s steps(1) infinite}
@keyframes caret{50%{opacity:0}}
.btns{display:flex;flex-wrap:wrap;gap:.9rem}
.btn{display:inline-flex;align-items:center;gap:.5rem;padding:.7rem 1.3rem;background:#fff;border:var(--b);border-radius:14px;font-weight:700;box-shadow:4px 4px 0 var(--ink);transition:transform .15s,box-shadow .15s;cursor:pointer}
.btn-main{background:var(--y)}
.btn:hover{transform:translate(-2px,-2px);box-shadow:7px 7px 0 var(--ink)}
.btn:active{transform:translate(3px,3px);box-shadow:1px 1px 0 var(--ink)}
.card{background:var(--card);border:var(--b);border-radius:var(--r);box-shadow:var(--sh);padding:1.5rem}
.card-yellow{background:var(--y)}
.profile{padding:0;overflow:hidden;transform:rotate(2deg);transition:transform .3s}
.profile:hover{transform:rotate(0)}
.win{display:flex;align-items:center;gap:.4rem;padding:.7rem 1rem;border-bottom:var(--b);background:var(--y);font:600 .85rem var(--f)}
.win i{width:12px;height:12px;border-radius:50%;border:2px solid var(--ink);background:#fff}
.win i:nth-child(1){background:var(--pink)}.win i:nth-child(2){background:var(--blue)}.win i:nth-child(3){background:var(--mint)}
.win span{margin-left:.6rem}
.profile-body{padding:1.5rem;text-align:center}
.avatar{width:110px;height:110px;margin:0 auto .8rem;border:var(--b);border-radius:28px;background:var(--pink);display:grid;place-items:center;font:700 2.8rem var(--f);box-shadow:var(--sh)}
.profile h2{font:700 1.8rem var(--f)}
.facts{text-align:left;margin-top:1.1rem;display:grid;gap:.5rem;font-size:.95rem}
.facts li{border:2px dashed var(--ink);border-radius:12px;padding:.5rem .8rem}
.facts b{display:block;font:700 .8rem var(--f);opacity:.65}
.sec{padding:3.5rem 0}
.sec-title{font-size:clamp(2rem,5vw,3rem);letter-spacing:-.02em;margin-bottom:1.8rem;display:inline-block;border-bottom:8px solid var(--y)}
.big{font-size:1.15rem}
.about-grid{display:grid;grid-template-columns:1.5fr 1fr;gap:1.6rem}
.slogan{display:grid;place-items:center;text-align:center}
.slogan .typing{font-size:1.6rem;margin:0}
.grid{display:grid;gap:1.6rem}
.skills{grid-template-columns:repeat(3,1fr)}
.projects{grid-template-columns:repeat(2,1fr)}
.row{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.9rem}
.row h3{font-size:1.3rem}.row b{font:700 1.3rem var(--f)}
.bar{height:22px;border:var(--b);border-radius:999px;background:#fff;overflow:hidden}
.bar span{display:block;height:100%;width:0;background:var(--pink);border-right:var(--b);transition:width 1.2s cubic-bezier(.2,.8,.2,1)}
.bar span[data-w="100"]{border-right:0}
.bar .c2{background:var(--blue)}.bar .c3{background:var(--mint)}.bar .c4{background:var(--ink)}
.proj{display:flex;flex-direction:column;align-items:flex-start;gap:.7rem;transition:transform .2s,box-shadow .2s}
.proj:hover{transform:translate(-3px,-3px);box-shadow:8px 8px 0 var(--ink)}
.proj h3{font-size:1.5rem}.proj p{flex:1}
.ico{width:52px;height:52px;border:var(--b);border-radius:14px;display:grid;place-items:center}
.ico.y{background:var(--y)}.ico.g{background:#ddd}.ico.b{background:var(--blue)}.ico.p{background:var(--pink)}
.tag{font:700 .8rem var(--f);border:2px solid var(--ink);border-radius:999px;padding:.1rem .7rem;background:#fff}
.t-main{background:var(--mint)}.t-arch{background:#ddd}.t-exp{background:var(--blue)}
.proj .note{font-weight:600;opacity:.65;flex:0}
.timeline{display:grid;gap:1.4rem;position:relative;padding-left:3.4rem}
.timeline::before{content:"";position:absolute;left:21px;top:10px;bottom:10px;border-left:4px dashed var(--ink)}
.timeline li{position:relative}
.step{position:absolute;left:-3.4rem;top:50%;translate:0 -50%;width:44px;height:44px;border-radius:50%;border:var(--b);background:var(--y);display:grid;place-items:center;font:700 1.1rem var(--f)}
.timeline h3{font-size:1.4rem}
.contact{display:grid;gap:1.4rem}
.foot{display:flex;justify-content:space-between;flex-wrap:wrap;gap:.5rem;border-top:var(--b);padding:1.5rem 0 calc(2.5rem + env(safe-area-inset-bottom,0px));font-weight:600}
.js .reveal{opacity:0;transform:translateY(24px);transition:opacity .6s,transform .6s}
.js .reveal.in{opacity:1;transform:none}
@media(max-width:860px){
 .hero{grid-template-columns:1fr;min-height:0;gap:2.5rem}
 .about-grid,.projects{grid-template-columns:1fr}
 .skills{grid-template-columns:repeat(2,1fr)}
 .burger{display:block}
 .menu{position:absolute;top:calc(100% + 12px);left:0;right:0;flex-direction:column;align-items:stretch;background:#fff;border:var(--b);border-radius:var(--r);box-shadow:var(--sh);padding:.6rem;opacity:0;visibility:hidden;transform:translateY(-10px);transition:.25s}
 .menu.open{opacity:1;visibility:visible;transform:none}
 .menu a{padding:.8rem 1rem;border-radius:12px}
}
@media(max-width:520px){.skills{grid-template-columns:1fr}.btn{width:100%;justify-content:center}.profile{transform:none}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}.js .reveal{opacity:1;transform:none}}
/* v2 polish */
html{scroll-behavior:auto}
#progress{position:fixed;top:0;left:0;height:5px;width:100%;background:var(--ink);transform:scaleX(0);transform-origin:0 50%;z-index:100;will-change:transform}
.hero{position:relative}
.hero>*:not(.shape){position:relative;z-index:1}
.shape{position:absolute;border:var(--b);z-index:0;will-change:transform;pointer-events:none}
.s1{width:64px;height:64px;border-radius:50%;background:var(--pink);top:2%;right:44%;animation:float 6s ease-in-out infinite}
.s2{width:52px;height:52px;border-radius:14px;background:var(--blue);bottom:6%;left:-8px;rotate:12deg;animation:float 7s ease-in-out -2s infinite}
.s3{width:0;height:0;border:0;border-left:30px solid transparent;border-right:30px solid transparent;border-bottom:52px solid var(--mint);bottom:4%;right:36%;filter:drop-shadow(0 0 0 var(--ink));animation:float 8s ease-in-out -4s infinite}
@keyframes float{50%{transform:translateY(-18px) rotate(8deg)}}
.photo{position:relative;aspect-ratio:1;background:var(--pink);border-bottom:var(--b);overflow:hidden}
.photo img{width:100%;height:100%;object-fit:cover;display:block}
.photo .avatar{display:none;position:absolute;inset:0;width:100%;height:100%;margin:0;border:0;border-radius:0;box-shadow:none;font-size:7rem}
.photo.nophoto img{display:none}.photo.nophoto .avatar{display:grid}
.chip{position:absolute;font:700 .8rem var(--f);background:#fff;border:2px solid var(--ink);border-radius:999px;padding:.15rem .75rem;box-shadow:3px 3px 0 var(--ink)}
.c-a{left:12px;bottom:12px;background:var(--y);rotate:-4deg}.c-b{right:12px;top:12px;rotate:3deg}
.profile-body{padding:1.2rem 1.5rem 1.5rem}
.profile h2{margin-top:0}
.marquee{overflow:hidden;background:var(--y);border-block:var(--b);padding:.8rem 0;transform:rotate(-1deg);margin:1rem -2%;box-shadow:0 5px 0 var(--ink)}
.track{display:flex;width:max-content;gap:2rem;animation:slide 28s linear infinite;will-change:transform}
.track span{display:inline-flex;align-items:center;gap:2rem;font:700 1.3rem var(--f);white-space:nowrap}
@keyframes slide{to{transform:translateX(-50%)}}
.js .hero-in{opacity:0}
.ready .hero-in{animation:rise .9s cubic-bezier(.2,.8,.2,1) both;animation-delay:calc(var(--i)*90ms)}
@keyframes rise{from{opacity:0;translate:0 30px}to{opacity:1;translate:0 0}}
.js .reveal{opacity:0;transform:none;translate:0 36px;transition:opacity .8s cubic-bezier(.2,.8,.2,1),translate .8s cubic-bezier(.2,.8,.2,1),transform .25s,box-shadow .25s}
.js .reveal.in{opacity:1;translate:0 0}
.card{transition:transform .25s cubic-bezier(.2,.8,.2,1),box-shadow .25s}
.timeline .card:hover,.skills .card:hover{transform:translate(-3px,-3px);box-shadow:8px 8px 0 var(--ink)}
.step{transition:transform .3s}.timeline li:hover .step{transform:rotate(-12deg) scale(1.12)}
.sec-title{position:relative}
.sec-title::after{content:"";position:absolute;right:-26px;top:-6px;width:16px;height:16px;border:var(--b);border-radius:50%;background:var(--pink)}
.tilt{will-change:transform}
@media(max-width:860px){.s1{right:10%;top:0}.s3{right:6%}.marquee{margin-inline:-6%}}
@media(prefers-reduced-motion:reduce){.js .hero-in,.js .reveal{opacity:1;translate:none}.track{animation:none}}

/* v3 */
body{-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
html.loading,html.loading body{overflow:hidden}
#loader{position:fixed;inset:0;z-index:99;display:grid;place-items:center;background:var(--y) radial-gradient(#11111330 1.5px,transparent 1.5px) 0 0/24px 24px;clip-path:inset(0 0 0 0);overflow:hidden}
#loader.out{clip-path:inset(0 0 100% 0);transition:clip-path 1s cubic-bezier(.77,0,.18,1) .15s;pointer-events:none}
.ld-media{position:absolute;inset:0;background-size:cover;background-position:center}
.ld-media video{width:100%;height:100%;object-fit:cover;display:block}
.ld-shade{position:absolute;inset:0;background:rgba(17,17,17,.45);opacity:0;transition:opacity .6s}
#loader.has-media .ld-shade{opacity:1}
.ld-card{position:relative;width:min(340px,86vw);background:#fff;border:var(--b);border-radius:var(--r);box-shadow:var(--sh);padding:1.6rem 1.5rem 1.3rem;text-align:center;animation:ldIn .8s cubic-bezier(.2,.8,.2,1) both}
#loader.out .ld-card{opacity:0;translate:0 -24px;transition:opacity .4s,translate .4s}
@keyframes ldIn{from{opacity:0;translate:0 26px;scale:.95}}
.ld-mark{width:84px;height:84px;margin:0 auto .7rem;display:grid;place-items:center;background:var(--y);border:var(--b);border-radius:24px;font:700 2.3rem var(--f);box-shadow:4px 4px 0 var(--ink);animation:ldBob 1.5s ease-in-out infinite}
@keyframes ldBob{50%{transform:translateY(-8px) rotate(-5deg)}}
.ld-name{font:700 1.3rem var(--f);margin-bottom:1rem}
.ld-bar{height:22px;border:var(--b);border-radius:999px;background:#fff;overflow:hidden}
.ld-bar span{display:block;height:100%;width:0;border-right:var(--b);background:repeating-linear-gradient(45deg,var(--pink) 0 10px,#ff9ec0 10px 20px);background-size:28px 28px;animation:stripe .7s linear infinite}
@keyframes stripe{to{background-position:28px 0}}
.ld-row{display:flex;justify-content:space-between;margin-top:.7rem;font:600 .9rem var(--f)}
/* round profile photo */
.photo-wrap{position:relative;width:min(230px,62%);margin:1.9rem auto .4rem}
.photo-wrap::before{content:"";position:absolute;inset:-12px;border:3px dashed var(--ink);border-radius:50%;animation:spin 28s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.photo{width:100%;aspect-ratio:1;border:var(--b);border-radius:50%;box-shadow:var(--sh);overflow:hidden;background:var(--pink)}
.photo img{border-radius:50%}
.photo-wrap .chip{z-index:2}
.photo-wrap .c-a{left:-22px;bottom:10px;top:auto;right:auto}.photo-wrap .c-b{right:-22px;top:10px;left:auto;bottom:auto}
.profile-body{padding:1.4rem 1.5rem 1.5rem}
/* project feature card */
.url{font:600 .9rem var(--f);opacity:.7;flex:0!important}
.feature{padding:0;overflow:hidden;position:relative;min-height:380px;flex-direction:row;align-items:flex-end}
.feat-bg{position:absolute;inset:0;background:radial-gradient(#11111325 1.5px,transparent 1.5px) 0 0/22px 22px,linear-gradient(135deg,var(--y),#ffb84d 55%,var(--pink));background-size:22px 22px,cover;background-position:center;transition:transform .8s cubic-bezier(.2,.8,.2,1)}
.feat-bg.has-img{background-size:cover}
.feat-mark{position:absolute;right:5%;top:50%;translate:0 -50%;font:700 clamp(7rem,22vw,15rem) var(--f);opacity:.16;line-height:1}
.feat-bg.has-img .feat-mark{display:none}
.feature:hover .feat-bg{transform:scale(1.05)}
.panel{position:relative;margin:1.5rem;background:#fff;border:var(--b);border-radius:var(--r);box-shadow:var(--sh);padding:1.4rem;max-width:440px;display:flex;flex-direction:column;gap:.7rem;align-items:flex-start}
@media(min-width:861px){.projects{grid-template-columns:repeat(3,1fr)}.feature{grid-column:1/-1}}
@media(max-width:520px){.panel{margin:1rem}.feature{min-height:420px}}
@media(max-width:860px){
 .menu{transform-origin:top right;transform:translateY(-10px) scale(.94);transition:opacity .35s,visibility .35s,transform .5s cubic-bezier(.2,.8,.2,1)}
 .menu.open{transform:none}
 .menu li{opacity:0;translate:0 -10px;transition:opacity .4s,translate .55s cubic-bezier(.2,.8,.2,1)}
 .menu.open li{opacity:1;translate:0 0}
 .menu.open li:nth-child(1){transition-delay:.08s}.menu.open li:nth-child(2){transition-delay:.13s}.menu.open li:nth-child(3){transition-delay:.18s}
 .menu.open li:nth-child(4){transition-delay:.23s}.menu.open li:nth-child(5){transition-delay:.28s}.menu.open li:nth-child(6){transition-delay:.33s}
}
@media(prefers-reduced-motion:reduce){.photo-wrap::before,.ld-mark,.ld-bar span{animation:none}.menu li{opacity:1;translate:none}}
