/* ============================================================
   一念菩提 —— 关键帧动效
   原则：庄严优先于华丽；一切动效缓慢、克制、有呼吸感
   ============================================================ */

/* 首屏题字 · 逐字浮现 */
@keyframes riseIn {
  from { opacity: 0; transform: translateY(28px); filter: blur(6px); }
  to   { opacity: 1; transform: translateY(0);    filter: blur(0); }
}

@keyframes fadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@keyframes fadeInSoft {
  from { opacity: 0; filter: blur(8px); }
  to   { opacity: 1; filter: blur(0); }
}

/* 印章落下 */
@keyframes sealStamp {
  0%   { opacity: 0; transform: scale(2.4) rotate(-14deg); }
  60%  { opacity: 1; transform: scale(0.94) rotate(2deg); }
  100% { opacity: 0.92; transform: scale(1) rotate(0); }
}

/* 金色微光呼吸 */
@keyframes breatheGlow {
  0%, 100% { opacity: 0.5; }
  50%      { opacity: 1; }
}

/* 滚动提示 · 垂丝下引 */
@keyframes threadDown {
  0%   { transform: scaleY(0); transform-origin: top; }
  45%  { transform: scaleY(1); transform-origin: top; }
  55%  { transform: scaleY(1); transform-origin: bottom; }
  100% { transform: scaleY(0); transform-origin: bottom; }
}

/* 圆钮外环 · 缓相 */
@keyframes ringSpin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

/* 香头火光 */
@keyframes emberPulse {
  0%, 100% { box-shadow: 0 0 6px 2px rgba(255, 122, 40, 0.85), 0 0 22px 6px rgba(255, 122, 40, 0.35); }
  50%      { box-shadow: 0 0 10px 3px rgba(255, 160, 60, 1), 0 0 34px 10px rgba(255, 140, 50, 0.5); }
}

/* 功德 +X 浮升 */
@keyframes meritFloat {
  0%   { opacity: 0; transform: translate(-50%, 0) scale(0.8); }
  18%  { opacity: 1; transform: translate(-50%, -18px) scale(1.06); }
  100% { opacity: 0; transform: translate(-50%, -120px) scale(1); }
}

/* 签筒摇晃 */
@keyframes tubeShake {
  0%, 100% { transform: rotate(0); }
  12% { transform: rotate(-7deg); }
  26% { transform: rotate(6.4deg); }
  40% { transform: rotate(-5.6deg); }
  54% { transform: rotate(4.6deg); }
  68% { transform: rotate(-3.4deg); }
  82% { transform: rotate(2deg); }
}

/* 签支跳出 */
@keyframes stickLeap {
  0%   { transform: translateY(0); }
  55%  { transform: translateY(-42px) rotate(3deg); }
  100% { transform: translateY(-30px) rotate(2deg); }
}

/* Create by AI Begin 2026-07-13 10:21:59 */
@keyframes incenseReveal {
  from { opacity: 0; transform: scale(1.04); filter: blur(6px) brightness(0.7); }
  to   { opacity: 1; transform: scale(1); filter: blur(0) brightness(1); }
}

@keyframes stickLeapPhoto {
  0%   { opacity: 0; transform: translateX(-50%) translateY(24px) scale(0.86) rotate(-4deg); }
  45%  { opacity: 1; transform: translateX(-50%) translateY(-58px) scale(1.05) rotate(3deg); }
  100% { opacity: 1; transform: translateX(-50%) translateY(-42px) scale(1) rotate(2deg); }
}

@keyframes tubePulse {
  0%, 100% { transform: scale(1); }
  30% { transform: scale(1.015) translateX(-1px); }
  55% { transform: scale(1.01) translateX(1px); }
  75% { transform: scale(1.008); }
}
/* Create by AI End */

/* 菩萨降临 */
@keyframes deityArrive {
  from { opacity: 0; transform: translateY(24px) scale(1.04); filter: blur(14px) brightness(1.6); }
  to   { opacity: 1; transform: translateY(0) scale(1);       filter: blur(0) brightness(1); }
}

/* 佛光轮转 */
@keyframes haloTurn {
  from { transform: rotate(0deg); }
  to   { transform: rotate(-360deg); }
}

/* 全屏灯光脉冲（上香点燃） */
@keyframes lightPulse {
  0%   { opacity: 0; }
  25%  { opacity: 1; }
  100% { opacity: 0; }
}

/* 弹窗入场 */
@keyframes modalIn {
  from { opacity: 0; transform: translateY(26px) scale(0.985); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

/* 抽屉入场 */
@keyframes drawerIn {
  from { transform: translateX(100%); }
  to   { transform: translateX(0); }
}

/* toast */
@keyframes toastIn {
  0%   { opacity: 0; transform: translate(-50%, 14px); }
  10%  { opacity: 1; transform: translate(-50%, 0); }
  85%  { opacity: 1; transform: translate(-50%, 0); }
  100% { opacity: 0; transform: translate(-50%, -8px); }
}

/* 卡片映金 · 扫光 */
@keyframes cardSheen {
  from { transform: translateX(-130%) skewX(-18deg); }
  to   { transform: translateX(230%) skewX(-18deg); }
}

/* 竖排小字 · 缓缓显现 */
@keyframes inkReveal {
  from { clip-path: inset(0 0 100% 0); opacity: 0.4; }
  to   { clip-path: inset(0 0 0% 0); opacity: 1; }
}
