@keyframes appear-then-fade {
  0%      { opacity: 0; transform: translateY(-0.5em); }
  5%,60%  { opacity: 1; transform: translateY(0); }
  100%    { opacity: 0; transform: translateY(0); }
}

@keyframes boost {
  0%   { transform: scale(0.8); opacity: 0; }
  100% { transform: scale(1);   opacity: 1; }
}

@keyframes pulsing-outline {
  0%  { outline-width: 0; }
  33% { outline-width: 4px; }
}

@keyframes scale-fade-out {
  0%   { transform: scale(1); opacity: 1; }
  100% { transform: scale(0); opacity: 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; }
  33% { 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(-1.5em); scale: 2; opacity: 0; }
}

@keyframes border-fade-out {
  from {
    border-color: var(--color-text);
  }

  to {
    border-color: transparent;
  }
}

@keyframes message-arrive {
  from {
    opacity: 0;
    transform: translateY(4px);
  }
}

@keyframes separator-reveal {
  from { opacity: 0; }
}

@keyframes popup-in {
  from {
    opacity: 0;
    transform: scale(0.95);
  }
}

@keyframes badge-in {
  from {
    opacity: 0;
    transform: scale(0.5);
  }
}

@keyframes empty-state-in {
  from {
    opacity: 0;
    transform: translateY(4px);
  }
}

@keyframes typing-dot {
  0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
  30%           { opacity: 1;   transform: translateY(-2px); }
}

@keyframes bookmark-pop {
  from {
    opacity: 0;
    transform: scale(0.7);
  }
}

@keyframes thread-link-highlight {
  from { background-color: var(--color-selected); }
  to   { background-color: transparent; }
}

.shake {
  animation: shake 400ms both;
}

/* Respect user preference for reduced motion */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
