The Skills page is the most fully realised desktop simulation in Digital Domain. It renders a tealDocumentation 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.
#008080 Windows 98 desktop complete with clickable file icons, openable skill windows, a bottom taskbar with a Start button, animated task buttons for each open window, and a static system clock. The entire interaction model — double-click to open, click title bar X to close, click taskbar button to focus — faithfully mirrors the Win98 user experience.
Desktop Container
The outermost container sets up the desktop canvas:Visual appearance: The classic Windows 98 teal desktop (
#008080) fills 80vh. The outer border uses border-4 border-win-gray shadow-win-in to give the sunken inset appearance. Icons are arranged top-to-bottom on the left side via flex flex-col gap-6 items-start. The taskbar is pinned to the bottom by the flexbox column layout.Skill Icons
Four desktop icons are defined in a top-level constant array (y in the compiled source):
div with onDoubleClick to open its associated window:
Visual appearance: Icons are 48×48px (
w-12 h-12) white Lucide SVGs with a drop-shadow-md for depth. Labels are white font-comic text-sm text centred below. On hover, the icon background becomes a translucent blue (group-hover:bg-blue-500/30) and the label gets a solid blue highlight (group-hover:bg-blue-600) — exactly matching the Win98 selected icon style.A single click does nothing. Icons must be double-clicked to open their associated skill window, replicating authentic Windows desktop behaviour.
Window Open/Close State
TwouseState hooks manage the desktop state:
openWindow function adds the ID if it is not already in the array:
closeWindow function removes the ID from the array and clears focus if the closed window was focused:
Window component receives onClose={() => closeWindow(skill.id)} and onFocus={() => setFocusedId(skill.id)} props, along with staggered defaultPosition values:
Visual appearance: Each skill window’s content area is a simple
p-4 font-comic text-lg paragraph listing the technologies. Windows are 300×200px. The stagger formula { x: 100 + i*30, y: 50 + i*30 } cascades windows diagonally so they do not perfectly overlap on first open.Taskbar
The taskbar is pinned to the bottom of the flex-column desktop container:Start Button
win98icons.alexmeub.com icon set. The button uses shadow-win-btn at rest and shadow-win-btn-active on :active for the pressed-in bevel effect. The Start button is decorative — it does not open a Start menu.
Task Buttons (AnimatePresence)
Open windows appear in the taskbar viaAnimatePresence, which animates their entrance and exit:
Visual appearance: Task buttons animate in by expanding from zero width (
width: 0) to their natural width (width: "auto") while fading in from opacity: 0. On exit (window closed), they collapse back to zero width and fade out. The focused window’s task button uses the sunken bevel (shadow-win-btn-active bg-gray-300); unfocused buttons use the raised bevel (shadow-win-btn bg-win-gray).System Clock
The tray clock at the right of the taskbar renders the current local time, refreshed on page render:The clock reads the time once on render using
new Date(). It does not update live — there is no setInterval or useState driving it. It will show the time at which the component was last rendered.Component Dependencies
| Component | Source | Usage |
|---|---|---|
Window (p) | components/Window.js | Skill detail windows |
AnimatePresence (E) | framer-motion | Taskbar button entrance/exit animation |
motion.button | framer-motion | Animated taskbar task buttons |
LayoutTemplate (Lucide) | lucide-react | Frontend.exe icon |
Terminal (Lucide) | lucide-react | Backend.bat icon |
Database (Lucide) | lucide-react | Databases.db icon |
CodeXml (Lucide) | lucide-react | Languages.txt icon |
useState | React 18 | Open windows array + focused ID |