/* wt-mipbuild-overlay.css — Wavetable mip-build loading indicator.
 *
 * Extracted from an inline <style> block in index.html as part of the
 * synth-app Content-Security-Policy hardening (#1788). Visual rules are
 * byte-for-byte identical to the original inline block.
 *
 * Visible only while VoiceManager.loadWavetable is blocking the main
 * thread on FFT-based band-limited table construction (100-500 ms for
 * a 256-frame wavetable). Listens to the wtmipbuild:{start,end}
 * CustomEvents dispatched by voiceManager.js.
 */
#wt-mipbuild-overlay {
    position: fixed;
    left: 50%;
    bottom: 24px;
    transform: translateX(-50%);
    z-index: 9999;
    padding: 10px 18px;
    background: rgba(0, 0, 0, 0.82);
    color: #e8e8e8;
    font-family: 'JetBrains Mono', ui-monospace, monospace;
    font-size: 12px;
    letter-spacing: 0.03em;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 6px;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.45);
    pointer-events: none;
    opacity: 0;
    transition: opacity 120ms ease-out;
    /* Promote to its own compositor layer so the opacity transition does
       not have to share the main thread with the FFT loop that fires
       right after wtmipbuild:start. Without this, browsers that don't
       auto-promote position:fixed + transform can end up running the
       120 ms fade on the main thread and never painting the overlay
       before `frames.map(buildMipMaps)` saturates the thread. */
    will-change: opacity;
}
#wt-mipbuild-overlay.is-visible {
    opacity: 1;
}
#wt-mipbuild-overlay .wt-mipbuild-dot {
    display: inline-block;
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #acacac;
    margin-right: 8px;
    vertical-align: middle;
    animation: wtMipbuildPulse 900ms ease-in-out infinite;
}
@keyframes wtMipbuildPulse {
    0%, 100% { opacity: 0.4; }
    50%      { opacity: 1;   }
}
