/* fx/tokens.css — единственный источник правды по времени и кривым.
   Подключается ПЕРЕД стилями сайта. Сайт переопределяет только --fx-axis и --fx-amp. */
:root{
  /* §2 длительности */
  --t-instant:.12s; --t-quick:.28s; --t-move:.62s; --t-reveal:.9s; --t-scene:1.4s;

  /* §3 кривые — CSS-зеркало авторского набора */
  --e-set:cubic-bezier(.16,1,.3,1);
  --e-draw:cubic-bezier(.65,0,.35,1);
  --e-snap:cubic-bezier(.2,.02,.12,1);        /* приближение snap для CSS-переходов */
  --e-lead:cubic-bezier(.2,.86,.24,1.04);

  /* §4 стаггер */
  --stg:55ms;

  /* §5 глубина */
  --p-back:.82; --p-mid:.93; --p-front:1; --p-over:1.08;

  /* §7 шина скорости — переписывается из core.js каждый кадр */
  --vel:0; --velx:0;
}

/* §6 конечные состояния раскрытия. Разметка приходит уже в конечном виде;
   FX перед стартом переводит её в начальное. Так страница без JS полноценна. */
[data-rv]{--rv:1}

html.fx [data-rv="head"] .fx-line{overflow:hidden;display:block}
html.fx [data-rv="head"] .fx-line>span{display:block;will-change:transform}
html.fx [data-rv="rule"]{transform-origin:var(--rule-origin,left center)}
html.fx [data-rv="img"]{overflow:hidden}
html.fx [data-rv="img"]>img,html.fx [data-rv="img"]>picture>img{will-change:transform}

/* §10 деградация: reduced-motion / нет CDN — конечное состояние без перехода */
html.norm *,html.norm *::before,html.norm *::after{
  animation-duration:1ms!important;animation-delay:0ms!important;
  transition-duration:1ms!important;transition-delay:0ms!important}

/* курсор монтируется только когда есть точный указатель */
html.fx-cursor,html.fx-cursor a,html.fx-cursor button,html.fx-cursor [role=button]{cursor:none}
