9a82a3b0e7
- New design tokens: signal red, ink and paper as RGB channels; ink and paper swap roles in dark mode so every component inverts cleanly - Fonts via next/font: Bricolage Grotesque (with wdth/opsz axes), Geist, Geist Mono; drop Inter and Playfair - Poster hero: kicker, giant DK0 wordmark that reacts to pointer distance (weight and width through a damped spring, desktop only, off for reduced motion), claim as h1, intro with thesis countdown, marquee strip - Header in poster style: transparent over the red hero, paper strip with ink rule when scrolled or on subpages; drawer menu restyled - Remove wavy SVG separators, CSS shader gradient, background blobs and unused providers that caused the pink/purple bands between sections - Drop the global p/span/div color override so colors inherit properly - New hero texts in de/en, tests and i18n key check updated Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
112 lines
3.4 KiB
TypeScript
112 lines
3.4 KiB
TypeScript
import Header from "../components/Header.server";
|
|
import Hero from "../components/Hero";
|
|
import ScrollFadeIn from "../components/ScrollFadeIn";
|
|
import Script from "next/script";
|
|
import {
|
|
getAboutTranslations,
|
|
getProjectsTranslations,
|
|
getContactTranslations,
|
|
getFooterTranslations,
|
|
} from "@/lib/translations-loader";
|
|
import {
|
|
AboutClient,
|
|
ProjectsClient,
|
|
ContactClient,
|
|
FooterClient,
|
|
} from "../components/ClientWrappers";
|
|
|
|
interface HomePageServerProps {
|
|
locale: string;
|
|
}
|
|
|
|
export default async function HomePageServer({ locale }: HomePageServerProps) {
|
|
// Parallel laden aller Translations (hero translations handled by Hero server component)
|
|
const [aboutT, projectsT, contactT, footerT] = await Promise.all([
|
|
getAboutTranslations(locale),
|
|
getProjectsTranslations(locale),
|
|
getContactTranslations(locale),
|
|
getFooterTranslations(locale),
|
|
]);
|
|
|
|
return (
|
|
<div className="min-h-screen">
|
|
<Script
|
|
id={"structured-data-person"}
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{
|
|
__html: JSON.stringify({
|
|
"@context": "https://schema.org",
|
|
"@type": "Person",
|
|
name: "Dennis Konkol",
|
|
alternateName: ["dk0", "denshooter"],
|
|
url: "https://dk0.dev",
|
|
jobTitle: "Software Engineer",
|
|
description:
|
|
locale === "de"
|
|
? "Software Engineer & Webentwickler in Osnabrück. Webentwicklung, Fullstack-Apps, Docker, Next.js, Flutter."
|
|
: "Software Engineer & Web Developer in Osnabrück, Germany. Web development, fullstack apps, Docker, Next.js, Flutter.",
|
|
address: {
|
|
"@type": "PostalAddress",
|
|
addressLocality: "Osnabrück",
|
|
addressRegion: "Niedersachsen",
|
|
addressCountry: "DE",
|
|
},
|
|
knowsAbout: [
|
|
"Webentwicklung",
|
|
"Web Development",
|
|
"Next.js",
|
|
"React",
|
|
"TypeScript",
|
|
"Flutter",
|
|
"Docker",
|
|
"DevOps",
|
|
"Self-Hosting",
|
|
"CI/CD",
|
|
"Fullstack Development",
|
|
"Softwareentwicklung",
|
|
"Informatik",
|
|
],
|
|
sameAs: [
|
|
"https://github.com/Denshooter",
|
|
"https://linkedin.com/in/dkonkol",
|
|
],
|
|
}),
|
|
}}
|
|
/>
|
|
<Script
|
|
id={"structured-data-website"}
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{
|
|
__html: JSON.stringify({
|
|
"@context": "https://schema.org",
|
|
"@type": "WebSite",
|
|
name: "Dennis Konkol",
|
|
alternateName: "dk0.dev",
|
|
url: "https://dk0.dev",
|
|
inLanguage: ["de", "en"],
|
|
}),
|
|
}}
|
|
/>
|
|
<Header locale={locale} />
|
|
<main className="relative">
|
|
<Hero locale={locale} />
|
|
|
|
<ScrollFadeIn>
|
|
<AboutClient locale={locale} translations={aboutT} />
|
|
</ScrollFadeIn>
|
|
|
|
<ScrollFadeIn>
|
|
<ProjectsClient locale={locale} translations={projectsT} />
|
|
</ScrollFadeIn>
|
|
|
|
<ScrollFadeIn>
|
|
<ContactClient locale={locale} translations={contactT} />
|
|
</ScrollFadeIn>
|
|
</main>
|
|
<ScrollFadeIn>
|
|
<FooterClient locale={locale} translations={footerT} />
|
|
</ScrollFadeIn>
|
|
</div>
|
|
);
|
|
}
|