/* Animaciones personalizadas */
@keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

@keyframes pulse {
    0%, 100% { opacity: 1; transform: scale(1); }
    50% { opacity: 0.7; transform: scale(1.05); }
}

/* Spinner de página */
.web-loader {
    will-change: opacity;
}

.web-spinner-circle {
    animation: spin 1s cubic-bezier(0.68, -0.55, 0.27, 1.55) infinite;
    will-change: transform;
}

/* Spinner de acción */
.web-action-loader {
    will-change: opacity;
}

.web-action-spinner {
    animation: spin 0.8s linear infinite;
    will-change: transform;
}

/* Efectos de transición */
.animate-spin {
    animation: spin 1s linear infinite;
}

.animate-pulse {
    animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

/* Optimización de rendimiento */
.web-loader, .web-action-loader {
    pointer-events: none;
}

.web-loader * {
    pointer-events: none;
}

.web-action-loader > div {
    pointer-events: auto;
}