/* =========================================================
 * 毎日雀とも麻雀 — アニメーション定義
 * ========================================================= */

/* ---------- 画面遷移 ---------- */
@keyframes screenIn {
  from { opacity: 0; transform: translateY(16px) scale(.985); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes screenOut {
  from { opacity: 1; }
  to   { opacity: 0; }
}
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ---------- タイトル ---------- */
@keyframes kenburns {
  from { transform: scale(1) translateY(0); }
  to   { transform: scale(1.12) translateY(-2.5%); }
}
@keyframes charDrop {
  0%   { opacity: 0; transform: translateY(-46px) scale(1.6); }
  60%  { opacity: 1; transform: translateY(6px) scale(.96); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes softBlink {
  0%, 100% { opacity: 1; }
  50% { opacity: .35; }
}

/* ---------- 汎用ポップ ---------- */
@keyframes popIn {
  0%   { opacity: 0; transform: scale(.6); }
  100% { opacity: 1; transform: scale(1); }
}
@keyframes floaty {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-9px); }
}
@keyframes btnPulse {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.04); }
}
@keyframes btnSheen {
  0%   { transform: translateX(-130%); }
  55%  { transform: translateX(130%); }
  100% { transform: translateX(130%); }
}

/* ---------- 対局 ---------- */
@keyframes tileDraw {
  0%   { opacity: 0; transform: translateX(26px) translateY(-8px); }
  100% { opacity: 1; transform: translateX(0) translateY(0); }
}
.tile.anim-draw { animation: tileDraw .28s cubic-bezier(.2,.9,.4,1) both; }

@keyframes tileDeal {
  0%   { opacity: 0; transform: translateY(-22px) rotateX(70deg); }
  100% { opacity: 1; transform: translateY(0) rotateX(0); }
}
.tile.anim-deal { animation: tileDeal .34s cubic-bezier(.2,1.1,.4,1) both; }

@keyframes tileLand {
  0%   { opacity: 0; transform: translateY(-14px) scale(1.25); }
  70%  { opacity: 1; transform: translateY(1px) scale(.98); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}
.tile.anim-land { animation: tileLand .3s cubic-bezier(.2,.9,.4,1) both; }

@keyframes suggestGlow {
  0%, 100% { filter: drop-shadow(0 0 2px rgba(255,215,0,.4)); transform: translateY(-6px); }
  50% { filter: drop-shadow(0 0 12px rgba(255,215,0,.95)); transform: translateY(-9px); }
}
@keyframes agariBtn {
  0%, 100% { box-shadow: 0 4px 0 rgba(0,0,0,.35), 0 0 8px rgba(255,211,78,.5); }
  50% { box-shadow: 0 4px 0 rgba(0,0,0,.35), 0 0 26px rgba(255,211,78,.95); }
}

/* ---------- カットイン ---------- */
@keyframes cutinSweep {
  0%   { opacity: 0; transform: scaleX(.1); }
  18%  { opacity: 1; transform: scaleX(1); }
  82%  { opacity: 1; transform: scaleX(1); }
  100% { opacity: 0; transform: scaleX(1); }
}
@keyframes cutinText {
  0%   { opacity: 0; transform: translateX(-70px); letter-spacing: .6em; }
  22%  { opacity: 1; transform: translateX(0); }
  80%  { opacity: 1; transform: translateX(0); letter-spacing: .22em; }
  100% { opacity: 0; transform: translateX(50px); }
}

/* ---------- 結果 ---------- */
@keyframes yakuStamp {
  0%   { opacity: 0; transform: scale(1.9) rotate(-5deg); }
  60%  { opacity: 1; transform: scale(.95) rotate(.5deg); }
  100% { opacity: 1; transform: scale(1) rotate(0); }
}

/* ---------- 福引 ---------- */
@keyframes garaponIn {
  0%   { opacity: 0; transform: translateY(-90px) scale(.6); }
  60%  { opacity: 1; transform: translateY(10px) scale(1.04); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes garaponSpin {
  0%   { transform: rotate(0deg) translateX(0); }
  20%  { transform: rotate(-10deg) translateX(-4px); }
  50%  { transform: rotate(2deg); }
  70%  { transform: rotate(10deg) translateX(4px); }
  100% { transform: rotate(0deg); }
}
@keyframes ballZoomUp {
  0%   { transform: translateX(-50%) translateY(0) scale(1); }
  100% { transform: translateX(-50%) translateY(-26vh) scale(2.6); }
}
@keyframes ballQuiver {
  0%   { transform: translateX(calc(-50% - 4px)) translateY(-26vh) scale(2.6); }
  50%  { transform: translateX(calc(-50% + 4px)) translateY(calc(-26vh + 2px)) scale(2.62); }
  100% { transform: translateX(calc(-50% - 4px)) translateY(-26vh) scale(2.6); }
}
@keyframes beamIn {
  0%   { opacity: 0; transform: translateX(-50%) scaleY(.1); }
  35%  { opacity: 1; transform: translateX(-50%) scaleY(1); }
  100% { opacity: .85; transform: translateX(-50%) scaleY(1); }
}
@keyframes raysSpin {
  to { transform: translate(-50%, -50%) rotate(360deg); }
}
@keyframes buddyFloat {
  0%, 100% { transform: translateY(0) rotate(-2deg); }
  50% { transform: translateY(-13px) rotate(2deg); }
}
@keyframes buddyJump {
  0%   { transform: translateY(0) scale(1); }
  35%  { transform: translateY(-26px) scale(1.12) rotate(-5deg); }
  65%  { transform: translateY(2px) scale(.96); }
  100% { transform: translateY(0) scale(1); }
}
.home-buddy.jump { animation: buddyJump .6s cubic-bezier(.3,1.4,.4,1) both !important; }

/* ---------- リップル/光ゆらぎ/集中線/波紋 ---------- */
@keyframes rippleOut {
  to { transform: scale(2.6); opacity: 0; }
}
@keyframes tableBreath {
  0%, 100% { opacity: .55; transform: translateY(0); }
  50% { opacity: 1; transform: translateY(-6px); }
}
@keyframes cutinLines {
  from { background-position: 0 0; }
  to   { background-position: -240px 0; }
}
@keyframes ldpRing {
  0%   { opacity: 1; transform: scale(.7); }
  100% { opacity: 0; transform: scale(1.5); }
}

/* ---------- くす玉/軍配 ---------- */
@keyframes kusudamaIn {
  0%   { opacity: 0; transform: translateX(-50%) translateY(-130%); }
  55%  { opacity: 1; transform: translateX(-50%) translateY(4%); }
  72%  { transform: translateX(-50%) translateY(-3%); }
  100% { opacity: 1; transform: translateX(-50%) translateY(0); }
}
@keyframes gunbaiIn {
  0%   { opacity: 0; transform: rotate(-32deg) scale(.3); }
  60%  { opacity: 1; transform: rotate(8deg) scale(1.12); }
  100% { opacity: 1; transform: rotate(-4deg) scale(1); }
}
@keyframes footerIn {
  0%   { opacity: 0; transform: translateY(58px); }
  100% { opacity: 1; transform: translateY(0); }
}
@keyframes ballDrop {
  0%   { transform: translateX(-50%) translateY(-46px) scale(0); }
  55%  { transform: translateX(-50%) translateY(14px) scale(1.05); }
  75%  { transform: translateX(-50%) translateY(-8px) scale(1); }
  100% { transform: translateX(-50%) translateY(0) scale(1); }
}

/* ---------- 雀とも獲得 ---------- */
@keyframes jangtomoIn {
  0%   { opacity: 0; transform: scale(.3) translateY(36px); }
  55%  { opacity: 1; transform: scale(1.1) translateY(-8px); }
  78%  { transform: scale(.96) translateY(2px); }
  100% { opacity: 1; transform: scale(1) translateY(0); }
}
@keyframes haloPulse {
  0%, 100% { transform: scale(1); opacity: .85; }
  50% { transform: scale(1.14); opacity: 1; }
}
@keyframes starPop {
  0%   { transform: scale(.2) rotate(-40deg); }
  60%  { transform: scale(1.5) rotate(8deg); }
  100% { transform: scale(1) rotate(0); }
}

/* ---------- パーティクル ---------- */
@keyframes confettiFall {
  0%   { transform: translateY(-20px) rotate(0) translateX(0); opacity: 1; }
  85%  { opacity: 1; }
  100% { transform: translateY(110vh) rotate(720deg) translateX(40px); opacity: 0; }
}
@keyframes sparkOut {
  0%   { transform: translate(0, 0) scale(1); opacity: 1; }
  100% { transform: translate(var(--dx), var(--dy)) scale(0); opacity: 0; }
}
@keyframes petalFall {
  0%   { transform: translateY(-20px) translateX(0) rotate(0); }
  100% { transform: translateY(110vh) translateX(-60px) rotate(360deg); }
}

/* ---------- トースト/レベルアップ ---------- */
@keyframes toastIn {
  0%   { opacity: 0; transform: translateX(-50%) translateY(16px); }
  12%  { opacity: 1; transform: translateX(-50%) translateY(0); }
  82%  { opacity: 1; }
  100% { opacity: 0; transform: translateX(-50%) translateY(-10px); }
}
@keyframes levelupIn {
  0%   { opacity: 0; transform: translateX(-50%) scale(.4); }
  14%  { opacity: 1; transform: translateX(-50%) scale(1.08); }
  22%  { transform: translateX(-50%) scale(1); }
  82%  { opacity: 1; transform: translateX(-50%) scale(1); }
  100% { opacity: 0; transform: translateX(-50%) scale(.92) translateY(-14px); }
}

/* ---------- 点数カウント ---------- */
@keyframes scoreFlash {
  0%, 100% { text-shadow: 0 0 28px rgba(255, 215, 0, .45); }
  50% { text-shadow: 0 0 48px rgba(255, 215, 0, .95); }
}
.result-points .pts.flash { animation: scoreFlash 1.2s ease-in-out 2; }

/* ---------- 演出速度: はやい ---------- */
html[data-speed='fast'] .cutin { animation-duration: .7s; }
html[data-speed='fast'] .cutin .cutin-text { animation-duration: .7s; }
html[data-speed='fast'] .yaku-item.stamp { animation-duration: .25s; }
html[data-speed='fast'] .tile.anim-deal { animation-duration: .18s; }

/* ---------- 直近捨て牌ポップ ---------- */
@keyframes ldpIn {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(.4); }
  60%  { opacity: 1; transform: translate(-50%, -50%) scale(1.12); }
  100% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
}
@keyframes ldpOut {
  0%   { opacity: 1; transform: translate(-50%, -50%) scale(1); }
  100% { opacity: 0; transform: translate(-50%, -56%) scale(.85); }
}

/* ---------- テンパイ発光 ---------- */
@keyframes tenpaiPulse {
  0%, 100% { opacity: .55; }
  50% { opacity: 1; }
}

/* ---------- 爽快演出 ---------- */
@keyframes flashOut {
  0%   { opacity: .95; }
  100% { opacity: 0; }
}
@keyframes shockOut {
  0%   { width: 50px; height: 50px; opacity: 1; border-width: 7px; }
  100% { width: 560px; height: 560px; opacity: 0; border-width: 1px; }
}
@keyframes appShake {
  0%, 100% { transform: translate(0, 0); }
  12% { transform: translate(-7px, 4px); }
  25% { transform: translate(7px, -4px); }
  38% { transform: translate(-5px, -3px); }
  52% { transform: translate(5px, 3px); }
  68% { transform: translate(-3px, 2px); }
  84% { transform: translate(2px, -1px); }
}
@keyframes phoenixUp {
  0%   { opacity: 0; transform: translate(-50%, -8%) scale(.55); }
  25%  { opacity: 1; }
  75%  { opacity: 1; transform: translate(-50%, -56%) scale(1.05); }
  100% { opacity: 0; transform: translate(-50%, -78%) scale(1.18); }
}

/* ---------- アクセシビリティ ---------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}
