@layer utilities {
  .shake {
    animation: shake 400ms both;
  }

  .wiggle {
    animation: wiggle 400ms both;
  }

  .yellowfade {
    animation: yellowfade 1.5s both;
    animation-delay: 1s;
  }

  .delayed-fade-in {
    animation: fade-in 400ms both;
    animation-delay: 3s;
  }

  /* Keyframes */
  @keyframes boost {
    0%   { transform: scale(0.3);  opacity: 0; }
    50%  { transform: scale(1.15); opacity: 1; }
    100% { transform: scale(1); }
  }

  @keyframes appear-then-fade {
    0%,100% { opacity: 0; }
    5%,60%  { opacity: 1; }
  }

  @keyframes fade-out {
    to { opacity: 0; }
  }

  @keyframes fade-in {
    0% { opacity: 0; }
    100% { opacity: 1; }
  }

  @keyframes pulse {
    0%   { opacity: 1; }
    50%  { opacity: 0.6; }
    100% { opacity: 1; }
  }

  @keyframes pulsate {
    0% { -webkit-transform: scale(0.1, 0.1); opacity: 0.0; }
    50% { opacity: 1.0;}
    100% { -webkit-transform: scale(1.2, 1.2); opacity: 0.0; }
  }

  @keyframes shake {
    0%  { transform: translateX(-2rem); }
    25% { transform: translateX(2rem); }
    50% { transform: translateX(-1rem); }
    75% { transform: translateX(1rem); }
  }

  @keyframes submitting {
    0%    { -webkit-mask-position: 0% 0%,   50% 0%,   100% 0% }
    12.5% { -webkit-mask-position: 0% 50%,  50% 0%,   100% 0% }
    25%   { -webkit-mask-position: 0% 100%, 50% 50%,  100% 0% }
    37.5% { -webkit-mask-position: 0% 100%, 50% 100%, 100% 50% }
    50%   { -webkit-mask-position: 0% 100%, 50% 100%, 100% 100% }
    62.5% { -webkit-mask-position: 0% 50%,  50% 100%, 100% 100% }
    75%   { -webkit-mask-position: 0% 0%,   50% 50%,  100% 100% }
    87.5% { -webkit-mask-position: 0% 0%,   50% 0%,   100% 50% }
    100%  { -webkit-mask-position: 0% 0%,   50% 0%,   100% 0% }
  }

  @keyframes success {
    0%  { background-color: var(--color-border-darker); scale: 0.8; }
    20% { background-color: var(--color-border-darker); scale: 1; }
  }

  @keyframes wiggle {
    0%   { transform: rotate(0deg); }
    20%  { transform: rotate(3deg); }
    40%  { transform: rotate(-3deg); }
    60%  { transform: rotate(3deg); }
    80%  { transform: rotate(-3deg); }
    100% { transform: rotate(0deg); }
  }

  @keyframes zoom-fade {
    100% { transform: translateY(-2em); opacity: 0; }
  }

  @keyframes pop-open {
    0% { transform: scale(1); opacity: 0; } /* Allow calculating proper dimensions before animation kicks in */
    1% { transform: scale(0.3); opacity: 0; }
    75% { transform: scale(1.05); opacity: 1; }
    100% { transform: scale(1); }
  }

  @keyframes pop-visible {
    0% { transform: scale(0.3); opacity: 0; }
    33% { transform: scale(1.05); opacity: 1; }
    67% { transform: scale(0.85); }
    100% { transform: scale(1); }
  }

  @keyframes poll {
    0% { inline-size: 0; }
    50% { inline-size: calc(var(--poll-result) * 1.05%); }
    100% { inline-size: calc(var(--poll-result) * 1%); }
  }

  @keyframes slide-up {
    0% { transform: translateY(100px); opacity: 0; }
    33% { transform: translateY(-10px); }
    67% { transform: translateY(5px); opacity: 1; }
    100% { transform: translateY(0); }
  }

  @keyframes slide-up-then-down {
    0%,100% { transform: translateY(100px); opacity: 0; }
    5%,95% { transform: translateY(0); opacity: 1; }
  }

  @keyframes yellowfade {
    from { background: var(--color-warning-lighter); }
    to { background: transparent; }
  }
}
