:root{--bg:#fff;--bg-2:#f4f6f9;--ink:#0c1420;--ink-dim:#3a4453;--ink-faint:#8b94a1;--line:#0c14201f;--line-strong:#0c142038;--acc:#2f6cac;--acc-deep:#1f4f82;--acc-soft:#4a7fbb;--serif:"Bricolage Grotesque","Hanken Grotesk",sans-serif;--sans:"Hanken Grotesk",system-ui,sans-serif;--mono:"JetBrains Mono",monospace;--ease:cubic-bezier(.22,1,.36,1)}*{box-sizing:border-box;margin:0;padding:0}::selection{background:var(--acc);color:#fff}html{scroll-behavior:smooth}body{background:var(--bg);color:var(--ink);font-family:var(--sans);-webkit-font-smoothing:antialiased;cursor:none;font-weight:400;line-height:1.5;overflow-x:hidden}a{color:inherit;text-decoration:none}button{color:inherit;cursor:none;background:0 0;border:none;font-family:inherit}img{max-width:100%;display:block}.grain{z-index:1;pointer-events:none;opacity:.03;mix-blend-mode:multiply;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");position:fixed;inset:0}.glow{z-index:0;pointer-events:none;filter:blur(120px);opacity:.1;border-radius:50%;position:fixed}.glow.a{background:var(--acc);width:560px;height:560px;top:-200px;left:-140px}.glow.b{background:var(--acc-soft);opacity:.08;width:460px;height:460px;bottom:-180px;right:-140px}.cursor-dot,.cursor-ring{z-index:9999;pointer-events:none;border-radius:50%;position:fixed;top:0;left:0}.cursor-dot{background:var(--acc);width:6px;height:6px;transform:translate(-50%,-50%)}.cursor-ring{width:38px;height:38px;transition:width .3s var(--ease),height .3s var(--ease),background .3s var(--ease),border-color .3s var(--ease);border:1px solid #2f6cac73;transform:translate(-50%,-50%)}.cursor-ring.hover{border-color:var(--acc);background:#2f6cac1a;width:64px;height:64px}@media (hover:none){.cursor-dot,.cursor-ring{display:none}body,button{cursor:auto}}.loader{z-index:9000;background:var(--bg);transition:opacity .8s var(--ease),visibility .8s;flex-direction:column;justify-content:center;align-items:center;gap:18px;display:flex;position:fixed;inset:0}.loader.done{opacity:0;visibility:hidden}.loader .lname{font-family:var(--serif);letter-spacing:-.02em;height:1.2em;color:var(--ink);font-size:clamp(2rem,6vw,3.6rem);font-weight:700;overflow:hidden}.loader .lname span{animation:rise .9s var(--ease) forwards;display:inline-block;transform:translateY(110%)}.loader .lbar{background:var(--line-strong);width:min(280px,60vw);height:1px;position:relative;overflow:hidden}.loader .lbar:after{content:"";background:var(--acc);transform-origin:0;animation:load 1.5s var(--ease) forwards;position:absolute;inset:0}.loader .lpct{font-family:var(--mono);color:var(--ink-dim);letter-spacing:.1em;font-size:.72rem}@keyframes rise{to{transform:translateY(0)}}@keyframes load{0%{transform:scaleX(0)}to{transform:scaleX(1)}}nav{z-index:800;transition:transform .5s var(--ease),background .4s,backdrop-filter .4s,border-color .4s;border-bottom:1px solid #0000;justify-content:space-between;align-items:center;padding:22px clamp(20px,5vw,64px);display:flex;position:fixed;top:0;left:0;right:0}nav.hide{transform:translateY(-120%)}nav.solid{-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);border-bottom:1px solid var(--line);background:#ffffffb8}nav .brand{font-family:var(--mono);letter-spacing:.05em;color:var(--ink);align-items:center;gap:9px;font-size:.78rem;display:flex}nav .brand .blip{background:var(--acc);border-radius:50%;width:7px;height:7px;animation:2.4s ease-in-out infinite pulse;box-shadow:0 0 10px #2f6cac99}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.7)}}nav .right{align-items:center;gap:28px;display:flex}nav .links{font-family:var(--mono);letter-spacing:.04em;color:var(--ink);gap:28px;font-size:.74rem;display:flex}nav .links a{opacity:.75;transition:opacity .3s;position:relative}nav .links a:after{content:"";background:var(--acc);transform-origin:100%;width:100%;height:1px;transition:transform .4s var(--ease);position:absolute;bottom:-5px;left:0;transform:scaleX(0)}nav .links a:hover{opacity:1}nav .links a:hover:after{transform-origin:0;transform:scaleX(1)}.lang{font-family:var(--mono);border:1px solid var(--line);background:#ffffff80;border-radius:100px;align-items:center;gap:2px;padding:3px;font-size:.72rem;display:flex}.lang button{letter-spacing:.04em;color:var(--ink-dim);border-radius:100px;padding:5px 10px;transition:color .3s,background .3s}.lang button.on{background:var(--acc);color:#fff}.lang button:not(.on):hover{color:var(--ink)}@media (width<=680px){nav .links{display:none}}.wrap{z-index:5;max-width:1280px;margin:0 auto;padding:0 clamp(24px,6vw,64px);position:relative}@media (width<=600px){.wrap{padding-left:clamp(20px,6%,32px);padding-right:clamp(20px,6%,32px)}}.eyebrow{font-family:var(--mono);letter-spacing:.22em;text-transform:uppercase;color:var(--acc-deep);align-items:center;gap:12px;font-size:.74rem;display:flex}.eyebrow:before{content:"";background:var(--acc-deep);width:26px;height:1px}section{z-index:5;position:relative}.reveal{opacity:0;transition:opacity 1s var(--ease),transform 1s var(--ease);transform:translateY(34px)}.reveal[data-in]{opacity:1;transform:none}.reveal[data-d="1"]{transition-delay:80ms}.reveal[data-d="2"]{transition-delay:.16s}.reveal[data-d="3"]{transition-delay:.24s}.reveal[data-d="4"]{transition-delay:.32s}.hero{flex-direction:column;justify-content:center;min-height:100vh;padding-top:90px;padding-bottom:24px;display:flex}.hero .top{font-family:var(--mono);letter-spacing:.06em;color:var(--ink-dim);flex-wrap:wrap;justify-content:space-between;gap:16px;font-size:.74rem;display:flex}.hero h1{font-family:var(--serif);letter-spacing:-.03em;color:var(--ink);margin:.16em 0 .1em;font-size:clamp(3.4rem,13vw,10.5rem);font-weight:700;line-height:.88}.hero h1 .it{color:var(--acc)}.hero h1 .word{vertical-align:top;display:inline-block;overflow:hidden}.hero h1 .word>span{transition:transform 1s var(--ease);display:inline-block;transform:translateY(105%)}.loaded .hero h1 .word>span{transform:translateY(0)}.hero h1 .word:nth-child(2)>span{transition-delay:.12s}.hero .sub{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:24px;margin-top:18px;padding-top:22px;display:flex}.hero .sub p{max-width:48ch;color:var(--ink-dim);font-size:clamp(1rem,1.5vw,1.18rem);font-weight:400}.hero .sub p strong{color:var(--ink);font-weight:600}.hero .scroll{font-family:var(--mono);letter-spacing:.1em;color:var(--ink-dim);white-space:nowrap;align-items:center;gap:10px;font-size:.72rem;display:flex}.hero .scroll .arr{background:linear-gradient(var(--acc),transparent);width:1px;height:30px;animation:1.8s ease-in-out infinite drop;display:inline-block}@keyframes drop{0%{transform-origin:top;transform:scaleY(0)}50%{transform-origin:top;transform:scaleY(1)}51%{transform-origin:bottom;transform:scaleY(1)}to{transform-origin:bottom;transform:scaleY(0)}}.marquee{border-top:1px solid var(--line);border-bottom:1px solid var(--line);white-space:nowrap;background:var(--bg-2);padding:9px 0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000);mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000)}.marquee .track{will-change:transform;gap:26px;animation:34s linear infinite scroll-x;display:inline-flex}.marquee:hover .track{animation-play-state:paused}.marquee span{font-family:var(--mono);letter-spacing:.04em;text-transform:uppercase;color:var(--ink-dim);align-items:center;gap:26px;font-size:.82rem;font-weight:500;display:inline-flex}.marquee span:after{content:"✦";color:var(--acc);font-size:.7em}@keyframes scroll-x{to{transform:translate(-50%)}}.stats{padding-top:clamp(34px,5vw,60px);padding-bottom:clamp(60px,9vw,110px)}.stats .grid{grid-template-columns:repeat(3,1fr);gap:0;display:grid}.stats .cell{border-left:1px solid var(--line);padding:26px;position:relative}.stats .cell:first-child{border-left:none;padding-left:0}.stats .num{font-family:var(--serif);letter-spacing:-.03em;color:var(--ink);font-size:clamp(2.8rem,6vw,4.8rem);font-weight:700;line-height:1}.stats .num .u{color:var(--acc)}.stats .lbl{font-family:var(--mono);letter-spacing:.08em;color:var(--ink-dim);text-transform:uppercase;margin-top:14px;font-size:.72rem;line-height:1.6}@media (width<=680px){.stats .grid{grid-template-columns:1fr}.stats .cell{border-left:none;border-top:1px solid var(--line);padding-left:0}.stats .cell:first-child{border-top:none}}.about{padding-top:clamp(50px,8vw,110px);padding-bottom:clamp(50px,8vw,110px)}.about .lay{grid-template-columns:1fr 1.25fr;align-items:start;gap:clamp(30px,6vw,90px);display:grid}.about .big{font-family:var(--serif);letter-spacing:-.02em;color:var(--ink);font-size:clamp(1.9rem,3.6vw,3rem);font-weight:600;line-height:1.1}.about .big em{color:var(--acc);font-style:normal}.about .body{color:var(--ink-dim);flex-direction:column;gap:18px;font-size:1.06rem;font-weight:400;line-height:1.7;display:flex}.about .body strong{color:var(--ink);font-weight:600}@media (width<=820px){.about .lay{grid-template-columns:1fr;gap:34px}}.work{padding-top:clamp(50px,8vw,100px);padding-bottom:clamp(50px,8vw,100px)}.sec-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:18px;margin-bottom:14px;display:flex}.sec-head h2{font-family:var(--serif);letter-spacing:-.03em;color:var(--ink);font-size:clamp(2.2rem,5vw,3.8rem);font-weight:700;line-height:1}.sec-head .cnt{font-family:var(--mono);color:var(--ink-dim);letter-spacing:.08em;font-size:.74rem}.work-hint{font-family:var(--mono);color:var(--acc-deep);letter-spacing:.06em;align-items:center;gap:8px;margin-bottom:30px;font-size:.72rem;display:flex}.work-hint:before{content:"";background:var(--acc-deep);width:16px;height:1px}.rows{border-top:1px solid var(--line)}.row{text-align:left;border-bottom:1px solid var(--line);width:100%;transition:padding .5s var(--ease);grid-template-columns:.55fr 2fr 1.3fr auto;align-items:center;gap:24px;padding:28px 6px;display:grid;position:relative}.row:before{content:"";width:0;height:100%;transition:width .6s var(--ease);z-index:-1;background:linear-gradient(90deg,#2f6cac12,#0000);position:absolute;top:0;left:0}.row:hover{padding-left:24px;padding-right:24px}.row:hover:before{width:100%}.row .yr{font-family:var(--mono);color:var(--ink-dim);font-size:.78rem}.row .ttl{font-family:var(--serif);letter-spacing:-.02em;color:var(--ink);font-size:clamp(1.45rem,2.6vw,2rem);font-weight:600;line-height:1.05;transition:color .3s}.row:hover .ttl{color:var(--acc)}.row .ttl small{font-family:var(--sans);color:var(--ink-dim);letter-spacing:.01em;margin-top:7px;font-size:.86rem;font-weight:500;display:block}.row .meta{font-family:var(--mono);color:var(--ink-dim);font-size:.74rem;line-height:1.7}.row .go{font-family:var(--mono);letter-spacing:.08em;color:var(--ink-faint);justify-self:end;align-items:center;gap:8px;font-size:.7rem;transition:color .4s;display:inline-flex}.row .go .pl{border:1px solid var(--line);width:26px;height:26px;transition:transform .5s var(--ease),background .4s,border-color .4s,color .4s;border-radius:50%;place-items:center;font-size:1rem;display:grid}.row:hover .go{color:var(--acc)}.row:hover .go .pl{background:var(--acc);border-color:var(--acc);color:#fff;transform:rotate(90deg)}@media (width<=820px){.row{grid-template-columns:1fr;gap:10px}.row .go{justify-self:start}.row .meta{order:3}}.exp{border-bottom:1px solid var(--line)}.exp .row{border-bottom:none}.exp.open .row:before{width:100%}.exp.open .ttl,.exp.open .go{color:var(--acc)}.exp.open .go .pl{background:var(--acc);border-color:var(--acc);color:#fff;transform:rotate(45deg)}.exp-body{transition:grid-template-rows .55s var(--ease);grid-template-rows:0fr;display:grid}.exp.open .exp-body{grid-template-rows:1fr}.exp-inner{overflow:hidden}.exp-detail{border-top:1px dashed var(--line);padding:26px 6px 40px}.exp-facts{font-family:var(--mono);color:var(--ink-dim);letter-spacing:.03em;flex-wrap:wrap;gap:18px;margin-bottom:20px;font-size:.73rem;display:flex}.exp-facts span{align-items:center;gap:7px;display:inline-flex}.exp-facts span:before{content:"";background:var(--acc);border-radius:50%;width:5px;height:5px}.exp-summary{color:var(--ink);max-width:60ch;margin-bottom:28px;font-size:1.08rem;font-weight:400;line-height:1.6}.exp-cols{grid-template-columns:1.4fr .8fr;gap:clamp(24px,5vw,56px);display:grid}.exp-sub{font-family:var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-dim);align-items:center;gap:10px;margin-bottom:16px;font-size:.72rem;display:flex}.exp-sub:before{content:"";background:var(--acc);border-radius:50%;width:5px;height:5px}.exp-stack{flex-wrap:wrap;gap:8px;display:flex}.exp-stack i{font-family:var(--mono);color:var(--ink);border:1px solid var(--line);border-radius:100px;padding:6px 13px;font-size:.72rem;font-style:normal;transition:border-color .3s,color .3s,background .3s}.exp-stack i:hover{border-color:var(--acc);background:var(--acc);color:#fff}.exp-bullets{flex-direction:column;gap:13px;list-style:none;display:flex}.exp-bullets li{color:var(--ink-dim);opacity:0;transition:opacity .5s var(--ease),transform .5s var(--ease);padding-left:26px;font-size:.98rem;line-height:1.55;position:relative;transform:translate(-10px)}.exp.open .exp-bullets li{opacity:1;transform:none}.exp.open .exp-bullets li:first-child{transition-delay:.16s}.exp.open .exp-bullets li:nth-child(2){transition-delay:.24s}.exp.open .exp-bullets li:nth-child(3){transition-delay:.32s}.exp.open .exp-bullets li:nth-child(4){transition-delay:.4s}.exp-bullets li:before{content:"";background:var(--acc);width:12px;height:1px;position:absolute;top:.5em;left:0}@media (width<=820px){.exp-cols{grid-template-columns:1fr;gap:26px}}.projects{padding-top:clamp(50px,8vw,100px);padding-bottom:clamp(50px,8vw,100px)}.pgrid{grid-template-columns:repeat(3,1fr);gap:18px;display:grid}.card{border:1px solid var(--line);background:var(--bg);min-height:300px;transition:transform .6s var(--ease),border-color .5s,box-shadow .5s;border-radius:4px;flex-direction:column;justify-content:space-between;padding:30px 28px 26px;display:flex;position:relative;overflow:hidden}.card:after{content:"";background:radial-gradient(400px circle at var(--mx,50%) var(--my,0%),#2f6cac14,transparent 60%);opacity:0;transition:opacity .5s;position:absolute;inset:0}.card:hover{border-color:var(--acc-soft);transform:translateY(-8px);box-shadow:0 24px 50px -28px #101a2647}.card:hover:after{opacity:1}.card .idx{font-family:var(--mono);color:var(--acc-deep);letter-spacing:.1em;font-size:.72rem}.card .pname{font-family:var(--serif);letter-spacing:-.02em;color:var(--ink);margin:auto 0 14px;font-size:clamp(1.55rem,3vw,2rem);font-weight:700;line-height:1.04}.card .pdesc{color:var(--ink-dim);margin-bottom:20px;font-size:.95rem;font-weight:400;line-height:1.6}.card .ptags{flex-wrap:wrap;gap:7px;margin-bottom:18px;display:flex}.card .ptags i{font-family:var(--mono);color:var(--ink-dim);border:1px solid var(--line);border-radius:100px;padding:4px 10px;font-size:.68rem;font-style:normal}.card .plink{font-family:var(--mono);color:var(--ink);letter-spacing:.03em;align-items:center;gap:8px;font-size:.74rem;display:inline-flex}.card .plink .d{background:var(--acc);width:6px;height:6px;transition:transform .4s var(--ease);border-radius:50%}.card:hover .plink .d{transform:scale(1.6)}@media (width<=920px){.pgrid{grid-template-columns:1fr 1fr}}@media (width<=600px){.pgrid{grid-template-columns:1fr}}.skills{padding-top:clamp(50px,8vw,100px);padding-bottom:clamp(50px,8vw,100px)}.skills .lay{grid-template-columns:1fr 1.6fr;align-items:start;gap:clamp(30px,6vw,80px);display:grid}.skills .skset{margin-bottom:30px}.skills .skset h4{font-family:var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-dim);align-items:center;gap:10px;margin-bottom:16px;font-size:.72rem;display:flex}.skills .skset h4:before{content:"";background:var(--acc);border-radius:50%;width:5px;height:5px}.skills .chips{flex-wrap:wrap;gap:10px;display:flex}.skills .chips span{color:var(--ink);border:1px solid var(--line);transition:border-color .35s var(--ease),color .35s,transform .35s var(--ease),background .35s;background:var(--bg);border-radius:3px;padding:9px 16px;font-size:.96rem}.skills .chips span:hover{border-color:var(--acc);color:#fff;background:var(--acc);transform:translateY(-3px)}.skills .aside .big{font-family:var(--serif);letter-spacing:-.02em;color:var(--ink);font-size:clamp(1.8rem,3.4vw,2.6rem);font-weight:600;line-height:1.1}.skills .aside .big em{color:var(--acc);font-style:normal}.skills .certs{flex-direction:column;gap:0;margin-top:30px;display:flex}.skills .cert{border-top:1px solid var(--line);justify-content:space-between;align-items:baseline;gap:14px;padding:18px 0;display:flex}.skills .cert:last-child{border-bottom:1px solid var(--line)}.skills .cert b{font-size:1rem;font-weight:600}.skills .cert span{font-family:var(--mono);color:var(--ink-dim);white-space:nowrap;font-size:.72rem}@media (width<=820px){.skills .lay{grid-template-columns:1fr;gap:40px}}.contact{text-align:center;padding-top:clamp(80px,12vw,170px);padding-bottom:60px;position:relative}.contact .eyebrow{justify-content:center}.contact h2{font-family:var(--serif);letter-spacing:-.04em;color:var(--ink);margin:24px 0 10px;font-size:clamp(3rem,11vw,8.5rem);font-weight:700;line-height:.94}.contact h2 .it{color:var(--acc)}.contact .mail{font-family:var(--serif);color:var(--ink);letter-spacing:-.01em;margin-top:18px;font-size:clamp(1.2rem,2.6vw,1.7rem);font-weight:500;display:inline-block;position:relative}.contact .mail:after{content:"";background:var(--acc);transform-origin:100%;width:100%;height:1px;transition:transform .5s var(--ease);position:absolute;bottom:2px;left:0;transform:scaleX(0)}.contact .mail:hover:after{transform-origin:0;transform:scaleX(1)}.contact .links{flex-wrap:wrap;justify-content:center;gap:14px;margin-top:40px;display:flex}.contact .links a{font-family:var(--mono);letter-spacing:.04em;color:var(--ink-dim);border:1px solid var(--line);transition:color .35s,border-color .35s,background .35s,transform .35s var(--ease);border-radius:100px;padding:11px 22px;font-size:.78rem}.contact .links a:hover{color:#fff;background:var(--acc);border-color:var(--acc);transform:translateY(-3px)}footer{border-top:1px solid var(--line);font-family:var(--mono);color:var(--ink-dim);letter-spacing:.04em;z-index:5;flex-wrap:wrap;justify-content:space-between;gap:14px;padding:30px clamp(20px,5vw,64px);font-size:.72rem;display:flex;position:relative}footer .blip{color:var(--acc)}
