
:root{
  color-scheme:light dark;
  --accent:#0d7377;--accent-strong:#0a5c5f;--accent-soft:rgba(13,115,119,.10);
  --fg:#1c1917;--bg:#fafaf9;--muted:#6f6a66;--card:#ffffff;--raised:#f4f3f1;
  --border:rgba(0,0,0,.10);--border-strong:rgba(0,0,0,.18);
  --ok:#1a7f4b;--warn:#a86a1a;
  --radius:.7rem;--radius-lg:1rem;
  --font:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
  --shell:72rem;
}
@media (prefers-color-scheme:dark){:root{
  --accent:#2aa6a2;--accent-strong:#3fc0bb;--accent-soft:rgba(42,166,162,.14);
  --fg:#e9e6e3;--bg:#121211;--muted:#a19b95;--card:#1b1a18;--raised:#232120;
  --border:rgba(255,255,255,.10);--border-strong:rgba(255,255,255,.20);
  --ok:#4bbd83;--warn:#d3a05a;
}}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;font-family:var(--font);background:var(--bg);color:var(--fg);line-height:1.62;font-size:16px}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
code{font-family:var(--mono)}
p code,li code,td code,th code,dd code,summary code{background:var(--raised);border:1px solid var(--border);border-radius:.35rem;padding:.08rem .35rem;font-size:.86em}
pre{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:1rem 1.1rem;overflow-x:auto;font-size:.84rem;line-height:1.6;margin:1rem 0}
pre code{background:none;border:0;padding:0;font-size:inherit}
table{border-collapse:collapse;width:100%;font-size:.87rem;margin:1rem 0}
th,td{border:1px solid var(--border);padding:.45rem .7rem;text-align:left;vertical-align:top}
th{background:var(--raised);font-weight:600}
.tablewrap{overflow-x:auto}
hr{border:0;border-top:1px solid var(--border);margin:2.5rem 0}
.shell{max-width:var(--shell);margin:0 auto;padding:0 1.5rem;width:100%}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.skip{position:absolute;left:-9999px;top:0;background:var(--card);border:1px solid var(--border);padding:.5rem .9rem;border-radius:.4rem;z-index:20}
.skip:focus{left:1rem;top:1rem}
main:focus{outline:none}

/* ---- client navigation ---- */
/* The router sets this attribute on <html> while a route payload is in flight
   and removes it when the swap lands, so a navigation that has to wait on the
   network still says so. Nothing else styles it, and with scripting off it is
   never set. */
html[data-oi-navigating]{cursor:progress}
html[data-oi-navigating] main{opacity:.72;transition:opacity .12s ease}

/* ---- announcement banner ---- */
.banner{background:var(--accent-soft);border-bottom:1px solid var(--border);font-size:.85rem}
.banner .shell{display:flex;align-items:center;justify-content:center;gap:.55rem;min-height:2.5rem;padding-top:.35rem;padding-bottom:.35rem;text-align:center;flex-wrap:wrap}
.banner .tagword{font-weight:650;color:var(--accent)}
.banner a{color:inherit;display:inline-flex;align-items:center;gap:.35rem}
.banner a .arrow{transition:transform .15s ease}
.banner a:hover .arrow{transform:translateX(2px)}

/* ---- top nav ---- */
.topnav{border-bottom:1px solid var(--border);background:var(--bg);position:sticky;top:0;z-index:10}
.topnav .shell{display:flex;align-items:center;gap:1.1rem;min-height:3.6rem}
.brand{font-size:1.35rem;font-weight:700;letter-spacing:-.03em;color:var(--fg);display:inline-flex;align-items:baseline;gap:.1rem}
.brand:hover{text-decoration:none}
.brand .dot{color:var(--accent)}
.navlinks{display:flex;align-items:center;gap:1.05rem;margin-left:.6rem;font-size:.9rem;flex-wrap:wrap}
.navlinks a{color:var(--muted)}
.navlinks a:hover,.navlinks a[aria-current="page"]{color:var(--fg)}
.navspacer{flex:1 1 auto}
.navauth{display:flex;align-items:center;gap:.6rem;font-size:.9rem}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;border-radius:.5rem;padding:.45rem .95rem;font-size:.9rem;font-weight:550;border:1px solid var(--border-strong);color:var(--fg);background:var(--card);cursor:pointer;font-family:inherit}
.btn:hover{text-decoration:none;border-color:var(--accent);color:var(--accent)}
.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}
.btn-primary:hover{background:var(--accent-strong);border-color:var(--accent-strong);color:#fff}
.btn-ghost{border-color:transparent;background:none;color:var(--muted)}
.btn-ghost:hover{color:var(--fg);border-color:var(--border)}

/* ---- footer ---- */
footer.sitefooter{border-top:1px solid var(--border);margin-top:4.5rem;padding:2.5rem 0 3.5rem;font-size:.86rem;color:var(--muted)}
footer.sitefooter .cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));gap:1.6rem 2rem}
footer.sitefooter h2{font-size:.74rem;text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0 0 .6rem;font-weight:650}
footer.sitefooter ul{list-style:none;margin:0;padding:0;display:grid;gap:.32rem}
footer.sitefooter .legal{margin-top:2.2rem;padding-top:1.2rem;border-top:1px solid var(--border);display:flex;flex-wrap:wrap;gap:.5rem 1.1rem;align-items:center}
footer.sitefooter .legal .sep{opacity:.5}
