--- // 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'; 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. 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))]; // Fisher–Yates shuffle, once per build (same pattern as the member strip in home.ts): the order is // random per deploy so no country ever reads as ranked or featured. for (let i = sites.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [sites[i], sites[j]] = [sites[j], sites[i]]; } ---