The About page is one of the most technically expressive pages in v-doom. A split layout pairs a 3D-perspective portrait that physically responds to your cursor with a character-by-character typewriter bio that feels as if the text is being inscribed in real time. Once the bio finishes typing, an affinities and bane grid fades into view.Documentation 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.
What’s on This Page
The page is divided into two columns (stacked on mobile, side-by-side onlg+):
Left Column — 3D Portrait Card
A card with perspective-1000 and preserve-3d applied (w-64 h-80 md:w-80 md:h-96). It listens to mousemove events on the window and translates the cursor’s position into a normalized -1 to 1 range:
10 to produce rotateY and rotateX values in degrees, so the card tilts up to ±10° in any direction as the mouse moves. The spring physics use stiffness: 75, damping: 15.
Inside the card is an inline SVG portrait made up of:
| Element | Description |
|---|---|
| Animated violet path | Body outline that morphs between two d path values on a looping spring |
| Head outline | Static bone-colored path forming the head/shoulders silhouette |
| Amber pulsing dot | Small r-5 amber circle at (100, 110) with a CSS animate-pulse glow |
| Dashed orbit ring | r-40 amber dashed circle that rotates continuously at constant speed (20s per revolution) |
Math.random() * 50 + 20). While typing is in progress:
- An amber block cursor blinks at the end of the revealed text using a Framer Motion
animate: { opacity: [1, 0] }loop (not CSS keyframes). - A feather-pen icon (
lucide-react) floats near the active typing position — it is visible during typing and disappears once the bio is complete.
opacity: 0 → 1, duration: 1s) displaying two columns:
Key Interactions
- Mouse-tracked 3D tilt — Every
mousemoveevent updates the card’srotateXandrotateYtransform. The card smoothly interpolates using Framer Motion spring (stiffness: 75, damping: 15) so fast mouse movements don’t snap. - Typewriter reveal — Each character schedules the next with
setTimeout, usingMath.random() * 50 + 20ms. There is no way to skip ahead — the reveal always runs at its natural pace. - Blinking cursor — A
motion.spanstyled as a solid amber block (w-2 h-5 bg-amber) blinks via a Framer Motionanimate={{ opacity: [1, 0] }}loop while the bio is not yet complete. The cursor is always rendered but becomes invisible once typing finishes (the bio is done whencharCount === bio.length). - Floating pen — A
motion.divwrapping the feather-pen icon is rendered while typing is in progress (charCount < bio.length). It loops a jitteryx/y/rotateoscillation to simulate the pen inscribing the text. - Fade-in grid — The affinities/bane section uses
initial={{ opacity: 0 }}→animate={{ opacity: charCount === bio.length ? 1 : 0 }}with a 1 s ease transition.
Customizing
Updating the bio text: Locate the bio string in the About page component and replace it in full. Do not split it into an array — the typewriter effect iterates overbio.split('').
The mouse-tracking effect only runs on devices with a pointer (desktop/laptop). On touch devices the card renders in its neutral position without tilt. No fallback animation is needed — the SVG portrait is visually complete without the 3D effect.