/* Entrance + scroll animations for the 2026 site — layered on top of site.css.
   (1) Heading "wipe" reveal: an accent bar sweeps each line and the words are
       uncovered behind it (ported from the landing design; spans set up in JS).
   (2) Reversible scroll-fill brightening on big statement paragraphs.
   (3) A reliable reveal for .rv / .fade content blocks.
   Honors prefers-reduced-motion. */

/* (1) Heading wipe: an accent bar sweeps each line, words uncovered behind it.
   --wipe-bar falls back to --accent, which already flips to #8B8DFF in dark
   mode; the .night override keeps parity inside explicitly-dark sections. */
.wipe{position:relative}
.wipe .ww{display:inline-block;clip-path:inset(-.3em 100% -.3em -.1em)}
.wipe .wb{position:absolute;pointer-events:none;background:var(--wipe-bar,var(--accent));clip-path:inset(0 100% 0 0)}
.night .wipe{--wipe-bar:#8B8DFF}
/* Block wipe: a whole element swept as one unit (opt in with data-wipe-block). */
.wipe-block{clip-path:inset(0 100% 0 0)}
.wipe-block .wbk{position:absolute;inset:0;z-index:5;pointer-events:none;background:var(--wipe-bar,var(--accent))}

/* (2) Reversible scroll-fill: statement words start dim and brighten as the
   block scrolls up through the viewport (and dim again on the way back). */
.pl-fill .pl-fw{opacity:.26;transition:opacity .35s ease;}
.pl-fill .pl-fw.on{opacity:1;}

/* (3) Safety: ensure revealed content blocks end fully visible even if the base
   observer never tagged them. */
.rv.pl-in,.fade.pl-in{opacity:1;transform:none;}

@media (prefers-reduced-motion: reduce){
  /* The wipe JS bails entirely under reduced motion and never adds these
     classes, but reset them anyway so text can never be left clipped. */
  .wipe .ww{clip-path:none;}
  .wipe-block{clip-path:none;}
  .wipe .wb,.wipe-block .wbk{display:none;}
  .pl-fill .pl-fw{opacity:1;transition:none;}
}
