import { ComputedRef, Ref } from 'vue'; export type ScrollDirection = 'vertical' | 'horizontal'; export type ScrollAlign = 'start' | 'center' | 'end' | 'nearest'; export type KeyValue = string | number; export type KeyFieldResolver = (item: TItem, index: number) => KeyValue; export type KeyFieldValue = string | KeyFieldResolver; export type ItemSizeResolver = (item: TItem, index: number) => number; export type ItemSizeValue = number | null | ItemSizeResolver; export type StringKeyOf = Extract; /** * Default key-field shape for generic option helpers. * Keep valid object field names plus resolver functions, instead of freezing to `'id'`. */ export type DefaultKeyField = TItem extends object ? StringKeyOf | KeyFieldResolver : string; export type ValidKeyField> = TItem extends object ? TKeyField extends KeyFieldResolver ? TKeyField : TKeyField extends StringKeyOf ? TKeyField : never : string; export type NumericFieldKey = TItem extends object ? Extract<{ [K in StringKeyOf]-?: Exclude extends number ? K : never; }[StringKeyOf], string> : string; export type ValidSizeField = TItem extends object ? [NumericFieldKey] extends [never] ? string : TSizeField extends NumericFieldKey ? TSizeField : never : string; export type ItemKey = 'id'> = TItem extends object ? TKeyField extends KeyFieldResolver ? Extract, KeyValue> : Extract : number; export type ClassValue = string | Record | Array>; export interface ScrollToOptions { align?: ScrollAlign; smooth?: boolean; offset?: number; } export interface ScrollState { start: number; end: number; } export interface ViewNonReactive { id: number; index: number; used: boolean; key: TKey; type: unknown; } export interface View { item: TItem; position: number; offset: number; nr: ViewNonReactive; } /** * Public pooled-view shape exposed by `useDynamicScroller`. * It flattens common render fields while still exposing measured metadata. */ export interface DynamicScrollerView { item: TItem; itemWithSize: ItemWithSize; size: number | undefined; position: number; offset: number; id: number; index: number; used: boolean; key: TKey; type: unknown; } export interface CacheSnapshot { keys: KeyValue[]; sizes: Array; } export interface SizeEntry { accumulator: number; size?: number; } export interface Sizes { [key: number]: SizeEntry; } export interface VScrollData { active: boolean; sizes: Record; keyField: KeyFieldValue; simpleArray: boolean; } export interface ItemWithSize { item: TItem; id: TKey; size: number | undefined; } export interface RecycleScrollerSlotProps { item: TItem; index: number; active: boolean; } export interface DynamicScrollerSlotProps extends RecycleScrollerSlotProps { itemWithSize: ItemWithSize; } export interface RecycleScrollerExposed { el: Ref; visiblePool: ComputedRef>>; startSpacerSize: Ref; endSpacerSize: Ref; scrollToItem: (index: number, options?: ScrollToOptions) => void; scrollToPosition: (position: number, options?: ScrollToOptions) => void; getScroll: () => ScrollState; findItemIndex: (offset: number) => number; getItemOffset: (index: number) => number; getItemSize: (index: number) => number; cacheSnapshot: ComputedRef; restoreCache: (snapshot: CacheSnapshot | null | undefined) => boolean; updateVisibleItems: (itemsChanged: boolean, checkPositionDiff?: boolean) => { continuous: boolean; }; } export interface DynamicScrollerExposed { startSpacerSize: Ref; endSpacerSize: Ref; scrollToItem: (index: number, options?: ScrollToOptions) => void; scrollToPosition: (position: number, options?: ScrollToOptions) => void; findItemIndex: (offset: number) => number; getItemOffset: (index: number) => number; scrollToBottom: () => void; getItemSize: (item: TItem, index?: number) => number; cacheSnapshot: ComputedRef; restoreCache: (snapshot: CacheSnapshot | null | undefined) => boolean; forceUpdate: (clear?: boolean) => void; } export interface WindowScrollerExposed { el: Ref; startSpacerSize: Ref; endSpacerSize: Ref; scrollToItem: (index: number, options?: ScrollToOptions) => void; scrollToPosition: (position: number, options?: ScrollToOptions) => void; getScroll: () => ScrollState; findItemIndex: (offset: number) => number; getItemOffset: (index: number) => number; getItemSize: (index: number) => number; cacheSnapshot: ComputedRef; restoreCache: (snapshot: CacheSnapshot | null | undefined) => boolean; updateVisibleItems: (itemsChanged: boolean, checkPositionDiff?: boolean) => { continuous: boolean; }; } export interface PluginOptions { installComponents?: boolean; componentsPrefix?: string; }