spb/datacenterindex
Public
HTML 53.9%
TypeScript 44.5%
JavaScript 0.6%
SQL 0.5%
1import Link from "next/link";2import { Logo } from "@/components/brand/logo";3import { routes } from "@/lib/routes";45export const ATTRIBUTION = "Data: PeeringDB, © OpenStreetMap contributors (ODbL), Wikidata, World Bank, operator, utility, planning and government sources";67// `plain` = served by the API (not a Next route) → plain <a>, no router prefetch.8const COLS: Array<{ title: string; links: Array<{ label: string; href: string; plain?: boolean }> }> = [9 {10 title: "Index",11 links: [12 { label: "Map", href: routes.map() },13 { label: "Facilities", href: routes.datacenters() },14 { label: "Markets", href: routes.markets() },15 { label: "Operators", href: routes.operators() },16 { label: "Countries", href: routes.countries() },17 { label: "Cloud regions", href: routes.cloudRegions() },18 { label: "Internet exchanges", href: routes.ixps() },19 { label: "Power & grid", href: routes.power() },20 { label: "Connectivity", href: routes.connectivity() },21 ],22 },23 {24 title: "Intelligence",25 links: [26 { label: "Live changes", href: routes.live() },27 { label: "Pulse", href: routes.pulse() },28 { label: "Projects & pipeline", href: routes.projects() },29 { label: "AI infrastructure", href: routes.ai() },30 { label: "Rankings", href: routes.rankings() },31 { label: "Explore", href: routes.explore() },32 { label: "Compare operators", href: routes.compareOperators() },33 { label: "Time machine", href: routes.timeMachine() },34 { label: "Watchlist", href: routes.watchlist() },35 ],36 },37 {38 title: "Reference",39 links: [40 { label: "Methodology", href: routes.methodology() },41 { label: "Coverage", href: routes.coverage() },42 { label: "Sources", href: routes.sources() },43 { label: "Downloads", href: routes.download() },44 { label: "API & developers", href: routes.apiDocsPage() },45 { label: "API reference", href: routes.apiDocs(), plain: true },46 { label: "Crawler policy", href: routes.bot() },47 { label: "About", href: routes.about() },48 ],49 },50];5152export function Footer({ compact }: { compact?: boolean }) {53 if (compact) return null;54 return (55 <footer className="mt-12 border-t border-hair bg-surface pb-20 md:pb-8">56 <div className="mx-auto w-full max-w-[1280px] px-3 sm:px-5 lg:px-8">57 <div className="grid grid-cols-2 gap-x-6 gap-y-8 py-8 sm:grid-cols-[1.4fr_1fr_1fr_1fr] sm:gap-8 [&>*:first-child]:col-span-2 sm:[&>*:first-child]:col-span-1">58 <div className="max-w-xs">59 <Logo size={20} />60 <p className="mt-3 text-[12.5px] leading-relaxed text-ink-3">The global index of data center infrastructure: facilities, campuses, operators, cloud regions, markets, projects, power and connectivity — provenance on every field, an evidence drawer behind every figure and a live change feed.</p>61 <p className="mt-3 text-[11.5px] text-ink-4">Published figures only. Estimates are marked ≈. Coverage gaps are shown, never filled.</p>62 </div>63 {COLS.map((c) => (64 <div key={c.title}>65 <div className="label-caps mb-2">{c.title}</div>66 <ul className="flex flex-col gap-1">67 {c.links.map((l) => (68 <li key={l.href}>69 {l.plain ? (70 <a href={l.href} className="inline-flex min-h-10 items-center text-[13px] text-ink-2 hover:text-ink sm:min-h-7">71 {l.label}72 </a>73 ) : (74 <Link href={l.href} className="inline-flex min-h-10 items-center text-[13px] text-ink-2 hover:text-ink sm:min-h-7">75 {l.label}76 </Link>77 )}78 </li>79 ))}80 </ul>81 </div>82 ))}83 </div>84 <div className="flex flex-col gap-2 border-t border-hair py-4 text-[11.5px] leading-relaxed text-ink-3">85 <p>86 Built by <span className="text-ink-2">Simon-Pierre Boucher</span> · <a href="mailto:contact@spboucher.ai" className="text-ink-2 hover:text-accent">contact@spboucher.ai</a> · Hosted on{" "}87 <a href="https://www.maclustr.io" target="_blank" rel="noopener noreferrer" className="text-ink-2 hover:text-accent">88 MacLustr (www.maclustr.io)89 </a>90 </p>91 <p>{ATTRIBUTION}. Figures marked ≈ are estimates or planned values; every value carries a source. © {new Date().getUTCFullYear()} DataCenterIndex.io.</p>92 </div>93 </div>94 </footer>95 );96}97