@font-face{font-family:bitter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/bitter-latin-wght-normal.woff2)format("woff2");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:bitter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/bitter-latin-ext-wght-normal.woff2)format("woff2");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:bitter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/fonts/bitter-latin-wght-italic.woff2)format("woff2");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:bitter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/fonts/bitter-latin-ext-wght-italic.woff2)format("woff2");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:libre franklin;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/libre-franklin-latin-wght-normal.woff2)format("woff2");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:libre franklin;font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/libre-franklin-latin-ext-wght-normal.woff2)format("woff2");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:libre franklin;font-style:italic;font-weight:100 900;font-display:swap;src:url(/fonts/libre-franklin-latin-wght-italic.woff2)format("woff2");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:libre franklin;font-style:italic;font-weight:100 900;font-display:swap;src:url(/fonts/libre-franklin-latin-ext-wght-italic.woff2)format("woff2");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:jetbrains mono;font-style:normal;font-weight:100 800;font-display:swap;src:url(/fonts/jetbrains-mono-latin-wght-normal.woff2)format("woff2");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:jetbrains mono;font-style:normal;font-weight:100 800;font-display:swap;src:url(/fonts/jetbrains-mono-latin-ext-wght-normal.woff2)format("woff2");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:jetbrains mono;font-style:italic;font-weight:100 800;font-display:swap;src:url(/fonts/jetbrains-mono-latin-wght-italic.woff2)format("woff2");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:jetbrains mono;font-style:italic;font-weight:100 800;font-display:swap;src:url(/fonts/jetbrains-mono-latin-ext-wght-italic.woff2)format("woff2");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}:root{color-scheme:light dark;--color-bg:light-dark(#faf7f2, #1a1919);--color-text:light-dark(#1f1e1c, #e9e7e4);--color-muted:light-dark(#65625e, #a3a09b);--color-border:light-dark(#e0d8cc, #383634);--color-surface:light-dark(#f1ece3, #252423);--color-accent:light-dark(#8c2428, #f0a68f);--color-accent-hover:light-dark(#5e1719, #ffd2c4);--font-body:"Libre Franklin", system-ui, sans-serif;--font-heading:"Bitter", Georgia, serif;--font-mono:"JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;--tracking:0.012em;--heading-weight:600;--heading-tracking:normal;--text-sm:0.875rem;--text-base:1.0625rem;--text-lg:1.25rem;--text-xl:1.5rem;--text-2xl:2rem;--leading:1.65;--leading-tight:1.25;--space-1:0.25rem;--space-2:0.5rem;--space-3:1rem;--space-4:1.5rem;--space-5:2.5rem;--content-width:40rem;--gutter:1rem;--radius:6px}:root[data-theme=light]{color-scheme:light}:root[data-theme=dark]{color-scheme:dark}@supports not (color:light-dark(#000,#fff)){:root{color-scheme:light;--color-bg:#faf7f2;--color-text:#1f1e1c;--color-muted:#65625e;--color-border:#e0d8cc;--color-surface:#f1ece3;--color-accent:#8c2428;--color-accent-hover:#5e1719}}*,*::before,*::after{box-sizing:border-box}html{text-size-adjust:100%}@media(prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}body{display:flex;flex-direction:column;min-height:100vh;min-height:100dvh;margin:0;background:var(--color-bg);color:var(--color-text);font-family:var(--font-body);font-size:var(--text-base);letter-spacing:var(--tracking);line-height:var(--leading)}img{max-width:100%;height:auto}a{color:var(--color-accent);text-decoration-thickness:1px;text-underline-offset:.15em}a:where(:hover){color:var(--color-accent-hover)}:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}[id]{scroll-margin-top:var(--space-4)}.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.skip-link{position:absolute;top:var(--space-2);left:var(--gutter);padding:var(--space-1)var(--space-2);background:var(--color-bg);transform:translateY(-200%)}.skip-link:focus{transform:none}.icon{width:1em;height:1em;flex-shrink:0}.site-header,main,.site-footer{width:min(100% - 2 * var(--gutter),var(--content-width));margin-inline:auto}main{flex:1;padding-block:var(--space-5)}.site-header{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)var(--space-4);padding-block:var(--space-4);border-bottom:1px solid var(--color-border)}.site-title{margin-right:auto;color:var(--color-text);font-family:var(--font-heading);font-size:var(--text-xl);font-weight:var(--heading-weight);letter-spacing:var(--heading-tracking);text-decoration:none}.site-nav ul{display:flex;flex-wrap:wrap;gap:var(--space-1)var(--space-4);margin:0;padding:0;list-style:none}.site-nav a{color:var(--color-muted);text-decoration:none;white-space:nowrap}.site-nav a:hover,.site-nav a[aria-current]{color:var(--color-text)}.site-nav a[aria-current]{text-decoration:underline 1px var(--color-accent)}@media(max-width:41.99rem){.site-nav{order:1;flex-basis:100%}}.theme-control{display:flex;gap:2px;min-inline-size:0;margin:0;padding:0;border:0}.theme-control label{display:grid;place-items:center;width:1.75rem;height:1.75rem;border-radius:999px;color:var(--color-muted);cursor:pointer}.theme-control label:hover{color:var(--color-text)}.theme-control label:has(:checked){background:var(--color-surface);color:var(--color-text)}.theme-control label:has(:focus-visible){outline:2px solid var(--color-accent);outline-offset:1px}@media(scripting:none){.theme-control{display:none}}@supports not (color:light-dark(#000,#fff)){.theme-control{display:none}}.site-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-3);padding-block:var(--space-4);border-top:1px solid var(--color-border);color:var(--color-muted)}.site-footer p{margin:0;font-size:var(--text-sm)}.social-links{display:flex;flex-wrap:wrap;gap:var(--space-3);margin:0;padding:0;list-style:none}.social-links a{display:block;color:var(--color-muted)}.social-links a:hover{color:var(--color-text)}.social-links .icon{display:block;width:1.25rem;height:1.25rem}h1,h2,h3,h4,h5,h6{margin:var(--space-5)0 var(--space-3);font-family:var(--font-heading);font-weight:var(--heading-weight);letter-spacing:var(--heading-tracking);line-height:var(--leading-tight);text-wrap:balance}h1{margin-top:0;font-size:var(--text-2xl)}h2{font-size:var(--text-xl)}h3{font-size:var(--text-lg)}h4,h5,h6{font-size:var(--text-base)}:is(h1,h2,h3,h4,h5,h6)+:is(h2,h3,h4,h5,h6){margin-top:var(--space-3)}p,ul,ol,dl,blockquote,table,figure,details,.highlight{margin-block:0 var(--space-3)}hr{margin-block:var(--space-5);border:0;border-top:1px solid var(--color-border)}code,pre{font-family:var(--font-mono);font-variant-ligatures:none;letter-spacing:normal}.intro{display:flex;align-items:center;gap:var(--space-4);margin-bottom:var(--space-5)}.intro-text{flex:1}.intro h1{margin-bottom:var(--space-2)}.intro p{color:var(--color-muted)}.intro-photo{flex-shrink:0;width:clamp(96px,28vw,180px);border-radius:12px}.post-list{margin:0 0 var(--space-4);padding:0;list-style:none}.post-list li{position:relative;isolation:isolate;padding-block:var(--space-3)}.post-list li+li{border-top:1px solid var(--color-border)}.post-list li::before{content:"";position:absolute;inset:0 calc(-1 * var(--space-3));z-index:-1;border-radius:var(--radius)}.post-list li:hover::before{background:var(--color-surface)}.post-list li:has(a:focus-visible)::before{outline:2px solid var(--color-accent)}.post-list h3{margin:0 0 var(--space-1)}.post-list h3 a{color:var(--color-text);text-decoration:none}.post-list h3 a::after{content:"";position:absolute;inset:0}@supports selector(:has(a)){.post-list h3 a:focus-visible{outline:none}}.post-list li:hover h3 a{color:var(--color-accent)}.post-summary{margin-bottom:var(--space-1)}.post-list time,.archive-list time,.post-meta{color:var(--color-muted);font-size:var(--text-sm)}.archive-list{padding:0;list-style:none}.archive-list li{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:0 var(--space-3);padding-block:var(--space-1)}.archive-list time{font-variant-numeric:tabular-nums;white-space:nowrap}.post-header{margin-bottom:var(--space-5)}.post-header h1{margin-bottom:var(--space-2)}.post-meta{--separator-width:1.25em;display:flex;flex-wrap:wrap;margin:0 0 0 calc(-1 * var(--separator-width));clip-path:inset(-.5em -.5em -.5em var(--separator-width))}.post-meta>*::before{content:"·";display:inline-block;width:var(--separator-width);text-align:center}.post-meta a:focus-visible{outline-offset:-2px}.toc{margin-bottom:var(--space-5);padding:var(--space-3)var(--space-4);border-radius:var(--radius);background:var(--color-surface)}.toc summary{font-weight:600;cursor:pointer}.toc ul{margin:0;padding-left:var(--space-4);list-style:none}.toc nav>ul{margin-top:var(--space-2);padding-left:0}.prose{overflow-wrap:break-word}.heading-anchor{margin-left:.3em;color:var(--color-muted);text-decoration:none;opacity:0}:is(h2,h3,h4,h5,h6):hover>.heading-anchor{opacity:1}.prose li+li{margin-top:var(--space-2)}.prose li>:is(ul,ol){margin-block:var(--space-2)0}.prose blockquote{margin-inline:0;padding-left:var(--space-3);border-left:3px solid var(--color-border);color:var(--color-muted)}.prose table{display:block;overflow-x:auto;border-collapse:collapse}.prose th,.prose td{padding:var(--space-1)var(--space-2);border-bottom:1px solid var(--color-border);text-align:left}.prose :not(pre)>code{padding:.1em .3em;border-radius:4px;background:var(--color-surface);font-size:.9em}.highlight{position:relative}.prose pre{margin:0;padding:var(--space-3);overflow-x:auto;border-radius:var(--radius);background:var(--color-surface);font-size:var(--text-sm);line-height:1.5}.copy-button{position:absolute;top:var(--space-2);right:var(--space-2);padding:.1rem .5rem;border:1px solid var(--color-border);border-radius:4px;background:var(--color-bg);color:var(--color-muted);font:inherit;font-size:.75rem;cursor:pointer;opacity:0}.highlight:hover .copy-button,.copy-button:focus-visible{opacity:1}@media(hover:none){.copy-button{opacity:1}}.prose figure{margin-inline:0;text-align:center}.prose figure img{display:block;margin-inline:auto}.prose figure.bordered img{border:1px solid var(--color-border)}.prose figcaption{margin-top:var(--space-2);color:var(--color-muted);font-size:var(--text-sm)}.prose figcaption p{margin:0}.profile-photo{float:right;width:clamp(120px,35vw,200px);margin:0 0 var(--space-4)var(--space-4);border-radius:16px}.footnotes{color:var(--color-muted);font-size:var(--text-sm)}.aside{color:var(--color-muted)}.chroma{color:#545464;color:light-dark(#545464,#dcd7ba);background-color:#f2ecbc;background-color:light-dark(#f2ecbc,#1f1f28);-webkit-text-size-adjust:none}.chroma .x{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .err{color:#d21616;color:light-dark(#d21616,#ed5757)}.chroma .cl{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#e4d794;background-color:light-dark(#e4d794,#363646)}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#6c677b;color:light-dark(#6c677b,#8888a4)}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#6c677b;color:light-dark(#6c677b,#8888a4)}.chroma .line{display:flex}.chroma .k{color:#624c83;color:light-dark(#624c83,#9882ba)}.chroma .kc{color:#a35700;color:light-dark(#a35700,#ffa066)}.chroma .kd{color:#624c83;color:light-dark(#624c83,#9882ba)}.chroma .kn{color:#706b3b;color:light-dark(#706b3b,#e6c384)}.chroma .kp{color:#624c83;color:light-dark(#624c83,#9882ba)}.chroma .kr{color:#624c83;color:light-dark(#624c83,#9882ba)}.chroma .kt{color:#506f6a;color:light-dark(#506f6a,#7aa89f)}.chroma .na{color:#706b3b;color:light-dark(#706b3b,#e6c384)}.chroma .nc{color:#506f6a;color:light-dark(#506f6a,#7aa89f)}.chroma .no{color:#a35700;color:light-dark(#a35700,#ffa066)}.chroma .nd{color:#a35700;color:light-dark(#a35700,#ffa066);font-weight:700}.chroma .ni{color:#706b3b;color:light-dark(#706b3b,#e6c384)}.chroma .ne{color:#a35700;color:light-dark(#a35700,#ffa066)}.chroma .nl{color:#406d99;color:light-dark(#406d99,#7fb4ca)}.chroma .nn{color:#706b3b;color:light-dark(#706b3b,#e6c384)}.chroma .nx{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .py{color:#706b3b;color:light-dark(#706b3b,#e6c384)}.chroma .nt{color:#4d699b;color:light-dark(#4d699b,#7e9cd8)}.chroma .nb{color:#c1384b;color:light-dark(#c1384b,#e46876)}.chroma .bp{color:#c1384b;color:light-dark(#c1384b,#e46876)}.chroma .vc{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .vg{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .vi{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .vm{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .nf{color:#4d699b;color:light-dark(#4d699b,#7e9cd8)}.chroma .fm{color:#4d699b;color:light-dark(#4d699b,#7e9cd8)}.chroma .ld{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .s{color:#5d7241;color:light-dark(#5d7241,#98bb6c)}.chroma .sa{color:#c1384b;color:light-dark(#c1384b,#ff5d62)}.chroma .sb{color:#5d7241;color:light-dark(#5d7241,#98bb6c)}.chroma .sc{color:#5d7241;color:light-dark(#5d7241,#98bb6c)}.chroma .dl{color:#406d99;color:light-dark(#406d99,#7fb4ca)}.chroma .sd{color:#6b6a62;color:light-dark(#6b6a62,#8c8b82)}.chroma .s2{color:#5d7241;color:light-dark(#5d7241,#98bb6c)}.chroma .se{color:#7c6946;color:light-dark(#7c6946,#c0a36e)}.chroma .sh{color:#6b6a62;color:light-dark(#6b6a62,#8c8b82)}.chroma .si{color:#406d99;color:light-dark(#406d99,#7fb4ca)}.chroma .sx{color:#5d7241;color:light-dark(#5d7241,#98bb6c)}.chroma .sr{color:#7c6946;color:light-dark(#7c6946,#c0a36e)}.chroma .s1{color:#5d7241;color:light-dark(#5d7241,#98bb6c)}.chroma .ss{color:#5d7241;color:light-dark(#5d7241,#98bb6c)}.chroma .m{color:#a74d6c;color:light-dark(#a74d6c,#d27e99)}.chroma .mb{color:#a74d6c;color:light-dark(#a74d6c,#d27e99)}.chroma .mf{color:#a74d6c;color:light-dark(#a74d6c,#d27e99)}.chroma .mh{color:#a74d6c;color:light-dark(#a74d6c,#d27e99)}.chroma .mi{color:#a74d6c;color:light-dark(#a74d6c,#d27e99)}.chroma .il{color:#a74d6c;color:light-dark(#a74d6c,#d27e99)}.chroma .mo{color:#a74d6c;color:light-dark(#a74d6c,#d27e99)}.chroma .o{color:#7c6946;color:light-dark(#7c6946,#c0a36e);font-weight:700}.chroma .ow{color:#7c6946;color:light-dark(#7c6946,#c0a36e);font-weight:700}.chroma .or{color:#7c6946;color:light-dark(#7c6946,#c0a36e);font-weight:700}.chroma .c{color:#6b6a62;color:light-dark(#6b6a62,#8c8b82);font-style:italic}.chroma .ch{color:#6b6a62;color:light-dark(#6b6a62,#8c8b82);font-style:italic}.chroma .cm{color:#6b6a62;color:light-dark(#6b6a62,#8c8b82);font-style:italic}.chroma .c1{color:#6b6a62;color:light-dark(#6b6a62,#8c8b82);font-style:italic}.chroma .cs{color:#6b6a62;color:light-dark(#6b6a62,#8c8b82);font-style:italic}.chroma .cp{color:#c1384b;color:light-dark(#c1384b,#e46876);font-style:italic}.chroma .cpf{color:#c1384b;color:light-dark(#c1384b,#e46876);font-weight:700;font-style:italic}.chroma .gd{color:#c92c30;color:light-dark(#c92c30,#d26f71);background-color:#d9a594;background-color:light-dark(#d9a594,#43242b)}.chroma .ge{font-style:italic}.chroma .gr{color:#d21616;color:light-dark(#d21616,#ed5757)}.chroma .gh{color:#4d699b;color:light-dark(#4d699b,#7e9cd8);font-weight:700}.chroma .gi{color:#57724b;color:light-dark(#57724b,#76946a);background-color:#b7d0ae;background-color:light-dark(#b7d0ae,#2b3328)}.chroma .go{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .gp{color:#545464;color:light-dark(#545464,#dcd7ba)}.chroma .gs{font-weight:700}.chroma .gu{color:#4d699b;color:light-dark(#4d699b,#7e9cd8);font-weight:700}.chroma .gt{color:#d21616;color:light-dark(#d21616,#ed5757)}.chroma .gl{text-decoration:underline}