/* ============================================================
   案件线索墙 — Keyframe Animations
   ============================================================ */

/* 卡片入场 — 从下方淡入 */
@keyframes cardEnter {
  from {
    opacity: 0;
    transform: translateY(20px) scale(0.92);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

/* 卡片拖拽态 — 微微抬起 */
@keyframes cardLift {
  from { box-shadow: var(--shadow-md); }
  to   { box-shadow: var(--shadow-lg); }
}

/* 连线绘制 — 描边动画 */
@keyframes drawLine {
  from { stroke-dashoffset: 1000; }
  to   { stroke-dashoffset: 0; }
}

/* 连线正确 — 绿色闪烁 */
@keyframes lineCorrect {
  0%, 100% { stroke: #5a5; opacity: 1; }
  50%      { stroke: #8c8; opacity: 0.7; }
}

/* 连线错误 — 红色抖动 */
@keyframes lineWrong {
  0%, 100% { stroke: var(--accent); transform: translateX(0); }
  20%      { transform: translateX(-2px); }
  40%      { transform: translateX(2px); }
  60%      { transform: translateX(-2px); }
  80%      { transform: translateX(2px); }
}

/* 图钉弹跳 */
@keyframes pinBounce {
  0%   { transform: scale(0); }
  60%  { transform: scale(1.2); }
  100% { transform: scale(1); }
}

/* 阶段解锁 — 光效扫过 */
@keyframes stageUnlock {
  0%   { background-position: -200% 0; }
  100% { background-position: 200% 0; }
}

/* 推理结果 — 真相揭晓 */
@keyframes truthReveal {
  0%   { opacity: 0; transform: scale(0.8); filter: blur(10px); }
  60%  { opacity: 1; transform: scale(1.05); filter: blur(0); }
  100% { opacity: 1; transform: scale(1); filter: blur(0); }
}

/* 分数弹出 */
@keyframes scorePopup {
  0%   { opacity: 0; transform: scale(0.5) translateY(20px); }
  60%  { transform: scale(1.15) translateY(-5px); }
  100% { opacity: 1; transform: scale(1) translateY(0); }
}

/* 背景呼吸 — 轻微亮度波动 */
@keyframes boardBreathe {
  0%, 100% { filter: brightness(1); }
  50%      { filter: brightness(1.02); }
}

/* 锁定线索 — 抖动提示 */
@keyframes lockedShake {
  0%, 100% { transform: translateX(0); }
  25%      { transform: translateX(-3px); }
  75%      { transform: translateX(3px); }
}
