/* ============================================================
   全局动效 keyframes 与滚动渐入
   ============================================================ */

@keyframes auroraDrift {
  0%, 100% { transform: translate(0, 0) rotate(0deg); }
  33% { transform: translate(4%, -6%) rotate(8deg); }
  66% { transform: translate(-5%, 4%) rotate(-6deg); }
}

@keyframes fadeUp {
  from { opacity: 0; transform: translateY(22px); }
  to { opacity: 1; transform: translateY(0); }
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes scaleIn {
  from { opacity: 0; transform: scale(0.92); }
  to { opacity: 1; transform: scale(1); }
}

@keyframes slideInRight {
  from { opacity: 0; transform: translateX(30px); }
  to { opacity: 1; transform: translateX(0); }
}

@keyframes slideInLeft {
  from { opacity: 0; transform: translateX(-30px); }
  to { opacity: 1; transform: translateX(0); }
}

@keyframes pulseGlow {
  0%, 100% { box-shadow: 0 0 18px rgba(0, 229, 255, 0.28); }
  50% { box-shadow: 0 0 34px rgba(139, 92, 246, 0.5); }
}

@keyframes spin {
  to { transform: rotate(360deg); }
}

@keyframes shimmer {
  from { background-position: 200% 0; }
  to { background-position: -200% 0; }
}

@keyframes typingDot {
  0%, 60%, 100% { transform: translateY(0); opacity: 0.35; }
  30% { transform: translateY(-5px); opacity: 1; }
}

@keyframes floatY {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-14px); }
}

@keyframes cursorBlink {
  0%, 49% { opacity: 1; }
  50%, 100% { opacity: 0; }
}

/* 打字三点 */
.typing-dots { display: inline-flex; gap: 5px; align-items: center; }
.typing-dots i {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--neon-cyan);
  animation: typingDot 1.2s infinite;
}
.typing-dots i:nth-child(2) { animation-delay: 0.18s; background: var(--neon-blue); }
.typing-dots i:nth-child(3) { animation-delay: 0.36s; background: var(--neon-violet); }

/* 流式光标 */
.stream-cursor {
  display: inline-block; width: 8px; height: 1.05em;
  margin-left: 2px; vertical-align: text-bottom;
  background: var(--grad-brand); border-radius: 2px;
  animation: cursorBlink 0.9s step-end infinite;
}

/* 加载圈 */
.spin { animation: spin 0.9s linear infinite; }

/* 滚动渐入（配合 IntersectionObserver） */
.reveal {
  opacity: 0; transform: translateY(26px);
  transition: opacity 0.7s var(--ease), transform 0.7s var(--ease);
  will-change: opacity, transform;
}
.reveal.visible { opacity: 1; transform: translateY(0); }
.reveal-d1 { transition-delay: 0.08s; }
.reveal-d2 { transition-delay: 0.16s; }
.reveal-d3 { transition-delay: 0.24s; }

@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}
