--- // The atproto.eu network: the sibling national sites this codebase builds (everything except the // .eu aggregate itself), each //atproto. wordmark in its own country accent. Shown only on the // aggregate (see HomePage). Each opens its national site in a new tab. import Wordmark from './Wordmark.astro'; import { SCOPES, type AccentPack } from '../config/scopes'; import { useTranslations, type Lang } from '../i18n/ui'; import { seededShuffleInPlace } from '../lib/seeded-shuffle'; interface Props { lang: Lang; } const { lang } = Astro.props; const t = useTranslations(lang); interface NetSite { cc: string; accent: AccentPack; // primary (slash 1 + dot) accent2: AccentPack; // secondary (slash 2) url: string; live: boolean; // false -> DNS not pointed yet: rendered as a dimmed, non-linked entry } // Every atproto. site this codebase builds as a full scope, except the aggregate itself. Each // carries its own two-colour pair, resolved via data-accent/data-accent2 below. This is the // "Local communities" strip (countries AND cities): a city on our platform (atproto.barcelona) // belongs here more than an external country. The hard rule ("a city is never a country") is upheld // elsewhere (the FOOTER national list and the stats attribution), not by hiding the city's site. const built: NetSite[] = Object.values(SCOPES) .filter((s) => !s.aggregate) .map((s) => ({ cc: s.cc, accent: s.accent, accent2: s.accent2, url: s.site, live: true })); // Family sites NOT built as full scopes here — friendly external communities on their own design, // or ours-but-not-yet-scoped. Given the two-colour lockup so they still read as one of us. `live` // gates a dimmed non-linked state for a domain whose DNS isn't pointed yet. Deduped against real // scopes, so an entry drops out automatically once its cc becomes a built scope. const PLANNED: NetSite[] = [ // atproto.fr — an existing, friendly French community (their own design). French flag blue + red. { cc: 'fr', accent: 'cobalt', accent2: 'red', url: 'https://atproto.fr/', live: true }, ]; const builtCcs = new Set(built.map((s) => s.cc)); const sites: NetSite[] = [...built, ...PLANNED.filter((p) => !builtCcs.has(p.cc))]; // Arbitrary order so no country ever reads as ranked or featured. Seeded from the set of country // codes (not Math.random()) so the order is stable between builds of the same set -- otherwise the // homepage HTML would differ every build and every scope would look "changed" to the deploy step. seededShuffleInPlace(sites, (s) => s.cc); ---