/** * Root layout — site header with portfolio-style navigation. * Shows all subpages + standalone albums as nav links. * Injects theme CSS custom properties from gallery.yaml config. */ import type { Metadata } from 'next'; import Link from 'next/link'; import './globals.css'; import { SubpageNav } from '@/components/SubpageNav'; import { ThemeToggle } from '@/components/ThemeToggle'; import { ScrollToTop } from '@/components/ScrollToTop'; import { Footer } from '@/components/Footer'; import { DevToolbar } from '@/components/DevToolbar'; import { getConfig, getGoogleFontsUrl } from '@/lib/config'; const siteTitle = process.env.SITE_TITLE || 'Gallery'; const siteDescription = 'A curated photography portfolio'; export const metadata: Metadata = { title: siteTitle, description: siteDescription, icons: { apple: '/apple-touch-icon.png', }, openGraph: { title: siteTitle, description: siteDescription, type: 'website', images: [`/api/og?title=${encodeURIComponent(siteTitle)}`], }, twitter: { card: 'summary_large_image', title: siteTitle, description: siteDescription, images: [`/api/og?title=${encodeURIComponent(siteTitle)}`], }, }; export default function RootLayout({ children }: { children: React.ReactNode }) { const config = getConfig(); const { theme } = config; const fontsUrl = getGoogleFontsUrl(theme); // Inject theme values as CSS custom properties const themeVars: Record = { '--accent': theme.accent, '--accent-dim': `${theme.accent}1f`, '--font-serif': `'${theme.fonts.heading}', Georgia, 'Times New Roman', serif`, '--font-sans': `'${theme.fonts.body}', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif`, '--font-caption': `'${theme.fonts.caption}', Georgia, serif`, '--radius-sm': `${theme.radius}px`, '--radius-md': `${Math.round(theme.radius * 1.5)}px`, '--radius-lg': `${theme.radius * 2}px`, }; return (
{children}