/* Анимации и «живые» эффекты. Всё, что двигается, описано здесь.
   При prefers-reduced-motion базовый слой (base.css) гасит длительности. */

/* Звёздное небо (холст рисует fx/starfield.js) */
.starfield {
  position: fixed;
  inset: 0;
  z-index: var(--z-stars);
  width: 100%;
  height: 100%;
  pointer-events: none;
  opacity: 0.9;
}





/* Магнитные кнопки (fx/magnetic.js) */
[data-magnetic] { transform: translate3d(var(--mx, 0px), var(--my, 0px), 0); transition: transform 0.35s var(--ease-out); }

@keyframes spin { to { transform: rotate(360deg); } }
@keyframes spin-reverse { to { transform: rotate(-360deg); } }
@keyframes btn-glint {
  0%, 72% { transform: translateX(-120%); }
  86%, 100% { transform: translateX(120%); }
}
@keyframes pop-in { from { transform: scale(0.4); opacity: 0; } to { transform: scale(1); opacity: 1; } }
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes rise-in { from { opacity: 0; transform: translateY(24px) scale(0.97); } to { opacity: 1; transform: none; } }
@keyframes slide-up { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@keyframes toast-in { from { opacity: 0; transform: translateY(16px) scale(0.96); } to { opacity: 1; transform: none; } }
@keyframes toast-out { to { opacity: 0; transform: translateY(10px) scale(0.97); } }
@keyframes shimmer { to { background-position: -200% 0; } }
@keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } }
@keyframes twinkle { 0%, 100% { opacity: 0.35; } 50% { opacity: 1; } }
@keyframes pulse-ring {
  0% { transform: scale(0.9); opacity: 0.7; }
  100% { transform: scale(1.6); opacity: 0; }
}
@keyframes breathe { 0%, 100% { opacity: 0.55; } 50% { opacity: 1; } }
