Performance: Mobile-Optimierungen für besseren PageSpeed

- Portrait-Bild von 1.2MB auf ~20KB optimiert (300px/600px + WebP)
- Hero-Animation entfernt für schnelleren LCP
- WebP srcset für alle Projekt-Bilder (6 Größen: 200-1200px)
- Korrekte sizes-Attribute für Mobile (350px statt 1200px)
- Supabase lazy laden via dynamischen Import
- Admin-Check verzögert mit requestIdleCallback
- Hauptbundle von 461KB auf 358KB reduziert

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-05 22:02:57 +01:00
co-authored by Claude Opus 4.5
parent 0145beeac5
commit 4b9e457f4a
145 changed files with 96 additions and 49 deletions
+20 -8
View File
@@ -12,7 +12,7 @@ import {
Phone,
LayoutDashboard,
} from "lucide-react";
import { supabase } from "../utils/supabaseClient";
// Supabase wird lazy geladen um Initial Bundle zu reduzieren
import { ContactInfo } from "./ContactInfo";
import { NavLink } from "./NavLink";
import LanguageSwitcher from "./LanguageSwitcher";
@@ -52,9 +52,21 @@ const Layout = ({ children }: LayoutProps) => {
setIsMenuOpen(!isMenuOpen);
};
// Prüfe Admin-Status und registriere den Scroll-Handler
// Scroll-Handler
useEffect(() => {
const handleScroll = () => {
setScrolled(window.scrollY > 0);
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
// Prüfe Admin-Status verzögert und lazy (nach Initial Render)
useEffect(() => {
const checkAdmin = async () => {
// Dynamischer Import von Supabase - wird erst geladen wenn benötigt
const { supabase } = await import("../utils/supabaseClient");
const { data, error } = await supabase.auth.getSession();
if (error) {
console.error("Error checking admin status:", error);
@@ -74,13 +86,13 @@ const Layout = ({ children }: LayoutProps) => {
setIsAdmin(adminData.isAdmin);
}
};
checkAdmin();
const handleScroll = () => {
setScrolled(window.scrollY > 0);
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
// Verzögere Admin-Check bis nach dem Initial Paint
if ('requestIdleCallback' in window) {
requestIdleCallback(() => checkAdmin());
} else {
setTimeout(checkAdmin, 2000);
}
}, []);
const navigationLinks = [