The Experience page (nav label: Pacts, routeDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/v-doom/llms.txt
Use this file to discover all available pages before exploring further.
/experience) turns a standard résumé timeline into a ritual of discovery. Each career entry is hidden behind a wax seal — a round red badge stamped with a “V”. Clicking the seal breaks it apart, unveiling an animated card with role, company, dates, and a description that fades in once the card finishes expanding.
What’s on This Page
Heading block:border-l-2 border-amber/20 running down the left side (ml-8 md:ml-0), with entries spaced via space-y-12.
Each timeline entry has two states:
Sealed (default):
- A round red circle button (
w-12 h-12,bg-red-900) at-left-[25px]with the letter “V” infont-serif text-red-300 - Hovering it produces a subtle scale-up (
whileHover: { scale: 1.1 }) — disabled once the seal is broken - No content is visible (card height is locked to
60px, opacity0.5)
- The wax seal’s background circle fades to
opacity: 0withscale-110 - Two
motion.divhalves fly apart and fade: the left half animates tox: -20, y: 20, rotate: -45and the right half tox: 20, y: 20, rotate: 45, both withopacity: 0over 0.5 seconds - A small golden dot (
w-4 h-4,bg-amber, amber glow shadow) fades in atdelay: 0.2to replace the seal as a timeline marker - The content card expands from
height: 60pxtoheight: autowithopacity: 0.5 → 1 - The description text fades in after a
0.3 sdelay
Broken seals cannot be re-sealed. The click handler uses a one-way state pattern —
openedIds is an array that only ever grows; there is no remove function. This is intentional — the animation is designed as an irreversible reveal, not a toggle.Key Interactions
- Seal break animation — Two
motion.divhalves start atx: 0, y: 0, rotate: 0and animate tox: ±20, y: 20, rotate: ±45degrees whileopacitygoes from1to0over 0.5 seconds. The halves unmount after the animation viaAnimatePresence. - Card height expansion — The content card uses
animate={{ height: isOpen ? 'auto' : '60px', opacity: isOpen ? 1 : 0.5 }}. Framer Motion interpolates the height smoothly even thoughautois not a numeric value. - Description fade-in — The description paragraph uses
initial={{ opacity: 0 }}→animate={{ opacity: isOpen ? 1 : 0 }}withtransition={{ delay: 0.3 }}, so it only becomes visible after the card has had time to expand. - Golden dot — Once the seal breaks, a
motion.divstyled as a smallw-4 h-4amber circle with an amber glow shadow fades in atdelay: 0.2to replace the seal as a timeline marker.
Customizing
The timeline data lives in apacts array. Replace the entries with your own employment history:
| Field | Type | Description |
|---|---|---|
id | number | Unique key; used to track which seals have been broken |
role | string | Job title shown inside the card header |
company | string | Employer name shown next to the @ symbol |
period | string | Date range displayed below the role/company line |
description | string | Body text that fades in after the card opens |