:root{--a-bg:#f4f6f9;--a-surface:#ffffff;--a-fg:#18202c;--a-dim:#586477;--a-rule:#d9dee6;--a-accent:#2f7560;--a-accent-soft:#e1efe9;--a-ok:#23704f;--a-ok-soft:#e1f1e9;--a-warn:#a4501c;--a-warn-soft:#f8e9de;--a-bad:#a62a3a;--a-bad-soft:#f7e1e4;--a-code-bg:#eef1f5;--a-sans:'IBM Plex Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;--a-cond:'IBM Plex Sans Condensed', 'Arial Narrow', system-ui, sans-serif;--a-mono:'IBM Plex Mono', ui-monospace, 'SF Mono', Menlo, monospace;--a-column:760px;--a-gutter:20px;--a-frame:calc(var(--a-column) + 2 * var(--a-gutter))}@media(prefers-color-scheme:dark){:root{color-scheme:dark;--a-bg:#121720;--a-surface:#19202b;--a-fg:#e4e8ef;--a-dim:#9aa5b6;--a-rule:#2c3543;--a-accent:#7eb8a4;--a-accent-soft:#1d2f29;--a-ok:#6fcf9f;--a-ok-soft:#173327;--a-warn:#f0a36e;--a-warn-soft:#3a2618;--a-bad:#f08a98;--a-bad-soft:#3b1c22;--a-code-bg:#222a37}}*,*::before,*::after{box-sizing:border-box}html,body{margin:0;padding:0}html{background:var(--a-bg);scroll-behavior:smooth}body{background:var(--a-bg);color:var(--a-fg);font-family:var(--a-sans);font-size:16px;line-height:1.6}::selection{background:var(--a-accent-soft);color:var(--a-fg)}:focus-visible{outline:2px solid var(--a-accent);outline-offset:2px}a{color:var(--a-accent);text-underline-offset:3px}.progress-bar{position:fixed;top:0;left:0;right:0;height:2px;background:var(--a-rule);z-index:50}.progress-bar>.progress-fill{height:100%;width:var(--progress,0%);background:var(--a-accent);transition:width 80ms linear}.site-header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:8px 20px;max-width:var(--a-column);margin:0 auto;padding-block:28px 14px;border-bottom:1px solid var(--a-rule);font-family:var(--a-mono);font-size:13px}.site-name{font-size:15px;font-weight:500;color:var(--a-fg);text-decoration:none}.site-name .accent{color:var(--a-accent)}.site-header nav{display:flex;gap:18px}.site-header nav a{color:var(--a-dim);text-decoration:none}.site-header nav a:hover,.site-header nav a.active{color:var(--a-fg)}.site-footer{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:8px 16px;max-width:var(--a-column);margin:72px auto 0;padding-block:20px 56px;border-top:1px solid var(--a-rule);font-family:var(--a-mono);font-size:13px;color:var(--a-dim)}.site-footer a{color:var(--a-dim);text-decoration:none}.site-footer a:hover{color:var(--a-fg)}.site-footer a.rss{color:var(--a-accent)}.site-footer .footer-links{display:flex;gap:16px;align-items:baseline}.site-header,.site-footer{margin-inline:max(var(--a-gutter),calc((100% - var(--a-column))/2))}main{display:flex;flex-direction:column;gap:40px;max-width:var(--a-frame);margin:0 auto;padding:40px var(--a-gutter)0}.eyebrow{font-family:var(--a-mono);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--a-dim);margin:0}.eyebrow .fg{color:var(--a-fg)}.lead-h1,.section-h1,.article-h1,.about-heading,.not-found h1{font-family:var(--a-cond);font-weight:600;font-size:clamp(30px,6vw,40px);line-height:1.1;color:var(--a-fg);margin:0;text-wrap:balance}.recent-head h2,.two-col h3,.post-body th,.admonition-title{font-family:var(--a-mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--a-dim)}.home-intro{display:flex;flex-direction:column;gap:12px}.lead-h1 a{color:inherit;text-decoration-color:var(--a-accent);text-decoration-thickness:2px}.lead{color:var(--a-dim);max-width:62ch}.lead p{margin:0 0 12px}.lead p:last-child{margin-bottom:0}.now-block{background:var(--a-code-bg);border-radius:6px;padding:12px 14px;font-family:var(--a-mono);font-size:14px;line-height:1.7;overflow-x:auto}.now-head{color:var(--a-dim)}.now-item{display:block}.now-item .text{color:var(--a-fg)}.now-add{color:var(--a-ok)}.now-wip{color:var(--a-warn)}.now-remove{color:var(--a-bad)}.recent{display:flex;flex-direction:column;gap:14px}.recent-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.recent-head h2{font-family:var(--a-cond);font-weight:600;font-size:22px;line-height:1.25;letter-spacing:0;text-transform:none;color:var(--a-fg);margin:0}.recent-head a{font-family:var(--a-mono);font-size:13px;text-decoration:none}.recent-head a:hover{text-decoration:underline}.table-wrap{overflow-x:auto}table.posts{width:100%;border-collapse:separate;border-spacing:0;font-size:14px;background:var(--a-surface);border:1px solid var(--a-rule);border-radius:8px;overflow:hidden}.posts th,.posts td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--a-rule);vertical-align:top}.posts tr:last-child td{border-bottom:none}.posts th{font-family:var(--a-mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--a-dim)}.posts td.date,.posts td.min{width:1%;font-family:var(--a-mono);font-size:12px;color:var(--a-dim);white-space:nowrap;font-variant-numeric:tabular-nums}.posts th.min,.posts td.min{text-align:right}.posts a.title{color:var(--a-fg);text-decoration:none;font-weight:500}.posts a.title:hover,.posts a.title:focus-visible{color:var(--a-accent);text-decoration:underline}.tag{display:inline-block;font-family:var(--a-mono);font-size:11px;font-weight:500;letter-spacing:.04em;padding:0 8px;margin-left:6px;border-radius:999px;white-space:nowrap;color:var(--a-accent);background:var(--a-accent-soft);text-decoration:none}.tag:hover{text-decoration:underline}.two-col{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:28px}.two-col h3{margin:0 0 8px}.two-col ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;font-size:15px}.two-col a{color:var(--a-fg);text-decoration:none}.two-col a:hover{color:var(--a-accent);text-decoration:underline}.projects .slug{font-family:var(--a-mono);font-size:13px;color:var(--a-accent)}.elsewhere .note{color:var(--a-dim)}.section-page{display:flex;flex-direction:column;gap:14px}.section-page>header{display:flex;flex-direction:column;gap:12px;margin-bottom:12px}.subtitle{color:var(--a-dim);max-width:62ch}.subtitle p{margin:0 0 8px}.subtitle p:last-child{margin-bottom:0}.year-sep{display:flex;align-items:baseline;gap:12px;margin-top:18px}.year-sep span{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);white-space:nowrap}.year-sep hr{flex:auto;border:0;border-top:1px solid var(--a-rule);margin:0}.back-link{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);text-decoration:none}.back-link:hover{color:var(--a-fg)}.tag-cloud{display:flex;flex-wrap:wrap;gap:10px 4px}.tag-cloud .tag{font-size:12px;padding:2px 10px}.tag-cloud .count{color:var(--a-dim);margin-left:6px}.article{display:flex;flex-direction:column;gap:18px}.article-header{display:flex;flex-direction:column;gap:12px}.article-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;font-family:var(--a-mono);font-size:12px;color:var(--a-dim)}.article-meta .tag{margin-left:0}.dek{font-size:18px;line-height:1.55;font-weight:500;margin:0;max-width:66ch;text-wrap:pretty}.article-foot{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:16px;margin-top:40px;padding-top:20px;border-top:1px solid var(--a-rule);font-family:var(--a-mono);font-size:13px;color:var(--a-dim)}.article-foot a{color:var(--a-dim);text-decoration:none}.article-foot a:hover{color:var(--a-fg)}.article-foot .back{color:var(--a-accent)}.article-foot .back:hover{color:var(--a-accent);text-decoration:underline}.post-body>*{max-width:66ch}.post-body>pre,.post-body>.highlight,.post-body>figure,.post-body>table,.post-body>img,.post-body>p:has(>img:only-child){max-width:none}.post-body p{margin:0 0 16px}.post-body h2{font-family:var(--a-cond);font-weight:600;font-size:22px;line-height:1.25;color:var(--a-fg);margin:40px 0 14px;padding-top:24px;border-top:1px solid var(--a-rule);text-wrap:balance;scroll-margin-top:32px}.post-body h3{font-family:var(--a-cond);font-weight:600;font-size:18px;line-height:1.3;color:var(--a-fg);margin:32px 0 10px;scroll-margin-top:32px}.post-body h4{font-weight:600;font-size:16px;color:var(--a-fg);margin:24px 0 8px}.post-body a{text-decoration-thickness:1px}.post-body strong{font-weight:600}.post-body em{font-style:italic}.post-body blockquote{border-left:2px solid var(--a-rule);padding:2px 0 2px 16px;margin:24px 0;color:var(--a-dim)}.post-body blockquote p:last-child{margin-bottom:0}.post-body ul,.post-body ol{margin:0 0 16px;padding-left:22px}.post-body li{margin-bottom:6px}.post-body ol ol,.post-body ol ul,.post-body ul ol,.post-body ul ul{margin:6px 0}.post-body ul.task-list,.post-body li.task-list-item{list-style:none;padding-left:0}.post-body input[type=checkbox]{margin-right:8px}.post-body code{font-family:var(--a-mono);font-size:.88em;background:var(--a-code-bg);padding:1px 5px;border-radius:4px}.post-body pre code{background:0 0;padding:0;font-size:inherit}.post-body pre{font-family:var(--a-mono);font-size:13px;line-height:1.5;background:var(--a-surface);border:1px solid var(--a-rule);border-radius:6px;padding:14px 16px;margin:24px 0;overflow-x:auto;color:var(--a-fg)}.code-label{display:inline-block;font-family:var(--a-mono);font-size:11px;color:var(--a-dim);background:var(--a-surface);border:1px solid var(--a-rule);border-bottom:none;border-radius:6px 6px 0 0;padding:6px 12px;margin:24px 0 -1px;position:relative;z-index:1}.post-body .code-label+.highlight,.post-body .code-label+pre{margin-top:0;border-top-left-radius:0}.post-body .highlight{background:var(--a-surface);border:1px solid var(--a-rule);border-radius:6px;margin:24px 0;overflow-x:auto}.post-body .highlight table{width:100%;border-collapse:collapse;border:none;margin:0;font-size:inherit}.post-body .highlight td{padding:0;vertical-align:top;border:none}.post-body .highlight td:first-child{width:1%;white-space:nowrap;padding:14px 0 14px 12px}.post-body .highlight td:last-child{width:100%;padding:14px 16px}.post-body .highlight pre,.post-body .highlight .chroma{background:0 0;border:none;border-radius:0;padding:0;margin:0;overflow-x:visible}.post-body img{max-width:100%;height:auto;display:block;margin:24px auto}.post-body img:not(.profile-img):not(.no-zoom){cursor:zoom-in}.image-zoom-overlay{position:fixed;inset:0;background:color-mix(in srgb,var(--a-bg) 92%,transparent);display:flex;align-items:center;justify-content:center;padding:32px;z-index:100;opacity:0;transition:opacity .18s ease-out;cursor:zoom-out}.image-zoom-overlay.is-open{opacity:1}.image-zoom-overlay img{max-width:95vw;max-height:95vh;width:auto;height:auto;object-fit:contain;box-shadow:0 24px 80px rgba(0,0,0,.35);transform:scale(.96);transition:transform .18s ease-out;margin:0;cursor:zoom-out}.image-zoom-overlay.is-open img{transform:scale(1)}@media(prefers-reduced-motion:reduce){.image-zoom-overlay,.image-zoom-overlay img{transition:none}}.post-body figure{background:var(--a-surface);border:1px solid var(--a-rule);border-radius:6px;padding:16px 16px 12px;margin:28px 0}.post-body figure img{margin:0 auto 12px}.post-body figcaption{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);text-align:center;margin-top:8px;line-height:1.5}.post-body figure.diagram{position:relative;padding-top:28px}.diagram .fig-label{position:absolute;top:10px;left:14px;font-family:var(--a-mono);font-size:11px;color:var(--a-dim)}.diagram-note{font-family:var(--a-mono);font-size:11px;color:var(--a-dim);text-align:center;margin:0 0 10px}.diagram pre.mermaid{background:0 0;border:none;padding:0;margin:0;text-align:center;overflow:visible;font-size:inherit;line-height:inherit;color:inherit}.diagram svg{max-width:100%;height:auto}.diagram svg .node.accent rect,.diagram svg .node.accent polygon,.diagram svg .node.accent path{stroke:var(--a-accent)}.post-body table{width:100%;border-collapse:separate;border-spacing:0;margin:24px 0;font-size:14px;background:var(--a-surface);border:1px solid var(--a-rule);border-radius:8px;overflow:hidden}.post-body th,.post-body td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--a-rule);vertical-align:top}.post-body tbody tr:last-child td{border-bottom:none}.post-body hr{border:0;border-top:1px solid var(--a-rule);margin:40px 0}.post-body .footnotes{margin-top:48px;padding-top:24px;border-top:1px solid var(--a-rule);font-size:14px;line-height:1.6;color:var(--a-dim)}.post-body .footnotes ol{list-style:none;padding-left:0;counter-reset:fn;margin:0}.post-body .footnotes ol>li{counter-increment:fn;position:relative;padding-left:36px;margin:0 0 12px}.post-body .footnotes ol>li::before{content:"[" counter(fn)"]";position:absolute;left:0;top:0;color:var(--a-accent);font-family:var(--a-mono);font-size:12px}.post-body .footnotes p{margin:0}.post-body .footnotes a{color:var(--a-dim)}.post-body .footnotes hr{display:none}.post-body sup a{font-family:var(--a-mono);font-size:11px;vertical-align:super;text-decoration:none;line-height:0;margin-left:2px}.post-body dl{margin:20px 0}.post-body dt{font-weight:600;margin-top:12px}.post-body dd{margin-left:22px}.admonition{background:var(--a-accent-soft);border-radius:6px;padding:12px 14px;margin:24px 0;font-size:15px;max-width:66ch}.admonition-title{margin-bottom:6px;color:var(--a-accent)}.admonition-content>p:last-child{margin-bottom:0}.admonition-warning{background:var(--a-warn-soft)}.admonition-warning .admonition-title{color:var(--a-warn)}.admonition-bug,.admonition-danger{background:var(--a-bad-soft)}.admonition-bug .admonition-title,.admonition-danger .admonition-title{color:var(--a-bad)}.admonition-success{background:var(--a-ok-soft)}.admonition-success .admonition-title{color:var(--a-ok)}.admonition-quote,.admonition-abstract,.admonition-example{background:var(--a-code-bg)}.admonition-quote .admonition-title,.admonition-abstract .admonition-title,.admonition-example .admonition-title{color:var(--a-dim)}.sn-ref{font-family:var(--a-mono);font-size:11px;color:var(--a-accent);margin-left:3px;vertical-align:super;line-height:0;cursor:pointer;text-decoration:none}.sidenote{display:block;border-left:2px solid var(--a-rule);padding-left:14px;margin:16px 0;font-size:14px;color:var(--a-dim);line-height:1.55}.sidenote .sidenote-num{font-family:var(--a-mono);font-size:12px;color:var(--a-accent);margin-right:4px}.sidenote a{color:var(--a-dim)}.sidenote a:hover{color:var(--a-fg)}@media(min-width:1290px){.sidenote{float:right;clear:right;width:200px;margin:4px -232px 12px 16px;padding-left:12px;border-left-width:1px}}.twitter-embed{border-left:2px solid var(--a-rule);padding:10px 16px;margin:24px 0;font-family:var(--a-mono);font-size:13px;color:var(--a-dim)}.twitter-embed a{text-decoration:none}.twitter-embed a:hover{text-decoration:underline}.about-page{display:flex;flex-direction:column;gap:24px}.about-eyebrow{font-family:var(--a-mono);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--a-dim);margin:0}.about-head{display:flex;align-items:center;gap:20px}.about-avatar{width:72px;height:72px;border-radius:50%;object-fit:cover;border:1px solid var(--a-rule);flex-shrink:0;display:block}.about-intro p{margin:0 0 16px;max-width:66ch}.about-intro p:last-child{margin-bottom:0}.about-divider{border:0;border-top:1px solid var(--a-rule);margin:0;width:100%}.about-pills{display:flex;flex-direction:column;gap:6px;font-family:var(--a-mono);font-size:13px}.about-pill{color:var(--a-fg);text-decoration:none;display:inline-flex;align-items:baseline;gap:10px}.about-pill:hover .about-pill-value{color:var(--a-accent);text-decoration:underline}.about-pill-label{color:var(--a-dim);min-width:90px;display:inline-block}.profile-img{width:72px;height:72px;border-radius:50%;object-fit:cover;display:block;margin:0 0 24px;border:1px solid var(--a-rule)}.not-found{min-height:50vh;display:flex;flex-direction:column;justify-content:center;gap:14px}.not-found p{color:var(--a-dim);margin:0 0 8px;max-width:62ch}.not-found ul{margin:0;padding:0;list-style:none;background:var(--a-surface);border:1px solid var(--a-rule);border-radius:8px;overflow:hidden}.not-found li+li{border-top:1px solid var(--a-rule)}.not-found li a{display:grid;grid-template-columns:100px 1fr auto;gap:12px;padding:10px 12px;align-items:baseline;text-decoration:none;color:inherit;font-size:14px}.not-found li a:hover .ntitle{color:var(--a-accent);text-decoration:underline}.not-found .ndate{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);font-variant-numeric:tabular-nums}.not-found .ntitle{font-weight:500;color:var(--a-fg)}.not-found .nread{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);text-align:right}@media(max-width:480px){:root{--a-gutter:16px}.site-header{padding-top:20px}main{padding-top:32px}.posts .date{display:none}.not-found li a{grid-template-columns:1fr auto}.not-found .ndate{display:none}}