/* ============ tokens ============ */
:root{
  --ink:#EDEDEA; --dim:#8B8D94; --faint:#55575E; --warm:#E8D9B8; --ground:#050608;
}

/* ============ fonts (self-hosted, latin subsets) ============ */
@font-face{
  font-family:"Newsreader";
  font-style:normal;
  font-weight:300 500;
  font-display:swap;
  src:url("fonts/newsreader-normal-300-500.woff2") format("woff2");
}
@font-face{
  font-family:"Newsreader";
  font-style:italic;
  font-weight:300 400;
  font-display:swap;
  src:url("fonts/newsreader-italic-300-400.woff2") format("woff2");
}
@font-face{
  font-family:"IBM Plex Mono";
  font-style:normal;
  font-weight:300;
  font-display:swap;
  src:url("fonts/ibmplexmono-normal-300.woff2") format("woff2");
}
@font-face{
  font-family:"IBM Plex Mono";
  font-style:normal;
  font-weight:400;
  font-display:swap;
  src:url("fonts/ibmplexmono-normal-400.woff2") format("woff2");
}

/* ============ base ============ */
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%;overflow:hidden;background:var(--ground);overscroll-behavior:none}
body{
  font-family:"Newsreader",Georgia,serif;font-weight:300;color:var(--ink);
  -webkit-user-select:none;user-select:none;cursor:default;position:fixed;inset:0;
}
::selection{background:var(--ink);color:var(--ground)}
canvas#stage{position:fixed;inset:0;width:100%;height:100%;display:block;z-index:0}

/* ============ footage layer ============
   Sized and translated from JS so the plume core tracks the disc centre.
   Mask is centred on the element (element centre == disc centre). */
#fog{
  position:fixed;top:0;left:0;z-index:1;
  mix-blend-mode:screen;opacity:0;pointer-events:none;display:none;
  filter:grayscale(1) contrast(1.35) brightness(0.9);
  will-change:transform;
  -webkit-mask-image:radial-gradient(circle var(--fr2,600px) at 50% 50%,
    transparent var(--fr1,120px), rgba(0,0,0,.9) calc(var(--fr1,120px) + 36px),
    rgba(0,0,0,.30) calc(var(--fr1,120px)*2.1), transparent var(--fr2,600px));
  mask-image:radial-gradient(circle var(--fr2,600px) at 50% 50%,
    transparent var(--fr1,120px), rgba(0,0,0,.9) calc(var(--fr1,120px) + 36px),
    rgba(0,0,0,.30) calc(var(--fr1,120px)*2.1), transparent var(--fr2,600px));
}
/* .live is a state flag; opacity itself is eased from JS (fade-in + attention breathe) */

/* ============ chrome ============ */
.wordmark{
  position:fixed;top:26px;left:30px;z-index:20;
  font-family:"IBM Plex Mono",monospace;font-weight:300;
  font-size:12px;letter-spacing:0.28em;color:var(--dim);
}
.indexbtn{
  position:fixed;top:14px;right:18px;z-index:20;
  font-family:"IBM Plex Mono",monospace;font-weight:300;
  font-size:11px;letter-spacing:0.24em;color:var(--dim);
  background:none;border:none;cursor:pointer;text-transform:uppercase;
  padding:18px 12px;min-width:40px;min-height:40px;
}
.indexbtn:hover{color:var(--ink)}
.indexbtn:focus-visible{outline:1px solid var(--dim);outline-offset:3px}

/* ============ scenes ============ */
.scene{
  position:fixed;z-index:10;pointer-events:none;
  opacity:0;filter:blur(8px);
  transition:opacity 1.1s ease, filter 1.1s ease;
  max-width:34rem;
}
.scene.on{opacity:1;filter:blur(0)}
.scene .eyebrow{
  font-family:"IBM Plex Mono",monospace;font-weight:300;
  font-size:10px;letter-spacing:0.32em;text-transform:uppercase;
  color:var(--faint);margin-bottom:26px;
}
.scene h1{font-size:clamp(30px,4.6vw,50px);font-weight:400;line-height:1.16;letter-spacing:-0.01em}
.scene h1 .l2{display:block;font-style:italic;font-weight:300}
.scene h2{font-size:clamp(24px,3vw,34px);font-weight:400;font-style:italic;line-height:1.28;margin-bottom:22px}
.scene p{font-size:17px;line-height:1.65;color:var(--dim)}
.scene p b{color:var(--ink);font-weight:500}
.scene .sub{margin-top:5vh;max-width:30rem}
.scene ul{list-style:none}
.scene li{font-size:17px;line-height:1.6;color:var(--dim);margin-bottom:1.35em}
.scene li b{display:block;color:var(--ink);font-weight:500;font-size:19px;margin-bottom:2px}
.scene .closer{font-size:clamp(21px,2.6vw,27px);font-style:italic;font-weight:300;color:var(--ink);margin:5vh 0;line-height:1.4}
.scene a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--faint);pointer-events:auto}
.scene a:focus-visible{outline:1px solid var(--dim);outline-offset:3px}

.scene{left:max(30px,7vw);top:50%;transform:translateY(-50%)}
.scene.hero{top:auto;bottom:12vh;transform:none}
@media (max-width:760px), (max-aspect-ratio:4/5){
  .scene{left:24px;right:24px;top:auto;bottom:12vh;transform:none;max-width:none}
  .scene p,.scene li{font-size:16px}
}

/* ============ hidden line — visible only under the pointer's light ============ */
#ghost{
  position:fixed;z-index:6;pointer-events:none;white-space:nowrap;
  transform:translate(-50%,-50%);
  font-family:"IBM Plex Mono",monospace;font-weight:300;
  font-size:11px;letter-spacing:0.30em;text-transform:uppercase;
  color:var(--warm);text-shadow:0 0 14px rgba(232,217,184,0.35);
  -webkit-mask-image:radial-gradient(circle 150px at var(--mx,-999px) var(--my,-999px),
    rgba(0,0,0,.95), rgba(0,0,0,.4) 60%, transparent 78%);
  mask-image:radial-gradient(circle 150px at var(--mx,-999px) var(--my,-999px),
    rgba(0,0,0,.95), rgba(0,0,0,.4) 60%, transparent 78%);
  transition:opacity .8s;
}
@media (max-width:760px){ #ghost{font-size:9px;letter-spacing:0.22em} }

/* ============ progress ticks ============ */
.ticks{position:fixed;bottom:8px;left:50%;transform:translateX(-50%);z-index:20;display:flex}
.ticks button{
  width:40px;height:40px;background:none;border:none;cursor:pointer;position:relative;padding:0;
}
.ticks button::after{
  content:"";position:absolute;left:12px;right:12px;top:19px;height:1px;
  background:var(--faint);transition:background .4s;
}
.ticks button.on::after{background:var(--ink)}
.ticks button:focus-visible{outline:1px solid var(--dim);outline-offset:-6px}

.hint{
  position:fixed;bottom:24px;right:30px;z-index:20;
  font-family:"IBM Plex Mono",monospace;font-size:10px;letter-spacing:0.2em;
  color:var(--faint);transition:opacity 1s;
}
.hint.gone{opacity:0}
/* touch devices: gesture language is wrong and it collides with the ticks at 375px */
@media (max-width:760px), (pointer:coarse){ .hint{display:none} }

/* ============ index overlay ============ */
.index{
  position:fixed;inset:0;z-index:40;background:rgba(4,5,7,0.97);
  overflow-y:auto;opacity:0;pointer-events:none;transition:opacity .5s;
  -webkit-user-select:text;user-select:text;
}
.index.open{opacity:1;pointer-events:auto}
.index .col{max-width:640px;margin:0 auto;padding:14vh 24px 12vh}
.index .eyebrow{
  font-family:"IBM Plex Mono",monospace;font-weight:300;font-size:11px;
  letter-spacing:0.32em;text-transform:uppercase;color:var(--faint);margin:64px 0 28px;
}
.index .eyebrow:first-child{margin-top:0}
.index h3{font-size:21px;font-weight:500;margin:28px 0 8px}
.index h3.b{font-style:italic;font-weight:400;font-size:23px}
.index p{font-size:17px;line-height:1.65;color:var(--dim);margin-bottom:1em}
.index a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--faint)}
.index a:focus-visible{outline:1px solid var(--dim);outline-offset:3px}
.closebtn{
  position:fixed;top:14px;right:18px;z-index:50;
  font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:0.24em;
  color:var(--dim);background:none;border:none;cursor:pointer;
  padding:18px 12px;min-width:40px;min-height:40px;display:none;
}
.index.open ~ .closebtn{display:block}
.closebtn:hover{color:var(--ink)}
.closebtn:focus-visible{outline:1px solid var(--dim);outline-offset:3px}

/* ============ audition overlay (dev only, ?audition) ============ */
#audition{
  position:fixed;bottom:24px;left:30px;z-index:30;
  font-family:"IBM Plex Mono",monospace;font-size:10px;letter-spacing:0.2em;
  color:var(--faint);display:none;white-space:pre;
}
#audition.on{display:block}

/* ============ reduced motion ============ */
@media (prefers-reduced-motion: reduce){
  .scene{transition:opacity .3s ease;filter:none}
  #fog{display:none !important}
}
