Skip to main content

Documentation 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.

Windows 98 Portfolio is a single-page application built with React and bundled by Vite. The entire app is compiled into two static assets — assets/main.js and assets/main.css — which are loaded by a root index.html. From there, React takes over the browser entirely: routing, rendering, animations, and even the mouse cursor are all managed client-side with no server involvement beyond serving the initial HTML shell.

How the app mounts

The entry point index.html contains a single <div id="root"></div>. Vite’s compiled main.js module is loaded as type="module", which bootstraps React and calls ReactDOM.createRoot(document.getElementById('root')).render(...). The top-level App component wraps everything inside a HashRouter from React Router, making all navigation hash-based (/#/about, /#/projects, etc.) and fully client-side.

Visual layer stack

The desktop experience is built from several independently positioned layers stacked using z-index. From bottom to top:
LayerImplementationz-index
1. Teal desktop backgroundbody { background-color: #0d9488 } — the classic Windows 98 teal, set globally
2. Desktop icon gridAbsolutely positioned flex column container inside the app shellz-10 / z-20
3. Win98Window (normal)Absolutely positioned draggable windows rendered inside routesz-40
4. Win98Window (maximized)Same component, animate to full viewport when maximized toggle is activez-50
5. TaskbarFixed to bottom-0, full widthz-[9000]
6. CRT scanline overlay.crt-overlay — fixed, covers 100vw × 100vh, pointer-events: none9998 (plain CSS)
7. CRT vignette.crt-vignette — fixed, covers 100vw × 100vh, pointer-events: none9999 (plain CSS)
8. Custom cursorFixed at top-0 left-0, follows mousemove eventsz-[10000]
The CRT layers sit above the application content but below the cursor, giving every page the same scanline and vignette effect without any per-component work. The cursor layer sits above everything so the pixel cursor is always visible.

File and folder structure

The repository ships compiled build outputs rather than raw TypeScript or JSX source. The components/ and assets/ directories you see are Vite’s output, not editable source files.
File / DirectoryPurpose
index.htmlApp root entry point — loads main.js and main.css, contains <div id="root">
assets/main.jsVite-compiled React bundle — all components, routes, and state in one module
assets/main.cssTailwind utility output plus custom CSS (win98-out, win98-in, win98-btn, CRT effects, font definitions)
components/Win98Window.jsDraggable, resizable window component powered by Framer Motion
components/DesktopIcon.jsDesktop icon with entrance animation and click-to-navigate behaviour
components/CustomCursor.jsPixel SVG cursor that replaces the system cursor, with click sparkle animations
components/Taskbar.jsFixed bottom bar with Start menu and open-window list
components/VisitorCounter.jsRetro hit-counter display rendered inside the Taskbar
pages/*.htmlStatic HTML shells for each route — each injects window.__STATIC_PAGE_ROUTE__ for deep-link support on GitHub Pages
.nojekyllPrevents GitHub Pages from processing the repo with Jekyll, ensuring all files are served as-is
Because the repository ships compiled bundles, editing assets/main.js or the files under components/ directly is not the intended workflow. See the Customization section for guidance on making changes through the build pipeline.

Explore further

Routing

How HashRouter and the __STATIC_PAGE_ROUTE__ pattern make every URL work on GitHub Pages.

Styling

The Tailwind retro palette, win98 border classes, CRT effects, and pixel typography.

Win98Window

The draggable window component that frames every page of content.

Build docs developers (and LLMs) love