feat(phase-1): Premium design system, CapitoliumPreloader, IndexSectionIndicator, Recipe Showcase Stage

- Full CSS rewrite: Warm Ivory/Gold/Steinkohle design tokens, Floema grid, easing library
- AuraMarbleBackground: fixed grain texture layer
- CapitoliumPreloader: fullscreen counter animation with slide-up exit
- LiquidOverlayMenu: fixed hamburger → fullscreen clip-path overlay with SlideUpTextHover nav links
- IndexSectionIndicator: fixed left-side section tracker with animated fill line
- Recipe Showcase Stage: GSAP ScrollTrigger pinned stage (images enter from right, exit left)
  with parallax inner-image effect, intro title, progress dots, hint line
- LenisSmoothScroll: CDN integration synced with GSAP ticker
- CapitoliumRevealButton: scaleY fill reveal on hover for all CTAs
- SlideUpTextHover: overlay nav links
- UnderlineExpandHover: footer + overlay footer links
- head.php: GSAP 3.12.5 + ScrollTrigger + Lenis 1.0.42 CDN; Playfair Display + Manrope fonts
- recipe.php: updated to new design system (btn-reveal, pill--gold, Lenis init)
- impressum.php / datenschutz.php: migrated to shared head.php partial
This commit is contained in:
2026-05-21 11:52:40 +02:00
parent 025f41fd18
commit 6c00e1a00d
8 changed files with 2145 additions and 1176 deletions
+33 -46
View File
@@ -1,34 +1,29 @@
<?php
require __DIR__ . '/helpers.php';
$lang = strtolower((string) (filter_input(INPUT_GET, 'lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: 'en')) === 'de' ? 'de' : 'en';
$lang = strtolower((string)(filter_input(INPUT_GET, 'lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: 'en')) === 'de' ? 'de' : 'en';
$settings = load_site_settings();
$privacy = $settings['privacy'][$lang] ?? ($settings['privacy']['en'] ?? []);
$privacy = $settings['privacy'][$lang] ?? ($settings['privacy']['en'] ?? []);
$langSwitchLabel = $lang === 'de' ? 'DE' : 'EN';
$langSwitchHref = lang_url($lang === 'de' ? 'en' : 'de');
$navHome = $lang === 'de' ? 'Start' : 'Home';
$navLatest = $lang === 'de' ? 'Neueste' : 'Latest';
$navBasics = $lang === 'de' ? 'Basics' : 'Basics';
$langSwitchHref = lang_url($lang === 'de' ? 'en' : 'de');
$t = [
'title' => $lang === 'de' ? 'Datenschutzerklärung' : 'Privacy Policy',
'title' => $lang === 'de' ? 'Datenschutzerklärung' : 'Privacy Policy',
'controller' => $lang === 'de' ? 'Verantwortlicher' : 'Controller',
'address' => $lang === 'de' ? 'Adresse' : 'Address',
'contact' => $lang === 'de' ? 'Kontakt für Datenschutz' : 'Privacy contact',
'hosting' => $lang === 'de' ? 'Hosting' : 'Hosting',
'logs' => $lang === 'de' ? 'Server-Logs' : 'Server logs',
'cookies' => $lang === 'de' ? 'Cookies' : 'Cookies',
'purposes' => $lang === 'de' ? 'Zwecke der Datenverarbeitung' : 'Purposes of processing',
'rights' => $lang === 'de' ? 'Ihre Rechte' : 'Your rights',
'address' => $lang === 'de' ? 'Adresse' : 'Address',
'contact' => $lang === 'de' ? 'Kontakt für Datenschutz' : 'Privacy contact',
'hosting' => $lang === 'de' ? 'Hosting' : 'Hosting',
'logs' => $lang === 'de' ? 'Server-Logs' : 'Server logs',
'cookies' => $lang === 'de' ? 'Cookies' : 'Cookies',
'purposes' => $lang === 'de' ? 'Zwecke der Datenverarbeitung' : 'Purposes of processing',
'rights' => $lang === 'de' ? 'Ihre Rechte' : 'Your rights',
'last_updated' => $lang === 'de' ? 'Stand' : 'Last updated',
];
function privacy_item(string $label, ?string $value): void {
$value = trim((string) $value);
if ($value === '') {
return;
}
if ($value === '') return;
echo '<div class="legal-item"><span class="legal-label">' . e($label) . '</span><span>' . nl2br(e($value)) . '</span></div>';
}
@@ -43,29 +38,15 @@ if (!empty($privacy['log_retention_days'])) {
: 'Server logs (IP address, timestamp, URL, user agent) are kept for security and deleted after ')
. intval($privacy['log_retention_days']) . ($lang === 'de' ? ' Tagen gelöscht.' : ' days.');
}
$pageTitle = e($t['title']) . ' | FlixCooks';
$description = $lang === 'de'
? 'Informationen gemäß DSGVO und TKG über die Verarbeitung personenbezogener Daten.'
: 'Information per GDPR and TKG on how personal data is processed.';
include __DIR__ . '/partials/head.php';
include __DIR__ . '/partials/header.php';
?>
<!doctype html>
<html lang="<?php echo e($lang); ?>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo e($t['title']); ?> | FlixCooks</title>
<link rel="stylesheet" href="/assets/style.css">
<style>
.legal-page { max-width: 900px; margin: 40px auto 80px; padding: 0 16px; }
.legal-card { background: var(--surface-2); border-radius: 16px; padding: 24px; box-shadow: var(--shadow); border: 1px solid rgba(255,255,255,0.08); }
.legal-item { display: grid; grid-template-columns: 220px 1fr; gap: 10px; padding: 10px 0; border-bottom: 1px solid rgba(255,255,255,0.08); }
.legal-item:last-child { border-bottom: none; }
.legal-label { font-weight: 700; color: var(--ink); }
.legal-section { margin-top: 22px; }
.legal-section h2 { margin: 0 0 8px; }
@media (max-width: 600px) {
.legal-item { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<?php include __DIR__ . '/partials/header.php'; ?>
<main class="legal-page">
<h1><?php echo e($t['title']); ?></h1>
<p><?php echo $lang === 'de'
@@ -76,17 +57,23 @@ if (!empty($privacy['log_retention_days'])) {
<h2><?php echo e($t['controller']); ?></h2>
<?php
privacy_item($t['controller'], $privacy['controller'] ?? '');
privacy_item($t['address'], $privacy['address'] ?? '');
privacy_item($t['contact'], ($privacy['contact_email'] ?? '') . ($privacy['contact_phone'] ? ' | ' . $privacy['contact_phone'] : ''));
privacy_item($t['hosting'], $privacy['hosting_provider'] ?? '');
privacy_item($t['purposes'], $privacy['purposes'] ?? '');
privacy_item($t['address'], $privacy['address'] ?? '');
privacy_item($t['contact'], ($privacy['contact_email'] ?? '') . ($privacy['contact_phone'] ? ' | ' . $privacy['contact_phone'] : ''));
privacy_item($t['hosting'], $privacy['hosting_provider'] ?? '');
privacy_item($t['purposes'], $privacy['purposes'] ?? '');
if ($logInfo) { privacy_item($t['logs'], $logInfo); }
privacy_item($t['cookies'], $privacy['cookie_statement'] ?? '');
privacy_item($t['rights'], $rights);
privacy_item($t['rights'], $rights);
privacy_item($t['last_updated'], $privacy['last_updated'] ?? '');
?>
</div>
</main>
<?php include __DIR__ . '/partials/footer.php'; ?>
</body>
</html>
<script>
if (typeof Lenis !== 'undefined') {
var lenis = new Lenis({ duration: 1.2, smooth: true, smoothTouch: false });
window.lenis = lenis;
function raf(t) { lenis.raf(t); requestAnimationFrame(raf); }
requestAnimationFrame(raf);
}
</script>