/* ==========================================================================
   NPV Tech - scroll reveal system (motion only)

   Nothing here changes the approved design: no colours, type, spacing or
   dimensions are touched. Every rule is either an opacity gate that the
   animation layer owns, or a layout-neutral line wrapper that occupies
   exactly the line box it replaces.
   ========================================================================== */

/* Pre-animation gate.
   `npv-reveal-armed` is added by a small inline script in <head> and removed
   as soon as the animation layer has written its own start states - or by a
   failsafe timer if GSAP never boots. Content is therefore never hidden when
   JavaScript is unavailable, blocked, or errors, and never hidden at all when
   the visitor prefers reduced motion. */
html.npv-reveal-armed [data-reveal-heading],
html.npv-reveal-armed [data-reveal-lines],
html.npv-reveal-armed [data-reveal-text],
html.npv-reveal-armed [data-reveal-card],
html.npv-reveal-armed [data-reveal-testimonial] .npv-testi__mark,
html.npv-reveal-armed [data-reveal-testimonial] .npv-testi__quote,
html.npv-reveal-armed [data-reveal-testimonial] .npv-testi__name {
    opacity: 0;
}

/* Line wrappers created by GSAP SplitText (mask: "lines") or by the built-in
   fallback splitter. Both are block boxes with no padding, border or margin,
   so the split text keeps the exact line rhythm of the original element.
   The wrappers exist only while a reveal is running - each split is reverted
   to the original markup as soon as its animation finishes. */
.npv-line-mask {
    display: block;
    overflow: hidden;
}

.npv-line {
    display: block;
}

/* Safety net: if the motion preference flips to "reduce" after load, the gate
   must not be able to leave anything hidden. */
@media (prefers-reduced-motion: reduce) {
    html.npv-reveal-armed [data-reveal-heading],
    html.npv-reveal-armed [data-reveal-lines],
    html.npv-reveal-armed [data-reveal-text],
    html.npv-reveal-armed [data-reveal-card],
    html.npv-reveal-armed [data-reveal-testimonial] .npv-testi__mark,
    html.npv-reveal-armed [data-reveal-testimonial] .npv-testi__quote,
    html.npv-reveal-armed [data-reveal-testimonial] .npv-testi__name {
        opacity: 1;
    }
}
