/* Rig d'animation du sprite Gueuchon (marche/idle/emotes/auras) — séparé de
   gueuchons.css (qui contient en plus les styles plein-écran de l'overlay :
   html/body/#stage en overflow:hidden, positionnement absolu des éléments...
   inadaptés à une page normale du site). Ce fichier ne contient que des
   règles de classe/keyframes, sûr à inclure sur n'importe quelle page qui
   affiche un pigSVG() (garde-robe, catalogue admin) pour que les animations
   (dont les auras) fonctionnent aussi dans les aperçus statiques. */
.g-head,.g-body,.g-arm-l,.g-arm-r,.g-leg-l,.g-leg-r,.aura-item,.aura-spin,.pig-root{transform-box:fill-box}
.g-head{transform-origin:50% 100%}
.g-body{transform-origin:50% 100%}
.g-arm-l,.g-arm-r{transform-origin:50% 12%}
.g-leg-l,.g-leg-r{transform-origin:50% 8%}

.pig.idle .g-head{animation:idleHead 2.4s ease-in-out infinite}
.pig.idle .g-body{animation:idleBody 2.4s ease-in-out infinite}
@keyframes idleHead{0%,100%{transform:translateY(0) rotate(-1deg)}50%{transform:translateY(-3px) rotate(1deg)}}
@keyframes idleBody{0%,100%{transform:scaleY(1)}50%{transform:scaleY(.975)}}

.pig.walk .g-leg-l,.pig.walk .g-arm-r{animation:stepA .36s linear infinite}
.pig.walk .g-leg-r,.pig.walk .g-arm-l{animation:stepB .36s linear infinite}
.pig.walk .g-head{animation:bobHead .36s linear infinite}
@keyframes stepA{0%,100%{transform:rotate(19deg)}50%{transform:rotate(-19deg)}}
@keyframes stepB{0%,100%{transform:rotate(-19deg)}50%{transform:rotate(19deg)}}
@keyframes bobHead{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}

.pig.danse .g-body{animation:dance .5s ease-in-out infinite}
.pig.danse .g-head{animation:danceH .5s ease-in-out infinite}
.pig.danse .g-arm-l{animation:danceAL .5s ease-in-out infinite}
.pig.danse .g-arm-r{animation:danceAR .5s ease-in-out infinite}
@keyframes dance{0%,100%{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}
@keyframes danceH{0%,100%{transform:translateY(-4px) rotate(8deg)}50%{transform:translateY(-4px) rotate(-8deg)}}
@keyframes danceAL{0%,100%{transform:rotate(-120deg)}50%{transform:rotate(-150deg)}}
@keyframes danceAR{0%,100%{transform:rotate(120deg)}50%{transform:rotate(150deg)}}

.pig.salue .g-arm-r{animation:wave .6s ease-in-out 3}
@keyframes wave{0%,100%{transform:rotate(-130deg)}50%{transform:rotate(-165deg)}}

.pig.saute .pig-root{animation:hop .5s ease-out}
@keyframes hop{0%,100%{transform:translateY(0)}40%{transform:translateY(-26px)}70%{transform:translateY(0) scaleY(.9)}}

.pig.attack .g-arm-r{animation:swing .32s cubic-bezier(.3,1.6,.5,1)}
.pig.attack .g-head{animation:lunge .32s ease-out}
@keyframes swing{0%{transform:rotate(0)}30%{transform:rotate(-125deg)}100%{transform:rotate(0)}}
@keyframes lunge{0%{transform:translateX(0)}35%{transform:translateX(9px) rotate(6deg)}100%{transform:translateX(0)}}

.pig.hurt .pig-root{animation:shake .3s ease-in-out}
@keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-7px)}75%{transform:translateX(7px)}}
.pig.hurt .head-fill,.pig.hurt .body-fill{filter:brightness(1.7) saturate(.4)}

/* Coup paré / coup esquivé — les deux issues ratées d'un assaut de !baston
   (voir lib/baston.js). La parade lève les deux bras devant la tête et se
   ramasse ; l'esquive rejette tout le corps en arrière. */
.pig.parade .g-arm-l{animation:parryL .38s ease-out}
.pig.parade .g-arm-r{animation:parryR .38s ease-out}
.pig.parade .g-head{animation:parryH .38s ease-out}
.pig.parade .g-body{animation:parryB .38s ease-out}
@keyframes parryL{0%,100%{transform:rotate(0)}30%,65%{transform:rotate(-105deg)}}
@keyframes parryR{0%,100%{transform:rotate(0)}30%,65%{transform:rotate(105deg)}}
@keyframes parryH{0%,100%{transform:translateY(0)}30%,65%{transform:translateY(5px) scaleY(.9)}}
@keyframes parryB{0%,100%{transform:scaleY(1)}30%,65%{transform:scaleY(.94)}}

.pig.esquive .pig-root{animation:dodge .4s ease-out}
@keyframes dodge{0%,100%{transform:translateX(0) rotate(0)}45%{transform:translateX(-15px) rotate(-15deg)}}

/* K.O. : le personnage BASCULE SUR SES PIEDS, il ne décolle pas. L'origine
   de rotation est au niveau des pattes ; sans elle (origine au centre par
   défaut) le corps pivotait autour de son milieu et remontait au-dessus du
   sol. Le translateY est écrit AVANT la rotation, donc appliqué après elle,
   dans le repère de l'écran : il pousse le corps vers le bas, et non le long
   d'un axe déjà incliné de 74°. */
.pig.ko .pig-root{transform-origin:50% 90%;transform:translateY(10px) rotate(74deg);transition:transform .4s ease-in}
.pig.dodo .g-body{animation:sleepB 3s ease-in-out infinite}
.pig.dodo .g-head{animation:sleepH 3s ease-in-out infinite}
@keyframes sleepB{0%,100%{transform:scaleY(1)}50%{transform:scaleY(.94)}}
@keyframes sleepH{0%,100%{transform:rotate(16deg) translateY(2px)}50%{transform:rotate(16deg) translateY(6px)}}

.aura-item{animation:floatUp 2.4s linear infinite}
.aura-item:nth-child(2){animation-delay:.5s}
.aura-item:nth-child(3){animation-delay:1s}
.aura-item:nth-child(4){animation-delay:1.5s}
.aura-item:nth-child(5){animation-delay:2s}
@keyframes floatUp{0%{transform:translateY(8px) scale(.5);opacity:0}
  25%{opacity:.95}100%{transform:translateY(-42px) scale(1.1);opacity:0}}
.aura-spin{animation:orbit 3.4s linear infinite;transform-origin:60px 55px;transform-box:view-box}
.aura-spin:nth-child(2){animation-delay:-1.13s}
.aura-spin:nth-child(3){animation-delay:-2.26s}
@keyframes orbit{from{transform:rotate(0)}to{transform:rotate(360deg)}}
.aura-ring{animation:ring 2.8s ease-out infinite;transform-box:view-box;transform-origin:60px 68px}
@keyframes ring{0%{transform:scale(.45);opacity:0}30%{opacity:.8}100%{transform:scale(1.3);opacity:0}}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important}
}
