/* ============================================
   通用动画集合
   ============================================ */

/* Ken Burns 缓慢推镜 */
@keyframes kenBurns {
  0%   { transform: scale(1) translate(0, 0); }
  50%  { transform: scale(1.08) translate(-2%, -1%); }
  100% { transform: scale(1.05) translate(1%, -2%); }
}

/* 整图呼吸 */
@keyframes breathe {
  0%, 100% { transform: scale(1); filter: brightness(1); }
  50%      { transform: scale(1.03); filter: brightness(1.05); }
}

/* 淡入 */
@keyframes fadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* 从下方滑入 */
@keyframes slideUp {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* 字符上浮 */
@keyframes charFadeIn {
  from { opacity: 0; transform: translateY(-20px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* 跳动箭头 */
@keyframes bounce {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(4px); }
}

/* 标签脉动小圆点 */
@keyframes pulse {
  0%, 100% {
    box-shadow: 0 0 6px rgba(201, 169, 110, 0.4);
    transform: scale(1);
  }
  50% {
    box-shadow: 0 0 14px rgba(201, 169, 110, 0.85);
    transform: scale(1.2);
  }
}

/* 标签浮现 */
@keyframes tagFadeIn {
  from { opacity: 0; transform: translate(-50%, -45%); }
  to   { opacity: 0.9; transform: translate(-50%, -50%); }
}

/* 落叶飘落 */
@keyframes fall {
  0% {
    transform: translateY(-10vh) translateX(0) rotate(0deg);
    opacity: 0;
  }
  10% { opacity: 1; }
  90% { opacity: 1; }
  100% {
    transform: translateY(110vh) translateX(80px) rotate(360deg);
    opacity: 0;
  }
}

/* 骊珠呼吸光 */
@keyframes pearlBreathe {
  0%, 100% {
    opacity: 0.4;
    transform: scale(1);
  }
  50% {
    opacity: 0.85;
    transform: scale(1.3);
  }
}

/* 卷轴展开 */
@keyframes scrollOpen {
  from {
    transform: scaleX(0);
    opacity: 0;
  }
  to {
    transform: scaleX(1);
    opacity: 1;
  }
}

/* 详情卡内容入场 */
@keyframes detailContentIn {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}