/* Desktop-only, event-triggered typography. Mobile keeps its existing markup and motion. */
@media (min-width:851px) and (prefers-reduced-motion:no-preference) {
  .landing-page .motion-text-fragment{display:contents}
  /* One uninterrupted original text node for assistive tech; the visual copy is aria-hidden. */
  .landing-page .motion-text-source{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip-path:inset(50%);white-space:nowrap!important;border:0!important;user-select:none}
  .landing-page .motion-text-visual{display:inline}
  .landing-page .motion-text-glyph{display:inline-block;white-space:pre;opacity:1;transform:none;vertical-align:baseline}
  .landing-page .is-text-pending .motion-text-glyph{opacity:0;transform:translate3d(0,.65em,0)}
  .landing-page .is-text-revealing .motion-text-glyph{animation:landing-text-rise var(--text-duration,720ms) cubic-bezier(.22,1,.36,1) both;animation-delay:var(--text-delay,0ms);will-change:transform,opacity}

  /* A single owner for text entrance: don't stack old whole-line/group fades over the stagger. */
  .landing-page #hero-title.has-text-motion .intro-line>span,
  .landing-page .intro-description.has-text-motion{animation:none}
  .landing-page #workflow-intro-title.has-text-motion>span{opacity:1;transform:none;filter:none;transition:none}
  .landing-page.motion-scenes-ready [data-scene-heading].has-text-motion-group{transform:none;opacity:1}
  .landing-page.motion-scenes-ready .closing-cta>.has-text-motion{translate:none;scale:1;opacity:1}
}

@keyframes landing-text-rise {
  from{opacity:0;transform:translate3d(0,.65em,0)}
  to{opacity:1;transform:translate3d(0,0,0)}
}

/* The media-query fallback is immediate, even before the JS change listener restores text. */
@media (max-width:850px), (prefers-reduced-motion:reduce), print {
  .landing-page .motion-text-visual{display:none!important}
  .landing-page .motion-text-source{display:contents!important}
}
