The Home page is the first incantation cast when a visitor arrives at the grimoire. It renders a single 3D card centred on the screen — styled as the leather cover of an ancient spellbook — and invites the visitor to flip it open and enter the portfolio. The entire interaction is driven by Framer Motion’s spring physics, making the reveal feel weighty and ceremonial rather than instant.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/the-craft/llms.txt
Use this file to discover all available pages before exploring further.
What It Renders
The page mounts aperspective-1000 container that holds a single motion.div with preserve-3d applied. Framer Motion’s animate prop toggles rotateY between 0 and 180 degrees when the card is clicked:
Front Face — The Cover
The front face carries thebackface-hidden class and a parchment-texture background. Its contents, from top to bottom:
- An inner border inset
absolute inset-2for decorative framing - A centred heading block with the subtitle and the practitioner’s name
- A large background
<Sigil>at 10% opacity behind a fully-opaque foreground<Sigil>with a teal drop-shadow glow - A
"Tap to Reveal"prompt in Cinzel Small Caps at the bottom
Back Face — The Portal
The back face carriesrotate-y-180 so it starts hidden. It uses the bg-midnight-darker dark-glass panel style with a border-spell/30 border and a shadow-[0_0_50px_rgba(45,212,191,0.15)] ambient glow. Its contents:
- A faded
<Sigil>icon atopacity-50 - An
<h3>reading “Beyond this cover lies The Craft” - A paragraph in EB Garamond italic describing the portfolio
- A CTA button that navigates to
/about
bg-spell/10 fill slides up from translate-y-full to translate-y-0 on group-hover, while the label colour transitions from teal to dark. The button’s onClick stops propagation and calls the useNavigate hook to push the /about route:
Floating Rune Ambient Animation
Fixed to the viewport behind the card (-z-10, pointer-events-none) is an array of 15 floating rune characters. They are generated with [...Array(15)].map(...) and rendered as motion.div elements. Each rune:
- Is randomly positioned using
Math.random() * window.innerWidthforxand starts below the viewport aty: window.innerHeight + 100 - Animates upward to
y: -100with a sinusoidal horizontal drift:`calc(${Math.random() * 100}vw + ${Math.sin(t) * 50}px)` - Cycles through
✧ ✦ ⚝ ☽ ☾based onindex % 5 - Has a randomised
durationbetween 15 and 35 seconds, a randomiseddelayup to 10 seconds, andrepeat: Infinity
opacity-20 on the wrapper keeps the runes atmospheric rather than distracting.
How to Customize
To update the practitioner name and subtitle on the cover, locate the two heading elements inside the front face of the card inassets/Home.js and replace their text content:
Font choices are controlled by the
font-cursive (Pinyon Script), font-cinzel (Cinzel), and font-garamond (EB Garamond) Tailwind utility classes. These map to the Google Fonts loaded in index.html. Do not change the class names — update the font import URL instead.