The Projects page simulates a miniature Windows 98 desktop environment directly inside the browser. Three portfolio project windows are rendered on a teal canvas and can be freely repositioned by dragging their title bars. Clicking any window brings it to the front, replicating the window focus management of a real desktop OS. This page is one of the most interactive in the site — it turns a standard portfolio grid into a playful desktop metaphor.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/digital-domain/llms.txt
Use this file to discover all available pages before exploring further.
Desktop Canvas
The entire page is enclosed in a singlediv that acts as the desktop surface:
Visual appearance: The canvas is 80% of the viewport height, bounded by a thick Win98 inset border (
border-4 border-win-gray shadow-win-in). The background is a very light teal wash (bg-retro-teal/20). A semi-transparent “Drag the windows around!” hint text is rendered in font-vt323 text-2xl text-black/50 at the top-left corner; it has pointer-events-none so it never interferes with window interaction. Overflow is clipped (overflow-hidden) so dragged windows cannot escape the canvas bounds.Hardcoded Project Data
Three project objects are defined in a top-level constant array (be in the compiled source):
pos object sets its initial defaultPosition on the canvas, staggering the windows so they are visually separated on first render.
Window Focus Management
A singleuseState hook tracks which project window currently has focus:
Window component receives:
zIndex={focusedId === project.id ? 50 : 10}— the focused window sits on toponFocus={() => setFocusedId(project.id)}— clicking or interacting with a window calls this, updating focus
When no window has been clicked yet,
focusedId is null and all windows render at zIndex: 10. The first window a user clicks jumps to zIndex: 50, pushing the others behind it. There is no close button on these project windows — they are permanently visible.Project Window Content
Inside each window, the content area usesp-4 font-comic flex flex-col gap-4:
Project Name
font-comic font-bold text-xl text-retro-purple.
Description
text-sm leading-relaxed.
Tech Stack Badges
Each technology in thestack array is rendered as a small badge:
Visual appearance: Compact yellow badges (
bg-retro-yellow) with a 1px black border and a 1px offset solid drop shadow — a hand-stamped sticker aesthetic. Badges sit in a flex flex-wrap gap-2 row so they reflow on narrow windows.Action Buttons
A dashed divider (border-t-2 border-dashed border-gray-300) separates the badge row from two action buttons rendered in a flex gap-2 row:
flex-1). The View Live button uses the Lucide ExternalLink icon; Source uses the Github icon. The buttons are currently decorative — no href values are wired up in the source.
Project Window Summary
| Window Title | Project Name | Stack | Initial Position |
|---|---|---|---|
E-Commerce_2025.exe | NextGen Storefront | React, TypeScript, Tailwind, Stripe | { x: 20, y: 20 } |
AI_Chat_Bot.sys | SassyBot AI | Node.js, OpenAI, WebSockets | { x: 100, y: 150 } |
Legacy_System_Migrator.bat | The Data Mover | Python, AWS, PostgreSQL | { x: 300, y: 80 } |
Component Dependencies
| Component | Source | Usage |
|---|---|---|
Window (p) | components/Window.js | Draggable project frames |
BeveledButton (d) | components/BeveledButton.js | View Live and Source buttons |
folder-git-2 (Lucide) | lucide-react | Window title bar icon |
external-link (Lucide) | lucide-react | View Live button icon |
github (Lucide) | lucide-react | Source button icon |
useState | React 18 | Window focus state |