The Control Panel window transforms your skill set into a retro software-installation experience. Each skill is represented as a progress bar that fills up automatically when the window opens — mimicking the look of a Windows 98 setup wizard copying files. The bars animate staggered one after another, making the whole panel feel alive.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/log-portfolio/llms.txt
Use this file to discover all available pages before exploring further.
Visual Design
The window header mimics a Control Panel applet: a largeSettings gear icon (48 px, text-gray-600) sits beside a bold Control Panel - Skills heading and a subtitle — Installing developer dependencies... — in small gray text. Below the header, each skill occupies its own card-like row separated by gap-6 vertical spacing.
Each skill row contains:
- Icon + name — the skill’s Lucide icon followed by a bold skill name
- Status label — right-aligned; shows
Installing...while the bar is animating, switches toInstalledonce the counter reaches the target level - Progress bar — a
win-border-inset bg-gray-200outer track with abg-gradient-to-r from-blue-800 to-blue-500inner fill; blue segmented squares (bg-blue-900 opacity-50,w-2) are rendered as children of the fill div to create the classic chunky Windows progress-bar look
Default Skills
Theu array in components/Desktop.js defines four skills out of the box:
| # | Skill | Icon | Icon Color | Target Level |
|---|---|---|---|---|
| 1 | React.js | Globe | text-blue-500 | 90% |
| 2 | TypeScript | Cpu | text-blue-700 | 85% |
| 3 | Node.js | Database | text-green-600 | 80% |
| 4 | CSS/Tailwind | Monitor | text-cyan-500 | 95% |
Animation Logic
The staggered fill animation is driven by auseEffect that runs once on mount:
- Each bar’s
setTimeoutdelay isindex * 500ms— so bar 1 starts immediately, bar 2 after 0.5 s, bar 3 after 1 s, bar 4 after 1.5 s. - Inside each timeout, a
setIntervalfires every 50 ms and increments the counter by 5 until the targetlevelis reached, at which pointclearIntervalstops it. - The bar width is bound to
style={{ width: \$%` }}with atransition-all duration-75` class for a smooth per-tick glide. - The number of segmented squares inside the fill is
Math.floor(progress / 5)— one square per 5% of progress.
Progress Bar Structure
Customizing Skills
Find the skills array
Open
components/Desktop.js and locate the u array defined just above the Z component (the Control Panel component). It is a plain JavaScript array of objects.Edit entries
Each skill entry has three fields:Change
name, swap the icon for any Lucide component that’s already imported, and adjust level to reflect your actual proficiency.Skill
level values should be multiples of 5 (e.g. 85, 90, 95) to ensure the segmented-squares count stays whole. Non-multiples of 5 will cause the final tick to land on a non-square-aligned value, which is harmless but looks slightly off.