TypeScript 97.6%
SQL 1.4%
JavaScript 0.5%
1import type { Metadata, Viewport } from "next";2import { Geist, Geist_Mono } from "next/font/google";3import "./globals.css";4import { Providers } from "@/components/shell/providers";5import { apiServer } from "@/lib/api-server";6import type { PublicUser, UserSettings, WalletView } from "@spinza/shared";78const geist = Geist({ subsets: ["latin"], variable: "--font-geist-sans", display: "swap" });9const geistMono = Geist_Mono({ subsets: ["latin"], variable: "--font-geist-mono", display: "swap" });1011const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? "https://www.spinza.dev";1213export const metadata: Metadata = {14 metadataBase: new URL(siteUrl),15 title: { default: "Spinza — The Virtual Casino Playground", template: "%s · Spinza" },16 description: "Play original Spinza games using free fictional credits. No deposits. No withdrawals. No cash value.",17 applicationName: "Spinza",18 openGraph: { title: "Spinza — The Virtual Casino Playground", description: "Play original Spinza games using free fictional credits. No deposits. No withdrawals. No cash value.", url: siteUrl, siteName: "Spinza", type: "website", images: ["/og.png"] },19 twitter: { card: "summary_large_image", title: "Spinza — The Virtual Casino Playground", description: "Original games. Fictional credits. No cash value." },20 icons: { icon: "/icon.svg", apple: "/apple-icon.png" },21 manifest: "/manifest.webmanifest",22 robots: { index: true, follow: true },23};2425export const viewport: Viewport = {26 themeColor: "#07080c",27 width: "device-width",28 initialScale: 1,29 viewportFit: "cover",30 maximumScale: 1,31};3233export default async function RootLayout({ children }: { children: React.ReactNode }) {34 const session = await apiServer<{ user: PublicUser; wallet: WalletView; settings: UserSettings }>("/api/user");35 return (36 <html lang="en" className={`${geist.variable} ${geistMono.variable}`}>37 <body>38 <Providers session={session}>{children}</Providers>39 </body>40 </html>41 );42}43