/* Toast Animations */
@keyframes toast-in {
  from { transform: translate(-50%, -50%) scale(0.7); opacity: 0; }
  to   { transform: translate(-50%, -50%) scale(1);   opacity: 1; }
}

@keyframes toast-out {
  from { transform: translate(-50%, -50%) scale(1);   opacity: 1; }
  to   { transform: translate(-50%, -50%) scale(0.7); opacity: 0; }
}

/* Victory Animations */
@keyframes victory-bg {
  from { background: rgba(0,0,0,0); }
  to   { background: rgba(0,0,0,0.8); }
}

@keyframes victory-bounce {
  0%   { transform: scale(0.3); opacity: 0; }
  50%  { transform: scale(1.1); }
  100% { transform: scale(1);   opacity: 1; }
}

/* Hit Flash Animation */
@keyframes flash-expand {
  0%   { transform: scale(0.3); opacity: 1; }
  100% { transform: scale(2.5); opacity: 0; }
}

/* Fade In */
@keyframes fadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* V5: Ghost ball shimmer on title */
@keyframes ghost-shimmer {
  0%   { filter: hue-rotate(0deg); }
  100% { filter: hue-rotate(360deg); }
}

/* V13: 签到确认按钮呼吸脉冲 */
@keyframes pulse {
  0%, 100% { transform: scale(1);   box-shadow: 0 0 14px rgba(72, 219, 251, 0.4); }
  50%      { transform: scale(1.05); box-shadow: 0 0 26px rgba(94, 255, 157, 0.6); }
}

/* V14/V14.1: 说明页倒数心跳抖动——双脉冲放大 + 轻微横向抖动（元素流式布局，无定位基准位移） */
@keyframes heartbeat-shake {
  0%   { transform: scale(1); }
  14%  { transform: translateX(2px) scale(1.18); }
  28%  { transform: translateX(-2px) scale(1); }
  42%  { transform: translateX(2px) scale(1.12); }
  56%  { transform: scale(1); }
  100% { transform: scale(1); }
}
