/* Единые эффекты интерфейса. Размеры кнопок и пользовательские слайды не меняются. */
:is(button, .site-primary, .site-secondary, .connlink, .btn-accent, .btn-ghost) {
  transition: background-color var(--motion-fast) var(--motion-ease),
    color var(--motion-fast) var(--motion-ease),
    border-color var(--motion-fast) var(--motion-ease),
    scale var(--motion-fast) var(--motion-ease);
}
:is(button, .site-primary, .site-secondary, .connlink, .btn-accent, .btn-ghost):not(:disabled):not([aria-disabled="true"]):active {
  scale: .98;
}

.toast { animation: motion-notice var(--motion-enter) var(--motion-ease); }
@keyframes motion-notice { from { opacity: 0; translate: 0 8px; } }

/* Спокойная пульсация вместо полосы, постоянно пробегающей по всей карточке. */
.skel, .kskel, .qrcard.qrskel { animation: motion-wait 1600ms ease-in-out infinite; }
.skel { background: var(--c-line); }
@keyframes motion-wait { 0%, 100% { opacity: .7; } 50% { opacity: 1; } }
.rnum, .gnum { font-variant-numeric: tabular-nums; }
/* Интерполируем только подтверждённый процент обработки, не имитируем прогресс. */
@property --p { syntax: '<percentage>'; inherits: false; initial-value: 0%; }
.ring { transition: --p var(--motion-normal) linear; }

/* Подготовка документа не имеет честного процента: движение означает работу. */
.conversion-cover { background: var(--l-sur2, #efeddf); }
.ring.conversion-busy { background: transparent; }
.conversion-busy::before {
  content: ''; position: absolute; inset: 0; border-radius: 50%;
  border: 4px solid rgba(36, 35, 29, .14); border-top-color: var(--acc-lt);
  animation: conversion-turn 1100ms linear infinite;
}
.conversion-busy .ringin { background: transparent; font-size: 18px; }
@keyframes conversion-turn { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .conversion-busy::before { animation: none; }
}
.lay { transition: opacity var(--motion-normal) var(--motion-ease); }
.thin { transition: width var(--motion-normal) linear; }

/* Настройка действует на все поверхности, включая старые индикаторы загрузки.
   Трансформации масштаба слайда сохраняются: отключаем движение, а не увеличение. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
  :is(button, .site-primary, .site-secondary, .connlink, .btn-accent, .btn-ghost):active { scale: 1 !important; }
}
