The Projects page presents completed work as a collection of spell-cards under the heading “Spells Cast”. Each project is aDocumentation 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.
<TarotCard type="project"> that starts face-down and flips on hover to reveal the project name, a one-line description, its tech ingredients, and a link to view the work.
What’s on This Page
Heading block: The heading animates in from above (initial: { opacity: 0, y: -20 } → animate: { opacity: 1, y: 0 }):
flex-wrap grid that flows into multiple rows on smaller screens. The container uses justify-center gap-8 md:gap-12.
The four project cards:
| Title | Subtitle | Ingredients |
|---|---|---|
| Grimoire.js | Documentation Generator | React, AST Parsing, Tailwind |
| Soul Catcher | Analytics Dashboard | Next.js, D3.js, PostgreSQL |
| Alchemist’s Forge | Component Library | TypeScript, Radix UI, Framer Motion |
| Divination API | Predictive Search | Rust, Redis, Cloudflare Workers |
border-violet/40 border, a subtle radial gradient from violet/10 to transparent, and a centered amber ✦ diamond symbol with nested rotated borders. The card type label (“project”) is shown in muted violet below the diamond.
Card back (after hover/click):
The flipped face shows:
- Title in
font-serif text-xl text-bone - Subtitle in amber
font-accent text-sm - Description text in
text-bone/80 - Ingredients as small pill badges with
bg-violet/20 border-violet/30styling - A “Speak Incantation →” link in amber that opens the project URL in a new tab
Key Interactions
- Spring-physics entrance — Each card wrapper uses
initial: { opacity: 0, scale: 0.8, rotate: -10 }→animate: { opacity: 1, scale: 1, rotate: 0 }withtype: 'spring', stiffness: 100. Cards are staggered withdelay: i * 0.2(0 s, 0.2 s, 0.4 s, 0.6 s). - Flip on hover — Hovering a card triggers a
rotateYflip to reveal the back face. - Link isolation — The “Speak Incantation →”
<a>tag callse.stopPropagation()so clicking the link does not re-flip the card.
Customizing
Replace the project data array insrc/pages/Projects.jsx with your own work. Each object maps directly to <TarotCard> props:
The
ingredients prop renders as pill badges on the card back. Keep each ingredient label short (one or two words) so the badges wrap cleanly within the card’s fixed width. Long labels like "Framer Motion" work fine; full sentences will overflow.