/* Enduro — shared scroll-reveal (canonical single source).
   Incidental .reveal / .reveal-early elements start hidden and reveal once
   .in is added by assets/reveal.js (reveal-once-and-stay). This replaces the
   per-page inline copies that had drifted. Visual values match the site's
   incidental sub-page reveal (translateY 28px, .8s ease) so migrated pages
   look identical. reduced-motion = hard off-switch below. */
.reveal,
.reveal-early {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 0.8s cubic-bezier(0.16, 0.84, 0.34, 1),
    transform 0.8s cubic-bezier(0.16, 0.84, 0.34, 1);
}
.reveal.in,
.reveal-early.in {
  opacity: 1;
  transform: none;
}

/* Optional stagger — only applies when a .dN class is present on the element
   (inert on pages that don't use it). Matches the site's .06s-step cascade. */
.reveal.d1 { transition-delay: 0.06s; }
.reveal.d2 { transition-delay: 0.12s; }
.reveal.d3 { transition-delay: 0.18s; }
.reveal.d4 { transition-delay: 0.24s; }
.reveal.d5 { transition-delay: 0.30s; }
.reveal.d6 { transition-delay: 0.36s; }
.reveal.d7 { transition-delay: 0.42s; }

/* Reduced-motion / kill switch — blanket off-switch. Flatten every reveal to
   its final, visible state with no transition. This is the coverage the
   drifted inline copies were missing. */
@media (prefers-reduced-motion: reduce) {
  .reveal,
  .reveal-early {
    transition: none !important;
    opacity: 1 !important;
    transform: none !important;
  }
}

/* ─── Touch hover-stick guard (site-wide belt-and-suspenders) ───
   On touch devices the browser emulates :hover on tap and it LATCHES until
   you tap elsewhere — so any transform/opacity :hover we couldn't gate
   individually would visibly freeze mid-state. Killing the transition on
   touch means the emulated-hover state can't animate, so it can't stick.
   Real mouse/trackpad (hover: hover) is unaffected — every hover still runs. */
@media (hover: none) {
  *:hover { transition: none !important; }
}
