Skip to main content

Overview

The Market Explorer provides comprehensive access to live cryptocurrency market data for over 2,500 coins. Search, filter, and analyze market trends with real-time prices, 24h/7d changes, market cap, trading volume, and 7-day sparkline charts.

Key Features

2,500+ Cryptocurrencies

Browse the entire CoinGecko market catalog

Real-time Search

Instantly search by name or symbol

Advanced Filters

Filter by market cap, volume, and 24h change

Asset Preview

Side drawer with detailed coin information

Global Market Statistics

Three summary cards at the top display aggregated market data:

Total Market Cap

Sum of all cryptocurrency market capitalizations.

24h Volume

Total trading volume across all assets in the last 24 hours.

BTC Dominance

Bitcoin’s market cap as a percentage of the total crypto market, with a visual progress bar.
MarketPage.jsx:206-243
const globalStats = {
  totalMarketCap: markets.reduce((acc, coin) => acc + (coin.market_cap || 0), 0),
  totalVolume24h: markets.reduce((acc, coin) => acc + (coin.total_volume || 0), 0),
  btcDominance: markets.length > 0 
    ? ((markets[0]?.market_cap || 0) / markets.reduce((acc, coin) => acc + (coin.market_cap || 0), 0)) * 100 
    : 0,
}

{/* Market Cap Card */}
<div className="group rounded-xl border bg-white p-6">
  <p className="text-xs font-medium">Total Market Cap</p>
  <h3 className="text-2xl font-black">
    {formatCompactCurrency(globalStats.totalMarketCap)}
  </h3>
</div>

{/* BTC Dominance Card with Progress Bar */}
<div className="group rounded-xl border bg-white p-6">
  <p className="text-xs font-medium">BTC Dominance</p>
  <h3 className="text-2xl font-black">{globalStats.btcDominance.toFixed(1)}%</h3>
  <div className="mt-2 h-2 w-full rounded-full bg-slate-200">
    <div 
      className="h-full rounded-full bg-[#2bee79]" 
      style={{ width: `${globalStats.btcDominance}%` }}
    />
  </div>
</div>
Global stats are calculated client-side from the top markets data returned by the CoinGecko API.

Search and Filters

Search cryptocurrencies by name or symbol with instant results:
MarketPage.jsx:136-147
<input
  type="text"
  placeholder="Search cryptocurrencies..."
  value={searchQuery}
  onChange={(e) => setSearchQuery(e.target.value)}
  className="w-full rounded-lg border-none bg-white py-2 pl-10 pr-4"
/>
The search filters the market list in real-time:
MarketPage.jsx:28-48
const filteredMarkets = markets.filter((coin) => {
  const matchesSearch =
    coin.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
    coin.symbol.toLowerCase().includes(searchQuery.toLowerCase())

  // ... additional filters

  return matchesSearch && matchesMarketCap && matchesVolume && matchesChange
})

Advanced Filters

Filter cryptocurrencies by market capitalization:
  • All Market Cap: No filtering
  • < $1B: Small cap coins
  • 1B1B - 10B: Medium cap coins
  • > $10B: Large cap coins (Bitcoin, Ethereum, etc.)
MarketPage.jsx:33-36
let matchesMarketCap = true
if (filterMarketCap === 'small') matchesMarketCap = coin.market_cap < 1_000_000_000
else if (filterMarketCap === 'medium') matchesMarketCap = coin.market_cap >= 1_000_000_000 && coin.market_cap < 10_000_000_000
else if (filterMarketCap === 'large') matchesMarketCap = coin.market_cap >= 10_000_000_000

Reset Filters

A reset button appears when any filter is active:
MarketPage.jsx:190-202
{(filterMarketCap !== 'all' || filterVolume !== 'all' || filterChange24h !== 'all') && (
  <button
    onClick={() => {
      setFilterMarketCap('all')
      setFilterVolume('all')
      setFilterChange24h('all')
    }}
    className="flex items-center gap-1 rounded-lg bg-red-500/10 px-3 py-2"
  >
    <span className="material-symbols-outlined text-sm">close</span>
    Reset
  </button>
)}

Market Table

Displays the top 20 filtered cryptocurrencies with comprehensive market data:

Table Columns

ColumnDescriptionExample
RankMarket cap ranking1, 2, 3…
AssetCoin name, symbol, and iconBitcoin (BTC)
PriceCurrent price in USD$45,234.56
24h %24-hour price change+2.45%
7d %7-day price change-1.23%
Market CapTotal market capitalization$856B
Volume24-hour trading volume$32.4B
Last 7 DaysSparkline chart📈
ActionsFavorite button

Row Implementation

MarketPage.jsx:294-352
{topMarkets.map((coin, index) => (
  <tr
    key={coin.id}
    onClick={() => handleAssetClick(coin)}
    className="group cursor-pointer hover:bg-slate-50"
  >
    <td className="px-6 py-5">{index + 1}</td>
    <td className="px-6 py-5">
      <div className="flex items-center gap-3">
        <img src={coin.image} alt={coin.name} className="size-8 rounded-full" />
        <div>
          <p className="font-bold">{coin.name}</p>
          <p className="text-xs uppercase">{coin.symbol}</p>
        </div>
      </div>
    </td>
    <td className="px-6 py-5 text-right font-semibold">
      {formatCurrency(coin.current_price)}
    </td>
    <td className={`px-6 py-5 text-right font-medium ${
      coin.price_change_percentage_24h >= 0 ? 'text-[#2bee79]' : 'text-red-500'
    }`}>
      {coin.price_change_percentage_24h >= 0 ? '+' : ''}
      {coin.price_change_percentage_24h?.toFixed(2)}%
    </td>
    {/* ... more columns */}
    <td className="px-6 py-5 w-32">
      {coin.sparkline_in_7d?.price && (
        <svg className="h-8 w-full" viewBox="0 0 100 30">
          <path
            d={generateSparklinePath(coin.sparkline_in_7d.price)}
            fill="none"
            stroke={coin.price_change_percentage_7d_in_currency >= 0 ? '#2bee79' : '#ff4d4d'}
            strokeWidth="2"
          />
        </svg>
      )}
    </td>
  </tr>
))}

Sparkline Generation

Each row includes a mini chart showing the 7-day price trend:
MarketPage.jsx:379-393
function generateSparklinePath(prices) {
  if (!prices || prices.length === 0) return ''

  const min = Math.min(...prices)
  const max = Math.max(...prices)
  const range = max - min || 1

  const points = prices.map((price, index) => {
    const x = (index / (prices.length - 1)) * 100
    const y = 30 - ((price - min) / range) * 30
    return `${x},${y}`
  })

  return `M ${points.join(' L ')}`
}
Click any row to open the Asset Preview Drawer with detailed information about that cryptocurrency.

Asset Preview Drawer

When you click a row in the market table, a side drawer slides in with detailed coin information:
MarketPage.jsx:368-374
{selectedAsset && (
  <AssetPreviewDrawer
    asset={selectedAsset}
    onClose={() => setSelectedAsset(null)}
    onViewInPortfolio={handleViewInPortfolio}
  />
)}
The drawer displays:
  • Coin name, symbol, and logo
  • Current price and 24h change
  • Market cap and rank
  • Trading volume
  • All-time high/low
  • Circulating/total supply
  • Link to view in portfolio

Tabs

Switch between different market views:
MarketPage.jsx:250-269
<button
  onClick={() => setActiveTab('all')}
  className={`rounded-lg px-4 py-2 text-xs font-bold ${
    activeTab === 'all'
      ? 'bg-[#2bee79] text-[#0B1F14]'
      : 'text-slate-600 hover:bg-slate-100'
  }`}
>
  Cryptocurrencies
</button>
<button
  onClick={() => setActiveTab('defi')}
  className={`rounded-lg px-4 py-2 text-xs font-bold ${
    activeTab === 'defi'
      ? 'bg-[#2bee79] text-[#0B1F14]'
      : 'text-slate-600 hover:bg-slate-100'
  }`}
>
  DeFi
</button>
Currently both tabs show the same data. In a future version, the DeFi tab will filter to show only DeFi-specific tokens.

Data Source

Market data comes from the CoinGecko /coins/markets endpoint:
marketApi.js
export async function getTopMarketCoins({
  vsCurrency = 'usd',
  order = 'market_cap_desc',
  perPage = 250,
  page = 1,
  sparkline = true,
  priceChangePercentage = '7d',
}) {
  const response = await apiClient.get('/coins/markets', {
    params: {
      vs_currency: vsCurrency,
      order,
      per_page: perPage,
      page,
      sparkline,
      price_change_percentage: priceChangePercentage,
    },
  })
  return response.data
}
The market data is cached for 5 minutes to reduce API calls and improve performance.

Market Components

AssetPreviewDrawer component

Market API

Market data fetching functions

Formatters

Currency and number formatting

Chart Helpers

Sparkline path generation utilities

Build docs developers (and LLMs) love