import { ComponentReturnType, type Component } from '../component';
import { api as HTML_API } from '../dom-api';
import { Cell, MergedCell } from '../reactive';
import { $context, RENDERED_NODES_PROPERTY, COMPONENT_ID_PROPERTY } from '../shared';
export declare function getFirstNode(rawItem: Node | ComponentReturnType | GenericReturnType | Array<Node | ComponentReturnType | GenericReturnType>): Node;
type GenericReturnType = Array<ComponentReturnType | Node> | ComponentReturnType | Node;
type ListComponentArgs<T> = {
    tag: Cell<T[]> | MergedCell;
    key: string | null;
    ctx: Component<any>;
    ItemComponent: (item: T, index?: number | MergedCell) => GenericReturnType;
};
type RenderTarget = HTMLElement | DocumentFragment;
export declare class BasicListComponent<T extends {
    id: number;
}> {
    keyMap: Map<string, GenericReturnType>;
    indexMap: Map<string, number>;
    nodes: Node[];
    [RENDERED_NODES_PROPERTY]: never[];
    [COMPONENT_ID_PROPERTY]: number;
    ItemComponent: (item: T, index: number | MergedCell, ctx: Component<any>) => GenericReturnType;
    bottomMarker: Comment;
    topMarker: Comment;
    key: string;
    tag: Cell<T[]> | MergedCell;
    isSync: boolean;
    isFirstRender: boolean;
    get ctx(): this;
    keyGenerator(items: T[], keyForItem: (item: T, index: number) => string): Generator<string, void, unknown>;
    api: typeof HTML_API;
    args: {
        [$context]: Component<any>;
    };
    constructor({ tag, ctx, key, ItemComponent }: ListComponentArgs<T>, outlet: RenderTarget, topMarker: Comment);
    setupKeyForItem(): void;
    keyForItem(item: T, index: number): string;
    getTargetNode(amountOfKeys: number): Comment;
    updateItems(items: T[], amountOfKeys: number, removedIndexes: number[]): void;
}
export declare class SyncListComponent<T extends {
    id: number;
}> extends BasicListComponent<T> {
    constructor(params: ListComponentArgs<T>, outlet: RenderTarget, topMarker: Comment);
    fastCleanup(): boolean;
    syncList(items: T[]): void;
    destroyItem(row: GenericReturnType, key: string): void;
}
export declare class AsyncListComponent<T extends {
    id: number;
}> extends BasicListComponent<T> {
    destroyPromise: Promise<void[]> | null;
    constructor(params: ListComponentArgs<any>, outlet: RenderTarget, topMarker: Comment);
    fastCleanup(): Promise<boolean>;
    syncList(items: T[]): Promise<void>;
    destroyItem(row: GenericReturnType, key: string): Promise<void>;
}
export {};
