@@ -22,34 +22,107 @@ export type Props = {
2222}
2323const { 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+
3066const { 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+
3390const supportedTokens = getAllSupportedTokens ({
3491 environment ,
3592 version: Version .V1_2_0 ,
3693})
94+
3795const tokens = Object .keys (supportedTokens ).sort ((a , b ) => a .localeCompare (b , undefined , { sensitivity: " base" }))
96+
3897const 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+
46116const 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)
50118const currentPath = new URL (Astro .request .url ).pathname
51119const canonicalForJsonLd = ` ${DOCS_BASE_URL }${currentPath } `
120+
52121const 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