/* C Visual Lab — animations */
@keyframes fadeUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes pulseGlow { 0%, 100% { box-shadow: 0 0 0 0 rgba(63, 212, 229, 0.35); } 50% { box-shadow: 0 0 0 6px rgba(63, 212, 229, 0); } }
@keyframes dangerPulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(244, 117, 108, 0.45); } 50% { box-shadow: 0 0 0 7px rgba(244, 117, 108, 0); } }
@keyframes flowDash { to { stroke-dashoffset: -20; } }
@keyframes blinkCursor { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }
@keyframes shake { 0%, 100% { transform: translateX(0); } 20% { transform: translateX(-4px); } 40% { transform: translateX(4px); } 60% { transform: translateX(-3px); } 80% { transform: translateX(3px); } }
@keyframes popIn { 0% { opacity: 0; transform: scale(0.92); } 70% { transform: scale(1.02); } 100% { opacity: 1; transform: scale(1); } }
.anim-fade-up { animation: fadeUp 0.45s ease both; }
.anim-fade-in { animation: fadeIn 0.35s ease both; }
.anim-pop { animation: popIn 0.3s ease both; }
.anim-shake { animation: shake 0.4s ease; }
.pulse-ok { animation: pulseGlow 1.6s ease-in-out 2; }
.pulse-danger { animation: dangerPulse 1.4s ease-in-out 2; }
.flow-line { stroke-dasharray: 6 4; animation: flowDash 0.9s linear infinite; }
.stage-step { opacity: 0; transform: translateY(6px); transition: opacity 0.4s ease, transform 0.4s ease; }
.stage-step.on { opacity: 1; transform: translateY(0); }
.mem-byte { transition: background-color 0.35s ease, border-color 0.35s ease, transform 0.25s ease; }
.mem-byte.hot { transform: scale(1.12); z-index: 2; }
.roadmap-card { transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease; }
.roadmap-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); }
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
*, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
}