Files
portfolio/app/_ui/HomePageServer.tsx
denshooter 9e6ae866d0
CI / CD / test-build (push) Successful in 11m13s
CI / CD / deploy-dev (push) Successful in 2m25s
CI / CD / deploy-production (push) Has been skipped
feat: plakat redesign phase 4 (chat window, contact, footer, cleanup) (#77)
- 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>
2026-10-15 23:49:56 +02:00

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>
);
}