Webmaster’s motion design draws from two complementary systems: hand-written CSSDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/webmaster/llms.txt
Use this file to discover all available pages before exploring further.
@keyframes animations (registered as Tailwind-compatible utility classes) for the classic retro effects, and Framer Motion for smooth page-level transitions. The custom keyframes are deliberately over-the-top — scrolling marquees, blinking cursors, floating badges, and cycling rainbow text — which is exactly appropriate for a Y2K-aesthetic portfolio. All six custom animations respect prefers-reduced-motion and are disabled entirely for users who need them to be.
Custom CSS Keyframe Animations
All six custom@keyframes are defined in assets/main.css. Five of them are exposed as utility classes that can be dropped directly onto any JSX element.
animate-marquee — Infinite Scrolling Ticker
The marquee animation scrolls text horizontally from right to left, looping continuously. It’s the CSS equivalent of the <marquee> HTML element that defined the early web.
The marquee keyframe translates the element from 100% (off-screen right) to -100% (off-screen left):
.animate-marquee class applies it at a 15-second linear cycle with white-space: nowrap to prevent line-wrapping as the text scrolls:
animate-blink — 1-Second Opacity Toggle
The blink animation cuts between fully visible and fully invisible on a hard 50% boundary — no fade, no easing. This replicates the <blink> tag behavior and the blinking cursor on old terminals.
step-start timing function ensures the transition is instantaneous — the opacity jumps, never interpolates. The result is a clean, binary flash at exactly 1Hz.
Usage:
animate-bob — Floating Badge with Rotation
The bob animation creates a gentle floating effect combined with a rocking rotation, making elements look like they’re drifting in zero gravity. It’s used on floating badges and decorative stickers.
5px upward at the midpoint while rocking from −5° to +5°, creating a pendulum-like drift. The ease-in-out timing gives it a natural, organic feel rather than a mechanical bounce.
Usage:
rainbow-text — Cycling Rainbow Gradient Text
Rather than a separate animate-* class, the rainbow effect is bundled entirely inside .rainbow-text. It works by applying a 200%-wide rainbow linear-gradient to the element’s background, clipping that background to the text shape, and then animating the background-position across the gradient.
200% auto) so that at any moment a full rainbow is visible. As background-position shifts from 0% to 200%, the entire spectrum slides left across the text over 5 seconds before looping seamlessly.
Usage:
marching-ants — Animated Selection Border
The marching-ants effect animates four background-gradient “stripes” that together form the perimeter of the element — exactly like a selection outline in MS Paint. The border-dance keyframe advances each stripe by one dash segment (15px) per second.
Tailwind Built-In Animations
In addition to the custom keyframes, Webmaster uses three standard Tailwind animation utilities:animate-bounce
Vertical bounce —
translateY(-25%) at 0%/100% with cubic-bezier easing. 1-second infinite cycle. Used on scroll-down indicators and interactive hints.animate-ping
Scales from
1 to 2 while fading to opacity 0. Used for notification dot pulsing rings and live-indicator badges.animate-pulse
Fades opacity to
0.5 at 50% and back, on a 2-second cubic-bezier cycle. Used for skeleton loaders and subtle hover state hints.Accessibility: prefers-reduced-motion
Every custom animation in the project is disabled when the user’s operating system has reduced motion enabled. This block at the end of main.css covers all five custom utility classes and the scanlines pseudo-element:
prefers-reduced-motion: reduce set:
- The marquee ticker stops and renders as static text.
- Blinking elements remain at full opacity.
- Floating badges sit still.
- Rainbow text renders as a static gradient (transparent text on the gradient background at its initial position — consider pairing with a fallback text color via a separate class in reduced-motion contexts).
- Marching-ant borders become static dashed outlines at their initial
background-position. - The scanlines overlay is completely removed.
Framer Motion Page Transitions
Beyond the CSS animations, page-level transitions are handled by aPageTransition component that wraps route content using Framer Motion’s AnimatePresence API. This provides smooth enter/exit animations when navigating between pages — something CSS @keyframes alone cannot coordinate across React route unmounts.
For full documentation of the
PageTransition component — including the initial, animate, and exit props it passes to Framer Motion’s motion.div — see the PageTransition component reference.Animation Quick Reference
| Class | Keyframe | Duration | Trigger | Reduced-Motion Safe |
|---|---|---|---|---|
animate-marquee | marquee | 15s linear | Auto | ✅ Disabled |
animate-blink | blink | 1s step-start | Auto | ✅ Disabled |
animate-bob | bob | 2s ease-in-out | Auto | ✅ Disabled |
rainbow-text | rainbow-bg | 5s linear | Auto | ✅ Disabled |
marching-ants | border-dance | 1s linear | Auto | ✅ Disabled |
animate-bounce | bounce (Tailwind) | 1s | Auto | ⚠️ Manual opt-in |
animate-ping | ping (Tailwind) | 1s | Auto | ⚠️ Manual opt-in |
animate-pulse | pulse (Tailwind) | 2s | Auto | ⚠️ Manual opt-in |