/* Visible by default; motion is enhancement only. */
@keyframes gsm-message-appear{from{opacity:.65;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
@media(prefers-reduced-motion:no-preference){
 :is([role="alert"],[role="status"],.admin-notice,.visit-confirmation,.chat-message,#sell-error,#error):not(:empty):not([hidden]){animation:gsm-message-appear .3s ease-out both}
 .typing-dot{animation:gsm-typing-pulse 1.4s infinite ease-in-out both}
 .typing-dot:nth-child(1){animation-delay:-.32s}.typing-dot:nth-child(2){animation-delay:-.16s}
}
@keyframes gsm-typing-pulse{0%,80%,100%{transform:scale(.5);opacity:.3}40%{transform:scale(1);opacity:1}}
@media(prefers-reduced-motion:reduce){:is([role="alert"],[role="status"],.admin-notice,.visit-confirmation,.chat-message,#sell-error,#error,.typing-dot){animation:none!important}}
@media print{:is([role="alert"],[role="status"],.admin-notice,.visit-confirmation,.chat-message,#sell-error,#error,.typing-dot){animation:none!important;transform:none!important;opacity:1!important}}
