TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/witch-dev/llms.txt
Use this file to discover all available pages before exploring further.
Navigation component is the primary wayfinding element of witch-dev. On desktop (md and above) it appears as a fixed 80px-wide left sidebar housing icon-only route buttons, each revealing a styled tooltip on hover. On mobile it collapses to a single hamburger button that summons a full-screen animated overlay with staggered list items.
Route configuration
All routes are defined in a single array calledua. Each entry carries a URL path, a themed label drawn from the occult aesthetic of the portfolio, and a icon component sourced from Lucide React.
Current routes at a glance
| Path | Label | Lucide Icon |
|---|---|---|
/ | Summon | Hexagon |
/about | Origins | Sparkles |
/projects | Grimoire | BookOpen |
/skills | Affinities | BrainCircuit |
/writing | Scrolls | Scroll |
/contact | Raven | Mail |
Desktop sidebar
On screensmd and wider the component renders a fixed sidebar pinned to the left edge of the viewport. It spans the full viewport height and sits at z-50 so it floats above page content without interfering with modals or overlays at higher z-indices.
- Width:
w-20(80px) — just wide enough to contain the 48px icon buttons with breathing room. - Background:
bg-coven-dark/80withbackdrop-blur-md— semi-transparent so page content scrolls behind it with a frosted-glass effect. - Border: a subtle
border-r border-coven-purple-900/50separates the sidebar from the main content without a harsh line.
Icon buttons
Each route is rendered as a squareLink button (48 × 48px, rounded-xl) wrapping a single Lucide icon:
div anchored left-16 (64px from the button’s left edge, clearing the sidebar). It starts invisible (opacity-0) and shifted left (-translate-x-4), then slides into view on group-hover via a 300ms CSS transition — no JavaScript required.
Active state styling
React Router’sNavLink-style isActive callback drives the active/inactive class split:
Mobile menu
On viewports narrower thanmd the sidebar is hidden and replaced by a hamburger button positioned at the top-right corner (z-50). Tapping it mounts a full-screen overlay.
Overlay
AnimatePresence so it fades in on mount and fades out on unmount without leaving a DOM ghost. An X button in the top-right corner closes the menu.
Staggered list items
Each route in the mobile menu animates in with a per-item delay:Summon) appears immediately, the second (Origins) after 100ms, and so on — creating a cascading reveal effect that reinforces the spellcasting aesthetic.
Customizing routes
To add a new route, append an entry to theua array:
ua at render time.
Keep labels short (one word is ideal). The tooltip container uses
whitespace-nowrap, so longer labels will extend the tooltip width without wrapping, but very long strings may overflow outside the viewport on smaller desktop screens.