The Testimonials page — titled “Praise from the Living” — turns social proof into a haunted spectacle. Instead of a static card grid, each testimonial is embodied by a translucent ghost that endlessly drifts across the viewport. Visitors who catch a ghost by hovering over it pause its flight and see a tooltip card appear above it with the full quote. It is playful, memorable, and rewards curiosity.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/spooky-developer/llms.txt
Use this file to discover all available pages before exploring further.
Route
Testimonials Data
All testimonials are defined in a top-level constant:| # | Name | Quote |
|---|---|---|
| 1 | CTO, SpookyCorp | ”They revived our dead project in record time.” |
| 2 | Lead Designer | ”Pixel perfect implementation. Scary good.” |
| 3 | Product Manager | ”Never missed a deadline. Might be a vampire.” |
Ghost Element
Each testimonial is rendered using the sharedGhostIcon SVG component:
text-haunt-moon/50). On hover it brightens to full text-haunt-moon, drawing the eye to whichever ghost the visitor is pursuing.
Infinite Scroll Animation
Each ghost uses Framer Motion to animate from off-screen left (x: -200) to beyond the right edge of the viewport (x: '100vw'), repeating forever:
| Ghost | Duration | Start delay | Vertical offset |
|---|---|---|---|
| Ghost 1 (CTO) | 20 s | 0 s | y: 50 |
| Ghost 2 (Designer) | 25 s | 3 s | y: 150 |
| Ghost 3 (PM) | 30 s | 6 s | y: 250 |
index * 100 + 50) ensure ghosts never fully overlap.
Hover-to-Pause Behaviour
Framer Motion’swhileHover prop is applied to each ghost container:
- The animation is paused in place
- The ghost scales up by 10 %, making it feel “caught”
- Its
z-indexis raised to 50 so the tooltip card is never obscured by another ghost
Tooltip Card
The testimonial quote is revealed as an absolutely-positioned tooltip rendered above the ghost:pointer-events-none so it cannot interfere with the ghost’s own hover target. The quote is in italics; the attribution is in text-haunt-pumpkin to provide visual hierarchy.
Page Title Z-Index
The<h1> title is given relative z-10 to keep it readable above the ghost layer, which sits in a relative h-96 container directly below:
Adding a Testimonial
Append an entry to theTESTIMONIALS array:
duration, delay, and y offset, so ghosts continue to spread evenly across the container height.
If you add many testimonials the vertical container (
h-96) may become too crowded. Consider increasing its height or capping ghost y offsets with a modulo so they wrap around vertically.