The Witch page lives at routeDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/nightshade/llms.txt
Use this file to discover all available pages before exploring further.
/about and is rendered by the AboutPage component (minified export Oe). It presents the developer’s professional backstory as a three-chapter gothic narrative, animating each chapter into view as the user scrolls. The page uses no third-party layout components — all structure comes from Framer Motion, Tailwind utility classes, and a CSS pseudo-element for the central timeline spine.
Page Header
The header block animates in on mount usinginitial={{ opacity: 0, y: 20 }} transitioning to animate={{ opacity: 1, y: 0 }}. It contains:
- Title —
"The Witch"in Cormorant Unicase (font-heading text-5xl) - Subtitle —
"A serious non-serious person."in JetBrains Mono (font-code text-sm) - Years of Practice card — an inline parchment card (
.parchment-bg+border-witch-plum/30) displaying the moon phase indicator and the caption"From novice scripter to master architect."
Moon Phase Indicator
TheMoonPhaseIndicator sub-component (He) renders five moon-phase emoji in a horizontal row. The first four are dimmed (text-witch-moonlight/60) and the fifth — the full moon — is highlighted (text-witch-moonlight text-glow-teal), visually marking “mastery” as the current phase:
Timeline Structure
The timeline is a singlediv with space-y-24 (96px vertical gaps between chapters) and a CSS pseudo-element that draws the central spine:
::before pseudo-element — there is no SVG or JavaScript involved.
Chapter Layout
Each chapter alternates between left-aligned and right-aligned text usingflex-row (even indices) and flex-row-reverse (odd indices). The three-column flex structure per chapter is:
- Text column (
w-1/2) — chapter title and narrative paragraph. - Center marker (
w-16) — a small dark circle (border-witch-amber/50) with a tiny<Candle>component layered above it (z-20). - Spacer column (
w-1/2) — empty, provides visual balance on the opposing side.
The text alignment also flips: even chapters are
text-right, odd chapters are text-left. This creates the classic alternating-sides timeline appearance common in editorial layouts.The Three Chapters
The chapter data is defined as a plain array insideAboutPage:
Chapter summaries
Chapter summaries
The Calling — The origin story. The developer discovers programming through a terminal and frames writing code as casting incantations. Establishes the witch-as-programmer metaphor that carries through the whole portfolio.The Apprenticeship — The learning years. Wrestling with documentation, legacy codebases, and the discipline of state management. The “chaotic energies of the frontend” is a reference to the difficulty of predictable client-side state before modern tools.The First Hex Banished — The first real victory: diagnosing and fixing a production memory leak using heap snapshots. The “single, precise line of cleanup code” is a nod to a forgotten
removeEventListener or subscription teardown.Scroll Animation
Each chaptermotion.div uses Framer Motion’s whileInView prop to trigger the animation only when the chapter enters the viewport:
viewport.once: true— the animation fires once and does not reset when scrolling back up.viewport.margin: "-100px"— the trigger fires 100px before the element’s top edge enters the viewport, giving a slight early start.delay— staggered at 0.2s, 0.4s, 0.6s so rapid scrolling still reveals chapters in sequence.
Customization
Add a new timeline chapter
Append a new object to the The alternating layout is driven by the array index (
chapters array inside AboutPage. Provide a unique title, narrative content, and a delay value slightly larger than the last chapter’s delay:n % 2 === 0), so a fourth chapter will automatically appear on the left side.Adjust animation timing
Change
duration in the transition object to slow down or speed up the fade-in. Change each chapter’s delay to control stagger spacing. Setting all delays to 0 causes all three chapters to animate simultaneously as soon as any enters the viewport.Update the moon phase indicator
The
MoonPhaseIndicator component is a standalone functional component defined just above AboutPage. To change which moon is highlighted, move the text-witch-moonlight text-glow-teal class to a different <span>. To add a caption beneath it, edit the <p> tag reading "From novice scripter to master architect." inside the parchment card.