@font-face{font-family:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/fraunces-vietnamese-opsz-normal.Czevyj-6.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:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/fraunces-latin-ext-opsz-normal.CJcjJNj7.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:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/fraunces-latin-opsz-normal.DihXLNYH.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}@font-face{font-family:Figtree Variable;font-style:normal;font-display:swap;font-weight:300 900;src:url(/_astro/figtree-latin-ext-wght-normal.DCwSJGxG.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:Figtree Variable;font-style:normal;font-display:swap;font-weight:300 900;src:url(/_astro/figtree-latin-wght-normal.D_ZTVpCC.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}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2)format("woff2"),url(/_astro/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(/_astro/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2)format("woff2"),url(/_astro/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(/_astro/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2)format("woff2"),url(/_astro/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(/_astro/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2)format("woff2"),url(/_astro/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(/_astro/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2)format("woff2"),url(/_astro/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}:root{--paper:light-dark(#f8f5f0,#1e2220);--paper-raised:light-dark(#fdfbf7,#272c29);--paper-sunken:light-dark(#efebe4,#181c1a);--line:light-dark(#ddd8cf,#3a403c);--line-strong:light-dark(#7c827b,#7f857d);--ink:light-dark(#1e2220,#f5f2ec);--ink-muted:light-dark(#4a504a,#c9cdc4);--ink-subtle:light-dark(#62685f,#9aa096);--accent:light-dark(#2f6b5a,#82a69c);--accent-strong:light-dark(#245447,#a3c2b8);--accent-subtle:light-dark(#e2ece7,#2a3a35);--on-accent:light-dark(#f8f5f0,#1e2220);--seal-dot:light-dark(#82a69c,#2f6b5a);--syntax-comment:light-dark(#72655c,#928374);--syntax-punctuation:var(--ink-muted);--syntax-keyword:light-dark(#b14444,#ea6962);--syntax-string:light-dark(#626e2a,#a9b665);--syntax-number:light-dark(#885675,#d3869b);--syntax-function:light-dark(#457055,#89b482);--syntax-type:light-dark(#905a04,#d8a657);--syntax-property:light-dark(#426b75,#7daea3);--syntax-tag:light-dark(#a44e06,#e78a4e);--syntax-inserted:light-dark(#626e2a,#a9b665);--syntax-deleted:light-dark(#b14444,#ea6962);--shadow:light-dark(#1e22201f,#00000073);--font-display:"Fraunces Variable", Georgia, serif;--font-body:"Figtree Variable", system-ui, sans-serif;--font-code:"IBM Plex Mono", ui-monospace, monospace}:root{--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--space-8:4rem;--space-9:6rem;--radius-small:6px;--radius-medium:12px;--tap-target-size:2.75rem;--text-body:1.125rem;color-scheme:light dark;&[data-theme=light]{color-scheme:light}&[data-theme=dark]{color-scheme:dark}}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-padding-top:6rem}body{background:var(--paper);color:var(--ink);font-family:var(--font-body);font-size:var(--text-body);margin:0;line-height:1.75rem}img,svg{max-width:100%}a{color:inherit}h1,h2,h3,p{margin:0}ul[class],ol[class]{margin:0;padding:0;list-style:none}address{font-style:normal}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.skip-link{left:var(--space-4);background:var(--paper-raised);border:1px solid var(--line);padding:var(--space-2) var(--space-4);z-index:10;position:absolute;top:-100px;&:focus{top:var(--space-4)}}.display{font-family:var(--font-display);letter-spacing:-.02em;text-wrap:balance;margin:0;font-size:2.75rem;font-weight:600;line-height:3.125rem;@media (width<=35em){font-size:2.25rem;line-height:2.625rem}}.h1{font-family:var(--font-display);letter-spacing:-.015em;margin:0;font-size:2.5rem;font-weight:600;line-height:2.875rem;@media (width<=35em){font-size:2rem;line-height:2.375rem}}.h2{font-family:var(--font-display);letter-spacing:-.01em;margin:0;font-size:1.75rem;font-weight:600;line-height:2.25rem;@media (width<=35em){font-size:1.5rem;line-height:2rem}}.h3{font-family:var(--font-display);margin:0;font-size:1.375rem;font-weight:600;line-height:1.875rem}.lead{font-family:var(--font-display);color:var(--ink-muted);margin:0;font-size:1.25rem;line-height:2rem}.muted{color:var(--ink-muted)}.small{color:var(--ink-subtle);font-size:.875rem;line-height:1.375rem}.label{letter-spacing:.02em;color:var(--ink-subtle);font-size:.8125rem;font-weight:500;line-height:1.125rem}[data-slot=root]{grid-template-rows:auto 1fr auto;grid-template-columns:minmax(0,1fr);min-height:100dvh;display:grid;position:relative}.container{max-width:48rem;padding:0 var(--space-5);margin:0 auto}.site-header{top:var(--space-4);z-index:5;margin-top:var(--space-4);justify-content:space-between;align-items:center;gap:var(--space-1) var(--space-3);margin-inline:calc(-1 * var(--space-4));padding:var(--space-1) var(--space-2) var(--space-1) var(--space-1);border:1px solid var(--line);background:color-mix(in oklab, var(--paper-raised) 60%, transparent);backdrop-filter:blur(20px)saturate(1.8);box-shadow:0 8px 24px -12px var(--shadow);border-radius:100rem;flex-wrap:wrap;display:flex;position:sticky;@supports not (backdrop-filter:blur(1px)){background:color-mix(in oklab, var(--paper-raised) 94%, transparent)}& .brand{border-radius:100rem}@media (width<=35em){border-radius:var(--radius-medium);padding:var(--space-1) var(--space-1) var(--space-1) var(--space-2);grid-template-columns:1fr auto;grid-template-areas:"brand theme""nav nav";margin-inline:0;display:grid;position:static;& .brand{grid-area:brand}& .header-actions{display:contents}& nav{grid-area:nav}& .theme-button{grid-area:theme}}}.brand{align-items:center;gap:var(--space-3);font-family:var(--font-display);letter-spacing:-.01em;font-size:1.75rem;font-weight:500;line-height:2rem;text-decoration:none;display:inline-flex;& b{font-weight:700}& .brand-dot{color:var(--accent);font-weight:900}}.header-actions{align-items:center;gap:0 var(--space-2);flex-wrap:wrap;display:flex}.site-nav{gap:0 var(--space-1);flex-wrap:wrap;display:flex;& a{min-height:var(--tap-target-size);padding-inline:var(--space-3);padding-block:var(--space-2);color:var(--ink-muted);border-radius:100rem;align-items:center;font-size:1rem;font-weight:500;text-decoration:none;display:inline-flex;position:relative;&:hover{color:var(--ink);background:var(--paper-sunken)}&[aria-current=page]{color:var(--ink);font-weight:650;&:after{content:"";background:var(--accent);border-radius:50%;width:.3125rem;height:.3125rem;position:absolute;bottom:.3rem;left:50%;translate:-50%}}}@media (width<=35em){justify-content:space-between;gap:0;& a{padding-inline:var(--space-2);font-size:.9375rem}}}.theme-button{width:var(--tap-target-size);height:var(--tap-target-size);color:var(--ink-muted);cursor:pointer;background:0 0;border:0;border-radius:100rem;justify-content:center;align-items:center;display:inline-flex;&:hover{color:var(--ink);background:var(--paper-sunken)}}main{padding-bottom:var(--space-2)}.intro{margin-top:var(--space-8);gap:var(--space-4);flex-direction:column;display:flex;&.split{align-items:center;gap:var(--space-5);flex-flow:wrap;&.align-end{align-items:flex-end;gap:var(--space-5) var(--space-6)}}}.intro-text{gap:var(--space-2);flex-direction:column;flex:16.25rem;display:flex}.contact{align-items:center;gap:0 var(--space-5);flex-wrap:wrap;display:flex}.intro.resume-intro{gap:var(--space-2) var(--space-5);grid-template-columns:auto 1fr auto;grid-template-areas:"seal text download""seal contact contact";align-items:start;display:grid;& .seal{margin-top:var(--space-1);grid-area:seal}& .intro-text{grid-area:text}& .contact{grid-area:contact}& .resume-download{grid-area:download}@media (width<=35em){grid-template-columns:1fr;grid-template-areas:"seal""text""contact""download";justify-items:start}}.section{margin-top:var(--space-8);&.tight{margin-top:var(--space-7)}&>.label{font-family:var(--font-display);padding-bottom:var(--space-3);border-bottom:1px solid var(--line);margin:0;font-size:1.275rem;font-weight:600;display:block}}.section-more{padding-top:var(--space-3)}.site-footer{margin-top:var(--space-8);padding:var(--space-6) 0 var(--space-7);border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:var(--space-4);flex-wrap:wrap;display:flex}.footer-identity{align-items:center;gap:var(--space-3);display:flex;& .brand{font-size:1.25rem;line-height:1.625rem}}.footer-links{gap:var(--space-4);display:flex;& a{font-weight:500}}.link{color:var(--accent);text-underline-offset:3px;text-decoration:underline 1px;&:hover{color:var(--accent-strong);text-decoration-thickness:2px}}.tap-target{min-height:var(--tap-target-size);align-items:center;display:inline-flex}.button{min-height:var(--tap-target-size);padding:0 var(--space-5);border-radius:var(--radius-small);border:1px solid var(--line-strong);color:var(--ink);background:0 0;justify-content:center;align-items:center;font-size:1rem;font-weight:600;text-decoration:none;display:inline-flex;&:hover{background:var(--paper-sunken)}& svg{flex:none}&:has(svg){gap:var(--space-2);padding-inline:var(--space-4) var(--space-5)}}.row{align-items:center;gap:var(--space-4);padding:var(--space-4) 0;border-bottom:1px solid var(--line);color:var(--ink);min-height:var(--tap-target-size);text-decoration:none;display:flex;position:relative;& .row-body{flex-direction:column;flex:auto;gap:.125rem;min-width:0;display:flex}& .row-title{font-family:var(--font-display);margin:0 0 .15rem;font-size:1.35rem;font-weight:600;line-height:1.75rem}& .row-description{color:var(--ink-muted);font-size:.9375rem;line-height:1.375rem;&.subtle{color:var(--ink-subtle)}}& .row-date{white-space:nowrap;color:var(--ink-subtle);flex:0 0 6.5rem;font-size:.875rem}& .row-label{color:var(--ink-subtle);flex:0 0 6rem;font-size:.875rem;font-weight:500;@media (width<=30em){flex-basis:5rem}}& .row-value{font-size:var(--text-body);flex:auto}& .arrow{color:var(--ink-subtle);flex:none}& ul{margin:var(--space-1) 0 0;padding-left:var(--space-5);color:var(--ink-muted);font-size:.9375rem;line-height:1.375rem}&.align-top{align-items:flex-start;& .row-date{padding-top:.15rem}& .arrow{align-self:center}}&.resume-entry{& .row-date{flex-basis:9rem}@media (width<=35em){gap:var(--space-1);flex-direction:column;& .row-date{flex-basis:auto;padding-top:0}}}&:is(a):hover{& .row-title,& .row-value{color:var(--accent-strong)}& .arrow{color:var(--accent)}}&:has(.row-link):hover{& .row-title{color:var(--accent-strong)}&>.arrow{color:var(--accent)}}& .row-link{color:inherit;text-decoration:none;&:after{content:"";position:absolute;inset:0}&:focus-visible{outline:none;&:after{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}}}& .row-actions{z-index:1;gap:0 var(--space-4);flex-wrap:wrap;display:flex;position:relative;& .link{gap:var(--space-1)}& .arrow{color:inherit}}}.post-back{margin-top:var(--space-7)}.post-header{gap:var(--space-3);margin:var(--space-4) 0 var(--space-7);flex-direction:column;display:flex}.reading{font-family:var(--font-display);gap:var(--space-5);flex-direction:column;font-size:1.1875rem;line-height:2rem;display:flex;&>*{margin:0}& h2{letter-spacing:-.01em;margin-top:var(--space-6);font-size:1.75rem;font-weight:600;line-height:2.25rem}& h3{margin-top:var(--space-3);font-size:1.375rem;font-weight:600;line-height:1.875rem}& a{color:var(--accent);text-underline-offset:3px;text-decoration-thickness:1px;&:hover{color:var(--accent-strong);text-decoration-thickness:2px}}& blockquote{padding:var(--space-1) 0 var(--space-1) var(--space-5);border-left:3px solid var(--accent);color:var(--ink-muted);font-style:italic;& p{margin:0}}& ul,& ol{padding-left:var(--space-5);& li+li{margin-top:var(--space-1)}& ::marker{color:var(--ink-subtle)}}& img{border-radius:var(--radius-small);height:auto}& hr{border:0;border-top:1px solid var(--line);width:100%}& table{border-collapse:collapse;font-family:var(--font-body);font-size:.9375rem;line-height:1.375rem;& th,& td{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line);text-align:left}& th{border-bottom-color:var(--line-strong);font-weight:600}}& code{font-family:var(--font-code);font-size:.85em}& :not(pre)>code{border:1px solid var(--line);background:var(--paper-sunken);border-radius:4px;padding:.0625rem .375rem}& pre{margin-inline:calc(-1 * var(--space-4));padding:var(--space-5);border:1px solid var(--line);border-radius:var(--radius-medium);background:var(--paper-sunken);color:var(--ink);tab-size:2;font-family:var(--font-code);font-size:.875rem;line-height:1.5rem;position:relative;overflow-x:auto;& code{font-size:inherit}&[data-language]:before{content:attr(data-language);top:var(--space-2);right:var(--space-3);font-family:var(--font-code);letter-spacing:.04em;text-transform:uppercase;color:var(--ink-subtle);font-size:.6875rem;line-height:1rem;position:absolute}@media (width<=35em){padding:var(--space-4);margin-inline:0}}& .code-block{margin-inline:calc(-1 * var(--space-4));position:relative;&>pre{margin:0;padding-top:1.5rem;&:before{content:none}}@media (width<=35em){margin-inline:0}}& .code-actions{top:var(--space-2);right:var(--space-2);align-items:center;gap:var(--space-2);font-family:var(--font-code);letter-spacing:.04em;text-transform:uppercase;color:var(--ink-subtle);font-size:.6875rem;line-height:1rem;display:flex;position:absolute}& .copy-button{min-height:1.75rem;padding:0 var(--space-2);border:1px solid var(--line);border-radius:var(--radius-small);background:var(--paper-raised);color:var(--ink-muted);font:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer;&:hover{color:var(--ink);border-color:var(--line-strong)}}& .token{&.comment,&.prolog,&.doctype,&.cdata{color:var(--syntax-comment);font-style:italic}&.punctuation{color:var(--syntax-punctuation)}&.keyword,&.important,&.atrule .rule{color:var(--syntax-keyword)}&.string,&.char,&.template-string,&.attr-value,&.url{color:var(--syntax-string)}&.number,&.boolean,&.constant,&.symbol{color:var(--syntax-number)}&.function,&.selector{color:var(--syntax-function)}&.class-name,&.builtin,&.atrule{color:var(--syntax-type)}&.property,&.attr-name,&.variable,&.parameter{color:var(--syntax-property)}&.tag,&.regex,&.operator,&.entity{color:var(--syntax-tag)}&.inserted{color:var(--syntax-inserted)}&.deleted{color:var(--syntax-deleted)}&.important,&.bold{font-weight:600}&.italic{font-style:italic}}}.seal{flex:none}.portrait{aspect-ratio:4/5;background:var(--paper-sunken);border:1px solid var(--line);border-radius:var(--radius-medium);flex:0 17.5rem;justify-content:center;align-items:center;min-width:13.75rem;display:flex;overflow:hidden;& img{object-fit:cover;width:100%;height:100%}}.empty-state{margin-top:var(--space-5);padding:var(--space-6) var(--space-5);background:var(--paper-sunken);border:1px solid var(--line);border-radius:var(--radius-medium);align-items:flex-start;gap:var(--space-2);flex-direction:column;display:flex;& .h3{font-size:1.25rem;line-height:1.75rem}}.gap-3{gap:var(--space-3)}.gap-5{gap:var(--space-5)}.margin-top-7{margin-top:var(--space-7)}.measure{max-width:32em}.self-start{align-self:flex-start}@media print{:root{color-scheme:light}html{font-size:75%}body{background:0 0}[data-slot=root]{min-height:0;display:block}.container{max-width:none;padding:0}.site-header,.site-footer,.skip-link,.theme-button,.resume-download{display:none}.intro{margin-top:0}.section,.section.tight{margin-top:var(--space-5)}a,.link{text-decoration:none}h2,h3{break-after:avoid}.row{padding-block:var(--space-3);break-inside:avoid}}
