:root{--a-bg:#0f1117;--a-fg:#e8eaf0;--a-dim:#8b8fa0;--a-dimmer:#5a5e6e;--a-rule:#20232d;--a-accent:#7eb8a4;--a-code-bg:#161823;--a-diff-add:#6fb37a;--a-diff-remove:#c97777;--a-sans:'Inter Tight', system-ui, -apple-system, sans-serif;--a-serif:'Source Serif 4', Georgia, serif;--a-mono:'JetBrains Mono', ui-monospace, Menlo, monospace}*,*::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-serif);font-size:18px;line-height:1.72;font-feature-settings:"kern","liga";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background:var(--a-accent);color:var(--a-bg)}a{color:inherit}.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;align-items:baseline;justify-content:space-between;max-width:1100px;margin:0 auto;padding:28px 32px 16px;font-family:var(--a-mono);font-size:13px}.site-name{color:var(--a-accent);text-decoration:none;letter-spacing:-.01em}.site-name .dim{color:var(--a-accent);opacity:.6}.site-header nav{display:flex;gap:22px}.site-header nav a{color:var(--a-dim);text-decoration:none;border-bottom:1px solid transparent;padding-bottom:2px;transition:color .2s,border-color .2s}.site-header nav a:hover{color:var(--a-fg)}.site-header nav a.active{color:var(--a-fg);border-bottom-color:var(--a-accent)}.site-footer{display:flex;justify-content:space-between;align-items:baseline;max-width:1100px;margin:80px auto 0;padding:32px;border-top:1px solid var(--a-rule);font-family:var(--a-mono);font-size:12px;color:var(--a-dimmer)}.site-footer a{color:var(--a-dimmer);text-decoration:none;transition:color .2s}.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}main{display:block;max-width:720px;margin:0 auto;padding:44px 24px 0}main>section+section{margin-top:56px}.eyebrow{font-family:var(--a-mono);font-size:13px;color:var(--a-dim);margin:0}.eyebrow .fg{color:var(--a-fg)}.home-eyebrow{margin:0 0 14px}.lead-h1{font-family:var(--a-sans);font-weight:600;font-size:30px;line-height:1.25;letter-spacing:-.015em;color:var(--a-fg);margin:0 0 18px;text-wrap:balance}.lead-h1 a{color:var(--a-accent);text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px}.lead{font-family:var(--a-serif);font-size:17px;line-height:1.65;color:var(--a-dim);max-width:620px;text-wrap:pretty}.lead p{margin:0 0 14px}.lead p:last-child{margin-bottom:0}.lead a{color:var(--a-accent);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}.now-block{background:var(--a-code-bg);border:1px solid var(--a-rule);border-radius:0;padding:16px 18px;font-family:var(--a-mono);font-size:13px;line-height:1.7;margin-top:44px}.now-head{color:var(--a-dim);margin-bottom:6px}.now-item{display:block}.now-add{color:var(--a-diff-add)}.now-add .text,.now-wip .text,.now-remove .text{color:var(--a-fg)}.now-wip{color:var(--a-dim)}.now-wip .text{color:var(--a-dim)}.now-remove{color:var(--a-diff-remove)}.recent-head{display:flex;align-items:baseline;justify-content:space-between;margin:0 0 4px}.recent-head h2{font-family:var(--a-sans);font-size:14px;font-weight:600;color:var(--a-dim);text-transform:uppercase;letter-spacing:.06em;margin:0}.recent-head a{font-family:var(--a-mono);font-size:12px;color:var(--a-accent);text-decoration:none}.post-row{display:grid;grid-template-columns:98px 1fr 56px;gap:16px;align-items:baseline;padding:10px 0;border-top:1px solid var(--a-rule);text-decoration:none;color:inherit}.post-row .date{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);font-variant-numeric:tabular-nums}.post-row .title-cell{display:block;min-width:0}.post-row .title{font-family:var(--a-sans);font-size:16.5px;font-weight:500;color:var(--a-fg);text-decoration:none;letter-spacing:-.005em}.post-row a.title:hover{color:var(--a-accent)}.post-row .min{font-family:var(--a-mono);font-size:11px;color:var(--a-dimmer);text-align:right}.tag{font-family:var(--a-mono);font-size:11px;color:var(--a-dimmer);text-decoration:none;margin-left:6px;white-space:nowrap}.tag:hover{color:var(--a-dim)}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:36px}.two-col h3{font-family:var(--a-sans);font-size:13px;font-weight:600;color:var(--a-dim);text-transform:uppercase;letter-spacing:.06em;margin:0 0 10px}.two-col ul{list-style:none;margin:0;padding:0}.projects li{font-family:var(--a-sans);font-size:14.5px;line-height:1.7;color:var(--a-fg)}.projects .slug{font-family:var(--a-mono);color:var(--a-accent)}.projects a{text-decoration:none}.projects a:hover .slug{text-decoration:underline;text-underline-offset:3px}.elsewhere li{font-family:var(--a-mono);font-size:13px;line-height:1.85;color:var(--a-fg)}.elsewhere a{color:var(--a-fg);text-decoration:none}.elsewhere a:hover{color:var(--a-accent)}.elsewhere .note{color:var(--a-dimmer)}.section-h1{font-family:var(--a-sans);font-weight:600;font-size:28px;line-height:1.2;letter-spacing:-.015em;color:var(--a-fg);margin:0 0 12px;text-wrap:balance}.subtitle{font-family:var(--a-serif);font-size:15px;color:var(--a-dim);margin:0 0 24px;max-width:620px}.subtitle p{margin:0 0 8px}.subtitle p:last-child{margin-bottom:0}.year-sep{display:flex;align-items:baseline;gap:12px;margin:26px 0 8px}.year-sep span{font-family:var(--a-mono);font-size:12px;color:var(--a-accent);white-space:nowrap}.year-sep hr{flex:auto;border:0;border-top:1px solid var(--a-rule);margin:0}.post-row.year{grid-template-columns:82px 1fr 56px;gap:14px}.post-row.year .title{font-size:16px}.year-sep+.post-row.year{border-top:none}.back-link{display:inline-block;font-family:var(--a-mono);font-size:12px;color:var(--a-dim);text-decoration:none;margin-bottom:12px}.back-link:hover{color:var(--a-fg)}.tag-cloud{display:flex;flex-wrap:wrap;gap:10px 18px;margin-top:24px;font-family:var(--a-mono)}.tag-cloud .tag{margin-left:0;font-size:13px;color:var(--a-fg)}.tag-cloud .tag:hover{color:var(--a-accent)}.tag-cloud .count{font-family:var(--a-mono);font-size:11px;color:var(--a-dimmer);margin-left:4px}.article-meta{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);margin:0 0 14px}.article-meta a.tag{color:var(--a-dimmer)}.article-meta a.tag:hover{color:var(--a-accent)}.article-h1{font-family:var(--a-sans);font-weight:600;font-size:34px;line-height:1.2;letter-spacing:-.02em;color:var(--a-fg);margin:0 0 18px;text-wrap:balance}.dek{font-family:var(--a-serif);font-style:normal;font-size:19px;line-height:1.55;color:var(--a-dim);margin:0 0 32px;text-wrap:pretty}.article-foot{display:flex;justify-content:space-between;align-items:baseline;margin-top:60px;padding-top:24px;border-top:1px solid var(--a-rule);font-family:var(--a-mono);font-size:12px;color:var(--a-dim);gap:16px;flex-wrap:wrap}.article-foot a{color:var(--a-dim);text-decoration:none;transition:color .2s}.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;text-underline-offset:3px}.post-body{font-family:var(--a-serif);font-size:18px;line-height:1.72;color:var(--a-fg);hyphens:auto;-webkit-hyphens:auto}.post-body p{margin:0 0 22px}.post-body h2{font-family:var(--a-sans);font-weight:600;font-size:22px;line-height:1.3;letter-spacing:-.01em;color:var(--a-fg);margin:44px 0 14px;scroll-margin-top:32px}.post-body h3{font-family:var(--a-sans);font-weight:600;font-size:17px;letter-spacing:.06em;text-transform:uppercase;color:var(--a-dim);margin:36px 0 10px;scroll-margin-top:32px}.post-body h4{font-family:var(--a-sans);font-weight:600;font-size:16px;color:var(--a-fg);margin:28px 0 8px}.post-body a{color:var(--a-accent);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px;text-decoration-color:var(--a-rule);transition:text-decoration-color .2s}.post-body a:hover{text-decoration-color:var(--a-accent)}.post-body strong{color:var(--a-fg);font-weight:600}.post-body em{font-style:italic}.post-body blockquote{border-left:2px solid var(--a-rule);padding:4px 0 4px 18px;margin:28px 0;color:var(--a-dim);font-style:normal}.post-body blockquote p:last-child{margin-bottom:0}.post-body ul{margin:0 0 22px;padding-left:24px;list-style:disc}.post-body ul li{margin-bottom:8px}.post-body ol{margin:0 0 22px;padding-left:28px}.post-body ol>li{margin:0 0 8px}.post-body ol ol,.post-body ol ul,.post-body ul ol,.post-body ul ul{margin:8px 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:.86em;background:var(--a-code-bg);color:var(--a-accent);padding:1px 6px;border:1px solid var(--a-rule);border-radius:0}.post-body pre code{background:0 0;border:none;padding:0;color:inherit}.post-body pre{background:var(--a-code-bg);border:1px solid var(--a-rule);border-radius:0;padding:18px 20px;margin:28px 0;overflow-x:auto;font-family:var(--a-mono);font-size:13.5px;line-height:1.65;color:var(--a-fg)}.code-label{display:inline-block;font-family:var(--a-mono);font-size:11px;color:var(--a-dim);background:var(--a-code-bg);border:1px solid var(--a-rule);border-bottom:none;padding:6px 12px;margin:28px 0 -1px;position:relative;z-index:1}.post-body .code-label+.highlight,.post-body .code-label+pre{margin-top:0}.post-body .highlight{background:var(--a-code-bg);border:1px solid var(--a-rule);border-radius:0;margin:28px 0;overflow-x:auto}.post-body .highlight table{width:100%;border-collapse:collapse}.post-body .highlight td{padding:0;vertical-align:top}.post-body .highlight td:first-child{width:1%;white-space:nowrap;padding:16px 0 16px 16px}.post-body .highlight td:last-child{width:100%;padding:16px}.post-body .highlight pre,.post-body .highlight .chroma{background:0 0;border:none;border-radius:0;padding:0;margin:0;overflow-x:visible;color:inherit;font-size:13.5px;line-height:1.6}.post-body img{max-width:100%;height:auto;display:block;margin:28px auto}.post-body img:not(.profile-img):not(.no-zoom){cursor:zoom-in}.image-zoom-overlay{position:fixed;inset:0;background:rgba(15,17,23,.92);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,.6);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-code-bg);border:1px solid var(--a-rule);padding:20px 20px 14px;margin:32px 0}.post-body figure img{margin:0 auto 12px}.post-body figcaption{font-family:var(--a-mono);font-style:normal;font-size:11.5px;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:12px;left:16px;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:collapse;margin:28px 0;font-size:16px;border:1px solid var(--a-rule)}.post-body thead{background:var(--a-code-bg)}.post-body th{text-align:left;padding:12px 18px;font-family:var(--a-mono);font-size:11px;color:var(--a-dim);letter-spacing:.14em;text-transform:uppercase;font-weight:500;border-bottom:1px solid var(--a-rule)}.post-body td{padding:12px 18px;color:var(--a-fg);border-bottom:1px solid var(--a-rule)}.post-body tbody tr:last-child td{border-bottom:none}.post-body hr{border:0;border-top:1px solid var(--a-rule);margin:56px 0}.post-body .footnotes{margin-top:60px;padding-top:28px;border-top:1px solid var(--a-rule);font-family:var(--a-mono);font-size:13px;line-height:1.65;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 14px}.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:11px}.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;color:var(--a-accent);vertical-align:super;text-decoration:none;line-height:0;margin-left:2px}.post-body dl{margin:22px 0}.post-body dt{font-weight:600;color:var(--a-fg);margin-top:14px}.post-body dd{margin-left:24px;color:var(--a-fg)}.admonition{border-left:3px solid var(--a-accent);background:var(--a-code-bg);padding:18px 24px;margin:28px 0}.admonition-title{font-family:var(--a-mono);font-size:11px;color:var(--a-dim);letter-spacing:.18em;text-transform:uppercase;margin-bottom:10px;font-weight:500}.admonition-content{font-family:var(--a-serif);font-size:17px;line-height:1.6;color:var(--a-fg)}.admonition-content>p:last-child{margin-bottom:0}.admonition-warning{border-left-color:#e0a060}.admonition-bug,.admonition-danger{border-left-color:var(--a-diff-remove)}.admonition-success{border-left-color:var(--a-diff-add)}.admonition-question{border-left-color:#a080d0}.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-family:var(--a-mono);font-size:13px;color:var(--a-dim);line-height:1.65}.sidenote .sidenote-num{color:var(--a-accent);margin-right:4px}.sidenote a{color:var(--a-dim);text-decoration:underline;text-underline-offset:2px}.sidenote a:hover{color:var(--a-fg)}@media(min-width:1180px){.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:12px 20px;margin:28px 0;font-family:var(--a-mono);font-size:13px;color:var(--a-dim)}.twitter-embed a{color:var(--a-accent);text-decoration:none}.twitter-embed a:hover{text-decoration:underline;text-underline-offset:3px}.about-eyebrow{font-family:var(--a-mono);font-size:13px;color:var(--a-dim);margin:0 0 18px}.about-head{display:flex;align-items:center;gap:24px;margin:0 0 32px}.about-avatar{width:80px;height:80px;border-radius:50%;object-fit:cover;border:1px solid var(--a-rule);flex-shrink:0;display:block}.about-heading{font-family:var(--a-sans);font-style:normal;font-weight:600;font-size:30px;line-height:1.2;margin:0;letter-spacing:-.015em;color:var(--a-fg);text-wrap:balance}.about-intro p{font-family:var(--a-serif);font-size:18px;line-height:1.7;color:var(--a-fg);margin:0 0 18px}.about-intro p:last-child{margin-bottom:0}.about-intro a{color:var(--a-accent);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}.about-divider{border:0;border-top:1px solid var(--a-rule);margin:40px 0 24px}.about-pills{display:flex;flex-direction:column;gap:6px;margin-bottom:56px;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{color:var(--a-accent)}.about-pill-label{color:var(--a-dim);min-width:90px;display:inline-block}.about-pill-value{color:var(--a-fg)}.profile-img{width:80px;height:80px;border-radius:50%;object-fit:cover;display:block;margin:0 0 24px;border:1px solid var(--a-rule)}.not-found{min-height:60vh;display:flex;flex-direction:column;justify-content:center;padding:40px 0}.not-found .eyebrow{margin:0 0 18px}.not-found h1{font-family:var(--a-sans);font-weight:600;font-size:30px;line-height:1.2;letter-spacing:-.015em;margin:0 0 14px;color:var(--a-fg)}.not-found p{font-family:var(--a-serif);font-size:17px;line-height:1.65;color:var(--a-dim);margin:0 0 28px;max-width:560px}.not-found ul{margin:0;padding:0;list-style:none}.not-found li a{display:grid;grid-template-columns:100px 1fr auto;gap:16px;padding:10px 0;border-top:1px solid var(--a-rule);align-items:baseline;text-decoration:none;color:inherit}.not-found .ndate{font-family:var(--a-mono);font-size:12px;color:var(--a-dim);font-variant-numeric:tabular-nums}.not-found .ntitle{font-family:var(--a-sans);font-size:16px;font-weight:500;color:var(--a-fg)}.not-found .nread{font-family:var(--a-mono);font-size:11px;color:var(--a-dimmer);text-align:right}@media(max-width:760px){.site-header{padding:20px;flex-wrap:wrap;gap:12px}.site-footer{flex-direction:column;gap:12px;align-items:flex-start;padding:24px 20px;margin-top:56px}main{padding:32px 20px 0}.lead-h1{font-size:26px}.article-h1{font-size:28px}.post-body{font-size:17px;line-height:1.65}.two-col{grid-template-columns:1fr;gap:36px}.post-row{grid-template-columns:1fr;gap:4px}.post-row .min{display:none}.post-row .date{font-size:11px}}