A modern, responsive portfolio website for Emmanuel Lawal, Data Scientist & AI Engineer, built with Next.js 15, TypeScript, and Tailwind CSS.
- Modern Design: Clean, professional design with a focus on data science and AI expertise
- Responsive: Mobile-first design that works on all devices
- Performance Optimized: Lazy loading, optimized images, and fast loading times
- SEO Friendly: Comprehensive meta tags, structured data, and sitemap
- Accessibility: WCAG AA compliant with proper focus states and screen reader support
- Contact Form: Functional contact form with spam protection
- Case Studies: Detailed project case studies with technical deep-dives
- Cookie Consent: GDPR-compliant cookie consent management
``` ├── app/ │ ├── about/page.tsx # About page with bio, skills, timeline │ ├── contact/page.tsx # Contact form and information │ ├── work/ │ │ ├── page.tsx # Portfolio with filtering │ │ └── [slug]/page.tsx # Individual case studies │ ├── api/ │ │ ├── contact/route.ts # Contact form API endpoint │ │ └── health/route.ts # Health check endpoint │ ├── layout.tsx # Root layout with SEO and analytics │ ├── page.tsx # Homepage │ └── globals.css # Global styles and design tokens ├── components/ │ ├── ui/ # Reusable UI components │ └── cookie-consent.tsx # Cookie consent banner ├── public/ │ ├── *.png # Project images and assets │ ├── manifest.json # Web app manifest │ ├── robots.txt # Search engine directives │ └── sitemap.xml # Site structure for SEO └── README.md ```
- Framework: Next.js 15 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS v4
- UI Components: shadcn/ui
- Icons: Lucide React
- Fonts: Inter (body), Poppins (headings)
- Analytics: Vercel Analytics & Speed Insights
- Deployment: Vercel (recommended)
- Node.js 18+
- npm, yarn, or pnpm
-
Clone the repository ```bash git clone cd emmanuel-portfolio ```
-
Install dependencies ```bash npm install
yarn install
pnpm install ```
-
Run the development server ```bash npm run dev
yarn dev
pnpm dev ```
-
Open your browser Navigate to http://localhost:3000
Projects are currently stored in static data objects in:
app/work/page.tsx- Project listingapp/work/[slug]/page.tsx- Individual case studies
To add a new project:
- Add project data to the
projectsarray inapp/work/page.tsx - Add corresponding case study data in
app/work/[slug]/page.tsx - Add project images to the
public/directory - Update the
generateStaticParamsfunction with the new slug
Key files to update:
app/layout.tsx- SEO metadata and structured dataapp/about/page.tsx- Bio, skills, timeline, certificationsapp/contact/page.tsx- Contact information- All pages - Replace "REPLACE_ME" placeholders with actual content
The structure supports adding a blog section:
- Create
app/blog/directory - Add
page.tsxfor blog listing - Add
[slug]/page.tsxfor individual posts - Consider using MDX for content management
The design system uses semantic tokens defined in app/globals.css:
- Primary color:
#0A84FF(Blue) - Secondary color:
#FFCA28(Yellow) - Neutrals: Various grays and whites
- Headings: Poppins (400, 500, 600, 700)
- Body: Inter (400, 500)
- Monospace: Geist Mono
sm: 640pxmd: 768pxlg: 1024pxxl: 1280px2xl: 1536px
The contact form requires backend integration. Current options:
Update app/api/contact/route.ts with your preferred email service:
```typescript // Example with Resend import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: 'contact@emmanuellawal.dev',
to: 'lawaltemmanuel@gmail.com',
subject: New contact from ${name},
html: emailTemplate
});
```
- Formspree: Add
action="https://formspree.io/f/YOUR_ID"to form - Netlify Forms: Add
netlifyattribute to form (if deploying to Netlify) - Vercel Forms: Use Vercel's form handling (if deploying to Vercel)
-
Connect to Vercel ```bash npx vercel ```
-
Set Environment Variables (if using email service)
RESEND_API_KEYor similar- Any other API keys needed
-
Deploy ```bash npx vercel --prod ```
- Build Command:
npm run build - Publish Directory:
out(if using static export) - Environment Variables: Set in Netlify dashboard
The site can be deployed to any platform supporting Next.js:
- AWS Amplify
- Railway
- DigitalOcean App Platform
- Self-hosted with PM2
Create a .env.local file for local development:
```env
RESEND_API_KEY=your_resend_key SENDGRID_API_KEY=your_sendgrid_key SMTP_HOST=your_smtp_host SMTP_USER=your_smtp_user SMTP_PASS=your_smtp_password
NEXT_PUBLIC_GA_ID=your_google_analytics_id ```
- Create GA4 property
- Add
NEXT_PUBLIC_GA_IDto environment variables - Update cookie consent component to initialize GA4
- Add Plausible script to
app/layout.tsx - Update cookie consent accordingly
The site follows WCAG AA guidelines:
- Color Contrast: 4.5:1 minimum for normal text
- Keyboard Navigation: All interactive elements accessible via keyboard
- Screen Readers: Proper ARIA labels and semantic HTML
- Focus Management: Visible focus indicators
- Skip Links: Skip to main content functionality
- All images have descriptive alt text
- Form labels are properly associated
- Color is not the only means of conveying information
- Text can be resized up to 200% without loss of functionality
- All interactive elements are keyboard accessible
- Meta Tags: Comprehensive title, description, and Open Graph tags
- Structured Data: JSON-LD for Person and Organization schemas
- Sitemap: XML sitemap for search engines
- Robots.txt: Search engine directives
- Canonical URLs: Prevent duplicate content issues
- Image Optimization: Next.js Image component with lazy loading
- Update meta descriptions for all pages
- Add alt text to all images
- Verify structured data with Google's Rich Results Test
- Submit sitemap to Google Search Console
- Monitor Core Web Vitals
- Images not loading: Check file paths in
public/directory - Contact form not working: Verify API endpoint and email service setup
- **Styling issues