/* ===========================================================================
   hero wars bot · herowars.bobagi.space
   Direction: the game's own regalia (deep indigo night, gold leaf) applied with
   instrument-panel discipline. No glow, no fantasy ornament: hairlines, tables
   and figures. An ornate game reduced to rows of fields, which is exactly what
   the bot does to it.
   =========================================================================== */

@font-face{font-family:'Fraunces';font-style:normal;font-weight:300 900;font-display:swap;src:url('/fonts/fraunces-300_900-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Instrument Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url('/fonts/instrument-sans-400_700-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,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-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,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-600-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}

:root{
  --void:#12101c;
  --slab:#191627;
  --slab-2:#15121f;
  --edge:#2c2645;
  --edge-soft:#221d35;
  --parch:#ece5d8;
  --ash:#9a92b0;
  --ash-dim:#877fa8;
  --rune:#a48aff;
  --leaf:#e6b450;
  --blood:#d7594a;
  --blood-t:#e8887a;

  --dsp:'Fraunces',Georgia,'Times New Roman',serif;
  --ui:'Instrument Sans',system-ui,-apple-system,'Segoe UI',sans-serif;
  --mono:'IBM Plex Mono',ui-monospace,'SF Mono',Menlo,Consolas,monospace;

  --gap:clamp(20px,5vw,56px);
  --rail-w:190px;
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{
  margin:0;
  background:var(--void);
  color:var(--parch);
  font:400 1.0625rem/1.65 var(--ui);
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow-x:hidden;
}

/* a faint vertical light, like a page under a lamp. Cheap, static, no glow. */
body::before{
  content:'';
  position:fixed;
  inset:0;
  pointer-events:none;
  background:radial-gradient(120% 70% at 50% -10%,rgba(164,138,255,.10),transparent 60%);
  z-index:0;
}
body>*{position:relative;z-index:1}

.wrap{max-width:1200px;margin-inline:auto;padding-inline:var(--gap)}

a{color:inherit}
code{font:500 .92em/1.4 var(--mono);color:var(--leaf);word-break:break-word}
b{font-weight:600}
:focus-visible{outline:2px solid var(--leaf);outline-offset:3px;border-radius:2px}

.skip{
  position:absolute;left:-9999px;top:0;
  background:var(--leaf);color:var(--void);
  padding:10px 16px;font:600 .875rem var(--ui);text-decoration:none;z-index:50;
}
.skip:focus{left:12px;top:12px}

.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ── top bar ─────────────────────────────────────────────────────────── */
.topbar{
  position:sticky;top:0;z-index:20;
  background:rgba(18,16,28,.86);
  backdrop-filter:blur(10px);
  border-bottom:1px solid var(--edge-soft);
}
.topbar-in{
  max-width:1200px;margin-inline:auto;padding:0 var(--gap);
  height:60px;display:flex;align-items:center;gap:28px;
}
.mark{display:flex;align-items:baseline;gap:10px;text-decoration:none;margin-right:auto;padding:7px 0}
.mark-sig{
  font:600 1.25rem/1 var(--dsp);
  font-variation-settings:'SOFT' 20,'WONK' 1,'opsz' 40;
  color:var(--leaf);letter-spacing:.02em;
}
.mark-name{font:400 .6875rem/1 var(--mono);color:var(--ash-dim);letter-spacing:.14em;text-transform:uppercase}

.topnav{display:flex;gap:22px}
.topnav a{
  font:400 .6875rem/1 var(--mono);letter-spacing:.13em;text-transform:uppercase;
  color:var(--ash);text-decoration:none;padding:9px 0;
  border-bottom:1px solid transparent;transition:color .18s,border-color .18s;
}
.topnav a:hover{color:var(--parch);border-bottom-color:var(--leaf)}

.lang{display:flex;align-items:center;gap:6px;font:400 .6875rem/1 var(--mono);color:var(--ash-dim)}
.lang button{
  background:none;border:0;padding:9px 7px;cursor:pointer;min-height:24px;
  font:inherit;letter-spacing:.1em;color:var(--ash);
  border-bottom:1px solid transparent;
}
.lang button:hover{color:var(--parch)}
.lang button[aria-pressed="true"]{color:var(--leaf);border-bottom-color:var(--leaf)}

/* ── hero ────────────────────────────────────────────────────────────── */
.hero{padding:clamp(48px,7.5vw,88px) 0 clamp(44px,6vw,72px)}
.hero-in{display:grid;grid-template-columns:1.02fr .98fr;gap:clamp(32px,5vw,64px);align-items:start}

.eyebrow{
  margin:0 0 26px;
  font:400 .6875rem/1 var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--ash-dim);
}
.eyebrow .dot{color:var(--leaf);padding:0 4px}

.hero h1{
  margin:0;
  font-family:var(--dsp);
  font-weight:600;
  font-variation-settings:'SOFT' 24,'WONK' 1,'opsz' 144;
  font-size:clamp(2.9rem,7.4vw,5.4rem);
  line-height:.93;
  letter-spacing:-.025em;
}
.hero h1 .l1,.hero h1 .l2{display:block}
.hero h1 .l1{color:var(--parch)}
.hero h1 .l2{color:var(--leaf);font-style:italic;font-variation-settings:'SOFT' 40,'WONK' 1,'opsz' 144}

.lead{
  margin:30px 0 0;max-width:46ch;
  font-size:1.125rem;line-height:1.62;color:#cdc5d8;
}

.stamp{
  margin:34px 0 0;padding-top:16px;
  border-top:1px solid var(--edge);
  display:flex;flex-wrap:wrap;gap:4px 14px;align-items:baseline;
}
.stamp-k{
  font:600 .625rem/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--leaf);
}
.stamp-v{font:400 .8125rem/1.7 var(--mono);color:var(--ash)}
.stamp .sep{color:var(--ash-dim);padding:0 2px}

/* ── the signature assembler: the one moving thing here ──────────────── */
.req{
  margin:0;
  background:linear-gradient(180deg,var(--slab) 0%,var(--slab-2) 100%);
  border:1px solid var(--edge);
  border-radius:3px;
}
.req-cap{
  display:flex;gap:10px;align-items:baseline;flex-wrap:wrap;
  padding:13px 18px;border-bottom:1px solid var(--edge);
  font:400 .75rem/1.3 var(--mono);
}
.req-cap .verb{color:var(--leaf);font-weight:600;letter-spacing:.06em}
.req-cap .host{color:var(--ash);word-break:break-all}

.req-body{padding:16px 18px 18px}

.req .row{
  display:grid;grid-template-columns:minmax(120px,auto) minmax(0,1fr);gap:6px 14px;
  padding:5px 0 5px 10px;margin-left:-10px;
  border-left:2px solid transparent;
  font:400 .75rem/1.55 var(--mono);
  transition:border-color .2s,background-color .2s;
}
.req .row .k{color:var(--ash-dim)}
.req .row .v{color:var(--parch);word-break:break-all}
.req .row .trunc{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.req .row.hot{border-left-color:var(--leaf);background:rgba(230,180,80,.05)}

.req-rule{height:1px;background:var(--edge);margin:14px 0}

.req-lbl{
  margin:0 0 6px;
  font:600 .625rem/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--ash-dim);
}
.concat{
  margin:0 0 14px;min-height:3.4em;
  font:400 .6875rem/1.7 var(--mono);color:var(--rune);
  word-break:break-all;
}
/* the caret only exists while the string is being typed, so a no-script
   visitor never sees a cursor parked next to finished text */
.caret{display:none}
.concat.typing .caret{
  display:inline-block;width:.55em;height:1em;vertical-align:-.14em;
  background:var(--rune);margin-left:1px;
  animation:blink 1s steps(1) infinite;
}
@keyframes blink{0%,49%{opacity:1}50%,100%{opacity:0}}

.req-sig{
  display:grid;grid-template-columns:minmax(120px,auto) minmax(0,1fr);gap:6px 14px;
  font:400 .75rem/1.55 var(--mono);
}
.req-sig .k{color:var(--ash-dim)}
.req-sig .hash{
  color:var(--leaf);font-weight:600;letter-spacing:.04em;word-break:break-all;
}
.req-sig .hash.settling{color:var(--rune);opacity:.7}

/* the response is the payoff of the animation, so it starts hidden and the
   assembler brings it in. noscript.css puts it back for JS-less visitors. */
.req-res{
  margin:0;display:flex;gap:10px;align-items:baseline;flex-wrap:wrap;
  font:400 .75rem/1.55 var(--mono);
  opacity:0;transform:translateY(4px);transition:opacity .45s,transform .45s;
}
.req-res.in{opacity:1;transform:none}
.req-res .code{
  border:1px solid var(--rune);color:var(--rune);
  padding:1px 7px;border-radius:2px;font-weight:600;letter-spacing:.06em;
}
.req-res .txt{color:var(--ash);word-break:break-all;min-width:0}

.req-note{
  margin:0;padding:11px 18px;border-top:1px solid var(--edge-soft);
  font:400 .6875rem/1.5 var(--mono);color:var(--ash-dim);
}

/* ── section frame ───────────────────────────────────────────────────── */
.sec{border-top:1px solid var(--edge-soft);padding:clamp(48px,6vw,76px) 0;scroll-margin-top:60px}
.sec-in{display:grid;grid-template-columns:var(--rail-w) minmax(0,1fr);gap:0 clamp(24px,4vw,52px)}
.rail{position:sticky;top:88px;align-self:start;padding-top:.55rem}
.rail-path{
  display:block;
  font:400 .6875rem/1.5 var(--mono);letter-spacing:.06em;color:var(--ash-dim);
  padding-left:12px;border-left:2px solid var(--leaf);
  word-break:break-word;
}
.sec-body{min-width:0}

.sec h2{
  margin:0 0 20px;
  font-family:var(--dsp);font-weight:500;
  font-variation-settings:'SOFT' 20,'WONK' 1,'opsz' 96;
  font-size:clamp(1.85rem,3.2vw,2.7rem);line-height:1.06;letter-spacing:-.018em;
  color:var(--parch);
}
.sec .p{margin:0 0 20px;max-width:64ch;color:#cdc5d8}
.sec .p:last-child{margin-bottom:0}

.callout{
  margin:28px 0 0;padding:16px 18px;
  background:var(--slab-2);border:1px solid var(--edge-soft);border-left:2px solid var(--rune);
  border-radius:2px;
  font-size:.9375rem;line-height:1.6;color:var(--ash);
}

/* ── comparison ──────────────────────────────────────────────────────── */
.cmp{width:100%;border-collapse:collapse;margin-top:34px;text-align:left}
.cmp th,.cmp td{padding:14px 18px 14px 0;vertical-align:top;font-size:.9375rem;line-height:1.5}
.cmp thead th{padding-bottom:12px;font-weight:400}
.cmp tbody tr{border-top:1px solid var(--edge-soft)}
.cmp td:first-child{color:var(--ash);width:44%}
.cmp td:last-child{color:var(--parch)}
.tag-old,.tag-new{
  display:inline-block;
  font:600 .625rem/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;
}
.tag-old{color:var(--ash-dim)}
.tag-new{color:var(--leaf)}
.cmp thead th:last-child{box-shadow:inset 0 -1px 0 var(--leaf)}

/* ── formula ─────────────────────────────────────────────────────────── */
.formula{
  margin:30px 0 0;padding:20px 22px;overflow-x:auto;
  background:var(--slab-2);border:1px solid var(--edge);border-radius:3px;
}
.formula code{
  display:block;color:var(--ash);font-size:.8125rem;line-height:1.85;white-space:pre;
}
.formula b{color:var(--leaf);font-weight:600}

/* ── note pairs ──────────────────────────────────────────────────────── */
.notes{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1px;margin-top:34px;background:var(--edge-soft)}
.note{background:var(--void);padding:22px 24px 24px}
.note h3{
  margin:0 0 10px;font:600 .9375rem/1.35 var(--ui);color:var(--parch);letter-spacing:-.005em;
}
.note p{margin:0;font-size:.9375rem;line-height:1.6;color:var(--ash)}
.note.lesson h3{
  font-family:var(--dsp);font-weight:500;font-size:1.15rem;
  font-variation-settings:'SOFT' 20,'WONK' 1,'opsz' 40;
  color:var(--leaf);
}

/* ── safety gates ────────────────────────────────────────────────────── */
.gates{list-style:none;margin:34px 0 0;padding:0;counter-reset:none}
.gate{
  display:grid;grid-template-columns:70px minmax(0,1fr);gap:0 22px;
  padding:24px 0;border-top:1px solid var(--edge-soft);
}
.gate:last-child{border-bottom:1px solid var(--edge-soft)}
.gate-n{
  font-family:var(--dsp);font-weight:700;font-size:3.1rem;line-height:.85;
  font-variation-settings:'SOFT' 0,'WONK' 0,'opsz' 144;
  color:transparent;-webkit-text-stroke:1px var(--leaf);
}
.gate.danger .gate-n{-webkit-text-stroke-color:var(--blood)}
.gate h3{margin:0 0 8px;font:600 1.0625rem/1.3 var(--ui);color:var(--parch)}
.gate.danger h3{color:var(--blood-t)}
.gate p{margin:0;font-size:.9375rem;line-height:1.6;color:var(--ash)}

/* ── tasks ───────────────────────────────────────────────────────────── */
.tbl-scroll{margin-top:34px;overflow-x:auto;min-width:0;position:relative}
.tasks{width:100%;border-collapse:collapse;text-align:left;min-width:520px}
.tasks thead th{
  padding:0 18px 12px 0;
  font:600 .625rem/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--ash-dim);
  border-bottom:1px solid var(--edge);
}
.tasks tbody th,.tasks tbody td{
  padding:12px 18px 12px 0;border-top:1px solid var(--edge-soft);
  font-size:.9375rem;line-height:1.45;font-weight:400;vertical-align:top;
}
.tasks tbody th{white-space:nowrap;padding-left:10px;margin-left:-10px;border-left:2px solid transparent}
.tasks tbody td{color:var(--ash)}
.tasks tbody tr{transition:background-color .16s}
.tasks tbody tr:hover{background:rgba(230,180,80,.045)}
.tasks tbody tr:hover th{border-left-color:var(--leaf)}
/* position:relative é obrigatório aqui: o texto só para leitor de tela (.sr)
   é position:absolute e, se a célula não for o bloco contêiner dele, ele se
   ancora na seção (que é relative), escapa do recorte do .tbl-scroll e
   estica a PÁGINA inteira. Um elemento invisível de 1px causando overflow. */
.tasks .c{text-align:center;width:78px;padding-right:0;position:relative}
.tasks .yes,.tasks .no{display:inline-block;width:9px;height:9px;border-radius:50%;vertical-align:middle;margin-top:5px}
.tasks .yes{background:var(--leaf)}
.tasks .no{border:1px solid var(--ash-dim)}

/* ── run log ─────────────────────────────────────────────────────────── */
.log{list-style:none;margin:32px 0 0;padding:0;border-top:1px solid var(--edge-soft)}
.log li{
  display:grid;grid-template-columns:26px minmax(0,1fr);gap:14px;
  padding:14px 0;border-bottom:1px solid var(--edge-soft);
  font-size:.9375rem;line-height:1.55;color:var(--ash);
}
.log li::before{font:400 1rem/1.5 var(--mono)}
.log .ok::before{content:'\2713';color:var(--leaf)}
.log .wait::before{content:'\2026';color:var(--ash-dim);letter-spacing:.05em}

/* ── warning ─────────────────────────────────────────────────────────── */
.warn{
  padding:26px 28px;background:var(--slab-2);
  border:1px solid var(--edge-soft);border-left:3px solid var(--blood);border-radius:2px;
}
.warn h2{margin:0 0 14px;font-size:clamp(1.5rem,2.4vw,2rem);color:var(--blood-t)}
.warn p{margin:0 0 12px;max-width:62ch;font-size:.9375rem;line-height:1.62;color:var(--ash)}
.warn p:last-child{margin-bottom:0}

/* ── footer ──────────────────────────────────────────────────────────── */
.foot{border-top:1px solid var(--edge);padding:36px 0 48px;margin-top:0}
.foot-in{display:flex;flex-wrap:wrap;gap:14px 32px;align-items:baseline;justify-content:space-between}
.foot-stack{margin:0;max-width:58ch;font:400 .8125rem/1.7 var(--mono);color:var(--ash-dim)}
.foot-links{margin:0;font:400 .8125rem/1.7 var(--mono)}
.foot-links a{display:inline-block;padding:5px 0;color:var(--ash);text-decoration:none;border-bottom:1px solid var(--edge)}
.foot-links a:hover{color:var(--leaf);border-bottom-color:var(--leaf)}
.foot-links .sep{color:var(--ash-dim);padding:0 8px}

/* ── responsive ──────────────────────────────────────────────────────── */
@media (max-width:980px){
  .hero-in{grid-template-columns:minmax(0,1fr);gap:44px}
  .sec-in{grid-template-columns:minmax(0,1fr);gap:22px}
  .rail{position:static;padding-top:0}
  .rail-path{padding-left:10px}
}
@media (max-width:760px){
  .topnav{display:none}
  .topbar-in{gap:16px}
  .req .row,.req-sig{grid-template-columns:1fr;gap:0}
  .req .row .trunc{white-space:normal}
  .gate{grid-template-columns:50px minmax(0,1fr);gap:0 16px}
  .gate-n{font-size:2.4rem}
  .cmp td:first-child{width:42%}
  .cmp th,.cmp td{padding-right:12px;font-size:.875rem}
  .foot-in{flex-direction:column}
}
@media (max-width:420px){
  .hero h1{font-size:2.5rem}
  .warn{padding:22px 20px}
  .note{padding:20px}
}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
  .caret{display:none}
}
