import { keyframes } from '@vanilla-extract/css'; // Star Drift — a slow, serene PAN of a deep-space starfield with real parallax. // // The starfield in animStars.ts stacks six background layers: // 1. near stars — tile 137x137, brighter, drifts FASTEST // 2. mid stars — tile 191x191, medium // 3. far dust — tile 233x233, dimmest, drifts SLOWEST // 4. center vignette (100% 100%) — STATIC // 5. nebula wash A (100% 100%) — STATIC // 6. nebula wash B (100% 100%) — STATIC // // Seamless parallax: the single `animation` shorthand shares ONE duration across // all layers, so speed differences are produced purely by how FAR each layer // travels in the keyframe. For a perfectly seamless loop each star layer must // translate by an EXACT integer multiple of its own tile period, so the pixel // re-entering at the wrap is identical to the one that left. We move: // near : -274px = 2 x 137 (two tiles -> fastest apparent drift) // mid : -191px = 1 x 191 (one tile -> medium) // far : -233px = 1 x 233 (one tile, but larger tile => slowest apparent) // so near/mid/far read as three depths sliding past each other, yet every layer // lands back on an identical phase at 100% for a jump-free repeat. // // A diagonal component (both x and y shift) makes the drift feel like gentle // motion through space rather than a flat slide. The static layers are pinned at // '0 0' every frame so the vignette and nebula never move under the text. // // The start frame ('0%') MUST match the static backgroundPosition authored in // animStars.ts, so that when getChatBg STRIPS this animation for // prefers-reduced-motion the finished starfield shows without a jump. export const starDrift = keyframes({ '0%': { backgroundPosition: '0 0, 61px 43px, 113px 97px, 0 0, 0 0, 0 0', }, '100%': { // near: -274/-274 (2 tiles), mid: 61-191/43-191, far: 113-233/97-233 backgroundPosition: '-274px -274px, -130px -148px, -120px -136px, 0 0, 0 0, 0 0', }, });