@font-face{font-family:recursive;font-weight:700;font-style:normal;font-display:swap;src:url(/fonts/recursive-sans-bold.woff2)format("woff2")}@font-face{font-family:jetbrains mono;font-style:normal;font-weight:400;font-display:swap;src:local("JetBrainsMonoNL Nerd Font Mono"),local("JetBrainsMonoNL NFM"),local("JetBrainsMonoNL Nerd Font"),local("JetBrainsMonoNL NF"),local("JetBrains Mono NL"),local("JetBrains Mono"),url(/fonts/jetbrains-mono-regular.woff2)format("woff2")}:root{--ground:#1d2130;--ink:#ece9df;--dim:#9ea3b8;--rule:#343a4f;--accent:#e4569c;--code-bg:#151823;--code-ink:#c9d1d9;--inline-bg:#151823;--inline-ink:#dfe3f0;--display:"Recursive", system-ui, sans-serif;--body:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--mono:"JetBrains Mono", ui-monospace, "Cascadia Mono", Menlo, Consolas, monospace;--measure:66ch;--wide:88ch;--gutter:clamp(1rem, 4vw, 2.5rem);color-scheme:dark}@media(prefers-color-scheme:light){:root{--ground:#fbfbfd;--ink:#1d2130;--dim:#5c6178;--rule:#dcdde6;--accent:#c2237a;--inline-bg:#eceef5;--inline-ink:#2a2e40;color-scheme:light}}*{box-sizing:border-box}html{background:var(--ground);color:var(--ink);font:1.0625rem/1.6 var(--body);-webkit-text-size-adjust:100%}body{margin:0;min-height:100vh;display:flex;flex-direction:column}a{color:var(--accent);text-decoration:none;text-underline-offset:.15em}a:hover{text-decoration:underline}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}img,video{max-width:100%;height:auto}.site-header,main,.site-footer{width:100%;max-width:calc(var(--wide) + 2 * var(--gutter));margin-inline:auto;padding-inline:var(--gutter)}main{flex:1;padding-block:2rem 4rem}.site-header{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem 1.25rem;padding-block:1.5rem;border-bottom:1px solid var(--rule)}.masthead{display:inline-flex;align-items:center;gap:.6rem;color:var(--ink);font-family:var(--display);font-size:1.35rem;letter-spacing:-.01em}.masthead:hover{text-decoration:none;color:var(--accent)}.masthead img{width:36px;height:36px;flex:none}.masthead span{white-space:nowrap}.elsewhere{display:flex;align-items:center;gap:.9rem;margin-left:.5rem}.elsewhere a{color:var(--dim);display:inline-flex;padding:2px}.elsewhere a:hover{color:var(--accent)}.elsewhere svg{display:block}.sitenav{display:flex;gap:1.5rem;margin-left:auto}.sitenav a{color:var(--ink)}@media(max-width:40em){.masthead{font-size:1.2rem;gap:.5rem}.elsewhere{margin-left:0;gap:.6rem}.sitenav{gap:1rem}}.site-footer{border-top:1px solid var(--rule);padding-block:1.5rem 2.5rem;color:var(--dim);font-size:.9375rem}.site-footer p{margin:0}h1,h2,h3,h4,.postlist{max-width:var(--measure)}.postitem{padding:1.5rem 0;border-top:1px solid var(--rule)}.postitem:first-child{border-top:0;padding-top:.5rem}.postitem h2{font-size:1.5rem;margin:0 0 .35rem}.postitem h2 a{color:var(--ink)}.postitem h2 a:hover{color:var(--accent);text-decoration:none}.postitem .meta{margin:0 0 .6rem;font-size:.9375rem}.postitem p{margin:0;color:var(--ink)}.terms{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:.5rem 1.5rem;font-size:1.125rem}.terms span{color:var(--dim);font-size:.875rem;font-variant-numeric:tabular-nums}.series-list{padding-left:2.5rem;margin:0;font-size:1.25rem;display:grid;gap:.75rem}.series-list li::marker{color:var(--dim);font-variant-numeric:tabular-nums}.series-list time{color:var(--dim);font-size:.875rem;margin-left:.5rem;white-space:nowrap}.post>header{margin-bottom:2.5rem;max-width:var(--measure)}.post h1{font-size:clamp(1.9rem,1.2rem + 2.4vw,2.75rem);margin:0 0 .75rem}.meta{margin:0;color:var(--dim)}.prose>*{max-width:var(--measure)}.prose>.highlight,.prose>figure,.prose>pre,.prose>table,.prose>.table-wrap{max-width:var(--wide)}.prose>*+*{margin-top:1.1em}.prose h1{font-size:1.6rem;margin-top:2.4em}.prose h2{font-size:1.35rem;margin-top:2.2em}.prose h3{font-size:1.125rem;margin-top:1.8em}.prose h4{font-size:1rem;margin-top:1.6em}.prose h1+*,.prose h2+*,.prose h3+*,.prose h4+*{margin-top:.6em}.prose p,.prose li{text-wrap:pretty}.prose ul,.prose ol{padding-left:1.5rem}.prose li+li{margin-top:.35em}.prose hr{border:0;border-top:1px solid var(--rule);margin-block:2.5rem}.prose strong{font-weight:600}.prose blockquote{margin-inline:0;padding-left:1.25rem;border-left:3px solid var(--accent);color:var(--ink)}.prose blockquote footer{color:var(--dim);font-size:.9375rem;margin-top:.5em}.prose blockquote footer::before{content:"— "}.prose blockquote cite{font-style:normal}.prose blockquote strong+cite::before{content:", "}.prose img{display:block;border-radius:4px}.prose img[src*="style=center"]{margin-inline:auto}.prose figure{margin-inline:0}.prose figcaption{color:var(--dim);font-size:.9375rem;margin-top:.5em}code,kbd,pre{font-family:var(--mono);font-size:.9em;font-variant-ligatures:none}:not(pre)>code{background:var(--inline-bg);color:var(--inline-ink);padding:.1em .35em;border-radius:3px}pre{margin:0;padding:1rem 1.25rem;overflow-x:auto;border-radius:6px;background:var(--code-bg);color:var(--code-ink);line-height:1.5;tab-size:4}pre code{font-size:.875rem}.highlight,.chroma{background:var(--code-bg)}.prose>pre,.highlight pre{border:1px solid var(--rule)}figure.code figcaption{margin:0;padding:.4rem 1.25rem;font-family:var(--mono);font-size:.8125rem;color:var(--dim);background:var(--code-bg);border:1px solid var(--rule);border-bottom:0;border-radius:6px 6px 0 0}figure.code .highlight pre{border-radius:0 0 6px 6px}.prose table{border-collapse:collapse;display:block;overflow-x:auto;font-size:.9375rem}.prose th,.prose td{padding:.4em .8em;border-bottom:1px solid var(--rule);text-align:left;vertical-align:top}.prose th{font-weight:600}.post>footer{margin-top:3.5rem;max-width:var(--measure)}.tags{color:var(--dim);margin:0 0 1.5rem}.series-nav{display:grid;grid-template-columns:1fr 1fr;gap:1rem;border-top:1px solid var(--rule);padding-top:1.5rem}.series-nav a{display:block;font-family:var(--display);font-size:1.125rem;line-height:1.25;color:var(--ink)}.series-nav a:hover{color:var(--accent);text-decoration:none}.series-nav a small{display:block;font-family:var(--body);font-weight:400;font-size:.875rem;color:var(--dim);margin-bottom:.2rem}.series-nav .next{grid-column:2;text-align:right}@media(max-width:40em){.series-nav{grid-template-columns:1fr}.series-nav .next{grid-column:1;text-align:left}}@media(prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}@media print{.site-header nav,.site-footer nav,.series-nav{display:none}html{background:#fff;color:#000}}.prose .weekly-entry{margin-top:2.2rem}.prose .weekly-entry .weekly-entry-title{display:flex;align-items:baseline;gap:.25rem .6rem;margin:0;line-height:1.4}.prose .weekly-entry-title-text{flex:1;min-width:0;overflow-wrap:anywhere}.prose .weekly-entry-title>.weekly-entry-archive{flex:none;margin-left:0}.prose .weekly-entry-archive,.prose .weekly-entry-archive-note{display:inline-block;margin-left:.45rem;font:.75rem/1.5 var(--body)}.prose .weekly-entry-archive{white-space:nowrap}.prose .weekly-entry-archive-note{color:var(--dim)}.prose .weekly-entry-byline{margin:.25rem 0 .5rem;color:var(--dim);font-size:.875rem;line-height:1.5}.prose .weekly-entry-body>p{margin:0}.prose .weekly-entry-body>p+p{margin-top:.6rem}.prose .weekly-entry--related{margin-top:.85rem;padding-left:.85rem;border-left:2px solid var(--rule);font-size:.9375rem}.prose .weekly-entry--related .weekly-entry-title{font-size:1.0625rem}.prose .weekly-entry-label{margin:0 0 .15rem;color:var(--dim);font:.75rem/1.4 var(--body)}.prose .weekly-entry-image{width:min(100%,160px);margin:.75rem 0 0}.prose .weekly-entry-image img{width:100%;height:auto;max-height:18rem;object-fit:contain}.prose .weekly-entry-image figcaption{margin-top:.35rem;font-size:.75rem;line-height:1.5}.prose .weekly-entry-summary--illustrated{display:grid;gap:.75rem;align-items:start}.prose .weekly-entry-summary--illustrated>.weekly-entry-image{margin:0;min-width:0}.prose .weekly-entry-summary--illustrated>.weekly-entry-body{min-width:0}@media(min-width:40em){.prose .weekly-entry-summary--illustrated{grid-template-columns:minmax(0,1fr)160px;gap:1rem}}.prose .weekly-entry-notice{margin:.75rem 0 0;color:var(--dim);font-size:.8125rem;line-height:1.5}