*,*::before,*::after{box-sizing:border-box}body{margin:0;padding:0}@font-face{font-family:commit mono;src:url(/fonts/CommitMono-Regular.woff2)format('woff2');font-weight:400;font-style:normal;font-display:swap}.dark{--bg:#111114;--bg-secondary:#18181c;--fg:#c8c8cc;--fg-heading:#e8a040;--fg-muted:#808088;--fg-faint:#4a4a52;--border:#2a2a30;--code-bg:#1a1a1e;--code-border:#333338;--link:#50ccaa;--link-hover:#70eeca;--accent:#dd55cc;--accent-dim:#884477;--toc-active:#e8a040;--tag-color:#dd55cc;--date-color:#7799aa}.light{--bg:#fdf6e3;--bg-secondary:#eee8d5;--fg:#4a4440;--fg-heading:#b87020;--fg-muted:#756860;--fg-faint:#a09888;--border:#d3cbb7;--code-bg:#f5edd8;--code-border:#ccc3a7;--link:#2a8a6a;--link-hover:#1a6a4a;--accent:#993388;--accent-dim:#bb77aa;--toc-active:#b87020;--tag-color:#993388;--date-color:#5a7a8a}body{font-family:barlow,-apple-system,segoe ui,sans-serif;font-size:1.125rem;line-height:1.8;color:var(--fg);background:var(--bg)}h1,h2,h3,h4,h5,h6{font-family:commit mono,ui-monospace,monospace;color:var(--fg-heading);letter-spacing:-.02em;margin-top:2em;margin-bottom:.6em;line-height:1.3}h1{font-size:1.8em}h2{font-size:1.35em;border-bottom:1px solid var(--border);padding-bottom:.3em}h3{font-size:1.1em}a{color:var(--link);text-decoration:none}a:hover{color:var(--link-hover);text-decoration:underline}hr{border:none;border-top:1px solid var(--border);margin:2em 0}strong{color:var(--fg-heading)}p{margin:0 0 1.2em}.container{margin:0 auto;padding:0 10%}.site-header{padding:.6rem 0;border-bottom:1px solid var(--fg-faint);margin-bottom:2rem;position:sticky;top:0;z-index:100;background:var(--bg)}.site-header-top{display:flex;align-items:baseline;justify-content:space-between}.site-title{font-family:commit mono,ui-monospace,monospace;font-size:1.4em;color:var(--fg-heading);text-decoration:none;font-weight:700;margin-left:.5rem}.site-title:hover{text-decoration:none;color:var(--link)}.site-logo{vertical-align:-.15em;margin-right:.3em;transition:transform .3s ease}.site-logo .logo-a,.site-logo .logo-b{transition:stroke .3s ease,fill .3s ease}.site-title:hover .site-logo{transform:rotate(45deg)}.site-title:hover .logo-a{stroke:var(--link)}.site-title:hover .logo-b{stroke:var(--accent)}.site-title:hover circle.logo-b{fill:var(--accent)}.site-nav{display:flex;align-items:center;gap:1.2rem;font-family:commit mono,ui-monospace,monospace;font-size:.85em}.site-nav a{color:var(--fg-muted)}.site-nav a:hover{color:var(--fg-heading);text-decoration:none}.site-motto{font-size:.85em;color:var(--fg-muted);margin:0;line-height:1.5}.theme-toggle{background:0 0;border:none;color:var(--fg-muted);cursor:pointer;padding:.2em;line-height:0;display:inline-flex;align-items:center}.theme-toggle:hover{color:var(--fg-heading)}.theme-toggle svg{display:none}.dark .theme-toggle .icon-sun{display:block}.light .theme-toggle .icon-moon{display:block}.post-list{list-style:none;padding:0;margin:0}.post-list li{display:flex;align-items:baseline;gap:1em;padding:.5em 0}.post-info{flex:1;min-width:0}.post-meta-line{display:flex;align-items:baseline;gap:.6em;margin-top:.15em}.post-date{font-family:commit mono,ui-monospace,monospace;color:var(--date-color);white-space:nowrap;font-size:.8em}.post-link{font-size:1.05em;color:var(--fg);font-weight:500;-webkit-text-stroke:.4px color-mix(in srgb,var(--link) 50%,transparent)}.post-link:hover{color:var(--fg-heading);-webkit-text-stroke:.4px var(--fg-heading)}.post-tags{font-family:commit mono,ui-monospace,monospace;font-size:.75em;color:var(--tag-color)}.post-tags a{color:var(--tag-color)}.post-tags a:hover{color:var(--link)}.series-badge{font-family:commit mono,ui-monospace,monospace;font-size:.6em;color:var(--fg-muted);border:1px solid var(--border);background:var(--bg-secondary);border-radius:3px;padding:.15em .45em;white-space:nowrap;text-decoration:none;letter-spacing:.02em}.series-badge:hover{color:var(--link);border-color:var(--link);text-decoration:none}.post-header{margin-bottom:2rem}.post-header h1{margin-top:0;font-size:2em;line-height:1.2}.post-meta{font-family:commit mono,ui-monospace,monospace;color:var(--fg-muted);font-size:.8em}.post-series-label{font-family:commit mono,ui-monospace,monospace;font-size:.8em;margin-top:.4em}.post-series-label a{color:var(--fg-muted);border-bottom:1px solid var(--border)}.post-series-label a:hover{color:var(--link)}.post-meta a{color:var(--tag-color)}.post-meta a:hover{color:var(--link)}.post-wrapper{display:flex;gap:2.5rem;max-width:80%;margin:0 auto}.post-content{flex:1;min-width:0;max-width:56rem}.post-content img{max-width:100%;height:auto;border-radius:4px}.toc{width:16rem;flex-shrink:0;position:sticky;top:3.5rem;align-self:flex-start;font-family:commit mono,ui-monospace,monospace;font-size:.72em;max-height:calc(100vh - 3rem);overflow-y:auto}.toc nav>ul{list-style:none;padding:0;margin:0;border-left:2px solid var(--border)}.toc li{padding:.3em 0 .3em 1em}.toc a{color:var(--fg-faint)}.toc a:hover{color:var(--fg-heading);text-decoration:none}.toc a.active{color:var(--toc-active);border-left:2px solid var(--toc-active);margin-left:-2px;padding-left:calc(1em)}.toc-mobile{display:none}.toc-mobile details{border:1px solid var(--border);border-radius:4px;padding:.4em .8em}.toc-mobile summary{font-family:commit mono,ui-monospace,monospace;font-size:.8em;color:var(--fg-faint);cursor:pointer;user-select:none}.toc-mobile summary:hover{color:var(--fg-heading)}.toc-mobile details[open] summary{margin-bottom:.5em}.toc-mobile .toc{width:auto;position:static;max-height:60vh;font-size:.85em}pre{font-family:commit mono,ui-monospace,monospace;background:var(--code-bg);border:1px solid var(--code-border);border-left:3px solid var(--accent-dim);padding:1.2em 1.4em;overflow-x:auto;font-size:1em;line-height:1.6;position:relative;border-radius:4px;margin:1.5em 0}.dark pre.chroma{background-color:var(--code-bg)}.light pre.chroma{background-color:var(--code-bg);border-color:#d5c4a1;border-left-color:var(--accent-dim);color:#3c3836}code{font-family:commit mono,ui-monospace,monospace;font-size:.88em}p code,li code{background:var(--bg-secondary);padding:.15em .4em;color:var(--accent);border-radius:3px;border:1px solid var(--border)}.post-content table{width:100%;border-collapse:collapse;margin:1.5em 0;font-size:.92em;line-height:1.5}.post-content th,.post-content td{padding:.55em .8em;text-align:left;border:1px solid var(--border)}.post-content thead th{background:var(--bg-secondary);color:var(--fg-heading);font-family:commit mono,ui-monospace,monospace;font-size:.9em;font-weight:600;letter-spacing:.01em;border-bottom:2px solid var(--fg-faint);white-space:nowrap}.post-content thead th.sortable{cursor:pointer;user-select:none}.post-content thead th.sortable:hover{color:var(--link)}.post-content thead th.sortable::after{content:' ⇅';font-size:.75em;color:var(--fg-faint)}.post-content thead th.sort-asc::after{content:' ↑';color:var(--fg-heading)}.post-content thead th.sort-desc::after{content:' ↓';color:var(--fg-heading)}.post-content tbody tr:nth-child(even){background:var(--bg-secondary)}.post-content tbody tr:hover{background:var(--code-bg)}.post-content td code{font-size:.88em}pre.mermaid{background:0 0;border:none;border-left:none;text-align:center;padding:1em 0}#back-to-top{display:none;position:fixed;bottom:2em;right:2em;background:var(--bg-secondary);color:var(--fg-muted);border:1px solid var(--border);border-radius:50%;width:2.5em;height:2.5em;font-size:1em;cursor:pointer;line-height:1;z-index:10}#back-to-top:hover,#back-to-top:focus-visible{color:var(--link);border-color:var(--link);outline:none}.copy-btn{position:absolute;top:.4em;right:.4em;background:0 0;border:none;color:var(--fg-faint);cursor:pointer;font-size:.85em;padding:.2em;line-height:1;border-radius:3px;opacity:0;transition:opacity .15s}pre:hover .copy-btn{opacity:1}.copy-btn:hover{color:var(--fg);background:var(--code-bg)}.post-nav{display:flex;justify-content:space-between;border-top:1px solid var(--border);padding-top:1.5em;margin-top:3em;font-size:.9em;color:var(--fg-muted);max-width:80%;margin-left:auto;margin-right:auto}.post-nav a{color:var(--link)}.post-nav a:hover{color:var(--link-hover)}.pagination{display:flex;justify-content:center;gap:1em;margin-top:2em;font-size:.9em;color:var(--fg-muted)}.pagination a{color:var(--link)}.site-footer{border-top:1px solid var(--border);padding:1.5rem 0;margin-top:4rem;font-family:commit mono,ui-monospace,monospace;font-size:.8em;color:var(--fg-faint);text-align:center}.site-footer a{color:var(--fg-muted)}.site-footer a:hover{color:var(--fg-heading)}@media(max-width:1000px){.toc-mobile{display:block;margin-bottom:1.5rem}aside.toc{display:none}.post-content{max-width:none}.post-wrapper{gap:0}}@media(max-width:768px){.post-list li{flex-wrap:wrap}.post-header h1{font-size:1.5em}.container{padding:0 1.2rem}}@media(max-width:600px){.site-header-top{flex-direction:column;align-items:flex-start;gap:.5rem}body{font-size:1rem}}.dark .bg{color:#ebdbb2;background-color:initial}.dark .chroma{color:#ebdbb2;background-color:initial;-webkit-text-size-adjust:none}.dark .chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.dark .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.dark .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.dark .chroma .hl{background-color:#3d3d3d}.dark .chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#756d59}.dark .chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#756d59}.dark .chroma .line{display:flex}.dark .chroma .k{color:#fe8019}.dark .chroma .kc{color:#fe8019}.dark .chroma .kd{color:#fe8019}.dark .chroma .kn{color:#fe8019}.dark .chroma .kp{color:#fe8019}.dark .chroma .kr{color:#fe8019}.dark .chroma .kt{color:#fabd2f}.dark .chroma .na{color:#b8bb26;font-weight:700}.dark .chroma .no{color:#d3869b}.dark .chroma .ni{color:#fabd2f}.dark .chroma .ne{color:#fb4934}.dark .chroma .nl{color:#fb4934}.dark .chroma .nt{color:#fb4934}.dark .chroma .nb{color:#fabd2f}.dark .chroma .bp{color:#fabd2f}.dark .chroma .nf{color:#fabd2f}.dark .chroma .fm{color:#fabd2f}.dark .chroma .s{color:#b8bb26}.dark .chroma .sa{color:#b8bb26}.dark .chroma .sb{color:#b8bb26}.dark .chroma .sc{color:#b8bb26}.dark .chroma .dl{color:#b8bb26}.dark .chroma .sd{color:#b8bb26}.dark .chroma .s2{color:#b8bb26}.dark .chroma .se{color:#b8bb26}.dark .chroma .sh{color:#b8bb26}.dark .chroma .si{color:#b8bb26}.dark .chroma .sx{color:#b8bb26}.dark .chroma .sr{color:#b8bb26}.dark .chroma .s1{color:#b8bb26}.dark .chroma .ss{color:#83a598}.dark .chroma .m{color:#d3869b}.dark .chroma .mb{color:#d3869b}.dark .chroma .mf{color:#d3869b}.dark .chroma .mh{color:#d3869b}.dark .chroma .mi{color:#d3869b}.dark .chroma .il{color:#d3869b}.dark .chroma .mo{color:#d3869b}.dark .chroma .o{color:#fe8019}.dark .chroma .ow{color:#fe8019}.dark .chroma .c{color:#928374;font-style:italic}.dark .chroma .ch{color:#928374;font-style:italic}.dark .chroma .cm{color:#928374;font-style:italic}.dark .chroma .c1{color:#928374;font-style:italic}.dark .chroma .cs{color:#928374;font-style:italic}.dark .chroma .cp{color:#8ec07c}.dark .chroma .cpf{color:#8ec07c;font-style:italic}.dark .chroma .gd{color:#282828;background-color:#fb4934}.dark .chroma .ge{color:#83a598;text-decoration:underline}.dark .chroma .gr{background-color:#fb4934;font-weight:700}.dark .chroma .gh{color:#b8bb26;font-weight:700}.dark .chroma .gi{color:#282828;background-color:#b8bb26}.dark .chroma .go{color:#504945}.dark .chroma .gu{color:#b8bb26;font-weight:700}.dark .chroma .gt{background-color:#fb4934;font-weight:700}.light .bg{color:#3c3836;background-color:initial}.light .chroma{color:#3c3836;background-color:initial;-webkit-text-size-adjust:none}.light .chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.light .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.light .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.light .chroma .hl{background-color:#e1d8b3}.light .chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#9d9b9a}.light .chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#9d9b9a}.light .chroma .line{display:flex}.light .chroma .k{color:#af3a03}.light .chroma .kc{color:#af3a03}.light .chroma .kd{color:#af3a03}.light .chroma .kn{color:#af3a03}.light .chroma .kp{color:#af3a03}.light .chroma .kr{color:#af3a03}.light .chroma .kt{color:#b57614}.light .chroma .na{color:#79740e;font-weight:700}.light .chroma .no{color:#d3869b}.light .chroma .ni{color:#b57614}.light .chroma .ne{color:#fb4934}.light .chroma .nl{color:#9d0006}.light .chroma .nt{color:#9d0006}.light .chroma .nb{color:#b57614}.light .chroma .bp{color:#b57614}.light .chroma .nf{color:#b57614}.light .chroma .fm{color:#b57614}.light .chroma .s{color:#79740e}.light .chroma .sa{color:#79740e}.light .chroma .sb{color:#79740e}.light .chroma .sc{color:#79740e}.light .chroma .dl{color:#79740e}.light .chroma .sd{color:#79740e}.light .chroma .s2{color:#79740e}.light .chroma .se{color:#79740e}.light .chroma .sh{color:#79740e}.light .chroma .si{color:#79740e}.light .chroma .sx{color:#79740e}.light .chroma .sr{color:#79740e}.light .chroma .s1{color:#79740e}.light .chroma .ss{color:#076678}.light .chroma .m{color:#8f3f71}.light .chroma .mb{color:#8f3f71}.light .chroma .mf{color:#8f3f71}.light .chroma .mh{color:#8f3f71}.light .chroma .mi{color:#8f3f71}.light .chroma .il{color:#8f3f71}.light .chroma .mo{color:#8f3f71}.light .chroma .o{color:#af3a03}.light .chroma .ow{color:#af3a03}.light .chroma .c{color:#928374;font-style:italic}.light .chroma .ch{color:#928374;font-style:italic}.light .chroma .cm{color:#928374;font-style:italic}.light .chroma .c1{color:#928374;font-style:italic}.light .chroma .cs{color:#928374;font-style:italic}.light .chroma .cp{color:#427b58}.light .chroma .cpf{color:#427b58;font-style:italic}.light .chroma .gd{color:#282828;background-color:#9d0006}.light .chroma .ge{color:#076678;text-decoration:underline}.light .chroma .gr{background-color:#9d0006;font-weight:700}.light .chroma .gh{color:#79740e;font-weight:700}.light .chroma .gi{color:#282828;background-color:#79740e}.light .chroma .go{color:#504945}.light .chroma .gu{color:#79740e;font-weight:700}.light .chroma .gt{background-color:#3c3836;font-weight:700}