/* ──────────────────────────────────────────────────────────────────────────
   Apex Ascents — shared reveal motion
   The canonical content reveal, matching the driver pages (home, contact, and
   the seven Business Apps pages after the 2026-07-14 motion unification):
   translateY(24px), .7s, cubic-bezier(.22,1,.36,1), 90ms stagger.
   Loaded with apex-smooth.js only on driver-less pages (blog, posts, search,
   generic, 404, About). Driver pages define their own scoped [data-reveal].

   The hidden state is GATED on html.apex-anim, which apex-smooth.js adds only
   when JS runs AND motion is allowed. So without JS, or under
   prefers-reduced-motion (the class is never added), [data-reveal] content is
   simply visible — it can never get stuck hidden. Mirrors the .cs-js gate the
   service pages use.
   ────────────────────────────────────────────────────────────────────────── */
html.apex-anim [data-reveal] {
    opacity: 0;
    transform: translateY(var(--a-rev-y));
    filter: blur(var(--a-rev-blur));
    transition: opacity var(--a-rev-fade) var(--a-ease), transform var(--a-rev-move) var(--a-ease),
                filter var(--a-rev-fade) var(--a-ease);
    transition-delay: calc(var(--i, 0) * var(--a-rev-step));
    /* NOT filter: a permanent will-change on filter creates a containing block
       for the whole subtree, which silently breaks any position:sticky inside
       it. The blur is transient; it does not need promoting. */
    will-change: opacity, transform;
}

html.apex-anim [data-reveal].is-revealed {
    opacity: 1;
    transform: none;
    filter: none;
}
