All checks were successful
Gitea CI / test-build (push) Successful in 11m36s
- Remove framer-motion from Hero.tsx and HeaderClient.tsx, replace with CSS animations/transitions - Replace lucide-react icons (Menu, X, Mail) with inline SVGs in HeaderClient.tsx - Lazy-load About, Projects, Contact, Footer via dynamic() imports in ClientWrappers.tsx - Defer ShaderGradient/BackgroundBlobs loading via requestIdleCallback in ClientProviders.tsx - Remove AnimatePresence page wrapper that caused full re-renders - Enable experimental.optimizeCss (critters) for critical CSS inlining - Add fadeIn keyframe to Tailwind config for CSS-based animations Homepage JS reduced from 563KB to 438KB (-125KB). Eliminates ~39s main thread work from WebGL init and layout thrashing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
115 lines
3.0 KiB
TypeScript
115 lines
3.0 KiB
TypeScript
"use client";
|
|
|
|
/**
|
|
* Transitional Wrapper für bestehende Components
|
|
* Nutzt direkt JSON Messages statt komplexe Translation-Loader
|
|
*/
|
|
|
|
import { NextIntlClientProvider } from 'next-intl';
|
|
import dynamic from 'next/dynamic';
|
|
import Hero from './Hero';
|
|
import type {
|
|
HeroTranslations,
|
|
AboutTranslations,
|
|
ProjectsTranslations,
|
|
ContactTranslations,
|
|
FooterTranslations,
|
|
} from '@/types/translations';
|
|
import enMessages from '@/messages/en.json';
|
|
import deMessages from '@/messages/de.json';
|
|
|
|
// Lazy-load below-fold sections to reduce initial JS payload
|
|
const About = dynamic(() => import('./About'), { ssr: false });
|
|
const Projects = dynamic(() => import('./Projects'), { ssr: false });
|
|
const Contact = dynamic(() => import('./Contact'), { ssr: false });
|
|
const Footer = dynamic(() => import('./Footer'), { ssr: false });
|
|
|
|
const messageMap = { en: enMessages, de: deMessages };
|
|
|
|
function getNormalizedLocale(locale: string): 'en' | 'de' {
|
|
return locale.startsWith('de') ? 'de' : 'en';
|
|
}
|
|
|
|
export function HeroClient({ locale }: { locale: string; translations: HeroTranslations }) {
|
|
const normalLocale = getNormalizedLocale(locale);
|
|
const baseMessages = messageMap[normalLocale];
|
|
|
|
const messages = {
|
|
home: {
|
|
hero: baseMessages.home.hero
|
|
}
|
|
};
|
|
|
|
return (
|
|
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
<Hero />
|
|
</NextIntlClientProvider>
|
|
);
|
|
}
|
|
|
|
export function AboutClient({ locale }: { locale: string; translations: AboutTranslations }) {
|
|
const normalLocale = getNormalizedLocale(locale);
|
|
const baseMessages = messageMap[normalLocale];
|
|
|
|
const messages = {
|
|
home: {
|
|
about: baseMessages.home.about
|
|
}
|
|
};
|
|
|
|
return (
|
|
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
<About />
|
|
</NextIntlClientProvider>
|
|
);
|
|
}
|
|
|
|
export function ProjectsClient({ locale }: { locale: string; translations: ProjectsTranslations }) {
|
|
const normalLocale = getNormalizedLocale(locale);
|
|
const baseMessages = messageMap[normalLocale];
|
|
|
|
const messages = {
|
|
home: {
|
|
projects: baseMessages.home.projects
|
|
}
|
|
};
|
|
|
|
return (
|
|
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
<Projects />
|
|
</NextIntlClientProvider>
|
|
);
|
|
}
|
|
|
|
export function ContactClient({ locale }: { locale: string; translations: ContactTranslations }) {
|
|
const normalLocale = getNormalizedLocale(locale);
|
|
const baseMessages = messageMap[normalLocale];
|
|
|
|
const messages = {
|
|
home: {
|
|
contact: baseMessages.home.contact
|
|
}
|
|
};
|
|
|
|
return (
|
|
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
<Contact />
|
|
</NextIntlClientProvider>
|
|
);
|
|
}
|
|
|
|
export function FooterClient({ locale }: { locale: string; translations: FooterTranslations }) {
|
|
const normalLocale = getNormalizedLocale(locale);
|
|
const baseMessages = messageMap[normalLocale];
|
|
|
|
const messages = {
|
|
footer: baseMessages.footer
|
|
};
|
|
|
|
return (
|
|
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
<Footer />
|
|
</NextIntlClientProvider>
|
|
);
|
|
}
|