/* ============================================================================
   nv-anim.css - ГЛОБАЛЬНЫЙ предохранитель reveal-анимации (волна 0, 15.07.2026)
   Совет экспертов 15.07 (fix-first, 7/7): sayt-novotels/sovet/2026-07-15-anim-reveal-klyuchevye-stranitsy.md

   ЗАЧЕМ. Reveal сделан fail-closed: opacity:0 ставит CSS (page-N.css / инлайны страниц),
   а возвращает ТОЛЬКО движок /local/js/script.js. Замер 15.07: при заблокированном script.js
   невидимы 29 из 36 блоков; при выключенном JS - белый hero. Так на 24 живых страницах.

   КАК. Гейт html.nv-anim ставит инлайн-скрипт в <head> (init.php). Прятать разрешено ТОЛЬКО
   пока гейт стоит. Сторож снимает гейт, если движок не отозвался (~2.5с) или script.js не
   доехал (onerror) - тогда правила ниже показывают всё, перебивая page-N.css и инлайны.
   JS выключен совсем -> гейт не встанет вообще -> контент виден сразу.
   <noscript> для этого НЕ годится: срабатывает лишь при выключенном JS (частая ошибка).

   НЕ ТРОГАТЬ порядок селекторов: html:not(.nv-anim) (0,2,1) специально бьёт по специфичности
   и page-N (.text-animate-1 = 0,1,0), и инлайны страниц с !important, независимо от порядка
   подключения. Приёмка - в обе стороны: playwright javaScriptEnabled:false И route.abort
   на script.js -> hero виден; при живом движке анимация играет как раньше.
   ============================================================================ */

/* 0. КАНОН ЗНАЧЕНИЙ (диалект витрины, дизайн-система сайта: потолок 600 ms).
   Чтобы новая страница везла только РАЗМЕТКУ, а не копию CSS (сейчас копипаст в 28 page-N.css).
   :where() обнуляет специфичность гейта -> итог (0,1,0), как у page-N. Файл грузится РАНЬШЕ page-N,
   значит страницы со СВОИМИ правилами (page-11, page-16, инлайны) не тронуты - их правила побеждают
   по порядку. Страницы без правил получают канон. Проверять регресс на эталоне после правки. */
:where(html.nv-anim) .text-animate-1,
:where(html.nv-anim) .text-animate-2,
:where(html.nv-anim) .text-animate-3,
:where(html.nv-anim) .text-animate-4 {
  opacity: 0;
  transform: translate(0, 35px);
  transition: transform .6s cubic-bezier(.22, 1, .36, 1), opacity .5s ease;
}
:where(html.nv-anim) .text-animate-1._active,
:where(html.nv-anim) .text-animate-2._active,
:where(html.nv-anim) .text-animate-3._active,
:where(html.nv-anim) .text-animate-4._active { opacity: 1; transform: translate(0, 0); }
:where(html.nv-anim) .text-animate-2._active { transition-delay: .15s; }
:where(html.nv-anim) .text-animate-3._active { transition-delay: .30s; }
:where(html.nv-anim) .text-animate-4._active { transition-delay: .45s; }

:where(html.nv-anim) .image-fade-up { opacity: 0; transform: translateY(40px); transition: all .9s cubic-bezier(.22, 1, .36, 1); }
:where(html.nv-anim) .image-fade-up._active { opacity: 1; transform: translateY(0); }

/* 0.1 КАСКАД (выбор владельца 15.07: «B как основа»).
   Было: группа карточек = один узел -> шесть карточек выезжали ОДНИМ прямоугольником.
   Стало: каждая карточка - свой узел, а .nv-stagger на родителе даёт им шаг 70 ms.
   Чистый CSS, без правки общего движка. Цена нулевая: те же свойства, только задержки. */
/* !important обязателен: page-N.css пишет transition ШОРТКАТОМ (`transition: all .9s ...`),
   а шорткат сбрасывает transition-delay в 0 - каскад молча не играет (замер 15.07: все задержки 0s).
   Это та же грабля, о которой предупреждает SYSTEM §2 «не форсь transition целиком». */
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(1) { transition-delay: .04s !important }
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(2) { transition-delay: .11s !important }
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(3) { transition-delay: .18s !important }
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(4) { transition-delay: .25s !important }
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(5) { transition-delay: .32s !important }
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(6) { transition-delay: .39s !important }
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(7) { transition-delay: .46s !important }
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(8) { transition-delay: .53s !important }
/* дальше 9-й шаг не растим: ожидание последней карточки начинает читаться как тормоз */
:where(html.nv-anim) .nv-stagger > ._anim-items._active:nth-child(n+9) { transition-delay: .60s !important }

/* 0.2 ПРЕМИУМ (выбор владельца: «C точечно на плотных блоках»).
   Расфокус + лёгкий масштаб. ТОЛЬКО на карточках/визуалах, НЕ на тексте: filter - самое
   тяжёлое свойство здесь, на слабых телефонах даёт подёргивание. Ставится классом nv-premium
   на КОНТЕЙНЕР группы, поверх каскада. */
:where(html.nv-anim) .nv-premium > ._anim-items {
  transform: translateY(22px) scale(.965);
  filter: blur(6px);
  transition: transform .6s cubic-bezier(.22, 1, .36, 1), opacity .5s ease, filter .5s ease;
}
:where(html.nv-anim) .nv-premium > ._anim-items._active { transform: none; filter: blur(0) }

/* 1. ФЕЙЛ-ОПЕН: гейта нет (сбой движка / JS выключен) -> показать контент.
   filter:none обязателен: иначе при сбое блоки .nv-premium останутся РАЗМЫТЫМИ. */
html:not(.nv-anim) ._anim-items,
html:not(.nv-anim) .image-fade-up,
html:not(.nv-anim) .list-animate,
html:not(.nv-anim) [class*="text-animate"] {
  opacity: 1 !important;
  transform: none !important;
  transition: none !important;
  filter: none !important;
}

/* 2. Гардрейл доступности - ГЛОБАЛЬНО.
   Замер 15.07: prefers-reduced-motion есть лишь в 2 файлах из 28 (нет у page-21, page-11).
   html-префикс поднимает специфичность (0,1,1), чтобы перебить инлайны страниц (0,1,0). */
@media (prefers-reduced-motion: reduce) {
  html ._anim-items,
  html .image-fade-up,
  html .list-animate,
  html [class*="text-animate"],
  html .nv-premium > ._anim-items {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
    animation: none !important;
    filter: none !important;      /* иначе .nv-premium остаётся размытым */
    transition-delay: 0s !important;  /* каскад .nv-stagger не должен «доезжать» */
  }
}
