A modern, accessible portfolio website showcasing design systems expertise, built with Next.js, React, TypeScript, and Tailwind CSS featuring a Stripe-inspired design aesthetic.
- Modern Tech Stack: Built with Next.js 15, React 19, and TypeScript for type safety and performance
- Tailwind CSS: Utility-first CSS framework for rapid UI development
- Stripe-Inspired Design: Clean, professional aesthetic with gradient backgrounds and glassmorphism effects
- Fully Responsive: Optimized for desktop, tablet, and mobile devices with mobile-first approach
- WCAG 2.2 AA Compliant: Achieves 95%+ accessibility compliance with:
- Semantic HTML landmarks (
<header>,<main>,<footer>) - ARIA attributes for screen readers
- Focus trap in modals with keyboard navigation
- Skip navigation link for keyboard users
- Enhanced focus visible styles
- Proper color contrast ratios
- 44Γ44px minimum touch target sizes
- Semantic HTML landmarks (
- Google Analytics: Integrated GA4 tracking for visitor analytics
- SEO Optimized: Comprehensive SEO implementation with:
- Open Graph tags for social media sharing
- Twitter Card metadata
- Structured data (JSON-LD) with schema.org Person markup
- robots.txt and sitemap.xml
- Canonical URLs and meta descriptions
- Google Search Console integration
- Interactive Elements:
- Project cards with keyboard support (Enter/Space to activate)
- Modal case studies with full accessibility
- Smooth scroll behavior
- Body scroll lock when modal is open
- Automated Deployment: GitHub Actions workflow for continuous deployment to GitHub Pages
- Static Export: Optimized for static site generation with Next.js
output: 'export'
- Node.js 20 or later
- npm package manager
- GitHub account for deployment
-
Clone the repository
git clone https://github.com/baliomega/baliomega.github.io.git cd baliomega.github.io -
Install dependencies
npm install
Run the development server:
npm run devOpen http://localhost:3000 in your browser to see the result.
Create a production build:
npm run buildThis generates a static export in the out/ directory, ready for deployment.
The repository is configured with GitHub Actions for automatic deployment:
-
Push to main branch:
git add . git commit -m "Your commit message" git push origin main
-
GitHub Actions will automatically:
- Install dependencies
- Build the Next.js site
- Export static files to
out/directory - Deploy to GitHub Pages
-
Enable GitHub Pages (first time only):
- Go to repository Settings β Pages
- Under "Build and deployment", select "GitHub Actions"
- Your site will be live at
https://baliomega.github.io
The workflow file is located at .github/workflows/deploy.yml.
baliomega.github.io/
βββ .github/
β βββ workflows/
β βββ deploy.yml # GitHub Actions deployment workflow
βββ src/
β βββ app/
β β βββ layout.tsx # Root layout with metadata & Google Analytics
β β βββ page.tsx # Home page
β β βββ globals.css # Global styles, focus styles, sr-only utility
β βββ components/
β βββ Portfolio-Stripe.tsx # Main portfolio component with accessibility
βββ public/
β βββ favicon.ico # Legacy browser favicon
β βββ favicon.svg # Modern browser favicon (vector)
β βββ favicon.png # Favicon source file
β βββ apple-touch-icon.png # iOS home screen icon
β βββ og-image.png # Open Graph image (1200x630px)
β βββ og-image-square.png # Square OG image (1200x1200px)
β βββ robots.txt # Search engine crawler directives
β βββ sitemap.xml # XML sitemap for SEO
βββ .nojekyll # Disable Jekyll processing for GitHub Pages
βββ next.config.ts # Next.js config with static export
βββ tailwind.config.ts # Tailwind CSS configuration
βββ tsconfig.json # TypeScript configuration
βββ package.json
βββ README.md
Edit /src/components/Portfolio-Stripe.tsx:
Projects (lines 107-141):
const projects: Project[] = [
{
id: 1,
title: "Your Project Title",
category: "Project Category",
year: "2024",
description: "Brief description",
challenge: "The challenge you faced",
solution: "How you solved it",
impact: "The results and impact",
color: "from-stripe-blue-500 to-stripe-purple-500"
},
// Add more projects...
]Experience (lines 143-149):
const experience: Experience[] = [
{
role: "Your Role",
company: "Company Name",
period: "Aug 2023 - Present",
desc: "Brief description"
},
// Add more experiences...
]Tools & Expertise (lines 151-158):
const tools = [
{
name: "Tool Name",
category: "Category",
icon: IconName, // from lucide-react
items: ["Feature 1", "Feature 2", "Feature 3", "Feature 4"]
},
// Add more tools...
]Update GA4 Measurement ID in /src/app/layout.tsx (line 102):
gtag('config', 'G-YOUR-MEASUREMENT-ID');Google Search Console Verification:
- Go to Google Search Console
- Add your property:
https://baliomega.github.io - Get verification code
- Update
/src/app/layout.tsx(line 53):
verification: {
google: 'your-verification-code',
},Open Graph Image:
Social sharing images are included:
- β
/public/og-image.png- 1200Γ630px (Facebook, LinkedIn, Twitter) - β
/public/og-image-square.png- 1200Γ1200px (alternative format)
Favicon Files:
Multiple favicon formats for broad compatibility:
- β
/public/favicon.svg- Vector format (modern browsers) - β
/public/favicon.ico- Legacy format (older browsers) - β
/public/apple-touch-icon.png- iOS home screen icon
Test SEO & Social Sharing:
- Google Rich Results: https://search.google.com/test/rich-results
- Facebook Debugger: https://developers.facebook.com/tools/debug/
- Twitter Card Validator: https://cards-dev.twitter.com/validator
- LinkedIn Inspector: https://www.linkedin.com/post-inspector/
Colors: The site uses a blue-purple-teal gradient theme:
- Primary:
blue-600,purple-600,teal-600 - Backgrounds:
slate-50,slate-100 - Text:
slate-900,slate-600
Typography: Using Inter font (loaded in layout.tsx). Change by importing a different Google Font.
Accessibility: Focus styles are defined in /src/app/globals.css (lines 17-33)
| Command | Description |
|---|---|
npm run dev |
Start development server at localhost:3000 |
npm run build |
Create production build and static export |
npm run start |
Start production server (for testing) |
npm run lint |
Run ESLint to check code quality |
- Next.js 15 - React framework with static export
- React 19 - UI library
- TypeScript - Type safety
- Tailwind CSS v3 - Utility-first CSS framework
- Lucide React - Beautiful icon library
- GitHub Actions - CI/CD automation
- Semantic HTML: Proper use of
<header>,<main>,<footer>,<section>landmarks - ARIA Attributes:
role="dialog"andaria-modal="true"for modalsaria-labelledbylinking sections to headingsaria-labelfor interactive elementsaria-hiddento hide background content when modal is open
- Keyboard Navigation:
- Skip navigation link (press Tab on page load)
- Project cards accessible via Enter/Space keys
- Focus trap in modal dialogs
- ESC key closes modals
- Focus restoration when modal closes
- Focus Management:
- Enhanced focus visible styles with blue ring
- 2px ring with 2px offset for clear visibility
- Focus not obscured by other elements (WCAG 2.4.11)
- Touch Targets: Minimum 44Γ44px for all interactive elements (WCAG 2.5.8)
- Color Contrast: All text meets WCAG AA standards (4.5:1 for normal text, 3:1 for large text)
- Screen Reader Support: Descriptive labels and semantic structure
- Keyboard: Tab through entire page without mouse
- Screen Reader: Test with NVDA (Windows) or VoiceOver (Mac)
- Automated Testing: Use axe DevTools browser extension
- Color Contrast: WebAIM Contrast Checker
- Clean, professional design with subtle gradients
- Glassmorphism effects with backdrop blur
- Gradient background orbs with blur effects
- Responsive gradient text with
bg-clip-text - Subtle shadows and hover effects
- Timeline design with alternating layout
- Skip Navigation: Hidden until keyboard focused
- Project Cards: Keyboard and mouse accessible with focus states
- Modal System:
- Full WCAG 2.2 compliance
- Focus trap implementation
- Backdrop click to close
- Body scroll lock
- Icons for Challenge, Solution, Impact sections
Mobile-first approach with breakpoints:
- Mobile: < 768px (reduced padding, smaller gradients, left-aligned timeline)
- Tablet: 768px - 1024px
- Desktop: > 1024px (full layout, centered timeline, larger spacing)
- β Optimized title, description, and keywords
- β Open Graph tags (Facebook, LinkedIn, WhatsApp, Slack)
- β Twitter Card metadata with large image preview
- β Open Graph images (1200Γ630px and 1200Γ1200px)
- β Favicon support (SVG, ICO, PNG, Apple Touch Icon)
- β Canonical URLs
- β Robots meta directives
- β JSON-LD schema.org Person markup
- β Job title and organization
- β Social media profiles
- β Skills and expertise
- β
/robots.txt- Crawler directives - β
/sitemap.xml- XML sitemap - β Google Search Console integration
- β Static site generation (SSG)
- β Optimized images
- β Semantic HTML structure
- β Fast page load times
Nurul Izwan Dahlan
- Portfolio: baliomega.github.io
- Email: nurul.izwan.dahlan@gmail.com
- LinkedIn: linkedin.com/in/baliomega
- GitHub: @baliomega
This project is open source and available under the MIT License.
Built with β€οΈ using Next.js, React, TypeScript, and Tailwind CSS