Systems Witch uses React Router’sDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/systems-witch/llms.txt
Use this file to discover all available pages before exploring further.
HashRouter rather than the more common BrowserRouter. This is a deliberate choice for static hosting compatibility: hash-based URLs (/#/about, /#/projects) are resolved entirely in the browser. The server only ever receives a request for the HTML file itself; the fragment after # is never sent to the server, so no rewrite rules, _redirects files, or server configuration are needed. The app works identically on GitHub Pages, Netlify static, any CDN, or a plain nginx file server.
Static Page Route Injection
Each HTML shell sets awindow.__STATIC_PAGE_ROUTE__ variable and includes a small redirect script that ensures the URL fragment is correct when a page is loaded directly (e.g. someone bookmarks pages/About.html or arrives via a shared link).
For example, pages/About.html contains:
#), the script immediately replaces the URL with the correct #/about fragment before React mounts. This means every static HTML shell is a valid direct-access entry point for its route.
Route Table
| Path | HTML Shell | Page Component | Description |
|---|---|---|---|
#/ | index.html | HomeView | Boot animation + hero sigil |
#/about | pages/About.html | AboutView | Bio, env vars, profile |
#/projects | pages/Projects.html | ProjectsView | Filterable project grid |
#/skills | pages/Skills.html | SkillsView | Animated skill cards |
#/articles | pages/Articles.html | ArticlesView | ls-style article listing |
#/contact | pages/Contact.html | ContactView | Sigil contact form |
#/testimonials | pages/Testimonials.html | TestimonialsView | Transmission-style testimonials |
AnimatePresence and Route Transitions
Route changes are gated byAnimatePresence mode="wait" wrapping the <Routes> component. The key prop on <Routes> is set to location.pathname, which tells AnimatePresence that a new child has mounted whenever the route changes. With mode="wait", the outgoing page’s exit animation must complete before the incoming page begins its entrance animation — preventing two pages from animating simultaneously.
Each page component wraps its content in <PageTransition>, which supplies the Framer Motion initial, animate, and exit variants (a CRT-style scaleY + opacity + filter brightness sequence). See the PageTransition component reference for the full animation spec.
Route Definitions
The full route tree as defined in the application entry point:<Layout /> component renders ScanlineOverlay, FilesystemNav, the <main> content area (which contains the <Outlet /> for child routes), and TerminalFooter. All seven page routes are children of this single layout route so that the shell remains mounted and only the content slot re-renders on navigation.
Adding a New Route
To add an eighth route to the site, follow these four steps:-
Create the page component. Build a new component (e.g.
ServicesView) that uses<PageTransition>as its outermost wrapper and follows the samespace-y-12structure with a<header>containing<SectionSigil />and<GlitchHeading />. -
Register the route. Add a
<Route>entry inside the layout route in the app entry point: -
Create an HTML shell. Add
pages/Services.htmlby copying any existing page shell and updating the<title>tag and thewindow.__STATIC_PAGE_ROUTE__value: -
Add the link to the sidebar. Append an entry to the
$proute array inFilesystemNav: