Files
portfolio/app/layout.tsx
T
denshooter 31560a712f
CI / CD / test-build (push) Failing after 5m43s
CI / CD / deploy-dev (push) Has been skipped
CI / CD / deploy-production (push) Has been skipped
feat: comprehensive UI/a11y/i18n fixes and pre-push quality test
- Fix ClientWrappers missing 'about' namespace (MISSING_MESSAGE error)
- Add system/light/dark theme toggle with prefers-color-scheme detection
- Rewrite 404 page with i18n, accessibility, and proper navigation
- Rewrite books page with Header/Footer, i18n, and semantic HTML
- Add i18n keys to About, Footer, and both locale files
- Fix dark mode contrast: text-stone-300/600 -> text-stone-400
- Replace raw hex bg-[#fdfcf8] with bg-stone-50 across all components
- Guard console.error in ChatWidget and manage/page behind NODE_ENV
- Add aria-label to admin login form
- Remove emoji from manage page password toggle
- Update stale dates in privacy-policy and legal-notice
- Fix ScrollFadeIn index->delay prop type error in books page
- Fix privacy-policy and legal-notice landmark structure
- Add pre-push-check.test.ts: 13-category static analysis
  (i18n parity, namespace coverage, key resolution, accessibility,
   email validation, hex colors, emojis, console guards, env docs, types)
- Add explicit i18n check step to CI workflow
2026-05-14 15:42:52 +02:00

130 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import "./globals.css";
import { Metadata } from "next";
import { Inter, Playfair_Display } from "next/font/google";
import React from "react";
import ClientProviders from "./components/ClientProviders";
import ShaderGradientBackground from "./components/ShaderGradientBackground";
import { cookies } from "next/headers";
import { getBaseUrl } from "@/lib/seo";
const inter = Inter({
variable: "--font-inter",
subsets: ["latin"],
display: "swap",
adjustFontFallback: true,
});
const playfair = Playfair_Display({
variable: "--font-playfair",
subsets: ["latin"],
display: "swap",
adjustFontFallback: true,
});
export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const cookieStore = await cookies();
const locale = cookieStore.get("NEXT_LOCALE")?.value || "en";
return (
<html lang={locale} suppressHydrationWarning>
<head>
<meta charSet="utf-8" />
<link rel="preconnect" href="https://assets.hardcover.app" />
<link rel="preconnect" href="https://cms.dk0.dev" />
{/* Prevent flash of unstyled theme — reads localStorage + system preference before React hydrates */}
<script dangerouslySetInnerHTML={{ __html: `try{var t=localStorage.getItem('theme');var d=t==='dark'||((!t||t==='system')&&window.matchMedia('(prefers-color-scheme:dark)').matches);if(d)document.documentElement.classList.add('dark');}catch(e){}` }} />
</head>
<body className={`${inter.variable} ${playfair.variable}`} suppressHydrationWarning>
<div className="grain-overlay" aria-hidden="true" />
<ShaderGradientBackground />
<ClientProviders>{children}</ClientProviders>
</body>
</html>
);
}
export const metadata: Metadata = {
metadataBase: new URL(getBaseUrl()),
title: {
default: "Dennis Konkol",
template: "%s | dk0",
},
description:
"Dennis Konkol Software Engineer & Webentwickler in Osnabrück. Webentwicklung, Fullstack-Apps, Docker, Next.js, Flutter. Portfolio mit Projekten und Kontakt.",
keywords: [
"Dennis Konkol",
"dk0",
"denshooter",
"Webentwicklung Osnabrück",
"Webentwicklung",
"Softwareentwicklung Osnabrück",
"Website erstellen Osnabrück",
"Web Design Osnabrück",
"Informatik Osnabrück",
"Software Engineer",
"Full Stack Developer",
"Frontend Developer Osnabrück",
"Next.js",
"React",
"TypeScript",
"Flutter",
"Docker",
"Self-Hosting",
"DevOps",
"Portfolio",
"Osnabrück",
],
authors: [{ name: "Dennis Konkol", url: "https://dk0.dev" }],
creator: "Dennis Konkol",
publisher: "Dennis Konkol",
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
},
openGraph: {
title: "Dennis Konkol",
description:
"Software Engineer & Webentwickler in Osnabrück. Next.js, Flutter, Docker, DevOps. Projekte ansehen und Kontakt aufnehmen.",
url: "https://dk0.dev",
siteName: "Dennis Konkol",
images: [
{
url: "https://dk0.dev/api/og",
width: 1200,
height: 630,
alt: "Dennis Konkol",
},
],
locale: "de_DE",
alternateLocale: ["en_US"],
type: "website",
},
twitter: {
card: "summary_large_image",
title: "Dennis Konkol",
description: "Software Engineer & Webentwickler in Osnabrück.",
images: ["https://dk0.dev/api/og"],
creator: "@denshooter",
},
verification: {
google: process.env.NEXT_PUBLIC_GOOGLE_VERIFICATION,
},
alternates: {
canonical: "https://dk0.dev",
languages: {
de: "https://dk0.dev/de",
en: "https://dk0.dev/en",
},
},
};