/** * 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 { getConfig, getGoogleFontsUrl, AppConfig } from '@/lib/config'; // DevToolbarLoader ist eine Client Component (ssr: false nur dort erlaubt) import { DevToolbarLoader } from '@/components/DevToolbarLoader'; export async function generateMetadata(): Promise { const config = getConfig(); const siteTitle = config.seo.title; const siteDescription = config.seo.description; const robots = { index: !config.seo.noIndex, follow: !config.seo.noFollow, }; return { title: siteTitle, description: siteDescription, robots, 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); 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`, }; if ((config as AppConfig & { needsSetup?: boolean }).needsSetup) { return (

Setup Required

Immich Folio is running, but it looks like your configuration files or environment variables are missing.

To get started, follow these steps in your repository or mounted{' '} content/ volume:

  1. Copy .env.example to .env.local and fill in your Immich API URL and Key
  2. Copy settings.yaml.example to settings.yaml
  3. Copy gallery.yaml.example to gallery.yaml
  4. Copy about.md.example to about.md (optional)

Open gallery.yaml and add the album IDs you want to display, then{' '} restart your server.

); } return (
{children}