@keyframes messageSlideIn {
    0% { opacity: 0; transform: translateY(14px) scale(0.98); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes pulseDot {
    0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }
    40% { transform: scale(1.1); opacity: 1; }
}

@keyframes pulseRecord {
    0% { box-shadow: 0 0 0 0 rgba(244,63,94,0.4); }
    70% { box-shadow: 0 0 0 10px rgba(244,63,94,0); }
    100% { box-shadow: 0 0 0 0 rgba(244,63,94,0); }
}

@keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

@keyframes toastIn {
    0% { opacity: 0; transform: translateX(40px) scale(0.9); }
    100% { opacity: 1; transform: translateX(0) scale(1); }
}

@keyframes toastOut {
    0% { opacity: 1; transform: translateX(0) scale(1); }
    100% { opacity: 0; transform: translateX(40px) scale(0.9); }
}

@keyframes typingBlink {
    0%, 100% { opacity: 1; }
    50% { opacity: 0; }
}

@keyframes fadeInScale {
    0% { opacity: 0; transform: scale(0.95); }
    100% { opacity: 1; transform: scale(1); }
}

.typing-cursor {
    display: inline-block;
    width: 7px;
    height: 15px;
    background-color: var(--primary);
    margin-left: 2px;
    vertical-align: middle;
    border-radius: 2px;
    animation: typingBlink 0.75s infinite;
}

/* Disable all motion when user prefers it */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}

[data-animations="disabled"] *, [data-animations="disabled"] *::before, [data-animations="disabled"] *::after {
    animation: none !important;
    transition: none !important;
}
