@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-wght-normal.BEAKL7Jp.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-vietnamese-wght-normal.6IgcOCM7.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-ext-wght-normal.DC-KSUi6.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-wght-normal.BgDaEnEv.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2) format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-vietnamese-wght-normal.DadHysG0.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-mono-latin-wght-normal.XN7g48iV.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--light: #fbfbf9;--dark: #131720;--ink: #1d232b;--ink-inv: #eceef0;--muted: #5c6570;--muted-inv: #9aa4b0;--faint: #98a0aa;--line: rgba(29, 35, 43, .12);--line-inv: rgba(236, 238, 240, .14);--steel: #33628f;--steel-inv: #7aa7d4;--green: #3e7a52;--green-inv: #7fc496;--sans: "Geist Variable", "Geist", -apple-system, Helvetica, Arial, sans-serif;--mono: "Geist Mono Variable", "Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace}*{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}section[id]{scroll-margin-top:24px}a:focus-visible,button:focus-visible{outline:2px solid var(--steel);outline-offset:3px;border-radius:4px}.act.dark a:focus-visible,.act.dark button:focus-visible{outline-color:var(--steel-inv)}body{background:var(--light);color:var(--ink);font-family:var(--sans);font-size:15.5px;line-height:1.65;-webkit-font-smoothing:antialiased;overflow-x:hidden}::selection{background:var(--steel);color:#fff}a{color:inherit}body:after{content:"";position:fixed;inset:0;z-index:99;pointer-events:none;opacity:.045;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E")}.copy-email{font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}.copy-email:hover,.copy-email:focus-visible{color:var(--steel);outline:none}.copytip{position:fixed;z-index:50;pointer-events:none;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;background:var(--ink);color:var(--light);padding:6px 10px;border-radius:3px;transform:translate(-50%,-130%)}.hudbar{display:none}.act.light{background-color:var(--light);background-image:radial-gradient(circle,rgba(29,35,43,.13) 1.1px,transparent 1.1px);background-size:22px 22px;background-position:center}.act.dark{background:var(--dark);color:var(--ink-inv)}.inner{max-width:1060px;margin:0 auto;padding:0 24px}.hero{position:relative;display:flex;align-items:center;justify-content:center}.corner{position:absolute;font-family:var(--mono);font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted);line-height:2}.corner a{text-decoration:none}.corner a:hover{color:var(--steel)}.corner.tl{top:28px;left:30px}.corner.tr{top:28px;right:30px;text-align:right}.corner.bl{bottom:28px;left:30px}.corner.br{bottom:28px;right:30px;text-align:right}.corner .no{color:var(--faint);margin-right:8px}.corner .dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--green);margin-right:8px;vertical-align:1px}.mark{position:relative;z-index:1;text-align:center;max-width:100%;padding:clamp(26px,4.6vh,42px) clamp(26px,4.5vw,54px)}.glass{position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:36px;background:linear-gradient(148deg,#f7f9fc4d,#f2f6fb1a 48%,#f7f9fc38);-webkit-backdrop-filter:blur(2.2px) saturate(1.25);backdrop-filter:blur(2.2px) saturate(1.25);box-shadow:inset 0 1px #ffffffeb,inset 0 -1px #ffffff80,inset 0 0 26px #ffffff6b,0 0 0 1px #1d232b24,0 24px 50px -32px #1d232b3d}.glass:before{content:"";position:absolute;inset:0;border-radius:inherit;opacity:.28;mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='f'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='3'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23f)'/%3E%3C/svg%3E")}.glass:after{content:"";position:absolute;inset:0;border-radius:inherit;background:radial-gradient(120% 62% at 20% -6%,#ffffff80,#fff0 60%),radial-gradient(90% 52% at 88% 106%,#ffffff3d,#fff0 56%)}.wordmark{font-weight:330;font-size:clamp(20px,4.2vw,52px);letter-spacing:.07em;text-indent:.07em;white-space:nowrap;text-transform:uppercase;line-height:1.05}.tagline{margin-top:26px;color:var(--ink);max-width:100%;font-family:var(--mono);font-size:16.5px;letter-spacing:.02em;line-height:1.55}.factline{margin-top:32px;display:flex;flex-wrap:wrap;gap:8px;justify-content:center;line-height:1}.factline span{font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);background:#1d232b0e;border-radius:999px;padding:7px 13px}[data-brand=mail]{--brand: #b0562c}[data-brand=github]{--brand: #6e5494}[data-brand=linkedin]{--brand: #0a66c2}[data-brand=resume]{--brand: #3e7a52}[data-brand=pdf]{--brand: #b0562c}.act.dark [data-brand=github]{--brand: #a58ad0}.act.dark [data-brand=linkedin]{--brand: #4d9be8}.act.dark [data-brand=resume]{--brand: #7fc496}.act.dark [data-brand=pdf]{--brand: #d98a5c}@keyframes pulse{0%{box-shadow:0 0 #7fc49673}70%{box-shadow:0 0 0 7px #7fc49600}to{box-shadow:0 0 #7fc49600}}.actions{display:flex;gap:9px;justify-content:flex-end}.iconbtn{width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:13px;cursor:pointer;color:var(--brand);background:#ffffffb8;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid rgba(29,35,43,.13);box-shadow:inset 0 1px #ffffffd9,0 2px 8px #1d232b0d;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease,background .18s ease}.iconbtn svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.iconbtn svg.fill{fill:currentColor;stroke:none}.iconbtn:hover,.iconbtn:focus-visible{outline:none;transform:translateY(-2px);border-color:color-mix(in srgb,var(--brand) 55%,transparent);background:#fff;box-shadow:inset 0 1px #ffffffe6,0 6px 16px color-mix(in srgb,var(--brand) 26%,transparent)}.keymenu{position:absolute;top:100%;right:0;margin-top:10px;min-width:196px;opacity:0;transform:translateY(-6px);pointer-events:none;transition:opacity .22s ease,transform .22s ease;list-style:none;padding:5px;border-radius:14px;background:#ffffff8c;-webkit-backdrop-filter:blur(7px) saturate(1.2);backdrop-filter:blur(7px) saturate(1.2);border:1px solid rgba(29,35,43,.1);box-shadow:inset 0 1px #fffc,0 10px 24px -18px #1d232b66}.corner.tr:hover .keymenu,.corner.tr:focus-within .keymenu,.corner.tr.keys-open .keymenu{opacity:1;transform:none}.keymenu li{display:flex;align-items:center;gap:20px;justify-content:space-between;padding:4px 8px 4px 10px;border-radius:9px;font-size:10px;letter-spacing:.1em;color:var(--muted);text-transform:none}.keymenu li:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--brand);opacity:.85;flex:none;margin-right:-12px}.keymenu li span{flex:1;text-align:left}.keymenu kbd{font-family:inherit;font-size:9px;color:var(--muted);line-height:1;background:#1d232b12;border-radius:4px;padding:3px 5px}.corner .dim{color:var(--faint)}.scrollcue{position:absolute;bottom:28px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;align-items:center;gap:7px;color:var(--faint)}.scrollcue .track{position:relative;width:1px;height:34px;background:linear-gradient(to bottom,transparent,currentColor 45%,transparent);opacity:.4}.scrollcue .track i{position:absolute;left:-1px;top:0;width:3px;height:3px;border-radius:50%;background:var(--ink);box-shadow:0 0 6px #1d232b73;animation:fall 2.6s cubic-bezier(.45,0,.4,1) infinite}.scrollcue .chev{width:15px;height:9px;overflow:visible;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;animation:catch 2.6s ease-in-out infinite}@keyframes fall{0%{transform:translateY(0) scale(.6);opacity:0}18%{opacity:1}70%{transform:translateY(31px) scale(1);opacity:1}86%,to{transform:translateY(34px) scale(.4);opacity:0}}@keyframes catch{0%,62%{opacity:.4;transform:translateY(0)}74%{opacity:1;transform:translateY(2.5px)}to{opacity:.4;transform:translateY(0)}}.act{padding:110px 0 120px;min-height:100svh;display:flex;align-items:center}.act .inner{width:100%}.act.hero{padding:0 clamp(18px,4.5vw,56px);background-image:none;overflow:hidden}.gridwarp{position:absolute;inset:0;width:100%;height:100%}.act-label{font-family:var(--mono);font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);margin-bottom:22px}.act.dark .act-label{color:var(--muted-inv)}.big-title{font-weight:590;font-size:clamp(42px,7.4vw,100px);line-height:.95;letter-spacing:-.025em;text-transform:uppercase;clip-path:inset(0 0 0% 0)}.act .lede{color:var(--muted);font-size:16.5px;max-width:54ch;margin-top:26px}.act.dark .lede{color:var(--muted-inv)}.entries{margin-top:64px}#experience .entries{position:relative;padding-left:32px}#experience .entries:before{content:"";position:absolute;left:4px;top:12px;bottom:12px;width:1px;background:var(--line-inv)}#experience .entry{position:relative}#experience .entry:before{content:"";position:absolute;left:-32px;top:39px;width:9px;height:9px;border-radius:50%;background:var(--dark);border:1.5px solid var(--steel-inv)}.entry{display:grid;grid-template-columns:130px 1fr;gap:6px 34px;padding:30px 0;border-top:1px solid var(--line)}.act.dark .entry{border-top-color:var(--line-inv)}.entry .when{font-family:var(--mono);font-size:12px;color:var(--faint);padding-top:5px;white-space:nowrap}.act.dark .entry .when{color:var(--muted-inv)}.entry h3{font-size:19px;font-weight:650;letter-spacing:-.015em}.entry .where{color:var(--muted);font-size:14px;margin-top:2px}.act.dark .entry .where{color:var(--muted-inv)}.entry ul{list-style:none;margin-top:12px}.entry li{font-size:13.5px;color:var(--muted);padding-left:15px;position:relative;margin-bottom:6px;line-height:1.6}.act.dark .entry li{color:var(--muted-inv)}.entry li:before{content:"";position:absolute;left:0;top:9px;width:7px;height:1.5px;background:var(--steel)}.act.dark .entry li:before{background:var(--steel-inv)}.parallel{position:relative;margin-top:44px;padding:26px 28px 28px;border:1px dashed rgba(236,238,240,.2);border-radius:16px;background:#ffffff07}.parallel-tag{display:inline-flex;align-items:center;gap:8px;margin-bottom:14px;font-family:var(--mono);font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--steel-inv)}.parallel-tag i{width:5px;height:5px;border-radius:50%;border:1px solid var(--steel-inv)}.parallel h3{font-size:19px;font-weight:650;letter-spacing:-.015em}.parallel .where{color:var(--muted-inv);font-size:14px;margin-top:3px}.parallel .pmeta{font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint);margin-top:8px}.parallel ul{list-style:none;margin-top:14px}.parallel li{font-size:13.5px;color:var(--muted-inv);padding-left:15px;position:relative;margin-bottom:6px;line-height:1.6}.parallel li:before{content:"";position:absolute;left:0;top:9px;width:7px;height:1.5px;background:var(--steel-inv)}.entry p{color:var(--muted);font-size:14.5px;max-width:52ch;margin-top:4px}.entry .tag{display:inline-block;margin-top:12px;padding:5px 11px;border-radius:999px;font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--steel);background:#33628f17}#projects .entry,#experience .entry{transition:border-color .25s ease}#projects .entry:hover{border-top-color:#1d232b4d}#experience .entry:hover{border-top-color:#eceef052}.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:30px;margin-top:90px}.stat{border-top:1px solid var(--line-inv);padding-top:18px}.stat .num{font-weight:750;font-size:clamp(40px,6vw,72px);letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums}.stat .num sup{font-size:.45em;vertical-align:.6em;color:var(--steel-inv)}.stat .lbl{font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted-inv);margin-top:10px}.edu{color:var(--muted);font-size:14.5px;margin-top:40px}.edu span{display:block}#contact .mail{display:inline-block;font-weight:650;letter-spacing:-.02em;font-size:clamp(22px,4.4vw,44px);text-decoration:none;border-bottom:2px solid var(--steel-inv);padding-bottom:4px;margin-top:40px;overflow-wrap:anywhere}#contact .mail:hover{color:var(--steel-inv)}#contact .status{display:inline-flex;align-items:center;gap:9px;margin-top:22px;font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--green-inv)}#contact .status i{width:7px;height:7px;border-radius:50%;background:var(--green-inv);box-shadow:0 0 #7fc49673;animation:pulse 2.6s ease-out infinite}.contact-row{display:flex;gap:10px;flex-wrap:wrap;margin-top:32px}.contact-row a{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border-radius:999px;font-size:13.5px;color:var(--ink-inv);text-decoration:none;background:#ffffff0d;border:1px solid rgba(236,238,240,.16);transition:background .2s ease,border-color .2s ease,transform .2s ease}.contact-row a:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--brand);opacity:.9}.contact-row a:hover,.contact-row a:focus-visible{outline:none;transform:translateY(-2px);background:#ffffff17;border-color:color-mix(in srgb,var(--brand) 60%,transparent)}footer.bottom{margin-top:90px;padding-top:22px;border-top:1px solid var(--line-inv);display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;font-size:12.5px;color:var(--muted-inv)}footer.bottom a{color:var(--muted-inv);text-decoration:none;display:inline-block;padding:8px 4px}footer.bottom a:hover{color:var(--steel-inv)}footer.bottom .fun{font-family:var(--mono);font-size:11px;letter-spacing:.04em}html.js .corner,html.js .hudbar,html.js .tagline,html.js .factline,html.js .scrollcue,html.js .glass{opacity:0}html.js .wordmark{opacity:0;transform:translateY(36px)}html.js .big-title{clip-path:inset(0 0 100% 0)}html.js .entry{opacity:0;transform:translateY(22px)}@media(max-width:900px){.corner{display:none}.hudbar{display:flex;position:absolute;left:0;right:0;z-index:3;font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}.hudbar-top{top:0;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;padding:13px 18px;background:#fbfbf9b8;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}.hb-status{display:flex;align-items:center;gap:7px;color:var(--green);white-space:nowrap}.hudbar-top>span:first-child{white-space:nowrap}.hb-status .dot{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 #3e7a5266;animation:pulse 2.6s ease-out infinite}.hudbar-bottom{bottom:0;justify-content:center;gap:13px;padding:16px 18px calc(16px + env(safe-area-inset-bottom));background:linear-gradient(#fbfbf900,#fbfbf9e0 55%)}.hicon{width:48px;height:48px;border-radius:15px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(29,35,43,.13);background:#ffffffd1;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:var(--brand, var(--ink));text-decoration:none;cursor:pointer;box-shadow:inset 0 1px #ffffffd9,0 2px 8px #1d232b0d;transition:transform .12s ease,border-color .2s ease,background .2s ease}.hicon svg{stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}.hicon svg.fill{fill:currentColor;stroke:none}.hicon:active{transform:scale(.9);border-color:color-mix(in srgb,var(--brand, var(--steel)) 55%,transparent)}.hicon:focus-visible{outline:2px solid var(--brand, var(--steel));outline-offset:2px}.scrollcue{bottom:96px}.wordmark{white-space:normal;line-height:1.18;font-size:clamp(26px,6.6vw,44px)}.tagline{font-size:15.5px;max-width:min(32ch,100%);margin-left:auto;margin-right:auto}.factline{margin-top:26px;gap:7px}.factline span{font-size:9.5px;padding:6px 11px}}@media(max-width:640px){.act{padding:76px 0 86px}.act.light{background-size:16px 16px}.mark{padding:40px 14px}.wordmark{letter-spacing:.07em;text-indent:.07em}.tagline{font-size:16px}.entry{grid-template-columns:1fr;gap:2px}.stats{grid-template-columns:1fr;gap:22px;margin-top:60px}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}html.js .corner,html.js .hudbar,html.js .tagline,html.js .factline,html.js .scrollcue,html.js .glass,html.js .wordmark,html.js .entry{opacity:1;transform:none}.scrollcue .track i,.scrollcue .chev{animation:none}html.js .big-title{clip-path:inset(0 0 0% 0)}}@media(max-height:520px)and (orientation:landscape){.mark{padding:16px 26px 18px}.tagline{font-size:14px;margin-top:14px;line-height:1.45}.factline{margin-top:16px;gap:6px}.scrollcue{display:none}.hudbar-bottom{padding:8px 18px calc(8px + env(safe-area-inset-bottom))}.hicon{width:40px;height:40px;border-radius:13px}}
