:root{--s-1:4px;--s-2:8px;--s-3:12px;--s-4:16px;--s-5:24px;--s-6:32px;--s-7:48px;--s-8:64px;--s-9:96px;--col:640px;--gutter:24px;--radius:2px;--sans:"Plex Sans", "Plex Sans Fallback", system-ui, sans-serif;--mono:"JetBrains Mono", "JetBrains Mono Fallback", ui-monospace, monospace;--d-fast:.15s;--d-base:.2s;--d-slow:.3s;--d-enter:.4s;--ease-out:cubic-bezier(.2, 0, 0, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1)}:root,[data-theme=light]{--bg:#f4f1ec;--bg-2:#ece8e1;--fg:#1a1816;--fg-2:#6b665e;--fg-3:#a8a297;--line:#ddd8cf;--accent:#ff4f00;--field:.36;color-scheme:light}[data-theme=oled]{--bg:#000;--bg-2:#0d0c0b;--fg:#e6e2db;--fg-2:#8f8a82;--fg-3:#4e4a44;--line:#1e1c1a;--accent:#ff5a0a;--field:.44;color-scheme:dark}:root{--hair:1px solid var(--line)}@font-face{font-family:Plex Sans;font-weight:400;font-style:normal;font-display:swap;src:url(/fonts/plex-sans-400.woff2)format("woff2")}@font-face{font-family:Plex Sans;font-weight:500;font-style:normal;font-display:swap;src:url(/fonts/plex-sans-500.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-weight:400;font-style:normal;font-display:swap;src:url(/fonts/jetbrains-mono-400.woff2)format("woff2")}@font-face{font-family:Plex Sans Fallback;src:local(Arial),local(Helvetica Neue),local(Helvetica);size-adjust:106%;ascent-override:96.7%;descent-override:25.9%;line-gap-override:0%}@font-face{font-family:JetBrains Mono Fallback;src:local(Menlo),local(Consolas),local(Courier New);size-adjust:100%;ascent-override:102%;descent-override:30%;line-gap-override:0%}*,:before,:after{box-sizing:border-box}*{margin:0}html{background:var(--bg);color:var(--fg);-webkit-text-size-adjust:100%;scrollbar-gutter:stable}body{font:400 17px/1.6 var(--sans);font-feature-settings:"kern", "liga";flex-direction:column;min-height:100dvh;display:flex}@media (width<=640px){body{font-size:16px}:root{--gutter:20px}}h1,h2,h3{letter-spacing:-.01em;text-wrap:balance;font-weight:500}p{max-width:65ch}p+p{margin-top:var(--s-4)}code,kbd,samp,.mono{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:.88em}img,svg,canvas{max-width:100%;display:block}.column{width:100%;max-width:calc(var(--col) + var(--gutter) * 2);padding-inline:var(--gutter);margin-inline:auto}main{padding-block:var(--s-9) var(--s-8);flex:1}@media (width<=640px){main{padding-block:var(--s-8) var(--s-7)}}.section+.section{margin-top:var(--s-8)}@media (width<=640px){.section+.section{margin-top:var(--s-7)}}.section-heading{color:var(--fg-2);margin-bottom:var(--s-3);font-size:15px;line-height:1.4}.more{margin-top:var(--s-3);color:var(--accent);padding-block:6px;font-size:15px;text-decoration:none;display:inline-block}a{color:inherit;text-decoration:underline 1px;text-decoration-color:var(--accent);text-underline-offset:3px;transition:text-decoration-color var(--d-fast) var(--ease-out), color var(--d-fast) var(--ease-out)}a:hover{text-decoration-color:var(--accent);color:var(--accent)}::selection{background:var(--accent);color:var(--fg)}[data-theme=oled] ::selection{color:var(--bg)}:focus{outline:none}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--radius)}.skip{left:var(--gutter);padding:var(--s-2) var(--s-3);background:var(--bg);border:var(--hair);font-size:15px;text-decoration:none;position:absolute;top:-100px}.skip:focus-visible{top:var(--s-3)}.intro{--header:0px;padding-top:var(--header);position:relative}@media (width<=959px){.intro{--header:200px}}.intro h1{margin-bottom:var(--s-4);font-size:20px;line-height:1.3}.intro .version{font-variant-numeric:tabular-nums;position:absolute;top:0;right:0}@media (width<=640px){.intro .version{margin-bottom:var(--s-4);position:static}}.intro p{color:var(--fg)}.intro+.section{margin-top:var(--s-9)}.rows{display:grid}.row{column-gap:var(--s-5);padding-block:var(--s-3);border-top:var(--hair);color:inherit;grid-template-columns:1fr auto;grid-template-areas:"title meta""desc desc";text-decoration:none;display:grid;position:relative}.rows>.row:last-child{border-bottom:var(--hair)}.rows>.row:first-child{border-top-color:var(--accent)}.row:before{content:"";inset:0 calc(var(--s-3) * -1);border-radius:var(--radius);z-index:-1;transition:background var(--d-fast) var(--ease-out);background:0 0;position:absolute}.row:hover{color:inherit}.row:hover .row-arrow{color:var(--accent);transform:translate(2px)}.row:hover:before{background:var(--bg-2)}.row-title{overflow-wrap:anywhere;grid-area:title;min-width:0;font-weight:500;line-height:1.4}.row-desc{color:var(--fg-2);grid-area:desc;margin-top:2px;font-size:15px;line-height:1.5}.row-meta{align-items:baseline;gap:var(--s-2);font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--fg-2);white-space:nowrap;transition:color var(--d-fast) var(--ease-out);grid-area:meta;padding-top:3px;font-size:13px;line-height:1.5;display:flex}.row:hover .row-meta{color:var(--accent)}.row-arrow{color:var(--fg-3);transition:transform var(--d-fast) var(--ease-out)}.plate{display:grid}.plate-row{column-gap:var(--s-4);padding-block:var(--s-2);border-top:var(--hair);grid-template-columns:120px 1fr;display:grid}.plate>.plate-row:last-child{border-bottom:var(--hair)}.plate dt{font-family:var(--mono);color:var(--fg-2);padding-top:2px;font-size:13px;line-height:1.5}.plate dd{color:var(--fg);font-size:15px;line-height:1.5}.plate-track{width:100%;height:1px;margin-top:var(--s-1);background:var(--line);display:block}.plate-fill{height:100%;width:calc(var(--p,0) * 100%);background:var(--accent);display:block}@media (width<=480px){.plate-row{grid-template-columns:96px 1fr}}@media (width<=400px){.plate-row{grid-template-columns:1fr;row-gap:2px}.plate dt{padding-top:0}}footer{padding-block:var(--s-5) var(--s-6);font-size:15px}.footer-inner{justify-content:space-between;align-items:baseline;gap:var(--s-4);flex-wrap:wrap;display:flex}@media (width<=480px){.footer-inner{align-items:flex-start;gap:var(--s-3);flex-direction:column}}.footer-links{gap:var(--s-3);display:flex}.footer-links a{padding-block:6px;text-decoration:none}.footer-links a:hover{text-decoration:underline;text-decoration-color:var(--accent)}.footer-links span{color:var(--fg-3)}.footer-meta{align-items:baseline;gap:var(--s-4);font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--fg-3);font-size:13px;display:flex}.footer-meta a.plain{color:inherit;text-decoration:none}.footer-meta a.plain:hover{color:var(--accent)}@media (prefers-reduced-motion:no-preference){.enter{animation:enter var(--d-slow) var(--ease-out) both;animation-delay:calc(var(--i,0) * 40ms)}.intro.enter{animation-name:enter-lcp}@keyframes enter{0%{opacity:0;transform:translateY(6px)}}@keyframes enter-lcp{0%{transform:translateY(6px)}}}@media (width>=960px){main{flex:1;position:relative}main:before,main:after{content:"";background:var(--line);width:1px;position:absolute;top:0;bottom:0}main:before{left:0}main:after{right:0}.section-heading{position:relative}.section-heading:before{content:"";left:calc(var(--gutter) * -1 - 4px);background:var(--accent);width:9px;height:1px;position:absolute;top:.7em}}.label{align-items:center;gap:var(--s-2);font:400 12px/1 var(--mono);font-variant-numeric:tabular-nums;border:var(--hair);border-radius:var(--radius);color:var(--fg-2);white-space:nowrap;padding:4px 6px 3px;display:inline-flex}.dot{background:var(--accent);vertical-align:1px;border-radius:50%;flex:none;width:6px;height:6px;display:inline-block}.section-heading .dot{margin-right:var(--s-2)}.ident{gap:var(--s-2) var(--s-3);margin:calc(var(--s-2) * -1) 0 var(--s-5);font:400 13px/1.5 var(--mono);color:var(--fg-2);flex-wrap:wrap;display:flex}@media (width<=640px){.ident{font-size:12px}}.ident span+span:before{content:"·";margin-right:var(--s-3);color:var(--fg-3)}[data-theme=light] body:after{content:"";pointer-events:none;opacity:.035;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");position:fixed;inset:0}main:before,main:after{z-index:0}main{padding-top:calc(var(--s-9) + 2px)}@media (width<=640px){main{padding-top:calc(var(--s-8) + 2px)}}.stripe{background:var(--accent);height:2px;position:absolute;top:0;left:0;right:0}.row:after{content:"";left:calc(var(--s-3) * -1);top:var(--s-2);bottom:var(--s-2);background:var(--accent);opacity:0;width:2px;transition:opacity var(--d-fast) var(--ease-out);position:absolute}.row:hover:after{opacity:1}.more:hover{text-decoration:underline}.label.version{color:var(--accent);border-color:color-mix(in srgb, var(--accent) 40%, transparent)}.plate dd.live,li::marker{color:var(--accent)}blockquote{border-left:2px solid var(--accent);padding-left:var(--s-4);color:var(--fg-2)}@media (width>=960px) and (pointer:fine){*{scrollbar-width:thin;scrollbar-color:var(--fg-3) transparent}:hover{scrollbar-color:var(--accent) transparent}}.theme{all:unset;cursor:pointer;width:24px;height:24px;color:var(--fg-3);transition:color var(--d-fast) var(--ease-out);place-items:center;margin:-6px;display:inline-grid}.theme:hover{color:var(--accent)}.theme svg{transition:transform var(--d-base) var(--ease-in-out)}[data-theme=oled] .theme svg{transform:rotate(180deg)}@view-transition{navigation:auto}::view-transition-old(root),::view-transition-new(root){animation-duration:var(--d-base);animation-timing-function:var(--ease-out)}@media (prefers-reduced-motion:reduce){::view-transition-old(root),::view-transition-new(root){animation-duration:.1s}}[data-entered] .enter{animation:none}.frame{grid-template-columns:minmax(0, 1fr) minmax(0, calc(var(--col) + var(--gutter) * 2)) minmax(0, 1fr);flex:1;grid-template-rows:1fr auto;display:grid}.frame>main{grid-area:1/2;width:100%;margin-inline:0;position:relative}.frame>footer{grid-area:2/2}@media (width>=960px){.frame:before,.frame:after{content:"";--grid:16px;--grid-line:color-mix(in srgb, var(--line) 55%, transparent);background-image:linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);background-size:var(--grid) var(--grid);grid-row:1/-1}.frame:before{background-position:100% 0;grid-column:1}.frame:after{background-position:0 0;grid-column:3}}body{container-type:inline-size}main{isolation:isolate}.field-home{z-index:-1;pointer-events:none;width:100cqw;max-width:none;height:clamp(360px,55vh,640px);position:absolute;top:0;left:calc(50% - 50cqw)}@media (width<=959px){.field-home{height:clamp(480px,60vh,640px)}}@media (prefers-reduced-motion:no-preference){.field-home{opacity:0;animation:field-in var(--d-enter) var(--ease-out) forwards}@keyframes field-in{to{opacity:1}}[data-entered] .field-home{opacity:1;animation:none}}.back{margin-bottom:var(--s-5);color:var(--fg-2);font-size:15px;text-decoration:none;display:inline-block}.back:before{content:"← ";color:var(--fg-3)}.back:hover{color:var(--accent)}.page-title{margin-bottom:var(--s-4);font-size:24px;line-height:1.25}.lead{color:var(--fg-2);margin-bottom:var(--s-5)}.lab-stage{width:100cqw;max-width:none;height:clamp(320px,50vh,520px);margin-block:var(--s-6);position:relative;left:calc(50% - 50cqw)}.lab-stage canvas{width:100%;height:100%;position:absolute;inset:0}.lab-mask{width:min(var(--col), 100%);pointer-events:none;opacity:0;outline:1px dashed var(--line);outline-offset:-1px;position:absolute;top:0;bottom:0;left:50%;translate:-50%}.lab-stage[data-masks] .lab-mask{opacity:1}.controls{gap:var(--s-3) var(--s-6);font:400 13px/1.5 var(--mono);color:var(--fg-2);grid-template-columns:repeat(auto-fill,minmax(280px,1fr));display:grid}.controls label{align-items:center;gap:var(--s-3);grid-template-columns:64px 1fr 4ch;display:grid}.controls .check{grid-template-columns:auto 1fr}.controls output{text-align:right;color:var(--fg);font-variant-numeric:tabular-nums}.controls input,.controls select{accent-color:var(--accent);font:inherit;color:var(--fg);border:var(--hair);border-radius:var(--radius);background:0 0;min-width:0;padding:3px 6px}.controls input[type=range]{border:0;height:24px;padding:0}.controls input[type=checkbox]{width:14px;height:14px;margin:0;padding:0}.readout{margin-top:var(--s-5);font:400 13px/1.5 var(--mono);color:var(--fg-3)}.progress{z-index:10;background:var(--accent);transform-origin:0;pointer-events:none;view-transition-name:progress;width:100%;height:1px;position:fixed;top:0;left:0;transform:scaleX(0)}@supports (animation-timeline:scroll()){.progress{animation:linear both progress scroll(root)}@keyframes progress{0%{transform:scaleX(0)}to{transform:scaleX(1)}}}.note-meta{align-items:center;gap:var(--s-3);font:400 13px/1.5 var(--mono);font-variant-numeric:tabular-nums;color:var(--fg-2);margin:calc(var(--s-2) * -1) 0 var(--s-7);display:flex}.updated{margin-top:var(--s-7);font:400 13px/1.5 var(--mono);color:var(--fg-3)}.pager{margin-top:var(--s-6)}.prose{position:relative}.prose>*+*{margin-top:var(--s-4)}.prose h2{margin-top:var(--s-7);font-size:19px;line-height:1.3}.prose h3{color:var(--fg-2);margin-top:var(--s-6);font-size:17px;line-height:1.4}.prose h2+*,.prose h3+*{margin-top:var(--s-3)}.prose ul,.prose ol{max-width:65ch;padding-left:1.4em}.prose li+li{margin-top:var(--s-1)}.prose blockquote{max-width:65ch}.prose hr{border:0;border-top:var(--hair);margin-block:var(--s-7)}.prose strong{font-weight:500}.prose :not(pre)>code{background:var(--bg-2);border-radius:var(--radius);padding:1px 4px}.prose img{border:var(--hair);border-radius:var(--radius)}.prose figure{margin-block:var(--s-5)}.prose figcaption{margin-top:var(--s-2);font:400 13px/1.5 var(--mono);color:var(--fg-2)}.prose table{border-collapse:collapse;width:100%;font-size:15px}.prose th{text-align:left;font:400 13px/1.5 var(--mono);color:var(--fg-2)}.prose th,.prose td{padding:var(--s-2) var(--s-3) var(--s-2) 0;border-top:var(--hair);vertical-align:top}.prose tr:last-child td{border-bottom:var(--hair)}figure.code figcaption{margin:0 0 var(--s-2)}.code-body{position:relative}.prose pre{font:400 14px/1.6 var(--mono);background:var(--bg-2);border:var(--hair);border-radius:var(--radius);padding:var(--s-4);tab-size:2;overflow-x:auto}.prose pre code{font-size:inherit;background:0 0;padding:0}.copy{all:unset;cursor:pointer;top:var(--s-2);right:var(--s-2);font:400 12px/1 var(--mono);color:var(--fg-2);border:var(--hair);border-radius:var(--radius);background:var(--bg-2);opacity:0;transition:opacity var(--d-fast) var(--ease-out), color var(--d-fast) var(--ease-out);padding:6px 8px;position:absolute}.code-body:hover .copy,.copy:focus-visible{opacity:1}.copy:hover{color:var(--accent)}@media (hover:none){.copy{opacity:1}}.sr-only{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.prose sup{line-height:0;position:relative}.prose a[data-footnote-ref]{font:400 11px/1 var(--mono);color:var(--fg-2);margin:0 -3px;padding:6px 4px;text-decoration:none}.prose a[data-footnote-ref]:hover{color:var(--accent)}.footnotes{margin-top:var(--s-8);padding-top:var(--s-5);border-top:var(--hair);color:var(--fg-2);font-size:15px}.footnotes ol{max-width:65ch;padding-left:1.6em}.footnotes li::marker{color:var(--fg-2);font-family:var(--mono);font-size:13px}.footnotes li+li{margin-top:var(--s-2)}.footnotes p{display:inline}.footnotes [data-footnote-backref]{color:var(--fg-3);margin:-6px -3px;padding:6px 4px;text-decoration:none}.page-summary{color:var(--fg-2);margin:calc(var(--s-2) * -1) 0 var(--s-5)}.page-plate{margin-bottom:var(--s-7)}.lab-demo{margin-top:var(--s-7)}button.link{all:unset;cursor:pointer;text-decoration:underline 1px;text-decoration-color:var(--accent);text-underline-offset:3px;transition:color var(--d-fast) var(--ease-out)}button.link:hover{color:var(--accent)}.sound{all:unset;cursor:pointer;color:var(--fg-3);font-family:var(--sans);transition:color var(--d-fast) var(--ease-out);margin:0 -4px;padding:0 4px}.sound:hover,.sound[data-on]{color:var(--accent)}.palette{width:min(480px, calc(100cqw - 2 * var(--gutter)));border:var(--hair);border-radius:var(--radius);background:var(--bg);color:var(--fg);font:400 15px/1.5 var(--sans);margin:20vh auto 0;padding:0}.palette::backdrop{background:color-mix(in srgb, var(--bg) 70%, transparent)}.palette:focus-visible{outline:none}.palette input{all:unset;box-sizing:border-box;width:100%;padding:var(--s-3) var(--s-4);font:400 17px/1.5 var(--sans);border-bottom:var(--hair);display:block}.palette input::placeholder{color:var(--fg-3)}.p-list{max-height:min(50vh,420px);padding-block:var(--s-2);flex-direction:column;display:flex;overflow-y:auto}.p-list.flat .p-group{display:contents}.p-list.flat .p-head{display:none}.p-list.flat .p-item{display:grid}.p-head{padding:var(--s-2) var(--s-4) var(--s-1);font:400 12px/1.5 var(--mono);color:var(--fg-3)}.p-item{cursor:pointer;align-items:baseline;gap:var(--s-3);padding:var(--s-2) var(--s-4);grid-template-columns:1fr auto;display:grid;position:relative}.p-item[aria-selected=true]{background:var(--bg-2)}.p-item[aria-selected=true]:before{content:"";left:0;top:var(--s-2);bottom:var(--s-2);background:var(--accent);width:2px;position:absolute}.p-kind{font:400 12px/1.5 var(--mono);color:var(--fg-3)}.p-item[data-current] .p-label:after{content:"";background:var(--accent);width:6px;height:6px;margin-left:var(--s-2);vertical-align:1px;border-radius:50%;display:inline-block}@media (prefers-reduced-motion:no-preference){.palette[open]{transition:opacity var(--d-fast) var(--ease-out), transform var(--d-fast) var(--ease-out)}@starting-style{.palette[open]{opacity:0;transform:scale(.98)}}}.page-title+.lead+.section{margin-top:var(--s-6)}.footer-meta,.updated,.readout,.p-head,.p-kind,.intro .version{color:var(--fg-2)}@media (prefers-reduced-motion:reduce){:not(.progress),:not(.progress):before,:not(.progress):after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.row:hover .row-arrow{transform:none}[data-theme=oled] .theme svg{transform:rotate(180deg)}}.theme,.sound{place-items:center;min-width:24px;min-height:24px;display:inline-grid}@media print{.field,.palette,.progress,.skip,.footer-meta,.copy,.frame:before,.frame:after,main:before,main:after,.stripe{display:none!important}a{text-decoration-color:currentColor}.prose a[href^=http]:after{content:" (" attr(href) ")";font:400 12px var(--mono);color:var(--fg-2)}}.plate-note{font:400 13px/1.5 var(--mono);color:var(--fg-2);margin-left:var(--s-2)}
