feat: Add professional portfolio images and Hero redesign

- Add 15 optimized WebP images for portfolio (21-53KB each)
- Redesign Hero section with full-width background image
- Add SSR support for Hero component
- Update About section with new portrait image
- Update Contact page with professional headshot
- Add images to Services/Leistungen page
- Add image optimization script (sharp)
- Update translations for gallery section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-19 23:33:28 +01:00
co-authored by Claude Opus 4.5
parent b1ec7b4d61
commit 87c7ebc5e3
75 changed files with 10271 additions and 1314 deletions
+145
View File
@@ -0,0 +1,145 @@
import { MetadataRoute } from 'next';
import { locales } from '@/i18n/config';
import { getAllCitySlugs } from '@/data/cities';
import { getAllServiceSlugs } from '@/data/services';
const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://damjan-savic.com';
// Blog slugs
const blogSlugs = [
'n8n-automatisierung-tutorial',
'geo-generative-engine-optimization',
'gpt-api-integration-praxisguide',
'ki-agenten-unternehmen-guide',
'n8n-make-zapier-vergleich',
'voice-ai-kundenservice-trends',
'saas-mvp-entwicklung-4-wochen',
'erp-integration-breuninger',
];
// Portfolio slugs
const portfolioSlugs = [
'ai-data-reader',
'smart-warehouse',
'website-mit-ki',
'power-platform-governance',
'automated-ad-creatives',
'kamenpro',
'ai-music-production',
'cursor-ide',
];
function generateAlternates(path: string) {
const alternates: { [key: string]: string } = {
// x-default zeigt auf deutsche Version als Fallback
'x-default': `${BASE_URL}${path || '/'}`,
};
locales.forEach((locale) => {
const localePath = locale === 'de' ? path : `/${locale}${path}`;
alternates[locale] = `${BASE_URL}${localePath}`;
});
return alternates;
}
export default function sitemap(): MetadataRoute.Sitemap {
const today = new Date().toISOString().split('T')[0];
const sitemap: MetadataRoute.Sitemap = [];
// Static pages
const staticPages = [
{ path: '', priority: 1.0, changeFrequency: 'weekly' as const },
{ path: '/about', priority: 0.8, changeFrequency: 'monthly' as const },
{ path: '/portfolio', priority: 0.9, changeFrequency: 'weekly' as const },
{ path: '/blog', priority: 0.9, changeFrequency: 'weekly' as const },
{ path: '/contact', priority: 0.8, changeFrequency: 'monthly' as const },
{ path: '/leistungen', priority: 0.9, changeFrequency: 'weekly' as const },
{ path: '/privacy', priority: 0.3, changeFrequency: 'yearly' as const },
{ path: '/terms', priority: 0.3, changeFrequency: 'yearly' as const },
{ path: '/imprint', priority: 0.3, changeFrequency: 'yearly' as const },
];
// Add static pages for all locales
staticPages.forEach((page) => {
locales.forEach((locale) => {
const localePath = locale === 'de' ? page.path : `/${locale}${page.path}`;
sitemap.push({
url: `${BASE_URL}${localePath || '/'}`,
lastModified: today,
changeFrequency: page.changeFrequency,
priority: page.priority,
alternates: {
languages: generateAlternates(page.path),
},
});
});
});
// Add service pages
const serviceSlugs = getAllServiceSlugs();
serviceSlugs.forEach((slug) => {
locales.forEach((locale) => {
const localePath = locale === 'de' ? `/leistungen/${slug}` : `/${locale}/leistungen/${slug}`;
sitemap.push({
url: `${BASE_URL}${localePath}`,
lastModified: today,
changeFrequency: 'monthly',
priority: 0.8,
alternates: {
languages: generateAlternates(`/leistungen/${slug}`),
},
});
});
});
// Add city pages
const citySlugs = getAllCitySlugs();
citySlugs.forEach((slug) => {
locales.forEach((locale) => {
const localePath = locale === 'de' ? `/leistungen/standort/${slug}` : `/${locale}/leistungen/standort/${slug}`;
sitemap.push({
url: `${BASE_URL}${localePath}`,
lastModified: today,
changeFrequency: 'monthly',
priority: 0.7,
alternates: {
languages: generateAlternates(`/leistungen/standort/${slug}`),
},
});
});
});
// Add blog posts
blogSlugs.forEach((slug) => {
locales.forEach((locale) => {
const localePath = locale === 'de' ? `/blog/${slug}` : `/${locale}/blog/${slug}`;
sitemap.push({
url: `${BASE_URL}${localePath}`,
lastModified: today,
changeFrequency: 'monthly',
priority: 0.7,
alternates: {
languages: generateAlternates(`/blog/${slug}`),
},
});
});
});
// Add portfolio projects
portfolioSlugs.forEach((slug) => {
locales.forEach((locale) => {
const localePath = locale === 'de' ? `/portfolio/${slug}` : `/${locale}/portfolio/${slug}`;
sitemap.push({
url: `${BASE_URL}${localePath}`,
lastModified: today,
changeFrequency: 'monthly',
priority: 0.8,
alternates: {
languages: generateAlternates(`/portfolio/${slug}`),
},
});
});
});
return sitemap;
}