/* Появление контента «ударом» (как штамп). class="reveal" style="--i:N" — очередь */
.reveal {
  opacity: 0;
  transform-origin: 0 50%;
  animation: slam .35s var(--ease) forwards;
  animation-delay: calc(var(--intro) + var(--i, 0) * 90ms);
}
@keyframes slam { from { opacity: 0; transform: scale(1.14); } to { opacity: 1; transform: none; } }

@media (prefers-reduced-motion: reduce) {
  .preloader { display: none; }
  .reveal { opacity: 1; animation: none; }
  *, *::before, *::after { transition-duration: .01ms !important; }
}

/* Страницы без прелоадера (всё, кроме первого захода на главную): контент сразу */
html.no-intro { --intro: 0s; }
.no-intro .preloader { display: none; }

/* Блоки при прокрутке: class="sr" style="--n:N". JS добавляет .is-in (js/reveal.js) */
html.js .sr:not(.is-in) { opacity: 0; }
html.js .sr.is-in { animation: slam-sm .45s var(--ease) backwards; animation-delay: calc(var(--n, 0) * 80ms); }
@keyframes slam-sm { from { opacity: 0; transform: scale(1.05); } }

@media (prefers-reduced-motion: reduce) { html.js .sr:not(.is-in) { opacity: 1; } html.js .sr.is-in { animation: none; } }
