.preloader {
    position: fixed; inset: 0; z-index: 9999;
    background: linear-gradient(135deg, #060d1f 0%, #0f1b36 100%);
    display: flex; align-items: center; justify-content: center;
    transition: opacity 0.55s ease, visibility 0.55s ease;
}
.preloader.is-hidden { opacity: 0; visibility: hidden; pointer-events: none; }

.preloader__content {
    display: flex; flex-direction: column; align-items: center; gap: 20px;
    text-align: center;
}

.preloader__spinner {
    position: relative; width: 52px; height: 52px;
}
.preloader__ring {
    position: absolute; inset: 0; border-radius: 50%;
    border: 3px solid transparent;
    animation: ring-spin 1.4s cubic-bezier(0.5,0,0.5,1) infinite;
}
.preloader__ring:nth-child(1) { border-top-color: #3b82f6; animation-delay: -0.45s; }
.preloader__ring:nth-child(2) { border-right-color: #6366f1; animation-delay: -0.30s; inset: 6px; }
.preloader__ring:nth-child(3) { border-bottom-color: #2563eb; animation-delay: -0.15s; inset: 12px; }

@keyframes ring-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }

.preloader__logo {
    font-family: 'Sora', 'Helvetica Neue', sans-serif;
    font-size: 1.3rem; font-weight: 800; color: #fff;
    letter-spacing: -0.02em;
}

.preloader__text {
    font-family: 'Nunito', sans-serif;
    font-size: 0.78rem; font-weight: 600;
    color: rgba(148,163,200,0.80);
    letter-spacing: 0.04em;
}

.preloader__progress {
    width: 140px; height: 3px;
    background: rgba(255,255,255,0.10);
    border-radius: 9999px; overflow: hidden;
}
.preloader__progress-bar {
    height: 100%;
    background: linear-gradient(90deg, #2563eb, #3b82f6, #6366f1);
    border-radius: 9999px;
    animation: progress-fill 0.9s cubic-bezier(0.4,0,0.2,1) forwards;
    animation-delay: 0.1s;
    width: 0;
}
@keyframes progress-fill { 0% { width: 0; } 100% { width: 100%; } }

.preloader__dots { display: flex; gap: 7px; }
.preloader__dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: rgba(59,130,246,0.70);
    animation: dot-bounce 1.2s ease-in-out infinite;
}
.preloader__dot:nth-child(1) { animation-delay: 0s; }
.preloader__dot:nth-child(2) { animation-delay: 0.15s; }
.preloader__dot:nth-child(3) { animation-delay: 0.30s; }
@keyframes dot-bounce { 0%,80%,100% { transform: scale(0.8); opacity: 0.6; } 40% { transform: scale(1.2); opacity: 1; } }
