layout.tsx 1.3 KB

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