import type { Metadata, Viewport } from "next"; import { Inter } from "next/font/google"; import { Toaster } from "sonner"; import "./globals.css"; import { OG_IMAGE_ALT, SITE_DESCRIPTION, SITE_KEYWORDS, SITE_NAME, SITE_TAGLINE, SITE_URL, } from "@/lib/seo/site-config"; const inter = Inter({ variable: "--font-sans", subsets: ["latin"], }); // Consolidated site-wide metadata. Page-specific metadata (landing, // auth pages, etc.) override the narrower fields (title, description, // robots); defaults defined here are inherited everywhere else so we // never ship a page without OpenGraph / Twitter coverage. export const metadata: Metadata = { metadataBase: new URL(SITE_URL), title: { default: `${SITE_NAME} — ${SITE_TAGLINE}`, template: `%s — ${SITE_NAME}`, }, description: SITE_DESCRIPTION, keywords: SITE_KEYWORDS, applicationName: SITE_NAME, authors: [{ name: SITE_NAME, url: SITE_URL }], creator: SITE_NAME, publisher: SITE_NAME, category: "Business Software", alternates: { canonical: "/", }, openGraph: { type: "website", siteName: SITE_NAME, title: `${SITE_NAME} — ${SITE_TAGLINE}`, description: SITE_DESCRIPTION, url: SITE_URL, locale: "en_US", images: [ { url: "/opengraph-image", width: 1200, height: 630, alt: OG_IMAGE_ALT, }, ], }, twitter: { card: "summary_large_image", title: `${SITE_NAME} — ${SITE_TAGLINE}`, description: SITE_DESCRIPTION, images: ["/opengraph-image"], }, robots: { index: true, follow: true, googleBot: { index: true, follow: true, "max-image-preview": "large", "max-snippet": -1, }, }, icons: { icon: [{ url: "/icon" }], shortcut: ["/favicon.ico"], }, formatDetection: { email: false, address: false, telephone: false, }, }; // Dark theme color for the mobile browser chrome. export const viewport: Viewport = { themeColor: "#020617", colorScheme: "dark", }; export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { return ( {children} ); }