app/root.tsx (73 lines of code) (raw):

import { Links, Meta, Outlet, Scripts, ScrollRestoration, } from "@remix-run/react"; import type { LinksFunction } from "@remix-run/node"; import { ThemeProvider } from "~/lib/theme"; import { AuthProvider } from "~/lib/authContext"; import "./tailwind.css"; export const links: LinksFunction = () => [ { rel: "preconnect", href: "https://fonts.googleapis.com" }, { rel: "preconnect", href: "https://fonts.gstatic.com", crossOrigin: "anonymous", }, { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap", }, { rel: "stylesheet", href: "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css", integrity: "sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==", crossOrigin: "anonymous", }, ]; export function Layout({ children }: { children: React.ReactNode }) { return ( <html lang="en" className=""> <head> <meta charSet="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <Meta /> <Links /> {/* Prevent theme flicker by applying theme before render */} <script dangerouslySetInnerHTML={{ __html: ` (function() { try { var theme = localStorage.getItem('theme'); var systemDark = window.matchMedia('(prefers-color-scheme: dark)').matches; var shouldBeDark = theme === 'dark' || (theme !== 'light' && systemDark); if (shouldBeDark) { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } } catch (e) {} })(); `, }} /> </head> <body> {children} <ScrollRestoration /> <Scripts /> </body> </html> ); } export default function App() { return ( <ThemeProvider> <AuthProvider> <Outlet /> </AuthProvider> </ThemeProvider> ); }