:root{color-scheme:light;--beige-0:#f2ebd2;--beige-1:#ebe1c4;--beige-25:#dfd4ae;--beige-3:#d9cda6;--beige-4:#c1b489;--ink-1:#1d1d22;--ink-2:#2a2a30;--ink-3:#5a5a61;--color-bg:var(--beige-0);--color-border:var(--beige-25);--color-border-strong:var(--beige-4);--color-text:var(--ink-2);--color-strong:var(--ink-1);--color-muted:var(--ink-3);--color-accent:#ad6630;--color-accent-text:#904f23;--color-accent-soft:rgb(173 102 48 / 0.14);--color-selection:rgb(173 102 48 / 0.24);--color-callout-neutral:#9a9078;--color-warn:#8a2a1c;--color-code-bg:var(--beige-1);--color-code-border:var(--beige-3);--color-code-inline-bg:rgb(60 40 10 / 0.07);--code-text:#2a2a30;--code-comment:#53666c;--code-punctuation:#51666c;--code-keyword:#b6266c;--code-class:#b4296c;--code-function:#0c6f67;--code-string:#5b6900;--code-number:#ae3e0f;--code-operator:#785200;--code-attribute:#7d5e0e;--code-tag:#1b679e;--code-variable:#0e2a35;--code-error:#bc2729;--text-base:1.125rem;--leading:1.45;--measure:34em;--para-space:0.75em;--text-sm:0.875rem;--text-h1:clamp(1.75rem, 1.25rem + 2.2vw, 2.25rem);--text-h2:1.5rem;--text-h3:1.2rem;--leading-heading:1.2;--space-1:0.25rem;--space-2:0.5rem;--space-3:0.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--space-8:4.5rem;--page-width:46rem;--home-width:64rem;--toc-width:15rem;--note-width:15rem;--gutter:2.5rem;--page-pad:clamp(1rem, 4vw, 2rem);--radius:8px;--radius-sm:4px;--transition:0.15s ease;--focus-ring:2px solid var(--color-accent)}@font-face{font-family:"source serif 4";src:url(/fonts/source-serif-4/source-serif-4-latin-wght-normal.woff2)format("woff2");font-weight:200 900;font-style:normal;font-display:swap}@font-face{font-family:"source serif 4";src:url(/fonts/source-serif-4/source-serif-4-latin-wght-italic.woff2)format("woff2");font-weight:200 900;font-style:italic;font-display:swap}@font-face{font-family:outfit;src:url(/fonts/outfit/outfit-latin-wght-normal.woff2)format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:google sans code;src:url(/fonts/google-sans-code/google-sans-code-latin-wght-normal.woff2)format("woff2");font-weight:300 800;font-style:normal;font-display:swap}@font-face{font-family:google sans code;src:url(/fonts/google-sans-code/google-sans-code-latin-wght-italic.woff2)format("woff2");font-weight:300 800;font-style:italic;font-display:swap}:root{--font-body:"Source Serif 4",Georgia, ui-serif, serif;--text-base:1.125rem;--leading:1.45;--measure:33em;--font-heading:"Outfit",ui-sans-serif, system-ui, sans-serif;--font-mono:"Google Sans Code",ui-monospace, Menlo, Consolas, monospace}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-padding-top:var(--space-5)}@media(prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}body{margin:0;min-height:100vh;display:flex;flex-direction:column;font-family:var(--font-body);font-size:var(--text-base);line-height:var(--leading);color:var(--color-text);background:var(--color-bg);text-align:left;font-kerning:normal;font-variant-ligatures:common-ligatures contextual;font-variant-numeric:lining-nums proportional-nums;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}::selection{background:var(--color-selection)}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading);font-weight:600;line-height:var(--leading-heading);color:var(--color-strong);text-wrap:balance;text-transform:none;text-decoration:none;hyphens:none}h1{margin:0 0 .5em;font-size:var(--text-h1);letter-spacing:-.015em}h2{margin:2.2em 0 .55em;font-size:var(--text-h2);letter-spacing:-.01em}h3,h4,h5,h6{margin:1.7em 0 .4em;font-size:var(--text-h3)}p,ul,ol,dl,blockquote,figure,table{margin:0 0 var(--para-space)}ul,ol{padding-left:1.4em}li{margin-block:.25em;&::marker { color:var(--color-muted); font-size:0.85em; }}li>ul,li>ol{margin-bottom:0}strong,b{font-weight:600}em,i{font-style:italic}strong em,em strong,b i,i b{font-style:normal}abbr,ins,u{text-decoration:none}a{color:var(--color-accent-text);text-decoration-line:underline;text-decoration-thickness:1px;text-underline-offset:.2em;text-decoration-color:color-mix(in srgb,currentColor 45%,transparent);transition:color var(--transition),text-decoration-color var(--transition);&:hover { color:var(--color-strong); text-decoration-color:currentColor; }}hr{border:0;height:1px;margin:var(--space-6)0;background:var(--color-border-strong)}img,svg,video{max-width:100%;height:auto}blockquote{margin-left:2.5em;font-size:.95em;quotes:none;>:last-child { margin-bottom:0; } &::before,&::after { content:none; }}table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse;font-size:.95em;line-height:1.4;font-variant-numeric:lining-nums tabular-nums}th,td{padding:.55em 1.1em .55em 0;border:0;border-bottom:1px solid var(--color-border);text-align:left;vertical-align:top}th{font-weight:600;color:var(--color-strong);border-bottom-color:var(--color-border-strong)}mark{background:var(--color-accent-soft);color:inherit}kbd{padding:.1em .4em;border-radius:var(--radius-sm);background:var(--color-code-inline-bg);font-size:.85em}:focus-visible{outline:var(--focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.skip-link{position:absolute;left:var(--space-4);top:-4rem;z-index:100;padding:var(--space-2)var(--space-4);border-radius:var(--radius);background:var(--color-strong);color:var(--color-bg);text-decoration:none;&:focus { top:var(--space-4); }}.visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}.page{--col:var(--page-width);display:flex;flex:1 0 auto;flex-direction:column;width:100%}.page--home{--col:calc(var(--home-width) + 2 * var(--page-pad))}.page--article{--col:calc(var(--measure) + 2 * var(--page-pad))}.header,.main{width:min(100%,var(--col));margin-inline:auto;padding-inline:var(--page-pad)}.main{flex:1 0 auto;padding-bottom:var(--space-7)}.header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:var(--space-2)var(--space-5);padding-block:var(--space-5)var(--space-6);a { color: var(--color-muted); text-decoration: none; } a:hover, a[aria-current="page"] { color: var(--color-strong); }}.site-name{margin:0;font-family:var(--font-heading);font-size:1.3rem;font-weight:600;letter-spacing:-.01em;a { color: var(--color-strong); }}.menu{display:flex;flex-wrap:wrap;gap:var(--space-1)var(--space-5);font-size:var(--text-sm);a[aria-current="page"] { font-weight: 600; }}.site-footer{flex-shrink:0;width:min(100%,var(--col));margin-inline:auto;padding:var(--space-5)var(--page-pad)var(--space-6);color:var(--color-muted);font-size:var(--text-sm);p { margin: 0; } a { color: inherit; }}.breadcrumbs{margin-bottom:var(--space-4);font-size:var(--text-sm);color:var(--color-muted);a { color: inherit; text-decoration: none; &:hover { color: var(--color-strong); text-decoration: underline; } } a::after { content: "/"; margin-inline: 0.5em; }}.article-layout{--wide:0;display:grid;grid-template-columns:minmax(0,var(--measure));grid-template-areas:"head" "toc" "body" "foot";justify-content:center}.article-head{grid-area:head;margin-bottom:var(--space-6)}.toc{grid-area:toc}.article-body{grid-area:body;min-width:0;align-self:start}.sidenotes{grid-area:notes;display:none}.article-foot{grid-area:foot;min-width:0}@media(min-width:77.5rem){.page--article .main{width:100%}.article-layout{--wide:1;grid-template-columns:var(--toc-width)minmax(0,var(--measure))var(--note-width);grid-template-areas:"toc head notes" "toc body notes" ".   foot .";column-gap:var(--gutter)}.sidenotes{display:block;position:relative}}.article-body>:first-child{margin-top:0}.intro{margin-bottom:var(--space-7)}.intro-title{margin:0 0 var(--space-3)}.intro-lead{margin:0;max-width:24ch;font-family:var(--font-heading);font-size:clamp(1.9rem,1.2rem + 3vw,2.9rem);font-weight:500;line-height:1.15;letter-spacing:-.02em;color:var(--color-strong);text-wrap:balance}.home-section{margin-bottom:var(--space-7)}.home-cols{display:flex;align-items:flex-start;gap:var(--space-7);margin-bottom:var(--space-7)}.home-latest{flex:1.5 1 0;min-width:0}.home-featured{flex:1;min-width:0}.section-head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:var(--space-2)var(--space-5);margin-bottom:var(--space-4);h2 { margin: 0; }}.section-links{display:flex;flex-wrap:wrap;gap:var(--space-2)var(--space-5);margin:0;font-size:var(--text-sm);a { color: var(--color-muted); &:hover { color: var(--color-accent-text); } }}.entries,.features{margin:0;padding:0;list-style:none}.entry,.feature{margin:0 0 var(--space-5);&::marker { content:none; }}.entry-date{display:block;font-size:var(--text-sm);line-height:1.3;font-variant-numeric:lining-nums tabular-nums;color:var(--color-muted)}.entry-title{color:var(--color-strong);font-weight:500;text-decoration-color:transparent;text-wrap:pretty;&:hover { color:var(--color-accent-text); text-decoration-color:currentColor; }}.entry-kind{margin-left:.5em;font-size:var(--text-sm);color:var(--color-muted)}.entry-summary{margin:.15em 0 0;font-size:var(--text-sm);line-height:1.45;color:var(--color-muted)}.projects{display:grid;grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));gap:var(--space-5)var(--space-6);.feature { margin: 0; }}.archives,.tag-list{display:flex;flex-wrap:wrap;gap:var(--space-2)var(--space-6);margin:0;padding:0;list-style:none;li { margin: 0; } li::marker { content: none; }}.count{margin-left:.25em;font-size:var(--text-sm);font-variant-numeric:lining-nums tabular-nums;color:var(--color-muted)}.list-title{margin-bottom:var(--space-6)}.list-intro{margin-bottom:var(--space-6)}.year-group{display:grid;grid-template-columns:4.5rem 1fr;column-gap:var(--space-4);margin-bottom:var(--space-5);.entry { display: grid; grid-template-columns: 4.5rem 1fr; column-gap: var(--space-4); margin-bottom: var(--space-4); } .entry-date { padding-top: 0.2em; }}.year{margin:0;padding-top:.05em;font-size:var(--text-h3);font-variant-numeric:lining-nums tabular-nums;color:var(--color-muted)}.pagination{display:flex;align-items:baseline;justify-content:space-between;margin-top:var(--space-6);font-size:var(--text-sm)}.page-number{color:var(--color-muted)}.single-title{margin:0 0 var(--space-2)}.single-readtime{margin:0;font-size:var(--text-sm);color:var(--color-muted)}.single-content{margin-bottom:var(--space-8)}.single-tags{margin-bottom:var(--space-4);font-size:var(--text-sm);span { margin-right: var(--space-3); }}.post-nav{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-5);margin:var(--space-7)0 var(--space-5);padding-top:var(--space-4);border-top:1px solid var(--color-border-strong);font-size:var(--text-sm);line-height:1.45;a { color: var(--color-muted); text-decoration: none; } a:hover { color: var(--color-strong); text-decoration: underline; }}.post-nav-older{text-align:right}.back-to-top{margin-bottom:var(--space-6);font-size:var(--text-sm)}.giscus{margin-top:var(--space-7)}figure.image{> div { display: flex; justify-content: center; } img { display: block; max-width: 100%; max-height: 800px; width: auto; height: auto; margin-inline: auto; border-radius: var(--radius-sm); } img[src$=".svg"] { max-height: none; } @media (max-width: 37.5rem) { > div:has(> img[src$=".svg"]) { justify-content: flex-start; overflow-x: auto; } img[src$=".svg"] { flex: none; max-width: none; margin-inline: 0; } }}figcaption{margin-block:var(--space-3);font-size:var(--text-sm);color:var(--color-muted)}.caption-container{display:flex}.not-found{max-width:28rem;p { color: var(--color-muted); }}.not-found-links{display:flex;flex-wrap:wrap;gap:var(--space-2)var(--space-5);margin:0;padding:0;list-style:none;li::marker { content:none; }}@media(max-width:56.25rem){.home-cols{flex-direction:column;gap:var(--space-6)}.home-featured{order:-1}}@media(max-width:40rem){.year-group,.year-group .entry{grid-template-columns:1fr}.year-group{row-gap:var(--space-2)}.year-group .entry-date{padding-top:0}}.heading{a { visibility: hidden; margin-left: 0.3em; font-family: var(--font-mono); font-size: 0.8em; font-weight: 400; text-decoration: none; color: var(--color-muted); } &:hover a, a:focus-visible { visibility: visible; }}.autonumber{counter-reset:h2-counter 0;h2 { counter-increment: h2-counter 1; counter-reset: h3-counter 0; } h3 { counter-increment: h3-counter 1; counter-reset: h4-counter 0; } h4 { counter-increment: h4-counter 1; } h2::before { content: counter(h2-counter) "\00a0\00a0"; } h3::before { content: counter(h2-counter) "." counter(h3-counter) "\00a0\00a0"; } h4::before { content: counter(h2-counter) "." counter(h3-counter) "." counter(h4-counter) "\00a0\00a0"; }}.toc{margin:0 0 var(--space-6);font-size:var(--text-sm);line-height:1.4;summary { width: fit-content; color: var(--color-muted); cursor: pointer; } summary:hover { color: var(--color-strong); } ul { margin: 0; padding: 0; list-style: none; } ul ul { padding-left: 0.9em; } li { margin: 0; } nav > ul { margin-top: var(--space-3); } a { display: block; padding-block: 0.2em; color: var(--color-muted); text-decoration: none; &:hover { color: var(--color-strong); } } a[aria-current] { color: var(--color-accent-text); }}.autonumber .toc{ul { counter-reset: toc-item; } li { counter-increment: toc-item; } a { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 0.6em; } a::before { content: counters(toc-item, "."); font-variant-numeric: tabular-nums; }}@media(min-width:77.5rem){.toc{margin:0}.toc-details{position:sticky;top:var(--space-5);max-height:calc(100vh - 2 * var(--space-5));overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}}.footnote-ref{padding-inline:.1em;border-radius:var(--radius-sm);font-variant-numeric:lining-nums;text-decoration:none;&:hover,&.is-linked { background:var(--color-accent-soft); }}.footnotes{margin-top:var(--space-7);font-size:var(--text-sm);hr { margin: 0 0 var(--space-4); }}.has-sidenotes .footnotes{display:none}.sidenote{position:absolute;inset-inline:0;font-size:var(--text-sm);line-height:1.45;color:var(--color-muted);transition:color var(--transition);p { margin: 0; } p + p { margin-top: 0.5em; } &.is-linked, &:focus { color: var(--color-text); outline: none; }}.sidenote-number{font-variant-numeric:lining-nums tabular-nums;color:var(--color-accent-text)}.callout{--callout-rule:var(--color-callout-neutral);--callout-label:var(--color-muted);margin:0 0 var(--para-space).5em;padding-left:1em;border-left:3px solid var(--callout-rule);overflow-wrap:break-word;&.callout-important, &.callout-update, &.callout-correction { --callout-rule: var(--color-accent); --callout-label: var(--color-accent-text); } &.callout-warning, &.callout-caution { --callout-rule: var(--color-warn); --callout-label: var(--color-warn); } .callout-body > :last-child { margin-bottom: 0; } .callout-body > :first-child { margin-top: 0; }}.callout-label{margin:0 0 var(--space-1);font-size:.9em;line-height:1.3;color:var(--callout-label)}.callout-type{font-weight:600;letter-spacing:0}.callout-sep{margin-inline:.35em}.callout-title{font-weight:400}.has-sidenotes .article-body{position:relative}.callout.is-margin{position:absolute;left:calc(100% + var(--gutter));width:var(--note-width);margin:0;font-size:.85em;line-height:1.4}code,pre,kbd,samp{font-family:var(--font-mono);font-feature-settings:"liga" 1,"calt" 1;font-variant-numeric:tabular-nums}:not(pre)>code{padding:.1em .3em;border-radius:var(--radius-sm);background:var(--color-code-inline-bg);font-size:.88em;overflow-wrap:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}a code{color:inherit}.code,.highlight{margin:var(--space-5)0}.code{position:relative;.highlight { margin: 0; }}.code-tools{position:absolute;top:0;right:var(--space-4);z-index:1;display:flex;gap:var(--space-2);translate:0 -50%;font-family:var(--font-mono);font-size:.75rem;line-height:1.6;&:empty { display:none; }}.code-lang,.code-copy{padding:0 .45em;border-radius:var(--radius-sm);background:var(--color-bg);color:var(--color-muted)}.code-copy{margin:0;border:0;font:inherit;cursor:pointer;opacity:0;transition:opacity var(--transition),color var(--transition);&:hover { color:var(--color-accent-text); } &:focus-visible { opacity:1; }}.code:hover .code-copy,.code:focus-within .code-copy{opacity:1}@media(hover:none){.code-copy{opacity:1}}pre{margin:0;padding:var(--space-4)var(--space-5);overflow-x:auto;border:1px solid var(--color-code-border);border-radius:var(--radius);background:var(--color-code-bg);color:var(--code-text);font-size:var(--text-sm);line-height:1.6;tab-size:4;-moz-tab-size:4;scrollbar-width:thin;scrollbar-color:var(--color-border-strong)transparent;code { padding: 0; background: none; font-size: inherit; overflow-wrap: normal; }}.chroma{.line { display: block; } .k, .kc, .kd, .kn, .kp, .kr { color: var(--code-keyword); } .kt { color: var(--code-class); } .nf, .fm { color: var(--code-function); } .nb, .bp { color: var(--code-function); } .nc { color: var(--code-class); } .na, .nd { color: var(--code-attribute); } .nt, .no { color: var(--code-tag); } .nv, .vm { color: var(--code-variable); } .nn, .nx, .n { color: var(--code-text); } .s, .sa, .sb, .s2, .se, .si, .sr, .s1 { color: var(--code-string); } .m, .mf, .mi { color: var(--code-number); } .o, .ow { color: var(--code-operator); } .p { color: var(--code-punctuation); } .cm, .c1, .cp, .cpf { color: var(--code-comment); font-style: italic; } .err { color: var(--code-error); }}.katex-display{overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.math-display{margin:var(--space-5)0}@media print{:root{--text-base:11pt}body{background:#fff;color:#000;display:block}.header,.site-footer,.article-foot,.toc,.giscus,.back-to-top,.post-nav,.skip-link,.sidenotes,.code-copy{display:none !important}.has-sidenotes .footnotes{display:block}.main{width:100%;padding:0}a{color:inherit;text-decoration:underline}.single-content a[href^=http]::after{content:" (" attr(href)")";font-size:.85em;word-break:break-all}pre{white-space:pre-wrap;overflow:visible}figure.image,table{break-inside:avoid}.callout{break-inside:avoid;border-left-color:#000}.callout.is-margin{position:static;width:auto;margin:0 0 var(--para-space).5em;font-size:inherit}.callout-label{color:#000}h1,h2,h3,h4{break-after:avoid}}