Skip to content

cbenge509/cbenge509.github.io

Repository files navigation

cbenge509.github.io

Personal portfolio for Cris Benge β€” AI Researcher, builder, and technology leader. This project contains a well-crafted static site built with Astro 5, Tailwind CSS v4, and TypeScript in strict mode built with GitHub.IO deployment in mind.

Build and Deploy Coverage Lighthouse Performance Lighthouse Accessibility Lighthouse Best Practices Lighthouse SEO TypeScript Astro License: MIT

View Live Site β†’

Portfolio Screenshot


About

This isn't just a portfolio β€” it's a reference implementation of modern static site architecture. Built with Astro 5's content collections, Tailwind CSS v4's new CSS-based configuration, and TypeScript in strict mode throughout. Every component is tested, every color meets WCAG AA contrast ratios, and the entire CI pipeline enforces quality gates before deployment.

Features

Feature Description
πŸ“š Content Collections 6 Zod-validated collections: projects, publications, patents, education, certifications, awards
πŸŒ“ Dark Mode System-aware with manual toggle, FOUC prevention via inline script
πŸ“± Responsive Design Mobile-first approach with fluid typography using clamp()
β™Ώ Accessible WCAG AA compliant, keyboard navigable, reduced motion support
πŸ§ͺ 90%+ Coverage Unit tests with Vitest, E2E with Playwright across 3 browsers
πŸš€ Lighthouse 100s Performance, Accessibility, Best Practices, SEO
πŸ”’ Security Scanning npm audit + Semgrep SAST in CI pipeline
πŸ”€ Self-Hosted Fonts Privacy-respecting, performance-optimized via @fontsource

Tech Stack

Category Technology Why
Framework Astro 5.x Static generation, content collections, zero JS by default
Styling Tailwind CSS v4 CSS-native @theme config via @tailwindcss/vite
Language TypeScript Strict mode, no any types allowed
Unit Testing Vitest Co-located tests, AstroContainer API
E2E Testing Playwright Chromium, Firefox, WebKit coverage
Linting gts Google TypeScript Style for consistency
CI/CD GitHub Actions Multi-stage pipeline with quality gates
Hosting GitHub Pages Automated deployment on merge to master

Architecture

Project Structure

src/
β”œβ”€β”€ components/       # Astro components with co-located *.test.ts files
β”œβ”€β”€ content/          # Content collections (Zod-validated schemas)
β”‚   β”œβ”€β”€ projects/     # Portfolio projects (Markdown)
β”‚   β”œβ”€β”€ publications/ # Academic papers (Markdown)
β”‚   β”œβ”€β”€ patents/      # Patent filings (Markdown)
β”‚   β”œβ”€β”€ education/    # Degrees (YAML)
β”‚   β”œβ”€β”€ certifications/ # Professional certs (YAML)
β”‚   └── awards/       # Competition wins (YAML)
β”œβ”€β”€ layouts/          # BaseLayout with dark mode, SEO, analytics
β”œβ”€β”€ styles/           # Tailwind v4 design system (@theme tokens)
β”œβ”€β”€ utils/            # Utilities (cn.ts for class merging)
└── types/            # TypeScript type definitions
e2e/                  # Playwright E2E tests
test/fixtures/        # Mock data for unit tests

Content Collections

Collection Type Description
projects Content (MD) Portfolio projects with categories: leader, builder, winner, research
publications Content (MD) Academic papers with authors, venue, abstract
patents Content (MD) Patent filings with status tracking
education Data (YAML) Degrees and institutions
certifications Data (YAML) Professional certifications by category
awards Data (YAML) Competition and professional awards

Design System

The design system lives in src/styles/global.css using Tailwind v4's CSS-native configuration:

@theme {
  /* Semantic color tokens */
  --color-bg: #ffffff;
  --color-bg-dark: #0a0a0a;
  --color-accent: #2563eb;
  --color-accent-dark: #3b82f6;

  /* Typography */
  --font-display: 'Space Grotesk', system-ui, sans-serif;
  --font-sans: 'Inter', system-ui, sans-serif;
  --font-mono: 'JetBrains Mono', monospace;

  /* Transitions */
  --transition-fast: 150ms;
  --transition-medium: 300ms;
}

Custom utilities: .focus-ring for accessible focus states, .text-display-lg for responsive headlines, .prose for long-form content.


Quality & Testing

Testing Strategy

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Unit Tests (Vitest)          β”‚  E2E Tests (Playwright)     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  β€’ Co-located with components β”‚  β€’ Cross-browser coverage   β”‚
β”‚  β€’ AstroContainer API         β”‚  β€’ Chromium, Firefox, WebKitβ”‚
β”‚  β€’ 90% coverage threshold     β”‚  β€’ Accessibility assertions β”‚
β”‚  β€’ Fast, isolated             β”‚  β€’ Visual regression ready  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Component Testing Pattern:

import { experimental_AstroContainer as AstroContainer } from 'astro/container';

const container = await AstroContainer.create();
const result = await container.renderToString(Hero, {
  props: { title: 'Hello World' }
});
expect(result).toContain('Hello World');

CI Pipeline

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Security   β”‚    β”‚    Lint &    β”‚    β”‚   Build &    β”‚    β”‚   E2E &      β”‚
β”‚  npm audit   │───▢│  Type Check  │───▢│  Unit Tests  │───▢│  Lighthouse  │───▢ Deploy
β”‚   Semgrep    β”‚    β”‚     gts      β”‚    β”‚    Vitest    β”‚    β”‚  Playwright  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Code Quality Enforcement

  • TypeScript strict mode β€” No any types, strict null checks
  • Google TypeScript Style β€” Consistent formatting via gts
  • Pre-commit hooks β€” Lint, format check, security scan before every commit
  • Branch protection β€” All CI checks must pass before merge

Performance & Accessibility

Lighthouse Scores

Performance Accessibility Best Practices SEO
πŸ’― 100 πŸ’― 100 πŸ’― 100 πŸ’― 100

Accessibility Features

Feature Implementation
Color Contrast WCAG AA compliant β€” all ratios documented in design system
Keyboard Navigation Visible .focus-ring on all interactive elements
Touch Targets 44px minimum for buttons and links
Reduced Motion @media (prefers-reduced-motion) disables all animations
Semantic HTML Proper heading hierarchy, landmarks, ARIA where needed
Dark Mode Respects prefers-color-scheme, with manual override

Performance Optimizations

Optimization Impact
Zero JS by default Only ThemeToggle component hydrates client-side
Self-hosted fonts @fontsource eliminates third-party requests
Static generation No server runtime, pure HTML/CSS/JS
Image optimization Astro Image component with lazy loading
Font subsetting Only required weights loaded

Local Development

# Clone the repository
git clone https://github.com/cbenge509/cbenge509.github.io.git
cd cbenge509.github.io

# Install dependencies
npm install

# Start development server (http://localhost:4321)
npm run dev

# Run unit tests
npm test

# Run E2E tests (all browsers)
npm run test:e2e

# Build for production
npm run build

# Preview production build
npm run preview

License

MIT License β€” feel free to use this as inspiration for your own portfolio.


Built with Astro Β· Styled with Tailwind CSS Β· Deployed on GitHub Pages

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors