/* =============================================================
   Security AI — Animations / Keyframes
   ============================================================= */

/* Soft pulse — status dots, sev chip */
@keyframes s-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.30; }
}

/* Radar sweep — full rotation */
@keyframes s-radar-sweep {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

/* Vertical scan line */
@keyframes s-scan-line {
  0%   { top: -8%; opacity: 0; }
  10%  { opacity: 0.6; }
  90%  { opacity: 0.6; }
  100% { top: 108%; opacity: 0; }
}

/* Glitch — micro displacement */
@keyframes s-glitch {
  0%, 90%, 100% { transform: translate(0); filter: hue-rotate(0); }
  92% { transform: translate(-1px, 1px); filter: hue-rotate(20deg); }
  94% { transform: translate(1px, -1px); }
  96% { transform: translate(-1px, -1px); filter: hue-rotate(-10deg); }
  98% { transform: translate(1px, 1px); }
}

/* Packet flow — horizontal (left % 기반) */
@keyframes s-pkt-out {
  0%   { left: 9%;  opacity: 0; }
  10%  { opacity: 1; }
  90%  { opacity: 1; }
  100% { left: 91%; opacity: 0; }
}
@keyframes s-pkt-in {
  0%   { left: 91%; opacity: 0; }
  10%  { opacity: 1; }
  90%  { opacity: 1; }
  100% { left: 9%;  opacity: 0; }
}
/* (legacy) — 이전 코드 호환용 */
@keyframes s-data-flow {
  from { transform: translateX(0); opacity: 0; }
  10%  { opacity: 1; }
  90%  { opacity: 1; }
  to   { transform: translateX(0); opacity: 0; }
}

/* Card / row entry */
@keyframes s-fade-up {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Card / row entry from left */
@keyframes s-slide-in {
  from { opacity: 0; transform: translateX(-8px); }
  to   { opacity: 1; transform: translateX(0); }
}

/* Threat glow — critical alerts */
@keyframes s-threat-glow {
  0%, 100% { box-shadow: 0 0 0 1px rgba(239,68,68,0.30), 0 0 0 0 rgba(239,68,68,0.40); }
  50%      { box-shadow: 0 0 0 1px rgba(239,68,68,0.50), 0 0 24px 4px rgba(239,68,68,0.20); }
}

/* Cyan glow pulse */
@keyframes s-cyan-glow {
  0%, 100% { box-shadow: 0 0 0 1px var(--border-cyan), 0 0 0 0 rgba(34,211,238,0.30); }
  50%      { box-shadow: 0 0 0 1px var(--border-cyan), 0 0 24px 4px rgba(34,211,238,0.20); }
}

/* Counter tick (number change) */
@keyframes s-tick {
  0%   { transform: translateY(-100%); opacity: 0; }
  to   { transform: translateY(0); opacity: 1; }
}

/* Spin */
@keyframes s-spin {
  to { transform: rotate(360deg); }
}

/* Shield breathing (safe state) */
@keyframes s-shield-breath {
  0%, 100% { filter: drop-shadow(0 0 8px rgba(34,197,94,0.4)); transform: scale(1); }
  50%      { filter: drop-shadow(0 0 16px rgba(34,197,94,0.6)); transform: scale(1.04); }
}

/* Ripple — incoming packet hit */
@keyframes s-ripple {
  0%   { transform: scale(0); opacity: 0.6; }
  to   { transform: scale(2.5); opacity: 0; }
}

/* Marquee for ticker */
@keyframes s-marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

/* Detect bar (sweep across) */
@keyframes s-detect-sweep {
  0%   { transform: translateX(-100%); }
  100% { transform: translateX(100%); }
}
