Skip to main content

Overview

The projects data structure powers the Projects section of the portfolio, showcasing both technical and operational work. It’s defined in src/data/projects.ts and consumed by src/components/Projects.astro.

Type Definitions

Status Type

Defines the current state of a project:
export type Status = 'Deployed' | 'In Development' | 'Completed';

Deployed

Live and accessible to users

In Development

Currently being built

Completed

Finished operational projects

Category Type

Classifies projects into two main domains:
export type Category = 'Tech' | 'Operations';
  • Tech: Software development projects (web apps, APIs, etc.)
  • Operations: Process improvement and organizational projects

Project Structure

export const projects: {
  name: string;
  description: string;
  status: Status;
  category: Category;
  tags: string[];
  gradient: string;
  url: string;
}[] = [
  // ... project entries
];

Project Fields

All fields are required for each project entry.

Field Reference

FieldTypeDescription
namestringProject title (display name)
descriptionstringDetailed project description
statusStatusCurrent project state
categoryCategoryTech or Operations classification
tagsstring[]Technology/skill tags
gradientstringCSS gradient for card header
urlstringExternal link (usually GitHub)

Real Examples

Tech Project Example

{
  name: 'API Explorer',
  description: 'Web app for consuming and testing third-party REST APIs β€” built to practice real-world HTTP request handling, authentication flows, and dynamic data rendering.',
  status: 'Deployed',
  category: 'Tech',
  tags: ['JavaScript', 'REST API', 'Fetch'],
  gradient: 'linear-gradient(135deg,#0f0028 0%,#1a0035 50%,#000 100%)',
  url: 'https://github.com/drakk3',
}

Operations Project Example

{
  name: 'SOP Optimization & Confluence Implementation',
  description: 'Reviewed and restructured Standard Operating Procedures across operations and corporate levels. Migrated and organized all documentation into Confluence, creating a centralized, searchable knowledge base aligned with company structure.',
  status: 'Completed',
  category: 'Operations',
  tags: ['SOP', 'Confluence', 'Process Optimization', 'Documentation'],
  gradient: 'linear-gradient(135deg,#001a14 0%,#000d0a 50%,#000 100%)',
  url: 'https://github.com/drakk3',
}

Badge Variant Mapping

The badgeVariant object maps status types to visual variants:
export const badgeVariant: Record<Status, string> = {
  'Deployed':        'deployed',
  'In Development':  'warning',
  'Completed':       'completed',
};
This mapping is exported from the data file but is not currently used in the Projects component. The status is rendered as plain text in a custom styled span (see src/components/Projects.astro:70-72). The mapping could be used if you wanted to integrate the shadcn/ui Badge component in the future.

Gradient Guidelines

1

Use dark gradients

All gradients should end in #000 (pure black) to blend with the dark theme
2

Match the category theme

  • Tech projects: Purple/blue tones (#0f0028, #001a28, #001428)
  • Operations projects: Warm tones (#1a1200, #001a14)
3

135deg angle

Use linear-gradient(135deg, ...) for consistent diagonal direction

Gradient Pattern

linear-gradient(135deg, [start-color] 0%, [mid-color] 50%, #000 100%)

Adding New Projects

1

Open the data file

Edit src/data/projects.ts
2

Add your project object

{
  name: 'Your Project Name',
  description: 'Detailed description of what this project does and why it matters.',
  status: 'In Development', // or 'Deployed' or 'Completed'
  category: 'Tech', // or 'Operations'
  tags: ['React', 'TypeScript', 'API'],
  gradient: 'linear-gradient(135deg,#1a0035 0%,#0d001a 50%,#000 100%)',
  url: 'https://github.com/username/repo',
}
3

Follow the patterns

  • Use meaningful, descriptive tags
  • Keep descriptions concise but informative
  • Choose a gradient that fits the category
Projects are displayed in the order they appear in the array. Place your most important projects first.

Usage in Components

The projects data is imported and consumed in src/components/Projects.astro:
---
import { projects } from '@/data/projects';
---

<div class="grid grid-cols-1 sm:grid-cols-2 gap-6" id="projects-grid">
  {projects.map((project) => (
    <a
      href={project.url}
      target="_blank"
      rel="noopener noreferrer"
      data-category={project.category}
      class="project-card"
    >
      <!-- Card renders project.name, project.description, etc. -->
    </a>
  ))}
</div>

Key Integration Points

Filtering

The data-category attribute enables the filter buttons (All/Tech/Operations)

Gradient Styling

project.gradient is applied as inline style to the card header

Status Display

Status is shown as a badge in the top-right of each card

Tags Rendering

Tags array is mapped to small pill elements at the bottom

Client-Side Filtering

The Projects component includes interactive filtering:
const filterBtns = document.querySelectorAll('.filter-btn');
const cards = document.querySelectorAll('.project-card');

filterBtns.forEach((btn) => {
  btn.addEventListener('click', () => {
    const filter = btn.dataset.filter;
    cards.forEach((card) => {
      const match = filter === 'All' || card.dataset.category === filter;
      card.style.display = match ? '' : 'none';
    });
  });
});
This script:
  1. Listens for filter button clicks
  2. Compares data-category on each card to the selected filter
  3. Shows/hides cards with fade animations

Best Practices

Description Length

Keep descriptions between 100-200 characters for visual consistency

Tag Count

Use 3-5 tags per project - enough to be descriptive, not overwhelming

URL Consistency

Use full URLs including protocol (https://)

Gradient Testing

Preview gradients in the browser to ensure they work with the dark theme

Current Projects

The portfolio currently includes 5 projects:
  • 2 Tech projects: API Explorer, drakk3 Assistant
  • 3 Operations projects: Luxury Dept. Structuring, SOP Optimization, National Training Program
Projects span from deployed web applications to completed organizational transformations.