/** Site-wide constants: names, URLs, navigation, route builders. Server- and client-safe (no 'use client'). */ export const SITE_NAME = 'Company Atlas'; export const TAGLINE = 'The Live Atlas of Global Companies'; export const DESCRIPTION = 'Company Atlas continuously observes the public web to track how companies evolve — products, hiring, pricing, leadership, locations, technology, strategy and more.'; export const ALT_TAGLINE = 'Thousands of companies. Millions of observations. One continuously growing historical record.'; export const SITE_URL = (process.env.NEXT_PUBLIC_SITE_URL ?? 'https://www.company-atlas.co').replace(/\/$/, ''); export const PUBLIC_API_BASE = `${SITE_URL}/api/v1`; export const AUTHOR_NAME = 'Simon-Pierre Boucher'; export const CONTACT_EMAIL = 'contact@spboucher.ai'; export const HOST_NAME = 'MacLustr'; export const HOST_URL = 'https://www.maclustr.io'; export const BOT_UA = 'CompanyAtlasBot'; export const THEME_LIGHT = '#f7f7f4'; export const THEME_DARK = '#0a0d12'; export type NavItem = { href: string; label: string; hint?: string }; export const primaryNav: NavItem[] = [ { href: '/', label: 'Home' }, { href: '/live', label: 'Live' }, { href: '/companies', label: 'Companies' }, { href: '/events', label: 'Events' }, { href: '/rankings', label: 'Rankings' }, { href: '/industry', label: 'Industries' }, { href: '/country', label: 'Countries' }, ]; export const footerGroups: { label: string; items: NavItem[] }[] = [ { label: 'Atlas', items: [ { href: '/companies', label: 'Companies' }, { href: '/events', label: 'Events' }, { href: '/live', label: 'Live feed' }, { href: '/rankings', label: 'Rankings' }, { href: '/industry', label: 'Industries' }, { href: '/country', label: 'Countries' }, { href: '/company/compare', label: 'Compare' }, ], }, { label: 'Data', items: [ { href: '/api', label: 'API & exports' }, { href: '/methodology', label: 'Methodology' }, { href: '/system', label: 'System status' }, { href: '/watchlist', label: 'Watchlist' }, ], }, { label: 'About', items: [ { href: '/about', label: 'About Company Atlas' }, { href: '/bot', label: 'Our crawler' }, { href: `mailto:${CONTACT_EMAIL}`, label: 'Contact' }, ], }, ]; export const EXAMPLE_QUERIES = ['companies hiring AI engineers in Canada', 'pricing changes in SaaS this month', 'new offices opened in Germany', 'Stripe']; const enc = encodeURIComponent; export const routes = { home: () => '/', live: (q?: Record) => withQuery('/live', q), companies: (q?: Record) => withQuery('/companies', q), company: (slug: string, tab?: string) => (tab && tab !== 'overview' ? `/company/${enc(slug)}?tab=${tab}` : `/company/${enc(slug)}`), compare: (slugs: string[] = []) => (slugs.length ? `/company/compare?companies=${slugs.map(enc).join(',')}` : '/company/compare'), events: (q?: Record) => withQuery('/events', q), event: (id: string) => `/events/${enc(id)}`, change: (id: string) => `/change/${enc(id)}`, sensor: (id: string) => `/sensor/${enc(id)}`, snapshot: (id: string) => `/snapshot/${enc(id)}`, snapshotDiff: (id: string, other: string) => `/snapshot/${enc(id)}/diff/${enc(other)}`, rankings: (kind?: string, window?: string) => withQuery('/rankings', { kind, window }), industries: () => '/industry', industry: (slug: string) => `/industry/${enc(slug)}`, countries: () => '/country', country: (code: string) => `/country/${enc(code.toLowerCase())}`, search: (q: string) => `/search?q=${enc(q)}`, watchlist: () => '/watchlist', system: () => '/system', about: () => '/about', methodology: () => '/methodology', api: () => '/api', bot: () => '/bot', admin: (module?: string) => (module ? `/admin/${module}` : '/admin'), }; export function withQuery(base: string, q?: Record): string { if (!q) return base; const p = new URLSearchParams(); for (const [k, v] of Object.entries(q)) if (v !== undefined && v !== null && v !== '') p.set(k, String(v)); const s = p.toString(); return s ? `${base}?${s}` : base; } export const CONFIDENCE_LABELS: Record = { VERIFIED: 'Verified', HIGH_CONFIDENCE: 'High confidence', LIKELY: 'Likely', INFERRED: 'Inferred', LOW_CONFIDENCE: 'Low confidence', }; export const METRIC_LABELS: Record = { activity_score: 'Activity Score', hiring_momentum_7d: 'Hiring Momentum 7d', hiring_momentum_30d: 'Hiring Momentum 30d', hiring_momentum_90d: 'Hiring Momentum 90d', open_jobs: 'Open jobs', ai_adoption: 'AI Adoption', product_velocity: 'Product Velocity', geo_expansion: 'Geographic Expansion', developer_momentum: 'Developer Momentum', communication_activity: 'Communication Activity', pricing_activity: 'Pricing Activity', leadership_activity: 'Leadership Activity', corporate_change_index: 'Corporate Change Index', anomaly_score: 'Anomaly Score', historical_coverage: 'Historical coverage', }; export const METRIC_SHORT: Record = { activity_score: 'Activity', hiring_momentum_30d: 'Hiring 30d', product_velocity: 'Product velocity', ai_adoption: 'AI adoption', corporate_change_index: 'CCI', geo_expansion: 'Geo expansion', developer_momentum: 'Developer', open_jobs: 'Open jobs', }; export const RANKING_KINDS: { id: string; label: string; short: string; unit: 'score' | 'pct' | 'count' }[] = [ { id: 'most_active', label: 'Most Active', short: 'Active', unit: 'score' }, { id: 'hiring_growth', label: 'Fastest Hiring Growth', short: 'Hiring ↑', unit: 'pct' }, { id: 'hiring_decline', label: 'Fastest Hiring Decline', short: 'Hiring ↓', unit: 'pct' }, { id: 'product_velocity', label: 'Highest Product Velocity', short: 'Product', unit: 'score' }, { id: 'ai_active', label: 'Most AI-Active', short: 'AI', unit: 'score' }, { id: 'geo_expansion', label: 'Fastest Geographic Expansion', short: 'Geo', unit: 'score' }, { id: 'developer_momentum', label: 'Highest Developer Momentum', short: 'Developer', unit: 'score' }, { id: 'pricing_changes', label: 'Most Pricing Changes', short: 'Pricing', unit: 'count' }, { id: 'unusual_activity', label: 'Most Unusual Activity', short: 'Unusual', unit: 'score' }, ]; export const RANKING_WINDOWS = ['24h', '7d', '30d', '90d', '1y'] as const; export const TIMELINE_FILTERS = ['all', 'products', 'jobs', 'pricing', 'leadership', 'locations', 'legal', 'news', 'developer'] as const; export const SENSOR_TIER_LABELS: Record = { A: '5–15 min', B: '30–60 min', C: '6 h', D: '24 h', E: '3–7 days' }; export const SURFACE_LABELS: Record = { homepage: 'Homepage', about: 'About', careers: 'Careers', jobs: 'Jobs', newsroom: 'Newsroom', press: 'Press', blog: 'Blog', products: 'Products', pricing: 'Pricing', leadership: 'Leadership', team: 'Team', locations: 'Locations', investor_relations: 'Investor relations', documentation: 'Documentation', developer: 'Developer', api: 'API', changelog: 'Changelog', legal: 'Legal', terms: 'Terms', privacy: 'Privacy', security: 'Security', status: 'Status page', sustainability: 'Sustainability', partners: 'Partners', customers: 'Customers', sitemap: 'Sitemap', feed: 'Feed', other: 'Other', };