Kumasy-Marketing/app/layout.tsx
2026-09-20 01:52:28 +02:00

88 lines
2.7 KiB
TypeScript

import type { Metadata, Viewport } from "next";
import { Manrope, Plus_Jakarta_Sans } from "next/font/google";
import "./globals.css";
// DESIGN.md names Switzer / Basier Circle; neither ships on Google Fonts.
// These are the documented substitutes — Manrope for UI, Plus Jakarta Sans for
// display, which holds the tight negative tracking the brand depends on.
const switzer = Manrope({
variable: "--font-switzer-local",
subsets: ["latin"],
weight: ["400", "500", "600", "700"],
display: "swap",
});
const display = Plus_Jakarta_Sans({
variable: "--font-display-local",
subsets: ["latin"],
weight: ["500", "600"],
style: ["normal", "italic"],
display: "swap",
});
const SITE_URL = "https://kumasy.de";
export const metadata: Metadata = {
metadataBase: new URL(SITE_URL),
title: {
default: "Kumasy — Deine Kurse füllen und bezahlen sich von selbst.",
template: "%s · Kumasy",
},
description:
"Kumasy bündelt Kurse, Räume, Trainer, Buchungen und Zahlungen in einer Oberfläche. Deine Teilnehmer:innen buchen und bezahlen in unter zwei Minuten selbst — ohne DM, ohne Rückfrage, ohne Excel.",
keywords: [
"Kursverwaltung",
"Buchungssystem",
"Fitnessstudio Software",
"Yoga Studio Verwaltung",
"Kursbuchung",
"Stripe Zahlungen",
"GoBD",
"DSGVO",
],
alternates: { canonical: "/" },
openGraph: {
type: "website",
locale: "de_DE",
url: SITE_URL,
siteName: "Kumasy",
title: "Deine Kurse füllen und bezahlen sich von selbst.",
description:
"Kurse, Räume, Trainer, Buchungen und Zahlungen in einer Oberfläche. Jetzt auf die Warteliste.",
},
twitter: {
card: "summary_large_image",
title: "Kumasy — Deine Kurse füllen und bezahlen sich von selbst.",
description:
"Kurse, Räume, Trainer, Buchungen und Zahlungen in einer Oberfläche.",
},
icons: {
icon: "/favicon.ico",
apple: "/icons/apple-touch-icon.png",
},
robots: { index: true, follow: true },
};
export const viewport: Viewport = {
themeColor: "#ffffff",
colorScheme: "light",
};
export default function RootLayout({ children }: LayoutProps<"/">) {
return (
<html
lang="de"
className={`${switzer.variable} ${display.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col bg-canvas text-ink">
<a
href="#hauptinhalt"
className="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[100] focus:rounded-2xl focus:bg-canvas focus:px-5 focus:py-3 focus:text-body focus:font-medium focus:shadow-elevated"
>
Zum Hauptinhalt springen
</a>
{children}
</body>
</html>
);
}