diff --git a/app/globals.css b/app/globals.css
index 6d03cff..2eeb26a 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -60,6 +60,22 @@
padding: 104px 24px 96px; /* 56px header + 48px original padding */
}
+/* Simple CSS Page Fade-In (Replaces Framer Motion) */
+[data-transitions='true'] .main {
+ animation: page-fade-in 0.5s ease-out forwards;
+}
+
+@keyframes page-fade-in {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
/* Homepage hero + About page use full bleed — override main padding */
.main:has(.hero),
.main:has(.about) {
diff --git a/app/impressum/page.tsx b/app/impressum/page.tsx
index b4e072f..039ae51 100644
--- a/app/impressum/page.tsx
+++ b/app/impressum/page.tsx
@@ -7,6 +7,7 @@ import { Metadata } from 'next';
import { notFound } from 'next/navigation';
import { getConfig } from '@/lib/config';
import { BackLink } from '@/components/BackLink';
+import { FadeIn } from '@/components/FadeIn';
import './impressum.css';
export const metadata: Metadata = {
@@ -25,68 +26,72 @@ export default function ImpressumPage() {
- Impressum
- Angaben gemäß § 5 TMG
+
+ Impressum
+ Angaben gemäß § 5 TMG
+
-
- Anschrift
-
- {legal.name}
-
- {legal.address}
-
- {legal.zipCity}
-
- {legal.country}
-
-
-
- {(legal.email || legal.phone) && (
+
- Kontakt
+ Anschrift
- {legal.email && (
- <>
- E-Mail: {legal.email}
-
- >
- )}
- {legal.phone && <>Telefon: {legal.phone}>}
+ {legal.name}
+
+ {legal.address}
+
+ {legal.zipCity}
+
+ {legal.country}
- )}
- {(legal.taxId || legal.vatId) && (
-
-
- Steuernummer
-
-
- {legal.taxId && (
- <>
- Steuernummer: {legal.taxId}
-
- >
- )}
- {legal.vatId && <>Umsatzsteuer-ID: {legal.vatId}>}
-
+ {(legal.email || legal.phone) && (
+
+ Kontakt
+
+ {legal.email && (
+ <>
+ E-Mail: {legal.email}
+
+ >
+ )}
+ {legal.phone && <>Telefon: {legal.phone}>}
+
+
+ )}
+
+ {(legal.taxId || legal.vatId) && (
+
+
+ Steuernummer
+
+
+ {legal.taxId && (
+ <>
+ Steuernummer: {legal.taxId}
+
+ >
+ )}
+ {legal.vatId && <>Umsatzsteuer-ID: {legal.vatId}>}
+
+
+ )}
+
+ {legal.extraInfo && (
+
+
+ Weitere Informationen
+
+ {legal.extraInfo}
+
+ )}
+
+
+ Quelle: Erstellt mit dem Impressum-Generator von eRecht24.
- )}
-
- {legal.extraInfo && (
-
-
- Weitere Informationen
-
- {legal.extraInfo}
-
- )}
-
-
- Quelle: Erstellt mit dem Impressum-Generator von eRecht24.
-
+
);
diff --git a/app/layout.tsx b/app/layout.tsx
index 5fd7bc3..e867853 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -63,6 +63,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
data-grain={theme.grain}
data-header-dot={theme.headerDot}
data-photo-frame={theme.photoFrame}
+ data-transitions={config.transitions}
>
diff --git a/content/settings.yaml.example b/content/settings.yaml.example
index fcd2786..6c99b32 100644
--- a/content/settings.yaml.example
+++ b/content/settings.yaml.example
@@ -12,6 +12,9 @@ exifOnHover: true
# Enable the interactive world map view (/map)
map: true
+# Enable smooth page transitions between routes
+transitions: true
+
# ── Theme configuration ──────────────────────────────────────────
# Presets: studio, minimal, editorial, classic, noir, monograph, botanica
theme:
diff --git a/lib/config.ts b/lib/config.ts
index 655e5c6..cd2e075 100644
--- a/lib/config.ts
+++ b/lib/config.ts
@@ -156,6 +156,7 @@ interface SettingsYaml {
subtitle?: string;
exifOnHover?: boolean;
map?: boolean;
+ transitions?: boolean;
theme?:
| string
| {
@@ -258,6 +259,8 @@ export interface AppConfig {
legal: LegalConfig;
/** Show the /map page. Default: false. */
map: boolean;
+ /** Enable page transitions between routes. Default: true. */
+ transitions: boolean;
/** Explicit album name overrides from gallery.yaml. */
albumOverrides: Record;
cacheTtl: number;
@@ -502,6 +505,7 @@ export function getConfig(): AppConfig {
extraInfo: settings.legal?.extraInfo,
},
map: settings.map === true,
+ transitions: settings.transitions !== false,
albumOverrides,
cacheTtl: env.CACHE_TTL * 1000,
rateLimitRpm: env.RATE_LIMIT_RPM,