import type { Metadata, Viewport } from 'next'; import type { ReactNode } from 'react'; import { I18nProvider } from '../src/i18n'; import '../src/index.css'; export const metadata: Metadata = { title: 'Open Design', icons: { icon: '/app-icon.svg', // Safari pinned-tab mask icon — Next.js's Metadata API doesn't have a // dedicated `mask` field, so we surface it via the generic `other` // bucket which renders as a raw . other: [{ rel: 'mask-icon', url: '/app-icon.svg', color: '#363636' }], }, }; export const viewport: Viewport = { themeColor: '#F4EFE6', }; /** * Inline script that runs before React hydrates to apply the saved theme * preference without a flash of unstyled content. It reads the same * localStorage key used by `state/config.ts` and sets `data-theme` on * `` immediately — before any CSS or React paint. */ const themeInitScript = `(function(){try{var t=JSON.parse(localStorage.getItem('open-design:config')||'{}').theme;if(t==='light'||t==='dark')document.documentElement.setAttribute('data-theme',t);}catch(e){}})();`; export default function RootLayout({ children }: { children: ReactNode }) { return ( {/* eslint-disable-next-line @next/next/no-sync-scripts */}
{/* biome-ignore lint/security/noDangerouslySetInnerHtml: intentional theme-init inline script to prevent FOUC */}