Files
portfolio/app/_ui/HomePageServer.tsx
T
denshooter 08e856120b feat: plakat redesign phase 3 (windows on desktop, sheets on mobile)
- Tapping an object on the desk opens a window (desktop) or a bottom sheet
  (mobile) instead of flipping: projects, now, servers, reading, about, contact
- Desktop windows in poster style (2px ink rule, hard offset shadow), open
  from the tapped object, thrown by the title bar with momentum and elastic
  viewport edges, stack by focus, minimize into a tray, Escape closes the top
  window, focus moves to close and returns to the trigger
- Mobile sheets via vaul 1.1.2: drag down to dismiss, overlay, focus trap
- Project window shows live/source links from Directus when present
- Hero "Write me" opens the contact window; still a plain #contact link
  without JavaScript
- Shared current-book loader for desk, deck and reading window
- Texts in de/en, i18n key check extended

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 18:56:48 +02:00

112 lines
3.5 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 {
getAboutTranslations,
getContactTranslations,
getFooterTranslations,
} from "@/lib/translations-loader";
import {
AboutClient,
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, contactT, footerT, windowLabels] = await Promise.all([
getAboutTranslations(locale),
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"],
}),
}}
/>
<Header locale={locale} />
<WindowProvider labels={windowLabels}>
<main className="relative">
<Hero locale={locale} />
<TischSection locale={locale} />
<ScrollFadeIn>
<AboutClient locale={locale} translations={aboutT} />
</ScrollFadeIn>
<ScrollFadeIn>
<ContactClient locale={locale} translations={contactT} />
</ScrollFadeIn>
</main>
<ScrollFadeIn>
<FooterClient locale={locale} translations={footerT} />
</ScrollFadeIn>
</WindowProvider>
</div>
);
}