Full Moon’s visual experience depends on multiple independent layers rendering simultaneously — a fog overlay, an animated starfield, a floating navigation bar, and a custom cursor that always stays on top. TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/full-moon/llms.txt
Use this file to discover all available pages before exploring further.
Layout component is the single place where all of these layers are assembled, stacked in a deliberate z-index order, and wrapped in the page-transition animation that plays on every route change.
Layout Component Source
TheLayout component is a thin composition layer. It renders two fixed background layers, the cursor, the navigation, and then a Framer Motion <main> element that fades in and out with each route.
<Outlet /> is the React Router slot where the active page component renders. Because Layout owns the <motion.main> wrapper, every page benefits from the fade transition automatically — individual page components do not need to declare their own entry/exit animations.
Layer Stack
Each visual layer occupies a specific z-index tier so that background effects never overlap interactive content, and the custom cursor always floats above everything else.| Layer | z-index | Class / Component | Description |
|---|---|---|---|
| Background fog | 0 | bg-fog | Fixed full-screen CSS fog overlay, always behind all content |
| Starfield | 0 | starfield | Fixed full-screen animated star field, rendered at the same depth as the fog |
| Navigation | fixed, above content | <Navigation> | Site nav uses its own fixed positioning and stacks above the page content |
| Page content | 10 | <motion.main> | Animated main content area; all page components render inside this element |
| Cursor | 100 | <Cursor> | Custom cursor glow element, always rendered above every other layer |
Both the
bg-fog overlay and the starfield layer carry pointer-events-none. This is essential — without it, those fixed div elements would sit on top of the page and silently swallow every click, tap, and hover event before they could reach any interactive element.Page Transition
The<motion.main> element is powered by Framer Motion and acts as a shared transition wrapper for all pages. It transitions opacity from 0 to 1 on mount and back to 0 on unmount, with a duration of 0.5 seconds:
<motion.main> element is declared directly in Layout (outside any individual page component), the fade plays consistently on every navigation event without any per-page configuration.
For exit animations to fire correctly, the page must be wrapped in Framer Motion’s <AnimatePresence> at the router level. Ensure <AnimatePresence mode="wait"> wraps the <Routes> component so the outgoing page fully fades out before the incoming page fades in.
Root Classes
The outermostdiv in Layout carries four Tailwind utility classes that establish the global visual baseline for the entire application:
| Class | Effect |
|---|---|
min-h-screen | Ensures the root container is always at least the full viewport height, preventing a collapsed layout on short pages |
bg-midnight-base | Applies the #0a0e1a deep navy background as the canvas behind every layer |
text-witch-teal-glow | Sets the inherited default text color to #2dd4bf teal across the entire app |
relative | Establishes a positioning context so that child elements using absolute or fixed positioning are anchored correctly |
overflow-hidden | Clips any atmospheric effects or animations that extend beyond the viewport boundary, keeping the layout clean |