import type { Ref, ShallowReactive } from 'vue-demi'; import type { StyleType, ClassType } from '../../utils'; export type ReactiveData = { views: number; offset: number; listTotalSize: number; virtualSize: number; inViewBegin: number; inViewEnd: number; renderBegin: number; renderEnd: number; bufferTop: number; bufferBottom: number; }; export interface BaseListProps> { list: T[]; itemKey: string | number; minSize: number; itemGap?: number; scrollDistance?: number; headerClass: ClassType; headerStyle: StyleType; footerClass: ClassType; footerStyle: StyleType; stickyHeaderClass: ClassType; stickyHeaderStyle: StyleType; stickyFooterClass: ClassType; stickyFooterStyle: StyleType; } export interface VirtListProps> extends BaseListProps { renderControl?: (begin: number, end: number) => { begin: number; end: number; }; fixed?: boolean; buffer?: number; bufferTop?: number; bufferBottom?: number; horizontal?: boolean; fixSelection?: boolean; start?: number; offset?: number; listStyle?: StyleType; listClass?: ClassType; itemStyle?: StyleType | ((item: T, index: number) => StyleType); itemClass?: ClassType | ((item: T, index: number) => ClassType); } export interface EmitFunction { scroll?: (e: Event) => void; toTop?: (item: T) => void; toBottom?: (item: T) => void; itemResize?: (id: string, newSize: number) => void; rangeUpdate?: (inViewBegin: number, inViewEnd: number) => void; } export type SlotSize = { clientSize: number; headerSize: number; footerSize: number; stickyHeaderSize: number; stickyFooterSize: number; }; export type VirtListReturn> = { props: Required>; renderList: Ref; clientRefEl: Ref; listRefEl: Ref; headerRefEl: Ref; footerRefEl: Ref; stickyHeaderRefEl: Ref; stickyFooterRefEl: Ref; reactiveData: ShallowReactive; slotSize: ShallowReactive; sizesMap: Map; resizeObserver: ResizeObserver | undefined; getReactiveData: () => ShallowReactive; getOffset: () => number; getSlotSize: () => number; reset: () => void; scrollToIndex: (index: number) => void; scrollIntoView: (index: number) => void; scrollToTop: () => void; manualRender: (begin: number, end: number) => void; scrollToBottom: () => void; scrollToOffset: (offset: number) => void; getItemSize: (itemKey: string) => number; deleteItemSize: (itemKey: string) => void; deletedList2Top: (preList: T[]) => void; addedList2Top: (preList: T[]) => void; getItemPosByIndex: (index: number) => { top: number; current: number; bottom: number; }; forceUpdate: () => void; };