| 1 | import type { Metadata } from "next"; |
| 2 | import { Inter } from "next/font/google"; |
| 3 | import "./globals.css"; |
| 4 | import { SiteNav } from "@/components/site-nav"; |
| 5 | import { SiteFooter } from "@/components/site-footer"; |
| 6 | |
| 7 | const inter = Inter({ |
| 8 | subsets: ["latin"], |
| 9 | variable: "--font-inter", |
| 10 | display: "swap", |
| 11 | }); |
| 12 | |
| 13 | const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://getsiti.5mb.app"; |
| 14 | |
| 15 | export const metadata: Metadata = { |
| 16 | metadataBase: new URL(SITE_URL), |
| 17 | title: { |
| 18 | default: "Siti AI: a private on-device AI assistant", |
| 19 | template: "%s · Siti AI", |
| 20 | }, |
| 21 | description: |
| 22 | "Siti AI is a private, on-device AI assistant for macOS and iOS. Your conversations stay on your device.", |
| 23 | openGraph: { |
| 24 | title: "Siti AI: a private on-device AI assistant", |
| 25 | description: |
| 26 | "A private, on-device AI assistant for macOS and iOS. Your conversations stay on your device.", |
| 27 | url: SITE_URL, |
| 28 | siteName: "Siti AI", |
| 29 | type: "website", |
| 30 | }, |
| 31 | twitter: { |
| 32 | card: "summary_large_image", |
| 33 | title: "Siti AI: a private on-device AI assistant", |
| 34 | description: |
| 35 | "A private, on-device AI assistant for macOS and iOS. Your conversations stay on your device.", |
| 36 | }, |
| 37 | }; |
| 38 | |
| 39 | export default function RootLayout({ |
| 40 | children, |
| 41 | }: Readonly<{ children: React.ReactNode }>) { |
| 42 | return ( |
| 43 | <html lang="en" className={inter.variable}> |
| 44 | <body className="flex min-h-screen flex-col bg-bg text-ink"> |
| 45 | <SiteNav /> |
| 46 | <main className="flex-1">{children}</main> |
| 47 | <SiteFooter /> |
| 48 | </body> |
| 49 | </html> |
| 50 | ); |
| 51 | } |