@font-face{font-family:figtree;font-style:normal;font-weight:300 900;font-display:swap;src:url(/fonts/figtree-latin-wght-normal.woff2?v=5.3.0)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:figtree;font-style:normal;font-weight:300 900;font-display:swap;src:url(/fonts/figtree-latin-ext-wght-normal.woff2?v=5.3.0)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:ibm plex mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-400-normal.woff2?v=5.3.0)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:ibm plex mono;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-600-normal.woff2?v=5.3.0)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:ibm plex mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-mono-latin-ext-400-normal.woff2?v=5.3.0)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}:root{--bg:oklch(0.966 0.002 331);--sf:oklch(1 0 0);--sf2:oklch(0.986 0.003 331);--sf3:oklch(0.938 0.002 331);--ln:oklch(0.918 0.004 331);--ln2:oklch(0.845 0.007 331);--ink:oklch(0.30 0.013 331);--ink2:oklch(0.47 0.011 331);--ink3:oklch(0.545 0.010 331);--brand:oklch(0.376 0.012 331);--on-brand:oklch(0.98 0.004 331);--mark:oklch(0.849 0.173 98);--mark-soft:oklch(0.968 0.055 98);--mark-ink:oklch(0.42 0.085 84);--ok:oklch(0.575 0.105 155);--ok-soft:oklch(0.958 0.030 155);--bad:oklch(0.545 0.170 22);--bad-soft:oklch(0.960 0.028 22);--stage:oklch(0.40 0.075 255);--stage-soft:oklch(0.955 0.022 255);--shadow:0 1px 2px oklch(0.30 0.013 331 / .05), 0 8px 24px oklch(0.30 0.013 331 / .07);--shadow-lg:0 2px 4px oklch(0.30 0.013 331 / .05), 0 18px 48px oklch(0.30 0.013 331 / .12);--font-ui:"Figtree", system-ui, -apple-system, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, monospace;--r-chip:6px;--r-control:8px;--r-panel:14px;--measure:1200px;--gutter:max(24px, calc((100vw - var(--measure)) / 2));color-scheme:light}:root[data-theme=dark]{--bg:oklch(0.185 0.007 331);--sf:oklch(0.222 0.008 331);--sf2:oklch(0.248 0.009 331);--sf3:oklch(0.290 0.004 331);--ln:oklch(0.300 0.010 331);--ln2:oklch(0.375 0.012 331);--ink:oklch(0.955 0.004 331);--ink2:oklch(0.760 0.009 331);--ink3:oklch(0.640 0.011 331);--brand:oklch(0.86 0.010 331);--on-brand:oklch(0.20 0.010 331);--mark-soft:oklch(0.315 0.055 98);--mark-ink:oklch(0.86 0.140 92);--ok:oklch(0.720 0.105 155);--ok-soft:oklch(0.285 0.040 155);--bad:oklch(0.680 0.150 22);--bad-soft:oklch(0.295 0.048 22);--stage:oklch(0.72 0.11 255);--stage-soft:oklch(0.27 0.045 255);--shadow:0 1px 2px oklch(0 0 0 / .3), 0 8px 24px oklch(0 0 0 / .3);--shadow-lg:0 2px 4px oklch(0 0 0 / .3), 0 18px 48px oklch(0 0 0 / .45);color-scheme:dark}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:oklch(0.185 0.007 331);--sf:oklch(0.222 0.008 331);--sf2:oklch(0.248 0.009 331);--sf3:oklch(0.290 0.004 331);--ln:oklch(0.300 0.010 331);--ln2:oklch(0.375 0.012 331);--ink:oklch(0.955 0.004 331);--ink2:oklch(0.760 0.009 331);--ink3:oklch(0.640 0.011 331);--brand:oklch(0.86 0.010 331);--on-brand:oklch(0.20 0.010 331);--mark-soft:oklch(0.315 0.055 98);--mark-ink:oklch(0.86 0.140 92);--ok:oklch(0.720 0.105 155);--ok-soft:oklch(0.285 0.040 155);--bad:oklch(0.680 0.150 22);--bad-soft:oklch(0.295 0.048 22);--stage:oklch(0.72 0.11 255);--stage-soft:oklch(0.27 0.045 255);--shadow:0 1px 2px oklch(0 0 0 / .3), 0 8px 24px oklch(0 0 0 / .3);--shadow-lg:0 2px 4px oklch(0 0 0 / .3), 0 18px 48px oklch(0 0 0 / .45);color-scheme:dark}}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:84px}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.6 var(--font-ui);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4{margin:0;line-height:1.15;letter-spacing:-.022em;text-wrap:balance}p{margin:0;text-wrap:pretty}a{color:inherit}img,svg{max-width:100%}code,kbd,pre{font-family:var(--font-mono);letter-spacing:-.012em}:focus-visible{outline:2px solid var(--ink);outline-offset:2px;border-radius:4px}.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.ic{width:1.15em;height:1.15em;flex:none;vertical-align:-.18em}.wm{display:inline-flex;align-items:baseline;gap:.02em;color:var(--ink);font-size:22px;line-height:1;font-weight:700;letter-spacing:-.03em;text-decoration:none}.wm-k{height:.7em;width:.66em;flex:none}.wm-lockup{display:inline-flex;flex-direction:column;align-items:flex-start;gap:.2em;color:var(--ink)}.wm-by{height:.19em;width:1.4em;min-height:11px;min-width:82px;opacity:.8}.top{position:sticky;top:0;z-index:20;height:64px;padding:0 var(--gutter);display:flex;align-items:center;gap:20px;background:color-mix(in oklch,var(--bg) 86%,transparent);backdrop-filter:saturate(1.4)blur(12px);border-bottom:1px solid var(--ln)}.top-home{display:inline-flex;align-items:baseline;gap:10px;text-decoration:none}.top-tag{font-size:14px;font-weight:500;color:var(--ink3)}.top-nav{display:flex;align-items:center;gap:4px;margin-left:auto}.top-link{padding:7px 12px;border-radius:var(--r-control);font-size:15px;font-weight:500;color:var(--ink2);text-decoration:none;white-space:nowrap}.top-link:hover{color:var(--ink);background:var(--sf3)}.top-link[aria-current]{color:var(--ink)}.iconbtn{width:36px;height:36px;display:inline-grid;place-items:center;padding:0;border:0;border-radius:var(--r-control);background:0 0;color:var(--ink2);font:inherit;cursor:pointer}.iconbtn:hover{color:var(--ink);background:var(--sf3)}.theme-dark{display:none}:root[data-theme=dark] .theme-dark{display:block}:root[data-theme=dark] .theme-light{display:none}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .theme-dark{display:block}:root:not([data-theme=light]) .theme-light{display:none}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:46px;padding:0 22px;border-radius:10px;border:1px solid var(--ln2);background:var(--sf);color:var(--ink);font:600 16px var(--font-ui);text-decoration:none;white-space:nowrap;cursor:pointer}.btn:hover{border-color:var(--ink3)}.btn-primary{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}.btn-primary:hover{border-color:var(--brand);filter:brightness(1.12)}.foot{margin-top:96px;padding:40px var(--gutter)48px;border-top:1px solid var(--ln);display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:24px;color:var(--ink3);font-size:14px}.foot .wm{font-size:28px}.foot-links{display:flex;flex-wrap:wrap;gap:6px 22px}.foot-links a{color:var(--ink2);text-decoration:none}.foot-links a:hover{color:var(--ink);text-decoration:underline;text-decoration-color:var(--mark);text-underline-offset:4px;text-decoration-thickness:2px}@media(max-width:640px){.top{gap:8px;height:56px}.top-tag{display:none}.top-link{padding:7px 8px}.top-link.wide{display:none}}.mo{font-family:var(--font-mono)}.lead{font-size:19px;line-height:1.55;color:var(--ink2)}.search-open{display:inline-flex;align-items:center;gap:10px;height:38px;min-width:260px;margin-left:12px;padding:0 10px 0 12px;border:1px solid var(--ln2);border-radius:var(--r-control);background:var(--sf);color:var(--ink3);font:14px var(--font-ui);cursor:pointer}.search-open:hover{border-color:var(--ink3);color:var(--ink2)}.search-open span{flex:1;text-align:left}.search-open kbd{padding:1px 7px;border:1px solid var(--ln2);border-radius:5px;font-size:12px;color:var(--ink3)}.search-open-lg{height:52px;width:min(560px,100%);margin:0;font-size:17px;border-radius:12px;padding:0 14px 0 18px;box-shadow:var(--shadow)}.search{width:min(720px,calc(100vw - 32px));max-height:min(78vh,760px);margin-top:9vh;padding:18px 20px 20px;border:1px solid var(--ln2);border-radius:var(--r-panel);background:var(--sf);color:var(--ink);box-shadow:var(--shadow-lg)}.search::backdrop{background:oklch(.2 .01 331/.45);backdrop-filter:blur(2px)}.search-close{display:flex;justify-content:flex-end;margin:-8px -10px 2px 0}.search{--pagefind-ui-scale:0.9;--pagefind-ui-primary:var(--ink);--pagefind-ui-text:var(--ink);--pagefind-ui-background:var(--sf);--pagefind-ui-border:var(--ln2);--pagefind-ui-tag:var(--sf3);--pagefind-ui-border-width:1px;--pagefind-ui-border-radius:8px;--pagefind-ui-font:var(--font-ui)}.search mark{background:var(--mark-soft);color:var(--mark-ink);border-radius:3px;padding:0 2px}.shell{display:grid;grid-template-columns:250px minmax(0,1fr)220px;gap:clamp(28px,4vw,64px);padding:0 var(--gutter);align-items:start}.side-col,.toc-col{position:sticky;top:64px;max-height:calc(100vh - 64px);overflow-y:auto;padding:36px 0 48px}.side-fold{display:none}.side{display:grid;gap:26px;font-size:15px}.side-head{display:block;margin-bottom:8px;font-weight:700;color:var(--ink);text-decoration:none}.side ul{list-style:none;margin:0;padding:0;border-left:1px solid var(--ln2)}.side li a{display:block;margin-left:-1px;padding:5px 0 5px 16px;border-left:2px solid transparent;color:var(--ink2);text-decoration:none}.side li a:hover{color:var(--ink);border-left-color:var(--ln2)}.side li a[aria-current]{color:var(--ink);font-weight:600;border-left-color:var(--mark)}.side-head[aria-current]{text-decoration:underline;text-decoration-color:var(--mark);text-decoration-thickness:2px;text-underline-offset:5px}.toc{font-size:14px}.toc>p{margin-bottom:10px;font-weight:700}.toc ul{list-style:none;margin:0;padding:0}.toc ul ul{padding-left:14px}.toc a{display:block;padding:4px 0;color:var(--ink3);text-decoration:none}.toc a:hover{color:var(--ink)}.doc{padding:40px 0 0;min-width:0}.prose{max-width:46em;font-size:17px;line-height:1.65}.prose>*+*{margin-top:1.1em}.crumb{font-size:14px;font-weight:600;margin:0 0 10px}.crumb a{color:var(--ink3);text-decoration:none}.crumb a:hover{color:var(--ink)}.prose h1{font-size:clamp(32px,3.6vw,44px);font-weight:700;letter-spacing:-.032em}.prose h2{margin-top:2.2em;padding-top:.2em;font-size:26px;font-weight:700}.prose h3{margin-top:1.8em;font-size:20px;font-weight:700}.prose a{color:var(--ink);text-decoration:underline;text-decoration-color:var(--ln2);text-decoration-thickness:1.5px;text-underline-offset:4px}.prose a:hover{text-decoration-color:var(--mark);text-decoration-thickness:2px}.prose ul,.prose ol{padding-left:1.3em;margin-bottom:0}.prose li+li{margin-top:.35em}.prose li::marker{color:var(--ink3)}.prose :not(pre)>code{padding:.12em .38em;border-radius:5px;background:var(--sf3);font-size:.86em;overflow-wrap:anywhere}.code{position:relative}.prose pre{margin:0;padding:16px 18px;overflow-x:auto;border:1px solid var(--ln);border-radius:10px;background:var(--sf);font-size:14px;line-height:1.6;tab-size:2}.copy{position:absolute;top:8px;right:8px;height:28px;padding:0 10px;border:1px solid var(--ln2);border-radius:6px;background:var(--sf2);color:var(--ink2);font:500 12px var(--font-ui);cursor:pointer;opacity:0}.code:hover .copy,.copy:focus-visible{opacity:1}.chroma .c,.chroma .c1,.chroma .cm{color:var(--ink3);font-style:italic}.chroma .k,.chroma .kd,.chroma .nb,.chroma .nt{color:var(--stage)}.chroma .s,.chroma .s1,.chroma .s2{color:var(--ok)}.chroma .nv,.chroma .na{color:var(--mark-ink)}.prose table{width:100%;border-collapse:collapse;font-size:16px;display:block;overflow-x:auto}.prose th{text-align:left;font-size:14px;color:var(--ink3);font-weight:600}.prose th,.prose td{padding:9px 14px 9px 0;border-bottom:1px solid var(--ln);vertical-align:top}.prose kbd{padding:1px 6px;border:1px solid var(--ln2);border-bottom-width:2px;border-radius:5px;font-size:.82em;background:var(--sf)}.shot{margin:1.6em 0}.shot img{display:block;width:100%;height:auto;border:1px solid var(--ln2);border-radius:10px;box-shadow:var(--shadow)}.shot figcaption{margin-top:10px;font-size:14px;color:var(--ink3)}.callout{padding:14px 18px 16px;border:1px solid var(--ln);border-left:3px solid var(--ink3);border-radius:4px 10px 10px 4px;background:var(--sf)}.callout>*+*{margin-top:.5em}.callout-head{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700}.callout-warning{border-left-color:var(--mark);background:var(--mark-soft);border-color:transparent;border-left-color:var(--mark)}.callout-warning .callout-head{color:var(--mark-ink)}.index{list-style:none;padding:0!important;margin-top:1.6em;display:grid;gap:10px}.index li{margin:0!important}.index a{display:grid;gap:2px;padding:14px 18px;border:1px solid var(--ln);border-radius:10px;background:var(--sf);text-decoration:none}.index a:hover{border-color:var(--ink3)}.index span{color:var(--ink2);font-size:15px}.pager{display:grid;grid-template-columns:1fr 1fr;gap:14px;max-width:46em;margin-top:64px;padding-top:24px;border-top:1px solid var(--ln)}.pager a{display:grid;gap:2px;padding:14px 18px;border:1px solid var(--ln);border-radius:10px;background:var(--sf);text-decoration:none;font-weight:600}.pager a:hover{border-color:var(--ink3)}.pager small{font-weight:400;color:var(--ink3);font-size:13px}.pager-next{text-align:right}.home{padding:clamp(48px,7vw,96px)var(--gutter)0}.home-head{display:grid;gap:20px;max-width:760px}.home-head h1{font-size:clamp(40px,5vw,64px);font-weight:700;letter-spacing:-.038em}.doors{list-style:none;margin:clamp(40px,5vw,64px)0 0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}.doors>li{display:grid;grid-template-rows:auto 1fr;background:var(--sf);border:1px solid var(--ln);border-radius:var(--r-panel);overflow:hidden}.door{display:grid;gap:8px;padding:26px 26px 20px;text-decoration:none}.door:hover h2{text-decoration:underline;text-decoration-color:var(--mark);text-decoration-thickness:2px;text-underline-offset:5px}.door-ic{width:44px;height:44px;display:grid;place-items:center;margin-bottom:8px;border-radius:12px;background:var(--sf3);font-size:19px}.door h2{font-size:22px;font-weight:700}.door p{color:var(--ink2)}.door-pages{list-style:none;margin:0;padding:14px 26px 20px;border-top:1px solid var(--ln);display:grid;gap:6px;align-content:start;font-size:15px}.door-pages a{color:var(--ink2);text-decoration:none}.door-pages a:hover{color:var(--ink);text-decoration:underline;text-decoration-color:var(--mark);text-underline-offset:4px}.home-prose{margin-top:56px}@media(max-width:1100px){.shell{grid-template-columns:230px minmax(0,1fr)}.toc-col{display:none}}@media(max-width:820px){.shell{grid-template-columns:minmax(0,1fr);gap:0}.side-col{display:none}.side-fold{display:block;margin-top:16px;border:1px solid var(--ln);border-radius:10px;background:var(--sf)}.side-fold summary{display:flex;align-items:center;gap:8px;padding:12px 16px;font-weight:600;cursor:pointer;list-style:none}.side-fold summary::-webkit-details-marker{display:none}.side-fold .side{padding:6px 16px 18px}.doc{padding-top:24px}.doors{grid-template-columns:minmax(0,1fr)}.search-open:not(.search-open-lg){min-width:0;margin-left:0}.search-open:not(.search-open-lg) span,.search-open:not(.search-open-lg) kbd{display:none}.copy{opacity:1}}