/** href builders — single place for every internal route, so entity pages can be added later without touching callers. */ export const SITE_URL = (process.env.NEXT_PUBLIC_SITE_URL ?? "https://www.datacenterindex.io").replace(/\/$/, ""); export const routes = { home: () => "/", map: (qs?: string) => (qs ? `/map?${qs}` : "/map"), search: (q?: string) => (q ? `/search?q=${encodeURIComponent(q)}` : "/search"), live: (qs?: string) => (qs ? `/live?${qs}` : "/live"), datacenters: (qs?: string) => (qs ? `/datacenters?${qs}` : "/datacenters"), facility: (slug: string) => `/datacenters/${slug}`, operators: () => "/operators", operator: (slug: string) => `/operators/${slug}`, countries: () => "/countries", country: (slug: string) => `/countries/${slug}`, markets: () => "/datacenters/markets", market: (slug: string) => `/datacenters/markets/${slug}`, projects: (qs?: string) => (qs ? `/projects?${qs}` : "/projects"), project: (slug: string) => `/projects/${slug}`, rankings: (key?: string) => (key ? `/rankings#${key}` : "/rankings"), ranking: (key: string) => `/rankings/${key}`, bot: () => "/bot", cloudRegions: () => "/cloud-regions", cloudRegion: (slug: string) => `/cloud-regions/${slug}`, ixps: () => "/ixps", ixp: (slug: string) => `/ixps/${slug}`, sources: () => "/sources", source: (id: string) => `/sources/${id}`, methodology: () => "/methodology", about: () => "/about", apiDocs: () => "/api/v1/docs", // 2026-09-12 — intelligence graph ai: () => "/ai-infrastructure", pulse: (qs?: string) => (qs ? `/pulse?${qs}` : "/pulse"), explore: (qs?: string) => (qs ? `/explore?${qs}` : "/explore"), compareOperators: (slugs?: string[]) => (slugs?.length ? `/compare/operators?slugs=${slugs.map(encodeURIComponent).join(",")}` : "/compare/operators"), coverage: () => "/coverage", power: () => "/power", connectivity: () => "/connectivity", download: () => "/download", apiDocsPage: () => "/developers", watchlist: () => "/watchlist", timeMachine: () => "/map?layer=facilities&time=1", } as const; /** Entity link from an event / generic (type, slug). Unknown types fall back to search. */ export function entityHref(type: string, slug: string | null | undefined, name?: string): string { if (!slug) return routes.search(name); switch (type) { case "facility": case "campus": return routes.facility(slug); case "operator": case "company": case "carrier": return routes.operator(slug); case "country": return routes.country(slug); case "metro": case "city": return routes.market(slug); case "project": case "construction_phase": case "expansion": return routes.project(slug); case "cloud_region": return routes.cloudRegion(slug); case "ixp": return routes.ixp(slug); case "source": return routes.source(slug); default: return routes.search(name ?? slug); } } /** Desktop primary navigation (spec §101): Map · Facilities · Markets · Operators · Projects · AI · Live, then "More". */ export const NAV_PRIMARY = [ { label: "Map", href: routes.map() }, { label: "Facilities", href: routes.datacenters() }, { label: "Markets", href: routes.markets() }, { label: "Operators", href: routes.operators() }, { label: "Projects", href: routes.projects() }, { label: "AI", href: routes.ai() }, { label: "Live", href: routes.live() }, ] as const; /** "More" menu: countries, cloud, IXPs, power, connectivity, rankings, pulse, explore, compare, coverage, sources, methodology, API, downloads. */ export const NAV_MORE = [ { label: "Countries", href: routes.countries() }, { label: "Cloud regions", href: routes.cloudRegions() }, { label: "Internet exchanges", href: routes.ixps() }, { label: "Power & grid", href: routes.power() }, { label: "Connectivity", href: routes.connectivity() }, { label: "Rankings", href: routes.rankings() }, { label: "Pulse", href: routes.pulse() }, { label: "Explore", href: routes.explore() }, { label: "Compare operators", href: routes.compareOperators() }, { label: "Coverage", href: routes.coverage() }, { label: "Watchlist", href: routes.watchlist() }, { label: "Sources", href: routes.sources() }, { label: "Methodology", href: routes.methodology() }, { label: "Downloads", href: routes.download() }, { label: "API", href: routes.apiDocsPage() }, { label: "About", href: routes.about() }, ] as const;