@font-face{font-family:hanken grotesk;font-weight:400;font-display:swap;src:url(/fonts/hanken-grotesk-400.woff2)format("woff2")}@font-face{font-family:hanken grotesk;font-weight:400;font-style:italic;font-display:swap;src:url(/fonts/hanken-grotesk-400-italic.woff2)format("woff2")}@font-face{font-family:hanken grotesk;font-weight:500;font-display:swap;src:url(/fonts/hanken-grotesk-500.woff2)format("woff2")}@font-face{font-family:hanken grotesk;font-weight:600;font-display:swap;src:url(/fonts/hanken-grotesk-600.woff2)format("woff2")}@font-face{font-family:hanken grotesk;font-weight:700;font-display:swap;src:url(/fonts/hanken-grotesk-700.woff2)format("woff2")}@font-face{font-family:hanken grotesk;font-weight:800;font-display:swap;src:url(/fonts/hanken-grotesk-800.woff2)format("woff2")}@font-face{font-family:jetbrains mono;font-weight:400;font-display:swap;src:url(/fonts/jetbrains-mono-400.woff2)format("woff2")}@font-face{font-family:jetbrains mono;font-weight:600;font-display:swap;src:url(/fonts/jetbrains-mono-600.woff2)format("woff2")}:root{--paper:#ffffff;--ink:#000000;--graphite:#5d616b;--rule:#e3e4e9;--marker:var(--ink);--highlight:#fff0a0;--code-bg:#f5f6f9;--panel:#ffffff;--sans:"Hanken Grotesk", system-ui, sans-serif;--mono:"JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--measure:68ch;--wide:1180px;--gutter:clamp(16px, 4vw, 48px)}@media(prefers-color-scheme:dark){:root{--paper:#15161b;--ink:#eef0f4;--graphite:#9ea3ae;--rule:#2b2d35;--highlight:#4a4320;--code-bg:#1d1f26}}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-padding-top:24px}body{margin:0;background:var(--paper);color:var(--ink);font:18px/1.7 var(--sans);font-kerning:normal;text-rendering:optimizeLegibility}::selection{background:var(--highlight);color:var(--ink)}img{max-width:100%;height:auto}a{color:inherit;text-decoration-thickness:1px;text-underline-offset:.2em}:focus-visible{outline:2px solid var(--marker);outline-offset:3px;border-radius:2px}.skip{position:absolute;left:-9999px}.skip:focus{left:var(--gutter);top:8px;background:var(--paper);padding:6px 10px;z-index:10}.masthead{max-width:var(--wide);margin:0 auto;padding:28px var(--gutter)clamp(32px,5vw,56px);display:flex;align-items:center;justify-content:space-between;gap:24px}.wordmark{display:inline-flex;align-items:center;gap:12px;font-weight:800;font-size:22px;letter-spacing:-.02em;text-decoration:none}.wordmark .avatar{width:36px;height:36px;border-radius:50%;flex:none}.masthead-right{display:flex;align-items:center;gap:clamp(20px,3vw,36px)}.masthead .social{gap:14px;padding-left:clamp(20px,3vw,36px);border-left:1px solid var(--rule)}.masthead .social a{width:17px;height:17px}.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.nav{display:flex;gap:clamp(14px,3vw,28px);font-size:16px;font-weight:500}.nav a{text-decoration:none;padding-bottom:2px;border-bottom:2px solid transparent}.nav a[aria-current=page]{border-bottom-color:var(--marker)}.nav a:hover,.wordmark:hover{border-bottom-color:var(--ink)}main{max-width:var(--wide);margin:0 auto;padding:0 var(--gutter)}.section-h{font-size:15px;font-weight:600;color:var(--graphite);margin:0 0 24px;letter-spacing:0}.social{list-style:none;display:flex;flex-wrap:wrap;gap:18px;padding:0;margin:0}.social a{display:block;width:20px;height:20px;color:var(--graphite)}.social a:hover{color:var(--ink)}.social svg{width:100%;height:100%;fill:currentColor;display:block}.latest{padding-bottom:clamp(56px,8vw,104px)}.latest-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:clamp(28px,4vw,56px)}.feature a{display:block;text-decoration:none}.feature-img{background:var(--panel);border:1px solid var(--rule);border-radius:10px;transition:transform .2s ease-out,box-shadow .2s ease-out,border-color .2s;padding:20px;margin-bottom:18px;aspect-ratio:16/9;display:grid;place-items:center;overflow:hidden}.feature-img img{max-height:100%;width:auto;object-fit:contain}.feature time{font-size:15px;color:var(--graphite)}.feature h3{font-size:clamp(26px,3vw,34px);font-weight:700;line-height:1.1;letter-spacing:-.02em;margin:6px 0 12px}.feature p{margin:0;color:var(--graphite);font-size:17px;max-width:52ch}.mark{box-decoration-break:clone;-webkit-box-decoration-break:clone;padding:0 .08em;margin:0 -.08em;transition:background-color .2s}.feature a:is(:hover,:focus-visible) .feature-img{border-color:var(--ink);transform:translate(-4px,-4px);box-shadow:6px 6px 0 var(--ink)}.feature a:is(:hover,:focus-visible) .mark,.series-link:is(:hover,:focus-visible) .mark{background-color:var(--highlight)}.series-link{display:block;text-decoration:none;color:inherit}.series-link:focus-visible{outline:none}.feature a:focus-visible{outline:none}@media(prefers-reduced-motion:reduce){.feature a:is(:hover,:focus-visible) .feature-img{transform:none}}.routes{padding-bottom:clamp(56px,8vw,104px)}.routes-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:clamp(32px,5vw,72px)}.series h3{font-size:clamp(24px,2.6vw,30px);font-weight:700;letter-spacing:-.02em;line-height:1.15;margin:0}.series-meta{margin:4px 0 12px;color:var(--graphite);font-size:15px}.series-desc{margin:0 0 16px;font-size:17px;line-height:1.6;max-width:56ch}.series-parts{border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);margin-bottom:4px}.series-parts summary{cursor:pointer;list-style:none;padding:12px 0;font-size:16px;font-weight:600;display:flex;align-items:center;gap:10px}.series-parts summary::-webkit-details-marker{display:none}.series-parts summary::before{content:"";width:8px;height:8px;flex:none;border-right:2px solid var(--marker);border-bottom:2px solid var(--marker);transform:rotate(-45deg);transition:transform .2s}.series-parts[open] summary::before{transform:rotate(45deg)}.series-parts summary:hover{text-decoration:underline;text-underline-offset:.2em}.series-parts .route{padding-bottom:14px}.page-desc{color:var(--ink)!important;margin-top:14px!important;max-width:60ch;line-height:1.6}.series-start{display:inline-block;margin-top:14px;font-weight:600;color:var(--marker);text-decoration:none;border-bottom:2px solid}.series-start{transition:background-color .15s;padding:0 2px;margin-left:-2px}.series-start:is(:hover,:focus-visible){background:var(--highlight)}.route{list-style:none;margin:0;padding:0;position:relative}.route::before{content:"";position:absolute;left:13px;top:14px;bottom:14px;width:3px;border-radius:3px;background:var(--marker);transform-origin:top}.stop a{position:relative;display:grid;grid-template-columns:30px 1fr;gap:14px;align-items:start;padding:4px 10px 4px 0;text-decoration:none;line-height:1.35;border-radius:0 6px 6px 0;transition:background-color .15s}.stop a:is(:hover,:focus-visible){background:linear-gradient(to right,transparent 14px,var(--highlight) 14px)}.stop a:is(:hover,:focus-visible) .stop-n{background:var(--ink);color:var(--paper)}.stop-n{transition:background-color .15s,color .15s}.stop-n{position:relative;z-index:1;width:29px;height:29px;border-radius:50%;display:grid;place-items:center;background:var(--paper);border:3px solid var(--marker);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--marker)}.stop-title{padding-top:4px;font-size:16px}.stop a:is(:hover,:focus-visible) .stop-title{text-decoration:underline;text-underline-offset:.2em}.stop.is-current .stop-n{background:var(--marker);color:var(--paper)}.stop.is-current .stop-title{font-weight:700}@media(prefers-reduced-motion:no-preference){.series-parts[open] .route::before{animation:draw .9s cubic-bezier(.6,0,.2,1)both}.series-parts[open] .stop-n{animation:pop .3s ease-out both;animation-delay:calc(var(--i,0) * 60ms)}.stop:nth-child(1){--i:0}.stop:nth-child(2){--i:1}.stop:nth-child(3){--i:2}.stop:nth-child(4){--i:3}.stop:nth-child(5){--i:4}.stop:nth-child(6){--i:5}.stop:nth-child(7){--i:6}.stop:nth-child(8){--i:7}.stop:nth-child(9){--i:8}.stop:nth-child(10){--i:9}.stop:nth-child(11){--i:10}.stop:nth-child(12){--i:11}}@keyframes draw{from{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes pop{from{transform:scale(.4);opacity:0}to{transform:scale(1);opacity:1}}.writing{padding-bottom:40px}.year{display:grid;grid-template-columns:120px 1fr;gap:24px;border-top:1px solid var(--rule);padding:18px 0 26px}.year-label{margin:6px 0 0;font-size:28px;font-weight:800;letter-spacing:-.03em;font-variant-numeric:tabular-nums}.rows{list-style:none;margin:0;padding:0}.row a{display:grid;grid-template-columns:64px 1fr auto;gap:18px;align-items:baseline;padding:10px 12px;margin:0 -12px;border-radius:6px;text-decoration:none;transition:background-color .15s}.row a:is(:hover,:focus-visible){background:var(--highlight)}.row time{font-size:15px;color:var(--graphite);font-variant-numeric:tabular-nums}.row-title{font-size:19px;font-weight:500;line-height:1.35}.row-topic{font-size:14px;color:var(--graphite)}.row a:is(:hover,:focus-visible) .row-title{text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:.2em}.page-head+.rows .row a{grid-template-columns:1fr auto;border-top:1px solid var(--rule)}.page-head{padding:clamp(24px,5vw,64px)0 clamp(28px,4vw,48px);max-width:820px}.page-head h1{font-size:clamp(40px,6vw,72px);font-weight:800;letter-spacing:-.04em;line-height:1;margin:0 0 14px}.page-head p{color:var(--graphite);font-size:19px;margin:0}.series-page{max-width:640px;padding-bottom:60px}.series-page .stop-title{font-size:19px}.post{padding-bottom:40px}.post-head{max-width:900px;padding:clamp(20px,5vw,56px)0 clamp(24px,3vw,36px)}.post-head.is-bare{padding:0}.post-series{margin:0 0 14px;font-size:16px;font-weight:600;color:var(--marker)}.post-series a{text-decoration:none;border-bottom:2px solid}.post-head h1{font-size:clamp(36px,5.6vw,68px);font-weight:800;line-height:1.02;letter-spacing:-.035em;margin:0 0 18px;text-wrap:balance}.post-meta{display:flex;flex-wrap:wrap;gap:6px 20px;margin:0;font-size:15px;color:var(--graphite)}.post-meta a{color:var(--marker);text-decoration:none}.post-cover{margin:0 0 clamp(28px,4vw,48px);background:var(--panel);border:1px solid var(--rule);border-radius:12px;padding:clamp(16px,3vw,40px);text-align:center}.post-cover img{max-height:420px;width:auto}.post-body{display:block}.post-body.has-rail{display:grid;grid-template-columns:minmax(0,var(--measure))minmax(220px,300px);justify-content:space-between;gap:56px}.rail{position:sticky;top:24px;align-self:start;max-height:calc(100vh - 48px);overflow:auto;padding:4px 0 12px}.rail-h{font-size:15px;font-weight:600;color:var(--graphite);margin:0 0 14px}.rail .stop-title{font-size:14px}.rail .stop a{gap:12px}.rail-mobile{display:none}#TableOfContents ul{list-style:none;margin:0;padding:0}#TableOfContents ul ul{padding-left:14px}#TableOfContents li:not(:has(>a))>ul{padding-left:0}#TableOfContents a{display:block;padding:4px 0 4px 14px;border-left:2px solid var(--rule);font-size:14px;line-height:1.4;text-decoration:none;color:var(--graphite)}#TableOfContents a:hover{color:var(--ink);border-left-color:var(--ink)}.prose{max-width:var(--measure);min-width:0}.prose::after{content:"";display:table;clear:both}.prose>:first-child{margin-top:0}.prose p,.prose ul,.prose ol{margin:0 0 1.15em}.prose li{margin:.25em 0}.prose h2,.prose h3,.prose h4,.prose h5{letter-spacing:-.02em;line-height:1.2;margin:1.9em 0 .55em;scroll-margin-top:24px}.prose h2{font-size:34px;font-weight:800;letter-spacing:-.03em}.prose h3{font-size:27px;font-weight:700}.prose h4{font-size:21px;font-weight:700}.prose h5{font-size:18px;font-weight:700}.prose a{color:var(--ink);text-decoration-thickness:1px;text-underline-offset:.18em}.prose a:hover{background:var(--highlight);text-decoration-thickness:2px}.prose strong{font-weight:700}.prose blockquote{margin:1.6em 0;padding:2px 0 2px 22px;border-left:3px solid var(--marker);font-size:20px;color:var(--graphite)}.prose hr{border:0;height:1px;background:var(--rule);margin:2.4em 0}.prose table{border-collapse:collapse;display:block;overflow-x:auto;font-size:16px;margin:0 0 1.4em}.prose th,.prose td{border-bottom:1px solid var(--rule);padding:8px 14px 8px 0;text-align:left}.wp-img{margin:2.2em 0}.wp-img a{display:block;background:var(--panel);border-radius:10px}.wp-img img{display:block;margin:0 auto;border-radius:10px}.wp-img figcaption{margin-top:10px;font-size:15px;line-height:1.45;color:var(--graphite);text-align:center}.wp-img figcaption p{margin:0}.wp-img.alignright,.wp-img.alignleft{width:fit-content;max-width:46%;margin-top:.3em}.wp-img.alignright{float:right;margin-left:32px}.wp-img.alignleft{float:left;margin-right:32px}code,pre{font-family:var(--mono);font-feature-settings:"calt" 0}:not(pre)>code{background:var(--code-bg);border-radius:5px;padding:.12em .38em;font-size:.84em;overflow-wrap:anywhere}.prose pre,.prose .highlight pre{background:var(--code-bg)!important;border-radius:10px;padding:18px 20px;margin:0;overflow-x:auto;font-size:14px;line-height:1.6;tab-size:2}.prose .highlight,.prose>pre{margin:1.5em 0;clear:both}.has-copy{position:relative}.copy{position:absolute;top:8px;right:8px;font:500 13px var(--sans);color:var(--graphite);background:var(--paper);border:1px solid var(--rule);border-radius:6px;padding:3px 10px;cursor:pointer;opacity:0}.has-copy:hover .copy,.copy:focus-visible{opacity:1}.copy:hover{color:var(--ink);border-color:var(--graphite)}.post-tags{display:flex;flex-wrap:wrap;gap:8px;margin:40px 0 0;max-width:var(--measure)}.post-tags a{font-size:14px;text-decoration:none;color:var(--graphite);border:1px solid var(--rule);border-radius:999px;padding:2px 12px}.post-tags a:hover{color:var(--ink);border-color:var(--graphite)}.pager{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:64px;padding-top:28px;border-top:1px solid var(--rule)}.pager a{display:block;text-decoration:none;font-size:20px;font-weight:700;line-height:1.25;letter-spacing:-.01em}.pager a span{display:block;font-size:15px;font-weight:500;color:var(--graphite);margin-bottom:6px}.pager-next{grid-column:2;text-align:right}.footer{max-width:var(--wide);margin:80px auto 0;padding:40px var(--gutter)56px;border-top:1px solid var(--rule);display:grid;gap:16px}.footer-small{margin:0;font-size:14px;color:var(--graphite)}@media(prefers-color-scheme:dark){.wp-img a,.feature-img,.post-cover{background:#fff}.wp-img a{padding:10px}}@media(max-width:980px){.post-body.has-rail{display:block}.rail{display:none}.rail-mobile{display:block;border:1px solid var(--rule);border-radius:10px;padding:12px 16px;margin-bottom:32px}.rail-mobile summary{cursor:pointer;font-weight:600;font-size:16px}.rail-mobile[open] summary{margin-bottom:14px}}@media(max-width:640px){body{font-size:17px}.masthead{padding-top:20px;padding-bottom:28px;flex-wrap:wrap;row-gap:14px}.masthead .social{display:none}.wordmark{font-size:20px}.year{grid-template-columns:1fr;gap:4px}.row a{grid-template-columns:1fr;gap:2px}.row time{order:2;font-size:14px}.row-topic{display:none}.wp-img.alignright,.wp-img.alignleft{float:none;max-width:100%;margin:1.8em auto}.prose h2{font-size:28px}.prose h3{font-size:23px}.pager{grid-template-columns:1fr}.pager-next{grid-column:1;text-align:left}}.bg{background-color:#f7f7f7}.chroma{background-color:#f7f7f7}.chroma .err{color:#f6f8fa;background-color:#82071e}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#dedede}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .line{display:flex}.chroma .k{color:#cf222e}.chroma .kc{color:#cf222e}.chroma .kd{color:#cf222e}.chroma .kn{color:#cf222e}.chroma .kp{color:#cf222e}.chroma .kr{color:#cf222e}.chroma .kt{color:#cf222e}.chroma .na{color:#1f2328}.chroma .nc{color:#1f2328}.chroma .no{color:#0550ae}.chroma .nd{color:#0550ae}.chroma .ni{color:#6639ba}.chroma .nl{color:#900;font-weight:700}.chroma .nn{color:#24292e}.chroma .nx{color:#1f2328}.chroma .nt{color:#0550ae}.chroma .nb{color:#6639ba}.chroma .bp{color:#6a737d}.chroma .nv{color:#953800}.chroma .vc{color:#953800}.chroma .vg{color:#953800}.chroma .vi{color:#953800}.chroma .vm{color:#953800}.chroma .nf{color:#6639ba}.chroma .fm{color:#6639ba}.chroma .s{color:#0a3069}.chroma .sa{color:#0a3069}.chroma .sb{color:#0a3069}.chroma .sc{color:#0a3069}.chroma .dl{color:#0a3069}.chroma .sd{color:#0a3069}.chroma .s2{color:#0a3069}.chroma .se{color:#0a3069}.chroma .sh{color:#0a3069}.chroma .si{color:#0a3069}.chroma .sx{color:#0a3069}.chroma .sr{color:#0a3069}.chroma .s1{color:#0a3069}.chroma .ss{color:#032f62}.chroma .m{color:#0550ae}.chroma .mb{color:#0550ae}.chroma .mf{color:#0550ae}.chroma .mh{color:#0550ae}.chroma .mi{color:#0550ae}.chroma .il{color:#0550ae}.chroma .mo{color:#0550ae}.chroma .o{color:#0550ae}.chroma .ow{color:#0550ae}.chroma .p{color:#1f2328}.chroma .c{color:#57606a}.chroma .ch{color:#57606a}.chroma .cm{color:#57606a}.chroma .c1{color:#57606a}.chroma .cs{color:#57606a}.chroma .cp{color:#57606a}.chroma .cpf{color:#57606a}.chroma .gd{color:#82071e;background-color:#ffebe9}.chroma .ge{color:#1f2328}.chroma .gi{color:#116329;background-color:#dafbe1}.chroma .go{color:#1f2328}.chroma .gl{text-decoration:underline}.chroma .w{color:#fff}@media(prefers-color-scheme:dark){.bg{color:#e6edf3;background-color:#0d1117}.chroma{color:#e6edf3;background-color:#0d1117}.chroma .err{color:#f85149}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#6e7681}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#737679}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#6e7681}.chroma .line{display:flex}.chroma .k{color:#ff7b72}.chroma .kc{color:#79c0ff}.chroma .kd{color:#ff7b72}.chroma .kn{color:#ff7b72}.chroma .kp{color:#79c0ff}.chroma .kr{color:#ff7b72}.chroma .kt{color:#ff7b72}.chroma .nc{color:#f0883e;font-weight:700}.chroma .no{color:#79c0ff;font-weight:700}.chroma .nd{color:#d2a8ff;font-weight:700}.chroma .ni{color:#ffa657}.chroma .ne{color:#f0883e;font-weight:700}.chroma .nl{color:#79c0ff;font-weight:700}.chroma .nn{color:#ff7b72}.chroma .py{color:#79c0ff}.chroma .nt{color:#7ee787}.chroma .nv{color:#79c0ff}.chroma .vc{color:#79c0ff}.chroma .vg{color:#79c0ff}.chroma .vi{color:#79c0ff}.chroma .vm{color:#79c0ff}.chroma .nf{color:#d2a8ff;font-weight:700}.chroma .fm{color:#d2a8ff;font-weight:700}.chroma .l{color:#a5d6ff}.chroma .ld{color:#79c0ff}.chroma .s{color:#a5d6ff}.chroma .sa{color:#79c0ff}.chroma .sb{color:#a5d6ff}.chroma .sc{color:#a5d6ff}.chroma .dl{color:#79c0ff}.chroma .sd{color:#a5d6ff}.chroma .s2{color:#a5d6ff}.chroma .se{color:#79c0ff}.chroma .sh{color:#79c0ff}.chroma .si{color:#a5d6ff}.chroma .sx{color:#a5d6ff}.chroma .sr{color:#79c0ff}.chroma .s1{color:#a5d6ff}.chroma .ss{color:#a5d6ff}.chroma .m{color:#a5d6ff}.chroma .mb{color:#a5d6ff}.chroma .mf{color:#a5d6ff}.chroma .mh{color:#a5d6ff}.chroma .mi{color:#a5d6ff}.chroma .il{color:#a5d6ff}.chroma .mo{color:#a5d6ff}.chroma .o{color:#ff7b72;font-weight:700}.chroma .ow{color:#ff7b72;font-weight:700}.chroma .c{color:#8b949e;font-style:italic}.chroma .ch{color:#8b949e;font-style:italic}.chroma .cm{color:#8b949e;font-style:italic}.chroma .c1{color:#8b949e;font-style:italic}.chroma .cs{color:#8b949e;font-weight:700;font-style:italic}.chroma .cp{color:#8b949e;font-weight:700;font-style:italic}.chroma .cpf{color:#8b949e;font-weight:700;font-style:italic}.chroma .gd{color:#ffa198;background-color:#490202}.chroma .ge{font-style:italic}.chroma .gr{color:#ffa198}.chroma .gh{color:#79c0ff;font-weight:700}.chroma .gi{color:#56d364;background-color:#0f5323}.chroma .go{color:#8b949e}.chroma .gp{color:#8b949e}.chroma .gs{font-weight:700}.chroma .gu{color:#79c0ff}.chroma .gt{color:#ff7b72}.chroma .gl{text-decoration:underline}.chroma .w{color:#6e7681}}