// Animation Utilities // Grow In Animation @keyframes growIn { 0% { transform: scale(0.9); opacity: 0; } 100% { transform: scale(1); opacity: 1; } } .animated--grow-in { animation-name: growIn; animation-duration: 200ms; animation-timing-function: transform cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1); } // Fade In Animation @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } .animated--fade-in { animation-name: fadeIn; animation-duration: 200ms; animation-timing-function: opacity cubic-bezier(0, 1, 0.4, 1); } /* Enhanced Loader Spinner */ .loader { display: inline-block; width: var(--loader-size, 2rem); /* Dynamic size */ height: var(--loader-size, 2rem); /* Dynamic size */ border: var(--loader-border-width, 3px) solid rgba(0, 0, 0, 0.1); /* Customizable border width */ border-radius: 50%; border-top-color: var(--loader-color, #007bff); /* Customizable color */ animation: spin 0.8s ease-in-out infinite; /* Smooth animation */ margin-left: 8px; } /* Keyframes for spinner animation */ @keyframes spin { to { transform: rotate(360deg); } } /* Accessibility */ .loader[aria-hidden="true"] { display: none; } .loader i { font-size: 1.2em; color: #007bff; } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 1s ease-in-out; } .animate-card { animation: fadeIn 0.5s ease forwards; } .animate-card-delay { animation: fadeIn 0.8s ease forwards; } .loader { animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 1s ease-in-out; } @keyframes spin { to { transform: rotate(360deg); } } .loader { animation: spin 0.6s linear infinite; }