@keyframes particleFlow {
  from { stroke-dashoffset: 0; }
  to { stroke-dashoffset: -212; }
}

@keyframes nodePulse {
  0% { transform: scale(1); opacity: 0.15; }
  100% { transform: scale(1.4); opacity: 0; }
}

@keyframes nodePulseActive {
  0% { transform: scale(1); opacity: 0.3; }
  100% { transform: scale(1.4); opacity: 0; }
}

/* Animation assignments */
.graph-particle {
  animation: particleFlow linear infinite;
}

.graph-pulse {
  animation: nodePulse 2.5s ease-out infinite;
}

.graph-node.active .graph-pulse {
  animation: nodePulseActive 1.2s ease-out infinite;
}

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

  .graph-pulse,
  .graph-particle {
    animation: none;
  }

  .graph-pulse {
    opacity: 0.15;
  }

  .graph-particle {
    stroke-opacity: 0;
  }
}
