.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; }