/* Motion polish: loader curtain, first-scene settle, chapter layering. */

/* Loader exit — red curtain wipes up, its copy lifts away a beat earlier. */
.preloader.is-leaving { pointer-events: none; animation: preloader-curtain 1.05s cubic-bezier(.77, 0, .18, 1) .12s both; }
.preloader.is-leaving :is(.preloader-title, .preloader-track, .preloader-joke, .preloader-status, .preloader-top) { animation: preloader-copy-out .62s cubic-bezier(.55, 0, .7, .2) both; }
.preloader.is-leaving .preloader-top { animation-delay: .05s; }
@keyframes preloader-curtain {
  from { clip-path: inset(0 0 0 0 round 0); }
  to { clip-path: inset(0 0 100% 0 round 0 0 48px 48px); }
}
@keyframes preloader-copy-out {
  to { opacity: 0; transform: translateY(-9vh); filter: blur(6px); }
}

/* First scene settles in from a soft push-in while the curtain lifts. */
body.is-revealing .story-panel-hero,
body.is-revealing .recap-intro { animation: first-scene-in 1.6s cubic-bezier(.16, 1, .3, 1) .15s both; }
@keyframes first-scene-in {
  from { scale: 1.12; filter: brightness(.35) blur(10px); }
  60% { filter: brightness(1) blur(0); }
  to { scale: 1; filter: none; }
}
html[data-quality=lite] body.is-revealing .story-panel-hero { animation-name: first-scene-in-lite; }
@keyframes first-scene-in-lite { from { scale: 1.08; opacity: .2; } to { scale: 1; opacity: 1; } }

/* Later chapters slide over the receding story pin. */
.recap-slides { position: relative; z-index: 1; }
.story-pin { transform-origin: 50% 0; }
.story-panel { backface-visibility: hidden; }

@media (prefers-reduced-motion: reduce) {
  .preloader.is-leaving, .preloader.is-leaving * , body.is-revealing .story-panel-hero { animation: none !important; }
}

/* Шум без потери яркости: soft-light с выровненной до середины текстурой
   (средняя яркость PNG ≈105/255, brightness поднимает её до ≈128) не сдвигает
   общий уровень — только добавляет зерно. На первом экране шума нет вовсе. */
.recap-grain { mix-blend-mode: soft-light; filter: brightness(1.22); opacity: .5; transition: opacity .6s ease; }
html[data-scene=hero] .recap-grain { opacity: 0; }
html[data-quality=lite] .recap-grain { mix-blend-mode: normal; filter: none; opacity: .06; }


/* Видео конверта на чёрном фоне: во время перехода из «Спасибок» его чёрный
   кадр ложился прямоугольником поверх гаснущей сцены. На время перехода сцена
   с конвертом накладывается «осветлением»: чёрное становится прозрачным, конверт
   выглядит как обычно. Под историей фон #020101, так что после перехода разницы нет. */
.story-panel-postcards.is-crossfading { mix-blend-mode: lighten; }
