Space Mission is a single-page application (SPA) built with React 18 and bundled by Vite. The entire portfolio lives inside one HTML entry point (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/space-mission/llms.txt
Use this file to discover all available pages before exploring further.
index.html). React Router v6 handles all navigation client-side, Framer Motion drives every animated element, and Tailwind CSS supplies the utility-first styling layer — all without a backend, a database, or an API call in sight.
Component Tree
The application mounts from a single<div id="root"> and branches through a small, intentional hierarchy:
<PageTransition>, which applies a consistent Framer Motion initial → animate → exit lifecycle to the whole page surface.
Key Architectural Decisions
Hash-Based Routing for GitHub Pages
Space Mission is deployed as a static site on GitHub Pages, which cannot handle server-side URL rewrites. React Router v6 is configured to use hash-based history (/#/about, /#/projects, etc.). When the browser navigates, the hash fragment changes without sending a request to the server, keeping the SPA intact on a CDN-style host.
Additionally, each route has a dedicated static HTML shell in pages/ (e.g., pages/About.html) that sets window.__STATIC_PAGE_ROUTE__ and forces the hash to the correct route. This means a user who bookmarks pages/About.html directly still lands on the right page.
Framer Motion for All Animations
Rather than mixing CSS transitions, keyframe animations, and a JS animation library, Space Mission commits entirely to Framer Motion. This single-library approach enables:- Page transitions via
AnimatePresence+motion.divwithinitial,animate, andexitprops. - Scroll-driven parallax on the About page using
useScroll+useTransformto mapscrollYProgressto position, opacity, and scale values. - Spring physics for the navigation active indicator (
layoutId="nav-active") and the project detail panel slide-in. - Entrance animations using
whileInView+viewport={{ once: true }}so elements animate in once as they scroll into the viewport.
Tailwind CSS Utility-First Styling
All styling is applied through Tailwind CSS utility classes directly on JSX elements — no component-level CSS modules, no styled-components. Custom design tokens (bg-space-navy, text-space-turquoise, text-space-white) are defined in the Tailwind config. A custom .hud-border utility class applies the HUD-style border treatment used on cards and panels throughout the UI.
All Data as Inline JavaScript Arrays
Space Mission has no backend and no external data fetching. Every piece of content — projects, work history, skills, blog posts, case studies, and testimonials — is defined as a plain JavaScript array inassets/main.js. Components read from these arrays at render time. To update content, you edit the source arrays and rebuild.
Build Output
Vite compiles the project into adist/-style structure that is also the repo root for GitHub Pages:
.nojekyll file at the repo root tells GitHub Pages to skip Jekyll processing and serve the files as-is.
Data Flow
Because there is no backend, data flow is entirely one-directional and synchronous:useEffect data fetches, no loading spinners waiting on network responses, no global state management library. The only stateful concerns are UI state (e.g., which project detail panel is open, current scroll progress) handled locally with useState and useRef inside individual page components.