diff --git a/src/components/CCIP/Landing/ccip-landing.astro b/src/components/CCIP/Landing/ccip-landing.astro index e1135ffcb4b..ae381c9d1e1 100644 --- a/src/components/CCIP/Landing/ccip-landing.astro +++ b/src/components/CCIP/Landing/ccip-landing.astro @@ -22,34 +22,107 @@ export type Props = { } const { environment } = Astro.props as Props -const entry = await getEntry("ccip", "index") -if (!entry) { - throw new Error('No "ccip/index" doc found! Please make sure it exists in src/content/ccip/index.mdx or .md.') +// ---------------------- +// Featured (exact match) +// ---------------------- + +const FEATURED_NETWORK_RANK = { + Ethereum: 1, + Plasma: 2, + Solana: 3, + "BNB Chain": 4, + Base: 5, + "Arbitrum One": 6, + Avalanche: 7, + Monad: 8, } +const FEATURED_TOKEN_RANK = { + LINK: 1, + USDC: 2, + USDT: 3, + WETH: 4, + syrupUSDC: 5, + syrupUSDT: 6, + GHO: 7, + cbBTC: 8, + SolvBTC: 9, + LBTC: 10, + USDF: 11, + FF: 12, + EDEN: 13, + USDO: 14, + UNIBTC: 15, + USD1: 16, + FLUID: 17, + USX: 18, +} + +// ---------------------- + +const entry = await getEntry("ccip", "index") +if (!entry) throw new Error('No "ccip/index" doc found!') + const { headings } = await render(entry) -const networks = getAllNetworks({ filter: environment }) +// ---------------------- +// Networks +// ---------------------- + +const networksRaw = getAllNetworks({ filter: environment }) + +const networks = networksRaw.map((n) => ({ + ...n, + featuredRank: FEATURED_NETWORK_RANK[n.name], +})) + +const orderedNetworks = [...networks].sort((a, b) => { + const aRank = a.featuredRank ?? Infinity + const bRank = b.featuredRank ?? Infinity + if (aRank !== bRank) return aRank - bRank + return a.name.localeCompare(b.name, undefined, { sensitivity: "base" }) +}) + +// ---------------------- +// Tokens +// ---------------------- + const supportedTokens = getAllSupportedTokens({ environment, version: Version.V1_2_0, }) + const tokens = Object.keys(supportedTokens).sort((a, b) => a.localeCompare(b, undefined, { sensitivity: "base" })) + const allTokens = tokens.map((token) => { const logo = getTokenIconUrl(token) || "" return { id: token, logo, totalNetworks: getChainsOfToken({ token, filter: environment }).length, + featuredRank: FEATURED_TOKEN_RANK[token] ?? FEATURED_TOKEN_RANK[token.toUpperCase()], } }) + +const orderedTokens = [...allTokens].sort((a, b) => { + const aRank = a.featuredRank ?? Infinity + const bRank = b.featuredRank ?? Infinity + if (aRank !== bRank) return aRank - bRank + return a.id.localeCompare(b.id, undefined, { sensitivity: "base" }) +}) + +// ---------------------- + const searchLanes = getSearchLanes({ environment }) -// Generate directory-level structured data (DataCatalog/Dataset) -// Use production base for canonical JSON-LD URLs (avoid local IPv6/port) const currentPath = new URL(Astro.request.url).pathname const canonicalForJsonLd = `${DOCS_BASE_URL}${currentPath}` + const directoryStructuredData = generateDirectoryStructuredData(environment, networks, tokens, canonicalForJsonLd) + +// Hero uses curated slice +const featuredNetworks = orderedNetworks.slice(0, 8) +const featuredTokens = orderedTokens.slice(0, 18) --- - + +

Networks {environment} ({networks.length})

- +
+

Tokens ({allTokens.length})

- Add my token + Add my token
- +