Nothing says “1990s personal homepage” quite like text that never stops moving. Retro Webpage ships five custom CSS animations — all defined asDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/retro-webpage/llms.txt
Use this file to discover all available pages before exploring further.
@keyframes blocks in assets/main.css — that cover every classic GeoCities motion effect: the endlessly scrolling marquee, the cursor-grabbing blink, the hazard-tape caution stripe, the Winamp EQ bar bounce, and a Framer Motion–powered sparkle cursor trail. Each animation is designed to be immediately recognizable and trivially customizable.
Animation Reference
animate-marquee — Scrolling Text
Keyframe: marquee | Class: animate-marquee | Duration: 15s | Timing: linear | Iteration: infinite
The marquee animation slides an inline text element from fully off-screen right (translate(100%)) to fully off-screen left (translate(-100%)), producing the classic <marquee> tag behavior that GeoCities authors loved. The element must be inline-block with white-space: nowrap to prevent line breaks during travel.
MarqueeBanner (the full-width lime-on-black ticker at the top of the page), WinampPlayer (the song title scroll inside the player display).
animation-duration property. Lower values scroll faster; higher values scroll slower.
animate-blink — Blinking Text
Keyframe: blink | Class: animate-blink | Duration: 0.8s | Timing: step-start | Iteration: infinite
The blink animation toggles opacity between 1 and 0 using step-start timing, which means the transition is instantaneous — exactly how the old Netscape <blink> tag behaved. Opacity is 1 for the first 49% of each cycle, then snaps to 0 for the final 51%, producing a crisp digital flash rather than a fade.
UnderConstruction — the “UNDER CONSTRUCTION” heading blinks to demand the visitor’s attention.
step-start timing function must be preserved to keep the abrupt on/off behavior.
Using
ease or linear timing instead of step-start will produce a fade effect rather than a hard blink, which looks markedly less authentic but may be preferable for accessibility.bg-caution — Moving Caution Stripes
Keyframe: move-caution | Class: bg-caution | Duration: 2s | Timing: linear | Iteration: infinite
The caution class renders an animated diagonal hazard-tape pattern using a repeating-linear-gradient of amber (#fbbf24) and black stripes. The move-caution keyframe shifts background-position from 0 0 to 28px 0 over 2 seconds, making the stripes appear to scroll horizontally in a continuous loop — the same effect used on road construction barriers.
UnderConstruction — two full-width caution bars frame the construction notice, one above and one below the message.
background-position endpoint must match background-size to keep the scroll seamless. If you change the stripe width, update all three values together.
eq-bar / eq-bounce — Winamp EQ Bars
Keyframe: eq-bounce | Class: eq-bar | Duration: 0.5s (base, varies per bar) | Timing: ease-in-out | Iteration: infinite alternate
The EQ animation makes vertical bar elements shrink and grow between 20% height (resting) and 100% height (peak), using alternate iteration so each bar gently bounces up and down rather than jumping back to the start. Each of the 16 bars in the Winamp visualizer gets a different animation-delay and animation-duration via :nth-child() selectors, creating the staggered, organic look of a real spectrum analyzer.
WinampPlayer — the 16-column green EQ visualizer rendered inside the player’s display panel.
.eq-bar and scale the per-child durations proportionally.
Sparkle Cursor Trail
Library: Framer Motion (motion.div) | Duration: 0.8s per particle | Timing: easeOut
The sparkle cursor trail is the one animation that does not use CSS keyframes. SparkleCursor.jsx listens to mousemove events and spawns SVG four-pointed star elements at the cursor position using Framer Motion’s AnimatePresence. Each sparkle fades from opacity: 1 to opacity: 0, scales from 0.5× to 1.5×, drifts 20px downward, and rotates 90°, all over 0.8 seconds with an easeOut curve.
The sparkle color is chosen randomly from the four retro palette colors on every particle spawn:
transition.duration for longer / shorter trails, change the animate.y offset to control how far each star drifts, or update the COLORS array to match a custom palette.
The sparkle cursor is throttled to fire at most once every 50ms (
if (now - lastTime < 50) return) and keeps at most 15 particles alive at a time (.slice(-15)). Removing these limits on slower machines can cause noticeable jank.Animation Quick Reference
| Class / Effect | Keyframe | Duration | Timing | Used In |
|---|---|---|---|---|
animate-marquee | marquee | 15s | linear | MarqueeBanner, WinampPlayer |
animate-blink | blink | 0.8s | step-start | UnderConstruction |
bg-caution | move-caution | 2s | linear | UnderConstruction |
eq-bar | eq-bounce | 0.5s (varies) | ease-in-out | WinampPlayer |
| Sparkle cursor | Framer Motion | 0.8s | easeOut | SparkleCursor |