/* var() in a keyframe resolves against the animated element — keep --gold, not a literal, so it follows the light-theme board re-pin. */
@keyframes piece-glow {
  from {
    box-shadow:
      0 0 8px 3px color-mix(in srgb, var(--gold) 60%, transparent),
      0 0 16px 6px color-mix(in srgb, var(--gold) 25%, transparent);
  }
  to {
    box-shadow:
      0 0 14px 6px color-mix(in srgb, var(--gold) 80%, transparent),
      0 0 24px 10px color-mix(in srgb, var(--gold) 35%, transparent);
  }
}

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

@keyframes piece-submitting {
  from { opacity: 0.7; filter: drop-shadow(0 0 4px color-mix(in srgb, var(--gold) 50%, transparent)); }
  to   { opacity: 1.0; filter: drop-shadow(0 0 10px color-mix(in srgb, var(--gold) 95%, transparent)); }
}
/* is-plan-running covers the gaps BETWEEN a plan's steps too (STEP_MS in move-plan.js), which
   the inflight latch alone leaves open. */
body.is-action-inflight .board-wrap,
body.is-plan-running .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-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;
  }
}