Skip to content

VirtualList ​

Deprecated

Use ListView instead. VirtualList is a thin wrapper that maps old prop names to ListView.

React-level virtualized list. Only renders items within the visible viewport plus overscan.

Import ​

tsx
import { VirtualList } from "silvery"

Usage ​

tsx
<VirtualList
  items={cards}
  height={20}
  itemHeight={1}
  scrollTo={selectedIndex}
  renderItem={(card, index) => <Text inverse={index === selected}>{card.title}</Text>}
/>

Props ​

PropTypeDefaultDescription
itemsT[]requiredArray of items to render
heightnumberrequiredViewport height in rows
itemHeightnumber | (item: T, index: number) => number1Height per item in rows
renderItem(item: T, index: number, meta?: ItemMeta) => ReactNoderequiredRender function
scrollTonumber—Index to keep visible (ignored in interactive mode)
overscannumber5Extra items rendered beyond viewport
maxRenderednumber100Maximum items rendered at once
overflowIndicatorboolean—Show overflow indicators
keyExtractor(item: T, index: number) => string | numberindexKey extractor
widthnumber—Viewport width
gapnumber0Gap between items
renderSeparator() => ReactNode—Custom separator between items
virtualized(item: T, index: number) => boolean—Predicate for virtualized prefix
listFooterReactNode—Content after all items

Interactive Mode ​

PropTypeDefaultDescription
interactiveboolean—Enable keyboard/mouse navigation
selectedIndexnumber—Controlled selected index
onSelectionChange(index: number) => void—Called when selection changes
onSelect(index: number) => void—Called on Enter
onEndReached() => void—Infinite scroll callback
onEndReachedThresholdnumber5Items from end to trigger

ItemMeta ​

ts
interface ItemMeta {
  isSelected: boolean
}

Examples ​

Interactive List ​

tsx
<VirtualList
  items={items}
  height={20}
  itemHeight={1}
  interactive
  onSelect={(index) => openItem(items[index])}
  renderItem={(item, index, meta) => (
    <Text inverse={meta?.isSelected}>
      {meta?.isSelected ? "> " : "  "}
      {item.name}
    </Text>
  )}
/>