TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/digital-coven/llms.txt
Use this file to discover all available pages before exploring further.
AppShell component, defined in assets/main.js, is the invisible backbone of every page on Digital Coven. It mounts once for the lifetime of the app and is responsible for four persistent concerns: rendering the CustomCursor and BackgroundAtmosphere overlays, displaying the fixed site header with logo and navigation, and wrapping the active route’s content in an AnimatePresence-powered motion.main so that every page transition is a smooth, blurred fade. Because AppShell sits directly inside the React Router context, it has access to useLocation and can mark the currently active nav link in real time.
Component Tree
When the app boots,AppShell renders the following structure in order:
CustomCursor and BackgroundAtmosphere are rendered before the header and main content in the DOM so they sit below all interactive elements in the stacking context. CustomCursor is promoted to z-[9999] and BackgroundAtmosphere is pushed to z-[-1] — their own positioning handles the layering, not their DOM order.Header
The header isposition: fixed at the top of the viewport (top-0 left-0 right-0), elevated to z-50, and uses mix-blend-difference to create an automatic contrast inversion effect against any background content that scrolls beneath it. This means the DC logo and nav links always remain legible regardless of the atmospheric colors moving behind them — they appear to “cut through” the background with inverted colours rather than relying on a solid backdrop.
Navigation Links
The nav array is defined as a constant directly aboveAppShell in main.js:
label intentionally includes a leading / to reinforce the terminal/path aesthetic of the site. The active link is detected with a location.pathname === link.path comparison supplied by React Router’s useLocation hook, and styled with text-electric-purple drop-shadow-[0_0_5px_var(--electric-purple)].
Page Transitions
AnimatePresence wraps a single motion.main whose key is set to location.pathname. When the route changes, Framer Motion detects the key change and plays the exit animation on the outgoing page before mounting the incoming one. The mode="wait" prop ensures the exit completes fully before the enter begins, preventing overlap between pages.
y: 20 → 0) while the exit moves upward and out (y: 0 → -20), giving a continuous vertical scroll feel. Both directions pass through a blur(10px) → blur(0px) transition that keeps the occult soft-focus aesthetic consistent.
| Prop | Enter | Exit |
|---|---|---|
opacity | 0 → 1 | 1 → 0 |
filter | blur(10px) → blur(0px) | blur(0px) → blur(10px) |
y | 20 → 0 | 0 → -20 |
duration | 0.5s | 0.5s |
Adding a New Route
function ServicesPage() {
return (
<div className="max-w-4xl mx-auto py-12">
<h1 className="font-display text-5xl text-neon-lime mb-4">Services</h1>
</div>
);
}
The
motion.main wrapper and its transition config live in AppShell. All child route components receive the transition for free; individual pages do not need to implement their own enter/exit animations unless they want per-element choreography on top of the shell transition.