/* ==========================================================
   动效层：关键帧 + 滚动进场
   所有动画都尊重 prefers-reduced-motion
   ========================================================== */

/* ---------------- 滚动进场 ---------------- */
[data-reveal] {
  opacity: 0;
  transform: translate3d(0, 26px, 0);
  transition:
    opacity var(--dur-5) var(--ease-expo),
    transform var(--dur-5) var(--ease-expo);
  transition-delay: var(--d, 0ms);
  will-change: opacity, transform;
}
[data-reveal="fade"] { transform: none; }
[data-reveal="scale"] { transform: scale(.97); }
[data-reveal="left"] { transform: translate3d(-24px, 0, 0); }

[data-reveal].is-in {
  opacity: 1;
  transform: none;
}

/* ---------------- 关键帧 ---------------- */
@keyframes ping {
  0% { transform: scale(1); opacity: .8; }
  70%, 100% { transform: scale(2.4); opacity: 0; }
}

@keyframes blink {
  50% { opacity: .25; }
}

@keyframes float-1 {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  50% { transform: translate3d(40px, 30px, 0) scale(1.08); }
}

@keyframes float-2 {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  50% { transform: translate3d(-46px, 36px, 0) scale(1.12); }
}

@keyframes marquee {
  from { transform: translate3d(0, 0, 0); }
  to { transform: translate3d(-50%, 0, 0); }
}

@keyframes flow {
  from { transform: translateX(-40px); }
  to { transform: translateX(120px); }
}

@keyframes bar-in {
  from { transform: scaleY(.05); opacity: 0; }
  to { transform: scaleY(1); opacity: 1; }
}
.ft__viz i { transform-origin: bottom; }

@keyframes grow-x {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}
.nav__link.is-active::after { transform-origin: 0 50%; }

/* 路由面板逐行浮现 */
@keyframes row-in {
  from { opacity: 0; transform: translate3d(0, 10px, 0); }
  to { opacity: 1; transform: none; }
}
.mock__row {
  animation: row-in var(--dur-4) var(--ease-expo) both;
  animation-delay: var(--d, 0ms);
}

/* ---------------- 无障碍：关闭动效 ---------------- */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  [data-reveal] {
    opacity: 1 !important;
    transform: none !important;
  }
  .aurora { animation: none !important; }
}
