/* N1: motion. Правила только внутри body.n1 (см. n1.css). */
/*
 * Базовый слой движения нового вида. Экранные анимации разделов — позже.
 * --neo-dur и --neo-ease (style.css :root) НЕ меняем: на них ездят экраны и
 * шторки, JS читает их один раз при загрузке (neo-gestures.js, app.js).
 * Никаких пружин с перелётом: вход var(--neo-ease) или ease-out, выход ease-in.
 */

/* ── Тосты: вход сверху на 16 px ~280 мс, выход ~180 мс ───────────────
   app.js ставит тосту инлайн переход с перелётом (0.175,0.885,0.32,1.275).
   Стартовое положение узнаём по его «scale(0.95)» в style: пока оно там,
   тост стоит на 16 px выше без масштаба; дальше едет на место. Во время
   свайпа app.js пишет transition: none — его уважаем. Уход — по data-dismissing. */
:root:has(> body.n1) #__ios_notif_root > div {
  transition: transform 280ms var(--neo-ease), opacity 200ms ease-out !important;
}
:root:has(> body.n1) #__ios_notif_root > div[style*="scale(0.95)"] {
  transform: translate3d(0, -16px, 0) !important;
}
:root:has(> body.n1) #__ios_notif_root > div[style*="transition: none"] {
  transition: none !important;
}
:root:has(> body.n1) #__ios_notif_root > div[data-dismissing] {
  transition: transform 180ms cubic-bezier(.4, 0, 1, 1), opacity 180ms ease-in !important;
}
/* Открыли или закрыли экран при видимом тосте: его высота меняется на 56
   (поверх экрана тост под строкой шапки, на вкладке под часами,
   n1-shell.css). Раньше он перескакивал разом, теперь доезжает за то же
   время и с тем же ходом, что сам экран. */
:root:has(> body.n1) #__ios_notif_root { transition: padding-top var(--neo-dur) var(--neo-ease); }
@media (prefers-reduced-motion: reduce) {
  :root:has(> body.n1) #__ios_notif_root { transition: none; }
  :root:has(> body.n1) #__ios_notif_root > div,
  :root:has(> body.n1) #__ios_notif_root > div[data-dismissing] { transition: opacity 150ms ease !important; }
  :root:has(> body.n1) #__ios_notif_root > div[style*="scale(0.95)"],
  :root:has(> body.n1) #__ios_notif_root > div[data-dismissing] { transform: none !important; }
}

/* ── Окна подтверждения: появление opacity + scale .96→1 ~220 мс ──────
   Анимация без fill-mode: после неё снова правит инлайн-прозрачность
   app.js (окно удаления само гасит себя переходом opacity). */
@keyframes n1DlgBd { from { opacity: 0; } to { opacity: 1; } }
@keyframes n1DlgIn { from { opacity: 0; transform: scale(.96); } to { opacity: 1; transform: none; } }
body.n1 .n1-dlg-bd,
body.n1 #logout-confirm-modal,
body.n1 #delete-confirm-modal { animation: n1DlgBd 220ms ease-out; }
body.n1 .n1-dlg,
body.n1 #logout-confirm-modal > div,
body.n1 #delete-confirm-modal > div { animation: n1DlgIn 220ms var(--neo-ease); }
/* уход окна .n1-dlg: только прозрачность, быстрее входа */
body.n1 .n1-dlg-bd.is-out { opacity: 0; transition: opacity 150ms ease-in; }


/* ── Штрих-код на весь экран: проявление 180 мс, уход 150 мс ────────── */
@keyframes n1BcfIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes n1BcfCode { from { transform: scale(.97); } to { transform: none; } }
@keyframes n1BcfOut { from { opacity: 1; } to { opacity: 0; visibility: hidden; } }
body.n1 .pk-bcf.active { animation: n1BcfIn 180ms ease-out; }
body.n1 .pk-bcf.active .pk-bcf-body { animation: n1BcfCode 220ms var(--neo-ease); }
body.n1 .pk-bcf.is-out { animation: n1BcfOut 150ms ease-in forwards; }


/* ── Скелетоны: мерцание в одну сторону 1.4 с (при «меньше движения» нет) ── */
@keyframes n1Skel { from { background-position: 150% 0; } to { background-position: -50% 0; } }
body.n1 .n1-skel {
  background-image: linear-gradient(90deg, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, 0) 100%);
  background-size: 200% 100%;
  background-repeat: no-repeat;
  animation: n1Skel 1.4s linear infinite;
}

/* ── Данные пришли на место скелетона: только проявление 180 мс ────── */
@keyframes n1FadeIn { from { opacity: 0; } to { opacity: 1; } }
body.n1 .n1-pk--in { animation: n1FadeIn 180ms ease-out; }


/* ── Вкладки: только проявление 160 мс ────────────────────────────────
   Было fadeIn 300 мс с подъёмом translateY(12px): подъём спорил с
   параллаксом стопки (он двигает .tab-content через transform). Теперь
   анимируется одна прозрачность, transform остаётся стопке. */
@keyframes n1TabIn { from { opacity: 0; } to { opacity: 1; } }
body.n1 .tab-content,
body.n1 .subtab-content,
body.n1 .branch-tab-content { animation: n1TabIn 160ms ease-out; }

/* ── Нажатие: без отклика на экране ────────────────────────────────────
   Замечание Тима № 11 (06.10): кнопки и карточки при касании стоят на
   месте. Раньше они сжимались (.98 и .94), строки подсвечивались, ссылки
   бледнели: :active срабатывает на любое касание, и на начале прокрутки
   всё под пальцем дёргалось. Сжатие, сдвиг, фон, тень и прозрачность на
   :active сняты во всех файлах N1 и на входе (vhod.css), вместе с их
   переходами; значок вкладки тоже больше не «выпрыгивает» (n1.css).
   Отклик нажатия остался один: вибрация в приложении на настоящее
   нажатие (click, js/neo-native.js), не на касание. Новых правил :active
   с transform, фоном, тенью или прозрачностью не добавлять.
   ЕДИНСТВЕННОЕ ИСКЛЮЧЕНИЕ — цифровая клавиатура пополнения
   (.wl-numpad-key.pressed, n1-wallet.css): клавиша подсвечивается, пока её
   держат, как в системной клавиатуре; без подсветки не видно, какая цифра
   нажата. Других исключений нет. */

/* ── Пружины с перелётом — прочь ───────────────────────────────────────
   Там, где кривая с перелётом задана в CSS: пузырь переписки (style.css),
   старое окно PIN, галочки и плашка оплаты модуля parcels-pay.js. */
body.n1 .msg-bubble { animation-timing-function: var(--neo-ease); }
body.n1 .courier-pin-card,
body.n1 .pp-cb,
body.n1 .pp-cb svg,
body.n1 .pp-selbar { transition-timing-function: var(--neo-ease); }

/* ── «Меньше движения» ─────────────────────────────────────────────────
   1. Все анимации (переливы скелетонов, пульсации, вращения, появления)
      сразу приходят в конечное состояние.
   2. Экраны и шторки (метка .neo-sloi из neo-gestures.js) встают на место
      мгновенно, без проезда. Жесты работают: палец ведёт экран как раньше,
      после отпускания он сразу закрывается или возвращается.
   --neo-dur/--neo-ease не трогаем: их читает JS. */
@media (prefers-reduced-motion: reduce) {
  body.n1 *,
  body.n1 *::before,
  body.n1 *::after {
    animation-duration: 1ms !important;
    animation-delay: 0s !important;
    animation-iteration-count: 1 !important;
  }
  body.n1 .neo-sloi,
  body.n1 .pk-sheet-bd {
    transition-duration: 0s !important;
    transition-delay: 0s !important;
  }
  body.n1 #neo-preloader,
  body.n1 .neo-preloader-logo { transition: none; }
}
