layout.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. metadataBase: new URL("https://json-render.dev"),
  19. title: {
  20. default: "json-render | AI-generated UI with guardrails",
  21. template: "%s | json-render",
  22. },
  23. description:
  24. "Let users generate dashboards, widgets, apps, and data visualizations from prompts — safely constrained to components you define.",
  25. keywords: [
  26. "json-render",
  27. "AI UI generation",
  28. "React components",
  29. "guardrails",
  30. "structured output",
  31. "dashboard builder",
  32. ],
  33. authors: [{ name: "Vercel Labs" }],
  34. creator: "Vercel Labs",
  35. openGraph: {
  36. type: "website",
  37. locale: "en_US",
  38. url: "https://json-render.dev",
  39. siteName: "json-render",
  40. title: "json-render | AI-generated UI with guardrails",
  41. description:
  42. "Let users generate dashboards, widgets, apps, and data visualizations from prompts — safely constrained to components you define.",
  43. images: [
  44. {
  45. url: "/og",
  46. width: 1200,
  47. height: 630,
  48. alt: "json-render - AI-generated UI with guardrails",
  49. },
  50. ],
  51. },
  52. twitter: {
  53. card: "summary_large_image",
  54. title: "json-render | AI-generated UI with guardrails",
  55. description:
  56. "Let users generate dashboards, widgets, apps, and data visualizations from prompts — safely constrained to components you define.",
  57. images: ["/og"],
  58. creator: "@verabornnot",
  59. },
  60. robots: {
  61. index: true,
  62. follow: true,
  63. },
  64. icons: {
  65. icon: "/favicon.ico",
  66. },
  67. };
  68. export default function RootLayout({
  69. children,
  70. }: Readonly<{
  71. children: React.ReactNode;
  72. }>) {
  73. return (
  74. <html lang="en" suppressHydrationWarning>
  75. <body className={`${geistSans.variable} ${geistMono.variable}`}>
  76. <ThemeProvider>
  77. <div className="min-h-screen flex flex-col">
  78. <Header />
  79. <main className="flex-1">{children}</main>
  80. <Footer />
  81. </div>
  82. </ThemeProvider>
  83. <Analytics />
  84. <SpeedInsights />
  85. </body>
  86. </html>
  87. );
  88. }