Y2K Webring is a single-page React 18 application built with Vite. Rather than relying on server-side rendering or a backend, it ships a set of pre-rendered static HTML files — one per route — each of which boots the same React bundle and immediately hydrates the correct page. Navigation is powered by hash-based routing (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/y2k-webring/llms.txt
Use this file to discover all available pages before exploring further.
window.location.hash), which means the entire site can be deployed to any static file host (GitHub Pages, Netlify, S3) with zero server configuration.
Application Shell
Every page is wrapped by theAppLayout component (components/layout/AppLayout.js). It renders a responsive three-column flex container that holds all persistent UI:
| Column | Component | Width | Visibility |
|---|---|---|---|
| Left | LeftNav | lg:w-64 | Always rendered |
| Center | <main> (flex-1) | Fills remaining space | Always rendered |
| Right | RightWebring | lg:w-48 | Home route only |
AppLayout checks useLocation().pathname === "/" to decide whether to render RightWebring and the SparkleTrail cursor effect. The center <main> always wraps children in PageTransitionBar, which handles the Framer Motion entry animation on every route change.
Build Pipeline
Vite bundles the project into two primary output artefacts:/assets/main.js— the complete JavaScript bundle (React, React Router, Framer Motion, all page components, and all data)./assets/main.css— the compiled Tailwind stylesheet, including custom Y2K utility classes (border-chunky-magenta,bg-y2k-violet, etc.) and the@keyframes marching-antsanimation.
<link rel="modulepreload"> so the browser can fetch them in parallel before executing the bundle:
Static Hosting
Because the router useswindow.location.hash, the server never needs to know which “page” the visitor is on — the hash fragment is purely client-side. A request for /pages/About.html always returns the same file regardless of what follows the #.
Each HTML file includes an inline <script> that runs before the React bundle loads. It inspects the URL and, if no hash is present, rewrites it to the correct hash route. This ensures direct links (e.g. shared links without a #) still land on the right page. See Routing → Hash Redirect Script for the full script.
Because routing is entirely hash-based, there are no server-side rewrite rules needed. The site deploys as a folder of static files and works out of the box on GitHub Pages, Netlify, Cloudflare Pages, or any CDN.
Key Dependencies
| Package | Version | Role |
|---|---|---|
react | 18.3.1 | UI component model and rendering |
react-dom | 18.3.1 | DOM renderer |
react-router-dom | 6.30.4 | Hash-based client-side routing |
framer-motion | — | Page transition animations and sparkle effects |
tailwindcss | — | Utility-first CSS, extended with Y2K custom tokens |
lucide-react | 0.522.0 | Icon set used in LeftNav and RightWebring |
vite | — | Build tool, dev server, and module pre-loading |
Further Reading
Routing
Hash-based URL strategy, the seven route definitions, and the page transition bar.
Data Layer
How all portfolio content lives in a single
portfolioData.js source-of-truth file.