/* Motion language: precise, calm, premium.
   Hidden initial states apply only when JS runs (html.js),
   so content stays fully visible with JavaScript disabled. */
html.js .reveal {
  opacity: 0;
  transform: translateY(var(--reveal-distance));
  transition: opacity var(--dur-slow) var(--ease-out), transform var(--dur-slow) var(--ease-out);
  transition-delay: var(--reveal-delay, 0ms);
}
.reveal.is-visible, html.js .reveal.is-visible { opacity: 1; transform: none; }

html.js .reveal--line { transform: scaleX(0); transform-origin: left; }
.reveal--line { opacity: 1; }
.reveal--line.is-visible, html.js .reveal--line.is-visible { transform: scaleX(1); }

.img-drift img { transition: transform 1.2s var(--ease-out); }
.img-drift:hover img { transform: scale(1.025); }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  .reveal, html.js .reveal { opacity: 1; transform: none; }
}
