@keyframes pulse-dot {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: 0.55; transform: scale(0.85); }
}

@keyframes tx-pulse {
  0%, 100% { opacity: 1; transform: scale(1); box-shadow: 0 0 8px var(--danger-glow); }
  50%      { opacity: 0.65; transform: scale(1.18); box-shadow: 0 0 18px var(--danger-glow); }
}

@keyframes flash-new {
  0%   { background: rgba(0, 255, 136, 0.30); }
  100% { background: inherit; }
}

@keyframes fade-in-up {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@keyframes slide-down {
  from { opacity: 0; transform: translateY(-12px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes shimmer {
  0%   { background-position: -200px 0; }
  100% { background-position: 200px 0; }
}

@keyframes wave-drift {
  from { transform: translateX(0); }
  to   { transform: translateX(-200px); }
}

@keyframes signal-bars {
  0%, 100% { opacity: 0.4; }
  50%      { opacity: 1; }
}

@keyframes glow-pulse {
  0%, 100% { box-shadow: 0 0 4px var(--accent-glow); }
  50%      { box-shadow: 0 0 14px var(--accent-glow); }
}

body {
  animation: fade-in 240ms ease-out;
}

#top { animation: slide-down 320ms ease-out; }
#menubar { animation: slide-down 360ms ease-out; }

.panel {
  animation: fade-in-up 360ms ease-out backwards;
}

.panel:nth-of-type(1) { animation-delay: 60ms; }
.panel:nth-of-type(2) { animation-delay: 120ms; }
.panel:nth-of-type(3) { animation-delay: 180ms; }

.listingtable tbody tr {
  animation: fade-in-up 280ms ease-out backwards;
}

.listingtable tbody tr:nth-child(1)  { animation-delay: 30ms; }
.listingtable tbody tr:nth-child(2)  { animation-delay: 50ms; }
.listingtable tbody tr:nth-child(3)  { animation-delay: 70ms; }
.listingtable tbody tr:nth-child(4)  { animation-delay: 90ms; }
.listingtable tbody tr:nth-child(5)  { animation-delay: 110ms; }
.listingtable tbody tr:nth-child(6)  { animation-delay: 130ms; }
.listingtable tbody tr:nth-child(7)  { animation-delay: 150ms; }
.listingtable tbody tr:nth-child(8)  { animation-delay: 170ms; }
.listingtable tbody tr:nth-child(9)  { animation-delay: 190ms; }
.listingtable tbody tr:nth-child(10) { animation-delay: 210ms; }
.listingtable tbody tr:nth-child(n+11) { animation-delay: 220ms; }

.module-card {
  animation: fade-in-up 360ms ease-out backwards;
}

.module-card:nth-child(1)  { animation-delay: 80ms; }
.module-card:nth-child(2)  { animation-delay: 110ms; }
.module-card:nth-child(3)  { animation-delay: 140ms; }
.module-card:nth-child(4)  { animation-delay: 170ms; }
.module-card:nth-child(5)  { animation-delay: 200ms; }
.module-card:nth-child(6)  { animation-delay: 230ms; }
.module-card:nth-child(7)  { animation-delay: 260ms; }
.module-card:nth-child(8)  { animation-delay: 290ms; }
.module-card:nth-child(9)  { animation-delay: 320ms; }
.module-card:nth-child(10) { animation-delay: 350ms; }
.module-card:nth-child(n+11) { animation-delay: 380ms; }

.menulink { transition: color 160ms ease, border-color 160ms ease, background 160ms ease; }
.listingtable tbody tr { transition: background-color 160ms ease, transform 200ms ease; }
.module-card { transition: transform 200ms ease, border-color 200ms ease, box-shadow 200ms ease; }
a.callsign-link { transition: color 160ms ease, border-color 160ms ease; }
.aprs-link { transition: background 160ms ease, transform 160ms ease; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-delay: 0ms !important;
    transition-duration: 0.001ms !important;
  }
}
