Framer Motion is the animation engine powering nearly every interactive moment in Digital Domain — from the CRT-flicker that fires on every route change, to the stat bars that fill like an RPG level-up, to the Winamp visualizer bars that oscillate endlessly in the background. Animations are used sparingly but deliberately: each one reinforces the retro computing aesthetic while keeping the UI feeling alive and responsive.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/digital-domain/llms.txt
Use this file to discover all available pages before exploring further.
Page Transitions
Every page change in Digital Domain is wrapped in a Framer MotionAnimatePresence + motion.div pair inside the Layout shell. The motion.div is keyed by location.pathname, which tells Framer Motion to treat each navigation as a new element — triggering the exit animation on the outgoing page before the incoming page enters.
The transition is designed to look like a CRT monitor briefly over-brightening and then settling, matching the @keyframes crt flash described below.
Animation Variant Values
| Property | initial | animate | exit |
|---|---|---|---|
opacity | 0 | 1 | 0 |
scale | 0.98 | 1 | 1.02 |
filter (brightness) | 2 | 1 | 0.5 |
filter (contrast) | 1.5 | 1 | 2 |
transition.duration | — | 0.2s | — |
transition.ease | — | easeInOut | — |
0.98) and scale-up on exit (1.02) combined with the brightness/contrast filter changes creates a convincing “CRT power cycle” feeling — the screen briefly flares white on entry and dims to black on exit.
CRT Flicker Effect
Independently from the Framer Motion variants, a CSS@keyframes animation called crt runs for 150ms on every route change. It is triggered by adding the animate-crt-flicker Tailwind class to the motion.div wrapper via a useState flag that is set on location.pathname change and cleared with setTimeout.
opacity between 0 and 1 and applies small scale and skew jitters, faithfully recreating the brief geometric distortion visible on a CRT when the input signal is interrupted.
Animated Stat Bars
The/about page displays three RPG-style stat bars (HP, MP, XP) that animate from zero width to their target percentage when the component mounts. Each bar is a motion.div nested inside a fixed-height track.
easeOut duration feels satisfying without being slow — the bar accelerates quickly and then decelerates as it approaches its final position, mimicking a loading indicator filling up.
Winamp Visualizer Bars
The Winamp widget on the/about page renders 16 animated bars using [...Array(16)].map(...). Each bar is a motion.div with a height keyframe sequence that loops forever with a "mirror" repeat type, creating a smooth back-and-forth oscillation.
duration between 0.5s and 1.5s so that no two bars are in sync, producing the organic, chaotic waveform characteristic of a real audio visualizer.
Because
Math.random() is called inline in JSX during render, the durations are stable within a single mount but will re-randomize on a full unmount/remount (e.g. navigating away and back). This is intentional — it keeps the visualizer feeling fresh.Taskbar Item Enter / Exit
The Win98 taskbar on the/skills page uses AnimatePresence to animate window buttons in and out as users open and close skill windows by double-clicking desktop icons. Each button entry fades in while its width expands from zero, and reverses on removal.
width: 0 → width: "auto" animation requires no explicit pixel values — Framer Motion resolves the "auto" target at runtime by measuring the element’s natural dimensions after rendering.
Polaroid Hover Effect
The Polaroid photo cards on the/about page use motion.div with initial rotation and a whileHover override. Each card starts slightly tilted and snaps upright with a scale boost when hovered.
rotation values tilt the card counter-clockwise; positive values tilt clockwise. The whileHover variant overrides both rotate and scale simultaneously and releases them when the cursor leaves, snapping back to the initial tilt via Framer Motion’s spring exit.