.page--post .meta-link:hover,.page--writing .meta-link:hover,.blog-colophon .meta-link:hover{color:var(--accent)}.tag{color:var(--gray-500);transition:color var(--transition-fast);background:0 0;border:none;align-items:center;padding:0;font-size:13px;text-decoration:none;display:inline-flex}.tag:before{content:"#";opacity:.6;transition:opacity var(--transition-fast);margin-right:.1em}.tag:hover,.tag.active{color:var(--accent)}.tag:hover:before,.tag.active:before{opacity:1}.page--writing{max-width:var(--measure);padding:var(--s6)var(--gutter)var(--s7);margin:0 auto}.writing-mast{margin-bottom:var(--s-section)}.writing-title{font-family:var(--font-display);font-size:var(--t-name);letter-spacing:-.04em;color:var(--gray-050);margin:var(--s5)0 var(--s4);font-weight:500;line-height:.82}.writing-deck{color:var(--text-3);margin:0}.writing-count{font-family:var(--font-mono);font-size:var(--t-11);color:var(--text-3);font-variant-numeric:tabular-nums;margin:0}.writing-index{border-top:var(--border-surface);margin:0;padding:0;list-style:none}.writing-entry{border-bottom:var(--border-surface)}.writing-link{gap:var(--s1)var(--gutter);padding:var(--s4)0;color:inherit;grid-template-columns:1fr;align-items:baseline;text-decoration:none;display:grid}.writing-date,.writing-time{color:var(--text-3);font-variant-numeric:tabular-nums;white-space:nowrap;transition:color var(--transition-base)}.writing-entry:hover .writing-date{color:var(--accent)}.writing-name{font-family:var(--font-display);font-size:var(--t-25);letter-spacing:-.02em;color:var(--gray-050);text-wrap:balance;font-weight:500;line-height:1.1;display:block}.writing-excerpt{margin-top:var(--s1);font-size:var(--t-13);color:var(--text-3);max-width:58ch;line-height:1.45;display:block}.writing-empty{border-top:var(--border-surface);padding-top:var(--s4)}.writing-empty-line{font-family:var(--font-display);font-size:var(--t-lead);letter-spacing:-.03em;color:var(--gray-050);margin:var(--s2)0 0;text-wrap:balance;max-width:20ch;font-weight:500;line-height:1.05}.writing-empty-line a{color:inherit;text-decoration-color:var(--rule-mid);text-underline-offset:6px}.writing-empty-line a:hover{text-decoration-color:var(--accent)}.blog-colophon{max-width:var(--measure);margin:var(--s-section)auto 0;padding:var(--s3)var(--gutter)var(--s6);justify-content:space-between;align-items:baseline;gap:var(--s3);border-top:var(--border-surface);color:var(--text-3);flex-wrap:wrap;display:flex}.blog-colophon p{margin:0}@media (width>=900px){.writing-link{grid-template-columns:120px minmax(0,1fr) 80px}.writing-time{text-align:right}}.page--post{max-width:var(--measure);padding:var(--s6)var(--gutter)var(--s7);margin:0 auto}.post-mast{margin-bottom:var(--s-section)}.post-dateline{white-space:nowrap;font-family:var(--font-mono);font-size:var(--t-11);letter-spacing:.08em;color:var(--text-3);font-variant-numeric:tabular-nums;margin:0}.post-dateline-sep{color:var(--text-4);margin:0 .5em}.post-title{font-family:var(--font-display);font-size:var(--t-title);letter-spacing:-.03em;color:var(--gray-050);margin:var(--s5)0 var(--s4);text-wrap:balance;max-width:18ch;font-weight:500;line-height:.96}.post-deck{font-family:var(--font-display);font-style:italic;font-size:var(--t-20);color:var(--text-2);max-width:46ch;margin:0;line-height:1.3}.post-field{display:block}.post-rail{margin-bottom:var(--s6)}.rail-label{color:var(--text-3);margin:0 0 var(--s2)}.post-scene{display:flow-root;position:relative}.post-scene>h2{top:env(safe-area-inset-top,0);z-index:3;align-items:center;gap:var(--s2);min-height:var(--rail-h);margin:0 0 var(--s3);padding:0 var(--s3);background:var(--glass-rail);border-bottom:var(--rule-weight)solid var(--glass-edge);font-family:var(--font-display);font-size:var(--t-scene);letter-spacing:-.015em;color:var(--gray-050);scroll-margin-top:calc(var(--rail-h) + env(safe-area-inset-top,0px));font-weight:500;display:flex;position:sticky}.post-scene>h2:before{content:var(--scene-n);font-family:var(--font-mono);font-size:var(--t-11);letter-spacing:.08em;color:var(--accent);font-variant-numeric:tabular-nums;flex-shrink:0;font-weight:700}@supports (backdrop-filter:blur(1px)){.post-scene>h2{backdrop-filter:blur(var(--glass-blur))saturate(var(--glass-sat))}}@media (prefers-reduced-transparency:reduce){.post-scene>h2{backdrop-filter:none;background:var(--surface-1)}}.post-nav{gap:var(--s4);margin-top:var(--s-section);padding-top:var(--s3);border-top:var(--border-surface-stronger);display:grid}.post-nav-item{color:inherit;text-decoration:none;display:block}.post-nav-item--next{text-align:right}.post-nav-title{font-family:var(--font-display);font-size:var(--t-20);color:var(--gray-050);margin-top:var(--s1);transition:color var(--transition-base);font-weight:500;line-height:1.15;display:block}.post-nav-item:hover .post-nav-title{color:var(--accent)}@media (width>=900px){.post-field{grid-template-columns:repeat(var(--grid-cols),minmax(0,1fr));column-gap:var(--gutter);align-items:start;display:grid}.post-rail{top:var(--s3);grid-column:1/4;margin-bottom:0;position:sticky}.post-field>.blog-post-content{grid-column:4/12}.post-nav{grid-template-columns:1fr 1fr}}.blog-post-content{font-size:var(--t-16);color:var(--gray-400);line-height:1.8}.blog-post-content h3{font-size:var(--t-20);color:var(--gray-050);margin-top:32px;margin-bottom:var(--s1);scroll-margin-top:calc(var(--rail-h) + var(--s2) + env(safe-area-inset-top,0px));font-weight:500}.blog-post-content h4{font-size:var(--t-16);color:var(--gray-200);margin-top:24px;margin-bottom:8px;font-weight:500}.blog-post-content p{margin-bottom:var(--s3);text-wrap:pretty}.blog-post-content a{color:var(--gray-200);text-decoration:underline;text-decoration-color:var(--accent-alpha-30);text-underline-offset:3px;transition:color var(--transition-fast),text-decoration-color var(--transition-fast)}.blog-post-content a:hover{color:var(--accent);text-decoration-color:var(--accent)}.blog-post-content ul,.blog-post-content ol{margin-bottom:var(--s3);padding-left:24px}.blog-post-content li{margin-bottom:8px}.blog-post-content ul{padding-left:var(--s3);list-style:square}.blog-post-content ol{padding-left:var(--s4);list-style:decimal-leading-zero}.blog-post-content ul>li::marker{color:var(--text-4)}.blog-post-content ol>li::marker{font-family:var(--font-mono);color:var(--text-3);font-size:.72em}.blog-post-content blockquote{margin:var(--s5)0;padding-left:var(--s3);border-left:var(--border-surface-strong);font-family:var(--font-display);font-style:italic;font-size:var(--t-20);color:var(--text-2);max-width:54ch;line-height:1.5}.blog-post-content blockquote p{margin:0}.blog-post-content blockquote p+p{margin-top:var(--s2)}.blog-post-content blockquote cite,.blog-post-content blockquote footer{margin-top:var(--s2);color:var(--text-3);font-style:normal;display:block}.blog-post-content blockquote p:last-child{margin-bottom:0}.blog-post-content img{max-width:100%;height:auto;margin:var(--s5)0;border:0;border-radius:0}.blog-post-content hr{background:var(--rule-mid);width:100%;height:1px;margin:var(--s5)0;border:none}.blog-post-content :not(pre)>code{font-family:var(--font-mono);color:var(--gray-050);border-bottom:1px solid var(--rule-mid);background:0 0;padding:0 .15em;font-size:.88em}.blog-post-content pre{border:var(--border-surface-strong);margin:var(--s6)0;scrollbar-width:thin;scrollbar-color:var(--gray-700)transparent;background:0 0;border-radius:0;padding:0;overflow-x:auto}.blog-post-content p+pre{margin-top:var(--s4)}.blog-post-content pre code{box-sizing:border-box;width:fit-content;min-width:100%;padding:var(--s3)var(--s4);font-size:var(--t-13);color:var(--gray-200);background:0 0;border:0;line-height:1.6;display:block}:root{--code-comment:oklch(52% .008 70);--code-punct:oklch(52% .008 70);--code-operator:oklch(48% .008 70);--code-keyword:oklch(48% .17 27);--code-string:oklch(48% .055 130);--code-number:oklch(48% .055 130);--code-function:oklch(26% .006 65);--code-variable:oklch(34% .006 65)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--code-comment:oklch(58% .008 70);--code-punct:oklch(57% .008 70);--code-operator:oklch(63% .008 70);--code-keyword:oklch(66% .16 27);--code-string:oklch(72% .06 130);--code-number:oklch(72% .06 130);--code-function:oklch(94% .006 75);--code-variable:oklch(84% .006 75)}}:root[data-theme=dark]{--code-comment:oklch(58% .008 70);--code-punct:oklch(57% .008 70);--code-operator:oklch(63% .008 70);--code-keyword:oklch(66% .16 27);--code-string:oklch(72% .06 130);--code-number:oklch(72% .06 130);--code-function:oklch(94% .006 75);--code-variable:oklch(84% .006 75)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:var(--code-comment);font-style:italic}.token.punctuation{color:var(--code-punct)}.token.namespace{opacity:.7}.token.operator,.token.entity,.token.url{color:var(--code-operator)}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:var(--code-number)}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:var(--code-string)}.token.atrule,.token.attr-value,.token.keyword{color:var(--code-keyword)}.token.function,.token.class-name{color:var(--code-function)}.token.regex,.token.important,.token.variable{color:var(--code-variable)}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.highlight-line{width:calc(100% + 40px);padding-left:var(--s2);padding-right:var(--s2);background:color-mix(in srgb,var(--accent)10%,transparent);border-left:3px solid var(--accent);margin-left:-20px;display:inline-block}.token.deleted{background:color-mix(in srgb,var(--code-variable)15%,transparent)}.token.inserted{background:color-mix(in srgb,var(--code-string)15%,transparent)}.blog-post-content pre::-webkit-scrollbar{background:0 0;height:8px}.blog-post-content pre::-webkit-scrollbar-track{background:var(--gray-900);border-radius:0}.blog-post-content pre::-webkit-scrollbar-thumb{background:var(--gray-700);border-radius:0}.blog-post-content pre::-webkit-scrollbar-thumb:hover{background:var(--gray-600)}.blog-post-content table{border-collapse:collapse;width:100%;margin:24px 0}.blog-post-content th,.blog-post-content td{padding:var(--s1)var(--s2);text-align:left;border-bottom:1px solid var(--rule-mid)}.blog-post-content th{color:var(--gray-200);font-weight:500}@media (width<=768px){.blog-post-content pre code{padding:var(--s2)var(--s2);font-size:13px}}.toc{border:none;margin:0;padding:0}.toc details{margin:0}.toc summary{color:var(--gray-500);cursor:pointer;user-select:none;width:fit-content;transition:color var(--transition-fast);list-style:none}.toc summary:hover{color:var(--gray-050)}.toc summary::-webkit-details-marker{display:none}.toc ul,.toc ol{margin:var(--s2)0 0;counter-reset:toc;padding:0;list-style:none}.toc li{counter-increment:toc;align-items:baseline;gap:0 var(--s1);padding:var(--s0)0;font-size:var(--t-13);flex-wrap:wrap;margin:0;line-height:1.4;display:flex}.toc li:before{content:"";min-width:32px;margin-bottom:var(--s0);border-bottom:1px dotted var(--gray-700);flex:1;order:1;align-self:flex-end}.toc li:after{content:counter(toc,decimal-leading-zero);font-family:var(--font-mono);color:var(--gray-500);font-variant-numeric:tabular-nums;order:2;font-size:11px}.toc li>ol,.toc li>ul{margin:var(--s0)0 0 var(--s2);flex-basis:100%;order:3}.toc li li{counter-increment:none;color:var(--gray-500);padding:var(--s0)0;font-size:13px}.toc li li:before,.toc li li:after{content:none}.toc a{color:var(--gray-400);transition:color var(--transition-fast);text-decoration:none}.toc a:hover,.toc a.active{color:var(--accent)}.toc>details>nav{display:contents}.blog-post-content pre.mermaid{padding:var(--s3)0;background:0 0;border:none;overflow-x:auto}.mermaid svg{user-select:none;width:auto;height:auto;margin:0 auto;display:block;background:0 0!important;max-width:none!important}.mermaid rect[class=""],.mermaid svg>rect,.mermaid .sequenceDiagram>rect{fill:#0000!important;stroke:none!important}.mermaid .node rect,.mermaid .node circle,.mermaid .node polygon,.mermaid .node ellipse,.mermaid .statediagram-state rect,.mermaid .state-default rect,.mermaid .classGroup rect,.mermaid .entityBox{fill:var(--gray-900)!important;stroke:var(--gray-600)!important;stroke-width:1px!important;rx:8px!important;ry:8px!important}.mermaid .node .label,.mermaid .nodeLabel{color:var(--gray-300)!important;font-family:Geist,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif!important}.mermaid .edgePath path,.mermaid .flowchart-link,.mermaid .transition path,.mermaid [class*=statediagram] path.transition,.mermaid .relation,.mermaid .relationshipLine{stroke:var(--gray-600)!important;stroke-width:1px!important}.mermaid .marker,.mermaid marker path,.mermaid defs marker path.relation{fill:var(--gray-600)!important;stroke:var(--gray-600)!important}.mermaid .edgeLabel{background-color:var(--gray-900)!important;color:var(--gray-500)!important}.mermaid .edgeLabel rect,.mermaid .transition .label rect,.mermaid [class*=statediagram] .edgeLabel rect{fill:var(--gray-900)!important;stroke:none!important;rx:4px!important;ry:4px!important;opacity:.8!important}.mermaid .transition .label text,.mermaid [class*=statediagram] .edgeLabel text{fill:var(--gray-500)!important}.mermaid text,.mermaid span,.mermaid p,.mermaid foreignObject div{font-family:Geist,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif!important}.mermaid text{fill:var(--gray-300)!important}.mermaid .labelText,.mermaid .cluster-label text{fill:var(--gray-400)!important}.mermaid .cluster rect,.mermaid .statediagram-cluster rect{fill:var(--gray-950)!important;stroke:var(--gray-700)!important;stroke-width:1px!important;stroke-dasharray:4 4!important;rx:8px!important;ry:8px!important}.mermaid .note,.mermaid .statediagram-note rect{fill:#0000!important;stroke:var(--accent)!important;stroke-width:1px!important;rx:8px!important;ry:8px!important}.mermaid .noteText,.mermaid .statediagram-note text{fill:var(--gray-400)!important}.mermaid .actor{fill:#0000!important;stroke:var(--gray-600)!important;stroke-width:1px!important;rx:8px!important;ry:8px!important}.mermaid .actor-line,.mermaid .loopLine{stroke:var(--gray-700)!important;stroke-dasharray:4 4!important}.mermaid .messageLine0,.mermaid .messageLine1{stroke:var(--gray-600)!important;stroke-width:1px!important}.mermaid .messageText,.mermaid .loopText,.mermaid .loopText>tspan,.mermaid .relationshipLabel text{fill:var(--gray-400)!important}.mermaid .activation0,.mermaid .activation1,.mermaid .activation2{fill:#0000!important;stroke:var(--gray-600)!important;stroke-width:1px!important}.mermaid .labelBox{fill:var(--gray-900)!important;stroke:var(--gray-600)!important;rx:4px!important;ry:4px!important}.mermaid .start-state,.mermaid .end-state-inner{fill:var(--gray-400)!important;stroke:var(--gray-400)!important}.mermaid .end-state-outer{fill:#0000!important;stroke:var(--gray-400)!important}.mermaid .fork-join{fill:var(--gray-600)!important;stroke:none!important}.mermaid .classGroup text,.mermaid .classLabel text,.mermaid .entityLabel text,.mermaid .attributeBoxEven,.mermaid .attributeBoxOdd{fill:var(--gray-300)!important}.mermaid .classGroup line,.mermaid .divider{stroke:var(--gray-600)!important}.mermaid .cardinality text,.mermaid .composition,.mermaid .aggregation,.mermaid .dependency{fill:var(--gray-600)!important}.mermaid .grid .tick line{stroke:var(--gray-800)!important}.mermaid .grid .tick text{fill:var(--gray-500)!important}.mermaid .section{fill:var(--gray-950)!important;stroke:none!important}.mermaid .task{rx:4px!important;ry:4px!important}.mermaid .today{stroke:var(--accent)!important;stroke-width:2px!important}.mermaid .pieTitleText{fill:var(--gray-300)!important}.mermaid text.slice{fill:var(--gray-050)!important;paint-order:stroke fill!important;stroke:var(--gray-950)!important;stroke-width:3px!important;stroke-linejoin:round!important;font-size:13px!important;font-weight:600!important}.mermaid path.slice{stroke:var(--gray-950)!important;stroke-width:1px!important}.mermaid .legend text{fill:var(--gray-400)!important}.series-nav{border:none;margin:0;padding:0}.series-name{font-family:var(--font-display);font-style:italic;font-size:var(--t-20);color:var(--gray-050);margin:var(--s1)0 var(--s2);font-weight:500;line-height:1.3}.series-list{counter-reset:series;margin:0;padding:0;list-style:none}.series-list li{counter-increment:series;align-items:baseline;gap:var(--s2);padding:var(--s0)0;font-size:var(--t-13);color:var(--gray-500);margin:0;line-height:1.4;display:flex}.series-list li:before{content:counter(series,upper-roman);min-width:24px;font-family:var(--font-display);font-style:italic;font-size:var(--t-13);color:var(--gray-500);flex-shrink:0}.series-list li.current{color:var(--gray-050);font-weight:500}.series-list li.current:before{color:var(--accent)}.series-list a{color:var(--gray-500);transition:color var(--transition-fast);text-decoration:none}.series-list a:hover{color:var(--accent)}.meta-link:active,.tag:active{transform:translateY(1px)}@media (hover:none) and (pointer:coarse){.tag:active,.meta-link:active{opacity:.7;transform:scale(.98)}.tag{min-height:44px}}@media (forced-colors:active){.post-scene>h2,.blog-post-content pre,.tag{border:1px solid canvastext}}@media print{.blog-post-content h2,.blog-post-content h3{color:#000}.blog-post-content{color:#333;font-size:10pt;line-height:1.5}.meta-link,.reading-progress{display:none!important}.toc,.series-nav{page-break-inside:avoid;content-visibility:visible}.toc li:before{border-color:#999}.toc details{display:block}.toc details>summary{display:none}.toc details>nav,.toc details>ol,.toc details>ul{display:block!important}.series-list li.current{color:#000}.series-list li.current:before{color:#c21a13}.blog-post-content a{color:#06c;text-decoration:underline}.blog-post-content a[href^=http]:after{content:" (" attr(href)")";color:#666;word-break:break-all;font-size:8pt;font-weight:400}.blog-post-content pre{background:#f5f5f5;border-color:#ccc;padding:8pt}.blog-post-content code{color:#c21a13;background:#f0f0f0}.highlight-line{background:#f7eceb;border-left-color:#c21a13}.mermaid svg{max-width:100%!important}.mermaid text{fill:#333!important}.mermaid .node rect,.mermaid .node circle,.mermaid .node polygon,.mermaid .node ellipse{fill:#f5f5f5!important;stroke:#999!important}.mermaid .edgePath path,.mermaid .flowchart-link,.mermaid marker path{fill:#666!important;stroke:#666!important}.mermaid .edgeLabel{color:#555!important;background-color:#fff!important}.mermaid .edgeLabel rect{fill:#fff!important}.mermaid .cluster rect{fill:#fafafa!important;stroke:#ccc!important}.mermaid .note,.mermaid .today{stroke:#c21a13!important}.mermaid .noteText{fill:#555!important}.tag{color:#666}}