Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/apursley2012/dev-os/llms.txt

Use this file to discover all available pages before exploring further.

The Projects app turns a portfolio into a Windows Explorer window. Every project becomes a file entry with a name, a modified date, a size, and a colour-coded file-type icon — giving visitors an at-a-glance overview of the breadth and recency of your work while keeping the interaction model completely familiar.

Layout

The window is divided into three distinct zones stacked vertically:
  1. Address bar — a slim bg-gray-100 strip containing a read-only path input styled to show C:\Users\Dev\Projects.
  2. Two-pane body — a flex row with a narrow left sidebar and a full-height file list on the right.
  3. Status bar — a footer line displaying item count and current selection state.

Address Bar

<div className="flex items-center gap-1 px-2 py-1 bg-white border border-gray-300 rounded shadow-sm w-full max-w-md">
  <FolderIcon size={14} className="text-os-teal" />
  <span className="text-gray-500">C:\Users\Dev\Projects</span>
</div>
The sidebar (w-48 bg-gray-50) renders a folder tree with three child nodes under a collapsible Projects root:
FolderIcon colourState
Recenttext-blue-400Active (highlighted)
Favoritestext-yellow-400Inactive
Archivedtext-gray-400Inactive

File List

The main panel uses a three-column CSS grid (grid-cols-[2fr_1fr_1fr]) for both the header row and each file row:
ColumnContent
NameFile-type icon + {name}.{type}
Date modifiedISO date string
SizeHuman-readable file size

Project Data Structure

Projects are defined as a static array at the top of components/apps/ProjectsApp.js:
const projects = [
  { id: 1, name: 'E-commerce Redesign', type: 'web', size: '12MB', date: '2023-10-12', icon: FileCode2Icon },
  { id: 2, name: 'React UI Library',    type: 'lib', size: '4MB',  date: '2023-08-05', icon: FileJsonIcon },
  { id: 3, name: 'WebGL Particle Sim',  type: 'exp', size: '28MB', date: '2024-01-20', icon: FileTerminalIcon },
  { id: 4, name: 'Legacy Dashboard',    type: 'web', size: '8MB',  date: '2022-11-30', icon: FileCode2Icon },
];

Icon Colour by Type

The type field drives the icon tint via a ternary class:
type valueTailwind classColour
webtext-blue-500Blue
libtext-yellow-500Yellow
exptext-purple-500Purple

Interaction

Selection and opening are handled by two separate event listeners on each row:
<div
  onClick={() => setSelected(project.id)}
  onDoubleClick={() => alert(`Opening details for ${project.name}...`)}
  className={`... ${selected === project.id ? 'bg-os-teal/20 border border-os-teal/30' : 'hover:bg-gray-100'}`}
>
  • Single click — sets selected state; the row receives a teal-tinted highlight.
  • Double click — triggers an alert placeholder. Replace this with a modal component or router.push() call to navigate to the live project.
The status bar updates reactively:
{projects.length} items | {selected ? '1 item selected' : ''}

Customising

Replace the projects array entries in components/apps/ProjectsApp.js with your own work. Use the icon guide below to pick the right icon import for each project type:
Icon importUse for
FileCode2Web apps, front-end projects
FileJsonLibraries, config-heavy repos
FileTerminalScripts, experiments, CLIs
Replace the onDoubleClick alert with a real action — for example, opening a detail modal or navigating to the live URL:
onDoubleClick={() => window.open(project.url, '_blank')}
You can also store a url field in each project object and thread it through to the handler.

Build docs developers (and LLMs) love