/* luap.in tokens — shared with the AppSec Handbook */
:root{
  --bg:#f5f6f6; --surface:#ffffff; --surface-2:#eceeee; --surface-3:#e3e6e6;
  --fg:#0f1314; --fg-2:#394142; --muted:#636d6d; --faint:#8b9393;
  --line:#dde1e1; --line-2:#c7cdcd;
  --accent:#0a6a63; --accent-fg:#ffffff; --accent-soft:#e1efec; --accent-line:#9dcdc6;
  --bad:#a32317; --bad-soft:#fbe9e6; --bad-line:#e6b4ab;
  --good:#16693f; --good-soft:#e1f1e7; --good-line:#a6d3b8;
  --warn:#89590a; --warn-soft:#faf0da; --warn-line:#e0c58c;
  --code-bg:#f4f6f6; --code-line:#e1e5e5;
  --sx-key:#8a2f6b; --sx-str:#1b6a49; --sx-num:#95480a; --sx-com:#7a8484;
  --sx-fn:#0b5a90; --sx-type:#0a6a63; --sx-attr:#6a4a98;
  --shadow:0 1px 2px rgba(10,20,20,.05),0 8px 28px rgba(10,20,20,.10);
  --shadow-lg:0 2px 6px rgba(10,20,20,.07),0 24px 64px rgba(10,20,20,.18);
  --sans:'Instrument Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,sans-serif;
  --serif:'Literata','Iowan Old Style',Georgia,serif;
  --mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --r:4px; --r-lg:6px; --rail:258px; --toc:196px; --bar:48px;
}
:root[data-theme="dark"],
:root:not([data-theme="light"]) :is(.dk){--x:0}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){
  --bg:#0a0c0d; --surface:#111415; --surface-2:#181c1d; --surface-3:#212626;
  --fg:#e9eded; --fg-2:#c3cbcb; --muted:#8a9595; --faint:#6c7676;
  --line:#222828; --line-2:#333a3a;
  --accent:#4ec5b8; --accent-fg:#052220; --accent-soft:#102e2b; --accent-line:#1e4a45;
  --bad:#ff9b8b; --bad-soft:#291613; --bad-line:#4a2520;
  --good:#74d49c; --good-soft:#0f2619; --good-line:#1d4330;
  --warn:#e4bc72; --warn-soft:#261e11; --warn-line:#44361c;
  --code-bg:#0c1011; --code-line:#1e2424;
  --sx-key:#e58fc3; --sx-str:#86d9a8; --sx-num:#ecb07a; --sx-com:#6e7a7a;
  --sx-fn:#7cc2f0; --sx-type:#5bcdbf; --sx-attr:#c4a6f0;
  --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 28px rgba(0,0,0,.45);
  --shadow-lg:0 2px 8px rgba(0,0,0,.5),0 28px 70px rgba(0,0,0,.6);
  color-scheme:dark;
}}
:root[data-theme="dark"]{
  --bg:#0a0c0d; --surface:#111415; --surface-2:#181c1d; --surface-3:#212626;
  --fg:#e9eded; --fg-2:#c3cbcb; --muted:#8a9595; --faint:#6c7676;
  --line:#222828; --line-2:#333a3a;
  --accent:#4ec5b8; --accent-fg:#052220; --accent-soft:#102e2b; --accent-line:#1e4a45;
  --bad:#ff9b8b; --bad-soft:#291613; --bad-line:#4a2520;
  --good:#74d49c; --good-soft:#0f2619; --good-line:#1d4330;
  --warn:#e4bc72; --warn-soft:#261e11; --warn-line:#44361c;
  --code-bg:#0c1011; --code-line:#1e2424;
  --sx-key:#e58fc3; --sx-str:#86d9a8; --sx-num:#ecb07a; --sx-com:#6e7a7a;
  --sx-fn:#7cc2f0; --sx-type:#5bcdbf; --sx-attr:#c4a6f0;
  --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 28px rgba(0,0,0,.45);
  --shadow-lg:0 2px 8px rgba(0,0,0,.5),0 28px 70px rgba(0,0,0,.6);
  color-scheme:dark;
}

*{box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:calc(var(--bar) + 16px);scrollbar-gutter:stable}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important;animation:none!important}}
body{margin:0;background:var(--bg);color:var(--fg);font-family:var(--sans);
  font-size:15px;line-height:1.62;-webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;font-variant-numeric:tabular-nums;font-kerning:normal}
body.lock{overflow:hidden}
::selection{background:var(--accent-soft);color:var(--fg)}
h1,h2,h3,h4{margin:0;line-height:1.18;text-wrap:balance;font-weight:600}
p{margin:0}
code,kbd{font-family:var(--mono);font-size:.875em}
a{color:var(--accent);text-decoration-thickness:1px;text-underline-offset:2px}
button{font:inherit;color:inherit}
:where(a,button,summary,input,[tabindex]):focus-visible{outline:2px solid var(--accent);
  outline-offset:2px;border-radius:2px}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:8px;border:3px solid var(--bg)}
*::-webkit-scrollbar-thumb:hover{background:var(--faint)}

/* ============ top bar ============ */
.top{position:fixed;inset:0 0 auto;z-index:60;height:var(--bar);
  background:color-mix(in srgb,var(--bg) 88%,transparent);
  backdrop-filter:saturate(1.6) blur(12px);-webkit-backdrop-filter:saturate(1.6) blur(12px);
  border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;
  padding-left:max(14px,env(safe-area-inset-left,0px));
  padding-right:max(14px,env(safe-area-inset-right,0px))}
.mk{font-family:var(--mono);font-size:10.5px;font-weight:500;letter-spacing:.11em;
  text-transform:uppercase;color:var(--faint);white-space:nowrap;text-decoration:none;flex:none}
.mk b{color:var(--fg);font-weight:600}
.mk:hover b{color:var(--accent)}
.burger{display:none;flex:none;width:30px;height:28px;align-items:center;justify-content:center;
  border:1px solid var(--line);background:var(--surface);border-radius:var(--r);cursor:pointer}
.burger svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round}
.sbtn{display:flex;align-items:center;gap:8px;height:28px;padding:0 10px;
  flex:0 1 250px;margin-left:auto;justify-content:space-between;
  border:1px solid var(--line);background:var(--surface);border-radius:var(--r);
  font-size:12.5px;color:var(--muted);cursor:pointer;min-width:0}
.sbtn:hover{border-color:var(--line-2);color:var(--fg)}
.sbtn span{display:flex;align-items:center;gap:7px;overflow:hidden;white-space:nowrap;min-width:0}
.sbtn i{font-style:normal;overflow:hidden;text-overflow:ellipsis}
.sbtn svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.7;flex:none}
kbd.hint{font-family:var(--mono);font-size:10px;color:var(--faint);border:1px solid var(--line);
  border-radius:3px;padding:1px 5px;background:var(--surface-2);flex:none}
.ctl{display:inline-flex;align-items:center;justify-content:center;height:28px;
  padding:0 10px;flex:none;border:1px solid var(--line);background:var(--surface);
  border-radius:var(--r);font-size:12.5px;font-weight:500;cursor:pointer;color:var(--muted)}
.ctl:hover{border-color:var(--line-2);background:var(--surface-2);color:var(--fg)}
.ctl.icon{width:28px;padding:0}
.ctl svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round}
.pbar{position:fixed;left:0;right:0;top:var(--bar);height:2px;z-index:59;pointer-events:none}
.pbar i{display:block;height:100%;width:0;background:var(--accent);transition:width .1s linear}

/* ============ shell ============ */
.shell{display:grid;grid-template-columns:var(--rail) minmax(0,1fr) var(--toc);
  gap:0;max-width:1440px;margin:0 auto;padding-top:var(--bar)}
@media (max-width:1180px){.shell{grid-template-columns:var(--rail) minmax(0,1fr)}
  .toc-col{display:none}}
@media (max-width:900px){.shell{grid-template-columns:minmax(0,1fr)}}

/* rail */
.rail{position:sticky;top:var(--bar);align-self:start;height:calc(100vh - var(--bar));
  overflow-y:auto;border-right:1px solid var(--line);padding:20px 14px 40px;
  padding-left:max(14px,env(safe-area-inset-left,0px))}
@media (max-width:900px){
  .rail{position:fixed;top:var(--bar);left:0;bottom:0;width:min(84vw,var(--rail));
    background:var(--surface);z-index:55;transform:translateX(-102%);
    transition:transform .18s ease;box-shadow:var(--shadow-lg)}
  .rail.open{transform:none}
  .burger{display:flex}
  .scrim{position:fixed;inset:var(--bar) 0 0;background:rgba(0,0,0,.35);z-index:54}
}
.rgroup{margin-bottom:22px}
.rgroup .rt{font-family:var(--mono);font-size:10px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--faint);padding:0 10px;margin-bottom:8px}
.rail a{display:grid;grid-template-columns:22px 1fr;gap:8px;align-items:baseline;
  padding:7px 10px;border-radius:var(--r);text-decoration:none;color:var(--fg-2);
  font-size:13.5px;line-height:1.4}
.rail a:hover{background:var(--surface-2);color:var(--fg)}
.rail a[aria-current="page"]{background:var(--accent-soft);color:var(--accent);font-weight:600}
.rail a .rn{font-family:var(--mono);font-size:10.5px;color:var(--faint)}
.rail a[aria-current="page"] .rn{color:var(--accent)}
.rail .sub{display:none;padding:2px 0 6px 30px;border-left:1px solid var(--line);
  margin:0 0 4px 20px}
.rail a[aria-current="page"]+.sub{display:block}
.rail .sub a{display:block;font-size:12.5px;padding:4px 8px;color:var(--muted)}
.rail .sub a:hover{color:var(--accent);background:none}
.rail .sub a.on{color:var(--accent);font-weight:600}

/* content */
.doc{min-width:0;padding:34px 40px 70px}
@media (max-width:900px){.doc{padding:26px max(18px,env(safe-area-inset-left,0px)) 60px}}
.doc>.inner{max-width:74ch}

/* toc */
.toc-col{position:sticky;top:var(--bar);align-self:start;height:calc(100vh - var(--bar));
  overflow-y:auto;padding:34px 14px 40px;
  padding-right:max(14px,env(safe-area-inset-right,0px))}
.toc-col .rt{font-family:var(--mono);font-size:10px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--faint);margin-bottom:10px}
.toc-col a{display:block;font-size:12.5px;line-height:1.45;color:var(--muted);
  text-decoration:none;padding:5px 0 5px 11px;border-left:2px solid var(--line)}
.toc-col a:hover{color:var(--fg);border-color:var(--line-2)}
.toc-col a.on{color:var(--accent);border-color:var(--accent);font-weight:600}

/* ============ page head ============ */
.kick{font-family:var(--mono);font-size:10.5px;font-weight:500;letter-spacing:.11em;
  text-transform:uppercase;color:var(--faint);padding-bottom:13px;
  border-bottom:1px solid var(--line);margin-bottom:22px;
  display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap}
.kick a{color:var(--faint);text-decoration:none}
.kick a:hover{color:var(--accent)}
h1{font-size:clamp(27px,4.4vw,38px);letter-spacing:-.033em;line-height:1.05}
.lede{font-family:var(--serif);font-size:clamp(15.5px,1.8vw,17px);line-height:1.58;
  color:var(--fg-2);max-width:62ch;margin-top:18px}
.lede em{font-style:italic;color:var(--fg)}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(122px,1fr));gap:1px;
  margin-top:32px;background:var(--line);border:1px solid var(--line);
  border-radius:var(--r-lg);overflow:hidden}
.stat{background:var(--bg);padding:13px 14px}
.stat b{display:block;font-family:var(--mono);font-size:20px;font-weight:500;
  letter-spacing:-.02em;color:var(--fg)}
.stat span{display:block;font-size:11.5px;color:var(--muted);margin-top:3px}

/* ============ prose ============ */
.sec{margin-bottom:44px;scroll-margin-top:calc(var(--bar) + 16px)}
.sec>h2{font-size:clamp(19px,2.6vw,24px);letter-spacing:-.024em;margin-bottom:6px;
  padding-top:14px;border-top:1px solid var(--line);display:flex;gap:11px;align-items:baseline}
.sec>h2 .hn{font-family:var(--mono);font-size:.6em;font-weight:500;color:var(--accent);
  letter-spacing:.04em;flex:none}
.sec>h3{font-size:16.5px;letter-spacing:-.014em;margin:28px 0 8px;
  scroll-margin-top:calc(var(--bar) + 16px)}
.sec>h4{font-size:14.5px;margin:20px 0 7px;color:var(--fg-2)}
.sec p{margin:11px 0;color:var(--fg-2)}
.sec ul,.sec ol{margin:11px 0;padding-left:20px;color:var(--fg-2)}
.sec li{margin-bottom:5px}
.sec :is(li,p,td,dd)>code{background:var(--code-bg);border:1px solid var(--code-line);
  border-radius:3px;padding:.5px 4px;overflow-wrap:anywhere}
.sec strong{color:var(--fg);font-weight:600}
.lead{font-size:16px!important}
.anchor{opacity:0;margin-left:8px;font-size:.72em;color:var(--faint);text-decoration:none;
  transition:opacity .12s}
:is(h2,h3):hover .anchor{opacity:1}

/* ============ code ============ */
.codewrap{position:relative;margin:14px 0}
.codewrap pre{margin:0}
.cpbtn{position:absolute;top:7px;right:7px;font-family:var(--mono);font-size:10px;
  background:var(--surface);border:1px solid var(--line);color:var(--faint);
  border-radius:3px;padding:3px 8px;cursor:pointer;opacity:0;transition:opacity .12s}
.codewrap:hover .cpbtn,.cpbtn:focus-visible{opacity:1}
.cpbtn:hover{color:var(--accent);border-color:var(--accent-line)}
pre{margin:14px 0;font-family:var(--mono);font-size:12.2px;line-height:1.68;
  background:var(--code-bg);border:1px solid var(--code-line);border-radius:var(--r);
  padding:12px 13px;overflow-x:auto}
pre.bad{border-left:2px solid var(--bad)}
pre.good{border-left:2px solid var(--good)}
pre b{font-weight:400;background:var(--warn-soft);border-radius:2px;
  box-shadow:0 0 0 2px var(--warn-soft)}
.k{color:var(--sx-key)}.s{color:var(--sx-str)}.c{color:var(--sx-com)}
.f{color:var(--sx-fn)}.t{color:var(--sx-type)}.nu{color:var(--sx-num)}.a{color:var(--sx-attr)}
.cap{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--faint);margin:16px 0 -4px;display:flex;align-items:center;gap:8px}
.cap.b{color:var(--bad)}.cap.g{color:var(--good)}

/* ============ callouts ============ */
.box{border:1px solid var(--line);border-radius:var(--r-lg);padding:14px 16px;margin:18px 0;
  background:var(--surface)}
.box .bt{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--faint);margin-bottom:7px}
.box p{margin:7px 0}
.box p:first-of-type{margin-top:0}
.box p:last-child{margin-bottom:0}
.box.warn{background:var(--warn-soft);border-color:var(--warn-line)}
.box.warn .bt{color:var(--warn)}
.box.danger{background:var(--bad-soft);border-color:var(--bad-line)}
.box.danger .bt{color:var(--bad)}
.box.ok{background:var(--good-soft);border-color:var(--good-line)}
.box.ok .bt{color:var(--good)}
.box.note{background:var(--accent-soft);border-color:var(--accent-line)}
.box.note .bt{color:var(--accent)}

/* ============ tables ============ */
.tw{overflow-x:auto;margin:16px 0;border:1px solid var(--line);border-radius:var(--r-lg)}
table{border-collapse:collapse;width:100%;font-size:13.2px;min-width:430px}
th{text-align:left;font-family:var(--mono);font-size:10px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--faint);font-weight:500;padding:9px 12px;
  border-bottom:1px solid var(--line);background:var(--surface-2);white-space:nowrap}
td{padding:9px 12px;border-bottom:1px solid var(--line);color:var(--fg-2);vertical-align:top}
tr:last-child td{border-bottom:0}
td code{font-size:11.5px;white-space:nowrap}
.mono td:first-child{font-family:var(--mono);font-size:11.5px;color:var(--fg);white-space:nowrap}

/* ============ steps ============ */
.steps{border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;margin:18px 0}
.step{display:grid;grid-template-columns:34px 1fr;gap:13px;padding:12px 15px;
  background:var(--surface);border-bottom:1px solid var(--line)}
.step:last-child{border-bottom:0}
.step .si{font-family:var(--mono);font-size:11px;color:var(--faint);padding-top:2px}
.step .sc{min-width:0}
.step .sc b{display:block;font-size:13.5px;margin-bottom:3px}
.step .sc b code{font-size:12px;font-weight:500;color:var(--accent);background:none;border:0;padding:0}
.step .sc p{font-size:13px;color:var(--muted);margin:0}
.step .sc p+p{margin-top:6px}
.step.danger{background:var(--bad-soft)}
.step.danger :is(.si,.sc b,.sc b code){color:var(--bad)}
.step.bound{background:var(--accent-soft)}
.step.bound :is(.si,.sc b){color:var(--accent)}

/* ============ byte map ============ */
.bytes{font-family:var(--mono);font-size:12px;overflow-x:auto;margin:16px 0;
  border:1px solid var(--code-line);border-radius:var(--r);background:var(--code-bg)}
.bytes table{min-width:500px;font-size:12px}
.bytes th{background:transparent;border-bottom:1px solid var(--code-line)}
.bytes td{border-bottom:1px solid var(--code-line);padding:6px 12px;font-family:var(--mono)}
.bytes .off{color:var(--faint)}
.bytes .hex{color:var(--sx-num)}
.bytes .mean{color:var(--fg-2);font-family:var(--sans);font-size:12.5px}
.bytes tr.hi td{background:var(--warn-soft)}

/* ============ cards ============ */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(252px,1fr));gap:1px;
  background:var(--line);border:1px solid var(--line);border-radius:var(--r-lg);
  overflow:hidden;margin:22px 0}
.card{background:var(--surface);padding:16px 17px;text-decoration:none;color:inherit;
  display:block;min-width:0}
.card:hover{background:var(--surface-2)}
.card .cn{font-family:var(--mono);font-size:10.5px;color:var(--faint);letter-spacing:.06em;
  margin-bottom:7px}
.card b{display:block;font-size:15px;font-weight:600;letter-spacing:-.012em;margin-bottom:5px}
.card:hover b{color:var(--accent)}
.card span{display:block;font-size:13px;color:var(--muted);line-height:1.5}

/* ============ concept popover ============ */
.term{border-bottom:1px dashed var(--accent-line);cursor:help;color:inherit;
  background:none;border-top:0;border-left:0;border-right:0;padding:0;font:inherit}
.term:hover{border-bottom-style:solid;color:var(--accent)}
.pop{position:absolute;z-index:70;max-width:min(380px,calc(100vw - 32px));
  background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r-lg);
  box-shadow:var(--shadow-lg);padding:13px 15px;font-size:13px;line-height:1.55;
  color:var(--fg-2)}
.pop .pt{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--accent);margin-bottom:6px}
.pop b{color:var(--fg)}
.pop code{background:var(--code-bg);border:1px solid var(--code-line);border-radius:3px;
  padding:.5px 4px;font-size:11.5px}
.pop .more{display:block;margin-top:9px;font-size:12px}

/* ============ self-check ============ */
.check{border:1px solid var(--accent-line);background:var(--accent-soft);
  border-radius:var(--r-lg);margin:22px 0;overflow:hidden}
.check>.ch{display:flex;align-items:center;gap:9px;padding:11px 15px;
  font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--accent)}
.check>.ch svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.8}
.check ol{margin:0;padding:0 15px 13px;list-style:none;counter-reset:q}
.check li{counter-increment:q;margin-bottom:7px}
.check details{background:var(--surface);border:1px solid var(--line);border-radius:var(--r)}
.check summary{cursor:pointer;position:relative;display:block;list-style:none;
  padding:10px 14px 10px 40px;font-size:13.5px;line-height:1.55;color:var(--fg)}
.check summary::-webkit-details-marker{display:none}
.check summary::marker{content:""}
.check summary::before{content:counter(q);position:absolute;left:14px;top:11px;
  font-family:var(--mono);font-size:11px;color:var(--accent)}
.check summary:hover{background:var(--surface-2)}
.check details[open] summary{border-bottom:1px solid var(--line)}
.check .ans{padding:11px 14px 13px 40px;font-size:13px;color:var(--fg-2)}
.check .ans code{background:var(--code-bg);border:1px solid var(--code-line);
  border-radius:3px;padding:.5px 4px;font-size:11.5px}

/* ============ prev / next ============ */
.pn{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;margin-top:46px}
@media (max-width:620px){.pn{grid-template-columns:1fr}}
.pn a{background:var(--surface);padding:14px 16px;text-decoration:none;color:inherit;min-width:0}
.pn a:hover{background:var(--surface-2)}
.pn a em{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--faint);font-style:normal;margin-bottom:5px}
.pn a b{display:block;font-size:14px;font-weight:600}
.pn a:hover b{color:var(--accent)}
.pn a.nx{text-align:right}
.pn a.ph{visibility:hidden}

/* ============ search ============ */
.sdlg{position:fixed;inset:0;z-index:90;display:none;
  padding-top:min(13vh,110px);justify-content:center;
  background:color-mix(in srgb,var(--bg) 55%,rgba(0,0,0,.4))}
.sdlg.open{display:flex}
.spanel{width:min(620px,calc(100vw - 28px));max-height:70vh;display:flex;flex-direction:column;
  background:var(--surface);border:1px solid var(--line-2);border-radius:var(--r-lg);
  box-shadow:var(--shadow-lg);overflow:hidden}
.spanel header{display:flex;align-items:center;gap:9px;padding:0 14px;
  border-bottom:1px solid var(--line);flex:none}
.spanel header svg{width:15px;height:15px;stroke:var(--faint);fill:none;stroke-width:1.8;flex:none}
.spanel input{flex:1;border:0;background:none;outline:none;color:var(--fg);
  font:inherit;font-size:15px;padding:14px 0}
.spanel input::placeholder{color:var(--faint)}
.sres{overflow-y:auto;padding:7px}
.sres a{display:block;padding:9px 11px;border-radius:var(--r);text-decoration:none;color:inherit}
.sres a:hover,.sres a.on{background:var(--surface-2)}
.sres a .sp{font-family:var(--mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--faint);margin-bottom:3px}
.sres a .st{font-size:14px;font-weight:600;color:var(--fg);margin-bottom:2px}
.sres a.on .st{color:var(--accent)}
.sres a .sx{font-size:12.5px;color:var(--muted);line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.sres mark{background:var(--warn-soft);color:var(--fg);border-radius:2px}
.sempty{padding:26px 14px;text-align:center;color:var(--faint);font-size:13.5px}
.spanel footer{border-top:1px solid var(--line);padding:8px 14px;display:flex;gap:14px;
  font-family:var(--mono);font-size:10.5px;color:var(--faint);flex:none;flex-wrap:wrap}

.sitefoot{border-top:1px solid var(--line);margin-top:46px;padding-top:22px;
  display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;
  font-family:var(--mono);font-size:11px;color:var(--faint)}
.sitefoot a{color:var(--faint);text-decoration:none}
.sitefoot a:hover{color:var(--accent)}


/* ---- overflow hardening ---- */
.doc .inner,.sec,.sec p,.sec li,.box,.box p,.step .sc,.step .sc p,
.check summary,.check .ans,.card span,.pop{min-width:0;overflow-wrap:break-word}
.check summary code,.check .ans code,.box code,.step code,.pop code{
  overflow-wrap:anywhere}
.sec :is(h2,h3,h4){overflow-wrap:break-word}

/* ---- narrow screens ---- */
@media (max-width:620px){
  :root{--bar:46px}
  .doc{padding:20px max(16px,env(safe-area-inset-left,0px)) 52px}
  .check summary{padding:10px 12px 10px 34px;font-size:13px}
  .check summary::before{left:11px}
  .check .ans{padding:10px 12px 12px 34px;font-size:12.5px}
  .check ol{padding:0 12px 12px}
  .box{padding:12px 13px}
  .step{grid-template-columns:26px 1fr;gap:10px;padding:11px 12px}
  pre{font-size:11.4px;padding:10px 11px}
  .stats{grid-template-columns:repeat(auto-fit,minmax(104px,1fr))}
  .stat b{font-size:18px}
  .sbtn{flex:0 0 auto;width:28px;padding:0;justify-content:center}
  .sbtn span{gap:0}
  .sbtn i,.sbtn kbd{display:none}
  .sbtn span{gap:0}
  .cpbtn{opacity:1}
}
@media (max-width:380px){
  .mk{font-size:9.5px}
  pre{font-size:10.8px}
}


/* ---- catalogue pane: let wide code scroll inside the pane, not widen it ---- */
.pane,.codes,.cw,.notes,.note2{min-width:0}
.codes>*{min-width:0}
.pane pre{max-width:100%}
.item .api{min-width:0}


/* ============ sink catalogue ============ */
.cat{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:16px}
.cat button{font-size:12px;font-weight:500;padding:5px 11px;border-radius:999px;
  border:1px solid var(--line);background:var(--surface);color:var(--muted);cursor:pointer}
.cat button:hover{border-color:var(--line-2);color:var(--fg)}
.cat button[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);
  color:var(--accent-fg)}
.grid{display:grid;grid-template-columns:262px 1fr;gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden}
@media (max-width:860px){.grid{grid-template-columns:1fr}}
.list{background:var(--surface);max-height:700px;overflow-y:auto}
@media (max-width:860px){.list{max-height:230px}}
.item{display:block;width:100%;text-align:left;background:none;border:0;
  border-bottom:1px solid var(--line);padding:11px 14px;cursor:pointer;min-width:0}
.item:hover{background:var(--surface-2)}
.item[aria-current="true"]{background:var(--accent-soft);box-shadow:inset 2px 0 0 var(--accent)}
.item .api{font-family:var(--mono);font-size:11.5px;color:var(--fg);display:block;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.item[aria-current="true"] .api{color:var(--accent);font-weight:500}
.item .vn{font-size:11.5px;color:var(--faint);margin-top:2px;display:block}
.pane{background:var(--surface);padding:20px 19px;min-width:0;overflow-x:hidden}
.ph2{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:6px}
.ph2 h3{font-size:19px;letter-spacing:-.018em}
.sev{font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.07em;
  text-transform:uppercase;padding:2px 7px;border-radius:var(--r);
  background:var(--bad-soft);color:var(--bad);border:1px solid var(--bad-line)}
.sev.med{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-line)}
.cwe{font-family:var(--mono);font-size:11px;color:var(--faint)}
.api-full{font-family:var(--mono);font-size:12px;color:var(--muted);
  background:var(--code-bg);border:1px solid var(--code-line);border-radius:var(--r);
  padding:7px 10px;margin-bottom:16px;overflow-x:auto;white-space:nowrap}
.pane .lbl{font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.11em;
  text-transform:uppercase;color:var(--faint);margin-bottom:7px}
.mech{font-size:14px;color:var(--fg-2);margin-bottom:18px}
.mech code{background:var(--code-bg);padding:1px 4px;border-radius:3px;font-size:12.5px;
  border:1px solid var(--code-line)}
.pane pre{margin:0}
.codes{display:grid;gap:13px;margin-bottom:18px}
.cw .lbl{display:flex;align-items:center;gap:7px}
.cw.b .lbl{color:var(--bad)}.cw.g .lbl{color:var(--good)}
.notes{display:grid;gap:1px;background:var(--line);border:1px solid var(--line);
  border-radius:var(--r);overflow:hidden}
.note2{background:var(--surface);padding:11px 13px;font-size:13.5px;color:var(--fg-2)}
.note2 .lbl{margin-bottom:4px}
.note2 code{background:var(--code-bg);padding:1px 4px;border-radius:3px;font-size:12px;
  border:1px solid var(--code-line)}
.note2.x .lbl{color:var(--bad)}
.note2.d .lbl{color:var(--accent)}
.reach{display:flex;gap:5px;flex-wrap:wrap;margin-top:14px}
.reach span{font-family:var(--mono);font-size:10.5px;padding:2px 7px;border-radius:var(--r);
  background:var(--surface-2);color:var(--muted);border:1px solid var(--line)}
.reach span.lab{background:var(--accent-soft);color:var(--accent);border-color:var(--accent-line)}

/* depth + spacing classes, replacing inline style attributes that
   style-src 'self' would block */
.toc-col a.t3{padding-left:22px;font-size:12px}
.reach-h{margin-top:14px}
.sec-gap{margin-top:46px}
