.universe {
    position: fixed;
    inset: 0;
    z-index: 0;
    overflow: hidden;
}

.blob {
    position: absolute;
    border-radius: 40% 60% 70% 30% / 40% 50% 60% 50%;
    filter: blur(70px);
    opacity: var(--blob-intensity, 0.55);
    animation: morph 18s ease-in-out infinite;
    transition: opacity 1s ease;
    will-change: transform;
}

.blob-1 {
    width: 55vmax;
    height: 55vmax;
    background: var(--coral);
    top: -20%;
    left: -15%;
}

.blob-2 {
    width: 45vmax;
    height: 45vmax;
    background: var(--violet);
    bottom: -25%;
    right: -10%;
    animation-delay: -6s;
    animation-duration: 22s;
}

.blob-3 {
    width: 35vmax;
    height: 35vmax;
    background: var(--mint);
    top: 40%;
    left: 50%;
    transform: translate(-50%, -50%);
    opacity: calc(var(--blob-intensity, 0.55) * 0.45);
    animation-delay: -12s;
    animation-duration: 26s;
}

.grain {
    position: fixed;
    inset: 0;
    z-index: 1;
    opacity: 0.04;
    pointer-events: none;
    background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

.offline-banner {
    position: fixed;
    top: 2.5rem;
    left: 50%;
    transform: translateX(-50%) translateY(-0.5rem);
    z-index: 12;
    font-family: "DM Mono", monospace;
    font-size: 0.6rem;
    letter-spacing: 0.1em;
    padding: 0.45rem 0.85rem;
    border-radius: 999px;
    background: rgba(255, 92, 77, 0.15);
    border: 1px solid rgba(255, 92, 77, 0.4);
    color: var(--coral);
    transition: opacity 0.35s ease, visibility 0.35s ease, transform 0.35s cubic-bezier(0.34, 1.4, 0.64, 1);
    pointer-events: none;
    opacity: 0;
    visibility: hidden;
}

.offline-banner.visible {
    opacity: 1;
    visibility: visible;
    transform: translateX(-50%) translateY(0);
}
