import type { Metadata, Viewport } from "next"; import { headers } from "next/headers"; import { Manrope, Source_Sans_3 } from "next/font/google"; import { TRPCProvider } from "~/lib/trpc/provider.js"; import { ServiceWorkerRegistration } from "~/components/layout/ServiceWorkerRegistration.js"; import { InstallPrompt } from "~/components/layout/InstallPrompt.js"; import "./globals.css"; const uiFont = Source_Sans_3({ subsets: ["latin"], variable: "--font-ui", display: "swap", }); const displayFont = Manrope({ subsets: ["latin"], variable: "--font-display", display: "swap", }); export const metadata: Metadata = { metadataBase: new URL("https://nexus.hartmut-noerenberg.com"), title: "Nexus — Resource & Capacity Planning", description: "Interactive resource planning and project staffing tool", manifest: "/manifest.json", icons: { icon: [ { url: "/favicon.svg", type: "image/svg+xml" }, { url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" }, { url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" }, { url: "/favicon.ico" }, ], apple: [{ url: "/apple-touch-icon.png", sizes: "180x180" }], }, appleWebApp: { capable: true, statusBarStyle: "default", title: "Nexus", }, openGraph: { title: "Nexus — Resource & Capacity Planning", description: "Estimates, staffing, chargeability, and timelines in one workspace.", images: [{ url: "/og-image.png", width: 1024, height: 1024, alt: "Nexus Logo" }], type: "website", }, twitter: { card: "summary_large_image", title: "Nexus — Resource & Capacity Planning", description: "Estimates, staffing, chargeability, and timelines in one workspace.", images: ["/og-image.png"], }, }; export const viewport: Viewport = { themeColor: "#0284c7", }; export default async function RootLayout({ children }: { children: React.ReactNode }) { const nonce = (await headers()).get("x-nonce") ?? undefined; return (