layout.tsx 2.6 KB

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