import type { Metadata } from "next"; import { Geist } from "next/font/google"; import "./globals.css"; import { createClient } from "@/lib/supabase/server"; import { COLOR_VARS, DEFAULT_COLORS, faviconUrl, SITE_TITLE } from "@/lib/types"; import packageJson from "@/package.json"; // Farben/Logo/Favicon sollen Änderungen sofort widerspiegeln. export const dynamic = "force-dynamic"; const geistSans = Geist({ variable: "--font-geist-sans", subsets: ["latin"], }); export async function generateMetadata(): Promise { const supabase = await createClient(); const { data: settings } = await supabase .from("settings") .select("favicon_path") .eq("id", 1) .maybeSingle(); return { title: SITE_TITLE, description: "Speisekarte der Betriebskantine", // Immer explizit setzen: app/favicon.ico würde sonst zusätzlich zu // einem eigenen Favicon eingebunden (Next.js kombiniert Datei- // Konvention und Metadata statt sie zu ersetzen). icons: { icon: faviconUrl(settings?.favicon_path) ?? "/favicon.ico" }, }; } export default async function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { const supabase = await createClient(); const { data: settings } = await supabase .from("settings") .select("colors") .eq("id", 1) .maybeSingle(); const colors: Record = { ...DEFAULT_COLORS, ...((settings?.colors as Record) ?? {}), }; const style = Object.fromEntries( Object.entries(COLOR_VARS).map(([key, cssVar]) => [cssVar, colors[key]]) ) as React.CSSProperties; return ( {children} ); }