import { Subject } from 'rxjs';
import { EventEmitter } from './preserve-next-event-emitter';
import { DragDropService } from './drag-drop.service';
import { DirectiveBinding, InjectionKey, VNode } from 'vue';
import { NgDirectiveBase } from './directive-base';
export declare type DropIndexFlag = 'beforeAll' | 'afterAll';
export interface IDroppableBinding {
    dragOverClass?: string;
    dropScope?: string | Array<string>;
    placeholderTag?: string;
    placeholderStyle?: Record<string, string>;
    placeholderText?: string;
    allowDropOnItem?: boolean;
    dragOverItemClass?: string;
    nestingTargetRect?: {
        height?: number;
        width?: number;
    };
    switchWhileCrossEdge?: boolean;
    defaultDropPosition?: 'closest' | 'before' | 'after';
    dropSortCountSelector: string;
    dropSortVirtualScrollOption?: {
        totalLength?: number;
        startIndex?: number;
    };
}
export interface IDroppableListener {
    '@dragEnterEvent'?: (_: any) => void;
    '@dragOverEvent'?: (_: any) => void;
    '@dragLeaveEvent'?: (_: any) => void;
    '@dropEvent'?: (_: any) => void;
}
export declare class DropEvent {
    nativeEvent: any;
    dragData: any;
    batchDragData: any;
    dropSubject: Subject<any>;
    dropIndex?: number;
    dragFromIndex?: number;
    dropOnItem?: boolean;
    dropOnOrigin?: boolean;
    constructor(event: any, data: any, dropSubject: Subject<any>, dropIndex?: number, dragFromIndex?: number, dropOnItem?: boolean, dropOnOrigin?: boolean, batchDragData?: Array<any>);
}
export interface DragPlaceholderInsertionEvent {
    command: 'insertBefore' | 'append' | 'remove';
    container?: HTMLElement;
    relatedEl?: Element;
}
export interface DragPlaceholderInsertionIndexEvent {
    command: 'insertBefore' | 'append' | 'remove';
    index?: number;
}
export declare class DroppableDirective extends NgDirectiveBase<IDroppableBinding, IDroppableListener> {
    static INSTANCE_KEY: string;
    static TOKEN: InjectionKey<DroppableDirective>;
    hostListenerMap?: {
        [key: string]: string;
    } | undefined;
    dragEnterEvent: EventEmitter<any>;
    dragOverEvent: EventEmitter<any>;
    dragLeaveEvent: EventEmitter<any>;
    dropEvent: EventEmitter<DropEvent>;
    dragOverClass?: string;
    dropScope: string | Array<string>;
    placeholderTag: string;
    placeholderStyle: any;
    placeholderText: string;
    allowDropOnItem: boolean;
    dragOverItemClass?: string;
    nestingTargetRect?: {
        height?: number;
        width?: number;
    };
    switchWhileCrossEdge: boolean;
    defaultDropPosition: 'closest' | 'before' | 'after';
    dropSortCountSelector?: string;
    dropSortVirtualScrollOption?: {
        totalLength?: number;
        startIndex?: number;
    };
    private dropFlag?;
    private sortContainer;
    private sortDirection?;
    private sortDirectionZMode?;
    private placeholder;
    private dragCount;
    private dropIndex?;
    private dragStartSubscription?;
    private dragEndSubscription?;
    private dropEndSubscription?;
    private overElement?;
    private dragPartEventSub?;
    private allowDropCache?;
    private dragElIndex?;
    placeholderInsertionEvent: Subject<DragPlaceholderInsertionEvent>;
    placeholderRenderEvent: Subject<any>;
    document: Document;
    el: {
        nativeElement: any;
    };
    private dragDropService;
    constructor(el: HTMLElement, dragDropService: DragDropService);
    ngOnInit(): void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    dragEnter(e: DragEvent): void;
    dragOver(e: DragEvent): void;
    dragLeave(e: DragEvent): void;
    drop(e: DragEvent): void;
    allowDrop(e: DragEvent): boolean;
    private dropSortCountSelectorFilterFn;
    private findSortableEl;
    private calcPosition;
    private calcPositionOutside;
    setPlaceholder: () => void;
    private insertPlaceholder;
    private isDragPlaceholderPosition;
    private hitDragOriginPlaceholder;
    private removePlaceholder;
    private removeDragoverItemClass;
    private checkSelfFromIndex;
    private getRealIndex;
    getBoundingRectAndRealPosition(targetElement: HTMLElement): any;
    getSortContainer(): any;
}
declare const _default: {
    mounted(el: HTMLElement & {
        [props: string]: any;
    }, binding: DirectiveBinding<IDroppableBinding & IDroppableListener>, vNode: VNode): void;
    updated(el: HTMLElement & {
        [props: string]: any;
    }, binding: DirectiveBinding<IDroppableBinding & IDroppableListener>): void;
    beforeUnmount(el: HTMLElement & {
        [props: string]: any;
    }): void;
};
export default _default;
