/* Motion quality pass: one direction language, reversible viewport states. */
:root {
  --motion-quick: .18s;
  --motion-state: .42s;
  --motion-scene: .62s;
  --motion-ease: cubic-bezier(.22,.8,.25,1);
  --motion-exit: cubic-bezier(.5,0,.78,.2);
}

/* Scroll scenes move a short, readable distance in either direction. */
.reveal-ready,
.reveal-heading {
  transition: transform var(--motion-scene) var(--motion-ease) !important;
}
.reveal-ready:not(.is-visible),
.reveal-heading:not(.is-visible) {
  transform: translate3d(0, 18px, 0);
  transition-timing-function: var(--motion-exit) !important;
}
.reveal-ready.is-visible,
.reveal-heading.is-visible { transform: translate3d(0, 0, 0); }

/* Contact has a stable, two-way arrival plus direct hover feedback. */
.contact-title.reveal-ready > span {
  display: block;
  transform: translate3d(0, 14px, 0);
  transition: transform var(--motion-scene) var(--motion-ease);
}
.contact-title.reveal-ready.is-visible > span {
  animation: none !important;
  transform: translate3d(0, 0, 0);
}
.contact-choice {
  transition: transform var(--motion-state) var(--motion-ease), border-color var(--motion-state) ease, background var(--motion-state) ease, box-shadow var(--motion-state) ease !important;
}
.contact-choice:hover { transform: translate3d(0, -6px, 0); }

/* The logo strip only spends frames while its proof is being read. */
.clients .logo-track { animation-play-state: paused; }
.clients.is-sector-active .logo-track { animation-play-state: running; }
.clients .logo-river:hover .logo-track { animation-play-state: paused; }

/* The luminance manifesto owns its own scrubbed (and reversible) progress. */
.manifesto-luminance.is-inview .manifesto-source span { animation: none !important; }

@media (prefers-reduced-motion: reduce) {
  .reveal-ready, .reveal-heading, .contact-title.reveal-ready > span, .contact-choice { transition: none !important; transform: none !important; }
  .clients .logo-track { animation: none !important; }
}
