Sigitec - Mein modernes Portfolio mit Next.js und TypeScript
Ein mehrsprachiges Portfolio mit Blog-System, Dark Mode und responsivem Design. Gebaut mit Next.js 15, TypeScript und Tailwind CSS für optimale Performance und Benutzererfahrung.
Sigitec - Mein modernes Portfolio
Projektübersicht
Sigitec ist mein persönliches Portfolio, das ich entwickelt habe, um meine Projekte, Fähigkeiten und Erfahrungen zu präsentieren. Das Projekt demonstriert moderne Frontend-Entwicklung mit Server-Side Rendering, statischer Generierung und einem integrierten Blog-System.
Live-Website: sigitec.dev
Projektart: Personal Portfolio Website mit Blog
Inhaltsverzeichnis
- Technologie-Stack
- Kernfeatures
- Architektur
- Internationalisierung
- Blog-System
- Design & UX
- Performance-Optimierung
- Deployment
Technologie-Stack
Frontend-Framework
Next.js 15 - Das React-Framework für Production
- App Router: Moderne, dateisystembasierte Routing-Architektur
- Server Components: Optimierte Performance durch serverseitiges Rendering
- Static Generation: Pre-rendering für blitzschnelle Ladezeiten
- Image Optimization: Automatische Bildoptimierung mit next/image
React 18 - Die neueste Version der beliebten UI-Library
- Hooks: Moderne State-Management mit useState, useEffect, useMemo
- Context API: Globale State-Verwaltung ohne externe Libraries
- Concurrent Features: Verbesserte Rendering-Performance
Styling
Tailwind CSS 3 - Utility-First CSS-Framework
- Responsive Design: Mobile-First Ansatz
- Dark Mode: Vollständige Theme-Unterstützung
- Custom Configuration: Maßgeschneiderte Farbpalette und Spacing
- JIT Compiler: Just-In-Time Compilation für optimale Bundle-Größe
Framer Motion - Production-Ready Animation Library
- Smooth Animations: Flüssige Übergänge und Animationen
- Scroll-basierte Effekte: Animationen beim Scrollen
- Gestures: Interaktive Hover- und Click-Effekte
Content-Management
Markdown-basiertes Blog-System
- gray-matter: Frontmatter-Parsing für Metadaten
- remark: Markdown-zu-HTML-Konvertierung
- remark-html: HTML-Generierung mit Syntax-Support
- File-based CMS: Kein externer CMS erforderlich
Entwicklungstools
TypeScript - Type-Safe JavaScript
- Type Inference: Automatische Typ-Erkennung
- Interface Definitions: Klare Datenstrukturen
- Compile-Time Checks: Fehler vor der Runtime erkennen
ESLint - Code Quality und Konsistenz
- Next.js Config: Optimierte Rules für Next.js
- Auto-Fixing: Automatische Code-Formatierung
Kernfeatures
🌍 Mehrsprachigkeit (i18n)
Vollständige Unterstützung für Deutsch und Englisch:
// Middleware-basierte Locale-Detection
export function middleware(request: NextRequest) {
const pathname = request.nextUrl.pathname;
const pathnameIsMissingLocale = locales.every(
(locale) => !pathname.startsWith(`/${locale}/`) && pathname !== `/${locale}`
);
if (pathnameIsMissingLocale) {
const locale = getLocale(request);
return NextResponse.redirect(
new URL(`/${locale}${pathname}`, request.url)
);
}
}
Features:
- Automatische Browser-Sprach-Erkennung
- URL-basierte Locale-Verwaltung (
/de,/en) - Persistente Sprachauswahl
- Übersetzungen für alle UI-Elemente
🎨 Dark Mode
Systembasierter Dark Mode mit manueller Override-Option:
// Theme-Wechsel mit LocalStorage-Persistenz
const toggleTheme = () => {
const newTheme = theme === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
localStorage.setItem('theme', newTheme);
if (newTheme === 'dark') {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
};
Vorteile:
- Reduziert Augenbelastung bei Nachtnutzung
- System-Präferenz-Unterstützung
- Smooth Transitions zwischen Themes
- Keine Flash of Unstyled Content (FOUC)
📝 Blog-System
Markdown-basiertes Blog mit vollständiger Funktionalität:
Frontmatter-Unterstützung:
---
title: "Blog-Post Titel"
date: "2026-01-06"
author: "Autor Name"
excerpt: "Kurzbeschreibung des Posts"
tags: ["tag1", "tag2"]
github: "https://github.com/user/repo"
liveUrl: "https://example.com"
technologies: ["Tech1", "Tech2"]
---
Features:
- Status-Badges (Finished, In Progress, Draft)
- Technologie-Tags
- GitHub und Live-Demo Links
- Automatische Slug-Generierung
- SEO-optimierte URLs
- Responsive Code-Blocks mit Syntax-Highlighting
🎯 Projekt-Showcase
Interaktive Projekt-Karten mit:
- Hover-Effekte mit Framer Motion
- Lazy-Loading von Bildern
- AVIF-Format mit Fallback
- Filterbare Kategorien
- Externe Links zu GitHub/Live-Demos
🏆 Achievements
Zeitbasierte Errungenschaften:
- Chronologische Sortierung
- Datum-Formatierung (Deutsch/Englisch)
- Responsive Grid-Layout
- Icon-Integration
📱 Responsive Design
Mobile-First Ansatz mit Breakpoints:
- Mobile: < 768px (1 Spalte)
- Tablet: 768px - 1024px (2 Spalten)
- Desktop: > 1024px (3 Spalten)
- Large Desktop: > 1440px (Optimierte Spacing)
Architektur
App Router Struktur
src/
├── app/
│ ├── [locale]/
│ │ ├── page.tsx # Homepage
│ │ ├── layout.tsx # Root Layout
│ │ └── blog/
│ │ ├── page.tsx # Blog-Übersicht
│ │ └── [slug]/
│ │ └── page.tsx # Blog-Detailseite
│ ├── globals.css
│ └── layout.tsx
├── components/
│ ├── layout/
│ │ ├── Header.tsx # Navigation
│ │ └── Footer.tsx # Footer
│ └── sections/
│ ├── HeroSection.tsx # Hero
│ ├── About.tsx # Über mich
│ ├── Projects.tsx # Projekte
│ ├── Achievements.tsx # Errungenschaften
│ └── Blog.tsx # Blog-Übersicht
├── content/
│ └── blog/
│ ├── _template.md # Blog-Template
│ ├── post1.md
│ └── post2.md
├── hooks/
│ └── useTranslation.ts # i18n Hook
├── lib/
│ ├── blog.ts # Blog-Utilities
│ └── i18n.ts # i18n Config
├── translations/
│ ├── de.ts # Deutsche Übersetzungen
│ └── en.ts # Englische Übersetzungen
└── types/
└── index.ts # TypeScript Types
Component-Architektur
Layout Components:
- Header: Sticky Navigation mit Scroll-Effekt
- Footer: Social Links und Copyright
- Section Wrapper: Wiederverwendbare Section-Container
Section Components:
- HeroSection: Animated Hero mit CTA
- About: Skills und Erfahrung
- Projects: Projekt-Grid mit Hover-Effekten
- Achievements: Timeline-basierte Darstellung
- Blog: Card-basierte Blog-Übersicht
State Management
Context API für globale States:
// useTranslation Hook
export function useTranslation() {
const params = useParams();
const locale = (params?.locale as string) || 'de';
const t = (key: string) => {
return translations[locale][key] || key;
};
return { t, locale };
}
Vorteile:
- Kein Redux/Zustand notwendig
- Einfache Implementierung
- Type-Safe Übersetzungen
- Automatic Re-Rendering
Internationalisierung
Middleware-basierte Locale-Detection
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import { match as matchLocale } from '@formatjs/intl-localematcher';
import Negotiator from 'negotiator';
const locales = ['en', 'de'];
const defaultLocale = 'de';
function getLocale(request: NextRequest): string {
const negotiatorHeaders: Record<string, string> = {};
request.headers.forEach((value, key) => (negotiatorHeaders[key] = value));
const languages = new Negotiator({ headers: negotiatorHeaders }).languages();
return matchLocale(languages, locales, defaultLocale);
}
export function middleware(request: NextRequest) {
const pathname = request.nextUrl.pathname;
const pathnameIsMissingLocale = locales.every(
(locale) => !pathname.startsWith(`/${locale}/`) && pathname !== `/${locale}`
);
if (pathnameIsMissingLocale) {
const locale = getLocale(request);
return NextResponse.redirect(
new URL(`/${locale}${pathname}`, request.url)
);
}
}
export const config = {
matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
};
Übersetzungsdateien
Struktur:
// translations/de.ts
export const de = {
nav: {
about: 'Über mich',
projects: 'Projekte',
achievements: 'Errungenschaften',
blog: 'Blog',
contact: 'Kontakt',
},
hero: {
greeting: 'Hallo, ich bin',
title: 'Full-Stack Entwickler',
subtitle: 'Ich entwickle moderne Webanwendungen',
cta: 'Projekte ansehen',
},
// ...
};
Blog-System
Markdown-Processing
// lib/blog.ts
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
export interface BlogPost {
slug: string;
title: string;
date: string;
author: string;
excerpt: string;
tags: string[];
github?: string;
liveUrl?: string;
technologies?: string[];
content: string;
}
export function getAllBlogPosts(): BlogPost[] {
const postsDirectory = path.join(process.cwd(), 'src/content/blog');
const fileNames = fs.readdirSync(postsDirectory);
const allPostsData = fileNames
.filter((fileName) => fileName.endsWith('.md') && !fileName.startsWith('_'))
.map((fileName) => {
const slug = fileName.replace(/\.md$/, '');
const fullPath = path.join(postsDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
const { data, content } = matter(fileContents);
return {
slug,
...data,
content,
} as BlogPost;
});
return allPostsData.sort((a, b) => (a.date < b.date ? 1 : -1));
}
Static Generation
// app/[locale]/blog/[slug]/page.tsx
export async function generateStaticParams() {
const slugs = getAllBlogSlugs();
const params: { locale: string; slug: string }[] = [];
locales.forEach((locale) => {
slugs.forEach((slug) => {
params.push({ locale, slug });
});
});
return params;
}
Vorteile:
- Pre-rendering aller Blog-Posts zur Build-Zeit
- Keine Runtime-Fetch-Calls
- Optimale Performance
- SEO-freundlich
Design & UX
Farbpalette
Light Mode:
- Primary:
#3B82F6(Blue-500) - Background:
#FFFFFF(White) - Text:
#1F2937(Gray-800) - Accent:
#10B981(Green-500)
Dark Mode:
- Primary:
#60A5FA(Blue-400) - Background:
#111827(Gray-900) - Text:
#F9FAFB(Gray-50) - Accent:
#34D399(Green-400)
Typography
Font-Stack:
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
Roboto, 'Helvetica Neue', Arial, sans-serif;
Font-Sizes:
- Heading 1: 3rem (48px)
- Heading 2: 2.25rem (36px)
- Heading 3: 1.875rem (30px)
- Body: 1rem (16px)
- Small: 0.875rem (14px)
Animationen
Framer Motion Variants:
const fadeInUp = {
initial: { opacity: 0, y: 60 },
animate: { opacity: 1, y: 0 },
transition: { duration: 0.6 }
};
const staggerContainer = {
animate: {
transition: {
staggerChildren: 0.1
}
}
};
Scroll-basierte Animationen:
- Fade-In beim Scrollen
- Stagger-Effekte für Listen
- Smooth Scroll zu Anchor-Links
Performance-Optimierung
Next.js Image Optimization
import Image from 'next/image';
<Image
src="/images/project.avif"
alt="Projekt Screenshot"
width={800}
height={600}
loading="lazy"
placeholder="blur"
/>
Optimierungen:
- Automatische Format-Konvertierung (WebP/AVIF)
- Responsive Images (srcset)
- Lazy Loading
- Blur Placeholder
Code Splitting
- Automatic Route-based Splitting: Next.js splittet automatisch nach Routes
- Dynamic Imports: Lazy Loading für schwere Komponenten
- Component-Level Splitting: Jede Section ist ein eigenes Bundle
Bundle-Optimierung
// next.config.js
module.exports = {
compiler: {
removeConsole: process.env.NODE_ENV === 'production',
},
images: {
formats: ['image/avif', 'image/webp'],
},
};
Performance-Metriken
Lighthouse Score:
- Performance: 95+
- Accessibility: 100
- Best Practices: 100
- SEO: 100
Core Web Vitals:
- LCP (Largest Contentful Paint): < 2.5s
- FID (First Input Delay): < 100ms
- CLS (Cumulative Layout Shift): < 0.1
Deployment
Vercel Deployment
Automatisches Deployment bei Git Push:
- Code Push zu GitHub
- Vercel erkennt Änderungen
- Build wird gestartet
- Deployment zu Production
Build-Konfiguration:
{
"buildCommand": "npm run build",
"outputDirectory": ".next",
"framework": "nextjs",
"nodeVersion": "18.x"
}
Environment Variables
# Production
NEXT_PUBLIC_SITE_URL=https://sigitec.dev
NODE_ENV=production
CI/CD Pipeline
GitHub Actions Workflow:
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- run: npm run build
- run: npm run lint
Lessons Learned
Technische Highlights
-
Next.js 15 App Router
- Moderne Routing-Architektur mit Server Components
- Optimale Performance durch Static Generation
- Type-Safe Routing mit TypeScript
-
Internationalisierung
- Middleware-basierte Locale-Detection
- Browser-Sprach-Erkennung
- URL-basierte Locale-Verwaltung
-
Blog-System
- Markdown-basiert ohne CMS
- Frontmatter für Metadaten
- Static Generation für optimale Performance
-
Dark Mode
- System-Präferenz-Unterstützung
- LocalStorage-Persistenz
- Smooth Theme-Transitions
-
Performance
- Lighthouse Score 95+
- Core Web Vitals optimiert
- Automatische Image-Optimierung
Best Practices
- Type-Safety: TypeScript für alle Components
- Component-Struktur: Wiederverwendbare, modulare Components
- Accessibility: Semantic HTML, ARIA-Labels
- SEO: Meta-Tags, Sitemap, Structured Data
- Code-Qualität: ESLint, Prettier, Konsistente Formatierung
Fazit
Sigitec ist mehr als nur ein Portfolio - es ist eine Demonstration moderner Frontend-Entwicklung mit Next.js, TypeScript und Tailwind CSS. Das Projekt zeigt meine Fähigkeiten in:
- Full-Stack Development: Next.js Server Components + Static Generation
- Internationalisierung: Mehrsprachige Anwendungen
- Content Management: Markdown-basiertes Blog-System
- Performance-Optimierung: Lighthouse Score 95+
- Design & UX: Responsive Design, Dark Mode, Animationen
- DevOps: CI/CD, Vercel Deployment
Technische Highlights:
- Type-Safe TypeScript-Architektur
- Server-Side Rendering + Static Generation
- Markdown-basiertes Blog ohne CMS
- Automatische Image-Optimierung
- Accessibility-First Approach
Live-Website: sigitec.dev GitHub Repository: github.com/DarkSekki/sigitec
Erstellt am 2026-01-06