layout.tsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import type { Metadata } from "next";
  2. import localFont from "next/font/local";
  3. import "./globals.css";
  4. import { Header } from "@/components/header";
  5. import { Footer } from "@/components/footer";
  6. import { ThemeProvider } from "@/components/theme-provider";
  7. import { Analytics } from "@vercel/analytics/next";
  8. const geistSans = localFont({
  9. src: "./fonts/GeistVF.woff",
  10. variable: "--font-geist-sans",
  11. });
  12. const geistMono = localFont({
  13. src: "./fonts/GeistMonoVF.woff",
  14. variable: "--font-geist-mono",
  15. });
  16. export const metadata: Metadata = {
  17. title: "json-render | AI-powered UI from JSON with guardrails",
  18. description:
  19. "Define a catalog. AI generates JSON. Your components render natively. Enterprise-grade guardrails for controlled AI UI generation.",
  20. };
  21. export default function RootLayout({
  22. children,
  23. }: Readonly<{
  24. children: React.ReactNode;
  25. }>) {
  26. return (
  27. <html lang="en" suppressHydrationWarning>
  28. <body className={`${geistSans.variable} ${geistMono.variable}`}>
  29. <ThemeProvider>
  30. <div className="min-h-screen flex flex-col">
  31. <Header />
  32. <main className="flex-1">{children}</main>
  33. <Footer />
  34. </div>
  35. </ThemeProvider>
  36. <Analytics />
  37. </body>
  38. </html>
  39. );
  40. }