/* v2.4 - shared, dependency-free animation system for front end and admin preview.
   Animations modify the icon or label only, never the fixed-position anchor.
   Per-element duration/delay are safely generated from clamped settings. */
.cwfi-icon-box[class*="cwfi-anim-"],
.cwfi-icon-preview[class*="cwfi-anim-"],
.cwfi-attached-label[class*="cwfi-label-anim-"],
.cwfi-label-preview[class*="cwfi-label-anim-"]{
  animation-duration:var(--cwfi-animation-duration,2.4s);
  animation-delay:var(--cwfi-animation-delay,0s);
  animation-iteration-count:infinite;
  animation-timing-function:ease-in-out;
  animation-fill-mode:both;
  transform-origin:center center;
  will-change:auto;
}
.cwfi-anim-none,.cwfi-label-anim-none{animation-name:none!important}
.cwfi-anim-pulse,.cwfi-label-anim-pulse{animation-name:cwfi-pulse}
.cwfi-anim-shake,.cwfi-label-anim-shake{animation-name:cwfi-shake}
.cwfi-anim-bounce,.cwfi-label-anim-bounce{animation-name:cwfi-bounce}
.cwfi-anim-rotate,.cwfi-label-anim-rotate{animation-name:cwfi-rotate;animation-timing-function:linear}
.cwfi-anim-heartbeat,.cwfi-label-anim-heartbeat{animation-name:cwfi-heartbeat}
.cwfi-anim-float,.cwfi-label-anim-float{animation-name:cwfi-float}
.cwfi-anim-swing,.cwfi-label-anim-swing{animation-name:cwfi-swing}
.cwfi-anim-wobble,.cwfi-label-anim-wobble{animation-name:cwfi-wobble}
.cwfi-anim-jelly,.cwfi-label-anim-jelly{animation-name:cwfi-jelly}
.cwfi-anim-flip,.cwfi-label-anim-flip{animation-name:cwfi-flip;backface-visibility:visible}
.cwfi-anim-pop,.cwfi-label-anim-pop{animation-name:cwfi-pop}
.cwfi-anim-flash,.cwfi-label-anim-flash{animation-name:cwfi-flash}
.cwfi-anim-glow,.cwfi-label-anim-glow{animation-name:cwfi-glow}
.cwfi-anim-nudge,.cwfi-label-anim-nudge{animation-name:cwfi-nudge}
@keyframes cwfi-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.09)}}
@keyframes cwfi-shake{0%,100%{transform:translateX(0)}15%,45%{transform:translateX(-3px)}30%,60%{transform:translateX(3px)}}
@keyframes cwfi-bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
@keyframes cwfi-rotate{to{transform:rotate(360deg)}}
@keyframes cwfi-heartbeat{0%,16%,32%,100%{transform:scale(1)}8%,24%{transform:scale(1.16)}}
@keyframes cwfi-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
@keyframes cwfi-swing{0%,100%{transform:rotate(0deg)}18%{transform:rotate(11deg)}36%{transform:rotate(-8deg)}52%{transform:rotate(5deg)}70%{transform:rotate(-3deg)}}
@keyframes cwfi-wobble{0%,100%{transform:translateX(0) rotate(0)}18%{transform:translateX(-5px) rotate(-5deg)}38%{transform:translateX(5px) rotate(5deg)}58%{transform:translateX(-3px) rotate(-3deg)}78%{transform:translateX(2px) rotate(2deg)}}
@keyframes cwfi-jelly{0%,100%{transform:scale(1,1)}20%{transform:scale(1.17,.86)}40%{transform:scale(.91,1.10)}60%{transform:scale(1.06,.96)}80%{transform:scale(.99,1.02)}}
@keyframes cwfi-flip{0%,12%,100%{transform:perspective(420px) rotateY(0deg)}47%{transform:perspective(420px) rotateY(180deg)}80%{transform:perspective(420px) rotateY(360deg)}}
@keyframes cwfi-pop{0%,18%,100%{transform:scale(1)}10%{transform:scale(1.25)}26%{transform:scale(.96)}}
@keyframes cwfi-flash{0%,25%,35%,65%,100%{filter:brightness(1)}30%,60%{filter:brightness(1.5)}}
@keyframes cwfi-glow{0%,100%{filter:drop-shadow(0 0 0 transparent)}50%{filter:drop-shadow(0 0 9px rgba(70,175,255,.72))}}
@keyframes cwfi-nudge{0%,16%,36%,100%{transform:translateX(0)}22%{transform:translateX(-6px)}29%{transform:translateX(3px)}}
@media(prefers-reduced-motion:reduce){
  .cwfi-icon-box[class*="cwfi-anim-"],.cwfi-icon-preview[class*="cwfi-anim-"],
  .cwfi-attached-label[class*="cwfi-label-anim-"],.cwfi-label-preview[class*="cwfi-label-anim-"]{
    animation:none!important;transition:none!important;filter:none!important;transform:none!important
  }
}
