/* ============================================================
   RESET + BASE
   ============================================================ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html, body {
  height: 100%;
  overflow: hidden;
}

body {
  background: var(--ink);
  color: var(--paper);
  font-family: var(--font-body);
  font-weight: 300;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* Film-grain overlay — takes the digital edge off the black. */
body::before {
  content: '';
  position: fixed; inset: 0;
  background-image: url("data:image/svg+xml;utf8,<svg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='1.2' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.92  0 0 0 0 0.92  0 0 0 0 0.88  0 0 0 0.05 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  opacity: 0.5;
  mix-blend-mode: overlay;
  pointer-events: none;
  z-index: 1000;
}

/* Breath-cycle ambient — 6s low-opacity black wash pulse over everything.
   Nearly subliminal on careful monitors, still present in Zoom compression. */
body::after {
  content: '';
  position: fixed; inset: 0;
  background: #000;
  opacity: 0;
  pointer-events: none;
  z-index: 800;
  animation: breath-cycle 6s ease-in-out infinite;
}
@keyframes breath-cycle {
  0%, 100% { opacity: 0; }
  50%      { opacity: 0.08; }
}

/* Persistent "one dot" — activates after slide 0 survivor reveal,
   pulses quietly in corner through the whole talk until slide 16 close. */
#persistent-dot {
  position: fixed;
  top: 28px; right: 28px;
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 10px var(--accent), 0 0 3px var(--accent);
  opacity: 0;
  transition: opacity 1200ms ease, transform 600ms var(--ease-out-quart);
  z-index: 2000;
  pointer-events: none;
}
#persistent-dot.active {
  opacity: 0.55;
  animation: persistent-heart 2.6s ease-in-out infinite;
}
@keyframes persistent-heart {
  0%, 100% { opacity: 0.55; transform: scale(1); }
  50%      { opacity: 0.9;  transform: scale(1.25); }
}

/* Act-break fader — 400ms darken on certain slide transitions. */
#act-fader {
  position: fixed; inset: 0;
  background: #000;
  opacity: 0;
  pointer-events: none;
  z-index: 5000;
  transition: opacity 400ms ease;
}
#act-fader.on { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-delay: 0ms !important;
    transition-duration: 0.01ms !important;
  }
}
