/* =============================================
   GLOBAL BRANDED LOADER (cf-loader)

   The one stylesheet behind window.cfLoader (js/loader.js). It lives outside
   style.css on purpose: account pages drop style.css entirely, and the loader
   has to work everywhere.
   ============================================= */

.cf-loader-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 1000000;
    opacity: 0;
    transition: opacity 0.25s ease;
}

.cf-loader-overlay.is-visible {
    opacity: 1;
}

.cf-loader-content {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 20px;
}

/* Brand icon — physics-based float (ease with overshoot) */
.cf-loader-icon {
    width: 80px;
    height: auto;
    animation: cf-float 1.8s cubic-bezier(0.37, 0, 0.63, 1) infinite;
    filter: drop-shadow(0 6px 12px rgba(0, 0, 0, 0.3));
}

@keyframes cf-float {
    0%   { transform: translateY(0); }
    25%  { transform: translateY(-14px); }
    50%  { transform: translateY(0); }
    65%  { transform: translateY(-5px); }
    80%  { transform: translateY(0); }
    90%  { transform: translateY(-2px); }
    100% { transform: translateY(0); }
}

/* Dot pulse indicator */
.cf-loader-dots {
    display: flex;
    gap: 8px;
}

.cf-loader-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.85);
    animation: cf-dot-pulse 1.4s ease-in-out infinite;
}

.cf-loader-dot:nth-child(2) {
    animation-delay: 0.2s;
}

.cf-loader-dot:nth-child(3) {
    animation-delay: 0.4s;
}

@keyframes cf-dot-pulse {
    0%, 80%, 100% {
        transform: scale(0.4);
        opacity: 0.3;
    }
    40% {
        transform: scale(1);
        opacity: 1;
    }
}
