Skip to content

TopMovers

Gainers and losers display with periodic ranking updates. Shows the top performing and worst performing instruments.

Basic Usage

tsx
import { TopMovers } from '@askturret/grid';
import '@askturret/grid/styles.css';

const movers = [
  { symbol: 'AAPL', price: 178.50, change: 4.25, changePercent: 2.44 },
  { symbol: 'GOOGL', price: 141.25, change: -2.10, changePercent: -1.47 },
  { symbol: 'MSFT', price: 378.90, change: 8.50, changePercent: 2.29 },
  { symbol: 'AMZN', price: 153.20, change: -3.80, changePercent: -2.42 },
];

<TopMovers data={movers} gainersCount={5} losersCount={5} />

Props

PropTypeDefaultDescription
dataMoverItem[]requiredArray of items to rank
gainersCountnumber5Number of top gainers to show
losersCountnumber5Number of top losers to show
updateIntervalnumber5000How often to update rankings (ms)
showPricebooleantrueShow price column
showChangebooleanfalseShow absolute change
priceDecimalsnumber2Price decimal places
onItemClick(item: MoverItem, type: 'gainer' | 'loser') => void-Item click handler
showHeadersbooleantrueShow section headers
compactbooleanfalseCompact mode for smaller displays

Data Type

tsx
interface MoverItem {
  symbol: string;
  price: number;
  change: number;         // Absolute change
  changePercent: number;  // Percentage change
}

Ranking Updates

Rankings update periodically to reflect changing market conditions:

tsx
<TopMovers
  data={movers}
  gainersCount={5}
  losersCount={5}
  updateInterval={5000}  // Re-rank every 5 seconds
/>

Set updateInterval={0} to disable periodic updates (ranks only on data change).

Item Click Handler

Handle clicks on individual items:

tsx
<TopMovers
  data={movers}
  onItemClick={(item, type) => {
    console.log(`Clicked ${type}: ${item.symbol}`);
    // Navigate to symbol detail
    navigate(`/symbols/${item.symbol}`);
  }}
/>

Show Absolute Change

Display both absolute and percentage change:

tsx
<TopMovers
  data={movers}
  showChange={true}
/>

Shows: +$4.25 (+2.44%)

Compact Mode

For smaller panels or mobile displays:

tsx
<TopMovers
  data={movers}
  gainersCount={3}
  losersCount={3}
  compact
/>

Hide Section Headers

For embedded use:

tsx
<TopMovers
  data={movers}
  showHeaders={false}
/>

Real-Time Updates

Handle streaming price data:

tsx
function LiveMovers() {
  const [movers, setMovers] = useState<MoverItem[]>([]);

  useEffect(() => {
    const ws = new WebSocket('wss://...');
    ws.onmessage = (event) => {
      const update = JSON.parse(event.data);
      setMovers(prev =>
        prev.map(item =>
          item.symbol === update.symbol
            ? { ...item, ...update }
            : item
        )
      );
    };
    return () => ws.close();
  }, []);

  return (
    <TopMovers
      data={movers}
      gainersCount={5}
      losersCount={5}
      updateInterval={5000}
    />
  );
}

Styling

Colors indicate performance:

css
:root {
  --grid-bid: #22c55e;   /* Gainers (green) */
  --grid-ask: #ef4444;   /* Losers (red) */
}

Ranking changes are animated with smooth transitions.

Released under the MIT License.