/* =========================================================
   Page Preloader
========================================================= */
#appPreloader{
    position:fixed;
    inset:0;
    z-index:2000;
    display:flex;
    flex-direction:column;
    align-items:center;
    justify-content:center;
    gap:18px;
    background:var(--color-bg);
    transition:opacity .35s ease, visibility .35s ease;
}
#appPreloader.is-hidden{
    opacity:0;
    visibility:hidden;
    pointer-events:none;
}
.preloader-mark{
    width:56px;
    height:56px;
    border-radius:16px;
    background:linear-gradient(135deg, var(--color-primary), var(--color-primary-dark));
    display:flex;
    align-items:center;
    justify-content:center;
    color:#fff;
    font-size:26px;
    box-shadow:var(--shadow-md);
    animation:preloaderPulse 1.1s ease-in-out infinite;
}
.preloader-bar{
    width:120px;
    height:4px;
    border-radius:99px;
    background:var(--color-border);
    overflow:hidden;
}
.preloader-bar::after{
    content:'';
    display:block;
    width:40%;
    height:100%;
    border-radius:99px;
    background:var(--color-primary);
    animation:preloaderSlide 1.1s ease-in-out infinite;
}
@keyframes preloaderPulse{
    0%, 100%{ transform:scale(1); }
    50%{ transform:scale(1.08); }
}
@keyframes preloaderSlide{
    0%{ transform:translateX(-120%); }
    50%{ transform:translateX(60%); }
    100%{ transform:translateX(280%); }
}

/* =========================================================
   Locked Sidebar Items (Improvements / Achievements / Analytics)
========================================================= */
.sidebar-link.is-locked{
    cursor:pointer;
}
.sidebar-link.is-locked .badge-soon{
    display:inline-flex;
    align-items:center;
    gap:4px;
}
.sidebar-link .lock-icon{
    font-size:12px;
    margin-left:auto;
    color:var(--color-muted);
}
.sidebar-link.is-locked:hover .lock-icon{
    color:var(--color-primary);
}

/* =========================================================
   Locked Feature Modal (custom animated box, not a plain
   Bootstrap default modal — matches the app's design system)
========================================================= */
.locked-feature-backdrop{
    position:fixed;
    inset:0;
    z-index:1900;
    background:rgba(16, 24, 40, .45);
    opacity:0;
    visibility:hidden;
    transition:opacity .25s ease, visibility .25s ease;
    display:flex;
    align-items:center;
    justify-content:center;
    padding:20px;
}
.locked-feature-backdrop.is-visible{
    opacity:1;
    visibility:visible;
}
.locked-feature-box{
    background:#fff;
    width:100%;
    max-width:360px;
    border-radius:var(--radius-lg);
    box-shadow:var(--shadow-lg);
    padding:32px 28px;
    text-align:center;
    transform:translateY(18px) scale(.96);
    opacity:0;
    transition:transform .3s cubic-bezier(.34,1.56,.64,1), opacity .3s ease;
}
.locked-feature-backdrop.is-visible .locked-feature-box{
    transform:translateY(0) scale(1);
    opacity:1;
}
.locked-feature-icon{
    width:64px;
    height:64px;
    margin:0 auto 18px;
    border-radius:50%;
    background:var(--color-primary-soft);
    color:var(--color-primary);
    display:flex;
    align-items:center;
    justify-content:center;
    font-size:26px;
    animation:lockBounce .5s ease .1s both;
}
@keyframes lockBounce{
    0%{ transform:scale(.4); opacity:0; }
    60%{ transform:scale(1.12); opacity:1; }
    100%{ transform:scale(1); }
}
.locked-feature-box h5{
    margin-bottom:8px;
    font-weight:700;
}
.locked-feature-box p{
    color:var(--color-muted);
    font-size:14px;
    line-height:1.6;
    margin-bottom:22px;
}
.locked-feature-box .btn{
    min-width:120px;
}

/* =========================================================
   Offline indicator (PWA)
========================================================= */
.offline-banner{
    position:fixed;
    left:50%;
    bottom:20px;
    transform:translate(-50%, 120%);
    z-index:1500;
    background:var(--color-text);
    color:#fff;
    padding:10px 20px;
    border-radius:99px;
    font-size:13px;
    display:flex;
    align-items:center;
    gap:8px;
    box-shadow:var(--shadow-lg);
    transition:transform .3s ease;
}
.offline-banner.is-visible{
    transform:translate(-50%, 0);
}
