import type { Metadata, Viewport } from "next"; import { ChangelogButton } from "@/components/ChangelogButton"; import { CommandPalette } from "@/components/CommandPalette"; import { TopNav } from "@/components/TopNav"; import { getSessionUser } from "@/lib/auth/session"; import { APP_NAME, APP_TAGLINE, APP_VERSION } from "@/lib/config"; import "./globals.css"; /** * generateMetadata statt eines konstanten metadata-Objekts: nur so wird * APP_NAME zur Laufzeit gelesen. Ein konstanter Export waere beim Build * eingefroren und liesse sich im fertigen Docker-Image nicht mehr aendern. */ export async function generateMetadata(): Promise { return { title: { default: `${APP_NAME} – Vibe Coding Dashboard`, template: `%s · ${APP_NAME}`, }, description: "Uebersicht ueber alle Vibe-Coding Projekte: Status, Notizen und Live-Daten aus GitHub, GitLab und Gitea.", applicationName: APP_NAME, robots: { index: false, follow: false }, manifest: "/manifest.webmanifest", // iOS liest das Manifest nicht; dort braucht es diese Angaben einzeln. appleWebApp: { capable: true, title: APP_NAME, statusBarStyle: "black-translucent" }, // Beide Eintraege ausdruecklich: sobald hier etwas steht, ersetzt es den // Verweis, den Next aus app/icon.svg von selbst erzeugt. Ohne die erste // Zeile haette die Seite gar kein Symbol mehr und der Browser fiele auf // /favicon.ico zurueck – das es hier nicht gibt. icons: { icon: [ { url: "/icon.svg", type: "image/svg+xml" }, { url: "/icon-192.png", sizes: "192x192", type: "image/png" }, ], apple: "/apple-touch-icon.png", }, }; } export const viewport: Viewport = { themeColor: "#05060f", width: "device-width", initialScale: 1, // Die Seite reicht bis unter Statusleiste und Home-Anzeige; das ist noetig, // damit der Hintergrund im installierten Betrieb nicht an einem weissen // Balken endet. Was dadurch verdeckt wuerde, holen die env(safe-area-*) // in globals.css wieder heraus. viewportFit: "cover", }; export default async function RootLayout({ children, }: Readonly<{ children: React.ReactNode }>) { const user = await getSessionUser(); return (