/* Salvage War site · design system
   Source of truth: DESIGN_FOUNDATION.md. Every rule here serves a goal named there. */

/* ---------- tokens ---------- */
:root{
  --field:#0B0D10; --surface:#13161B; --line:#262B33; --line-2:#333A44;
  --ink:#ECE9E2; --ink-2:#A9ADB5; --dim:#6E737C;
  --accent:#FF6A2B; --accent-ink:#1A0A03;
  --paper:#E8E2D2; --paper-ink:#1B1A17; --paper-line:#CFC8B8;

  --font-display:"Barlow Condensed",sans-serif;
  --font-body:"Inter",system-ui,sans-serif;
  --font-data:"JetBrains Mono",ui-monospace,monospace;

  --s1:8px; --s2:16px; --s3:24px; --s4:32px; --s5:48px; --s6:64px; --s7:96px; --s8:128px;
  --content:1280px; --gutter:24px; --edge:24px; --header:56px;
  --t-72:clamp(44px,6vw,72px); --t-48:clamp(32px,4vw,48px); --t-32:clamp(24px,2.6vw,32px);
}
:root[data-accent="consortium"]{ --accent:#7FE0FF; --accent-ink:#03171C; }

/* ---------- base ---------- */
*{box-sizing:border-box}
html{background:var(--field);color-scheme:dark;scroll-padding-top:calc(var(--header) + 16px)}
body{margin:0;background:var(--field);color:var(--ink);font-family:var(--font-body);font-size:17px;line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:inherit;text-decoration:none}
p{margin:0}
p+p{margin-top:1em}
img,video{max-width:100%;display:block}
:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
@media (max-width:720px){ body{font-size:16px} :root{--edge:16px;--gutter:16px} }

/* ---------- type ---------- */
.display,h1,h2,h3{font-family:var(--font-display);font-weight:700;text-transform:uppercase;line-height:.96;letter-spacing:.005em;margin:0}
h1,.t-72{font-size:var(--t-72)}
h2,.t-48{font-size:var(--t-48)}
h3,.t-32{font-size:var(--t-32);font-weight:600}
.lead{font-size:clamp(18px,1.5vw,21px);line-height:1.5;color:var(--ink)}
.muted{color:var(--ink-2)}
.measure{max-width:66ch}
.label{font-family:var(--font-data);font-size:12px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);line-height:1.4}
.label b{color:var(--ink-2);font-weight:500}
.label.accent{color:var(--accent)}
.data{font-family:var(--font-data);font-size:14px;color:var(--ink-2)}
.data b{color:var(--ink);font-weight:500}
.data .accent{color:var(--accent)}

/* ---------- layout ---------- */
.wrap{max-width:var(--content);margin:0 auto;padding-left:var(--edge);padding-right:var(--edge)}
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--gutter)}
.section{padding:var(--s7) 0}
.section.tight{padding:var(--s6) 0}
.section-head{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--s3);margin-bottom:var(--s5)}
.section-head .label{margin-bottom:var(--s2)}
.rule{height:1px;background:var(--line);border:0;margin:0}
@media (max-width:720px){ .section{padding:var(--s6) 0} .section-head{flex-direction:column;align-items:flex-start;gap:var(--s2)} }
@media (max-width:860px){ .grid{grid-template-columns:1fr} .grid>*{grid-column:1/-1 !important} }

/* ---------- header ---------- */
.header{position:fixed;top:0;left:0;right:0;height:var(--header);z-index:20;background:rgba(11,13,16,.88);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.header .wrap{height:100%;display:flex;align-items:center;gap:var(--s4)}
.wordmark{display:flex;align-items:center;gap:12px}
.wordmark img{display:block;height:15px;width:auto}
.wordmark img.mark{height:24px}
@media (max-width:720px){ .wordmark img{height:12px} .wordmark img.mark{display:none} }
/* real images: the game's art, same frame everywhere */
.img{display:block;width:100%;aspect-ratio:16/9;object-fit:cover;border:1px solid var(--line);border-radius:4px;background:var(--surface)}
.img.p34{aspect-ratio:3/4}
.img.wide{aspect-ratio:21/9}
.nav{display:flex;gap:4px;margin:0 auto}
.nav a{font-family:var(--font-data);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-2);padding:8px 12px;border-radius:4px;white-space:nowrap}
@media (max-width:1180px){ .nav a{padding:8px 8px;letter-spacing:.08em} }
.nav a:hover,.nav a[aria-current]{color:var(--ink);background:rgba(255,255,255,.05)}
.header .ask{display:flex;gap:8px;margin-left:auto}
/* the Factions item opens a small list of the two factions on hover or keyboard focus */
.nav-group{position:relative;display:inline-flex}
.nav-group>a .caret{display:inline-block;width:0;height:0;margin-left:7px;vertical-align:2px;border-left:3px solid transparent;border-right:3px solid transparent;border-top:4px solid currentColor;opacity:.6}
.nav .drop{position:absolute;left:0;top:100%;display:none;flex-direction:column;min-width:190px;padding:6px;background:rgba(11,13,16,.96);backdrop-filter:blur(10px);border:1px solid var(--line-2);border-radius:4px;box-shadow:0 12px 32px rgba(0,0,0,.45)}
.nav .drop a{padding:9px 12px}
.nav .drop a[aria-current]{color:var(--ink);background:rgba(255,255,255,.05)}
.nav-group:hover .drop,.nav-group:focus-within .drop{display:flex}
.menu-panel .wrap a.sub{font-size:22px;padding:10px 0 10px 24px;color:var(--ink-2)}
.menu-panel .caret{display:none}
.menu-btn{display:none}
@media (max-width:960px){
  .nav{display:none}
  .header .ask .btn.secondary{display:none}
  .menu-btn{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border:1px solid var(--line-2);border-radius:4px;background:none;color:var(--ink);cursor:pointer}
}
main{padding-top:var(--header)}
/* phone menu panel (built by site.js from the header nav) */
.menu-panel{position:fixed;top:var(--header);left:0;right:0;bottom:0;z-index:19;background:var(--field);display:none;padding:var(--s3) 0 var(--s5);overflow:auto}
.menu-panel.open{display:block}
.menu-panel .wrap{display:grid}
.menu-panel a:not(.btn){font-family:var(--font-display);font-weight:600;font-size:32px;text-transform:uppercase;padding:14px 0;border-top:1px solid var(--line);color:var(--ink)}
.menu-panel a[aria-current]{color:var(--accent)}
.menu-panel .btn{justify-self:start;margin-top:var(--s4)}
body.menu-open{overflow:hidden}

/* ---------- press fact sheet ---------- */
.sheet{list-style:none;margin:0;padding:0}
.sheet li{display:grid;grid-template-columns:180px 1fr;gap:var(--s2);padding:12px 0;border-top:1px solid var(--line);font-size:15.5px}
.sheet li:last-child{border-bottom:1px solid var(--line)}
.sheet li span{font-family:var(--font-data);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);padding-top:3px}
.sheet li b{font-weight:500;color:var(--ink)}
.assets{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gutter)}
.asset{display:grid;gap:var(--s2)}
.asset .ph{min-height:0;aspect-ratio:16/9;padding:var(--s2)}
.asset .row{display:flex;justify-content:space-between;align-items:center;gap:var(--s2)}
@media (max-width:860px){ .assets{grid-template-columns:1fr} .sheet li{grid-template-columns:1fr;gap:4px} }

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;gap:10px;font-family:var(--font-data);font-size:13px;font-weight:500;letter-spacing:.12em;text-transform:uppercase;padding:12px 18px;border-radius:4px;border:1px solid var(--line-2);color:var(--ink);cursor:pointer;transition:background .15s,border-color .15s;white-space:nowrap}
.btn:hover{border-color:var(--ink-2);background:rgba(255,255,255,.04)}
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}
.btn.primary:hover{filter:brightness(1.08)}
.btn.small{padding:8px 12px;font-size:12px}
.btn .dot{width:8px;height:8px;border-radius:2px;background:currentColor}
.link{color:var(--accent);border-bottom:1px solid transparent}
.link:hover{border-bottom-color:currentColor}
.link::after{content:" →"}

/* ---------- panel ---------- */
.panel{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:var(--s4)}
.panel.flush{padding:0;overflow:hidden}
@media (max-width:720px){ .panel{padding:var(--s3)} }

/* ---------- placeholder block (principle 5: the game's art or nothing) ---------- */
.ph{background:var(--surface);border:1px solid var(--line);display:grid;place-items:center;color:var(--dim);font-family:var(--font-data);font-size:12px;letter-spacing:.12em;text-transform:uppercase;text-align:center;padding:var(--s3);min-height:160px}
.ph.ratio-16{aspect-ratio:16/9;min-height:0}
.ph.ratio-3{aspect-ratio:3/4;min-height:0}

/* ---------- hero (home screen 1) ---------- */
.hero{position:relative;min-height:calc(100vh - var(--header));display:flex;align-items:flex-end;overflow:hidden}
.hero .art{position:absolute;inset:0;background:#000 url(assets/a0-nadir.webp) 70% 35%/cover no-repeat}
@media (max-width:720px){ .hero .art{background-position:62% 30%} }
.hero .shade{position:absolute;inset:0;background:linear-gradient(90deg,rgba(11,13,16,.94) 0%,rgba(11,13,16,.8) 40%,rgba(11,13,16,.2) 75%,rgba(11,13,16,.05) 100%),linear-gradient(0deg,rgba(11,13,16,.9) 0%,rgba(11,13,16,0) 40%)}
.hero .wrap{position:relative;width:100%;padding-top:var(--s7);padding-bottom:var(--s7)}
.hero .copy{max-width:640px}
.hero h1{margin:var(--s2) 0 var(--s3)}
.hero h1 em{font-style:normal;color:var(--accent)}
.hero .cta{display:flex;gap:10px;flex-wrap:wrap;margin-top:var(--s4)}
.hero .credit{position:absolute;right:var(--edge);top:var(--s3)}
@media (max-width:720px){
  .hero{min-height:calc(100svh - var(--header))}
  .hero .shade{background:linear-gradient(0deg,rgba(11,13,16,.96) 0%,rgba(11,13,16,.75) 55%,rgba(11,13,16,.15) 100%)}
  .hero .wrap{padding-top:var(--s6);padding-bottom:var(--s5)}
}

/* ---------- faction card ---------- */
.faction{display:grid;grid-template-rows:auto 1fr auto;gap:var(--s3);padding:var(--s4);border:1px solid var(--line);border-radius:6px;background:var(--surface);position:relative}
.faction::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--fac,var(--accent));border-radius:6px 0 0 6px}
.faction.consortium{--fac:#7FE0FF}
.faction.league{--fac:#FF6A2B}
.faction .tag{display:flex;justify-content:space-between;gap:var(--s2)}
.faction .claim{font-family:var(--font-display);font-weight:600;font-size:clamp(20px,1.9vw,24px);text-transform:uppercase;line-height:1.15;color:var(--fac,var(--accent));margin-top:var(--s1)}
.faction h3{margin-top:var(--s2)}
.faction .foot{display:flex;justify-content:space-between;align-items:center;gap:var(--s2);padding-top:var(--s3);border-top:1px solid var(--line)}

/* ---------- step ---------- */
.step{display:grid;gap:var(--s2);padding-top:var(--s3);border-top:1px solid var(--line)}
.steps{display:grid;gap:var(--s4)}
.steps .step{grid-template-columns:64px 1fr;gap:var(--s2) var(--s3);align-items:start}
.steps .step h3{grid-column:2}
.steps .step p{grid-column:2}
.steps .step .n{grid-row:1/3}
.step .n{font-family:var(--font-display);font-weight:700;font-size:var(--t-48);line-height:1;color:var(--accent)}
.step h3{font-size:clamp(22px,2vw,26px)}
.step p{color:var(--ink-2)}

/* ---------- tracker line (home screen 4) ---------- */
.tracker{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--s4);padding:var(--s3) 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.tracker .big{font-family:var(--font-display);font-weight:700;font-size:var(--t-48);line-height:1}
.tracker .big small{font-family:var(--font-data);font-size:13px;font-weight:500;letter-spacing:.12em;color:var(--dim);margin-left:12px;text-transform:uppercase}
.tracker .live{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-right:10px;vertical-align:middle;animation:blink 1.6s infinite}
@keyframes blink{50%{opacity:.25}}
@media (prefers-reduced-motion:reduce){.tracker .live{animation:none}}
@media (max-width:720px){ .tracker{grid-template-columns:1fr;gap:var(--s2)} }

/* ---------- dispatch ---------- */
.dispatch{display:grid;gap:var(--s2)}
.dispatch h3{font-size:clamp(24px,2.4vw,32px)}
.dispatch-list{list-style:none;margin:0;padding:0}
.dispatch-list li{display:grid;grid-template-columns:120px 1fr;gap:var(--s3);padding:var(--s2) 0;border-top:1px solid var(--line)}
.dispatch-list li:last-child{border-bottom:1px solid var(--line)}
.dispatch-list a:hover{color:var(--accent)}
@media (max-width:720px){ .dispatch-list li{grid-template-columns:1fr;gap:4px} }

/* ---------- document (in-world, paper) ---------- */
.doc{background:var(--paper);color:var(--paper-ink);border:1px solid var(--paper-line);border-radius:4px;padding:var(--s4) var(--s5)}
.doc .label{color:#7A7367}
.doc h3{color:var(--paper-ink)}
.doc .seal{display:inline-block;border:1.5px solid var(--paper-ink);padding:4px 8px;font-family:var(--font-data);font-size:11px;letter-spacing:.14em;text-transform:uppercase;transform:rotate(-2deg)}
.doc .redacted{background:#111;color:transparent;border-radius:1px;user-select:none}
@media (max-width:720px){ .doc{padding:var(--s3)} }

/* ---------- page head (faction, place, person pages) ---------- */
.page-head{padding:var(--s7) 0 var(--s6);border-bottom:1px solid var(--line)}
.page-head h1{margin:var(--s2) 0 var(--s3);max-width:16ch}
.page-head .claim{font-family:var(--font-display);font-weight:600;font-size:clamp(22px,2.4vw,30px);text-transform:uppercase;line-height:1.15;color:var(--accent);max-width:28ch}
.page-head .facts{display:flex;gap:var(--s3) var(--s5);flex-wrap:wrap;margin-top:var(--s5)}
.page-head .facts div{display:grid;gap:4px}
.page-head .facts b{font-weight:500;color:var(--ink)}
/* page head with art behind it (the fallen structures): image, a shade for the copy, a credit top right */
.page-head.art{position:relative;overflow:hidden;min-height:560px;display:flex;align-items:flex-end;border-bottom-color:var(--line-2)}
.page-head.art .bg{position:absolute;inset:0;background:#000 var(--art) 72% 45%/cover no-repeat}
.page-head.art .shade{position:absolute;inset:0;background:linear-gradient(90deg,rgba(11,13,16,.94) 0%,rgba(11,13,16,.82) 38%,rgba(11,13,16,.28) 70%,rgba(11,13,16,.08) 100%),linear-gradient(0deg,rgba(11,13,16,.92) 0%,rgba(11,13,16,0) 45%)}
.page-head.art .wrap{position:relative;width:100%}
.page-head.art .credit{position:absolute;right:var(--edge);bottom:var(--s3);z-index:1;color:var(--ink-2);text-shadow:0 1px 3px rgba(0,0,0,.9)}
@media (max-width:720px){ .page-head.art{min-height:0} .page-head.art .bg{background-position:60% 40%} .page-head.art .shade{background:linear-gradient(0deg,rgba(11,13,16,.96) 0%,rgba(11,13,16,.85) 55%,rgba(11,13,16,.35) 100%)} .page-head.art .credit{display:none} }

/* ---------- unit card ---------- */
.roster{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gutter)}
.unit{display:grid;gap:var(--s2);padding:var(--s3);background:var(--surface);border:1px solid var(--line);border-radius:6px}
.unit .ph{min-height:0;aspect-ratio:16/9;padding:var(--s2)}
.unit .head{display:flex;justify-content:space-between;gap:var(--s2);align-items:baseline}
.unit h3{font-size:clamp(20px,1.8vw,24px)}
.unit p{color:var(--ink-2);font-size:15.5px}
.unit .vs{display:grid;grid-template-columns:auto 1fr;gap:4px var(--s2);font-family:var(--font-data);font-size:12px;letter-spacing:.04em;color:var(--ink-2);padding-top:var(--s2);border-top:1px solid var(--line)}
.unit .vs span{color:var(--dim);text-transform:uppercase;letter-spacing:.12em}
.unit.signature{grid-column:span 2;grid-template-columns:1fr 1fr;align-items:start}
.unit.signature .ph{grid-row:1/4}
.unit.signature h3{font-size:var(--t-32)}
@media (max-width:1000px){ .roster{grid-template-columns:repeat(2,1fr)} }
@media (max-width:640px){ .roster{grid-template-columns:1fr} .unit.signature{grid-column:auto;grid-template-columns:1fr} .unit.signature .ph{grid-row:auto} }

/* ---------- buildings list ---------- */
.buildings{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:0 var(--s5)}
.buildings li{display:grid;grid-template-columns:150px 1fr;gap:var(--s2);padding:var(--s2) 0;border-top:1px solid var(--line);align-items:baseline}
.buildings li b{font-family:var(--font-display);font-weight:600;font-size:20px;text-transform:uppercase}
.buildings li p{font-size:15px;color:var(--ink-2)}
@media (max-width:860px){ .buildings{grid-template-columns:1fr} }

/* ---------- person ---------- */
.person{display:grid;grid-template-columns:200px 1fr;gap:var(--s4);align-items:start}
.person .ph{min-height:0;aspect-ratio:3/4}
.person h3{margin:var(--s1) 0 var(--s2)}
.person .quote{font-family:var(--font-display);font-weight:600;font-size:22px;text-transform:uppercase;line-height:1.2;color:var(--accent);margin-bottom:var(--s2)}
@media (max-width:640px){ .person{grid-template-columns:120px 1fr;gap:var(--s3)} }

/* ---------- compare table ---------- */
.compare{width:100%;border-collapse:collapse;font-size:15.5px}
.compare th,.compare td{text-align:left;vertical-align:top;padding:var(--s2) var(--s2) var(--s2) 0;border-top:1px solid var(--line)}
.compare th{font-family:var(--font-data);font-size:12px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);width:140px}
.compare td.us{color:var(--ink)} .compare td.them{color:var(--ink-2)}
.compare thead th{border-top:0;padding-top:0}
.compare thead th.us{color:var(--accent)}

/* ---------- timeline ---------- */
.timeline{list-style:none;margin:0;padding:0}
.timeline li{display:grid;grid-template-columns:160px 1fr;gap:var(--s3);padding:var(--s3) 0;border-top:1px solid var(--line)}
.timeline li:last-child{border-bottom:1px solid var(--line)}
.timeline .when{font-family:var(--font-display);font-weight:700;font-size:28px;line-height:1;text-transform:uppercase}
.timeline .when small{display:block;font-family:var(--font-data);font-size:11px;font-weight:500;letter-spacing:.12em;color:var(--dim);margin-top:6px;text-transform:uppercase}
.timeline li.hot .when{color:var(--accent)}
.timeline h3{font-size:clamp(20px,1.8vw,24px);margin-bottom:var(--s1)}
.timeline p{color:var(--ink-2);max-width:66ch}
@media (max-width:720px){ .timeline li{grid-template-columns:1fr;gap:var(--s1)} }

/* ---------- pull quote ---------- */
.pull{border-left:3px solid var(--accent);padding-left:var(--s3);max-width:40ch}
.pull p{font-family:var(--font-display);font-weight:600;font-size:clamp(24px,2.6vw,34px);line-height:1.15;text-transform:uppercase;color:var(--ink)}
.pull cite{display:block;font-style:normal;margin-top:var(--s2)}

/* ---------- place ---------- */
.place{display:grid;grid-template-columns:5fr 7fr;gap:var(--s4);padding:var(--s5) 0;border-top:1px solid var(--line);align-items:start}
.place:last-child{border-bottom:1px solid var(--line)}
.place .ph{min-height:0;aspect-ratio:16/9}
.place h3{margin:var(--s1) 0 var(--s2)}
.place p{color:var(--ink-2);max-width:60ch}
.place .facts{display:flex;gap:var(--s3);flex-wrap:wrap;margin-top:var(--s2)}
@media (max-width:860px){ .place{grid-template-columns:1fr;gap:var(--s3);padding:var(--s4) 0} }

/* ---------- region strip ---------- */
.regions{display:grid;grid-template-columns:repeat(6,1fr);gap:var(--s2);margin-top:var(--s2)}
.regions div{padding-top:var(--s2);border-top:1px solid var(--line-2)}
.regions b{display:block;font-family:var(--font-display);font-weight:600;font-size:18px;text-transform:uppercase}
.regions span{display:block;font-size:14px;color:var(--ink-2);margin-top:4px}
.regions div.hot{border-top-color:var(--accent)}
@media (max-width:860px){ .regions{grid-template-columns:repeat(2,1fr)} }

/* ---------- key list (controls) ---------- */
.keys{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:0 var(--s5)}
.keys li{display:grid;grid-template-columns:56px 1fr;gap:var(--s2);padding:var(--s2) 0;border-top:1px solid var(--line);align-items:start}
.keys kbd{font-family:var(--font-data);font-size:12px;font-weight:500;letter-spacing:.08em;color:var(--ink);border:1px solid var(--line-2);border-radius:4px;padding:3px 7px;display:inline-block;min-width:34px;text-align:center;margin-top:2px}
.keys b{display:block;font-family:var(--font-display);font-weight:600;font-size:19px;text-transform:uppercase}
.keys p{font-size:15px;color:var(--ink-2)}
@media (max-width:860px){ .keys{grid-template-columns:1fr} }

/* ---------- mission list ---------- */
.missions{list-style:none;margin:0;padding:0;counter-reset:m}
.missions li{display:grid;grid-template-columns:40px 1fr;gap:var(--s2);padding:12px 0;border-top:1px solid var(--line);font-size:15.5px;color:var(--ink-2)}
.missions li::before{counter-increment:m;content:counter(m,decimal-leading-zero);font-family:var(--font-data);font-size:12px;letter-spacing:.1em;color:var(--dim);padding-top:4px}
.missions b{color:var(--ink);font-weight:500}
.missions .sealed{display:inline-block;background:var(--line-2);color:transparent;border-radius:2px;user-select:none}

/* ---------- faq ---------- */
.faq{display:grid;gap:0}
.faq details{border-top:1px solid var(--line);padding:var(--s2) 0}
.faq details:last-child{border-bottom:1px solid var(--line)}
.faq summary{cursor:pointer;list-style:none;font-family:var(--font-display);font-weight:600;font-size:22px;text-transform:uppercase;display:flex;justify-content:space-between;gap:var(--s2)}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";font-family:var(--font-data);color:var(--accent);font-size:20px}
.faq details[open] summary::after{content:"−"}
.faq details p{margin-top:var(--s2);color:var(--ink-2);max-width:66ch}

/* ---------- foot ---------- */
.foot{border-top:1px solid var(--line);padding:var(--s6) 0 var(--s5)}
.foot .top{display:flex;justify-content:space-between;align-items:center;gap:var(--s3);flex-wrap:wrap}
.foot .ask{display:flex;gap:10px;flex-wrap:wrap}
.foot .links{display:flex;gap:var(--s3);flex-wrap:wrap}
.foot .links a{font-family:var(--font-data);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-2)}
.foot .links a:hover{color:var(--ink)}
.foot .legal{margin-top:var(--s5);font-family:var(--font-data);font-size:11px;letter-spacing:.04em;color:var(--dim);line-height:1.8}

/* ---------- design-system page only ---------- */
.ds .section{padding:var(--s6) 0;border-top:1px solid var(--line)}
.ds .swatches{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:var(--s2)}
.ds .sw{border:1px solid var(--line);border-radius:4px;overflow:hidden}
.ds .sw i{display:block;height:64px}
.ds .sw span{display:block;padding:8px 10px;font-family:var(--font-data);font-size:11px;letter-spacing:.06em;color:var(--ink-2)}
.ds .spec{display:grid;grid-template-columns:160px 1fr;gap:var(--s2) var(--s3);align-items:baseline;padding:var(--s2) 0;border-top:1px solid var(--line)}
.ds .spec:last-child{border-bottom:1px solid var(--line)}
.ds .row{display:flex;gap:var(--s2);flex-wrap:wrap;align-items:center}
.ds .scale{display:flex;gap:var(--s1);align-items:flex-end}
.ds .scale i{display:block;background:var(--accent);width:var(--w);height:var(--w);opacity:.9}

/* ---------- archive and dispatches ---------- */
.filters{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:var(--s5)}
.filters a{font-family:var(--font-data);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-2);padding:8px 12px;border:1px solid var(--line);border-radius:4px}
.filters a:hover,.filters a[aria-current]{color:var(--ink);border-color:var(--ink-2)}
.entries{list-style:none;margin:0;padding:0}
.entries li{display:grid;grid-template-columns:150px 1fr auto;gap:var(--s3);padding:var(--s2) 0;border-top:1px solid var(--line);align-items:baseline}
.entries li:last-child{border-bottom:1px solid var(--line)}
.entries .k{font-family:var(--font-data);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.entries .t{font-family:var(--font-display);font-weight:600;font-size:22px;text-transform:uppercase;line-height:1.1}
.entries .t a:hover{color:var(--accent)}
.entries .x{display:block;font-family:var(--font-body);font-weight:400;font-size:15px;text-transform:none;color:var(--ink-2);margin-top:4px;line-height:1.5}
.entries .s{font-family:var(--font-data);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);white-space:nowrap}
.entries .s.sealed{color:var(--accent)}
@media (max-width:720px){ .entries li{grid-template-columns:1fr;gap:4px} }
.people{display:grid;grid-template-columns:repeat(5,1fr);gap:var(--gutter)}
.people a{display:grid;gap:10px}
.people .nm{font-family:var(--font-display);font-weight:600;font-size:20px;text-transform:uppercase;line-height:1}
.people a:hover .nm{color:var(--accent)}
@media (max-width:1000px){ .people{grid-template-columns:repeat(3,1fr)} }
@media (max-width:640px){ .people{grid-template-columns:repeat(2,1fr)} }
/* entry and post pages */
.entry{display:grid;grid-template-columns:1fr 320px;gap:var(--s6);align-items:start}
.entry .body{max-width:70ch}
.entry .body p+p{margin-top:1em}
.entry .body h3{margin:var(--s4) 0 var(--s2)}
.entry .body .figure{margin:var(--s4) 0}
.entry .body .figure .label{display:block;margin-top:var(--s1)}
.entry aside{position:sticky;top:calc(var(--header) + 24px)}
.entry aside .panel+.panel{margin-top:var(--s2)}
.meta{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;font-family:var(--font-data);font-size:12px;letter-spacing:.06em}
.meta span{color:var(--dim);text-transform:uppercase;letter-spacing:.12em}
.meta b{font-weight:500;color:var(--ink)}
.related{list-style:none;margin:0;padding:0;font-size:15px}
.related li{padding:8px 0;border-top:1px solid var(--line)}
.related li:first-child{border-top:0;padding-top:0}
.related a:hover{color:var(--accent)}
.doc .lines{display:grid;gap:9px;max-width:720px}
.doc .lines i{display:block;height:7px;background:#a39d90}
.doc .lines i.r{background:#111;height:12px;margin:-2px 0}
.post-nav{display:flex;justify-content:space-between;gap:var(--s3);padding-top:var(--s4);margin-top:var(--s6);border-top:1px solid var(--line)}
@media (max-width:960px){ .entry{grid-template-columns:1fr} .entry aside{position:static} }

/* ---------- unit role marks and building models ---------- */
.icon-tile{aspect-ratio:16/9;display:grid;place-items:center;background:var(--field);border:1px solid var(--line);border-radius:4px;position:relative}
.icon-tile img{width:64px;height:64px;opacity:.85}
.icon-tile::after{content:"";position:absolute;inset:10px;border:1px solid var(--line);border-radius:2px;opacity:.6}
.unit.signature .icon-tile{aspect-ratio:auto;min-height:100%}
.unit.signature .icon-tile img{width:96px;height:96px}
.buildings li{grid-template-columns:152px 150px 1fr;align-items:center}
.bld{width:152px;height:114px;object-fit:cover;background:var(--surface);border:1px solid var(--line);border-radius:4px}
@media (max-width:860px){ .buildings li{grid-template-columns:96px 1fr;gap:var(--s2)} .buildings li p{grid-column:2} .bld{width:96px;height:72px} }


/* ---------- roster groups ---------- */
.roster-head{display:flex;justify-content:space-between;align-items:baseline;gap:var(--s2);margin:var(--s6) 0 var(--s3);padding-bottom:var(--s2);border-bottom:1px solid var(--line)}
.roster-head:first-of-type{margin-top:0}
.roster-head h3{font-size:clamp(22px,2vw,28px)}

/* ---------- video in an image frame ---------- */
.vid{display:block;width:100%;aspect-ratio:16/9;object-fit:cover;background:#000}

/* ---------- faction reveal v3: the stand-off. both factions face each other across the cut; hover a side and its text slides in over the other ---------- */
.reveal{--fac:#7FE0FF;--ease:cubic-bezier(.2,.7,.2,1);position:relative;border:1px solid var(--line);border-radius:6px;background:var(--surface);overflow:hidden;user-select:none}
.reveal.is-l{--fac:#FF6A2B}
.reveal .stage{position:relative;height:clamp(540px,calc(90vh - 200px),960px);overflow:clip}
/* the pieces: five skewed cards over the whole stage, 5px corners. a+b carry the Consortium (left), c+e+d the League (right).
   each card is skewed 8deg about its top-left; the image inside is counter-skewed and placed in stage coordinates (--x/--w are the card's
   left and width in % of the stage, --ix/--iw the image's). */
.reveal .pieces{position:absolute;inset:0;z-index:1;--lean:8deg}
.reveal .piece{position:absolute;top:0;bottom:0;left:calc(var(--x) * 1%);width:calc(var(--w) * 1%);transform-origin:0 0;transform:skewX(calc(-1 * var(--lean)));clip-path:inset(0 round 5px);transition:transform .6s var(--ease),opacity .45s ease}
.reveal .piece i{position:absolute;top:0;bottom:0;left:calc(100% * (var(--ix) - var(--x)) / var(--w));width:calc(100% * var(--iw) / var(--w));transform-origin:0 0;transform:skewX(var(--lean));background-size:cover}
.reveal .piece i.c{--ix:0;--iw:56;background-image:var(--img-c);background-position:50% 22%}
.reveal .piece i.l{--ix:44;--iw:56;background-image:var(--img-l);background-position:15% 50%}
.reveal .piece.a{--x:-20;--w:39.6}
.reveal .piece.b{--x:20.4;--w:29.2}
.reveal .piece.c{--x:50.4;--w:24.2;clip-path:inset(0 0 calc(40% + 4px) 0 round 5px)}
.reveal .piece.e{--x:50.4;--w:24.2;clip-path:inset(calc(60% + 4px) 0 0 0 round 5px)}
.reveal .piece.d{--x:75.4;--w:50}
.reveal .piece:hover{transform:skewX(calc(-1 * var(--lean))) translateY(-6px)}
.reveal.is-l .piece.a{transform:skewX(calc(-1 * var(--lean))) translateX(-14%);opacity:0}
.reveal.is-l .piece.b{transform:skewX(calc(-1 * var(--lean))) translateX(-10%);opacity:0;transition-delay:.05s}
.reveal.is-c .piece.d{transform:skewX(calc(-1 * var(--lean))) translateX(14%);opacity:0}
.reveal.is-c .piece.c,.reveal.is-c .piece.e{transform:skewX(calc(-1 * var(--lean))) translateX(10%);opacity:0;transition-delay:.05s}
/* the text panels: League slides in from the left (solid orange, dark text), Consortium from the right (surface, cyan). their inner edge is the centre cut */
.reveal .plain{position:absolute;top:0;bottom:0;width:56%;padding:var(--s4);display:grid;align-content:end;z-index:3;visibility:hidden;transition:transform .6s var(--ease),opacity .4s ease,visibility 0s linear .6s;pointer-events:none}
.reveal .plain.l{left:0;background:#FF6A2B;color:#1A0A03;clip-path:polygon(0 0,96.4% 0,82.1% 100%,0 100%);padding-right:20%;transform:translateX(-104%);opacity:0}
.reveal .plain.c{right:0;background:var(--surface);clip-path:polygon(17.9% 0,100% 0,100% 100%,3.6% 100%);padding-left:calc(18% + var(--s3));transform:translateX(104%);opacity:0}
.reveal.is-c .plain.c,.reveal.is-l .plain.l{transform:none;opacity:1;pointer-events:auto;visibility:visible;transition-delay:0s}
.reveal .plain .label{color:var(--fac)}
.reveal .plain.l .label{color:#3a1a08}
.reveal .plain h3{margin:var(--s2) 0 var(--s1);font-size:clamp(22px,2vw,28px)}
.reveal .plain .claim{font-family:var(--font-display);font-weight:600;font-size:clamp(20px,1.9vw,24px);text-transform:uppercase;line-height:1.15;color:var(--fac)}
.reveal .plain.l .claim{color:#1A0A03}
.reveal .plain p{margin-top:var(--s2);max-width:34ch;font-size:15.5px;line-height:1.5}
.reveal .plain.l p{color:#3a1a08}
.reveal .plain .link{display:inline-block;margin-top:var(--s3);color:var(--fac);pointer-events:auto;position:relative;z-index:4}
.reveal .plain.l .link{color:#1A0A03}
/* the labels under the stage: Consortium left, League right */
.reveal .ctl{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:var(--s3);padding:var(--s2) var(--s4);border-top:1px solid var(--line)}
.reveal .ctl button{font-family:var(--font-data);font-size:12px;letter-spacing:.14em;text-transform:uppercase;background:none;border:0;color:var(--dim);cursor:pointer;padding:6px 0;text-align:left;transition:color .3s}
.reveal .ctl button:last-child{text-align:right}
.reveal .ctl .hint{font-family:var(--font-data);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);opacity:.6}
.reveal.is-l .ctl button[data-side="l"],.reveal.is-c .ctl button[data-side="c"]{color:var(--fac)}
@media (prefers-reduced-motion:reduce){.reveal .piece,.reveal .plain{transition:none}.reveal .piece:hover{transform:skewX(calc(-1 * var(--lean)))}}
@media (max-width:900px){
  .reveal .stage{height:auto}
  .reveal .pieces{position:relative;inset:auto;aspect-ratio:4/3}
  .reveal .piece i.c{--iw:54}
  .reveal .piece i.l{--ix:46;--iw:54;background-position:30% 50%}
  .reveal.is-l .piece.a,.reveal.is-l .piece.b,.reveal.is-c .piece.c,.reveal.is-c .piece.d,.reveal.is-c .piece.e{transform:skewX(calc(-1 * var(--lean)));opacity:1}
  .reveal .plain{position:relative;width:100%;clip-path:none;transform:none;opacity:1;visibility:visible;padding:var(--s4) var(--s3);pointer-events:auto;transition:none}
  .reveal .plain.c{display:block;clip-path:none;transform:none;opacity:1;padding-left:var(--s3)}
  .reveal .plain.l{display:none;clip-path:none;transform:none;opacity:1;padding-right:var(--s3)}
  .reveal.is-l .plain.c{display:none}
  .reveal.is-l .plain.l{display:block}
  .reveal .ctl .hint{display:none}
  .reveal .ctl{grid-template-columns:1fr 1fr}
}

/* ========== motion layer ("orbital HUD"), added 31 Oct 2026 ==========
   Appended to the design system above. Every effect comes from the game's own language: things in
   orbit, things falling, and an RTS cursor. Everything degrades: no JS = static page, reduced
   motion = calm page, touch = no hover tricks. Behaviour lives in site.js ("motion layer"). */

:root{--ease-out:cubic-bezier(.2,.7,.2,1);--hud:rgba(236,233,226,.55)}
[hidden]{display:none !important}

/* page cross-fade between navigations (browsers that support it; others ignore it) */
@view-transition{navigation:auto}
::view-transition-old(root){animation-duration:.18s}
::view-transition-new(root){animation-duration:.28s}

/* ---------- accent shift: everything that carries the accent follows the hovered faction ---------- */
.btn.primary,.label.accent,.step .n,.link,.tracker .accent,.nav a,.page-head .claim,.timeline li.hot .when,.unit .vs b{transition:color .45s ease,background-color .45s ease,border-color .45s ease}
.hero h1 em{transition:color .45s ease}

/* ---------- header: frost away from the top, hide on the way down, return on the way up ---------- */
.header{transition:transform .4s var(--ease-out),background-color .4s ease,border-color .4s ease;background:rgba(11,13,16,.55);border-bottom-color:transparent}
.header.is-scrolled{background:rgba(11,13,16,.88);border-bottom-color:var(--line)}
.header.is-hidden{transform:translateY(-100%)}
.header.is-hidden .drop{display:none}
body.menu-open .header{transform:none;background:rgba(11,13,16,.88)}

/* ---------- hero: the sky ---------- */
.hero{isolation:isolate}
.hero .art{will-change:transform;transform:translate3d(0,var(--py,0px),0) scale(1.08);transform-origin:50% 30%}
@media (max-width:720px){ .hero .art{background-image:url(assets/a0-nadir-small.webp)} }
/* film grain over the art, under the copy */
.hero .grain{position:absolute;inset:0;z-index:1;pointer-events:none;opacity:.07;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-size:220px}
/* orbital tracking overlay: one arc, its ticks, Node Zero creeping along it */
.hero .orbit{position:absolute;inset:0;z-index:1;pointer-events:none;overflow:hidden}
.hero .orbit svg{position:absolute;left:50%;top:-6%;width:max(1500px,120vw);height:auto;transform:translateX(-50%);opacity:.9}
.hero .orbit .track{fill:none;stroke:var(--hud);stroke-width:1;opacity:.55}
.hero .orbit .ticks{fill:none;stroke:var(--hud);stroke-width:7;stroke-dasharray:1 46;opacity:.35}
.hero .orbit .decay{fill:none;stroke:var(--accent);stroke-width:1;stroke-dasharray:3 9;opacity:.35}
.hero .orbit .node{fill:#fff;filter:drop-shadow(0 0 6px #fff) drop-shadow(0 0 14px var(--accent))}
.hero .orbit .halo{fill:none;stroke:var(--accent);stroke-width:1;opacity:.7;transform-box:fill-box;transform-origin:center;animation:halo 2.4s ease-out infinite}
@keyframes halo{0%{transform:scale(.4);opacity:.8}100%{transform:scale(2.6);opacity:0}}
/* the HUD readout in the top-right corner; the art credit moves to the bottom */
.hero .hud{position:absolute;z-index:2;right:var(--edge);top:var(--s3);display:flex;align-items:center;gap:10px;color:var(--hud);text-align:right}
.hero .hud .live{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);animation:blink 1.6s infinite}
.hero .hud b{color:var(--ink);font-weight:500}
.hero .credit{top:auto;bottom:var(--s3);opacity:.6}
/* the copy arrives: label, headline, lead, buttons, one after the other */
.hero .copy>*{animation:rise .9s var(--ease-out) both}
.hero .copy>.label{animation-delay:.1s;display:block}   /* block, so the clip-path of the arrival keeps a second line on phones */
.hero .copy>h1{animation-delay:.25s}
.hero .copy>.lead{animation-delay:.45s}
.hero .copy>.cta{animation-delay:.6s}
@keyframes rise{from{opacity:0;transform:translateY(28px);clip-path:inset(0 0 100% 0)}60%{clip-path:inset(0 0 -20% 0)}to{opacity:1;transform:none;clip-path:inset(0 0 -20% 0)}}
.hero .hud,.hero .credit{animation:fade 1.2s ease both .9s}
@keyframes fade{from{opacity:0}}
/* the tracking plate (after an 18th-century astronomical plate): hairlines over the sky. Node Zero is A, the
   fragment crossing the arc inside its stippled halo and dashed orbit circle; B is the tracking station at Nadir,
   fixed at the bottom right, with its own halo and circle K. The sight line H, the drop line D, the level F and
   the baseline G follow A and fade while A is over the copy. site.js draws and moves it (not on phones). */
.hero .plate{position:absolute;inset:0;z-index:1;width:100%;height:100%;pointer-events:none;overflow:visible;color:var(--hud);animation:fade 1.6s ease both 1.2s}
.hero .plate line,.hero .plate circle{fill:none;stroke:currentColor;stroke-width:1}
.hero .plate .stip{stroke-dasharray:1 3;stroke-linecap:round;stroke-width:1.2;opacity:.65;transform-box:fill-box;transform-origin:center;animation:plate-spin 160s linear infinite}
.hero .plate .st .stip{animation-direction:reverse}
.hero .plate .ring{opacity:.5}
.hero .plate .big{stroke-dasharray:2 6;opacity:.45;transform-box:fill-box;transform-origin:center;animation:plate-spin 240s linear infinite}
.hero .plate .lvl{stroke-dasharray:4 5;opacity:.5}
.hero .plate .sight{opacity:.6}
.hero .plate .dot{fill:#fff;stroke:none;filter:drop-shadow(0 0 6px #fff) drop-shadow(0 0 14px var(--accent))}
.hero .plate .st .dot{filter:none;fill:var(--ink)}
.hero .plate text{fill:var(--ink);font-family:var(--font-data);font-size:10px;letter-spacing:.12em;opacity:.8}
@keyframes plate-spin{to{transform:rotate(360deg)}}
@media (min-width:721px){ .hero .orbit .halo,.hero .orbit .node{display:none} }   /* A replaces the SMIL node */
@media (max-width:720px){ .hero .plate{display:none} }
@media (prefers-reduced-motion:reduce){ .hero .plate .stip,.hero .plate .big{animation:none} }
@media (max-width:720px){ .hero .hud{left:var(--edge);right:auto;top:var(--s2);font-size:10px;letter-spacing:.1em;text-align:left;white-space:nowrap} .hero .hud .where{display:none} .hero .orbit svg{top:-2%;width:220vw} .hero .credit{display:none} }

/* ---------- page heads (every other page): the same arrival, on grid paper ---------- */
.page-head{position:relative}
.page-head .wrap>*{animation:rise .8s var(--ease-out) both}
.page-head .wrap>:nth-child(1){animation-delay:.05s}
.page-head .wrap>:nth-child(2){animation-delay:.15s}
.page-head .wrap>:nth-child(3){animation-delay:.28s}
.page-head .wrap>:nth-child(4){animation-delay:.4s}
.page-head .wrap>:nth-child(n+5){animation-delay:.5s}

/* ---------- buttons: the label swaps on hover, a link grows its line ---------- */
.btn .swap{position:relative;display:inline-block;overflow:hidden;line-height:1.3;vertical-align:top}
.btn .swap span{display:block;transition:transform .38s var(--ease-out)}
.btn .swap .b{position:absolute;left:0;top:0;transform:translateY(110%)}
.btn:hover .swap .a{transform:translateY(-110%)}
.btn:hover .swap .b{transform:translateY(0)}
.btn{transition:transform .3s var(--ease-out),box-shadow .3s ease,background-color .45s ease,border-color .45s ease,color .45s ease}
.btn:hover{transform:translateY(-2px)}
.btn.primary:hover{box-shadow:0 10px 28px -8px var(--accent)}
.link{position:relative;display:inline-block}
.link::after{content:"";position:absolute;left:0;right:0;bottom:-3px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left;transition:transform .35s var(--ease-out)}
.link:hover::after{transform:scaleX(1)}

/* ---------- things rise in as they arrive (site.js adds .rv below the fold, .in when visible) ---------- */
.rv{opacity:0;transform:translateY(22px);transition:opacity .7s ease,transform .8s var(--ease-out);transition-delay:calc(var(--i,0) * 80ms)}
.rv.in{opacity:1;transform:none}

/* ---------- RTS selection: hovering something you could select draws the targeting bracket ---------- */
.tgt{position:relative}
.tgt::before{content:"";position:absolute;inset:-14px;pointer-events:none;opacity:0;transition:opacity .25s ease,background-size .35s var(--ease-out);
  --c:var(--accent);--s:0px;
  background-image:linear-gradient(var(--c),var(--c)),linear-gradient(var(--c),var(--c)),linear-gradient(var(--c),var(--c)),linear-gradient(var(--c),var(--c)),
                   linear-gradient(var(--c),var(--c)),linear-gradient(var(--c),var(--c)),linear-gradient(var(--c),var(--c)),linear-gradient(var(--c),var(--c));
  background-repeat:no-repeat;
  background-position:0 0,0 0,100% 0,100% 0,0 100%,0 100%,100% 100%,100% 100%;
  background-size:var(--s) 1px,1px var(--s),var(--s) 1px,1px var(--s),var(--s) 1px,1px var(--s),var(--s) 1px,1px var(--s)}
.tgt:hover::before,.tgt:focus-within::before{opacity:1;--s:16px}
.tgt:hover>.label,.tgt:hover>.head .label,.tgt:hover>.n,.tgt:hover>.k,.tgt:hover>.when small{animation:flicker .5s steps(2,end) 1}
@keyframes flicker{0%{opacity:1}25%{opacity:.3}50%{opacity:1}75%{opacity:.5}100%{opacity:1}}
.steps .step{padding:var(--s3) 0 var(--s1)}
.dispatch-list li{padding:var(--s2) 0}
.unit.tgt::before,.faction.tgt::before{inset:-8px;border-radius:8px}
.unit,.faction{transition:border-color .3s ease,transform .4s var(--ease-out)}
.unit:hover,.faction:hover{border-color:var(--line-2)}
.unit:hover .img{filter:brightness(1.08)}
.unit .img{transition:filter .4s ease}
.tracker.tgt::before{inset:-10px -16px}
.entries li.tgt::before,.timeline li.tgt::before,.place.tgt::before{inset:-6px -16px}

/* ---------- data sections sit on grid paper ---------- */
#game,#fall,.page-head{position:relative}
#game::before,#fall::before,.page-head::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background-image:radial-gradient(rgba(236,233,226,.09) 1px,transparent 1.2px);background-size:28px 28px;
  -webkit-mask-image:linear-gradient(180deg,transparent,#000 20%,#000 80%,transparent);mask-image:linear-gradient(180deg,transparent,#000 20%,#000 80%,transparent)}
.section,.page-head{isolation:isolate}
/* the tracker line scans */
.tracker{position:relative;overflow:hidden}
.tracker::after{content:"";position:absolute;left:0;top:0;bottom:0;width:30%;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(255,106,43,.06),transparent);animation:scan 6s linear infinite}
@keyframes scan{from{transform:translateX(-100%)}to{transform:translateX(400%)}}

/* ---------- faction reveal: depth under the cursor ---------- */
.reveal .piece i{transition:background-position .4s var(--ease-out)}
.reveal .piece i.c{background-position:calc(50% + var(--px,0px)) 22%}
.reveal .piece i.l{background-position:calc(15% + var(--px,0px)) 50%}

/* ---------- lists: the art peeks out beside the cursor ---------- */
.peek{position:fixed;z-index:30;left:0;top:0;width:260px;aspect-ratio:16/9;border:1px solid var(--line-2);border-radius:4px;background:var(--surface) center/cover no-repeat;
  pointer-events:none;opacity:0;transform:translate(-50%,-50%) scale(.92) rotate(-2deg);transition:opacity .25s ease,transform .35s var(--ease-out);box-shadow:0 30px 60px -20px rgba(0,0,0,.8)}
.peek.on{opacity:1;transform:translate(-50%,-50%) scale(1) rotate(0)}
@media (hover:none),(max-width:860px){ .peek{display:none} }

/* ---------- type-in for labels (site.js) ---------- */
.typing::after{content:"_";color:var(--accent);animation:blink .8s steps(1) infinite}

/* ---------- trailer popup (site.js) ---------- */
.rf-trailer{border:0;padding:0;margin:auto;background:transparent;width:min(1100px,92vw);max-width:none;color:var(--ink)}
.rf-trailer::backdrop{background:rgba(11,13,16,.92)}
.rf-trailer .frame{position:relative;aspect-ratio:16/9;background:#000;border:1px solid var(--line-2);border-radius:4px;overflow:hidden}
.rf-trailer iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.rf-trailer .bar{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-top:12px;font-family:var(--font-data);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);line-height:1.4}
.rf-trailer .close{font:inherit;color:var(--ink);background:transparent;border:1px solid var(--line-2);border-radius:4px;padding:8px 12px;cursor:pointer;white-space:nowrap}
.rf-trailer .close:hover{border-color:var(--ink-2)}
@media (max-width:720px){ .rf-trailer .bar{flex-direction:column;align-items:flex-start} }

/* ---------- calm version ---------- */
@media (prefers-reduced-motion:reduce){
  .hero .copy>*,.page-head .wrap>*,.hero .hud,.hero .credit,.hero .orbit .halo,.tracker::after,.tgt:hover>.label,.tgt:hover>.n{animation:none}
  .hero .art{transform:none}
  .rv{opacity:1;transform:none;transition:none}
  .btn:hover{transform:none}
  .btn .swap span{transition:none}
  .peek{display:none}
  ::view-transition-old(root),::view-transition-new(root){animation:none}
}

/* ========== schematic layer (plates, traces, furniture), added 31 Oct 2026 ==========
   The maintenance-schematic language: angled plates carry the small labels, thin traces connect a
   label to the thing it annotates, hatch strips and corner marks dress the cards, mono codes sit
   at the end of lines. Rules: one corner cut, never two; every trace joins two real things; the
   numbers are the world's numbers. Appended after the motion layer; draw-in rides on .rv/.in. */

:root{--plate-ink:var(--ink);--plate-text:var(--field);--cut:10px;
  --hatch:repeating-linear-gradient(135deg,var(--line-2) 0 1px,transparent 1px 6px);
  --chev:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='10'%3E%3Cpath fill='%23ECE9E2' fill-opacity='.55' d='M0 0h6l4 5-4 5H0l4-5zM10 0h6l4 5-4 5h-6l4-5zM20 0h6l4 5-4 5h-6l4-5z'/%3E%3C/svg%3E")}
body{counter-reset:sec}

/* ---------- plates: the small label on an angled plate, a trailing line, a hatch strip, a code ---------- */
.label.plate{position:relative;isolation:isolate;display:inline-block;padding:5px 18px 4px 10px;color:var(--plate-text);line-height:1.3}
.label.plate::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--plate-ink);
  clip-path:polygon(0 0,calc(100% - var(--cut)) 0,100% 100%,0 100%);transform-origin:left center}
.label.plate a,.label.plate b{color:inherit}
.label.plate.accent{--plate-ink:var(--accent);--plate-text:var(--accent-ink)}
/* outline variant: accent stroke, no fill */
.label.plate.outline{color:var(--accent);background:
  linear-gradient(var(--accent),var(--accent)) 0 0/calc(100% - var(--cut)) 1px no-repeat,
  linear-gradient(var(--accent),var(--accent)) 0 100%/100% 1px no-repeat,
  linear-gradient(var(--accent),var(--accent)) 0 0/1px 100% no-repeat,
  linear-gradient(var(--accent),var(--accent)) 100% 0/1px 100% no-repeat}
.label.plate.outline::before{background:none;clip-path:none;
  background:linear-gradient(to top right,transparent calc(50% - .5px),var(--accent) 50%,transparent calc(50% + .5px)) 100% 0/var(--cut) var(--cut) no-repeat}
/* section heads: plate + line + hatch + a running section code */
.section-head{counter-increment:sec}
.section-head>div>.label.plate::after{content:"//:" counter(sec,decimal-leading-zero);position:absolute;left:100%;top:50%;transform:translateY(-50%);
  padding-left:132px;color:var(--dim);white-space:nowrap;
  background:linear-gradient(var(--line-2),var(--line-2)) 12px 50%/56px 1px no-repeat,
             linear-gradient(var(--ink),var(--ink)) 40px calc(50% - 1px)/14px 3px no-repeat,
             var(--hatch) 80px 45%/40px 8px no-repeat}
.section-head>div>.label.plate.hazard{padding-left:30px}
.section-head>div>.label.plate.hazard::after{content:"//:" counter(sec,decimal-leading-zero) " · IMPACT"}
.label.plate.hazard i{position:absolute;left:10px;top:50%;width:12px;height:11px;transform:translateY(-50%);background:var(--accent);clip-path:polygon(50% 0,100% 100%,0 100%)}
.label.plate.hazard i::after{content:"";position:absolute;left:5px;top:4px;width:2px;height:5px;background:var(--accent-ink)}
/* page heads: the kicker becomes a plate with a bar running off to the right */
.page-head .wrap>.label:first-child{display:inline-block}
.page-head .wrap>.label.plate::after{content:"";position:absolute;left:100%;top:50%;width:min(320px,30vw);height:1px;margin-left:12px;
  background:linear-gradient(90deg,var(--line-2) 0 70%,transparent 70%),linear-gradient(var(--ink),var(--ink)) 30% 0/18px 3px no-repeat;background-position:0 0,30% -1px;background-repeat:no-repeat}
/* roster heads and the tracker: a bar, not a plate */
.roster-head .label,.tracker .data{position:relative}
.roster-head .label::before{content:"";position:absolute;right:calc(100% + 12px);top:50%;width:60px;height:1px;background:var(--line-2)}
.tracker{background:var(--hatch) 0 0/120px 7px no-repeat}
/* unit cards: the role tag sits as a plate over the top-left corner, the top-right corner is cut, chevrons point on */
.unit{overflow:visible}
.unit .head .label.plate{position:absolute;left:-1px;top:-1px;z-index:2;font-size:11px;padding:4px 16px 3px 9px}
.unit::after{content:"";position:absolute;right:-1px;top:-1px;width:0;height:0;border-style:solid;border-width:0 16px 16px 0;border-color:transparent var(--field) transparent transparent;pointer-events:none}
.unit .chev{position:absolute;right:12px;top:6px;width:30px;height:10px;background:var(--chev) no-repeat;pointer-events:none}
/* cards without art (the fallen structures): make room under the plate, let the name run full width */
.unit.plain{padding-top:calc(var(--s3) + 22px)}
.unit.plain .head{display:block}
.unit.plain .vs b{color:var(--accent);font-weight:500}
/* people, places, steps, dispatches: a small square marker where the bracket's corner would be */
.steps .step .n{position:relative}
.steps .step .n::after{content:"";position:absolute;left:-6%;top:54%;width:112%;height:3px;background:var(--field);transform:rotate(-45deg);pointer-events:none}
.dispatch>.label.plate{margin-bottom:var(--s1)}

/* ---------- traces in the hero: from the HUD readout into the sky ---------- */
.hero .hud::before{content:"";position:absolute;right:calc(100% + 12px);top:50%;width:120px;height:1px;background:
  linear-gradient(var(--hud),var(--hud)) 0 0/100% 1px no-repeat,linear-gradient(var(--ink),var(--ink)) 36px -1px/16px 3px no-repeat;background-repeat:no-repeat}
.hero .hud::after{content:"";position:absolute;right:calc(100% + 132px);top:50%;width:1px;height:72px;background:var(--hud);transform-origin:top;transform:rotate(45deg);opacity:.8}
.hero .hud .end{position:absolute;right:calc(100% + 132px + 51px);top:calc(50% + 51px);width:5px;height:5px;margin:-2px 0 0 -2px;border-radius:50%;background:var(--ink)}
@media (max-width:720px){ .hero .hud::before,.hero .hud::after,.hero .hud .end{display:none} .page-head .wrap>.label.plate::after,.section-head>div>.label.plate::after{display:none} }
@media (max-width:1000px){ .section-head>div>.label.plate::after{padding-left:76px;background-size:30px 1px,10px 3px,24px 8px;background-position:10px 50%,24px calc(50% - 1px),48px 45%} }

/* ---------- draw-in: plates grow from the left, lines after them ---------- */
.rv .label.plate::before{transform:scaleX(0);transition:transform .5s var(--ease-out) .15s}
.rv.in .label.plate::before{transform:scaleX(1)}
.rv .label.plate::after{opacity:0;transition:opacity .4s ease .55s}
.rv.in .label.plate::after{opacity:1}
.page-head .wrap>.label.plate::before{animation:plate-in .55s var(--ease-out) both .1s}
.page-head .wrap>.label.plate::after{animation:fade .5s ease both .6s}
.hero .hud::before,.hero .hud::after,.hero .hud .end{animation:fade .6s ease both 1.4s}
@keyframes plate-in{from{transform:scaleX(0)}}
@media (prefers-reduced-motion:reduce){
  .rv .label.plate::before,.rv .label.plate::after,.page-head .wrap>.label.plate::before,.page-head .wrap>.label.plate::after{transition:none;animation:none;transform:none;opacity:1}
  .hero .hud::before,.hero .hud::after,.hero .hud .end{animation:none}
}

/* ---------- rails: vertical lines that turn 45° into a horizontal, the poster's signature ----------
   Drawn with background gradients on one pseudo-element: a 1px vertical, a 1px diagonal in a square,
   a 1px horizontal, a dot. --railx is where the rail sits in the gutter left of the content. */
:root{--railx:-18px;--rail:var(--line-2);
  --diag:linear-gradient(45deg,transparent calc(50% - .5px),var(--rail) calc(50% - .5px),var(--rail) calc(50% + .5px),transparent calc(50% + .5px));
  --seg:linear-gradient(var(--rail),var(--rail));
  --dot:radial-gradient(circle,var(--ink) 0 2px,transparent 2.5px)}
@media (max-width:720px){ :root{--railx:-12px} }
/* section head: down the left of the heading, elbow under it, out towards the content */
.section-head::before{content:"";position:absolute;left:var(--railx);top:14px;width:60px;height:calc(100% + 26px);pointer-events:none;
  background:var(--seg) 0 0/1px calc(100% - 12px) no-repeat,var(--diag) 0 100%/12px 12px no-repeat,
             var(--seg) 12px calc(100% - 1px)/42px 1px no-repeat,var(--dot) 52px calc(100% - 1px)/6px 6px no-repeat;
  background-position:0 0,0 100%,12px 100%,54px calc(100% + 2px)}
.section-head.rv::before{opacity:0;transition:opacity .5s ease .55s}
.section-head.rv.in::before{opacity:1}
/* page head: from the kicker plate down to the facts row (site.js measures the drop into --rail-h) */
.page-head .wrap{position:relative}
.page-head .wrap::before{content:"";position:absolute;left:var(--railx);top:14px;width:60px;height:var(--rail-h,0px);pointer-events:none;
  background:var(--seg) 0 0/1px calc(100% - 12px) no-repeat,var(--diag) 0 100%/12px 12px no-repeat,var(--seg) 12px 100%/48px 1px no-repeat;
  animation:fade .6s ease both .7s}
/* steps and timeline: one rail, an elbow into every entry */
.steps,.timeline{position:relative}
.steps::before,.timeline::before{content:"";position:absolute;left:var(--railx);top:0;bottom:0;width:7px;pointer-events:none;
  background:var(--seg) 0 0/1px 100% no-repeat,linear-gradient(var(--ink),var(--ink)) 0 0/7px 7px no-repeat,var(--dot) -2px 100%/6px 6px no-repeat}
.steps .step::after,.timeline li::after{content:"";position:absolute;left:var(--railx);top:calc(var(--s3) + 14px);width:18px;height:12px;pointer-events:none;
  background:var(--diag) 0 0/12px 12px no-repeat,var(--seg) 12px 11px/6px 1px no-repeat}
.timeline li::after{top:calc(var(--s3) + 12px)}
.timeline li.hot::after{--rail:var(--accent)}
/* hero: the HUD trace continues straight down after the elbow and ends in a dot */
.hero .hud .end{width:1px;height:120px;margin:0;border-radius:0;background:var(--hud);opacity:.8}
.hero .hud .end::after{content:"";position:absolute;left:-2px;bottom:-3px;width:5px;height:5px;border-radius:50%;background:var(--ink)}
@media (max-width:720px){ .section-head::before,.page-head .wrap::before{display:none} .hero .hud .end{display:none} }
@media (prefers-reduced-motion:reduce){ .section-head.rv::before{opacity:1;transition:none} .page-head .wrap::before{animation:none} }

/* ========== factions stand-off v4 (home), added 31 Oct 2026 ==========
   On top of the reveal: faction tags on the art, a scanning seam at the cut, a targeting bracket on the
   hovered side, five doctrine bars whose markers slide to the hovered faction, and the shared skeleton:
   eight role slots, each answered by both sides. Driven by .reveal.is-c / .is-l, so it is all CSS. */
.reveal{--c:#7FE0FF;--l:#FF6A2B;--c-ink:#03171C;--l-ink:#1A0A03}

/* tags over the art, one per side; the active side's tag takes its colour */
.reveal .tag{position:absolute;top:0;z-index:4;pointer-events:none;transition:opacity .4s ease,transform .5s var(--ease-out)}
.reveal .tag.c{left:0;--plate-ink:var(--ink);--plate-text:var(--field)}
.reveal .tag.l{right:0;--plate-ink:var(--ink);--plate-text:var(--field);padding:5px 10px 4px 18px}
.reveal .tag.l::before{clip-path:polygon(var(--cut) 0,100% 0,100% 100%,0 100%)}
.reveal.is-c .tag.c{--plate-ink:var(--c);--plate-text:var(--c-ink)}
.reveal.is-l .tag.l{--plate-ink:var(--l);--plate-text:var(--l-ink)}
.reveal.is-c .tag.l,.reveal.is-l .tag.c{opacity:0;transform:translateY(-8px)}

/* the seam: a slow scan up and down the cut while nobody has chosen a side */
.reveal .seam{position:absolute;left:50%;top:0;bottom:0;width:1px;z-index:2;pointer-events:none;transform:skewX(-8deg);transform-origin:top;
  background:linear-gradient(180deg,transparent,var(--ink) 50%,transparent) 0 0/100% 40% no-repeat;opacity:.55;animation:seam 5s ease-in-out infinite alternate;transition:opacity .4s}
@keyframes seam{from{background-position:0 -40%}to{background-position:0 140%}}
.reveal.is-c .seam,.reveal.is-l .seam{opacity:0}

/* targeting bracket around the chosen side */
.reveal .stage::after{content:"";position:absolute;top:14px;bottom:14px;width:calc(50% - 28px);z-index:4;pointer-events:none;opacity:0;transition:opacity .3s ease,background-size .4s var(--ease-out);
  --b:var(--ink);--s:0px;
  background-image:linear-gradient(var(--b),var(--b)),linear-gradient(var(--b),var(--b)),linear-gradient(var(--b),var(--b)),linear-gradient(var(--b),var(--b)),
                   linear-gradient(var(--b),var(--b)),linear-gradient(var(--b),var(--b)),linear-gradient(var(--b),var(--b)),linear-gradient(var(--b),var(--b));
  background-repeat:no-repeat;background-position:0 0,0 0,100% 0,100% 0,0 100%,0 100%,100% 100%,100% 100%;
  background-size:var(--s) 1px,1px var(--s),var(--s) 1px,1px var(--s),var(--s) 1px,1px var(--s),var(--s) 1px,1px var(--s)}
.reveal.is-c .stage::after{left:14px;opacity:1;--s:22px;--b:var(--c)}
.reveal.is-l .stage::after{right:14px;opacity:1;--s:22px;--b:var(--l)}

/* the text panels: their kicker is a plate in the panel's own colours */
.reveal .plain.c .label.plate{--plate-ink:var(--c);color:var(--c-ink)}
.reveal .plain.l .label.plate{--plate-ink:var(--l-ink);color:var(--l)}

/* doctrine bars between the two buttons */
.reveal .ctl{grid-template-columns:auto 1fr auto;align-items:center;gap:var(--s4)}
.reveal .doctrine{display:grid;gap:6px;max-width:560px;margin:0 auto;width:100%}
.reveal .doctrine .row{display:grid;grid-template-columns:64px 112px 1fr 112px;white-space:nowrap;align-items:center;gap:10px;font-family:var(--font-data);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.reveal .doctrine .k{color:var(--dim);opacity:.7}
.reveal .doctrine .c{text-align:right}
.reveal .doctrine .c,.reveal .doctrine .l{transition:color .35s ease,opacity .35s ease}
.reveal .doctrine i{position:relative;display:block;height:14px;
  background:linear-gradient(var(--line-2),var(--line-2)) 0 50%/100% 1px no-repeat,repeating-linear-gradient(90deg,var(--line-2) 0 1px,transparent 1px 12.5%) 0 4px/100% 6px no-repeat}
.reveal .doctrine i::after{content:"";position:absolute;top:2px;left:50%;width:10px;height:10px;margin-left:-5px;background:var(--ink);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);transition:left .55s var(--ease-out),background-color .35s ease}
.reveal.is-c .doctrine i::after{left:10%;background:var(--c)}
.reveal.is-l .doctrine i::after{left:90%;background:var(--l)}
.reveal.is-c .doctrine .c{color:var(--c)}
.reveal.is-l .doctrine .l{color:var(--l)}
.reveal.is-c .doctrine .l,.reveal.is-l .doctrine .c{opacity:.45}
.reveal .doctrine .row:nth-child(2) i::after{transition-delay:.04s}
.reveal .doctrine .row:nth-child(3) i::after{transition-delay:.08s}
.reveal .doctrine .row:nth-child(4) i::after{transition-delay:.12s}
.reveal .doctrine .row:nth-child(5) i::after{transition-delay:.16s}

/* the shared skeleton: eight role slots, Consortium answer above, League answer below */
.reveal .skeleton{padding:var(--s3) var(--s4) var(--s4);border-top:1px solid var(--line)}
.reveal .skeleton .head{display:flex;justify-content:space-between;align-items:baseline;gap:var(--s3);margin-bottom:var(--s3)}
.reveal .skeleton ol{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(8,1fr);gap:var(--s2)}
.reveal .skeleton li{display:grid;justify-items:center;gap:6px;text-align:center}
.reveal .skeleton img{width:44px;height:44px;padding:8px;border:1px solid var(--line);border-radius:4px;background:var(--surface);transition:border-color .35s ease,transform .4s var(--ease-out)}
.reveal .skeleton span{font-family:var(--font-data);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.reveal .skeleton b{font-family:var(--font-display);font-weight:600;font-size:15px;text-transform:uppercase;line-height:1.1;color:var(--ink-2);transition:color .35s ease,opacity .35s ease}
.reveal.is-c .skeleton b.c{color:var(--c)} .reveal.is-l .skeleton b.l{color:var(--l)}
.reveal.is-c .skeleton b.l,.reveal.is-l .skeleton b.c{opacity:.35}
.reveal.is-c .skeleton img{border-color:var(--c)} .reveal.is-l .skeleton img{border-color:var(--l)}
.reveal .skeleton li:hover img{transform:translateY(-3px)}
@media (max-width:1000px){ .reveal .skeleton ol{grid-template-columns:repeat(4,1fr);gap:var(--s3) var(--s2)} }
@media (max-width:900px){
  .reveal .ctl{grid-template-columns:1fr 1fr;grid-template-areas:"c l" "d d"}
  .reveal .ctl button[data-side="c"]{grid-area:c} .reveal .ctl button[data-side="l"]{grid-area:l} .reveal .doctrine{grid-area:d;max-width:none}
  .reveal .doctrine .row{grid-template-columns:52px 80px 1fr 80px}
  .reveal .tag{font-size:10px}
}
@media (max-width:640px){ .reveal .skeleton ol{grid-template-columns:repeat(2,1fr)} .reveal .doctrine .row{grid-template-columns:48px 72px 1fr 72px;font-size:10px} }
@media (prefers-reduced-motion:reduce){ .reveal .seam{animation:none} }

/* ========== plan layer (zones, grid patches, crosshairs, giant numerals, edge strip, junction), added 31 Oct 2026 ==========
   The site plan under the site: large faint tonal zones with one 45° chamfer and an arc, a cross grid on
   the right third of the second section, a [ + ] crosshair with a letter on the predicted impact
   site, a giant section numeral, the wordmark running down the page edge, and the emblem at the junction
   of the two factions. site.js injects the elements (<i class="deco zone|gridfield|xhair|numeral">, .edge,
   .junction); without JS the page is simply calmer.
   Every .section is positioned so its decoration stays inside it (fixed 3 Nov 2026: unpositioned
   sections let their zones, numerals and grids fall through to the first screen, onto the hero). */

.section{position:relative;overflow:clip}
.deco{position:absolute;pointer-events:none;z-index:0}
.section>.wrap,.page-head>.wrap{position:relative;z-index:1}

/* zones: a big faint field with one chamfered corner and a thin arc on its inner edge */
.zone{top:8%;bottom:8%;width:52%;background:rgba(236,233,226,.028);clip-path:polygon(0 0,100% 0,100% calc(100% - 120px),calc(100% - 120px) 100%,0 100%)}
.zone.r{right:0}
.zone.l{left:0;clip-path:polygon(0 0,100% 0,100% 100%,120px 100%,0 calc(100% - 120px))}
.zone::after{content:"";position:absolute;width:62%;aspect-ratio:1;border:1px solid rgba(236,233,226,.14);border-radius:50%;top:-20%}
.zone.r::after{left:-31%} .zone.l::after{right:-31%}

/* the cross grid: the right third of the second section below the hero (where a page has one), full height,
   fading in from the left. Inverted from Chris's reference (3 Nov 2026): faint lines, a brighter + at every
   intersection, 56px cells, tiled from the right edge. */
.gridfield{top:0;bottom:0;right:0;width:34%;min-width:300px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='56' height='56'%3E%3Cpath d='M28.5 0v56M0 28.5h56' stroke='rgba(236,233,226,.07)'/%3E%3Cpath d='M28.5 22v13M22 28.5h13' stroke='rgba(236,233,226,.34)'/%3E%3C/svg%3E") 100% 0/56px 56px;
  -webkit-mask:linear-gradient(90deg,transparent,#000 48%);mask:linear-gradient(90deg,transparent,#000 48%)}

/* crosshair: [ + ] with a letter */
.xhair{width:26px;height:26px;z-index:2;color:var(--ink);
  background:linear-gradient(currentColor,currentColor) 50% 0/1px 7px no-repeat,linear-gradient(currentColor,currentColor) 50% 100%/1px 7px no-repeat,
             linear-gradient(currentColor,currentColor) 0 50%/7px 1px no-repeat,linear-gradient(currentColor,currentColor) 100% 50%/7px 1px no-repeat}
.xhair::before{content:"";position:absolute;inset:-8px;
  background:linear-gradient(currentColor,currentColor) 0 0/7px 1px no-repeat,linear-gradient(currentColor,currentColor) 0 0/1px 7px no-repeat,
             linear-gradient(currentColor,currentColor) 100% 0/7px 1px no-repeat,linear-gradient(currentColor,currentColor) 100% 0/1px 7px no-repeat,
             linear-gradient(currentColor,currentColor) 0 100%/7px 1px no-repeat,linear-gradient(currentColor,currentColor) 0 100%/1px 7px no-repeat,
             linear-gradient(currentColor,currentColor) 100% 100%/7px 1px no-repeat,linear-gradient(currentColor,currentColor) 100% 100%/1px 7px no-repeat}
.xhair::after{content:attr(data-k);position:absolute;left:-6px;top:-8px;font-family:var(--font-data);font-size:9px;letter-spacing:.1em;color:var(--hud)}
.xhair.accent{color:var(--accent)}
.hero .xhair{animation:fade 1s ease both 1.8s}

/* giant numeral in the section corner */
.numeral{right:-.04em;bottom:-.18em;font-family:var(--font-display);font-weight:700;font-size:clamp(160px,26vw,420px);line-height:1;letter-spacing:-.02em;color:rgba(236,233,226,.035);user-select:none}
.numeral.l{right:auto;left:-.04em}

/* the wordmark running down the right edge on wide screens */
.edge{position:fixed;right:10px;top:var(--header);bottom:0;z-index:5;display:none;writing-mode:vertical-rl;font-family:var(--font-data);font-size:10px;letter-spacing:.3em;text-transform:uppercase;
  color:var(--dim);opacity:.55;white-space:nowrap;overflow:hidden;line-height:1;pointer-events:none}
.edge span{display:block;animation:edge 90s linear infinite}
@keyframes edge{to{transform:translateY(-50%)}}
@media (min-width:1440px){ .edge{display:block} }

/* the emblem at the junction of the two factions: a rotated square on the seam, the mark upright inside */
.reveal .ctl{position:relative}
.reveal .ctl::before{content:"";position:absolute;left:50%;top:0;width:34px;height:34px;transform:translate(-50%,-50%) rotate(45deg);z-index:5;background:var(--field);border:1px solid var(--ink-2);transition:border-color .35s ease}
.reveal .ctl::after{content:"";position:absolute;left:50%;top:0;width:46px;height:46px;transform:translate(-50%,-50%) rotate(45deg);border:1px solid var(--line-2);z-index:4}
.reveal.is-c .ctl::before{border-color:var(--c)} .reveal.is-l .ctl::before{border-color:var(--l)}
.reveal .junction{position:absolute;left:50%;top:0;width:34px;height:34px;transform:translate(-50%,-50%);z-index:6;background:url(assets/logo-mark.png) center/58% no-repeat;pointer-events:none}

/* the skeleton strip sits on a field of small crosses */
.reveal .skeleton{background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28'%3E%3Cpath d='M14 11v6M11 14h6' stroke='%23333A44' stroke-width='1'/%3E%3C/svg%3E") 0 0/28px 28px}

@media (max-width:900px){ .zone{display:none} .numeral{font-size:120px} }
@media (max-width:720px){ .gridfield{width:46%;min-width:0} .page-head .xhair,.hero .xhair{display:none} .reveal .ctl::after{display:none} }
@media (prefers-reduced-motion:reduce){ .edge span{animation:none} .hero .xhair{animation:none} }

/* decoration must never add a horizontal scrollbar */
html,body{overflow-x:clip}
