@keyframes piece-glow {
  from { box-shadow: 0 0 8px 3px rgba(255,215,0,0.6), 0 0 16px 6px rgba(255,215,0,0.25); }
  to { box-shadow: 0 0 14px 6px rgba(255,215,0,0.8), 0 0 24px 10px rgba(255,215,0,0.35); }
}

@keyframes fadeIn {
  from { opacity: 0; transform: translateY(-2px); }
  to { opacity: 1; transform: translateY(0); }
}

/* `body.is-action-inflight` is toggled by ActionBridge during submit→reconcile. */
@keyframes piece-submitting {
  from { opacity: 0.7; filter: drop-shadow(0 0 4px rgba(255,215,0,0.5)); }
  to   { opacity: 1.0; filter: drop-shadow(0 0 10px rgba(255,215,0,0.95)); }
}
body.is-action-inflight .board-wrap {
  cursor: progress;
  pointer-events: none;
}
body.is-action-inflight .piece-selected {
  animation: piece-submitting 0.7s ease-in-out infinite alternate;
}

/* Untimed room (timeControlSecs===0): hide pills that would freeze at 0:00. */
.turn-banner-untimed .tb-turn-timer,
.turn-banner-untimed .tb-resp-timer { display: none !important; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}