The Sanctum is the first page a visitor encounters when they open the Nightshade portfolio. It renders 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.
/ and is driven by the SanctumPage component (minified export Re). Its job is atmospheric: establish the witch aesthetic, display the portfolio owner’s name, and invite the visitor to navigate deeper by choosing a candle.
Visual Structure
The layout stacks two sections vertically inside a full-height flex column:- Orbital sigil — a 384×384px (
w-96 h-96) centered container that houses the rotating rings and the hero text. - Candle selection bar — a prompt and a row of four candles docked at the bottom of the container.
Orbital Rings
The sigil uses two concentricmotion.div rings that rotate continuously in opposite directions:
- Outer ring — contains an SVG hexagram built from two overlapping
<polygon>elements, plus two<circle>rings (one solid atr=35, one dashed atr=45). It rotates0 → 360°over 40 seconds on a linear infinite loop. - Inner ring — a plain border circle inset by 1rem (
inset-4). It counter-rotates0 → -360°over 30 seconds.
Hero Text Block
Centered inside the sigil (z-10 text-center) are two text elements:
| Element | Content | Font | Class |
|---|---|---|---|
<h1> | Aria Nightshade | Cormorant Unicase (font-heading) | text-5xl md:text-7xl text-witch-moonlight mb-2 text-glow-teal |
<p> | Master of the Digital Arts | JetBrains Mono (font-code) | text-witch-turquoise/70 text-sm tracking-widest uppercase |
The hero name is split across two lines by an explicit
<br /> between “Aria” and “Nightshade” in the JSX. On mobile (text-5xl) it fits cleanly; on medium screens and above it scales to text-7xl.Candle Selection Menu
Below the sigil, under the italic prompt"Choose your incantation...", sits a horizontal bar of four candles. The bar is bounded by a bottom border (border-b border-witch-moonlight/10) and a fixed height of 160px (h-40), so taller candles visually reach higher.
The data array powering the menu is defined inline inside SanctumPage:
- Label — a
motion.divabsolutely positioned 8px above the candle (-top-8), initially aty: 10(slightly below its resting spot). When the item is hovered, it animates toy: 0and becomes fully opaque viagroup-hover:opacity-100. Font isfont-heading text-witch-amber text-glow-amber. <Candle>component — receivesheight,delayIndex, andisLitprops. A candle is lit when the user hovers it or when no candle is currently hovered (all candles start lit, a single hover dims the others implicitly through theisLit={s === r.path || s === null}logic).- Click handler — calls
useNavigate()(r.path)to perform a client-side route transition.
Candle Behavior at a Glance
Hover
The label appears above the candle with a teal glow. The candle scales up 5% (
group-hover:scale-105). All other candles go dim (unlit) — only the hovered candle stays lit and its label is shown.Click
Calls
navigate(path) via React Router’s useNavigate. The AnimatePresence wrapper in the root router produces a crossfade between pages.Status Line
At the very bottom of the page, beneath the candle bar, a single line of monospaced text reads:font-code text-xs text-witch-plum/60 and sits in an mt-8 paragraph.
Customization
Change the hero name and subtitle
Open
src/pages/SanctumPage.jsx (or the equivalent component in your project). Find the <h1> tag inside the z-10 text-center div and update the text between the <br /> split. Change the <p> below it to update the subtitle.Add or remove a candle menu item
Locate the Choose a
candleMenuItems array inside SanctumPage. Append a new object or delete an existing one. The candle bar uses flex justify-center items-end gap-8 md:gap-16, so new items space themselves automatically.height between 40 and 140 to keep candles within the 160px bar. The delay value controls the flicker animation offset (supplied as delayIndex to <Candle>).