@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-ext-opsz-normal.CfYZpDVp.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-opsz-normal.BFQXbQ-f.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-ext-opsz-normal.BmPQvyvo.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-opsz-normal.BM0NlUE_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-vietnamese-opsz-normal.Ci9T9ieq.woff2)format("woff2-variations");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:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-ext-opsz-normal.DpK-iCPk.woff2)format("woff2-variations");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:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-opsz-normal.BwkfbSeq.woff2)format("woff2-variations");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{--bg:#f8f9fb;--fg:#0a0c10;--text:#262a33;--muted:#5b6270;--faint:#8a919e;--line:#e3e6eb;--surface:#eceff3;--raised:#fff;--accent:#3b6e9e;--radius:16px;--wide:1120px;--narrow:680px;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#0a0b0e;--fg:#f3f5f8;--text:#d3d7de;--muted:#9ba2ae;--faint:#6b727e;--line:#21252c;--surface:#161a20;--raised:#232831;--accent:#7fa8cf;color-scheme:dark}}:root[data-theme=dark]{--bg:#0a0b0e;--fg:#f3f5f8;--text:#d3d7de;--muted:#9ba2ae;--faint:#6b727e;--line:#21252c;--surface:#161a20;--raised:#232831;--accent:#7fa8cf;color-scheme:dark}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-padding-top:96px}@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}body{background:var(--bg);color:var(--text);font-optical-sizing:auto;font-feature-settings:"liga" 1, "calt" 1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;font:400 16px/1.6 Inter Variable,ui-sans-serif,system-ui,sans-serif}a{color:inherit;text-decoration:none}img{max-width:100%;height:auto;display:block}h1,h2,h3,h4{color:var(--fg);letter-spacing:-.022em;text-wrap:balance;margin:0;font-weight:600}p{text-wrap:pretty}::selection{background:color-mix(in srgb, var(--accent) 22%, transparent)}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:6px}.wrap{max-width:var(--wide);margin:0 auto;padding:0 24px}.narrow{max-width:var(--narrow)}.eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 14px;font-size:13px;font-weight:500}.muted{color:var(--muted)}.tnum{font-variant-numeric:tabular-nums}.site-header{z-index:10;background:color-mix(in srgb, var(--bg) 82%, transparent);-webkit-backdrop-filter:saturate(1.6)blur(14px);position:sticky;top:0}.site-header .wrap{justify-content:space-between;align-items:center;height:64px;display:flex}.brand{letter-spacing:-.01em;color:var(--fg);font-size:15px;font-weight:600}.nav{align-items:center;gap:4px;font-size:14px;display:flex}.nav a{color:var(--muted);border-radius:99px;padding:6px 10px;transition:color .2s}.nav a:hover,.nav a[aria-current=page]{color:var(--fg)}.lang{background:var(--surface);border-radius:99px;margin-left:8px;padding:2px;font-size:12px;font-weight:500;display:inline-flex}.nav .lang a{color:var(--muted);padding:3px 8px}.nav .lang a[aria-current=true]{background:var(--raised);color:var(--fg);font-weight:600;box-shadow:0 1px 2px #0a0c101f,0 0 0 1px #0a0c100a}.icon-btn{width:32px;height:32px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:99px;place-items:center;margin-left:4px;transition:color .2s;display:inline-grid}.icon-btn:hover{color:var(--fg)}.icon-btn svg{width:17px;height:17px}.icon-btn .moon,:root[data-theme=dark] .icon-btn .sun{display:none}:root[data-theme=dark] .icon-btn .moon{display:block}@media (width<=560px){.nav .hide-sm{display:none}.brand{font-size:14px}}.site-footer{border-top:1px solid var(--line);color:var(--muted);margin-top:120px;padding:32px 0 48px;font-size:13px}.site-footer .wrap{flex-wrap:wrap;justify-content:space-between;gap:12px 24px;display:flex}.site-footer nav{flex-wrap:wrap;gap:6px 18px;display:flex}.site-footer a:hover{color:var(--fg)}.hero{grid-template-columns:300px 1fr;align-items:center;gap:72px;padding:104px 0 96px;display:grid}.portrait{aspect-ratio:3/4;object-fit:cover;border-radius:20px;width:100%}@media (width<=860px){.hero{grid-template-columns:1fr;gap:40px}.portrait{border-radius:16px;width:200px}}.hero h1{letter-spacing:-.045em;font-size:clamp(44px,6.4vw,80px);font-weight:600;line-height:1}.hero p{max-width:620px;color:var(--muted);letter-spacing:-.011em;margin:28px 0 0;font-size:clamp(18px,2.1vw,21px);line-height:1.55}.hero p a{color:var(--fg);background:linear-gradient(currentColor,currentColor) 0 100%/100% 1px no-repeat;transition:background-size .3s}.hero p a:hover{background-position:100% 100%;background-size:0 1px}.socials{color:var(--muted);gap:20px;margin-top:32px;font-size:14px;display:flex}.socials a:hover{color:var(--fg)}.section{padding-top:56px}.section-head{border-bottom:1px solid var(--line);justify-content:space-between;align-items:baseline;padding-bottom:20px;display:flex}.section-head h2{letter-spacing:-.005em;color:var(--muted);font-size:15px;font-weight:500}.section-head a{color:var(--muted);font-size:14px}.section-head a:hover{color:var(--fg)}.projects{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:40px 32px;padding-top:28px;display:grid}.project{flex-direction:column;display:flex;position:relative}.project h3 a:after{content:"";position:absolute;inset:0}.project a.domain{z-index:1;position:relative}.project .info{grid-template-columns:1fr auto;grid-template-areas:"name when""desc desc""domain domain";align-items:baseline;column-gap:16px;display:grid}.project .info h3{grid-area:name}.project .info p{grid-area:desc}.project .info .links{flex-wrap:wrap;grid-area:domain;column-gap:16px;display:flex}.project .when{letter-spacing:.08em;text-transform:uppercase;color:var(--faint);grid-area:when;font-size:11.5px;font-weight:500}.project .shot{aspect-ratio:16/10;background:var(--surface);border-radius:12px;margin-bottom:14px;transition:transform .5s cubic-bezier(.2,.7,.2,1),box-shadow .5s;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a}.project .shot:after{content:"";border-radius:inherit;position:absolute;inset:0;box-shadow:inset 0 0 0 1px #00000012}.project .shot img{object-fit:cover;object-position:top;width:100%;height:100%}.project:hover .shot{transform:translateY(-4px);box-shadow:0 18px 40px -16px #00000038}.project h3{letter-spacing:-.02em;font-size:18px}.project p{color:var(--muted);max-width:56ch;margin:5px 0 0;font-size:15px;line-height:1.5}.project .domain{color:var(--faint);margin-top:7px;font-size:13px;transition:color .2s}.project .domain:after{content:" ↗";transition:transform .25s;display:inline-block}.project:hover .domain,.project a.domain:hover{color:var(--fg)}.project:hover .domain:after{transform:translate(2px,-2px)}@media (width>=760px){.project h3{font-size:21px}.projects{grid-template-columns:1fr 1fr;gap:44px 36px}}.post-list{margin:0;padding:0;list-style:none}.post-list a{border-bottom:1px solid var(--line);justify-content:space-between;align-items:baseline;gap:24px;padding:18px 0;display:flex}.post-list .title{color:var(--fg);letter-spacing:-.014em;font-size:17px;font-weight:500;transition:color .2s}.post-list a:hover .title,.hero p a:hover{color:var(--accent)}.post-list time{color:var(--faint);flex:none;font-size:14px}.interests{grid-template-columns:1fr 1fr;gap:12px;margin:0;padding:28px 0 0;list-style:none;display:grid}.interest{background:var(--surface);height:100%;color:var(--fg);letter-spacing:-.02em;hyphens:auto;border-radius:12px;flex-direction:column;justify-content:space-between;gap:28px;padding:16px 18px 18px;font-size:16px;font-weight:600;line-height:1.25;transition:background .2s,box-shadow .2s;display:flex}.interest span{letter-spacing:.08em;text-transform:uppercase;color:var(--faint);justify-content:space-between;font-size:11.5px;font-weight:500;display:flex}a.interest span:after{content:"↗";letter-spacing:0;transition:transform .25s,color .2s}a.interest:hover{background:var(--raised);box-shadow:0 0 0 1px var(--line)}a.interest:hover span:after{color:var(--fg);transform:translate(2px,-2px)}@media (width>=760px){.interests{grid-template-columns:repeat(5,1fr);gap:16px}.interest{font-size:17px}}.blog-head{text-align:center;padding:96px 0 40px}.blog-head h1{letter-spacing:-.04em;font-size:clamp(34px,5vw,52px);line-height:1.05}.blog-head .note{color:var(--muted);margin:16px 0 0}.filters{scrollbar-width:none;margin:0 -24px 48px;padding:0 24px;display:flex;overflow-x:auto}.filters::-webkit-scrollbar{display:none}.pills{background:var(--surface);border-radius:99px;gap:2px;margin:0 auto;padding:4px;display:inline-flex}.pills button{font:inherit;color:var(--text);cursor:pointer;background:0 0;border:0;border-radius:99px;flex:none;padding:7px 15px;font-size:14px;font-weight:500;transition:color .2s,background .2s}.pills button:hover{color:var(--fg)}.pills button[aria-pressed=true]{background:var(--raised);color:var(--fg);font-weight:600;box-shadow:0 1px 2px #0a0c101f,0 0 0 1px #0a0c100a}.grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:48px 32px;display:grid}.card{flex-direction:column;display:flex}.card[hidden]{display:none}.card .thumb{aspect-ratio:3/2;background:var(--surface);border-radius:14px;position:relative;overflow:hidden}.card .thumb:after{content:"";border-radius:inherit;pointer-events:none;position:absolute;inset:0;box-shadow:inset 0 0 0 1px #0000000f}.card .thumb img{object-fit:cover;width:100%;height:100%;transition:transform .8s cubic-bezier(.2,.7,.2,1)}.card:hover .thumb img{transform:scale(1.03)}.card .body{padding-top:20px}.card .kicker{letter-spacing:.08em;text-transform:uppercase;color:var(--accent);align-items:baseline;gap:14px;margin-bottom:12px;font-size:11.5px;font-weight:600;display:flex}.card .kicker .when{letter-spacing:.04em;color:var(--faint);font-weight:500}.card h2{letter-spacing:-.026em;text-wrap:balance;font-size:21px;line-height:1.14;transition:opacity .2s}.card h2 .dek{letter-spacing:-.011em;color:var(--muted);text-wrap:pretty;margin-top:6px;font-size:16px;font-weight:400;line-height:1.35;display:block}.card:hover h2{opacity:.72}.card p{color:var(--muted);-webkit-line-clamp:4;-webkit-box-orient:vertical;margin:14px 0 0;font-size:17px;line-height:1.55;display:none;overflow:hidden}@media (width>=860px){.grid:not(.filtered) .card:first-child{grid-column:1/-1;grid-template-columns:1.45fr 1fr;align-items:center;gap:48px;margin-bottom:24px;display:grid}.grid:not(.filtered) .card:first-child .thumb{aspect-ratio:16/10;border-radius:18px}.grid:not(.filtered) .card:first-child .body{padding:0}.grid:not(.filtered) .card:first-child h2{letter-spacing:-.035em;font-size:38px;line-height:1.08}.grid:not(.filtered) .card:first-child p{display:-webkit-box}.grid:not(.filtered) .card:first-child h2 .dek{letter-spacing:-.02em;margin-top:10px;font-size:22px}}.article-head{text-align:center;max-width:820px;margin:0 auto;padding:96px 24px 56px}.article-head .kicker{letter-spacing:.1em;text-transform:uppercase;color:var(--accent);margin-bottom:22px;font-size:12px;font-weight:600;display:inline-block}.article-head h1{letter-spacing:-.045em;font-size:clamp(38px,6vw,64px);font-weight:700;line-height:1.02}.article-head .dek{letter-spacing:-.014em;max-width:640px;color:var(--muted);text-wrap:balance;margin:22px auto 0;font-size:clamp(19px,2.2vw,23px);font-weight:400;line-height:1.42}.article-head .byline{text-align:left;grid-template-rows:auto auto;grid-template-columns:auto auto;align-items:center;column-gap:12px;margin-top:36px;display:inline-grid}.article-head .byline img{object-fit:cover;border-radius:50%;grid-row:span 2;width:38px;height:38px}.article-head .byline .name{color:var(--fg);font-size:14px;font-weight:600;line-height:1.3}.article-head .byline .meta{color:var(--muted);font-size:13px;line-height:1.3}.cover{max-width:1040px;margin:0 auto 72px;padding:0 24px}.cover img{object-fit:cover;border-radius:20px;width:100%;max-height:560px}.article-body{grid-template-columns:1fr min(var(--narrow), 100% - 48px) 1fr;display:grid;position:relative}.article-body>.prose{grid-column:2}.toc-rail{grid-column:1;justify-self:end;width:220px;margin-right:56px}.toc-rail nav{scrollbar-width:none;max-height:calc(100vh - 140px);position:sticky;top:104px;overflow:auto}.toc-title{letter-spacing:.08em;text-transform:uppercase;color:var(--faint);margin:0 0 12px;font-size:12px;font-weight:500}.toc ol{counter-reset:toc;margin:0;padding:0;list-style:none}.toc li{counter-increment:toc}.toc a{color:var(--muted);gap:10px;padding:6px 0;font-size:13.5px;line-height:1.4;transition:color .2s;display:flex}.toc a:before{content:counter(toc, decimal-leading-zero);font-variant-numeric:tabular-nums;color:var(--faint);flex:none;padding-top:1px;font-size:12px}.toc a:hover,.toc a.active{color:var(--fg)}.toc a.active:before{color:var(--accent)}.toc-inline{display:none}@media (width<=1240px){.toc-rail{display:none}.toc-inline{border-radius:var(--radius);background:var(--surface);margin:0 0 48px;padding:4px 20px;display:block}.toc-inline summary{cursor:pointer;color:var(--fg);justify-content:space-between;padding:14px 0;font-size:14px;font-weight:500;list-style:none;display:flex}.toc-inline summary::-webkit-details-marker{display:none}.toc-inline summary:after{content:"+";color:var(--muted);font-weight:400;transition:transform .2s}.toc-inline[open] summary:after{transform:rotate(45deg)}.toc-inline ol{padding-bottom:14px}}.prose{letter-spacing:normal;color:var(--fg);min-width:0;font-size:1.1rem;font-weight:450;line-height:1.68}.prose>*{margin:0}.prose>*+*{margin-top:1.25em}.prose>:first-child{margin-top:0}.prose>p:first-of-type:first-letter{float:left;color:var(--fg);margin:.12rem .55rem 0 0;font-size:3.9rem;font-weight:700;line-height:1}@media (width<=768px){.prose>p:first-of-type:first-letter{font-size:3.3rem}}.prose h2{letter-spacing:-.025em;margin-top:2.2em;font-size:1.75rem;font-weight:750;line-height:1.18}.prose h3{letter-spacing:-.015em;margin-top:1.9em;font-size:1.4rem;font-weight:700;line-height:1.25}.prose h4{margin-top:1.8em;font-size:18px}.prose h2+*,.prose h3+*,.prose h4+*{margin-top:.7em}.prose a{color:var(--fg);text-decoration:underline;text-decoration-color:var(--faint);text-underline-offset:3px;text-decoration-thickness:1px;transition:text-decoration-color .2s}.prose a:hover{color:var(--accent);text-decoration-color:var(--accent)}.prose strong{color:var(--fg);font-weight:700}.prose ul,.prose ol{padding-left:1.3em}.prose li+li{margin-top:.45em}.prose li::marker{color:var(--accent)}.prose ol>li::marker{font-variant-numeric:tabular-nums;font-weight:600}.prose blockquote{border-radius:var(--radius);background:var(--surface);color:var(--fg);margin:2em 0;padding:1.5rem 1.75rem 1.5rem 4rem;font-size:1.1rem;line-height:1.68;position:relative}.prose blockquote:before{content:"❝";color:var(--faint);font-size:2rem;line-height:1;position:absolute;top:1.3rem;left:1.35rem}.prose blockquote strong{font-weight:600}.prose blockquote a{color:var(--muted)}@media (width<=640px){.prose blockquote{padding:3.4rem 1.25rem 1.25rem}.prose blockquote:before{top:1rem;left:1.25rem}}.prose blockquote p{margin:0}.prose blockquote p+p{margin-top:.75rem}.prose blockquote cite{margin-top:.6rem}.prose hr{background:var(--line);border:0;height:1px;margin:3.5em 0}.prose img{border-radius:12px;margin:2.2em auto 0}.prose p:has(>img:only-child){margin:2.2em 0}.prose figcaption,.prose img+em{color:var(--muted);text-align:center;margin-top:10px;font-size:14px;display:block}.prose iframe{aspect-ratio:16/9;border:0;border-radius:12px;width:100%;height:auto;margin:2.2em 0;display:block}.prose table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;font-size:15px;display:block;overflow-x:auto}.prose th,.prose td{text-align:left;border-bottom:1px solid var(--line);padding:10px 12px}.prose th{color:var(--fg);font-weight:600}.prose code{background:var(--surface);border-radius:6px;padding:.15em .4em;font-size:.88em}.prose sup{line-height:0}.prose .stats{border-radius:var(--radius);background:var(--line);border:1px solid var(--line);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1px;margin:2.4em 0;display:grid;overflow:hidden}.prose .stats>div{background:var(--bg);text-align:center;padding:26px 20px 22px}.prose .stats b{letter-spacing:-.045em;color:var(--fg);font-variant-numeric:tabular-nums;font-size:40px;font-weight:600;line-height:1;display:block}.prose .stats span{color:var(--muted);margin-top:10px;font-size:13px;line-height:1.4;display:block}.article-foot{max-width:calc(var(--narrow) + 48px);margin:96px auto 0;padding:0 24px}.article-foot .post-list a{padding:16px 0}:root[data-theme=dark] .prose img,:root[data-theme=dark] .card img,:root[data-theme=dark] .cover img{filter:brightness(.88)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) :is(.prose,.card,.cover) img{filter:brightness(.88)}}@media (width<=640px){.hero{padding:56px 0 64px}.article-head{padding-top:56px}.prose h2{font-size:24px}.post-list a{flex-direction:column;gap:4px}.cover{margin-bottom:48px}.cover img{border-radius:14px}}.prose blockquote cite{text-align:right;color:var(--muted);font-size:.9rem;font-style:normal;font-weight:450;line-height:1.3;display:block}.prose blockquote cite:before{content:"— "}.prose blockquote cite strong{color:inherit;font-weight:500}.prose blockquote p:has(>cite:only-child){margin-top:.75rem}
