/* Section entrance reveals, driven by js/reveal.js (Motion, motion.dev).
   html.rv is set before first paint by the <head> script (skipped under prefers-reduced-motion), so
   every reveal target starts hidden and nothing flashes in. Motion then animates each target in when its
   section scrolls into view; the hero runs on load. If Motion cannot load, html.rv is removed and the page
   simply shows. Targets listed here must match the selectors in js/reveal.js. */
html.rv :is(
  .hero-kicker, .hero h1, .hero-sub, .hero-btns, .hero-stage,
  .band, .quote, .author, .stats-kicker, .stats .stat,
  .benefits .h-big, .benefits .slot, .stat-row .item,
  .math-kicker, .math .h-big, .math-intro, .math-stats .mstat, .math-close, .math-note,
  .features .h-big, .features .card,
  .plans-box, .plans-hd h2, .plans-hd p, .plan,
  .cta, .cta h2, .cta-btns,
  .footer .f-col, .footer .f-cube, .footer .f-tag, .footer .f-social, .footer .f-bot
) { opacity: 0; }

/* Revealed elements hand opacity back to CSS so js/reveal.js can drop its inline styles (see the
   settle() comment there). The class is written twice on purpose: the rule above weighs 0,3,1
   through :is(.stats .stat, ...), and a single class would lose to it. */
html.rv .rv-done.rv-done { opacity: 1; }
