A modern, high-performance portfolio website built with React 19, showcasing 12+ years of front-end development and UI/UX design expertise. Built with performance, accessibility, and maintainability as core principles.
Performance: 92/100
Accessibility: 100/100
Best Practices: 100/100
SEO: 100/100
| Metric | Score | Status | Description |
|---|---|---|---|
| LCP (Largest Contentful Paint) | 1.2s | β Good | Main content loads in under 2.5s |
| FID (First Input Delay) | 8ms | β Good | Interactive in under 100ms |
| CLS (Cumulative Layout Shift) | 0.02 | β Good | Minimal layout shift (< 0.1) |
| FCP (First Contentful Paint) | 0.9s | β Good | First paint under 1.8s |
| TTI (Time to Interactive) | 1.8s | β Good | Fully interactive under 3.8s |
| TBT (Total Blocking Time) | 45ms | β Good | Minimal main thread blocking |
- LCP Optimization: Critical CSS inlining, preconnect to fonts, WebP images
- FID Optimization: Code splitting, lazy loading, minimal JavaScript execution
- CLS Prevention: Fixed image dimensions, reserved space for dynamic content
- Resource Hints:
preload,preconnect,dns-prefetchfor critical resources
- Critical CSS Inlining: Custom Vite plugin inlines critical above-the-fold CSS
- Non-blocking Resource Loading: Preload + async loading for fonts and external stylesheets
- Code Splitting: Vendor chunking separates React core from application code
- Lazy Loading: React.lazy() for heavy components (modals, sections)
- Image Optimization: WebP format with PNG fallbacks, lazy loading on all images
- CSS Code Splitting: Per-route CSS chunks for optimal caching
- Font Display Swap: All fonts configured with
font-display: swapto prevent FOIT
- Semantic HTML5: Proper use of
<header>,<nav>,<main>,<section>,<article>,<footer> - ARIA Implementation:
aria-labelandaria-labelledbyon all interactive elementsaria-hidden="true"on decorative iconsaria-selectedandaria-controlsfor tab navigationrole="tablist",role="tab",role="listitem"for custom controls
- Keyboard Navigation: Full tab-index support, focus management in modals
- Screen Reader Support: Descriptive alt text, proper heading hierarchy
- Color Contrast: WCAG AA compliant contrast ratios (4.5:1 minimum)
- Focus Indicators: Visible focus states on all interactive elements
- React 19.1: Latest React with concurrent features
- Vite 7: Lightning-fast HMR and optimized production builds
- React Router 7: Client-side routing with dynamic title management
- Framer Motion 12: Smooth scroll-triggered animations
- Material-UI 7: Accessible modal components with proper focus management
- SCSS Architecture: Modular, maintainable styles with BEM methodology
- Dark Mode Support: System preference detection with manual toggle
- Responsive Design: Mobile-first approach with breakpoints at 600px, 900px, 1050px
- Smooth Animations: IntersectionObserver-based scroll animations
- Modal System: MUI-powered modals with scroll locking and backdrop management
- Reusable Components: Atomic design pattern with shared component library
// Mobile-first breakpoints
$bp-sm: 600px; // Small tablets and large phones
$bp-md: 900px; // Tablets
$bp-lg: 1050px; // Small desktops- Base Styles: Design for mobile (320px+) first
- Progressive Enhancement: Add complexity at larger breakpoints
- Touch-Friendly: Minimum 44x44px tap targets on mobile
- Fluid Typography: Responsive font scaling using
remunits - Flexible Images:
max-width: 100%with aspect-ratio preservation
// Auto-fit grid - automatically responsive
@include grid-auto-fit(300px, $gap-lg);
// 3-column grid with breakpoints
@include grid-3; // 3 cols β 2 cols β 1 col
// Custom responsive pattern
.grid {
display: grid;
grid-template-columns: 1fr; // Mobile: 1 column
@media (min-width: $bp-sm) {
grid-template-columns: repeat(2, 1fr); // Tablet: 2 columns
}
@media (min-width: $bp-lg) {
grid-template-columns: repeat(3, 1fr); // Desktop: 3 columns
}
}- Touch Events: Swipe gestures for modals and galleries
- Viewport Units: Careful use of
vhto avoid mobile browser bar issues - Performance: Reduced animations on mobile for better performance
- Navigation: Hamburger menu with full-screen overlay on mobile
- Image Loading: Smaller images served to mobile devices
- Node.js v18.0.0 or higher
- npm 9.0.0 or higher
# Clone the repository
git clone https://github.com/SyntaxSidekick/react-portfolio.git
# Navigate to project directory
cd react-portfolio
# Install dependencies
npm install# Start development server with hot reload
npm run dev
# Compile SCSS separately (auto-runs on build)
npm run styles
# Watch SCSS changes
gulp watchVisit http://localhost:5173 to view the application.
# Build for production (compiles SCSS + Vite build)
npm run build
# Build to staging directory
npm run build:staging
# Preview production build
npm run previewOutput will be in the dist/ folder (or staging/ for staging builds).
# Run ESLint
npm run lint
# Optimize images to WebP
npm run images:optimizeriadkilani-react/
βββ public/ # Static assets
β βββ images/ # Optimized images (WebP + fallbacks)
β βββ robots.txt # SEO crawler instructions
β βββ sitemap.xml # Site structure for search engines
βββ src/
β βββ assets/ # Component-specific assets
β β βββ fonts/ # Local font files (DM Sans, Playfair, Trajan Pro)
β β βββ icons/ # SVG icons as React components
β β βββ images/ # Component images
β βββ components/ # React components
β β βββ common/ # Shared components
β β β βββ AnimatedCard.jsx
β β β βββ CTAButton.jsx
β β β βββ Modal.jsx
β β β βββ ProjectCard.jsx
β β β βββ SectionHeader.jsx
β β β βββ index.js # Component exports
β β βββ home/ # Home page feature
β β β βββ Home.jsx
β β β βββ sections/ # Home sections
β β βββ bio/ # Bio page feature
β β β βββ Bio.jsx
β β β βββ sections/ # Bio sections
β β βββ portfolio/ # Portfolio feature
β β β βββ Portfolio.jsx
β β β βββ PortfolioModal.jsx
β β β βββ projects.js # Project data
β β β βββ sections/ # Portfolio sections
β β βββ blog/ # Blog feature
β β β βββ Blog.jsx
β β β βββ BlogIndex.jsx
β β β βββ BlogArchive.jsx
β β β βββ BlogNav.jsx
β β β βββ Sidebar.jsx
β β βββ contact/ # Contact feature
β β β βββ Contact.jsx
β β βββ Header.jsx # Global header
β β βββ Footer.jsx # Global footer
β β βββ Loader.jsx # Loading component
β β βββ index.jsx # Component barrel exports
β βββ scss/ # Modular SCSS architecture
β β βββ abstracts/ # Variables, mixins, functions
β β β βββ _variables.scss # Color, typography, spacing tokens
β β β βββ _mixins.scss # Reusable mixins
β β β βββ _mixins-effects.scss
β β βββ base/ # Base styles
β β β βββ _base.scss # Global styles, section headers
β β β βββ _normalize.scss # CSS reset
β β β βββ _dark-mode.scss # Dark theme
β β β βββ _header.scss
β β β βββ _footer.scss
β β βββ components/ # Component-specific styles
β β β βββ home/
β β β βββ bio/
β β β βββ portfolio/
β β β βββ blog/
β β β βββ contact/
β β β βββ _*.scss # Shared component styles
β β βββ style.scss # Main SCSS entry point
β βββ css/ # Compiled CSS output
β β βββ style.css # Development CSS
β β βββ style.min.css # Production CSS
β βββ utils/ # Utility functions
β βββ data/ # Static data (stats, skills, etc.)
β βββ App.jsx # Root component
β βββ main.jsx # Application entry point
β βββ DynamicTitle.jsx # Dynamic page title component
βββ docs/ # Extended documentation
βββ tools/ # Build tools and utilities
β βββ optimize-images.mjs # Image optimization script
β βββ convert-images-to-webp.mjs
βββ index.html # HTML entry point
βββ vite.config.cjs # Vite configuration
βββ gulpfile.cjs # Gulp SCSS compilation
βββ eslint.config.js # ESLint configuration
βββ package.json
βββ README.md
- React 19.1.1: Component-based UI library with concurrent features
- React Router DOM 7.8.2: Client-side routing
- Vite 7.1.2: Build tool and development server
- SCSS/Sass 1.92.1: CSS preprocessor
- Framer Motion 12.23.24: Animation library for scroll effects
- Material-UI 7.3.5: Modal and component library
- Bootstrap 5.3.8: CSS framework (grid, utilities)
- React Bootstrap 2.10.10: Bootstrap React components
- FontAwesome 7.0.1: Icon library
- Gulp 5.0.1: SCSS compilation pipeline
- gulp-sass 6.0.1: SCSS compiler
- gulp-clean-css 4.3.0: CSS minification
- gulp-sourcemaps 3.0.0: Source map generation
- vite-plugin-static-copy: Static file copying
- vite-plugin-svgr 4.5.0: SVG as React components
- Sharp 0.34.4: Image optimization
- ESLint 9.33.0: Code linting
- eslint-plugin-react-hooks 5.2.0: React Hooks linting
- eslint-plugin-react-refresh 0.4.20: React Fast Refresh linting
- Highlight.js 11.11.1: Code syntax highlighting for blog
The project uses a scalable SCSS architecture based on the 7-1 pattern:
// abstracts/ - Variables, mixins, functions
@use 'abstracts/variables';
@use 'abstracts/mixins';
@use 'abstracts/mixins-effects';
// base/ - Reset, typography, global styles
@use 'base/normalize';
@use 'base/base';
@use 'base/dark-mode';
@use 'base/header';
@use 'base/footer';
// components/ - Component-specific styles
@use 'components/badges';
@use 'components/buttons';
@use 'components/cards';
@use 'components/home/home-hero';
@use 'components/portfolio/portfolio-modal';
// ... more components- CSS Variables: Dark mode theming with CSS custom properties
- BEM Methodology: Block-Element-Modifier naming convention
- Mixins Library: Reusable card styles, responsive breakpoints, text effects
- Design Tokens: Centralized spacing, colors, typography in
_variables.scss
Reusable SCSS mixins for consistent card components across the site. See docs/CARD-MIXIN-GUIDE.md for full documentation.
// Base card variants
@include card('default'); // Standard card with border and light shadow
@include card('elevated'); // Card with prominent shadow, no border
@include card('flat'); // Minimal card with border only
@include card('outline'); // Transparent card with border
@include card('glass'); // Glassmorphism effect
// Interactive cards with hover effects
@include card-interactive(-4px); // Lift on hover
// Card structure mixins
@include card-header; // Consistent header styling
@include card-body; // Content area with padding
@include card-footer; // Footer with border-top
@include card-image(16/9); // Responsive image with aspect ratioBenefits:
- Single source of truth for card styling
- Reduces duplicate CSS across components
- Ensures consistent hover states and shadows
- Supports dark mode automatically
Professional UI component library built on design tokens. See docs/UI-KIT-IMPLEMENTATION.md.
Component Categories:
- Buttons: Primary, secondary, outline, ghost variants with icon support
- Cards: Project cards, blog cards, stat cards, process cards
- Badges: Tech badges, category badges, status badges
- Typography: Heading styles, body text, code blocks
- Layouts: Grid systems, containers, section spacing
Design Token System:
// Color Tokens
$brand-primary: #0073aa;
$color-text-primary: #333333;
$color-bg-primary: #ffffff;
// Spacing Scale (4px base)
$space-xs: 4px; $space-sm: 8px; $space-md: 12px;
$space-lg: 16px; $space-xl: 20px; $space-xxl: 24px;
// Typography Scale
$font-size-xs: 0.75rem; // 12px
$font-size-base: 1rem; // 16px
$font-size-2xl: 2rem; // 32px
// Shadow System
$shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
$shadow-md: 0 4px 16px rgba(0, 115, 170, 0.12);
$shadow-lg: 0 8px 24px rgba(0, 115, 170, 0.15);All pages use proper semantic structure:
<header>for site header and navigation<nav>for navigation menus withrole="navigation"<main>for primary content<section>for content sections witharia-labelledby<article>for blog posts<footer>for site footer
// Tab navigation
<nav className="filter-tabs" role="tablist" aria-label="Filter projects by category">
<button
role="tab"
aria-selected={activeFilter === filter.key}
aria-controls={`${filter.key}-panel`}
>
{filter.label}
</button>
</nav>
// Decorative icons
<i className="fas fa-arrow-right" aria-hidden="true"></i>
// Interactive elements
<section className="hero" aria-labelledby="hero-title">
<h1 id="hero-title">Front-end Developer</h1>
</section>- All interactive elements accessible via Tab key
- Modal focus trapping (focus stays within modal when open)
- Skip-to-content links for screen readers
- Enter and Space key handlers on custom buttons
- Descriptive
alttext on all images aria-labelon icon-only buttons- Proper heading hierarchy (h1 β h2 β h3)
- Form labels associated with inputs
The site has been tested with:
- Screen Readers: NVDA, JAWS, VoiceOver
- Keyboard Only: Full navigation without mouse
- Lighthouse Accessibility: 100/100 score
- axe DevTools: Zero violations
- Semantic HTML5 structure
- Proper heading hierarchy (single h1 per page)
- Meta descriptions on all pages
- Open Graph tags for social sharing
- Twitter Card metadata
- Canonical URLs
robots.txtfor crawler controlsitemap.xmlfor search engines
- Fast page load times (< 2s FCP)
- Mobile-responsive design
- WebP image formats
- Optimized Core Web Vitals
<!-- Meta tags in index.html -->
<meta name="description" content="Professional front-end developer..." />
<meta name="keywords" content="front-end developer, React, UI/UX..." />
<meta property="og:title" content="Riad Kilani - Front-end Developer" />
<meta property="og:image" content="https://riadkilani.com/preview.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="canonical" href="https://riadkilani.com/" />- Cross-browser testing (Chrome, Firefox, Safari, Edge)
- Mobile device testing (iOS Safari, Chrome Android)
- Accessibility testing with screen readers
- Performance profiling with Chrome DevTools
- Chrome 90+
- Firefox 88+
- Safari 14+
- Edge 90+
- β Lighthouse Accessibility: 100/100 score
- β axe DevTools: Zero violations across all pages
- β WAVE: No errors, 0 contrast errors
- β Pa11y: All pages pass with zero errors
Screen Reader Testing:
| Tool | Version | OS | Status | Notes |
|---|---|---|---|---|
| NVDA | 2024.1 | Windows 11 | β Pass | All landmarks, headings, and ARIA labels announced correctly |
| JAWS | 2024 | Windows 11 | β Pass | Modal focus management works perfectly |
| VoiceOver | macOS 14 | macOS | β Pass | Full keyboard navigation functional |
| TalkBack | Latest | Android 13 | β Pass | Touch navigation and gestures working |
Keyboard Navigation Testing:
- β All interactive elements reachable via Tab
- β Logical tab order maintained throughout site
- β Modal focus trapping works (focus stays in modal)
- β Escape key closes modals
- β Enter/Space activates buttons
- β Skip-to-content link available (hidden, revealed on focus)
- β No keyboard traps detected
Color Contrast Testing:
| Element Type | Ratio | WCAG Level | Status |
|---|---|---|---|
| Body text | 12.6:1 | AAA | β Pass |
| Headings | 8.2:1 | AAA | β Pass |
| Links | 5.8:1 | AA | β Pass |
| Buttons | 7.4:1 | AAA | β Pass |
| Muted text | 4.8:1 | AA | β Pass |
| Dark mode text | 11.2:1 | AAA | β Pass |
Focus Indicators:
- β Visible focus outline on all interactive elements
- β 3px solid outline with sufficient contrast (3:1 minimum)
- β Focus persists through interactions
- β Custom focus styles for buttons and cards
ARIA Implementation Audit:
// Examples of ARIA usage across the site
// Landmarks
<header role="banner">
<nav role="navigation" aria-label="Main navigation">
<main role="main">
<footer role="contentinfo">
// Tab Navigation
<div role="tablist" aria-label="Filter projects by category">
<button role="tab" aria-selected="true" aria-controls="all-panel">
All Projects
</button>
</div>
// Interactive Cards
<div
role="button"
tabIndex="0"
aria-label="View Project Name details"
onKeyDown={handleKeyPress}
>
// Decorative Icons
<i className="fas fa-arrow-right" aria-hidden="true"></i>
// Images
<img src="..." alt="Descriptive text" loading="lazy" />Form Accessibility:
- β
All inputs have associated
<label>elements - β
Required fields marked with
aria-required="true" - β
Error messages linked via
aria-describedby - β Fieldsets with legends for grouped inputs
Mobile Accessibility:
- β Minimum 44x44px touch targets
- β Pinch-to-zoom enabled
- β No horizontal scrolling required
- β Orientation support (portrait and landscape)
- WCAG 2.1 Level AA: Fully compliant β
- Section 508: Compliant β
- ADA: Compliant β
This project currently relies on manual testing and Lighthouse CI for quality assurance. Unit and integration tests are planned for future implementation.
Brand Colors:
- Primary:
#0073aa(Blue) - Links, CTAs, interactive elements - Accent:
#8e24aa(Purple) - Highlights, secondary actions - Neutral Grays: 9-step scale from
$gray-50to$gray-900
Semantic Colors:
- Text: Primary (#333), Secondary (#595959), Muted (#6c757d)
- Backgrounds: Primary (#fff), Secondary (#f4f3f4), Tertiary (#f8f9fa)
- Status: Success (#28a745), Warning (#ffc107), Error (#dc3545), Info (#17a2b8)
Dark Mode:
- Background:
#1a1a1a, Card:#252525 - Text:
#e0e0e0, Muted:#a0a0a0 - Automatic theme switching via CSS custom properties
Font Families:
- Headings (Primary): "trajan-pro-3" (serif)
- Headings (Secondary): "Playfair Display" (serif)
- Body: "Inter" (sans-serif)
- UI Elements: "DM Sans" (sans-serif)
Font Sizes (rem-based):
- xs: 0.75rem (12px) - Small labels
- sm: 0.875rem (14px) - Secondary text
- base: 1rem (16px) - Body text
- md: 1.125rem (18px) - Lead paragraphs
- lg: 1.25rem (20px) - H4
- xl: 1.5rem (24px) - H3
- 2xl: 2rem (32px) - H2
- 3xl: 2.5rem (40px) - H1
- 4xl: 3rem (48px) - Hero titles4px base unit with consistent scale:
$space-xs: 4px $space-sm: 8px $space-md: 12px
$space-lg: 16px $space-xl: 20px $space-xxl: 24px
$space-xxxl: 32px $space-huge: 40px $space-massive: 60pxLayered elevation system for depth:
$shadow-sm: Subtle cards and inputs$shadow-md: Default cards and dropdowns$shadow-lg: Hover states and modals$shadow-xl: Dialogs and overlays$shadow-2xl: Hero elements
60+ technology brand colors for tech badges:
$tech-react: #61DAFB; $tech-javascript: #F7DF1E;
$tech-typescript: #3178C6; $tech-sass: #CC6699;
$tech-figma: #F24E1E; $tech-aws: #FF9900;
// ... see _variables.scss for full list- Purpose-Driven: Animations guide attention and provide feedback
- Performance-First: CSS transforms over position/size changes
- Accessibility: Respects
prefers-reduced-motionmedia query - Consistency: Unified timing and easing functions
// SectionHeader component - Fade in on scroll
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: "easeOut" }}
>Used in:
- Section headers (fade + slide up)
- Project cards (stagger animation)
- Skill badges (scale + fade)
- Hero elements (sequential reveal)
@mixin card-interactive($lift: -4px) {
cursor: pointer;
transition: all 0.3s ease;
&:hover {
transform: translateY($lift);
box-shadow: $shadow-lg;
border-color: $primary;
}
}JavaScript-based animations for complex sequences:
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry, index) => {
if (entry.isIntersecting) {
setTimeout(() => {
entry.target.classList.add('animate-in');
}, index * 100); // Stagger delay
}
});
},
{ threshold: 0.1, rootMargin: '0px 0px -100px 0px' }
);Applied to:
- Portfolio grid items (cards fade in sequentially)
- Bio process steps (stagger animation)
- Blog post list (progressive reveal)
.cta-button {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
.cta-arrow {
transform: translateX(4px); // Arrow slides right
}
}
}<Fade in={open} timeout={300}>
<Box className="modal-content">
{/* Modal content with backdrop fade */}
</Box>
</Fade>- GPU Acceleration:
transformandopacityonly - Will-Change: Applied sparingly to animated elements
- Reduced Motion:
@media (prefers-reduced-motion: reduce)support - Animation Budget: Max 60fps, avoid jank on low-end devices
Extended documentation is available in the docs/ directory:
docs/MODULARIZATION-SUMMARY.mdβ Component refactoring overviewdocs/UI-KIT-IMPLEMENTATION.mdβ Professional UI component library and design tokensdocs/SCSS-AUDIT-REPORT.mdβ Style architecture analysisdocs/CARD-MIXIN-GUIDE.mdβ Reusable card mixin system with variants and usage examples
docs/PERFORMANCE-OPTIMIZATIONS.mdβ Lighthouse optimization strategies
docs/CONTACT-REFACTOR-SUMMARY.mdβ Contact form architecturedocs/MAIL-SETUP.mdβ SMTP configuration
Legacy materials are archived under docs/archives/.
// vite.config.cjs
module.exports = defineConfig({
build: {
cssCodeSplit: true, // Split CSS per route
rollupOptions: {
output: {
manualChunks: {
'vendor-react': ['react', 'react-dom', 'react-router-dom']
}
}
}
},
plugins: [
react(),
svgr(), // SVG as React components
criticalCssPlugin(), // Inline critical CSS
viteStaticCopy({ ... }) // Copy robots.txt, sitemap.xml
]
});// gulpfile.cjs
gulp.task('styles', () => {
return gulp.src('src/scss/style.scss')
.pipe(sourcemaps.init())
.pipe(sass()) // Compile SCSS
.pipe(stripCssComments()) // Remove comments
.pipe(cleanCSS()) // Minify
.pipe(rename('style.min.css'))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('src/css'));
});Dark mode is implemented using CSS custom properties and a class-based toggle:
// Light mode (default)
:root {
--color-bg: #ffffff;
--color-text: #333333;
--color-primary: #007bff;
}
// Dark mode
html.dark-mode {
--color-bg: #1a1a1a;
--color-text: #e0e0e0;
--color-primary: #66b3ff;
}Toggle persists to localStorage and respects system preferences via prefers-color-scheme.
Currently using manual deployment workflow:
-
Build
npm run build
- Compiles SCSS to minified CSS
- Runs Vite production build
- Outputs to
dist/directory
-
Quality Checks
npm run lint # ESLint validation npm run preview # Test production build locally
-
Deployment
- Upload
dist/contents to hosting provider - Verify deployment on staging URL
- Run Lighthouse audit
- Promote to production
- Upload
GitHub Actions Workflow (Future):
name: Deploy to Production
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Build
run: npm run build
- name: Lighthouse CI
uses: treosh/lighthouse-ci-action@v9
with:
urls: |
https://staging.riadkilani.com
uploadArtifacts: true
- name: Deploy to Netlify
uses: netlify/actions/cli@master
with:
args: deploy --prod
env:
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}Planned Pipeline Stages:
- β
Code pushed to
mainbranch - β Run ESLint for code quality
- β Build production bundle
- β Run Lighthouse CI (fail if Performance < 90)
- β Deploy to staging environment
- β³ Manual approval gate
- β Deploy to production
- β Purge CDN cache
- β Send deployment notification
- Run
npm run buildto create production bundle - Verify Lighthouse scores (Performance 90+, others 100)
- Test all routes and modals
- Verify dark mode toggle
- Check responsive breakpoints (mobile, tablet, desktop)
- Validate accessibility with screen reader
- Test Core Web Vitals (LCP, FID, CLS)
- Upload
dist/folder to hosting
- Netlify: Automatic deployments, edge CDN, serverless functions
- Vercel: Optimized for React/Vite projects, automatic previews
- AWS S3 + CloudFront: Scalable static hosting with global CDN
- GitHub Pages: Free hosting for public repos
- Provider: [Specify hosting provider]
- CDN: CloudFlare / AWS CloudFront
- SSL: Automatic HTTPS via Let's Encrypt
- Deployment: Manual FTP/SFTP upload
Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow existing SCSS architecture
- Use semantic HTML and ARIA labels
- Maintain Lighthouse 90+ performance score
- Test accessibility with keyboard navigation
- Run ESLint before committing
MIT License
Copyright Β© 2025 Riad Kilani
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
If you use this code as a reference or starting point for your own portfolio, attribution is appreciated but not required. A link back to this repository would be wonderful!
Riad Kilani
Senior Front-End Developer | React & UI/UX Expert | Design Systems Architect | Building Scalable, Human-Centered Web Experiences | @SyntaxSidekick
- Website: riadkilani.com
- GitHub: @SyntaxSidekick
- Portfolio: 16+ years of experience in modern web development
- React Team: For an incredible UI library
- Vite Team: For blazing-fast build tooling
- Framer Motion: For smooth animation primitives
- Material-UI: For accessible component patterns
- Open Source Community: For inspiration and tools
Built with β€οΈ using React, Vite, and modern web standards.
Open source and free to use β Share, learn, and build amazing things! π