@font-face{font-family:ibm plex serif;src:url(/fonts/IBMPlexSerif-Medium.woff2)format("woff2");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:ibm plex sans;src:url(/fonts/IBMPlexSans-Regular.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:ibm plex sans;src:url(/fonts/IBMPlexSans-Medium.woff2)format("woff2");font-weight:500 700;font-style:normal;font-display:swap}@font-face{font-family:ibm plex sans;src:url(/fonts/IBMPlexSans-Italic.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:ibm plex mono;src:url(/fonts/IBMPlexMono-Regular.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}:root{--bg:#f7f3ea;--ink:#1c1a16;--muted:#6b665c;--hairline:#1c1a1622;--accent:#1d5a73;--serif:"IBM Plex Serif", Georgia, serif;--sans:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--measure:680px;color-scheme:light}@media(prefers-color-scheme:dark){:root{--bg:#1a1a18;--ink:#e9e6df;--muted:#9a958a;--hairline:#ffffff1f;--accent:#86bba8;color-scheme:dark}}*,*::before,*::after{box-sizing:border-box}html{background:var(--bg);-webkit-text-size-adjust:100%}body{margin:0 auto;max-width:calc(var(--measure) + 2 * 24px);padding:0 24px;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:17px;line-height:1.6;overflow-wrap:break-word}a{color:var(--accent);text-decoration-thickness:1px;text-underline-offset:.15em}strong,b{font-weight:500}.site-header{padding-top:40px;text-align:center;border-bottom:1px solid var(--hairline)}.site-logo{display:inline-block;color:var(--ink)}.site-logo svg{display:block;width:200px;height:auto}.site-nav{display:flex;flex-wrap:wrap;justify-content:center;gap:4px 28px;margin-top:20px}.site-nav a{padding:6px 0;border-bottom:2px solid transparent;color:var(--muted);font-family:var(--sans);font-size:13px;font-weight:400;letter-spacing:.1em;line-height:1.4;text-decoration:none;text-transform:uppercase}.site-nav a:hover{color:var(--ink)}.site-nav a.active{border-bottom-color:var(--accent);color:var(--accent)}main{padding:40px 0 24px}.site-footer{display:flex;gap:20px;justify-content:center;margin-top:48px;padding:20px 0 40px;border-top:1px solid var(--hairline);color:var(--muted);font-family:var(--mono);font-size:13px}.site-footer a{color:var(--muted)}.site-footer a:hover{color:var(--accent)}.home-section+.home-section{margin-top:56px}.label{margin:0;color:var(--muted);font-family:var(--mono);font-size:13px;font-weight:400;letter-spacing:.08em;line-height:1.4;text-align:left}.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.post-list{margin:0;padding:0;list-style:none}.post-list li{display:grid;grid-template-columns:7.5em 1fr;gap:0 20px;padding:14px 0}.post-list time{padding-top:.3em;color:var(--muted);font-family:var(--mono);font-size:14px;font-variant-numeric:tabular-nums}.post-list-title{color:var(--ink);font-family:var(--serif);font-size:21px;font-weight:500;line-height:1.3;text-decoration:none}.post-list-title:hover{color:var(--accent)}.post-list-subtitle{margin:2px 0 0;color:var(--muted);font-size:15px;line-height:1.45}@media(max-width:540px){.post-list li{grid-template-columns:1fr}.post-list time{padding:0 0 2px;font-size:13px}}.projects-table{width:100%;margin-top:4px;border-collapse:collapse;line-height:1.45}.projects-table .group-row .label{padding:32px 0 6px}.projects-table tbody:first-of-type .group-row .label{padding-top:10px}.project-row{border-bottom:1px solid var(--hairline)}.project-row>*{padding:11px 0;vertical-align:baseline}.project-name{padding-right:24px;font-family:var(--mono);font-size:15px;font-weight:400;text-align:left;text-transform:lowercase;white-space:nowrap}.project-what{padding-right:24px;font-size:16px}.project-where{font-family:var(--mono);font-size:13px;text-align:right;white-space:nowrap}.project-where .soon{color:var(--muted)}@media(max-width:540px){.projects-table,.projects-table tbody,.projects-table .group-row,.projects-table .group-row .label{display:block}.project-row{display:grid;grid-template-columns:1fr auto;gap:2px 16px;padding:10px 0}.project-row>*{padding:0}.project-name{grid-row:1;grid-column:1}.project-where{grid-row:1;grid-column:2}.project-what{grid-row:2;grid-column:1/-1;font-size:15px}}.post-header{margin-bottom:32px}.post-title,.page-title{margin:0;font-family:var(--serif);font-size:36px;font-weight:500;line-height:1.2}.post-subtitle{margin:8px 0 0;color:var(--muted);font-size:19px;line-height:1.4}.byline{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;margin:16px 0 0;font-size:15px}.byline time{color:var(--muted);font-family:var(--mono);font-size:14px}.credit{margin:4px 0 0;color:var(--muted);font-size:14px}.credit code{font-size:13px}.toc{margin:0 0 32px;padding:10px 0;border-top:1px solid var(--hairline);border-bottom:1px solid var(--hairline)}.toc summary{color:var(--muted);cursor:pointer;font-family:var(--mono);font-size:13px;letter-spacing:.04em}.toc ul{margin:0;padding-left:16px;list-style:none}.toc>nav>ul{margin-top:8px;padding-left:0}.toc li{margin:2px 0;font-size:15px;line-height:1.45}.toc a{color:var(--ink);text-decoration:none}.toc a:hover{color:var(--accent)}.prose h1,.prose h2,.prose h3,.prose h4{margin:1.8em 0 .5em;font-family:var(--serif);font-weight:500;line-height:1.25}.prose h1{font-size:30px}.prose h2{font-size:26px}.prose h3{font-size:21px}.prose h4{font-size:18px}.prose>:first-child{margin-top:0}.prose p,.prose ul,.prose ol{margin:0 0 1.1em}.prose li{margin:.2em 0}.prose hr{margin:2em 0;border:0;border-top:1px solid var(--hairline)}blockquote{margin:1.5em 0;padding:2px 0 2px 18px;border-left:3px solid var(--accent);font-family:var(--mono);font-size:15.5px;font-style:normal;line-height:1.6}blockquote p:last-child{margin-bottom:0}img{display:block;max-width:100%;height:auto;margin:0 auto}.prose p>img{margin:1.5em auto}figure{margin:1.8em 0;text-align:center}figcaption,.caption{margin:8px 0 0;color:var(--muted);font-family:var(--sans);font-size:14px;line-height:1.45;text-align:center}figcaption p{margin:0}audio{max-width:100%}code,kbd,pre{font-family:var(--mono)}:not(pre)>code{padding:.1em .35em;border-radius:3px;background:var(--hairline);font-size:.88em}a>code{color:var(--accent)}pre,.prose .chroma{background:0 0}pre{margin:1.4em 0;padding:14px 16px;overflow-x:auto;border:1px solid var(--hairline);border-radius:4px;font-size:14px;line-height:1.55;tab-size:4}.highlight{margin:1.4em 0}.highlight pre{margin:0}.prose table{display:block;width:max-content;max-width:100%;margin:1.4em auto;overflow-x:auto;border-collapse:collapse;font-size:15px;font-variant-numeric:tabular-nums;line-height:1.4;-webkit-overflow-scrolling:touch}.prose th,.prose td{padding:6px 12px;border:1px solid var(--hairline);white-space:nowrap}.prose th{font-weight:500}mjx-container[display=true]{max-width:100%;overflow-x:auto;overflow-y:hidden}.prose .fine-print{margin-top:2.5em;color:var(--muted);font-size:12.5px;line-height:1.5}.fine-print code{font-size:1em}.annotated-list{padding-left:2em;list-style-type:none;counter-reset:list-counter}.annotated-list li{position:relative;margin-bottom:1.2em}.annotated-list li::before{content:counter(list-counter)".";counter-increment:list-counter;position:absolute;left:-1.75em;color:var(--muted);font-family:var(--mono);font-size:14px;line-height:1.6rem}.annotated-list .list-content p{margin:0 0 .3em}.annotation{overflow-x:auto;font-size:14px}.annotation code{white-space:pre-wrap;word-break:break-word}@media(min-width:720px){.annotated-list li{display:flex;flex-wrap:wrap;align-items:baseline;margin-bottom:.3em}.annotated-list li::before{left:-2.25em;width:1.75em;text-align:right}.list-content{flex:1;padding-right:1em}.annotation code{white-space:nowrap}}@media(max-width:480px){body{padding:0 18px;font-size:16.5px}.site-header{padding-top:28px}.site-logo svg{width:170px}.site-nav{gap:4px 20px}main{padding-top:28px}.post-title,.page-title{font-size:30px}.prose h1{font-size:26px}.prose h2{font-size:23px}.prose table{font-size:14px}.prose th,.prose td{padding:5px 8px}}