layout.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import type { Metadata } from 'next';
  2. import localFont from 'next/font/local';
  3. import { GeistSans } from 'geist/font/sans';
  4. import { GeistMono } from 'geist/font/mono';
  5. import './globals.css';
  6. import 'animate.css';
  7. import 'katex/dist/katex.min.css';
  8. import { ThemeProvider } from '@/lib/hooks/use-theme';
  9. import { I18nProvider } from '@/lib/hooks/use-i18n';
  10. import { Toaster } from '@/components/ui/sonner';
  11. import { ServerProvidersInit } from '@/components/server-providers-init';
  12. const inter = localFont({
  13. src: '../node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2',
  14. variable: '--font-sans',
  15. weight: '100 900',
  16. });
  17. export const metadata: Metadata = {
  18. title: 'OpenMAIC',
  19. description:
  20. 'The open-source AI interactive classroom. Upload a PDF to instantly generate an immersive, multi-agent learning experience.',
  21. };
  22. export default function RootLayout({
  23. children,
  24. }: Readonly<{
  25. children: React.ReactNode;
  26. }>) {
  27. return (
  28. <html lang="en" className={inter.variable} suppressHydrationWarning>
  29. <body
  30. className={`${GeistSans.variable} ${GeistMono.variable} antialiased`}
  31. suppressHydrationWarning
  32. >
  33. <ThemeProvider>
  34. <I18nProvider>
  35. <ServerProvidersInit />
  36. {children}
  37. <Toaster position="top-center" />
  38. </I18nProvider>
  39. </ThemeProvider>
  40. </body>
  41. </html>
  42. );
  43. }