/* motion.css — движение из design.md, прикладываемое к nolejje-форме */

@layer motion {
  /* тикер как у nolejje: сдвиг на ~столько, чтобы стык был бесшовным */
  @keyframes tickerMove {
    from { transform: translateX(0); }
    to { transform: translateX(var(--ticker-shift, -50%)); }
  }

  /* пульс */
  @keyframes ping { to { transform: scale(3); opacity: 0; } }

  /* печать красного слова */
  @keyframes wipe { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 0 0 0); } }

  /* бегущие штрихи по туннелям */
  @keyframes dash { to { stroke-dashoffset: -50; } }

  /* курсор терминала */
  @keyframes caret { 0%, 55% { opacity: 1; } 56%, 100% { opacity: 0; } }

  /* stagger */
  @keyframes rise { from { opacity: 0; translate: 0 24px; } }
  .stagger > * { animation: rise .7s var(--ease-decel) both; animation-delay: calc(var(--i, 0) * 70ms); }
  html:not(.js) .stagger > * { animation: none; }

  /* reveal (драйвер — IntersectionObserver: скролл lerp-based, view()-timelines не видит) */
  .reveal { opacity: 0; translate: 0 36px; scale: .98; filter: blur(6px); }
  .reveal.on {
    animation: rise .75s var(--ease-decel) forwards;
    opacity: 1; translate: 0 0; scale: 1; filter: none;
  }
  html:not(.js) .reveal { opacity: 1; translate: none; scale: 1; filter: none; }

  .wipe { display: inline-block; animation: wipe 1s var(--ease-decel) .5s both; }
  @media (prefers-reduced-motion: reduce) { .wipe { animation: none; } }

  .bounce { animation: bounce 2.4s ease-in-out infinite; }
  @keyframes bounce { 0%, 100% { translate: 0 0; } 50% { translate: 0 10px; } }
}
