:root{--brand:#f4645f;--brand-ink:#c8514c;--brand-deep:#a8403c;--brand-tint:#ffeceb;--brand-line:#f3b6b3;--ink:#16202c;--ink-2:#3c4a5b;--ink-3:#6c7d92;--ink-4:#95a5b8;--paper:#fff;--paper-2:#f4f6fa;--paper-3:#e8edf4;--night:#16202c;--night-2:#1c2733;--night-3:#24303e;--night-line:hsla(0,0%,100%,.12);--night-line-2:hsla(0,0%,100%,.2);--on-night:#cbd7e3;--on-night-2:#8496ab;--on-night-brand:#f88b87;--line:#dbe2ec;--line-2:#b8c5d4;--ok:#7fa63f;--warn:#d9992f;--warn-ink:#7a5a14;--warn-face:#fdf6e7;--warn-line:#edd6a3;--bd:2px;--bd-lead:3px;--r-1:10px;--r-2:16px;--r-3:24px;--r-4:32px;--r-5:40px;--pill:999px;--sans:"Nunito","Segoe UI",Helvetica,Arial,sans-serif;--mono:"JetBrains Mono",Menlo,Consolas,monospace;--ease:cubic-bezier(.22,1,.36,1);--col:1180px;--pad:24px;--grid:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Ccircle cx='1.5' cy='1.5' r='1.5' fill='%2316202c' fill-opacity='.085'/%3E%3C/svg%3E");--grid-night:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Ccircle cx='1.5' cy='1.5' r='1.5' fill='%23fff' fill-opacity='.06'/%3E%3C/svg%3E")}*,:after,:before{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:96px}body{background:var(--paper);color:var(--ink-2);font-family:var(--sans);font-size:16.5px;line-height:1.62;margin:0;-webkit-font-smoothing:antialiased;overflow-x:hidden}h1,h2,h3,h4{color:var(--ink);font-weight:800;letter-spacing:-.022em;line-height:1.14;margin:0}ol,p,ul{margin:0}ol,ul{list-style:none;padding:0}img,svg{display:block;max-width:100%}pre{margin:0}code,kbd,pre{font-family:var(--mono);font-feature-settings:"liga" 0,"calt" 0;font-variant-ligatures:none}button{background:none;border:0;color:inherit;cursor:pointer;font:inherit}a{color:var(--brand-ink);text-decoration:none;transition:color .18s var(--ease)}a:hover{color:var(--brand)}::selection{background:var(--brand);color:#fff}:focus-visible{border-radius:var(--r-1);outline:var(--bd) solid var(--brand);outline-offset:3px}:where(p,li,.lede,.anno,.panel__bar,.note,.rows__name,.figure em,.caveat div) code{background:rgba(22,32,44,.06);border-radius:7px;color:var(--ink);font-size:.86em;padding:.12em .4em}.band--night :where(p,li,.lede,.anno,.panel__bar,.note) code,.console :where(p,li) code,.panel--night :where(p,li,.anno,.panel__bar) code{background:hsla(0,0%,100%,.1);color:#fff}.hold{margin:0 auto;max-width:var(--col);padding:0 var(--pad);width:100%}.band{padding:96px 0 150px;position:relative}.band--night{padding-top:150px}.band--paper{background:var(--paper)}.band--soft{background:var(--paper-2);background-image:var(--grid)}.band--sunk{background:var(--paper-3)}.band--night{background:var(--night);background-image:var(--grid-night);color:var(--on-night)}.band--night h2,.band--night h3{color:#fff}.wave{left:0;line-height:0;pointer-events:none;position:absolute;right:0;z-index:1}.wave svg{display:block;height:auto;width:100%}.wave--in{top:-1px}.wave--out{bottom:-1px}.band>.hold{position:relative;z-index:2}.chapter{align-items:center;color:var(--brand-ink);display:inline-flex;font-family:var(--mono);font-size:12.5px;font-weight:700;gap:10px;letter-spacing:.12em;margin-bottom:16px;text-transform:uppercase}.chapter:before{background:var(--brand);border-radius:var(--pill);content:"";height:var(--bd);width:26px}.band--night .chapter{color:var(--on-night-brand)}.head{margin-bottom:44px;max-width:720px}.head--mid{margin-left:auto;margin-right:auto;text-align:center}.head--mid .chapter:before{display:none}.title{font-size:clamp(30px,3.8vw,44px)}.lede{font-size:18px;margin-top:14px;max-width:62ch}.band--night .lede{color:var(--on-night-2)}.head--mid .lede{margin-left:auto;margin-right:auto}.note{align-items:center;color:var(--ink-3);display:flex;flex-wrap:wrap;font-family:var(--mono);font-size:12.5px;gap:6px 14px}.band--night .note{color:var(--on-night-2)}.duo{align-items:stretch;display:grid;gap:22px;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.duo--lead{grid-template-columns:minmax(0,1.32fr) minmax(0,1fr)}.duo--trail{grid-template-columns:minmax(0,1fr) minmax(0,1.32fr)}.trio{grid-template-columns:repeat(3,minmax(0,1fr))}.stack,.trio{display:grid;gap:22px}.stack{align-content:start;grid-template-columns:minmax(0,1fr)}.stack--tight{gap:14px}@media (max-width:960px){.duo,.duo--lead,.duo--trail,.trio{grid-template-columns:minmax(0,1fr)}}.rail{display:none;flex-direction:column;gap:2px;left:22px;position:fixed;top:50%;transform:translateY(-50%);z-index:60}@media (min-width:1420px){.rail{display:flex}}.rail a{align-items:center;color:var(--ink-4);display:flex;font-family:var(--mono);font-size:11.5px;gap:12px;padding:5px 0;transition:color .2s var(--ease)}.rail a:before{background:var(--line-2);border-radius:var(--pill);content:"";height:var(--bd);transition:width .25s var(--ease),background-color .25s var(--ease);width:16px}.rail a span{opacity:0;transition:opacity .2s var(--ease)}.rail:hover a span{opacity:1}.rail a:hover{color:var(--ink-2)}.rail a.is-here{color:var(--brand-ink)}.rail a.is-here span{opacity:1}.rail a.is-here:before{background:var(--brand);width:32px}.rail.on-night a{color:var(--on-night-2)}.rail.on-night a:before{background:var(--on-night-2)}.rail.on-night a.is-here{color:#fff}.rail.on-night a.is-here:before{background:var(--brand)}.top{background:var(--paper);border-bottom:var(--bd) solid transparent;position:sticky;top:0;transition:border-color .2s var(--ease);z-index:70}.top.is-off{border-bottom-color:var(--line)}.top__in{gap:18px;height:76px}.brand,.top__in{align-items:center;display:flex}.brand{color:var(--ink);font-size:20px;font-weight:800;gap:11px;margin-right:auto}.brand img{height:32px;width:32px}.brand b{background:var(--brand);border-radius:var(--pill);color:#fff;font-family:var(--mono);font-size:12px;font-weight:700;padding:2px 10px}.brand:hover{color:var(--brand-ink)}.menu{align-items:center;display:flex;gap:10px}.menu .act.is-here{border-color:var(--brand);color:var(--brand-ink)}.menu .act.is-here:hover{background:var(--paper);border-color:var(--night);color:var(--brand-ink)}@media (max-width:560px){.top__in{gap:12px}.menu{gap:8px}.menu .act{font-size:13.5px;height:36px;line-height:32px;padding:0 14px}.brand{font-size:17px;gap:8px}.brand img{height:26px;width:26px}}.act{align-items:center;background:var(--paper);border:var(--bd) solid var(--ink);border-radius:var(--pill);color:var(--ink);display:inline-flex;font-size:16px;font-weight:800;gap:9px;height:50px;justify-content:center;line-height:46px;padding:0 26px;transition:background-color .18s var(--ease),color .18s var(--ease),border-color .18s var(--ease);white-space:nowrap}.act:hover{background:var(--ink);color:#fff}.act--brand{border-color:var(--brand)}.act--brand,.act--brand:hover{background:var(--brand);color:#fff}.act--brand:hover{border-color:var(--night)}.act--quiet{border-color:var(--line-2)}.act--quiet:hover{background:var(--paper);border-color:var(--night);color:var(--ink)}.act--sm{font-size:14.5px;height:40px;line-height:36px;padding:0 18px}.band--night .act{background:transparent;border-color:var(--night-line-2);color:#fff}.band--night .act:hover{background:#fff;border-color:#fff;color:var(--ink)}.band--night .act--brand{background:var(--brand);border-color:var(--brand)}.band--night .act--brand:hover{background:#fff;color:var(--ink)}.more{align-items:center;display:inline-flex;font-family:var(--mono);font-size:13.5px;font-weight:500;gap:6px}.more:after{content:"→";transition:transform .18s var(--ease)}.more:hover:after{transform:translateX(3px)}.band--night .more{color:var(--on-night-brand)}.panel{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--r-4);overflow:hidden}.panel--soft{background:var(--paper-2);border-color:var(--line)}.panel--night{background:var(--night-2);border-color:var(--night);color:var(--on-night)}.band--night .panel--night{border-color:var(--night-line)}.panel__bar{align-items:center;background:var(--paper);border-bottom:var(--bd) solid var(--line);color:var(--ink-3);display:flex;flex-wrap:wrap;font-family:var(--mono);font-size:12.5px;gap:6px 14px;padding:14px 22px}.panel__bar b{color:var(--ink);font-weight:700}.panel__bar .push{margin-left:auto}.panel__bar--foot{border-bottom:0;border-top:var(--bd) solid var(--line)}.panel--soft>.panel__bar{background:var(--paper-2)}.panel--night>.panel__bar{background:var(--night-2);border-bottom-color:var(--night-line);color:var(--on-night-2)}.panel--night>.panel__bar b{color:#fff}.panel--night>.panel__bar--foot{border-top-color:var(--night-line)}.panel__body{padding:24px 26px}.panel h3{font-size:18px;margin-bottom:8px}.panel p{font-size:15.5px}.panel--night p{color:var(--on-night-2)}.duo--lead>.panel,.duo--trail>.panel,.duo>.panel,.stack>.panel,.trio>.panel{display:flex;flex-direction:column}.panel>.code:last-child{flex:1}.panel>.rows{align-content:stretch;flex:1}.band--night .panel p{color:var(--on-night-2)}.fact{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--r-3);padding:22px 24px}.fact--flat{background:var(--paper-2);border-color:transparent}.fact__tag{color:var(--brand-ink);display:inline-block;font-family:var(--mono);font-size:12px;font-weight:700;letter-spacing:.06em;margin-bottom:8px}.fact h3{font-size:17px;margin-bottom:6px}.fact p{font-size:15px}.band--night .fact{background:hsla(0,0%,100%,.045);border-color:var(--night-line)}.band--night .fact--flat{background:hsla(0,0%,100%,.045);border-color:transparent}.band--night .fact p{color:var(--on-night-2)}.band--night .fact__tag{color:var(--on-night-brand)}.code{background:var(--night);color:var(--on-night);display:block;font-size:13.4px;line-height:1.78;overflow-x:auto;padding:22px 24px;tab-size:4;white-space:pre}.code--sm{font-size:12.8px;padding:18px 20px}.code--fill{height:100%}.code--paper{background:var(--paper-2);color:var(--ink)}.panel--soft .code--paper{background:var(--paper-3)}.code::-webkit-scrollbar{height:8px}.code::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.18);border-radius:var(--pill)}.code--paper::-webkit-scrollbar-thumb{background:var(--line-2)}.c-cm{color:#61758a;font-style:italic}.c-dir{color:#f4645f;font-weight:700}.c-tok{color:#e5b06b}.c-cap{color:#7fb6ea}.c-rule{color:#63cbbd;font-weight:700}.c-str{color:#a4c97a}.c-var{color:#d3a4ea}.c-kw{color:#f4645f}.c-cls{color:#7fb6ea}.c-fn{color:#e6cf76}.c-num{color:#e4956f}.c-op{color:#8ba0b6}.c-re{color:#b8c6d6}.code--paper .c-cm{color:#7d8a99}.code--paper .c-op{color:#5c6b7c}.code--paper .c-str{color:#43701f}.code--paper .c-cap{color:#22608f}.code--paper .c-rule{color:#0f7768}.code--paper .c-num{color:#a8551f}.code--paper .c-dir,.code--paper .c-kw{color:var(--brand-ink)}.hl-gutter{color:hsla(0,0%,100%,.26);margin-right:18px;user-select:none;-webkit-user-select:none}.code--paper .hl-gutter{color:var(--ink-4)}.anatomy{background:var(--night);color:var(--on-night);overflow-x:auto;padding:30px 26px 26px}.anatomy__line{display:flex;font-family:var(--mono);font-size:16px;white-space:pre}.part{align-items:flex-start;display:flex;flex-direction:column}.part__text{padding-bottom:6px}.part__leg{border-bottom:var(--bd) solid var(--night-line-2);border-bottom-left-radius:10px;border-left:var(--bd) solid var(--night-line-2);height:16px;width:100%}.part--mark .part__leg{border-color:hsla(2,87%,66%,.6)}.anno{color:var(--on-night-2);font-family:var(--mono);font-size:11.5px;line-height:1.5;padding-right:14px;padding-top:8px;white-space:normal;width:158px}.part--mark .anno{color:var(--on-night-brand)}.part--wide .anno{width:300px}.rr{overflow-x:auto;padding:16px 0 10px}.rr svg{min-width:460px}.rr-line{fill:none;stroke:var(--line-2);stroke-width:var(--bd);stroke-linecap:round}.rr-line--loop{stroke-dasharray:4 7}.rr-dot{fill:var(--line-2)}.rr-node rect{stroke-width:var(--bd)}.rr-node--token rect{fill:var(--paper-2);stroke:var(--line-2)}.rr-node--token text{fill:var(--ink)}.rr-node--rule rect{fill:var(--brand-tint);stroke:var(--brand)}.rr-node--rule text{fill:var(--brand-deep)}.rr-node--skip rect{fill:var(--paper);stroke:var(--line-2);stroke-dasharray:6 5}.rr-node--skip text{fill:var(--ink-3)}.rr-node text{font-size:14px;dominant-baseline:middle}.rr-cap,.rr-node text{font-family:var(--mono);text-anchor:middle}.rr-cap{fill:var(--ink-4)}.legend,.rr-cap{font-size:11.5px}.legend{color:var(--ink-3);display:flex;flex-wrap:wrap;font-family:var(--mono);gap:8px 20px;padding:4px 24px 20px}.legend i{border-radius:6px;display:inline-block;height:11px;margin-right:7px;vertical-align:-1px;width:18px}.legend .i-rule{background:var(--brand-tint);border:var(--bd) solid var(--brand)}.legend .i-token{background:var(--paper-2);border:var(--bd) solid var(--line-2)}.legend .i-skip{background:var(--paper);border:var(--bd) dashed var(--line-2)}.chips{align-items:flex-end;display:flex;flex-wrap:wrap;gap:10px}.chip{align-items:center;background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--r-2);display:inline-flex;flex-direction:column;gap:3px;padding:8px 14px}.chip b{color:var(--ink);font-size:15px;font-weight:500}.chip b,.chip span{font-family:var(--mono)}.chip span{color:var(--ink-4);font-size:10.5px}.chip--hidden{background:transparent;border-style:dashed}.chip--hidden b{color:var(--ink-4)}.chip--nest{align-items:stretch;border-color:var(--line-2);padding:8px 8px 10px}.chip__inner{background:var(--paper-2);border-radius:var(--r-1);display:flex;gap:6px;margin-top:6px;padding:7px 8px}.chip__inner em{align-items:center;background:var(--paper);border-radius:9px;color:var(--ink);display:inline-flex;flex-direction:column;font-family:var(--mono);font-size:12px;font-style:normal;padding:2px 8px}.chip__inner em i{color:var(--ink-4);font-size:9.5px;font-style:normal}.tabs{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:24px}.tab{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--pill);color:var(--ink-2);font-family:var(--mono);font-size:13.5px;padding:10px 20px;transition:border-color .18s var(--ease),background-color .18s var(--ease),color .18s var(--ease)}.tab:hover{border-color:var(--line-2);color:var(--ink)}.tab.is-on{background:var(--brand);border-color:var(--brand);color:#fff}.band--night .tab{background:transparent;border-color:var(--night-line);color:var(--on-night-2)}.band--night .tab:hover{border-color:var(--night-line-2);color:#fff}.band--night .tab.is-on{background:var(--brand);border-color:var(--brand);color:#fff}[data-view][hidden]{display:none!important}.stages{align-content:start;display:grid;gap:12px;grid-template-columns:minmax(0,1fr)}.stage{background:transparent;border:var(--bd) solid var(--night-line);border-radius:var(--r-2);color:var(--on-night);display:block;padding:15px 18px;text-align:left;transition:border-color .18s var(--ease),background-color .18s var(--ease)}.stage:hover{background:hsla(0,0%,100%,.035);border-color:var(--night-line-2)}.stage.is-on{background:hsla(2,87%,66%,.14);border-color:var(--brand)}.stage__in{align-items:center;display:grid;gap:14px;grid-template-columns:34px minmax(0,1fr)}.stage__no{border:var(--bd) solid var(--night-line);border-radius:50%;color:var(--on-night-2);display:block;font-family:var(--mono);font-size:12.5px;height:34px;line-height:30px;text-align:center;width:34px}.stage.is-on .stage__no{background:var(--brand);border-color:var(--brand);color:#fff}.stage strong{color:#fff;display:block;font-size:15.5px}.stage span{color:var(--on-night-2);display:block;font-size:14px}.console{background:var(--night-2);border:var(--bd) solid var(--night-line);border-radius:var(--r-3);overflow:hidden}.console__bar{align-items:center;border-bottom:var(--bd) solid var(--night-line);color:var(--on-night-2);display:flex;font-family:var(--mono);font-size:12px;gap:10px;padding:12px 20px}.console__bar:before{background:var(--ok);border-radius:50%;content:"";height:8px;width:8px}.console__out{color:var(--on-night);display:block;font-size:13.2px;line-height:1.85;overflow-x:auto;padding:20px 22px;white-space:pre}.d-err{color:var(--brand)}.d-err,.d-warn{font-weight:700}.d-warn{color:#dfa03a}.d-note{color:#63a4dd}.d-msg,.d-note{font-weight:700}.d-msg{color:#fff}.d-bar{color:#4d6076}.d-file{color:#7fb6ea}.d-src{color:#bccadb}.d-hit{color:var(--brand);font-weight:700}.d-hit-warn{color:#dfa03a;font-weight:700}.d-dim{color:#728799;font-style:italic}.d-ok{color:#93bd4f;font-weight:700}[data-s=phplrt4]{--s:#f4645f}[data-s=phplrt3]{--s:#a8403c}[data-s=phpstan]{--s:#2a78d6}[data-s=psalm]{--s:#199e8f}[data-s=hoa]{--s:#4a3aa7}.xy{padding:26px 30px 10px}.xy svg{height:auto;overflow:visible;width:100%}.xy-grid{fill:none;stroke:var(--line);stroke-width:1.5}.xy-axis,.xy-guide{fill:none;stroke:var(--line-2);stroke-width:2}.xy-guide{stroke-dasharray:7 8;stroke-linecap:round}.xy-tick{font-family:var(--mono);font-size:13px;fill:var(--ink-3);font-variant-numeric:tabular-nums}.xy-line{fill:none;stroke:var(--s);stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}.xy-line--lead{stroke-width:4}.xy-dot{fill:var(--s);stroke:var(--paper);stroke-width:2}.xy-lbl{font-family:var(--mono);font-size:13.5px;font-weight:700;fill:var(--ink-2)}.xy-lbl--lead{fill:var(--brand-ink)}.xy-hit{fill:none;stroke:transparent;stroke-width:14;stroke-linejoin:round;pointer-events:stroke}@media (hover:hover){:is(.xy,.legend--xy) [data-s]{transition:opacity .18s var(--ease)}.panel:has(.xy):has([data-s=hoa]:hover) [data-s]:not([data-s=hoa]),.panel:has(.xy):has([data-s=phplrt3]:hover) [data-s]:not([data-s=phplrt3]),.panel:has(.xy):has([data-s=phplrt4]:hover) [data-s]:not([data-s=phplrt4]),.panel:has(.xy):has([data-s=phpstan]:hover) [data-s]:not([data-s=phpstan]),.panel:has(.xy):has([data-s=psalm]:hover) [data-s]:not([data-s=psalm]){opacity:.15}}.legend--xy i{background:var(--s);border:0;border-radius:var(--pill);height:5px;vertical-align:2px}.legend--xy .is-guide i{background:none;border-radius:0;border-top:var(--bd) dashed var(--line-2);height:0}.tv{overflow-x:auto;padding:4px 0 0}.tv table{border-collapse:collapse;font-family:var(--mono);font-size:13.5px;width:100%}.tv td,.tv th{padding:13px 18px;text-align:right;white-space:nowrap}.tv thead th{color:var(--ink-3);font-size:12px;font-weight:500}.tv tbody th,.tv th:first-child,.tv thead th:first-child{text-align:left}.tv tbody th{color:var(--ink);font-weight:500;padding-left:30px}.tv tbody td{color:var(--ink-2);font-variant-numeric:tabular-nums}.tv tbody tr+tr td,.tv tbody tr+tr th{border-top:var(--bd) solid var(--line)}.tv tbody th i{background:var(--s);border-radius:var(--pill);display:inline-block;height:5px;margin-right:10px;vertical-align:3px;width:14px}.tv .tv-k,.tv tbody .is-self th{font-weight:700}.tv .tv-k{color:var(--ink)}.tv .tv-k--bad{color:var(--warn-ink)}.rows{display:grid;grid-template-columns:minmax(0,1fr)}.rows__row{align-items:center;display:grid;gap:18px;grid-template-columns:minmax(0,1fr) minmax(0,.95fr) auto;padding:15px 22px 15px 32px;position:relative}.rows__row+.rows__row{border-top:var(--bd) solid var(--line)}.rows__row.is-self:before{background:var(--brand);border-radius:var(--pill);bottom:16px;content:"";left:16px;position:absolute;top:16px;width:4px}.rows__name{color:var(--ink);font-family:var(--mono);font-size:14px;min-width:0;overflow-wrap:anywhere}.rows__name em{color:var(--ink-3);display:block;font-family:var(--sans);font-size:13px;font-style:normal}.is-self .rows__name{color:var(--brand-ink);font-weight:700}.meter{border-radius:var(--pill);display:block;height:12px;overflow:hidden}.meter,.panel--soft .meter{background:var(--paper-3)}.meter i{background:var(--line-2);border-radius:var(--pill);display:block;height:100%;transition:width .8s var(--ease);width:0}.is-self .meter i{background:var(--brand)}.rows__row[data-s] .meter i,.rows__row[data-s].is-self:before{background:var(--s)}.rows__num{color:var(--ink);font-family:var(--mono);font-size:14px;font-weight:700;text-align:right;white-space:nowrap}.is-self .rows__num{color:var(--brand-ink)}.rows__num em{color:var(--ink-4);display:inline-block;font-size:12px;font-style:normal;font-weight:500;margin-left:8px}@media (max-width:720px){.rows__row{grid-template-columns:minmax(0,1fr) auto}.rows__row .meter{display:none}}.caveat{background:var(--warn-face);border:var(--bd) solid var(--warn-line);border-radius:var(--r-3);color:var(--warn-ink);display:flex;font-size:15px;gap:14px;padding:18px 22px}.caveat b{color:#5e4310}.caveat>b:first-child{color:var(--warn);font-size:18px;line-height:1.4}.caveat code{background:rgba(122,90,20,.1);color:var(--warn-ink)}.figure{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--r-3);padding:24px;text-align:center}.figure b{color:var(--brand);font-size:34px;letter-spacing:-.03em;line-height:1.2}.figure b,.figure span{display:block;font-weight:800}.figure span{color:var(--ink);font-size:14.5px}.figure em{color:var(--ink-3);display:block;font-size:13px;font-style:normal;margin-top:6px}.mig{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--r-4);overflow:hidden}.mig__head,.mig__row{align-items:center;display:grid;gap:0;grid-template-columns:minmax(0,1fr) 64px minmax(0,1fr)}.mig__head{background:var(--paper-2);color:var(--ink-3);font-family:var(--mono);font-size:12px;font-weight:700;letter-spacing:.1em;padding:14px 26px;text-transform:uppercase}.mig__head span:last-child{color:var(--brand-ink)}.mig__row{padding:6px 26px;transition:background-color .18s var(--ease)}.mig__head+.mig__row,.mig__row+.mig__row{border-top:var(--bd) solid var(--line)}.mig__row:hover{background:var(--paper-2)}.mig__row>*{padding:12px 0}.mig__was{color:var(--ink-3);font-size:13.5px;overflow-wrap:anywhere}.mig__to,.mig__was{font-family:var(--mono)}.mig__to{color:var(--line-2);font-size:15px;justify-self:center;transition:transform .18s var(--ease),color .18s var(--ease)}.mig__row:hover .mig__to{color:var(--brand);transform:translateX(4px)}.mig__now{color:var(--ink);font-family:var(--mono);font-size:13.5px;font-weight:500;overflow-wrap:anywhere}.mig__now b{color:var(--brand-ink);font-weight:700}.mig__row--gone .mig__now{color:var(--ink-3);font-family:var(--sans);font-size:14.5px}@media (max-width:820px){.mig__head{display:none}.mig__row{grid-template-columns:minmax(0,1fr);padding:10px 22px}.mig__row>*{padding:4px 0}.mig__to{justify-self:start;transform:rotate(90deg)}.mig__row:hover .mig__to{transform:rotate(90deg) translateX(4px)}}.lanes{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--r-4);display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);overflow:hidden}.lane{display:flex;flex-direction:column;padding:28px}.lane+.lane{border-left:var(--bd) solid var(--line)}@media (max-width:860px){.lanes{grid-template-columns:minmax(0,1fr)}.lane+.lane{border-left:0;border-top:var(--bd) solid var(--line)}}.lane__tag{align-items:center;color:var(--ink-3);display:flex;font-family:var(--mono);font-size:12px;gap:12px;letter-spacing:.1em;margin-bottom:10px;text-transform:uppercase;white-space:nowrap}.lane__tag:after{border-top:var(--bd) dashed var(--line-2);content:"";flex:1;height:0}.lane--ships .lane__tag{color:var(--brand-ink)}.lane--ships .lane__tag:after{border-radius:var(--pill);border-top:var(--bd) solid var(--brand)}.lane h3{font-size:20px;margin-bottom:8px}.lane>p{font-size:15.5px}.pkgs{display:grid;gap:8px;grid-template-columns:minmax(0,1fr);margin:18px 0}.pkg{align-items:baseline;background:var(--paper-2);border-radius:var(--r-2);display:flex;flex-wrap:wrap;gap:4px 12px;padding:10px 16px}.pkg code{color:var(--ink);font-size:13px;font-weight:500}.pkg span{color:var(--ink-3);font-size:13.5px}.pkg--extra{background:none;box-shadow:inset 0 0 0 var(--bd) var(--line)}.lane .code--paper{border-radius:var(--r-3);margin-top:auto;padding:18px 20px}.hero{background:var(--paper-2);background-image:var(--grid);padding:70px 0 130px;position:relative}.hero__in{align-items:center;display:grid;gap:44px;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}@media (max-width:1000px){.hero{padding:54px 0 110px}.hero__in{gap:32px;grid-template-columns:minmax(0,1fr)}}.hero__badge{align-items:center;background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--pill);color:var(--ink-2);display:inline-flex;font-family:var(--mono);font-size:12.5px;gap:10px;margin-bottom:22px;padding:5px 16px 5px 6px;transition:border-color .18s var(--ease),color .18s var(--ease)}.hero__badge:hover{border-color:var(--brand);color:var(--ink)}.hero__badge b{background:var(--brand);border-radius:var(--pill);color:#fff;font-size:11.5px;padding:2px 11px}.hero h1{font-size:clamp(38px,5.2vw,62px);letter-spacing:-.035em;line-height:1.04}.hero h1 em{color:var(--brand);font-style:normal}.hero__lede{font-size:18.5px;margin-top:20px;max-width:48ch}.hero__acts{display:flex;flex-wrap:wrap;gap:12px;margin-top:28px}.cmd{align-items:stretch;background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--pill);display:flex;margin-top:22px;max-width:460px;overflow:hidden}.cmd code{align-items:center;color:var(--ink);display:flex;flex:1;font-size:14.5px;overflow-x:auto;padding:12px 22px;white-space:nowrap}.cmd button{border-left:var(--bd) solid var(--line);color:var(--ink-2);font-family:var(--mono);font-size:13px;padding:0 20px;transition:background-color .18s var(--ease),color .18s var(--ease)}.cmd button:hover{background:var(--ink);color:#fff}.cmd button.is-done{background:var(--ok);color:#fff}.band--night .cmd{background:var(--night);border-color:var(--night-line-2)}.band--night .cmd code{color:#fff}.band--night .cmd button{border-left-color:var(--night-line-2);color:var(--on-night)}.band--night .cmd button:hover{background:#fff;color:var(--ink)}.specs{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--pill);display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:52px;overflow:hidden}.specs div{align-items:center;color:var(--ink-2);display:flex;font-family:var(--mono);font-size:13.5px;gap:9px;justify-content:center;padding:16px 18px;text-align:center}.specs div+div{border-left:var(--bd) solid var(--line)}.specs i{background:var(--brand);border-radius:50%;flex:none;height:7px;width:7px}@media (max-width:860px){.specs{border-radius:var(--r-4);grid-template-columns:repeat(2,minmax(0,1fr))}.specs div:nth-child(3){border-left:0}.specs div:nth-child(3),.specs div:nth-child(4){border-top:var(--bd) solid var(--line)}}@media (max-width:460px){.specs{grid-template-columns:minmax(0,1fr)}.specs div+div{border-left:0;border-top:var(--bd) solid var(--line)}}.closing{background:var(--night);background-image:var(--grid-night);color:var(--on-night);padding:160px 0 96px;position:relative;text-align:center}.closing h2{color:#fff;font-size:clamp(30px,4vw,46px);margin:0 auto;max-width:20ch}.closing p{color:var(--on-night-2);font-size:18px;margin:16px auto 0;max-width:56ch}.closing .cmd{margin:30px auto 0}.closing__acts{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:20px}.foot{background:var(--night-2);color:var(--on-night-2);font-size:14.5px;padding:32px 0}.foot__in{align-items:center;gap:14px 26px;justify-content:space-between}.foot nav,.foot__in{display:flex;flex-wrap:wrap}.foot nav{gap:8px 20px}.foot a{color:var(--on-night);font-family:var(--mono);font-size:13px}.foot a:hover{color:var(--brand)}.js .rise{opacity:0;transform:translateY(14px);transition:opacity .5s var(--ease),transform .5s var(--ease)}.js .rise.is-in{opacity:1;transform:none}.js :is(.head,.hero__lead,.specs,.trio,.duo,.stack,.lanes).rise{--seq:70ms;opacity:1;transform:none;transition:none}.js :is(.head,.hero__lead,.specs,.trio,.duo,.stack,.lanes).rise>*{opacity:0;transform:translateY(14px);transition:opacity .5s var(--ease),transform .5s var(--ease)}.js :is(.head,.hero__lead,.specs,.trio,.duo,.stack,.lanes).rise.is-in>*{opacity:1;transform:none}.js .hero__lead.rise>.hero__badge{transition:opacity .5s var(--ease),transform .5s var(--ease),border-color .18s var(--ease),color .18s var(--ease)}.js :is(.rise>*,.chip,.part,.ch-bar):first-child{--p:0}.js :is(.rise>*,.chip,.part,.ch-bar):nth-child(2){--p:1}.js :is(.rise>*,.chip,.part,.ch-bar):nth-child(3){--p:2}.js :is(.rise>*,.chip,.part,.ch-bar):nth-child(4){--p:3}.js :is(.rise>*,.chip,.part,.ch-bar):nth-child(5){--p:4}.js :is(.rise>*,.chip,.part,.ch-bar):nth-child(6){--p:5}.js :is(.rise>*,.chip,.part,.ch-bar):nth-child(7){--p:6}.js :is(.rise>*,.chip,.part,.ch-bar):nth-child(8){--p:7}.js .rise.is-in>*{transition-delay:calc(var(--p, 0)*var(--seq, 0ms))}.js .head.rise .chapter:before{width:0}.js .head.rise.is-in .chapter:before{transition:width .45s var(--ease) calc(var(--p, 0)*var(--seq, 0ms) + .12s);width:26px}.js .rr-line--draw{stroke-dasharray:1400;stroke-dashoffset:1400}.js .is-in .rr-line--draw{transition:stroke-dashoffset 1.2s var(--ease) .25s;stroke-dashoffset:0}@keyframes rr-draw{0%{stroke-dashoffset:1400}to{stroke-dashoffset:0}}.js .is-swap .rr-line--draw{animation:rr-draw 1.1s var(--ease) both}.js .chip{opacity:0;transform:translateY(6px);transition:opacity .32s var(--ease),transform .32s var(--ease)}.js .is-in .chip{opacity:1;transform:none;transition-delay:calc(.24s + var(--p, 0)*50ms)}.js .part__leg{transform:scaleY(0);transform-origin:top}.js .anno{opacity:0}.js .is-in .part__leg{transform:none;transition:transform .38s var(--ease) calc(.3s + var(--p, 0)*90ms)}.js .is-in .anno{opacity:1;transition:opacity .38s var(--ease) calc(.46s + var(--p, 0)*90ms)}.js .xy-line{stroke-dasharray:1;stroke-dashoffset:1}.js .is-in .xy-line{transition:stroke-dashoffset 1.4s var(--ease);stroke-dashoffset:0}.js .is-in [data-s=hoa] .xy-line{transition-delay:0s}.js .is-in [data-s=psalm] .xy-line{transition-delay:.06s}.js .is-in [data-s=phplrt3] .xy-line{transition-delay:.12s}.js .is-in [data-s=phpstan] .xy-line{transition-delay:.18s}.js .is-in [data-s=phplrt4] .xy-line{transition-delay:.24s}.js :is(.xy-dot,.xy-lbl,.xy-guide){opacity:0}.js .is-in :is(.xy-dot,.xy-lbl,.xy-guide){opacity:1;transition:opacity .5s var(--ease) 1s}.js .ch-bar{transform:scaleY(0);transform-box:fill-box;transform-origin:bottom}.js .is-in .ch-bar{transform:scaleY(1);transition:transform .7s var(--ease) calc(var(--p, 0)*70ms)}.js .mig.rise{--seq:60ms}.js .mig .mig__row{opacity:0;transition:opacity .45s var(--ease)}.js .mig.is-in .mig__row{opacity:1;transition-delay:calc(var(--p, 0)*var(--seq, 0ms))}@keyframes swap-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.js [data-view].is-swap{animation:swap-in .28s var(--ease) both}@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}html{scroll-behavior:auto}.js :is(.rise,.rise>*,.chip,.anno,.xy-dot,.xy-lbl,.xy-guide,.mig__row){opacity:1!important;transform:none!important}.js :is(.part__leg,.ch-bar){transform:none!important}.js .head.rise .chapter:before{width:26px!important}.js :is(.rr-line--draw,.xy-line){stroke-dashoffset:0!important}}@media (max-width:720px){:root{--pad:18px}.band{padding:70px 0 110px}.panel__body{padding:20px}.lane{padding:22px}}.docs{--side:268px;--gap:56px;--head:78px;--lead:40px;background:var(--paper)}.docs__in{display:grid;gap:var(--gap);grid-template-columns:var(--side) minmax(0,1fr);max-width:1360px;padding-bottom:96px;padding-top:var(--lead)}.docs__side-in{display:flex;flex-direction:column;max-height:calc(100vh - var(--head) - var(--lead) - 24px);position:sticky;top:calc(var(--head) + var(--lead))}.docs__side-in>.find{flex:none}.docs__side-in>.nav{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding-right:8px}.docs__side-in>.nav::-webkit-scrollbar{width:8px}.docs__side-in>.nav::-webkit-scrollbar-thumb{background:var(--line);border-radius:var(--pill)}.docs__side-in>.nav::-webkit-scrollbar-thumb:hover{background:var(--line-2)}.docs__body{min-width:0}.find{margin-bottom:26px;position:relative}.find__field{align-items:center;background:var(--paper-2);border:var(--bd) solid var(--line);border-radius:var(--r-2);display:flex;gap:10px;padding:0 14px;transition:border-color .18s var(--ease),background-color .18s var(--ease)}.find__field:focus-within{background:var(--paper);border-color:var(--brand)}.find__icon{color:var(--ink-4);flex:none}.find__field:focus-within .find__icon{color:var(--brand-ink)}.find__field input{background:none;border:0;color:var(--ink);font-family:var(--mono);font-size:13px;outline:0;padding:11px 0;width:100%}.find__field input::placeholder{color:var(--ink-4)}.find__field input::-webkit-search-cancel-button{display:none}.find__out{background:var(--paper);border:var(--bd) solid var(--line);border-radius:var(--r-2);left:0;max-height:60vh;overflow-y:auto;padding:6px;position:absolute;right:0;top:calc(100% + 8px);z-index:40}.find__hit{border-radius:var(--r-1);color:var(--ink-2);display:block;padding:9px 11px}.find__hit:focus-visible,.find__hit:hover{background:var(--paper-2);color:var(--ink)}.find__hit b{color:var(--ink);display:block;font-size:14.5px;font-weight:700;line-height:1.4}.find__hit b span{background:none;color:var(--brand-ink)}.find__hit i{color:var(--ink-4);display:block;font-family:var(--mono);font-size:11.5px;font-style:normal;margin-top:2px}.find__note{color:var(--ink-3);font-size:14px;padding:12px;text-align:center}.find__note--bad{color:var(--brand-ink)}.nav__group+.nav__group{margin-top:4px}.nav__title{align-items:center;color:var(--ink-4);display:flex;font-family:var(--mono);font-size:11.5px;gap:8px;letter-spacing:.04em;padding:8px 0;text-transform:lowercase;transition:color .18s var(--ease);width:100%}.nav__title:hover{color:var(--ink-2)}.nav__title:after{border-bottom:2px solid;border-right:2px solid;content:"";flex:none;height:7px;margin-left:auto;transform:rotate(45deg) translate(-2px,-2px);transition:transform .2s var(--ease);width:7px}.nav__title[aria-expanded=false]:after{transform:rotate(-45deg) translate(-1px,1px)}.nav__list{overflow:hidden}.nav__group.is-shut .nav__list{display:none}.nav__list a{color:var(--ink-2);display:block;font-size:14.5px;line-height:1.45;padding:6px 0 6px 16px;position:relative;transition:color .18s var(--ease)}.nav__list a:before{background:var(--line);border-radius:var(--pill);content:"";height:15px;left:0;margin-top:-7.5px;position:absolute;top:50%;transition:background-color .2s var(--ease),height .2s var(--ease);width:var(--bd)}.nav__list a:hover{color:var(--ink)}.nav__list a:hover:before{background:var(--line-2)}.nav__list a.is-here{color:var(--brand-ink);font-weight:700}.nav__list a.is-here:before{background:var(--brand);height:22px;margin-top:-11px}.nav__out:after{color:var(--ink-4);content:"↗";font-size:.85em;margin-left:5px}.prose{color:var(--ink-2);font-size:16.5px;line-height:1.72}.prose>:first-child{margin-top:0}.prose h1,.prose h2,.prose h3,.prose h4{color:var(--ink);font-weight:800;letter-spacing:-.022em;line-height:1.16;scroll-margin-top:96px}.prose h1{font-size:clamp(30px,4vw,40px);margin:0 0 18px}.prose h2{border-top:var(--bd) solid var(--line);font-size:clamp(23px,2.6vw,28px);margin:56px 0 16px;padding-top:26px}.prose h3{font-size:19px;margin:38px 0 12px}.prose h4{font-size:16.5px;margin:28px 0 10px}.prose p{margin:0 0 18px}.prose a{color:var(--brand-ink);text-decoration:underline;text-decoration-color:var(--brand-line);text-decoration-thickness:1px;text-underline-offset:3px}.prose a:hover{color:var(--brand);text-decoration-color:currentColor}.prose strong{color:var(--ink);font-weight:700}.prose ol,.prose ul{list-style:disc;margin:0 0 18px;padding-left:22px}.prose ol{list-style:decimal}.prose li{margin:7px 0}.prose li::marker{color:var(--ink-4)}.prose img{border-radius:var(--r-2);margin:26px 0}.prose hr{background:var(--line);border:0;border-radius:var(--pill);height:var(--bd);margin:46px 0}.prose h1,.prose h2,.prose h3,.prose h4{position:relative}.documentation-anchor{bottom:0;left:-.85em;position:absolute;scroll-margin-top:110px;text-decoration:none}.documentation-anchor:before{color:var(--brand);content:"#";font-weight:400;opacity:0;transition:opacity .18s var(--ease)}.documentation-anchor:focus-visible:before,.prose h1:hover .documentation-anchor:before,.prose h2:hover .documentation-anchor:before,.prose h3:hover .documentation-anchor:before,.prose h4:hover .documentation-anchor:before{opacity:1}.prose .code{border-radius:var(--r-2);margin:0 0 22px}.prose blockquote{border-left:var(--bd-lead) solid var(--brand);color:var(--ink-3);margin:0 0 22px;padding:2px 0 2px 20px}.prose blockquote p:last-child{margin-bottom:0}.prose table{border:var(--bd) solid var(--line);border-collapse:separate;border-radius:var(--r-2);border-spacing:0;font-size:15px;margin:0 0 22px;overflow:hidden;width:100%}.prose thead{background:var(--paper-2)}.prose th{color:var(--ink);font-weight:700;padding:11px 16px;text-align:left}.prose td{border-top:var(--bd) solid var(--line);padding:11px 16px;vertical-align:top}.docs__toggle{background:var(--brand);border-radius:var(--pill);bottom:20px;box-shadow:0 6px 22px rgba(22,32,44,.22);color:#fff;display:none;font-size:14px;font-weight:700;padding:12px 20px;position:fixed;right:20px;z-index:70}.docs__toggle[aria-expanded=true]{background:var(--ink)}@media (max-width:1000px){.docs__in{gap:0;grid-template-columns:minmax(0,1fr)}.docs__toggle{display:block}.docs__side{background:var(--paper);border-right:var(--bd) solid var(--line);inset:0 auto 0 0;padding:20px;position:fixed;transform:translateX(-102%);transition:transform .28s var(--ease);visibility:hidden;width:min(320px,86vw);z-index:65}.docs__side.is-open{transform:none;visibility:visible}.docs__side-in{height:100%;max-height:100%;position:static}.docs__side-in>.nav{padding-bottom:76px}}@media (max-width:620px){.docs__in{padding-top:26px}.prose{font-size:16px}.prose h2{margin-top:42px}.documentation-anchor:before{content:none}.prose table{display:block;overflow-x:auto}}@media (prefers-reduced-motion:reduce){.docs__side{transition:none}}