.glass-card {
  background: rgba(25, 25, 29, 0.6);
  backdrop-filter: blur(20px);
  border: 1px solid rgba(167, 139, 250, 0.2);
}

.neon-glow-violet {
  box-shadow: 0 0 15px rgba(167, 139, 250, 0.15);
}

.neon-border {
  border: 1px solid rgba(167, 139, 250, 0.4);
}

.node-pulse {
  animation: pulse 3s infinite;
}

@keyframes pulse {
  0% { opacity: 0.4; }
  50% { opacity: 1; }
  100% { opacity: 0.4; }
}

.grid-bg {
  background-image: radial-gradient(circle at 2px 2px, rgba(167, 139, 250, 0.05) 1px, transparent 0);
  background-size: 40px 40px;
}

@keyframes marquee {
  0% { transform: translateX(100%); }
  100% { transform: translateX(-100%); }
}

.animate-marquee {
  display: inline-block;
  animation: marquee 30s linear infinite;
}

/* Traveling data-packet on core→group edges (period = 14 + 220 = 234px) */
@keyframes data-packet {
  from { stroke-dashoffset: 0; }
  to   { stroke-dashoffset: -234; }
}

/* Traveling dot on group→signal edges (period = 6 + 156 = 162px) */
@keyframes data-packet-dim {
  from { stroke-dashoffset: 0; }
  to   { stroke-dashoffset: -162; }
}

/* Legacy – kept for backward-compat */
@keyframes edge-pulse {
  from { stroke-dashoffset: 0; }
  to   { stroke-dashoffset: -110; }
}
.edge-pulse-anim {
  animation: edge-pulse 2s linear infinite;
}
