layout.tsx 2.3 KB

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