105 lines
2.2 KiB
TypeScript
105 lines
2.2 KiB
TypeScript
import CookieConsentBanner from "@/components/CookieConsent";
|
|
import type { Metadata, Viewport } from "next";
|
|
import { Manrope, Nunito_Sans } from "next/font/google";
|
|
import "./globals.css";
|
|
|
|
import Footer from "@/components/Footer";
|
|
import Header from "@/components/Header";
|
|
|
|
const nunitoSans = Nunito_Sans({
|
|
subsets: ["latin"],
|
|
weight: ["400", "600", "700"],
|
|
variable: "--font-body",
|
|
display: "swap",
|
|
});
|
|
|
|
const manrope = Manrope({
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600", "700"],
|
|
variable: "--font-heading",
|
|
display: "swap",
|
|
});
|
|
|
|
export const viewport: Viewport = {
|
|
width: "device-width",
|
|
initialScale: 1,
|
|
};
|
|
|
|
const siteName = "ENVU";
|
|
const title = "ENVU - Code Connect";
|
|
const description = "Wir bieten Ihnen maßgeschneiderte Lösungen.";
|
|
const siteUrl = "https://envu.de";
|
|
|
|
const ogImage = {
|
|
url: "/images/envu.png",
|
|
alt: "Envu Wallpaper",
|
|
width: 1200,
|
|
height: 628,
|
|
};
|
|
|
|
export const metadata: Metadata = {
|
|
metadataBase: new URL(siteUrl),
|
|
title: {
|
|
default: title,
|
|
template: `%s | ${siteName}`,
|
|
},
|
|
description,
|
|
keywords: "Envu, Hannover",
|
|
authors: [{ name: siteName }],
|
|
robots: "index, follow",
|
|
alternates: {
|
|
canonical: siteUrl,
|
|
},
|
|
appleWebApp: {
|
|
title: siteName,
|
|
},
|
|
openGraph: {
|
|
type: "website",
|
|
siteName,
|
|
locale: "de_DE",
|
|
title,
|
|
description,
|
|
images: [ogImage],
|
|
url: siteUrl,
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
site: "@envu",
|
|
title,
|
|
description,
|
|
images: [{ url: ogImage.url, alt: ogImage.alt }],
|
|
},
|
|
};
|
|
|
|
const jsonLd = {
|
|
"@context": "https://schema.org",
|
|
"@type": "LocalBusiness",
|
|
name: siteName,
|
|
url: siteUrl,
|
|
description,
|
|
address: {
|
|
"@type": "PostalAddress",
|
|
addressLocality: "Hannover",
|
|
addressCountry: "DE",
|
|
},
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{ children: React.ReactNode }>) {
|
|
return (
|
|
<html lang="de" className={`${nunitoSans.variable} ${manrope.variable}`}>
|
|
<body>
|
|
<script
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
|
/>
|
|
<Header />
|
|
{children}
|
|
<Footer />
|
|
<CookieConsentBanner />
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|