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
scrollTonumberIndex to keep visible (ignored in interactive mode)
overscannumber5Extra items rendered beyond viewport
maxRenderednumber100Maximum items rendered at once
overflowIndicatorbooleanShow overflow indicators
keyExtractor(item: T, index: number) => string | numberindexKey extractor
widthnumberViewport width
gapnumber0Gap between items
renderSeparator() => ReactNodeCustom separator between items
virtualized(item: T, index: number) => booleanPredicate for virtualized prefix
listFooterReactNodeContent after all items

Interactive Mode

PropTypeDefaultDescription
interactivebooleanEnable keyboard/mouse navigation
selectedIndexnumberControlled selected index
onSelectionChange(index: number) => voidCalled when selection changes
onSelect(index: number) => voidCalled on Enter
onEndReached() => voidInfinite scroll callback
onEndReachedThresholdnumber5Items from end to trigger

ItemMeta

ts
interface ItemMeta {
  isSelected: boolean
}

Migration to ListView

VirtualListListView
interactivenavigable
selectedIndexcursorIndex
onSelectionChangeonCursorIndexChange
keyExtractorgetKey
itemHeightestimateHeight
meta.isSelectedmeta.isCursor

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>
  )}
/>

Released under the MIT License.