:root{--paper:#f2f0ea;--mute:#8c8c8c;--slab:#474747;--slab2:#5a5a5a}
html,body{margin:0;background:#0c0c0c;color:var(--paper);overflow-x:clip}
body{font-family:'Instrument Sans',system-ui,sans-serif;-webkit-font-smoothing:antialiased}
html.gated,html.gated body{overflow:hidden}
#world{position:fixed;inset:0;width:100%;height:100%;display:block}
#track{position:relative;pointer-events:none}
.hook *{transition:none!important}
[hidden]{display:none!important}

/* gate */
.gate{position:fixed;inset:0;z-index:30;display:grid;place-items:center;background-color:#0c0c0c;
  background-image:radial-gradient(#232323 1.1px,transparent 1.3px);background-size:7px 7px;transition:opacity .6s ease}
.gate.gone{opacity:0}
.gate .bits i{position:absolute;width:14px;height:14px}
.gate .inner{position:relative;width:min(760px,84vw,calc((100vh - 230px)*1.3))}
.gate .mk{display:block;width:100%;height:auto}
.gate .row{display:flex;justify-content:space-between;align-items:flex-start;gap:24px;margin-top:min(52px,5vh);flex-wrap:wrap}
.gate .nm{font-size:clamp(28px,3.1vw,38px);font-weight:600;line-height:1.06;letter-spacing:-.012em}
.gate .nm span{color:var(--mute);font-weight:500}
.gate .en{width:min(300px,100%)}
.enter,.go{display:flex;align-items:center;justify-content:space-between;width:100%;height:62px;box-sizing:border-box;padding:0 22px;
  background:var(--slab);color:#fff;border:0;font:600 17px/1 'Instrument Sans',system-ui,sans-serif;letter-spacing:.01em;cursor:pointer;text-decoration:none;
  box-shadow:inset 0 -3px 0 rgba(0,0,0,.28)}
.enter:hover,.go:hover{background:var(--slab2)}
.enter:focus-visible,.go:focus-visible,.rail a:focus-visible,.talk:focus-visible{outline:3px solid #f0c419;outline-offset:3px}
.ar{width:18px;height:16px}
.gate small{display:block;margin-top:12px;color:#7a7a7a;font:500 12px/1.4 'IBM Plex Mono',monospace;letter-spacing:.03em}

/* rail */
.rail{position:fixed;left:30px;top:26px;z-index:10;width:190px}
.rail .mk{display:block;width:66px;height:auto}
.rail .nm{font-weight:600;font-size:15px;line-height:1.1;margin:11px 0 30px;text-shadow:0 1px 8px #0c0c0c}
.rail nav a{display:flex;align-items:center;gap:9px;color:#8a8a8a;text-decoration:none;font-size:13.5px;padding:4px 0;text-shadow:0 1px 8px #0c0c0c}
.rail nav a::before{content:"";width:7px;height:7px;background:#3c3c3c;flex:none}
.rail nav a:hover{color:#d8d8d8}
.rail nav a.on{color:#fff}
.rail nav a.on::before{background:var(--c)}
.rail.line nav{position:relative;padding-left:2px}
.rail.line nav::before{content:"";position:absolute;left:5px;top:12px;bottom:12px;width:3px;background:#3d8fd6}
.rail.line nav a{position:relative;padding:6px 0}
.rail.line nav a::before{width:9px;height:9px;background:#0c0c0c;box-shadow:inset 0 0 0 3px #3d8fd6}
.rail.line nav a.on::before{background:#fff;box-shadow:inset 0 0 0 3px #fff}
.count{display:none}
.talk{position:fixed;left:30px;bottom:28px;z-index:10;color:#cfcfcf;font-size:13.5px;text-decoration:none;border-bottom:2px solid #474747;padding-bottom:3px}
.talk:hover{color:#fff;border-color:#f0c419}

/* chapter cards: a pixel sign. The stop's colour is the header band and the button, the corners are
   stepped like the city's voxels, and there is no sunken text well (John 2026-09-15) */
.card{--n:8px;position:fixed;right:34px;bottom:34px;z-index:10;width:min(440px,37vw);box-sizing:border-box;padding:0 0 24px;background:#111;
  box-shadow:inset 0 0 0 2px #262626;opacity:0;transform:translateY(16px);transition:opacity .35s ease,transform .35s ease;pointer-events:none;
  clip-path:polygon(0 var(--n),var(--n) var(--n),var(--n) 0,calc(100% - var(--n)) 0,calc(100% - var(--n)) var(--n),100% var(--n),100% calc(100% - var(--n)),calc(100% - var(--n)) calc(100% - var(--n)),calc(100% - var(--n)) 100%,var(--n) 100%,var(--n) calc(100% - var(--n)),0 calc(100% - var(--n)))}
.card.on{opacity:1;transform:none;pointer-events:auto}
.card .k::before{content:"";width:9px;height:9px;background:#000;margin-right:1px}
.card .k{display:flex;align-items:center;gap:10px;padding:11px 24px 10px;background:var(--c);color:#000;font:500 12px/1 'IBM Plex Mono',monospace;letter-spacing:.08em;text-transform:uppercase}
.card .k i{display:none}
.card h2{position:relative;margin:18px 24px 12px;font-size:35px;line-height:1.05;font-weight:600;letter-spacing:-.014em;color:#fff;
  text-shadow:0 0 12px color-mix(in srgb,var(--c) 30%,transparent),0 0 30px color-mix(in srgb,var(--c) 15%,transparent)}
.card h2::before{content:"";position:absolute;z-index:-1;inset:-16px -24px;pointer-events:none;
  background:radial-gradient(ellipse 75% 105% at 30% 50%,color-mix(in srgb,var(--c) 15%,transparent),transparent 70%)}
.card p{margin:0 24px 20px;font-size:17.5px;line-height:1.5;color:#d2cdc4}
.card .go{width:calc(100% - 48px);margin:0 24px;height:56px;padding:0 20px;color:#000;background:var(--c);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.35),inset 0 -4px 0 rgba(0,0,0,.28);transition:transform .09s ease,box-shadow .09s ease,background .15s ease}
.card .go:hover{background:color-mix(in srgb,var(--c) 86%,#fff)}
.card .go:active,.card .go.going{transform:translateY(3px);box-shadow:inset 0 1px 0 rgba(255,255,255,.3),inset 0 -1px 0 rgba(0,0,0,.28)}
.card .go .ar{transition:transform .16s ease}
.card .go:active .ar{transform:translateX(5px)}
.card .go.going .ar{transform:translateX(26px);opacity:0;transition:transform .3s cubic-bezier(.5,0,.9,.4),opacity .3s ease}
/* leaving through a card's button: bits pop, the card drops away, the screen goes dark, then the link opens */
.nl-bit{position:fixed;z-index:41;pointer-events:none}
.nl-veil{position:fixed;inset:0;z-index:40;background:#0c0c0c;opacity:0;pointer-events:none;transition:opacity .26s ease}
html.leaving .nl-veil{opacity:1;transition-delay:.36s}
html.leaving .card.on{opacity:0;transform:translateY(26px);transition:opacity .28s ease .2s,transform .28s ease .2s}
.stats{display:grid;grid-template-columns:1fr 1fr;gap:16px 20px;margin:-2px 24px 22px}
.stats b{display:block;font-size:30px;line-height:1.05;font-weight:600;letter-spacing:-.02em;color:#fff;
  text-shadow:0 0 10px color-mix(in srgb,var(--c) 30%,transparent),0 0 22px color-mix(in srgb,var(--c) 14%,transparent)}
.stats span{display:block;margin-top:4px;font-size:14px;line-height:1.35;color:#9d9a94}

.card-left .card{left:34px;right:auto}
.card-left .talk{display:none}

@media (max-width:700px){
  .rail{left:14px;top:12px;width:auto;display:flex;align-items:center;gap:10px}
  .rail .mk{width:42px}
  .rail .nm{margin:0;font-size:13px}
  .rail nav{display:none}
  .talk{display:none}
  /* phone card: the same sign, tighter, and no stop counter (John 2026-09-15), so the world keeps more of the screen */
  .card{--n:6px;left:12px;right:12px;bottom:12px;width:auto;padding-bottom:16px}
  .card .k{padding:9px 16px 8px;font-size:11.5px;letter-spacing:.07em}
  .card .k::before{width:8px;height:8px}
  .card h2{margin:13px 16px 7px;font-size:23px;line-height:1.1}
  .card h2::before{inset:-10px -16px}
  .card p{margin:0 16px 14px;font-size:15.5px;line-height:1.45}
  .card .go{width:calc(100% - 32px);margin:0 16px;height:48px;padding:0 16px;font-size:16px}
  .stats{gap:8px 14px;margin:2px 16px 14px}
  .stats b{font-size:20px}
  .stats span{margin-top:2px;font-size:12.5px;line-height:1.3}
  .gate .row{margin-top:32px}
  .gate .en{width:100%}
}
