/* m4 · animation.css — masked line reveal, wordmark fx, reduced-motion guard (Mark4 project heroes, scoped under .m4) */

/* ============================================================
   2a. MASKED LINE REVEAL — every text block is split into lines
       that slide up from behind their own mask (Osmo "Lines")
   ============================================================ */
.m4 [data-lines] .m4-line {
  display: block;
  overflow: hidden;
  padding-bottom: 0.12em;
  margin-bottom: -0.12em;
}

.m4 [data-lines] .m4-line>span {
  display: block;
  transform: translateY(110%);
  transition: transform 0.8s var(--osmo-ease);
  transition-delay: calc(var(--i, 0) * 0.08s);
}

.m4 [data-lines].is-visible .m4-line>span {
  transform: none;
}

@media (prefers-reduced-motion: reduce) {

  .m4 *,


  .m4 *::before,


  .m4 *::after {
    transition-duration: 0.01ms !important;
    animation-duration: 0.01ms !important;
  }

  .m4 .m4-hero__title h1>span,
  .m4 .m4-hero__title h2>span,


  .m4 .m4-hero__eyebrow,


  .m4 .m4-hero__text,


  .m4 .m4-hero__actions,


  .m4 [data-lines] .m4-line>span,


  .m4 .m4-why__details>div {
    opacity: 1;
    transform: none;
  }

  .m4 .m4-why__media::after {
    display: none;
  }

  .m4 .opening__scroll-in>span {
    animation: none;
  }

  .m4 .opening__cloud {
    opacity: 0;
  }

  .m4 .opening__veil {
    opacity: 0;
  }
}
  

/* ============================================================
   OSMO MASKED TEXT REVEAL (assets/js/m4/animations/text-reveal.js)
   Text is hidden only between "script ran" and "text split", so there
   is no flash of un-animated copy; the lines then rise out of their masks.
   ============================================================ */
html.is-splitting :is(main, .site-footer, .sb-footer) :is(h1, h2, h3, h4, p, li, dt, dd, blockquote, figcaption, .eyebrow, .lede, .display):not([data-no-split] *):not(form *) {
  visibility: hidden;
}
[data-split-done] { will-change: transform; }
[data-split-done] .line { will-change: transform; }
/* blocks the reveal owns no longer need the old slide-in */
[data-split-done].rv { opacity: 1; transform: none; transition: none; }

/* word-rise headings (word-rise.js) stay hidden until their words are
   split and parked under their masks, so they never flash in place first */
.m4 [data-word-rise]:not(.is-risen) { visibility: hidden; }
