Migrate from Vite to Next.js 15 with SSR

- Replace Vite + React Router with Next.js 15 App Router
- Implement i18n with next-intl (URL-based: /de, /en, /sr)
- Add SSR/SSG for all pages (48 static pages generated)
- Setup Supabase SSR client for auth
- Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms
- Add Docker support with standalone output
- Replace i18next with next-intl JSON translations
- Use next/image for optimized images

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-17 01:00:33 +01:00
co-authored by Claude Opus 4.5
parent a66f51b9a2
commit b1ec7b4d61
281 changed files with 8024 additions and 8901 deletions
+51
View File
@@ -0,0 +1,51 @@
import React from 'react';
import { Star, Quote } from 'lucide-react';
import ImageWithFallback from './ImageWithFallback';
interface TestimonialProps {
name: string;
role: string;
company: string;
image: string;
content: string;
rating: number;
}
const TestimonialCard: React.FC<TestimonialProps> = ({
name,
role,
company,
image,
content,
rating
}) => {
return (
<div className="bg-gray-900/50 p-6 rounded-xl relative">
<Quote className="absolute top-4 right-4 h-8 w-8 text-orange-500/20" />
<div className="flex items-center space-x-4 mb-4">
<ImageWithFallback
src={image}
alt={name}
className="w-12 h-12 rounded-full"
loading="lazy"
/>
<div>
<h3 className="font-semibold">{name}</h3>
<p className="text-sm text-white/60">{role} at {company}</p>
</div>
</div>
<div className="flex mb-4">
{[...Array(5)].map((_, i) => (
<Star
key={i}
className={`h-4 w-4 ${i < rating ? 'text-orange-500' : 'text-gray-600'}`}
fill={i < rating ? 'currentColor' : 'none'}
/>
))}
</div>
<p className="text-white/80">{content}</p>
</div>
);
};
export default TestimonialCard;