/* ============================================================
   AEGIS — Effects & keyframes
   ============================================================ */
.fx-scanlines{
  position: fixed; inset: 0; z-index: 100; pointer-events: none;
  background: repeating-linear-gradient(0deg, rgba(0,0,0,0.18) 0px, rgba(0,0,0,0.18) 1px, transparent 1px, transparent 3px);
  mix-blend-mode: multiply; opacity: .35;
}
.fx-vignette{
  position: fixed; inset: 0; z-index: 99; pointer-events: none;
  background: radial-gradient(120% 120% at 50% 50%, transparent 62%, rgba(0,0,0,0.55) 100%);
}
body.no-fx .fx-scanlines{ display:none; }

@keyframes blink{ 0%,49%{opacity:1} 50%,100%{opacity:0} }
@keyframes banner-pulse{ 0%,100%{opacity:.78} 50%{opacity:1} }
@keyframes shake{ 0%,100%{transform:translateX(0)} 20%{transform:translateX(-5px)} 40%{transform:translateX(5px)} 60%{transform:translateX(-3px)} 80%{transform:translateX(3px)} }
@keyframes toast-in{ from{ transform: translateX(20px); opacity:0 } to{ transform:none; opacity:1 } }
@keyframes view-in{ from{ opacity:0; transform: translateY(6px) } to{ opacity:1; transform:none } }
@keyframes pulse-dot{ 0%{ transform: scale(1); opacity:1 } 100%{ transform: scale(3.2); opacity:0 } }
@keyframes spin{ to{ transform: rotate(360deg) } }
@keyframes flow{ to{ background-position: 200% 0 } }
@keyframes flicker{ 0%,100%{opacity:1} 92%{opacity:1} 93%{opacity:.7} 94%{opacity:1} }

.screen__view{ animation: view-in .28s ease; }

/* data-flow underline used on active processing rows */
.flowbar{
  height: 2px; width: 100%;
  background: linear-gradient(90deg, transparent, var(--cyan), transparent);
  background-size: 50% 100%; background-repeat: no-repeat;
  animation: flow 1.3s linear infinite;
}

/* small spinner */
.spin{ display:inline-block; width: 12px; height: 12px; border: 2px solid var(--edge-hi);
  border-top-color: var(--cyan); border-radius:50%; animation: spin .8s linear infinite; vertical-align: middle; }

@media (prefers-reduced-motion: reduce){
  *{ animation-duration: .01ms !important; animation-iteration-count: 1 !important; }
}
