/* retro.css — optional "retro-arcade identity" layer. * * Entirely additive. To revert, delete this file and remove its tag * from templates/layout.templ. Nothing else depends on it. * * What this adds: * 1. Two independently-animated aurora blobs that drift across the * viewport on different paths — the real "shifting light" feel, * not a synchronized slide. * 2. Dot-grid overlay over the whole viewport. * 3. Heavier display headings with a soft accent glow. * * Both blobs live on html pseudo-elements at z-index -2 / -1, sitting * behind everything else so card glassiness still reads on top. */ body { /* Let the html-level aurora show through. app.css set a solid blue here; dropping it here unlocks the gradient. Removing retro.css restores the original solid background automatically. */ background: transparent; } html { background-color: var(--bg); /* Static dot-grid baked into the root background so the two pseudo-element slots stay free for the animated blobs. */ background-image: radial-gradient( circle, rgba(255, 255, 255, 0.045) 1px, transparent 1px ); background-size: 26px 26px; background-attachment: fixed; } /* Two aurora blobs animated with seven waypoints each (no `alternate`, so the second half doesn't mirror the first) on incommensurate periods — the two cycles drift in and out of phase, so the eye never locks onto a repeating pattern even though each blob is technically on a loop. Opacity also wobbles so the lights "breathe" instead of just sliding. */ html::before { content: ""; position: fixed; inset: 0; z-index: -2; pointer-events: none; background: radial-gradient( closest-side, rgba(0, 164, 228, 0.60), rgba(0, 164, 228, 0.0) 70% ); width: 70vmax; height: 70vmax; border-radius: 50%; filter: blur(60px); /* Centered base; keyframes drive all motion from here. */ top: 50%; left: 50%; margin-top: -35vmax; margin-left: -35vmax; animation: v-retro-drift-a 41s cubic-bezier(.6,.1,.4,.9) infinite; will-change: transform, opacity; } html::after { content: ""; position: fixed; inset: 0; z-index: -2; pointer-events: none; background: radial-gradient( closest-side, rgba(245, 196, 0, 0.50), rgba(245, 196, 0, 0.0) 70% ); width: 55vmax; height: 55vmax; border-radius: 50%; filter: blur(70px); top: 50%; left: 50%; margin-top: -27.5vmax; margin-left: -27.5vmax; animation: v-retro-drift-b 29s cubic-bezier(.5,.2,.3,.8) infinite; will-change: transform, opacity; } @keyframes v-retro-drift-a { 0% { transform: translate3d(-30vw, -20vh, 0) scale(1.00); opacity: 0.85; } 14% { transform: translate3d( 5vw, -28vh, 0) scale(1.18); opacity: 1.00; } 29% { transform: translate3d( 32vw, -10vh, 0) scale(0.92); opacity: 0.75; } 43% { transform: translate3d( 18vw, 22vh, 0) scale(1.10); opacity: 0.95; } 58% { transform: translate3d(-15vw, 30vh, 0) scale(1.05); opacity: 0.80; } 72% { transform: translate3d(-38vw, 8vh, 0) scale(0.95); opacity: 1.00; } 86% { transform: translate3d(-20vw, -12vh, 0) scale(1.12); opacity: 0.90; } 100% { transform: translate3d(-30vw, -20vh, 0) scale(1.00); opacity: 0.85; } } @keyframes v-retro-drift-b { 0% { transform: translate3d( 28vw, -25vh, 0) scale(1.00); opacity: 0.70; } 17% { transform: translate3d( 0vw, -10vh, 0) scale(1.20); opacity: 0.95; } 33% { transform: translate3d(-30vw, 8vh, 0) scale(0.90); opacity: 0.80; } 48% { transform: translate3d(-12vw, 28vh, 0) scale(1.10); opacity: 1.00; } 64% { transform: translate3d( 22vw, 18vh, 0) scale(0.95); opacity: 0.75; } 80% { transform: translate3d( 36vw, -2vh, 0) scale(1.15); opacity: 0.90; } 100% { transform: translate3d( 28vw, -25vh, 0) scale(1.00); opacity: 0.70; } } /* Display headings: heavier, slightly tighter, with an accent glow that ties into the card border gradient. Class-free selectors so existing Tailwind utilities (text-3xl etc.) stack on top untouched. */ h1, h2 { font-weight: 800; letter-spacing: -0.02em; text-shadow: 0 2px 14px rgba(0, 164, 228, 0.30); } @media (prefers-reduced-motion: reduce) { html::before, html::after { animation: none; } }