/* === Base / generic === */
@keyframes fadeIn { from { opacity:0; transform:scale(.9);} to { opacity:1; transform:scale(1);} }
@keyframes blink { 0%,100%{border-color:currentColor;} 50%{border-color:transparent;} }

@keyframes typing { from { width:0ch; } to { width:var(--typing-ch,27ch); } }
@keyframes typing-desc { from { width:0; } to { width:100%; } }

@keyframes floatIcon { 0%,100%{ transform:translateY(0);} 50%{ transform:translateY(-8px);} }
@keyframes rotateIcon { from { transform:rotate(0deg);} to { transform:rotate(360deg);} }
@keyframes swingIcon  { 0%,50%,100%{ rotate:0deg;} 25%{ rotate:8deg;} 75%{ rotate:-8deg;} }

@keyframes slideText { 0%{ transform:translateX(100%);} 100%{ transform:translateX(-100%);} }

/* === Cards / modals === */
@keyframes cardBackdropIn { from { opacity:0; } to { opacity:1; } }
@keyframes square-fill {
  0%,20%{ background:transparent; transform:translateY(0); opacity:.7; }
  35%,60%{ background:rgba(33,64,178,.9); transform:translateY(-3px); opacity:1; }
  80%,100%{ background:transparent; transform:translateY(0); opacity:.7; }
}
@keyframes cardModalIn   { from { transform:translateY(6px); opacity:0;} to { transform:translateY(0); opacity:1;} }
@keyframes cardModalFade { from { opacity:0;} to { opacity:1;} }

/* === Preloader (Heart) === */
@keyframes diamond-spin  { from { transform:rotate(0deg);} to { transform:rotate(360deg);} }
@keyframes shine-rotate  { from { transform:rotate(0deg);} to { transform:rotate(360deg);} }
@keyframes diamond-float { 0%,100%{ transform:translateY(0);} 50%{ transform:translateY(-6px);} }
@keyframes bar-fill      { 0%{width:0%;} 60%{width:82%;} 100%{width:100%;} }
@keyframes preloader-fade-out { to { opacity:0; visibility:hidden; } }

/* === Accessibility: reduce motion (keep LAST) === */
@media (prefers-reduced-motion: reduce){
  :root { --typing-ch: 0ch; }
  * { animation: none !important; transition: none !important; }
}



@keyframes cell-in { 0%{opacity:1;transform:scale(.9);} 100%{opacity:0;transform:scale(1);} }
