Y2K Webring uses hash-based routing so the entire site can be served from any static file host without server configuration. Every URL takes the formDocumentation 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.
/pages/About.html#/about — the part after # is interpreted by React Router in the browser, while the server only ever sees the path before it. This means no .htaccess rules, no Nginx try_files, and no Netlify _redirects file is required.
Route Table
The seven application routes are defined in thePd nav array inside components/layout/LeftNav.js. Each entry specifies the hash path, the display label rendered in the sidebar, and the lucide-react icon used beside it.
| Path | Label | Icon |
|---|---|---|
/ | Home.exe | sparkles |
/about | About_Me | user |
/projects | Open_Projects | folder-open |
/skills | Charms_&_Abilities | zap |
/writing | Archive.log | book-open |
/case-studies | Case_Files | file-text |
/contact | Sign_Guestbook | message-square |
Pd array drives both the navigation sidebar rendering and, via React Router v6, the actual route matching. Changing a path in this array changes both the sidebar link and the URL the route responds to.
Hash Redirect Script
Each pre-rendered HTML file contains an inline<script> block that executes before the React bundle loads. Its job is to detect when a visitor arrives at a URL that has no hash fragment and immediately redirect them to the hash-prefixed equivalent.
pages/About.html the script contains a hardcoded "#/about" target, so a visitor who navigates directly to /pages/About.html is immediately redirected to /pages/About.html#/about before React mounts. Each HTML file also sets a window.__STATIC_PAGE_ROUTE__ variable (e.g. "/about") as a metadata hint for the app, while the actual redirect target is baked in as a literal string in each file’s inline script.
window.location.replace() is used instead of window.location.href = so the redirect does not add an extra entry to the browser’s history stack. The visitor’s Back button still takes them where they expect.Page Transition Bar
PageTransitionBar (components/layout/PageTransitionBar.js) is the Framer Motion wrapper that AppLayout places around all page children. It provides two visual effects on every route change:
- Progress bar — A 1px-tall magenta bar (
bg-y2k-magenta) fixed to the top of the viewport scales fromscaleX: 0toscaleX: 1over 300 ms, then fades out. - Page fade-in — The incoming page content animates from
opacity: 0, y: 10toopacity: 1, y: 0with a 100 ms delay, giving a subtle “load” feel.
useLocation().pathname — when the pathname changes, a useState flag triggers the bar, and the Framer Motion key prop on the page wrapper forces a re-mount with fresh animation state.
Adding a New Route
Add an entry to the nav array in LeftNav.js
Open
components/layout/LeftNav.js and find the Pd array. Append a new object with your chosen path, display label, and a lucide-react icon component:Create the page component
In the source project, add a new file for your page’s React component (e.g.
Credits.jsx). Export only the page body — AppLayout is applied by the router, not by individual page components.Register the route in the React Router config
In your source project’s router configuration (wherever
<HashRouter> and the <Routes> tree are defined), add a <Route> entry that maps your new path to your new page component: