/* Keyframes */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateX(20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
@keyframes shimmer {
0% {
background-position: -1000px 0;
}
100% {
background-position: 1000px 0;
}
}
/* Animation Classes */
.fade-in {
animation: fadeIn var(--transition-normal) forwards;
}
.slide-in {
animation: slideIn var(--transition-normal) forwards;
}
.scale-in {
animation: scaleIn var(--transition-normal) forwards;
}
/* Loading Spinner */
.loading-spinner {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.8);
display: flex;
align-items: center;
justify-content: center;
z-index: 3000;
}
.spinner {
width: 50px;
height: 50px;
border: 3px solid var(--gray-200);
border-top-color: var(--primary-color);
border-radius: 50%;
animation: spin 1s infinite linear;
}
/* Skeleton Loading */
.skeleton {
background: linear-gradient(90deg,
var(--gray-200) 25%,
var(--gray-300) 37%,
var(--gray-200) 63%);
background-size: 400% 100%;
animation: shimmer 1.4s infinite;
}
/* Notification System */
.notification-container {
position: fixed;
top: 1rem;
right: 1rem;
z-index: 2500;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.notification {
padding: 1rem 1.5rem;
border-radius: var(--border-radius-md);
background: var(--white);
box-shadow: var(--shadow-md);
display: flex;
align-items: center;
gap: 1rem;
animation: slideIn var(--transition-normal);
max-width: 300px;
}
.notification.success {
border-left: 4px solid var(--success-color);
}
.notification.error {
border-left: 4px solid var(--error-color);
}
.notification.info {
border-left: 4px solid var(--primary-color);
}
/* Product Card Animations */
.product-card {
opacity: 0;
transform: translateY(20px);
transition: all var(--transition-normal);
}
.product-card.visible {
opacity: 1;
transform: translateY(0);
}
.product-card:hover {
transform: translateY(-10px);
}
/* Button Hover Effects */
.button-modern {
position: relative;
overflow: hidden;
}
.button-modern::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(to right,
transparent 0%,
rgba(255, 255, 255, 0.2) 50%,
transparent 100%);
transition: left 0.5s;
}
.button-modern:hover::after {
left: 100%;
}
/* Cart Button Animation */
@keyframes bounce {
0%, 100% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
}
.cart-button.bounce {
animation: bounce 0.5s;
}
/* Form Input Focus Effects */
.input-modern:focus {
transform: translateY(-2px);
}
/* Image Hover Effects */
.product-image {
overflow: hidden;
}
.product-image img {
transition: transform var(--transition-normal);
}
.product-image:hover img {
transform: scale(1.1);
}
/* Modal Animations */
@keyframes modalFadeIn {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.modal.show .modal-content {
animation: modalFadeIn var(--transition-normal);
}