/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 */ import { forwardRef, useImperativeHandle } from 'react'; import type React from 'react'; import { Box } from 'ink'; import { Colors } from '../../colors.js'; import { useVirtualizedListState, useVirtualizedListEffects, useImperativeCtx, useViewportAndRender, buildImperativeHandle, } from './VirtualizedList.hooks.js'; import { type VirtualizedListProps, type VirtualizedListRef, } from './VirtualizedList.types.js'; export { SCROLL_TO_ITEM_END } from './VirtualizedList.types.js'; export type { VirtualizedListRef } from './VirtualizedList.types.js'; function VirtualizedList( props: VirtualizedListProps, ref: React.Ref>, ) { const { data, renderItem, estimatedItemHeight, keyExtractor, initialScrollIndex, initialScrollOffsetInIndex, } = props; const state = useVirtualizedListState( data, estimatedItemHeight, initialScrollIndex, initialScrollOffsetInIndex, ); const { getScrollTop, setPendingScrollTop } = useVirtualizedListEffects( data, state.scrollTop, state.totalHeight, state.scrollableContainerHeight, state.scrollAnchor, state.isStickingToBottom, state.setIsStickingToBottom, state.setScrollAnchor, state.getAnchorForScrollTop, state.offsets, initialScrollIndex, initialScrollOffsetInIndex, state.containerHeight, state.scrollableContainerHeight, state.heights, ); const { renderedItems, topSpacerHeight, bottomSpacerHeight } = useViewportAndRender(state, data, keyExtractor, renderItem); const imperativeCtx = useImperativeCtx( state, data, getScrollTop, setPendingScrollTop, ); useImperativeHandle( ref, () => buildImperativeHandle( imperativeCtx, state.setScrollAnchor, state.setIsStickingToBottom, state.getAnchorForScrollTop, ), [ imperativeCtx, state.getAnchorForScrollTop, state.setScrollAnchor, state.setIsStickingToBottom, ], ); return ( {renderedItems} ); } type VirtualizedListComponent = (( props: VirtualizedListProps & { ref?: React.Ref> }, ) => React.ReactElement) & { displayName?: string }; const VirtualizedListWithForwardRef = forwardRef( VirtualizedList, ) as VirtualizedListComponent; export { VirtualizedListWithForwardRef as VirtualizedList }; VirtualizedListWithForwardRef.displayName = 'VirtualizedList';