import { ComputedRef, CSSProperties, Directive, MaybeRefOrGetter, Ref } from 'vue';
import { CacheSnapshot, DefaultKeyField, DynamicScrollerView, ItemKey, ItemWithSize, KeyFieldValue, KeyValue, ScrollDirection, ValidKeyField, VScrollData } from '../types';
import { DynamicScrollerItemControllerCallbacks, DynamicScrollerItemControllerOptions, DynamicScrollerMeasurementContext } from './dynamicScrollerMeasurement';
import { ScrollerOptionEnabled } from './scrollerOptions';
import { UseRecycleScrollerReturn } from './useRecycleScroller';
export interface UseDynamicScrollerItemViewBindingOptions<TItem = unknown, TKey = KeyValue> {
    view: DynamicScrollerView<TItem, TKey>;
    watchData?: boolean;
    /**
     * @deprecated `sizeDependencies` is a legacy fallback for environments without
     * `ResizeObserver` and will be removed in the next major release.
     */
    sizeDependencies?: Record<string, unknown> | unknown[] | null;
    emitResize?: boolean;
    onResize?: DynamicScrollerItemControllerCallbacks['onResize'];
}
interface UseDynamicScrollerItemLegacyBindingOptions<TItem = unknown> extends Omit<DynamicScrollerItemControllerOptions<TItem>, 'watchData' | 'emitResize'> {
    watchData?: boolean;
    emitResize?: boolean;
    onResize?: DynamicScrollerItemControllerCallbacks['onResize'];
}
export type UseDynamicScrollerItemBindingOptions<TItem = unknown, TKey = KeyValue> = UseDynamicScrollerItemViewBindingOptions<TItem, TKey> | UseDynamicScrollerItemLegacyBindingOptions<TItem>;
export interface UseDynamicScrollerOptions<TItem = unknown> extends ScrollerOptionEnabled {
    items: MaybeRefOrGetter<TItem[]>;
    keyField: KeyFieldValue<TItem>;
    direction?: ScrollDirection;
    minItemSize: number | string;
    el: MaybeRefOrGetter<HTMLElement | undefined>;
    before?: MaybeRefOrGetter<HTMLElement | undefined>;
    after?: MaybeRefOrGetter<HTMLElement | undefined>;
    /**
     * Override the auto-detected scroll-parent used by page mode. Accepts an
     * `HTMLElement` (typically an `overflow:auto` ancestor) or `Window`. When
     * omitted, the scroller walks the DOM for the nearest scrollable ancestor.
     * See issue #928.
     */
    scrollParent?: MaybeRefOrGetter<HTMLElement | Window | undefined>;
    buffer?: number;
    pageMode?: boolean;
    shift?: boolean;
    cache?: CacheSnapshot;
    disableTransform?: boolean;
    flowMode?: boolean;
    hiddenPosition?: number;
    prerender?: number;
    emitUpdate?: boolean;
    updateInterval?: number;
    onResize?: () => void;
    onVisible?: () => void;
    onHidden?: () => void;
    onUpdate?: (startIndex: number, endIndex: number, visibleStartIndex: number, visibleEndIndex: number) => void;
}
type UseDynamicScrollerRecycleReturn<TItem, TKey> = UseRecycleScrollerReturn<ItemWithSize<TItem, TKey>, TKey>;
type UseDynamicScrollerSizes<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['sizes'];
type UseDynamicScrollerReady<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['ready'];
type UseDynamicScrollerPool<TItem, TKey> = Ref<Array<DynamicScrollerView<TItem, TKey>>>;
type UseDynamicScrollerVisiblePool<TItem, TKey> = ComputedRef<Array<DynamicScrollerView<TItem, TKey>>>;
type UseDynamicScrollerHandleResize<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['handleResize'];
type UseDynamicScrollerHandleVisibilityChange<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['handleVisibilityChange'];
type UseDynamicScrollerGetScroll<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['getScroll'];
type UseDynamicScrollerFindItemIndex<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['findItemIndex'];
type UseDynamicScrollerGetItemOffset<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['getItemOffset'];
type UseDynamicScrollerScrollToItem<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['scrollToItem'];
type UseDynamicScrollerScrollToPosition<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['scrollToPosition'];
type UseDynamicScrollerSortViews<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['sortViews'];
type UseDynamicScrollerTotalSize<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['totalSize'];
type UseDynamicScrollerUpdateVisibleItems<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['updateVisibleItems'];
type UseDynamicScrollerCacheSnapshot<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['cacheSnapshot'];
type UseDynamicScrollerRestoreCache<TItem, TKey> = UseDynamicScrollerRecycleReturn<TItem, TKey>['restoreCache'];
type ResolvedDynamicScrollerItems<TOptions extends UseDynamicScrollerOptions<any>> = TOptions['items'] extends MaybeRefOrGetter<infer TItems extends any[]> ? TItems : never;
type InferredDynamicScrollerItem<TOptions extends UseDynamicScrollerOptions<any>> = ResolvedDynamicScrollerItems<TOptions>[number];
type InferredDynamicScrollerKeyField<TOptions extends UseDynamicScrollerOptions<any>> = Extract<TOptions['keyField'], KeyFieldValue<InferredDynamicScrollerItem<TOptions>>>;
export interface UseDynamicScrollerReturn<TItem = unknown, TKey = ItemKey<TItem>> {
    vscrollData: VScrollData;
    itemsWithSize: ComputedRef<Array<ItemWithSize<TItem, TKey>>>;
    simpleArray: ComputedRef<boolean>;
    resizeObserver: ResizeObserver | undefined;
    measurementContext: DynamicScrollerMeasurementContext;
    vDynamicScrollerItem: Directive<HTMLElement, UseDynamicScrollerItemBindingOptions<TItem, TKey>>;
    pool: UseDynamicScrollerPool<TItem, TKey>;
    visiblePool: UseDynamicScrollerVisiblePool<TItem, TKey>;
    totalSize: UseDynamicScrollerTotalSize<TItem, TKey>;
    startSpacerSize: UseDynamicScrollerRecycleReturn<TItem, TKey>['startSpacerSize'];
    endSpacerSize: UseDynamicScrollerRecycleReturn<TItem, TKey>['endSpacerSize'];
    ready: UseDynamicScrollerReady<TItem, TKey>;
    sizes: UseDynamicScrollerSizes<TItem, TKey>;
    forceUpdate: (clear?: boolean) => void;
    scrollToItem: UseDynamicScrollerScrollToItem<TItem, TKey>;
    scrollToPosition: UseDynamicScrollerScrollToPosition<TItem, TKey>;
    getScroll: UseDynamicScrollerGetScroll<TItem, TKey>;
    findItemIndex: UseDynamicScrollerFindItemIndex<TItem, TKey>;
    getItemOffset: UseDynamicScrollerGetItemOffset<TItem, TKey>;
    updateVisibleItems: UseDynamicScrollerUpdateVisibleItems<TItem, TKey>;
    handleResize: UseDynamicScrollerHandleResize<TItem, TKey>;
    handleVisibilityChange: UseDynamicScrollerHandleVisibilityChange<TItem, TKey>;
    sortViews: UseDynamicScrollerSortViews<TItem, TKey>;
    cacheSnapshot: UseDynamicScrollerCacheSnapshot<TItem, TKey>;
    restoreCache: UseDynamicScrollerRestoreCache<TItem, TKey>;
    getItemSize: (item: TItem, index?: number) => number;
    getViewStyle: (view: DynamicScrollerView<TItem, TKey>) => CSSProperties;
    scrollToBottom: () => void;
    onScrollerResize: () => void;
    onScrollerVisible: () => void;
}
export declare function useDynamicScroller<TItem, TKeyField extends KeyFieldValue<TItem> = DefaultKeyField<TItem>>(options: MaybeRefOrGetter<UseDynamicScrollerOptions<TItem> & {
    keyField: ValidKeyField<TItem, TKeyField>;
}>): UseDynamicScrollerReturn<TItem, ItemKey<TItem, TKeyField>>;
export declare function useDynamicScroller<TOptions extends UseDynamicScrollerOptions<any>>(options: MaybeRefOrGetter<TOptions>): UseDynamicScrollerReturn<InferredDynamicScrollerItem<TOptions>, ItemKey<InferredDynamicScrollerItem<TOptions>, InferredDynamicScrollerKeyField<TOptions>>>;
export {};
