/* Появление текста (src/js/reveal.js). У слова .w прогресс --w 0…1, у буквы .c свой --q из --w слова.
   Вид — «буквы из-под строки» (вариант 9 из девяти, выбор владельца 31.10): каждая буква поднимается из-под линии
   слова, слово её обрезает. Начинается с невидимого: бледного текста нет. */
@property --w { syntax: '<number>'; inherits: true; initial-value: 0; }

/* До запуска скриптов (.rv-wait ставит строка в <head> из base.html, снимает reveal.js): скрипты defer приходят позже
   первой отрисовки, и конечный вид текста мигал и исчезал (разбор 05.11). Поэтому текст, который появится анимацией, ещё не
   показываем, заставка уже в начальном виде — логотип без фасада. Скрипты не пришли — на load класс снимается, всё видно;
   запрос завис и load не наступает — через 3 с класс меняется на .rv-off: текст открыт, поздний reveal.js его не трогает */
.rv-wait main :is(h1, h2, h3, p, .btn, .mat__go, .tile, .field, .pills, .others li),
.rv-wait .ftr > p { visibility: hidden; }
.rv-wait .intro { --p: 0; --mark-o: 1; --win-o: 0; }

.rv-sr {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  -webkit-user-select: none;  /* Safari — только с префиксом */
  user-select: none;  /* копирование страницы берёт видимые куски, а не вторую, скрытую копию текста */
}
.rv-on .rv .w,
.rv-on .rv .wi { display: inline-block; }
.rv-on .rv .c { --q: clamp(0, calc((var(--w) * (var(--n) + 2) - var(--j)) / 3), 1); }

/* один раз при входе в экран: слова по очереди */
.rv-on .rv:not(.rv--intro, .rv--scroll) .w {
  transition: --w var(--rv-dur, 1s) var(--rv-ease, cubic-bezier(0.25, 0.7, 0.25, 1)) calc(var(--rv-d, 0ms) + var(--i) * var(--rv-step, 70ms));
}
.rv-on .rv.is-in .w { --w: 1; }
/* заголовок заставки — по её прокрутке --p: слова идут, пока окно последние 20 % дороги раскрывается до экрана */
.rv-on .rv--intro .w {
  --w: clamp(0, calc(clamp(0, (var(--p) - 0.78) * 5, 1) * (1 + (var(--nw) - 1) * 0.3) - var(--i) * 0.3), 1);
}

/* абзацы, ссылки, поля формы, карточки — целиком снизу, соседи лесенкой */
.rv-on .rv-b {
  opacity: var(--w);
  transform: translateY(calc((1 - var(--w)) * 28px));
  transition: --w 0.9s cubic-bezier(0.25, 0.7, 0.25, 1) calc(var(--k, 0) * 90ms + 150ms);
}
.rv-on .rv-b.is-in { --w: 1; }
/* фото объектов — шторка снизу вверх, снимок оседает */
.rv-on .tile.rv-b { opacity: 1; transform: none; clip-path: inset(calc((1 - var(--w)) * 100%) 0 0 0); transition-duration: 1.1s; }
.rv-on .tile.rv-b img { transform: scale(calc(1.18 - var(--w) * 0.18)); }

/* буквы из-под строки: слово обрезает всё, что ниже его линии */
.rv-on .rv .w { clip-path: inset(-0.3em -0.2em -0.12em); }
.rv-on .rv .c { display: inline-block; transform: translateY(calc((1 - var(--q)) * 115%)); }

/* абзацы: слово целиком из-под строки, шаг между словами короче, чем у заголовков */
.rv-on .rv--p { --rv-step: 22ms; --rv-dur: 0.8s; }
.rv-on .rv--p .wi { transform: translateY(calc((1 - var(--w)) * 110%)); }

/* печать и PDF: прокрутки не будет — всё сразу видно */
@media print {
  .rv-on .rv .w, .rv-on .rv-b { transition: none !important; }  /* активный переход перебивает даже !important */
  .rv-on .rv .w { --w: 1 !important; clip-path: none; }
  .rv-on .rv-b { opacity: 1 !important; transform: none !important; clip-path: none !important; }
  .rv-on .tile.rv-b img { transform: none !important; }
}
