/* ===== Deal animation ===== */
@keyframes deal-fly {
  from {
    opacity: 0;
    transform: translate(var(--deal-from-x, 0), var(--deal-from-y, -180px)) scale(0.5) rotate(var(--deal-rot, 0deg));
  }
  to {
    opacity: 1;
    transform: translate(0, 0) scale(1) rotate(0deg);
  }
}
.card.dealing {
  animation: deal-fly 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
  opacity: 0;
}

/* ===== Card played to trick area ===== */
@keyframes play-to-trick {
  from {
    transform: translate(var(--play-from-x, 0), var(--play-from-y, 0)) scale(1.1);
    opacity: 0.7;
  }
  to {
    transform: translate(0, 0) scale(1);
    opacity: 1;
  }
}
.card.playing {
  animation: play-to-trick 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}

/* ===== Card lands (bounce) ===== */
@keyframes card-land {
  0%   { transform: scale(1); }
  40%  { transform: scale(1.08); }
  100% { transform: scale(1); }
}
.card.landed {
  animation: card-land 0.22s ease-out;
}

/* ===== Trick won - cards fly to winner ===== */
@keyframes trick-collect {
  from {
    opacity: 1;
    transform: translate(0, 0) scale(1);
  }
  to {
    opacity: 0;
    transform: translate(var(--collect-x, 0), var(--collect-y, 0)) scale(0.4);
  }
}
.card.collecting {
  animation: trick-collect 0.45s ease-in forwards;
}

/* ===== Trick clear (generic) ===== */
@keyframes trick-clear {
  from {
    opacity: 1;
    transform: translate(0, 0) scale(1);
  }
  to {
    opacity: 0;
    transform: translate(var(--clear-x, 0), var(--clear-y, -60px)) scale(0.6);
  }
}
.card.clearing {
  animation: trick-clear 0.35s ease-in forwards;
}

/* ===== Bid reveal ===== */
@keyframes bid-reveal {
  0%  { opacity: 0; transform: scale(0.5) translateY(-10px); }
  60% { transform: scale(1.1) translateY(2px); }
  100%{ opacity: 1; transform: scale(1) translateY(0); }
}
.bid-revealed {
  animation: bid-reveal 0.4s ease-out forwards;
}

/* ===== Pass / "thinking" indicator float ===== */
@keyframes pass-float {
  0%   { opacity: 0; transform: translateY(0); }
  30%  { opacity: 1; }
  100% { opacity: 0; transform: translateY(-40px); }
}
.pass-indicator.show {
  animation: pass-float 1s ease-out forwards;
}

/* ===== Message overlay pop ===== */
@keyframes msg-pop {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(0.7); }
  50%  { opacity: 1; transform: translate(-50%, -50%) scale(1.05); }
  100% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
}
#message-overlay:not(.hidden) {
  animation: msg-pop 0.4s ease-out;
}

/* ===== Game over entrance ===== */
@keyframes game-over-in {
  from { opacity: 0; transform: scale(0.9); }
  to   { opacity: 1; transform: scale(1); }
}
#game-over-overlay:not(.hidden) {
  animation: game-over-in 0.5s ease-out;
}

/* ===== Round summary entrance ===== */
@keyframes panel-slide-up {
  from { opacity: 0; transform: translateY(30px); }
  to   { opacity: 1; transform: translateY(0); }
}
#round-summary-overlay:not(.hidden) #round-summary-panel {
  animation: panel-slide-up 0.4s ease-out;
}

/* ===== Bid panel entrance ===== */
#bid-overlay:not(.hidden) #bid-panel {
  animation: panel-slide-up 0.3s ease-out;
}

/* ===== Screen transition ===== */
@keyframes screen-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* ===== Error shake ===== */
@keyframes shake {
  0%, 100% { transform: translateX(0); }
  20%  { transform: translateX(-6px); }
  40%  { transform: translateX(6px); }
  60%  { transform: translateX(-4px); }
  80%  { transform: translateX(4px); }
}
.shake { animation: shake 0.35s ease-out; }

/* ===== Fade in ===== */
@keyframes fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}
.fade-in { animation: fade-in 0.3s ease-out; }

/* ===== Spades broken flash ===== */
@keyframes spades-broken-pulse {
  0%   { opacity: 0; transform: scale(0.8); }
  30%  { opacity: 1; transform: scale(1.15); }
  60%  { transform: scale(0.95); }
  100% { opacity: 1; transform: scale(1); }
}

/* ===== Score count animation ===== */
@keyframes score-tick {
  0%  { transform: scale(1); }
  50% { transform: scale(1.3); color: var(--accent); }
  100%{ transform: scale(1); }
}
.score-tick { animation: score-tick 0.4s ease-out; }

/* ===== Active player pulse ===== */
@keyframes active-pulse {
  0%, 100% { box-shadow: 0 0 8px var(--accent-glow); }
  50%       { box-shadow: 0 0 20px var(--accent-glow); }
}
.player-panel.active {
  animation: active-pulse 2s ease-in-out infinite;
}
