.theme-toggle{font:var(--text-meta);font-family:var(--font-mono);color:var(--mut);border:1px solid var(--line);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:14px;margin-left:auto;padding:5px 12px;transition:color .2s,border-color .2s}.theme-toggle:hover,.theme-toggle:focus-visible{color:var(--ink);border-color:var(--mut)}.image-slot{border:1px dashed var(--line);color:var(--mut);font:var(--text-meta);text-align:center;justify-content:center;align-items:center;padding:8px;display:flex;overflow:hidden}.image-slot--rounded{border-radius:6px}.image-slot--filled{border-style:solid;padding:0}.image-slot--circle{border-radius:50%}.image-slot--rect{border:none;border-radius:0;width:100%;height:100%}.image-slot>img{object-fit:cover;width:100%;height:100%;display:block}.home-header{flex-wrap:wrap;align-items:center;gap:20px;display:flex}.home-header>.image-slot{border:none;flex:none}:root[data-theme=dark] .home-header>.image-slot{background:#fbfaf7}.home-header__identity{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.home-header__name{font:var(--text-name);color:var(--ink);margin:0}.home-header__tagline{font:var(--text-nav);color:var(--mut);margin-top:3px}.otw-pill{font:400 10.5px/1.4 var(--font-mono);color:var(--mut);border:1px solid var(--line);white-space:nowrap;border-radius:12px;align-items:center;gap:6px;padding:3px 9px;display:inline-flex}.otw-dot{background:var(--dot);border-radius:50%;width:6px;height:6px;animation:2s step-end infinite blink}.home-intro{font:var(--text-intro);color:var(--body);margin:52px 0 0}.home-links{font:var(--text-nav);align-items:center;gap:24px;margin-top:28px;display:flex}.home-links__item{color:var(--ink);text-underline-offset:4px;text-decoration:underline}.home-links__cv{color:var(--inv-ink);background:var(--inv-bg);border-radius:3px;margin-left:auto;padding:6px 14px;text-decoration:none}.home-section{margin:48px 0 0;padding-top:28px}.home-section--projects{margin-top:56px}.project-list{flex-direction:column;margin-top:8px;display:flex}.project-list__item{border-bottom:1px solid var(--line);padding:18px 0;text-decoration:none;display:block}.project-list__head{align-items:baseline;gap:12px;display:flex}.project-list__title{font:var(--text-item-title);color:var(--ink)}.project-list__org{font:var(--text-meta);color:var(--mut)}.project-list__read{font:var(--text-nav);color:var(--mut);white-space:nowrap;margin-left:auto}.project-list__desc{font:var(--text-body-sm);color:var(--body);margin-top:6px}.project-list__tech{font:var(--text-label);letter-spacing:0;color:var(--mut);margin-top:8px}.skills-grid{font:400 13.5px/1.7 var(--font-mono);color:var(--body);grid-template-columns:76px 1fr;gap:10px 20px;margin-top:16px;display:grid}.skills-grid dt,.experience-row__years,.muted{color:var(--mut)}.skills-grid dt,.skills-grid dd{margin:0}.experience-list{font:400 13px/2.3 var(--font-mono);color:var(--body);margin-top:16px}.experience-row{justify-content:space-between;gap:16px;display:flex}.experience-row__role{flex-wrap:wrap;align-items:baseline;gap:14px;display:flex}.experience-row__links{font:var(--text-meta);gap:12px;display:inline-flex}.experience-row__links a{color:var(--mut);text-underline-offset:3px;text-decoration:underline}.experience-row__links a:hover{color:var(--ink)}.home-education{font:var(--text-meta);color:var(--mut);margin-top:14px}.beyond-teaser{color:inherit;margin-top:14px;text-decoration:none;display:block}.beyond-strip{grid-template-columns:repeat(4,1fr);gap:10px;display:grid}.beyond-strip .image-slot{aspect-ratio:4/5;transition:transform .3s}.beyond-strip .image-slot:nth-child(2){transition-delay:20ms}.beyond-strip .image-slot:nth-child(3){transition-delay:40ms}.beyond-strip .image-slot:nth-child(4){transition-delay:60ms}.beyond-teaser:hover .image-slot,.beyond-teaser:focus-visible .image-slot{transform:translateY(-4px)}.beyond-copy{justify-content:space-between;align-items:baseline;gap:20px;margin-top:16px;display:flex}.beyond-note{max-width:46ch;font:var(--text-intro);color:var(--body);margin:0}.beyond-cta{font:var(--text-nav);color:var(--ink);white-space:nowrap;flex:none}.beyond-teaser:hover .beyond-cta,.beyond-teaser:focus-visible .beyond-cta{text-underline-offset:4px;text-decoration:underline}.page-footer{border-top:1px solid var(--line);font:var(--text-meta);color:var(--mut);justify-content:space-between;margin:56px 0 0;padding-top:24px;display:flex}.page-footer a{color:var(--mut);text-decoration:none}.page-footer__links{align-items:center;gap:16px;display:flex}.theme-toggle--mobile{display:none}@media (width<=480px){.home-links{flex-wrap:wrap;row-gap:14px}.project-list__head{flex-wrap:wrap}.beyond-copy{flex-direction:column;gap:10px}.experience-row{flex-direction:column;gap:2px}.beyond-strip{grid-template-columns:repeat(2,1fr)}.theme-toggle--desktop{display:none}.theme-toggle--mobile{border:none;border-radius:0;align-items:center;padding:0;display:inline-flex}}.notfound-topbar{align-items:center;gap:16px;display:flex}.notfound-topbar__back{font:var(--text-nav);color:var(--mut);text-decoration:none}.notfound-topbar__back:hover,.notfound-topbar__back:focus-visible{color:var(--ink)}.notfound-topbar__path{font:var(--text-meta);color:var(--mut);flex:1}.notfound-title{font:var(--text-h1);color:var(--ink);letter-spacing:-.5px;margin:48px 0 0}.notfound-body{font:var(--text-prose);color:var(--body);margin:14px 0 0}.privacy-topbar{align-items:center;gap:16px;display:flex}.privacy-topbar__back{font:var(--text-nav);color:var(--mut);text-decoration:none}.privacy-topbar__back:hover,.privacy-topbar__back:focus-visible{color:var(--ink)}.privacy-topbar__path{font:var(--text-meta);color:var(--mut);flex:1}.privacy-title{font:var(--text-h1);color:var(--ink);letter-spacing:-.5px;margin:48px 0 0}.privacy-effective{font:var(--text-meta);color:var(--mut);margin:8px 0 0}.privacy-section{margin:40px 0 0}.privacy-section--first{margin-top:52px}.privacy-section p{font:var(--text-prose);color:var(--body);margin:14px 0 0}.privacy-section a{color:var(--ink)}.project-topbar{align-items:center;gap:16px;display:flex}.project-topbar__back{font:var(--text-nav);color:var(--mut);text-decoration:none}.project-topbar__back:hover,.project-topbar__back:focus-visible{color:var(--ink);opacity:1}.project-topbar__path{font:var(--text-meta);color:var(--mut)}.project-title{font:var(--text-h1);color:var(--ink);letter-spacing:-.5px;margin:48px 0 0}.project-intro{font:var(--text-intro);color:var(--body);margin:14px 0 0}.project-meta{border-top:1px solid var(--line);border-bottom:1px solid var(--line);font:var(--text-meta);grid-template-columns:repeat(4,1fr);gap:16px;margin:32px 0 0;padding:18px 0;display:grid}.project-meta__label{color:var(--mut)}.project-meta__value{color:var(--ink);margin-top:4px}.project-meta__link{color:var(--ink);text-decoration:underline;-webkit-text-decoration-color:var(--mut);text-decoration-color:var(--mut);text-underline-offset:3px;overflow-wrap:anywhere}.project-meta__link:hover,.project-meta__link:focus-visible{-webkit-text-decoration-color:var(--ink);text-decoration-color:var(--ink);opacity:1}.project-section{margin:40px 0 0}.project-section--first{margin-top:52px}.project-section p{font:var(--text-prose);color:var(--body);margin:14px 0 0}.project-screenshot{margin:32px 0 0}.project-screenshot img{border:1px solid var(--line);border-radius:6px;max-width:100%;height:auto;margin:0 auto;display:block}.project-screenshot--phone img{width:300px}.project-deepdive{border-top:1px solid var(--line);margin:52px 0 0;padding-top:28px}.project-deepdive__grid{font:var(--text-body-sm);color:var(--body);grid-template-columns:76px 1fr;gap:10px 20px;margin-top:16px;display:grid}.project-deepdive__grid dt{color:var(--mut)}.project-deepdive__grid dt,.project-deepdive__grid dd{margin:0}.project-decisions{font:400 13px/2 var(--font-mono);color:var(--body);margin-top:20px}.project-decisions__list{margin:8px 0 0;padding:0;list-style:none}.project-pagenav{border-top:1px solid var(--line);font:var(--text-nav);justify-content:space-between;align-items:baseline;gap:16px;margin:56px 0 0;padding-top:24px;display:flex}.project-pagenav__prev{color:var(--mut);text-decoration:none}.project-pagenav__prev:hover,.project-pagenav__prev:focus-visible{color:var(--ink);opacity:1}.project-pagenav__next{color:var(--ink);text-decoration:none}@media (width<=560px){.project-meta{grid-template-columns:repeat(2,1fr)}}.travel-topbar{align-items:center;gap:16px;display:flex}.travel-topbar__back{font:var(--text-nav);color:var(--mut);text-decoration:none}.travel-topbar__back:hover,.travel-topbar__back:focus-visible{color:var(--ink);opacity:1}.travel-topbar__path{font:var(--text-meta);color:var(--mut)}.travel-frame{border:1px solid var(--line);background:var(--bg);position:relative;overflow:hidden}.travel-title{font:var(--text-h1);color:var(--ink);letter-spacing:-.5px;margin:48px 0 0}.travel-intro{font:var(--text-intro);color:var(--body);margin:14px 0 0}.travel-filter{font:var(--text-nav);flex-wrap:wrap;align-items:baseline;gap:8px 22px;margin-top:26px;display:flex}.travel-filter__btn{cursor:pointer;font:var(--text-nav);color:var(--mut);background:0 0;border:none;margin:0;padding:0;transition:color .2s}.travel-filter__btn:hover,.travel-filter__btn:focus-visible{color:var(--ink)}.travel-filter__btn.is-active{color:var(--ink);text-underline-offset:4px;text-decoration:underline}.travel-filter__count{font:var(--text-meta);color:var(--mut);margin-left:auto}.travel-masonry{column-count:2;column-gap:20px;margin-top:34px}.travel-cover{break-inside:avoid;-webkit-column-break-inside:avoid;flex-direction:column;gap:9px;margin:0 0 24px;display:flex}.travel-cover__frame{text-decoration:none;display:block;position:relative}.travel-cover__badge{pointer-events:none;font:500 10px/1 var(--font-mono);letter-spacing:.06em;color:#f0f0ea;background:#0e0e0e99;align-items:center;gap:5px;padding:5px 7px;display:flex;position:absolute;top:9px;left:9px}.travel-cover__cap{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.travel-cover__place{font:600 13px/1.4 var(--font-mono);color:var(--ink)}.travel-cover__year{font:400 11px/1.4 var(--font-mono);color:var(--mut)}.travel-cover__country{font:400 11px/1.4 var(--font-mono);color:var(--mut);margin-top:-4px}.travel-post__head{margin-top:46px}.travel-post__eyebrow{font:500 11px/1.4 var(--font-mono);letter-spacing:.18em;text-transform:uppercase;color:var(--dot)}.travel-post__place{font:600 34px/1.15 var(--font-mono);color:var(--ink);letter-spacing:-.6px;margin:12px 0 0}.travel-post__country{font:400 15px/1.5 var(--font-mono);color:var(--body);margin-top:6px}.travel-post__meta{font:var(--text-meta);color:var(--mut);margin-top:16px}.travel-post__blurb{font:var(--text-intro);color:var(--body);margin:20px 0 0}.travel-post__frames{margin-top:36px}.travel-post__figure{margin:0 0 34px}.travel-post__figcap{font:var(--text-meta);color:var(--mut);align-items:baseline;gap:10px;margin-top:10px;display:flex}.travel-post__fignum{color:var(--body)}.travel-post__nav{border-top:1px solid var(--line);justify-content:space-between;gap:16px;margin-top:20px;padding-top:24px;display:flex}.travel-post__navlink{max-width:46%;text-decoration:none}.travel-post__navlink--next{text-align:right}.travel-post__navlabel{font:400 11px/1.5 var(--font-mono);color:var(--mut);display:block}.travel-post__navplace{font:600 14px/1.4 var(--font-mono);color:var(--ink);margin-top:4px;display:block}:root,:root[data-theme=dark]{--bg:#0e0e0e;--ink:#f0f0ea;--body:#b8b8b0;--mut:#90908a;--line:#222220;--inv-bg:#f0f0ea;--inv-ink:#0e0e0e;--dot:#4ade80;--duration-fade:.5s;--ease-fade:ease}:root[data-theme=light]{--bg:#fbfaf7;--ink:#141412;--body:#3c3a34;--mut:#6b6a63;--line:#e6e3da;--inv-bg:#141412;--inv-ink:#fbfaf7}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2)format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2)format("woff2"),url(/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2)format("woff2"),url(/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2)format("woff2"),url(/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2)format("woff2"),url(/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2)format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2)format("woff2"),url(/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2)format("woff2"),url(/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2)format("woff2"),url(/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2)format("woff2"),url(/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2)format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2)format("woff2"),url(/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2)format("woff2"),url(/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2)format("woff2"),url(/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2)format("woff2"),url(/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--text-label:400 11px/1.4 var(--font-mono);--text-meta:400 12px/1.6 var(--font-mono);--text-nav:400 13px/1.5 var(--font-mono);--text-body-sm:400 13px/1.7 var(--font-mono);--text-prose:400 13.5px/1.9 var(--font-mono);--text-intro:400 14px/1.9 var(--font-mono);--text-item-title:600 14px/1.4 var(--font-mono);--text-name:600 17px/1.3 var(--font-mono);--text-h1:600 30px/1.25 var(--font-mono)}*{box-sizing:border-box}body{background:var(--bg);font-family:var(--font-mono);margin:0;transition:background .35s}a{color:var(--ink)}a:hover{opacity:.75}a:focus-visible,button:focus-visible{outline:2px solid var(--ink);outline-offset:2px}.page{min-height:100vh}.page-column{max-width:620px;margin:0 auto;padding:80px 32px 72px}.page-column--project{padding-top:56px}.section-label{font:var(--text-label);letter-spacing:2px;color:var(--mut);text-transform:uppercase;margin:0}.fade-up{animation:fadeUp var(--duration-fade) var(--ease-fade) both;animation-delay:var(--fade-delay,0s)}@keyframes fadeUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}@keyframes blink{0%,49%{opacity:1}50%,to{opacity:0}}@media (prefers-reduced-motion:reduce){.fade-up{animation:none}.otw-dot{animation:none!important}body{transition:none}}
