SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
4 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
4.6 KB · 97 lines tsx
Raw Blame History
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