layout.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import type { Metadata } from "next";
  2. import localFont from "next/font/local";
  3. import "./globals.css";
  4. import { ThemeProvider } from "@/components/theme-provider";
  5. import { Analytics } from "@vercel/analytics/next";
  6. import { SpeedInsights } from "@vercel/speed-insights/next";
  7. import { PAGE_TITLES } from "@/lib/page-titles";
  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. metadataBase: new URL("https://json-render.dev"),
  18. title: {
  19. default: `json-render | ${PAGE_TITLES[""]}`,
  20. template: "%s | json-render",
  21. },
  22. description:
  23. "The framework for User-Generated Interfaces (UGI). Let users generate dashboards, widgets, and apps from prompts — safely constrained to components you define.",
  24. keywords: [
  25. "json-render",
  26. "UGI",
  27. "User-Generated Interfaces",
  28. "AI UI generation",
  29. "generative UI",
  30. "React components",
  31. "React Native",
  32. "guardrails",
  33. "structured output",
  34. "dashboard builder",
  35. ],
  36. authors: [{ name: "Vercel Labs" }],
  37. creator: "Vercel Labs",
  38. openGraph: {
  39. type: "website",
  40. locale: "en_US",
  41. url: "https://json-render.dev",
  42. siteName: "json-render",
  43. title: "json-render | The framework for User-Generated Interfaces",
  44. description:
  45. "The framework for User-Generated Interfaces (UGI). Let users generate dashboards, widgets, and apps from prompts — safely constrained to components you define.",
  46. images: [
  47. {
  48. url: "/og",
  49. width: 1200,
  50. height: 630,
  51. alt: "json-render - The framework for User-Generated Interfaces",
  52. },
  53. ],
  54. },
  55. twitter: {
  56. card: "summary_large_image",
  57. title: "json-render | The framework for User-Generated Interfaces",
  58. description:
  59. "The framework for User-Generated Interfaces (UGI). Let users generate dashboards, widgets, and apps from prompts — safely constrained to components you define.",
  60. images: ["/og"],
  61. creator: "@verabornnot",
  62. },
  63. robots: {
  64. index: true,
  65. follow: true,
  66. },
  67. icons: {
  68. icon: "/favicon.ico",
  69. },
  70. };
  71. export default function RootLayout({
  72. children,
  73. }: Readonly<{
  74. children: React.ReactNode;
  75. }>) {
  76. return (
  77. <html lang="en" suppressHydrationWarning>
  78. <body className={`${geistSans.variable} ${geistMono.variable}`}>
  79. <ThemeProvider>{children}</ThemeProvider>
  80. <Analytics />
  81. <SpeedInsights />
  82. </body>
  83. </html>
  84. );
  85. }