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
+81
View File
@@ -0,0 +1,81 @@
import { useTranslation } from 'react-i18next';
import SEO from '../components/SEO';
import PageTransition from '../components/PageTransition';
import Breadcrumbs from '../components/Breadcrumbs';
const TermsPage = () => {
const { t } = useTranslation();
const schema = {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: 'Terms of Service',
description: 'Terms of Service for Damjan Savić\'s portfolio website'
};
return (
<PageTransition>
<SEO
title="Terms of Service"
description="Terms of Service for Damjan Savić's portfolio website"
schema={schema}
/>
<div className="py-24">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<Breadcrumbs currentTitle="Terms of Service" />
<h1 className="text-4xl font-bold mb-8">Terms of Service</h1>
<div className="prose prose-invert max-w-none">
<p className="text-lg mb-8">Last updated: March 10, 2024</p>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">1. Agreement to Terms</h2>
<p>By accessing our website, you agree to be bound by these Terms of Service and to comply with all applicable laws and regulations.</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">2. Intellectual Property Rights</h2>
<p>All content on this website, including but not limited to text, graphics, logos, images, and software, is the property of Damjan Savić and is protected by intellectual property laws.</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">3. User Responsibilities</h2>
<p>When using our website, you agree to:</p>
<ul className="list-disc list-inside mb-4">
<li>Provide accurate information</li>
<li>Use the website legally and ethically</li>
<li>Not attempt to gain unauthorized access</li>
<li>Not interfere with the website's operation</li>
</ul>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">4. Limitation of Liability</h2>
<p>We shall not be liable for any indirect, incidental, special, consequential, or punitive damages resulting from your use of or inability to use the website.</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">5. Changes to Terms</h2>
<p>We reserve the right to modify these terms at any time. We will notify users of any material changes by posting the new Terms of Service on this page.</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">6. Governing Law</h2>
<p>These terms shall be governed by and construed in accordance with the laws of Germany, without regard to its conflict of law provisions.</p>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">7. Contact Information</h2>
<p>For any questions about these Terms of Service, please contact us at:</p>
<p>Email: legal@damjan-savic.com</p>
<p>Address: {t('contact.address')}</p>
</section>
</div>
</div>
</div>
</PageTransition>
);
};
export default TermsPage;