Fix: Fonts selbst hosten (next/font/local) + Bootstrap an Superadmin-Store anpassen

- next/font/google lud Open Sans/Poppins zur Build-Zeit von Google -> flakiger
  'Failed to fetch from Google Fonts' bricht den Prod-Build ab. Jetzt committete
  woff2 (src/app/fonts) via next/font/local -> reproduzierbarer Offline-Build, DSGVO.
- scripts/bootstrap-admin.ts: provisionTenant nimmt kein isPlatformAdmin mehr; der
  Superadmin ist jetzt das eigene Modell platformAdmin (Login /platform/login, MFA).
  Bootstrap legt Mandant+Mandanten-Admin UND platformAdmin an (idempotent).
- node:22-Docker-Build lokal verifiziert (kompiliert + TypeCheck + Routen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-27 22:32:52 +02:00
co-authored by Claude Opus 4.8
parent cc8d48698f
commit f368d8fadd
10 changed files with 51 additions and 35 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+21 -8
View File
@@ -1,20 +1,33 @@
import type { Metadata } from "next";
import { Open_Sans, Poppins } from "next/font/google";
import localFont from "next/font/local";
import { NextIntlClientProvider } from "next-intl";
import { getLocale } from "next-intl/server";
import "./globals.css";
// Self-hosted über next/font (kein Google-CDN-Aufruf zur Laufzeit, DSGVO)
const openSans = Open_Sans({
// 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",
subsets: ["latin"],
weight: ["300", "400", "600", "700"],
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 = Poppins({
const poppins = localFont({
variable: "--font-poppins",
subsets: ["latin"],
weight: ["300", "500", "600", "700"],
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 = {