Basis: Certvia dev@a48c5fb als Fundament für Craftvia
Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
import type { Metadata, Viewport } from "next";
|
||||
import localFont from "next/font/local";
|
||||
import { NextIntlClientProvider } from "next-intl";
|
||||
import { getLocale } from "next-intl/server";
|
||||
import { BRAND, BRAND_ASSETS, BRAND_COLORS } from "@/lib/brand";
|
||||
import "./globals.css";
|
||||
|
||||
// Selbst gehostet über next/font/local (committete woff2 in ./fonts) — kein
|
||||
// Google-Fonts-Fetch zur Build- oder Laufzeit. DSGVO-konform und macht den
|
||||
// Produktiv-Build reproduzierbar/offline (next/font/google lud die Schriften
|
||||
// sonst zur Build-Zeit von Google, was flakig fehlschlagen kann).
|
||||
const openSans = localFont({
|
||||
variable: "--font-open-sans",
|
||||
display: "swap",
|
||||
src: [
|
||||
{ path: "./fonts/open-sans-300.woff2", weight: "300", style: "normal" },
|
||||
{ path: "./fonts/open-sans-400.woff2", weight: "400", style: "normal" },
|
||||
{ path: "./fonts/open-sans-600.woff2", weight: "600", style: "normal" },
|
||||
{ path: "./fonts/open-sans-700.woff2", weight: "700", style: "normal" },
|
||||
],
|
||||
});
|
||||
|
||||
const poppins = localFont({
|
||||
variable: "--font-poppins",
|
||||
display: "swap",
|
||||
src: [
|
||||
{ path: "./fonts/poppins-300.woff2", weight: "300", style: "normal" },
|
||||
{ path: "./fonts/poppins-500.woff2", weight: "500", style: "normal" },
|
||||
{ path: "./fonts/poppins-600.woff2", weight: "600", style: "normal" },
|
||||
{ path: "./fonts/poppins-700.woff2", weight: "700", style: "normal" },
|
||||
],
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
// Untertitel-Muster: Unterseiten setzen nur ihren eigenen Titel, die Marke hängt an.
|
||||
title: { default: `${BRAND.name} — ${BRAND.tagline}`, template: `%s · ${BRAND.name}` },
|
||||
description: BRAND.description,
|
||||
applicationName: BRAND.name,
|
||||
manifest: "/site.webmanifest",
|
||||
// Alle Icons aus dem Certvia-Asset-Bundle (public/favicon + public/assets/logo).
|
||||
icons: {
|
||||
icon: [
|
||||
{ url: "/favicon.ico", sizes: "any" },
|
||||
{ url: BRAND_ASSETS.favicon, type: "image/svg+xml" },
|
||||
{ url: "/favicon/icon-16.png", type: "image/png", sizes: "16x16" },
|
||||
{ url: "/favicon/icon-32.png", type: "image/png", sizes: "32x32" },
|
||||
],
|
||||
apple: [{ url: "/favicon/apple-touch-icon-180.png", sizes: "180x180" }],
|
||||
},
|
||||
appleWebApp: { capable: true, title: BRAND.name, statusBarStyle: "black-translucent" },
|
||||
openGraph: {
|
||||
type: "website",
|
||||
siteName: BRAND.name,
|
||||
title: `${BRAND.name} — ${BRAND.tagline}`,
|
||||
description: BRAND.description,
|
||||
images: [{ url: "/assets/logo/certvia-lockup-positiv-1024.png", width: 1024, height: 259 }],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: `${BRAND.name} — ${BRAND.tagline}`,
|
||||
description: BRAND.description,
|
||||
images: ["/assets/logo/certvia-lockup-positiv-1024.png"],
|
||||
},
|
||||
};
|
||||
|
||||
export const viewport: Viewport = {
|
||||
// Marken-Violett (wie auf der Certvia-Website), nicht die UI-Primärfarbe.
|
||||
themeColor: BRAND_COLORS.violet,
|
||||
};
|
||||
|
||||
export default async function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
const locale = await getLocale();
|
||||
|
||||
return (
|
||||
<html
|
||||
lang={locale}
|
||||
className={`${openSans.variable} ${poppins.variable} h-full antialiased`}
|
||||
>
|
||||
<body className="min-h-full flex flex-col bg-background text-foreground">
|
||||
<NextIntlClientProvider>{children}</NextIntlClientProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user