spb/datacenterindex
Public
HTML 53.9%
TypeScript 44.5%
JavaScript 0.6%
SQL 0.5%
1import type { Metadata, Viewport } from "next";2import { Inter, JetBrains_Mono } from "next/font/google";3import type { ReactNode } from "react";4import { CommandPalette } from "@/components/command-palette";5import { Header } from "@/components/header";6import { MobileNav } from "@/components/mobile-nav";7import { Providers } from "@/components/theme";8import { SITE_URL } from "@/lib/routes";9import "./globals.css";1011const inter = Inter({ subsets: ["latin"], variable: "--font-inter", display: "swap" });12const mono = JetBrains_Mono({ subsets: ["latin"], variable: "--font-jetbrains", display: "swap", weight: ["400", "500"] });1314const TITLE = "DataCenterIndex — The global index of data center infrastructure";15const DESCRIPTION = "Facilities, operators, cloud regions, markets, countries, projects, power and connectivity — every figure sourced, versioned and tracked in a live change feed.";1617export const metadata: Metadata = {18 metadataBase: new URL(SITE_URL),19 title: { default: TITLE, template: "%s · DataCenterIndex" },20 description: DESCRIPTION,21 applicationName: "DataCenterIndex",22 authors: [{ name: "Simon-Pierre Boucher", url: "mailto:contact@spboucher.ai" }],23 creator: "Simon-Pierre Boucher",24 keywords: ["data centers", "data center map", "hyperscale", "colocation", "cloud regions", "MW capacity", "construction pipeline", "digital infrastructure index"],25 alternates: { canonical: "/" },26 openGraph: { type: "website", siteName: "DataCenterIndex", url: SITE_URL, title: TITLE, description: DESCRIPTION, locale: "en_US" },27 twitter: { card: "summary_large_image", title: TITLE, description: DESCRIPTION },28 robots: { index: true, follow: true },29 category: "technology",30};3132export const viewport: Viewport = {33 themeColor: [34 { media: "(prefers-color-scheme: dark)", color: "#0b0f14" },35 { media: "(prefers-color-scheme: light)", color: "#f5f4f1" },36 ],37 width: "device-width",38 initialScale: 1,39 viewportFit: "cover",40};4142const jsonLd = {43 "@context": "https://schema.org",44 "@graph": [45 {46 "@type": "Organization",47 "@id": `${SITE_URL}/#org`,48 name: "DataCenterIndex",49 url: SITE_URL,50 logo: `${SITE_URL}/brand/logo-mark.svg`,51 email: "contact@spboucher.ai",52 founder: { "@type": "Person", name: "Simon-Pierre Boucher", email: "contact@spboucher.ai" },53 contactPoint: [{ "@type": "ContactPoint", email: "contact@spboucher.ai", contactType: "customer support", availableLanguage: ["en", "fr"] }],54 },55 {56 "@type": "WebSite",57 "@id": `${SITE_URL}/#website`,58 url: SITE_URL,59 name: "DataCenterIndex",60 description: DESCRIPTION,61 publisher: { "@id": `${SITE_URL}/#org` },62 potentialAction: { "@type": "SearchAction", target: { "@type": "EntryPoint", urlTemplate: `${SITE_URL}/search?q={search_term_string}` }, "query-input": "required name=search_term_string" },63 },64 ],65};6667export default function RootLayout({ children }: { children: ReactNode }) {68 return (69 <html lang="en" className={`${inter.variable} ${mono.variable}`} suppressHydrationWarning>70 <body className="min-h-dvh">71 <Providers>72 <a href="#main" className="sr-only focus:not-sr-only focus:fixed focus:left-2 focus:top-2 focus:z-[110] focus:rounded-sm focus:border focus:border-hair-2 focus:bg-surface focus:px-3 focus:py-2">73 Skip to content74 </a>75 <Header />76 {children}77 <MobileNav />78 <CommandPalette />79 </Providers>80 <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />81 </body>82 </html>83 );84}85