Every page in the portfolio follows the same four-layer pattern: a React component wrapped in aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/windows-98/llms.txt
Use this file to discover all available pages before exploring further.
Win98Window, a route entry in the HashRouter, a desktop icon entry in the Taskbar, and a static HTML shell file for direct-URL support on GitHub Pages. Adding a new section means wiring up all four layers in order.
The project ships with compiled, minified bundles in
assets/main.js and assets/main.css. Those files are production build artifacts — editing them directly is not viable. You need the original source files (the JSX components, router config, Taskbar.js, etc.) to make structural changes. After editing source, run npm run build to regenerate the bundles.Create the page component
Create a new React component file in your pages directory. The component must import The
Win98Window and useNavigate, then return the window wrapper with your content inside.src/pages/MyPage.jsx
onClose prop receives the function the window’s ✕ button calls — always navigate back to / so the user returns to the desktop when they close the window. The title string appears in the Win98 title bar. The optional icon prop accepts a React node rendered beside the title.Register the route
Open the main router configuration file (wherever your Because the project uses a
HashRouter and Routes block live) and add a <Route> entry alongside the existing routes.src/main.jsx (router section)
HashRouter, all navigation happens via the URL hash (e.g. /#/my-page), which means no server-side routing configuration is needed for development. The hash segment never reaches the web server.Add a desktop icon
Open Pick an icon color from the retro token set that fits the section’s personality —
Taskbar.js (or the file that defines the desktop icons array) and append a new entry to the array. Each entry is a plain object with a name string displayed below the icon, a path matching the route you just registered, and an icon React node.src/components/Taskbar.js (desktop icons array)
text-retro-magenta for personal content, text-retro-turquoise for work/projects, text-retro-teal for writing, text-retro-navy for anything formal.Add a Start menu entry
The Start menu flyout is also driven by an array in Start menu icons should use
Taskbar.js. Each item is a plain object with name, path, and icon fields. A divider between groups is represented by a single { divider: true } entry. Add a matching item for the new page:src/components/Taskbar.js (Start menu items array)
size={16} and text-retro-navy to match the uniform navy-on-silver style of the existing menu items. Divider items must contain only { divider: true } — no other fields.Create the static HTML shell
GitHub Pages serves static files, so every route needs an HTML entry point that bootstraps the React app and signals which route to activate. Copy the existing The
pages/About.html file to a new file named pages/MyPage.html and update the route value.pages/MyPage.html
window.__STATIC_PAGE_ROUTE__ assignment is read by the router bootstrap code before React mounts. The if block ensures that users who land directly on yoursite.com/pages/MyPage.html (via a shared link or bookmark) are redirected to the correct hash route instead of seeing the bare desktop. Only update the route string — keep the surrounding modulepreload links identical to About.html.Rebuild
With all four layers in place, compile the updated source into production bundles:The Vite build outputs fresh
assets/main.js and assets/main.css files. If you are working locally with the dev server (npm run dev), Vite’s hot module replacement will pick up component and route changes without a manual rebuild — but you still need a production build before deploying to GitHub Pages.Editing existing content
Beyond adding new pages, several common content areas are driven by plain JavaScript arrays in the source. Finding and editing these arrays is the fastest way to update the portfolio’s text content.Blog posts
The blog page renders from a posts data array in the source. Each entry is a plain object withdate, title, and content fields:
Blog posts array
Guestbook seed data
The guestbook initializes with default entries from a seed array. These are the messages that appear before any real visitor submissions are stored inlocalStorage.
Guestbook seed array
name, date, and message fields to replace the placeholder seed messages with your own. Use dates in MM/DD/YYYY format to match the retro aesthetic.
Work history cards
The Work page renders from a work history data array in the source. Each object represents one job card with fields for company name, role, years, and a description string. Locate the array near theWork component definition and update the values:
Work history array
Win98Window Component
Deep-dive into the Win98Window props, title bar behavior, and drag constraints.
Theming
Swap color tokens, fonts, and CRT effects to personalize the portfolio’s visual style.