import { keyframes } from '@vanilla-extract/css'; // Fireflies — a slow, gentle PAN of sparse glowing motes across a warm summer // dusk. The scene in animFireflies.ts stacks these background layers: // 1. large bright motes — tile 227x227, brightest core+halo, drifts FASTEST // 2. medium motes — tile 293x293, dimmer, medium drift // 3. tiny far sparks — tile 179x179, faintest, drifts SLOWEST (small step) // 4. center vignette (100% 100%) — STATIC // 5. warm dusk wash A (100% 100%) — STATIC // 6. warm dusk wash B (100% 100%) — STATIC // // Seamless drift: the single `animation` shorthand shares ONE duration across all // layers, so the differing apparent speeds come purely from how FAR each layer // travels. For a jump-free loop every mote layer must translate by an EXACT // integer multiple of its own tile period in BOTH axes, so the mote re-entering // at the wrap is identical to the one that left. Each layer moves exactly one // full tile: // large : -227 / -227 (1 x 227) // medium: -293 / -293 (1 x 293) — bigger tile, same 1-tile move => SLOWER look // far : -179 / -179 (1 x 179) — smallest tile, damped by low opacity so it // reads as the calm distant layer // Because tile sizes differ, one shared 1-tile translation yields three distinct // apparent speeds — the wandering-firefly parallax — while every layer lands back // on an identical phase at 100% for a perfectly seamless repeat. // // The diagonal component (both x and y shift) makes motes feel like they wander // through the meadow rather than slide flatly. The three static layers (vignette // and the two dusk washes) are pinned at '0 0' every frame so the warm ambient // glow and the calm reading center never move under the text. // // The '0%' frame MUST match the static backgroundPosition authored in // animFireflies.ts, so when getChatBg STRIPS this animation for // prefers-reduced-motion the finished scene of glowing motes shows without a jump. export const firefliesDrift = keyframes({ '0%': { // large, medium, far, vignette, wash A, wash B backgroundPosition: '0 0, 83px 47px, 131px 101px, 0 0, 0 0, 0 0', }, '100%': { // large: 0-227 / 0-227 // medium: 83-293 / 47-293 // far: 131-179 / 101-179 backgroundPosition: '-227px -227px, -210px -246px, -48px -78px, 0 0, 0 0, 0 0', }, });