Skip to content

Commit 653dab4

Browse files
curate top networks and tokens (#3754)
1 parent 9e025ba commit 653dab4

1 file changed

Lines changed: 95 additions & 47 deletions

File tree

src/components/CCIP/Landing/ccip-landing.astro

Lines changed: 95 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,107 @@ export type Props = {
2222
}
2323
const { environment } = Astro.props as Props
2424
25-
const entry = await getEntry("ccip", "index")
26-
if (!entry) {
27-
throw new Error('No "ccip/index" doc found! Please make sure it exists in src/content/ccip/index.mdx or .md.')
25+
// ----------------------
26+
// Featured (exact match)
27+
// ----------------------
28+
29+
const FEATURED_NETWORK_RANK = {
30+
Ethereum: 1,
31+
Plasma: 2,
32+
Solana: 3,
33+
"BNB Chain": 4,
34+
Base: 5,
35+
"Arbitrum One": 6,
36+
Avalanche: 7,
37+
Monad: 8,
2838
}
2939
40+
const FEATURED_TOKEN_RANK = {
41+
LINK: 1,
42+
USDC: 2,
43+
USDT: 3,
44+
WETH: 4,
45+
syrupUSDC: 5,
46+
syrupUSDT: 6,
47+
GHO: 7,
48+
cbBTC: 8,
49+
SolvBTC: 9,
50+
LBTC: 10,
51+
USDF: 11,
52+
FF: 12,
53+
EDEN: 13,
54+
USDO: 14,
55+
UNIBTC: 15,
56+
USD1: 16,
57+
FLUID: 17,
58+
USX: 18,
59+
}
60+
61+
// ----------------------
62+
63+
const entry = await getEntry("ccip", "index")
64+
if (!entry) throw new Error('No "ccip/index" doc found!')
65+
3066
const { headings } = await render(entry)
3167
32-
const networks = getAllNetworks({ filter: environment })
68+
// ----------------------
69+
// Networks
70+
// ----------------------
71+
72+
const networksRaw = getAllNetworks({ filter: environment })
73+
74+
const networks = networksRaw.map((n) => ({
75+
...n,
76+
featuredRank: FEATURED_NETWORK_RANK[n.name],
77+
}))
78+
79+
const orderedNetworks = [...networks].sort((a, b) => {
80+
const aRank = a.featuredRank ?? Infinity
81+
const bRank = b.featuredRank ?? Infinity
82+
if (aRank !== bRank) return aRank - bRank
83+
return a.name.localeCompare(b.name, undefined, { sensitivity: "base" })
84+
})
85+
86+
// ----------------------
87+
// Tokens
88+
// ----------------------
89+
3390
const supportedTokens = getAllSupportedTokens({
3491
environment,
3592
version: Version.V1_2_0,
3693
})
94+
3795
const tokens = Object.keys(supportedTokens).sort((a, b) => a.localeCompare(b, undefined, { sensitivity: "base" }))
96+
3897
const allTokens = tokens.map((token) => {
3998
const logo = getTokenIconUrl(token) || ""
4099
return {
41100
id: token,
42101
logo,
43102
totalNetworks: getChainsOfToken({ token, filter: environment }).length,
103+
featuredRank: FEATURED_TOKEN_RANK[token] ?? FEATURED_TOKEN_RANK[token.toUpperCase()],
44104
}
45105
})
106+
107+
const orderedTokens = [...allTokens].sort((a, b) => {
108+
const aRank = a.featuredRank ?? Infinity
109+
const bRank = b.featuredRank ?? Infinity
110+
if (aRank !== bRank) return aRank - bRank
111+
return a.id.localeCompare(b.id, undefined, { sensitivity: "base" })
112+
})
113+
114+
// ----------------------
115+
46116
const searchLanes = getSearchLanes({ environment })
47117
48-
// Generate directory-level structured data (DataCatalog/Dataset)
49-
// Use production base for canonical JSON-LD URLs (avoid local IPv6/port)
50118
const currentPath = new URL(Astro.request.url).pathname
51119
const canonicalForJsonLd = `${DOCS_BASE_URL}${currentPath}`
120+
52121
const directoryStructuredData = generateDirectoryStructuredData(environment, networks, tokens, canonicalForJsonLd)
122+
123+
// Hero uses curated slice
124+
const featuredNetworks = orderedNetworks.slice(0, 8)
125+
const featuredTokens = orderedTokens.slice(0, 18)
53126
---
54127

55128
<CcipDirectoryLayout
@@ -60,74 +133,49 @@ const directoryStructuredData = generateDirectoryStructuredData(environment, net
60133
pageTitleOverride={`CCIP Directory - ${environment === Environment.Mainnet ? "Mainnet" : "Testnet"}`}
61134
metadataOverride={{
62135
...(entry.data.metadata || {}),
63-
description: `Explore CCIP Directory for ${environment === Environment.Mainnet ? "Mainnet" : "Testnet"}: configuration data for supported blockchains and tokens, cross-chain lanes, contract addresses, rate limits, and operational status on ${environment === Environment.Mainnet ? "Mainnet" : "Testnet"}.`,
136+
description: `Explore CCIP Directory for ${environment === Environment.Mainnet ? "Mainnet" : "Testnet"}.`,
64137
image: "/files/ccip-directory.jpg",
65138
}}
66139
suppressDefaultStructuredData={true}
67140
>
68-
<Hero chains={networks} tokens={allTokens} environment={environment} client:visible lanes={searchLanes} />
141+
<Hero
142+
chains={featuredNetworks}
143+
tokens={featuredTokens}
144+
environment={environment}
145+
client:visible
146+
lanes={searchLanes}
147+
/>
148+
69149
<section class="layout">
70150
<div>
71151
<div class="ccip-heading">
72152
<h2>Networks {environment} <span>({networks.length})</span></h2>
73153
</div>
74-
<LazyNetworkGrid networks={networks} environment={environment} client:visible />
154+
<LazyNetworkGrid networks={orderedNetworks} environment={environment} client:visible />
75155
</div>
156+
76157
<div>
77158
<div class="ccip-heading">
78159
<h2>Tokens <span>({allTokens.length})</span></h2>
79-
<a class="button secondary" href="/ccip/tutorials/evm/token-manager#verifying-your-token">Add my token</a>
160+
<a class="button secondary" href="/ccip/tutorials/evm/token-manager#verifying-your-token"> Add my token </a>
80161
</div>
81-
<LazyTokenGrid tokens={allTokens} environment={environment} client:visible />
162+
<LazyTokenGrid tokens={orderedTokens} environment={environment} client:visible />
82163
</div>
83164
</section>
84165
</CcipDirectoryLayout>
85166

86167
<style>
168+
/* Restore original layout behavior */
169+
87170
.layout {
88-
--gutter: var(--space-10x);
89-
--doc-padding: var(--space-6x);
90-
margin: var(--space-8x) auto;
91171
display: flex;
92172
flex-direction: column;
93-
gap: var(--gutter);
94-
padding: var(--doc-padding);
95-
}
96-
97-
.ccip-heading {
98-
display: flex;
99-
padding-bottom: var(--space-4x);
100-
border-bottom: 1px solid var(--gray-200);
101-
margin-bottom: var(--space-6x);
102-
justify-content: space-between;
103-
}
104-
105-
.layout h2 {
106-
color: var(--gray-900);
107-
font-size: 22px;
108-
line-height: var(--space-10x);
109-
margin-bottom: 0px;
110-
}
111-
112-
.layout h2 span {
113-
color: var(--gray-400);
114-
font-weight: 600;
115-
letter-spacing: 0.5px;
116-
}
117-
118-
@media (min-width: 50em) {
119-
.layout {
120-
max-width: min(calc(1440px - 2 * var(--space-16x)), calc(100% - 2 * var(--space-16x)));
121-
padding: 0;
122-
}
173+
gap: var(--space-10x);
123174
}
124175

125176
@media (min-width: 992px) {
126177
.layout {
127-
--doc-padding: var(--space-10x);
128178
display: grid;
129-
padding-top: var(--doc-padding);
130-
padding-bottom: var(--doc-padding);
131179
grid-template-columns: 1fr 1fr;
132180
gap: var(--space-24x);
133181
}

0 commit comments

Comments
 (0)