The Projects page presents each portfolio project as a Major Arcana tarot card. Every card has a thematic arcana name and Roman numeral on its face, and a full project brief on its back. Clicking a card spins it 180 degrees on the Y axis to reveal the project title, description, tech stack “incantations”, and links to the GitHub repository and live deployment. The four-column grid gives the page the look of a freshly dealt hand.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/fortune-seeker/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The Projects page lives at route/projects and is titled “Drawn Cards”. Its opening quote — “The Major Arcana of my creations. Each card a world unto itself.” — reinforces the idea that each project is its own self-contained universe. State is managed by a single useState hook tracking which card ID is currently flipped. Clicking an already-flipped card flips it back. The page uses the same TarotCard component as the About page but with interactive flip behavior.
Unlike the About page where cards are permanently face-up, the Projects page passes
isFlipped={selectedId === project.id} — flipping is toggle-based, and only one card is flipped at a time because clicking a new card first unflips the previous one (the state holds a single ID, not an array).Layout & Components
TarotCard (×4)
Each
TarotCard receives a frontContent (arcana name, Roman numeral, icon, pulse animation) and a backContent (project title, description, tech tags, GitHub and live links). The isFlipped prop is derived from comparing the project’s id against the component’s selectedId state.Responsive grid
Cards are arranged in a CSS grid with
grid-cols-1 on mobile, grid-cols-2 on md, and grid-cols-4 on lg. Each card wrapper is a motion.div that stagger-enters from opacity: 0, y: 50 and lifts on hover via whileHover: { y: -15, scale: 1.02 }.Spring flip
The card flip uses
motion.div with animate: { rotateY: isFlipped ? 180 : 0 }. The transition is a spring with stiffness: 60 and damping: 15, producing a slightly bouncy flip that feels tactile rather than mechanical.Radial pulse (front face)
A
motion.div on the front face of each card animates scale between [1, 1.2, 1] and opacity between [0.5, 0.8, 0.5] on a 4 s infinite loop, creating a soft heartbeat glow behind the project icon.Data Structure
Each project is an object in theprojects array. All fields are required:
Animations
Staggered card entrance
Staggered card entrance
Each card’s wrapping
motion.div has initial: { opacity: 0, y: 50 } and animate: { opacity: 1, y: 0 }. Delays are staggered by index * 0.15 seconds (0 s, 0.15 s, 0.30 s, 0.45 s) so the cards appear to deal onto the table one after another.Card flip (Y-axis spring)
Card flip (Y-axis spring)
The inner
motion.div toggles rotateY between 0 and 180 degrees via a spring transition. The backface-hidden CSS class on both face div elements ensures only one face is visible at a time. A shine overlay on the back face animates from x: "-100%" to x: "100%" when flipped, simulating a light reflection sweeping across the surface.Hover lift
Hover lift
whileHover: { y: -15, scale: 1.02 } is applied to the outer card wrapper. The box-shadow on the card border transitions from a subtle glow to a brighter one on hover via Tailwind’s group-hover variant and a CSS transition-shadow duration-500.Front face pulse
Front face pulse
The radial gradient behind each project icon uses
animate: { scale: [1, 1.2, 1], opacity: [0.5, 0.8, 0.5] } with a 4 s infinite easeInOut loop. This draws the eye to the icon and suggests the project is “alive”.Customization
Add a new project
Push a new object into the
projects array. Choose a meaningful arcana name (draw from the Major or Minor Arcana), assign the next Roman numeral, pick a Lucide icon that fits the project’s theme, and fill in the real link and github URLs. The grid will automatically reflow to accommodate the new card.Update live links
Replace both
"#" placeholder values with real URLs. The GitHub link renders a Github icon + “Code” label; the live link renders an ExternalLink icon + “Portal” label. Both buttons call event.stopPropagation() so clicking them does not flip the card.Rename arcana identities
Give each project its own arcana personality by changing
arcana. Some evocative options from the tarot: “The World”, “The Star”, “The Chariot”, “The High Priestess”, “The Hermit”. The name appears in italic gold on the card back below the project title.