Repository Public
1import type { Metadata, Viewport } from "next";2import "./globals.css";3import { LocaleProvider } from "@/i18n";4import { requestLocale } from "@/lib/locale";5import { Toaster } from "@/components/ui";67export const metadata: Metadata = {8 title: { default: "SP Calendar", template: "%s · SP Calendar" },9 description: "Prise de rendez-vous — calendar.spboucher.ai",10 manifest: "/manifest.webmanifest",11 icons: { icon: "/icon.svg", apple: "/apple-touch-icon.png" },12 appleWebApp: { capable: true, title: "SP Calendar", statusBarStyle: "default" },13};14export const viewport: Viewport = {15 width: "device-width", initialScale: 1, viewportFit: "cover",16 themeColor: [{ media: "(prefers-color-scheme: light)", color: "#f4f4fa" }, { media: "(prefers-color-scheme: dark)", color: "#050508" }],17};1819// Applied before first paint so the theme never flashes: the stored choice wins, otherwise the system setting.20// The browser chrome colour is aligned with the result (the media-query metas only know the system setting).21const themeScript = `try{var t=localStorage.getItem("spcal:theme"),d=t?t==="dark":matchMedia("(prefers-color-scheme: dark)").matches;if(d)document.documentElement.dataset.theme="dark";if(t)document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll('meta[name="theme-color"]').forEach(function(m){m.content=d?"#050508":"#f4f4fa"})})}catch(e){}`;2223export default async function RootLayout({ children }: { children: React.ReactNode }) {24 const locale = await requestLocale();25 return (26 <html lang={locale === "fr" ? "fr-CA" : "en-CA"} suppressHydrationWarning>27 <head><script dangerouslySetInnerHTML={{ __html: themeScript }} /></head>28 <body>29 <LocaleProvider locale={locale}>30 {children}31 <Toaster />32 </LocaleProvider>33 </body>34 </html>35 );36}37