9e6ae866d0
- AI chat moves into a window/sheet, opened from a new speech-bubble card on the desk; it now respects the chatbot consent and asks before sending anything to n8n (previously it ignored the consent) - Contact as red poster section with big mail address and the form on a paper card; validation errors are finally shown inline (aria-invalid, role=alert) - Footer as ink strip with dk0 wordmark, legal links and a button to reopen the privacy settings - "About me" in the header opens the about window on the home page - Remove the old About section and its parts (BentoChat, ActivityFeed, CurrentlyReading, ReadBooks), the unused ChatWidget, Projects and BentoGrid, their tests, wrappers, loaders, types and texts - scripts/directus-cleanup-redesign.mjs: dry run by default, --apply archives hobbies, tech stack categories and old content pages and deletes four unused message overrides after a full JSON backup; run only after the redesign is live on production Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
105 lines
3.3 KiB
TypeScript
105 lines
3.3 KiB
TypeScript
import Header from "../components/Header.server";
|
|
import Hero from "../components/Hero";
|
|
import TischSection from "../components/tisch/TischSection";
|
|
import WindowProvider from "../components/fenster/WindowProvider";
|
|
import { getWindowLabels } from "../components/fenster/getWindowLabels";
|
|
import ScrollFadeIn from "../components/ScrollFadeIn";
|
|
import Script from "next/script";
|
|
import {
|
|
getContactTranslations,
|
|
getFooterTranslations,
|
|
} from "@/lib/translations-loader";
|
|
import {
|
|
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 [contactT, footerT, windowLabels] = await Promise.all([
|
|
getContactTranslations(locale),
|
|
getFooterTranslations(locale),
|
|
getWindowLabels(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"],
|
|
}),
|
|
}}
|
|
/>
|
|
<WindowProvider labels={windowLabels}>
|
|
<Header locale={locale} />
|
|
<main className="relative">
|
|
<Hero locale={locale} />
|
|
<TischSection locale={locale} />
|
|
|
|
<ScrollFadeIn>
|
|
<ContactClient locale={locale} translations={contactT} />
|
|
</ScrollFadeIn>
|
|
</main>
|
|
<ScrollFadeIn>
|
|
<FooterClient locale={locale} translations={footerT} />
|
|
</ScrollFadeIn>
|
|
</WindowProvider>
|
|
</div>
|
|
);
|
|
}
|