.article{padding:32px 0 60px}.back-link-wrap{max-width:var(--content-w, 100%);margin:0 auto}.back-link{display:inline-flex;align-items:center;gap:8px;font-family:var(--f-mono);font-size:11.5px;letter-spacing:.04em;color:var(--fg-fa);text-decoration:none;margin-bottom:32px;transition:color .15s}.back-link:hover{color:var(--accent)}.back-link .arr{transition:transform .18s;display:inline-block}.back-link:hover .arr{transform:translate(-2px)}.art-head{max-width:var(--content-w, 100%);margin-left:auto;margin-right:auto;margin-bottom:26px;padding-bottom:28px;border-bottom:1px dashed var(--box-line)}.art-head h1{font-family:var(--f-display);font-weight:600;font-size:clamp(32px,4vw,44px);line-height:1.08;letter-spacing:-.022em;margin:0 0 24px;text-wrap:balance}.art-head .lede{font-family:var(--f-body);font-size:17px;line-height:1.55;color:var(--fg-mu);margin:0 0 20px;text-wrap:pretty}.art-meta{font-family:var(--f-mono);font-size:11.5px;letter-spacing:.04em;color:var(--fg-fa)}.art-meta .tags{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.art-meta .tag{border:1px solid var(--box-line);border-radius:3px;padding:3px 8px;color:var(--fg-mu);text-transform:none;letter-spacing:.02em;font-size:11px}.art-meta .proj-info{display:flex;align-items:center;justify-content:space-between;gap:16px;color:var(--fg);font-size:12.5px;letter-spacing:.02em;margin-bottom:20px}.art-meta .proj-info a{color:var(--fg);text-decoration:none;transition:color .15s}.art-meta .proj-info a:hover{color:var(--accent)}.art-meta-line{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}.art-meta-line .tags{flex:1;min-width:0}.art-meta-line .date-read{display:flex;align-items:center;gap:6px;white-space:nowrap;margin-left:auto;flex-shrink:0}.art-meta-line .date-read .sep{opacity:.5}.art-body{position:relative}.toc-container{position:fixed;right:12px;top:50%;transform:translateY(-50%);z-index:100;display:flex;align-items:center;gap:0}.minimap{display:flex;flex-direction:column;align-items:flex-end;gap:10px;padding:12px 8px 12px 16px;transition:opacity .2s ease}.minimap-tick{height:2.5px;border-radius:2px;background:var(--fg-fa);opacity:.55;transition:background .2s ease,opacity .2s ease;cursor:pointer;border:0;padding:0}.minimap-tick.h2{width:16px}.minimap-tick.h3{width:12px}.minimap-tick.active{background:var(--accent);opacity:1}.toc-panel{position:absolute;right:0;top:50%;transform:translateY(-50%) translate(8px);width:240px;max-height:70vh;overflow-y:auto;background:var(--bg-box);border:1px solid var(--box-line);border-radius:8px 0 0 8px;padding:14px 0;box-shadow:-4px 0 24px #0000004d;opacity:0;pointer-events:none;transition:opacity .18s ease,transform .18s ease;scrollbar-width:thin;scrollbar-color:var(--rule-line) transparent;z-index:10}.toc-panel::-webkit-scrollbar{width:3px}.toc-panel::-webkit-scrollbar-thumb{background:var(--rule-line);border-radius:2px}.toc-container:hover .toc-panel{opacity:1;pointer-events:auto;transform:translateY(-50%) translate(0)}.toc-panel .toc-label{font-family:var(--f-display);font-weight:700;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--fg-fa);margin:0 0 8px;padding:0 16px}.toc-list{position:relative}.toc-item{display:block;text-decoration:none;color:var(--fg-fa);font-size:12.5px;line-height:1.35;padding:4px 16px 4px 14px;position:relative;border-left:2px solid transparent;transition:color .15s,background .15s,border-color .15s}.toc-item.h3{padding-left:26px;font-size:11.5px}.toc-item:hover{color:var(--fg-mu);background:var(--hover-bg)}.toc-item.active{color:var(--fg);border-left-color:var(--accent);background:color-mix(in oklab,var(--accent) 6%,transparent)}@media(max-width:880px){.toc-container{display:none!important}}.toc-bar{display:none;position:sticky;top:var(--nav-h);z-index:49;background:var(--bg-box);border-bottom:1px solid var(--box-line);font-family:var(--f-body);transition:transform .2s ease}:root.nav-hidden .toc-bar{transform:translateY(calc(-1 * (var(--nav-h) - 2px)))}@media(max-width:880px){.toc-bar{display:block;border-bottom:none}.toc-bar:after{content:"";position:absolute;bottom:0;left:50%;transform:translate(-50%);width:100vw;height:1px;background:var(--box-line);pointer-events:none}}.toc-bar-header{display:flex;align-items:center;gap:12px;padding:10px 0;cursor:pointer;user-select:none}.toc-bar-text{flex:1;min-width:0;font-size:13px;color:var(--fg-mu);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.3}.toc-bar-chevron{flex-shrink:0;width:20px;height:20px;color:var(--fg-fa);transition:transform .2s ease}.toc-bar.open .toc-bar-chevron{transform:rotate(180deg)}.toc-bar-dropdown{max-height:0;overflow:hidden;transition:max-height .25s ease}.toc-bar.open .toc-bar-dropdown{max-height:50vh;overflow-y:auto}.toc-bar-dropdown .toc-bar-item{display:block;text-decoration:none;color:var(--fg-fa);font-size:14px;line-height:1.4;padding:7px 0 7px 18px;transition:color .15s,background .15s,border-color .15s;border-left:2px solid transparent}.toc-bar-dropdown .toc-bar-item.h3{padding-left:52px;font-size:13px}.toc-bar-dropdown .toc-bar-item:hover{color:var(--fg-mu);background:var(--hover-bg)}.toc-bar-dropdown .toc-bar-item.active{color:var(--fg);border-left-color:var(--accent);background:color-mix(in oklab,var(--accent) 6%,transparent)}.draft-notice{max-width:var(--content-w, 100%);margin:0 auto;padding:56px 32px;border:1px dashed var(--rule-line);border-radius:8px;text-align:left;background:color-mix(in oklab,var(--bg-2) 60%,transparent)}.draft-notice .draft-tag{display:inline-block;font-family:var(--f-mono);font-size:10px;letter-spacing:.14em;color:var(--accent);border:1px solid var(--accent);border-radius:3px;padding:3px 8px;margin-bottom:20px}.draft-title{font-family:var(--f-display);font-weight:600;font-size:22px;color:var(--fg);margin:0 0 12px}.draft-body{font-family:var(--f-body);font-size:15px;color:var(--fg-mu);line-height:1.55;margin:0;max-width:540px}.draft-body a{color:var(--accent);text-decoration:none;border-bottom:1px solid color-mix(in oklab,var(--accent) 35%,transparent)}.draft-body a:hover{border-color:var(--accent)}.art-prose{max-width:var(--content-w, 100%);margin:0 auto;min-width:0;counter-reset:figure;font-size:16.5px;line-height:1.7;color:var(--fg);--prose-text-gap: 1.25em;--prose-block-gap: 1.75em;--prose-h2-above: 1.2em;--prose-h2-below: .75em;--prose-h3-above: 1.6em;--prose-h3-below: .6em;--prose-h4-above: 1.4em;--prose-h4-below: .5em;--prose-rule-gap: 2.5em;--prose-section-gap: 2em;--prose-li-gap: .4em}.art-prose>*{margin-top:0;margin-bottom:var(--prose-text-gap)}.art-prose>*:first-child{margin-top:0;padding-top:0;border-top:0}.art-prose>*:last-child{margin-bottom:0}.art-prose h2{font-family:var(--f-display);font-weight:600;font-size:22px;letter-spacing:-.012em;color:var(--fg);margin-top:var(--prose-h2-above);margin-bottom:var(--prose-h2-below);padding-top:18px;border-top:1px dashed var(--box-line);scroll-margin-top:100px}.art-prose h3{font-family:var(--f-display);font-weight:600;font-size:16px;letter-spacing:-.005em;color:var(--fg);margin-top:var(--prose-h3-above);margin-bottom:var(--prose-h3-below);scroll-margin-top:100px}.art-prose h4{font-family:var(--f-display);font-weight:600;font-size:14.5px;color:var(--fg);margin-top:var(--prose-h4-above);margin-bottom:var(--prose-h4-below);letter-spacing:-.002em;scroll-margin-top:100px}.art-prose p{color:var(--fg);text-wrap:pretty}.art-prose strong{color:var(--fg);font-weight:600}.art-prose em{color:var(--fg-mu);font-style:italic}.art-prose a{color:var(--accent);text-decoration:none;border-bottom:1px solid color-mix(in oklab,var(--accent) 35%,transparent);transition:border-color .15s}.art-prose a:hover{border-color:var(--accent)}.art-prose code:not(pre code){font-family:var(--f-mono);font-size:.88em;background:var(--bg-code);color:var(--code-fg);padding:1px 6px;border-radius:3px;border:1px solid var(--rule-line)}.art-prose ul,.art-prose ol{padding-left:22px;color:var(--fg)}.art-prose li{margin-top:var(--prose-li-gap)}.art-prose li:first-child{margin-top:0}.art-prose li::marker{color:var(--fg-fa)}.art-prose blockquote{padding:4px 0 4px 18px;border-left:2px solid var(--accent);color:var(--fg-mu);font-style:italic}.art-prose>figure,.art-prose>pre,.art-prose>pre.astro-code,.art-prose>.table-wrap,.art-prose>.req{margin-top:var(--prose-block-gap);margin-bottom:var(--prose-block-gap)}.art-prose hr{border:0;height:1px;background:var(--rule-line);width:60%;margin-left:auto;margin-right:auto;margin-top:var(--prose-rule-gap);margin-bottom:var(--prose-rule-gap)}.art-prose .req{border-left:2px solid var(--accent);background:color-mix(in oklab,var(--accent) 5%,transparent);padding:12px 16px;font-size:14.5px;line-height:1.55;color:var(--fg)}.art-prose .req-label{display:inline-block;font-family:var(--f-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--accent);margin-right:10px;vertical-align:1px;font-weight:500}.art-prose .table-wrap{margin:28px 0;overflow-x:auto;background:var(--bg-box);border:1px solid var(--box-line);border-radius:6px;scrollbar-width:thin;scrollbar-color:var(--rule-line) transparent}.art-prose .table-wrap::-webkit-scrollbar{height:6px}.art-prose .table-wrap::-webkit-scrollbar-track{background:transparent}.art-prose .table-wrap::-webkit-scrollbar-thumb{background:var(--rule-line);border-radius:3px}.art-prose table{width:100%;border-collapse:separate;border-spacing:0;margin:0;font-size:13.5px;background:transparent;border:0}.art-prose thead{background:var(--bg-2)}.art-prose th,.art-prose td{padding:11px 14px;border-bottom:1px solid var(--box-line);border-right:1px solid var(--rule-line);text-align:left;vertical-align:top}.art-prose th:last-child,.art-prose td:last-child{border-right:0}.art-prose th{font-family:var(--f-mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--fg-mu);font-weight:600;border-bottom:1px solid var(--box-line)}.art-prose td{color:var(--fg)}.art-prose tr:last-child td{border-bottom:0}.art-prose td:first-child{font-weight:500;color:var(--fg)}.figure{margin-left:auto;margin-right:auto;max-width:620px;border:1px solid var(--rule-line);border-radius:6px;background:var(--bg-box);overflow:hidden}.figure .fig-canvas{padding:32px 24px;display:flex;justify-content:center;align-items:center}.figure svg{display:block;max-width:100%;height:auto}.figure figcaption{border-top:1px solid var(--rule-line);padding:10px 16px;font-family:var(--f-mono);font-size:11px;letter-spacing:.03em;color:var(--fg-fa);display:flex;gap:10px}.figure figcaption .label{color:var(--accent);text-transform:uppercase;letter-spacing:.08em}.figure:has(figcaption){counter-increment:figure}.figure figcaption .label:before{content:"Fig. " counter(figure)}.figure.inline{max-width:480px}.figure.inline .fig-canvas{padding:20px 24px}.figure.wide{max-width:100%}.art-prose>.refs{margin-top:var(--prose-section-gap);margin-bottom:0}.refs{padding-top:28px;border-top:1px solid var(--box-line)}.refs .label{font-family:var(--f-display);font-weight:700;font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--fg-mu);margin:0 0 20px}.refs ol{list-style:none;counter-reset:ref;padding:0!important;margin:0}.refs li{counter-increment:ref;display:flex;align-items:stretch;padding:6px 0}.refs li:before{content:"[" counter(ref) "]";font-family:var(--f-mono);font-size:11.5px;color:var(--fg-fa);letter-spacing:.02em;flex-shrink:0;margin-right:10px;padding-top:3px}.refs .ref-line{display:flex;align-items:baseline;flex:1;min-width:0;border-bottom:1px solid color-mix(in oklab,var(--accent) 35%,transparent);padding-bottom:.5px;transition:border-color .15s,color .15s;text-decoration:none;color:var(--fg);cursor:pointer}.refs li:hover .ref-line{border-bottom-color:var(--accent);color:var(--accent)}.refs .ref-line .title{font-size:13px}.refs .ref-line .src{color:var(--fg-fa);font-size:11.5px;font-family:var(--f-mono);flex-shrink:0;margin-left:auto;padding-left:12px;transition:color .15s}.art-prose pre.astro-code{position:relative;border:1px solid var(--rule-line);border-radius:6px;padding:18px 20px;font-family:var(--f-mono);font-size:12.5px;line-height:1.6;overflow-x:auto;font-variant-ligatures:none}.art-prose pre.astro-code code{background:transparent;border:0;padding:0;font-family:inherit;font-size:inherit;color:inherit;font-variant-ligatures:inherit}.art-prose pre.astro-code::-webkit-scrollbar{height:6px}.art-prose pre.astro-code::-webkit-scrollbar-track{background:transparent}.art-prose pre.astro-code::-webkit-scrollbar-thumb{background:var(--rule-line);border-radius:3px}.art-prose pre.astro-code{padding-right:56px}.art-prose pre.astro-code[data-language]:after{content:attr(data-language);position:absolute;top:8px;right:12px;font-family:var(--f-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-fa);pointer-events:none}.art-prose pre.astro-code:not([data-language]):after,.art-prose pre.astro-code[data-language=""]:after,.art-prose pre.astro-code[data-language=text]:after,.art-prose pre.astro-code[data-language=plain]:after,.art-prose pre.astro-code[data-language=plaintext]:after{content:none}.art-prose pre.astro-code:not([data-language]),.art-prose pre.astro-code[data-language=""],.art-prose pre.astro-code[data-language=text],.art-prose pre.astro-code[data-language=plain],.art-prose pre.astro-code[data-language=plaintext]{padding-right:20px}.figure .nodeLabel,.figure .edgeLabel,.figure .cluster-label,.figure foreignObject div,.figure foreignObject span,.figure foreignObject p,.figure text{font-family:var(--f-mono)!important;font-feature-settings:"kern" 1,"liga" 0}.figure .actor{fill:var(--bg-2)!important;stroke:var(--fg-mu)!important;stroke-width:1!important}.figure text.actor,.figure text.actor>tspan{fill:var(--fg)!important;font-size:11.5px!important;font-weight:400!important}.figure line.actor-line{stroke:var(--fg-fa)!important;stroke-width:1!important;stroke-dasharray:2 3!important;opacity:.5}.figure text.messageText{fill:var(--fg-mu)!important;font-size:10.5px!important}.figure line.messageLine0,.figure path.messageLine0,.figure line.messageLine1,.figure path.messageLine1{stroke:var(--fg-fa)!important;stroke-width:1!important;fill:none!important}.figure path.messageLine1,.figure line.messageLine1{stroke-dasharray:3 3!important}.figure marker path,.figure defs marker path{fill:var(--fg-fa)!important;stroke:var(--fg-fa)!important}.figure line[marker-end*=crosshead]{stroke:var(--accent)!important;stroke-dasharray:4 3!important;opacity:.85}.figure marker[id$=-crosshead] path{stroke:var(--accent)!important;stroke-width:1.2!important;fill:none!important}.figure .note{fill:color-mix(in oklab,var(--accent) 10%,transparent)!important;stroke:none!important;rx:3!important;ry:3!important}.figure g[data-et=note]{transform:translateY(6px)}.figure text.noteText,.figure .noteText tspan{fill:var(--accent)!important;font-size:10.5px!important;font-weight:400!important}.figure .loopLine{stroke:var(--accent)!important;stroke-width:1!important;stroke-dasharray:none!important;fill:none!important;opacity:.5}.figure .labelBox{fill:color-mix(in oklab,var(--accent) 12%,transparent)!important;stroke:none!important;rx:2!important;ry:2!important}.figure text.labelText,.figure .labelText tspan{fill:var(--accent)!important;font-size:10px!important;font-weight:500!important}.figure text.loopText,.figure .loopText tspan,.figure text.sectionTitle,.figure .sectionTitle tspan{fill:var(--accent)!important;font-size:10px!important}.figure .activation0,.figure .activation1,.figure .activation2{fill:var(--bg-2)!important;stroke:var(--accent)!important}.figure .sequenceNumber{fill:var(--accent)!important;stroke:none!important}.figure text.sequenceNumber{fill:var(--bg)!important;font-size:9px!important}.figure .node rect,.figure .node polygon,.figure .node circle,.figure .node ellipse,.figure .node path{fill:var(--bg-2)!important;stroke:var(--fg-mu)!important;stroke-width:1!important}.figure .node rect{rx:3!important;ry:3!important}.figure .node .label,.figure .node foreignObject div,.figure .nodeLabel{color:var(--fg)!important;font-size:11.5px!important}.figure .node.accent rect,.figure .node.accent polygon,.figure .node.accent circle,.figure .node.accent ellipse,.figure .node.accent path{stroke:var(--accent)!important;stroke-width:1.5!important}.figure .node.accent .nodeLabel,.figure .node.accent foreignObject div{color:var(--accent)!important}.figure .node.muted rect,.figure .node.muted polygon,.figure .node.muted circle,.figure .node.muted ellipse,.figure .node.muted path{stroke:var(--rule-line)!important}.figure .node.muted .nodeLabel,.figure .node.muted foreignObject div{color:var(--fg-mu)!important}.figure .node.pivot rect,.figure .node.pivot polygon,.figure .node.pivot circle,.figure .node.pivot ellipse,.figure .node.pivot path{stroke:var(--accent)!important;stroke-width:2!important}.figure .node.pivot .nodeLabel,.figure .node.pivot foreignObject div{color:var(--accent)!important}.figure .node.compensation rect,.figure .node.compensation polygon,.figure .node.compensation circle,.figure .node.compensation ellipse,.figure .node.compensation path{stroke:var(--fg-mu)!important;stroke-dasharray:3 3!important;fill:transparent!important}.figure .node.compensation .nodeLabel,.figure .node.compensation foreignObject div{color:var(--fg-mu)!important}.figure .node.bus rect,.figure .node.bus polygon,.figure .node.bus circle,.figure .node.bus ellipse,.figure .node.bus path{stroke:var(--fg-mu)!important;stroke-width:1!important;fill:var(--bg-1)!important}.figure .node.bus .nodeLabel,.figure .node.bus foreignObject div{color:var(--fg-mu)!important}.figure .edgePath path,.figure path.path,.figure path.flowchart-link,.figure line.flowchart-link{stroke:var(--fg-mu)!important;stroke-width:1!important;fill:none!important}.figure .edgePath .arrowheadPath,.figure .arrowheadPath,.figure path.arrowMarkerPath{fill:var(--fg-mu)!important;stroke:var(--fg-mu)!important}.figure .edgeLabel,.figure .edgeLabel foreignObject div,.figure .edgeLabel rect{background-color:var(--bg)!important;color:var(--fg-fa)!important;font-size:10px!important;fill:var(--bg)!important}.figure .edgeLabel rect{opacity:.92}.figure .cluster rect{fill:none!important;stroke:var(--rule-line)!important;stroke-width:1!important;stroke-dasharray:4 3!important}.figure .cluster .cluster-label,.figure .cluster-label foreignObject div{color:var(--accent)!important;font-size:10px!important;letter-spacing:.04em}.figure .cluster:has(.cluster-label:empty) rect,.figure .cluster:has(foreignObject div:empty) rect{stroke:none!important;fill:none!important}.figure .stateGroup rect,.figure .state-shadow,.figure .composit{fill:var(--bg-2)!important;stroke:var(--fg-mu)!important;stroke-width:1!important}.figure .stateGroup text,.figure .stateGroup .state-title{fill:var(--fg)!important;font-size:11px!important}.figure circle.start-state,.figure circle.end-state-inner,.figure circle.end-state-outer{fill:var(--fg-mu)!important;stroke:var(--fg-mu)!important}.figure .transition{stroke:var(--fg-mu)!important;stroke-width:1!important;fill:none!important}.figure .transition-label,.figure .transition-label foreignObject div{fill:var(--fg-fa)!important;color:var(--fg-fa)!important;font-size:10px!important}.figure .er.entityBox{fill:var(--bg-2)!important;stroke:var(--fg-mu)!important}.figure .er.attributeBoxOdd,.figure .er.attributeBoxEven{fill:var(--bg-2)!important;stroke:var(--rule-line)!important}.figure text.er.entityLabel,.figure .er.entityLabel{fill:var(--fg)!important;font-size:11.5px!important}.figure text.er.attributeText,.figure .er.attributeText{fill:var(--fg-mu)!important;font-size:10.5px!important}.figure .er.relationshipLine{stroke:var(--fg-mu)!important;fill:none!important}.figure text.er.relationshipLabelBox{fill:var(--bg)!important}.figure text.er.relationshipLabel,.figure .er.relationshipLabel{fill:var(--fg-fa)!important;font-size:10px!important}.figure .background,.figure rect.background{fill:transparent!important;stroke:none!important}
