import type { Metadata, Viewport } from "next"; import { Fraunces, Inter, JetBrains_Mono } from "next/font/google"; import Link from "next/link"; import "./globals.css"; import { apiSafe, SITE_URL, type Meta } from "@/lib/api"; import { MobileNav, TopNav, Wordmark } from "@/components/shell"; import { StatusStrip } from "@/components/status-strip"; import { THEME_INIT_SCRIPT } from "@/components/theme"; import { Disclaimer } from "@/components/ui"; const inter = Inter({ subsets: ["latin"], variable: "--font-inter", display: "swap" }); const fraunces = Fraunces({ subsets: ["latin"], variable: "--font-fraunces", display: "swap", axes: ["opsz", "SOFT"] }); const jetbrains = JetBrains_Mono({ subsets: ["latin"], variable: "--font-jetbrains", display: "swap", weight: ["400", "500", "600"] }); export const metadata: Metadata = { metadataBase: new URL(SITE_URL), title: { default: "QC26 — Québec 2026. Comprendre. Prévoir. Suivre.", template: "%s | QC26" }, description: "Prévisions, sondages, marchés de prédiction, presse, boussole électorale et résultats en direct de l'élection québécoise du 5 octobre 2026.", applicationName: "QC26", openGraph: { type: "website", siteName: "QC26", locale: "fr_CA", url: SITE_URL, title: "QC26 — L'élection québécoise, en données", description: "Prévisions, sondages, signaux alternatifs, boussole électorale et résultats en direct de l'élection québécoise 2026." }, twitter: { card: "summary_large_image", title: "QC26", description: "L'élection québécoise 2026, en données." }, robots: { index: true, follow: true }, alternates: { canonical: "/" }, }; export const viewport: Viewport = { themeColor: "#f6f5f1", width: "device-width", initialScale: 1, viewportFit: "cover" }; export default async function RootLayout({ children }: { children: React.ReactNode }) { const meta = await apiSafe("/api/meta", { revalidate: 60 }); const mode = meta?.mode ?? "forecast"; const days = meta?.daysToElection ?? Math.ceil((new Date("2026-10-05T00:00:00-04:00").getTime() - Date.now()) / 86400000); return (