/* 角色動作（套喺 <img> 或任何角色元素上；位移／縮放用獨立屬性 translate／scale，唔會同呢度嘅 transform 打架） */
.fx-idle, .fx-talk, .fx-thinking, .fx-happy, .fx-surprise, .fx-encourage, .fx-listen { transform-origin:50% 100%; }
.fx-idle      { animation:fxIdle 4.2s ease-in-out infinite; }
.fx-talk      { animation:fxTalk .34s ease-in-out infinite; }
.fx-thinking  { animation:fxThink 1.7s ease-in-out infinite; }
.fx-happy     { animation:fxHappy .55s cubic-bezier(.3,.7,.4,1) 2; }
.fx-surprise  { animation:fxSurprise .5s ease-out 1; }
.fx-encourage { animation:fxNod .5s ease-in-out 2; }
.fx-listen    { animation:fxListen 1.2s ease-in-out infinite; }
@keyframes fxIdle     { 0%,100% { transform:translateY(0) scale(1,1); } 50% { transform:translateY(-9px) scale(1.012,1.018); } }
@keyframes fxTalk     { 0%,100% { transform:translateY(0) scale(1.01,.985); } 50% { transform:translateY(-7px) scale(.99,1.02); } }
@keyframes fxThink    { 0%,100% { transform:rotate(-3.5deg) translateY(0); } 50% { transform:rotate(3.5deg) translateY(-4px); } }
@keyframes fxHappy    { 0% { transform:translateY(0) scale(1.03,.94); } 40% { transform:translateY(-34px) rotate(-4deg) scale(.97,1.05); } 70% { transform:translateY(0) rotate(3deg) scale(1.04,.95); } 100% { transform:translateY(0) scale(1); } }
@keyframes fxSurprise { 0% { transform:scale(1); } 25% { transform:scale(1.1,1.12) translateX(-4px); } 45% { transform:scale(1.08) translateX(5px); } 65% { transform:scale(1.06) translateX(-3px); } 100% { transform:scale(1); } }
@keyframes fxNod      { 0%,100% { transform:translateY(0) rotate(0); } 50% { transform:translateY(7px) rotate(2.5deg) scale(1.01,.98); } }
@keyframes fxListen   { 0%,100% { transform:translateY(0) scale(1.03); filter:drop-shadow(0 0 14px rgba(45,168,136,.65)); } 50% { transform:translateY(-4px) scale(1.05); filter:drop-shadow(0 0 22px rgba(45,168,136,.9)); } }

.fx-emote { position:absolute; z-index:8; width:46px; height:46px; margin:-6px 0 0 -12px; pointer-events:none; animation:fxEmote 1.5s cubic-bezier(.2,.9,.3,1.2) both; filter:drop-shadow(0 3px 0 rgba(18,62,53,.25)); }
.fx-emote svg { width:100%; height:100%; display:block; }
@keyframes fxEmote { 0% { opacity:0; transform:translateY(14px) scale(.2) rotate(-20deg); } 20% { opacity:1; transform:translateY(-6px) scale(1.25) rotate(8deg); } 35% { transform:translateY(-2px) scale(1) rotate(-4deg); } 80% { opacity:1; transform:translateY(-14px) scale(1); } 100% { opacity:0; transform:translateY(-30px) scale(.9); } }
.fx-star { position:absolute; z-index:8; width:26px; height:26px; margin:-13px 0 0 -13px; pointer-events:none; image-rendering:pixelated; animation:fxStar 1.1s cubic-bezier(.2,.8,.3,1) both; }
@keyframes fxStar { 0% { opacity:1; transform:translate(0,0) scale(.3) rotate(0); } 60% { opacity:1; } 100% { opacity:0; transform:translate(var(--dx),var(--dy)) scale(1.1) rotate(var(--rot)); } }
@media (prefers-reduced-motion: reduce) { .fx-idle, .fx-talk, .fx-thinking, .fx-listen { animation:none; } }
