Motion is central to the Windows XP Developer Portfolio’s character. The goal is not decoration for its own sake but the same principle that guided the original Windows XP design team: animation should make the interface feel alive and give users clear feedback about what is happening. Every panel slides into view, every window springs open, menus breathe in and out, and testimonial cards drift as if suspended. This is all orchestrated by Framer Motion, the React animation library that powers every dynamic element in the portfolio.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/windows-xp-developer/llms.txt
Use this file to discover all available pages before exploring further.
Animation library
Framer Motion is consumed via themotion re-export bundled in assets/proxy.js:
m (aliased from motion) from this proxy rather than directly from framer-motion, keeping the bundle deduplication clean. Use motion.div, motion.button, etc. by replacing the HTML tag with the m.* equivalent:
Entrance animations
AquaPanel
AquaPanel is the most frequently rendered animated element in the portfolio. Every instance plays a fade + upward slide entrance whose delay is controlled by the delay prop, allowing staggered reveals when multiple panels mount together.
delay values to a list of AquaPanel components to create a cascade effect:
AquaWindow
AquaWindow uses a spring-based scale + fade entrance. The spring physics (damping: 25, stiffness: 300) produce a subtle overshoot that evokes the “pop open” feel of a native window appearing on screen. The same animation runs in reverse as an exit.
The
exit prop only fires when AquaWindow is wrapped in an AnimatePresence boundary. Without AnimatePresence the exit animation is skipped and the component unmounts immediately.Start Menu entrance
TheStartMenu overlay uses a combined translate + scale + fade animation tuned for a snappy 200 ms duration. The slight scale from 0.95 → 1 gives the panel a “zooming in from the taskbar” feel.
StartMenu wraps its animated content in AnimatePresence so that when the user closes the menu, the exit animation (opacity: 0, y: 20, scale: 0.95) plays to completion before the component is removed from the DOM:
Testimonial floating animation
Testimonial cards use a looping vertical drift animation that gives each card the appearance of floating in zero gravity. Thedelay value per card is sourced from the card’s data object, staggering the phase of each float so cards bob independently rather than in unison.
[0, -15, 0] drives the card 15 px upward then back to its origin over each 4-second cycle. easeInOut smooths both the rise and fall so the motion feels natural rather than mechanical.
CD-flip case study (3D)
The Case Studies page features the most complex animation in the portfolio: a 3D CD jewel-case flip. When a case study is opened, the cover panel rotates −160° around its left edge as if a CD case is being opened, revealing the content inside. The animation uses Framer Motion’srotateY with spring physics to give the hinge a physical weight.
transformStyle: preserve-3d
Required on the parent so that child elements participate in the same 3D rendering context. Without this,
rotateY flattens to a 2D scale effect.transformOrigin: left center
Anchors the rotation to the left edge, exactly like a physical hinge, so the cover swings open to the right.
stiffness: 50 (compared to the 300 used for AquaWindow) produces a slow, weighty swing — appropriate for the heavier feel of a physical object rather than a lightweight UI panel.
CSS lens-flare animation
Not all animation in the portfolio goes through Framer Motion. Thelens-flare class uses a pure CSS ::after pseudo-element and a transition to sweep a white highlight across an element on hover:
@keyframes sweep animation applied via group-hover:animate-[sweep_1s_ease-in-out]:
Button tap interaction
AquaButton combines the CSS :active translateY(+2px) press with Framer Motion’s whileTap to add a simultaneous scale squeeze:
scale: 0.95 spring snaps back naturally when the pointer is released, giving a tactile “click” sensation layered on top of the CSS press transform.
AnimatePresence usage summary
AnimatePresence must wrap any conditionally rendered motion.* element that should play an exit animation. The table below lists where it is used in the portfolio.
| Component | What it gates | Exit animation |
|---|---|---|
StartMenu | The menu overlay panel | opacity: 0, y: 20, scale: 0.95 over 200 ms |
AquaWindow (conditional render) | The window container | scale: 0.9, opacity: 0 via spring |
| Route transitions | Page-level components | Delegated to each page’s root motion element |