Clippy is a faithful recreation of the beloved (and often despised) Microsoft Office paperclip assistant — rendered as a 📎 emoji with animated eyes — that pops up 5 seconds after the desktop loads and offers to help visitors navigate the portfolio. It’s a deliberate easter egg and a love letter to the Windows 98 era.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/log-portfolio/llms.txt
Use this file to discover all available pages before exploring further.
How It Works
Clippy lives incomponents/Clippy.js and is a single functional React component. It uses a useState flag (l) to toggle its own visibility, and a useEffect that fires a setTimeout to flip that flag after 5 seconds:
setVisible(false) is called and Clippy disappears entirely (the component returns null).
Animation & Appearance
Clippy enters with a Framer Motionmotion.div slide-in from below:
z-[9000] — high enough to float above all windows and the taskbar.
The paperclip emoji container has animate-bounce applied, making it perpetually bounce to attract attention:
Animated Eyes
Two small black dots are positioned over the emoji inside white pill shapes, usinganimate-[ping_3s_infinite] to simulate blinking eyes:
The Speech Bubble
The speech bubble is styled as a yellow sticky note — a nod to Office’s tooltip aesthetic — usingbg-[#ffffcc] border border-black:
div in the bottom-right corner of the bubble:
Default Message
The initial message text is stored in thei state variable and reads:
“It looks like you’re trying to view a portfolio. Would you like some help with that?”
Action Buttons
The bubble contains two action buttons:| Button | Behaviour |
|---|---|
| Get help with navigation | Does nothing (visual only) |
| Just browse by myself | Calls s(false) — dismisses Clippy |
X icon, size={12}) sits in the top-right corner of the bubble and also calls s(false).
Customizing Clippy
Edit the greeting message
Open
components/Clippy.js and find the initial useState call for i. Change the string to any message you want Clippy to display:Change the delay
Find the
5e3 literal in the setTimeout call and replace it with the number of milliseconds you want. For example, 10000 for 10 seconds or 1000 for 1 second:Clippy’s component returns
null after dismissal and never re-mounts during the same page session. If you want Clippy to be re-triggerable, lift the visibility state up to a parent component or use localStorage to track whether the user has already dismissed it.