import { EventEmitter, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
export interface DragScrollEvent {
    offsetX: number;
    offsetY: number;
}
export declare class DragDirective<T = unknown> implements OnDestroy {
    private readonly _elementRef;
    private readonly _ngZone;
    private readonly _renderer;
    private readonly _scrollDispatcher;
    private readonly _drag;
    /** Detemine if we should show a clone when dragging */
    clone: boolean;
    /** Define the group the drag event belongs to */
    group: string;
    /** Associate some data with the drag event */
    model: T;
    /** Allow the dragging to be enabled/disabled */
    draggable: boolean;
    /** Emit an event when dragging starts */
    onDragStart: EventEmitter<MouseEvent>;
    /** Emit an event when the mouse moves while dragging */
    onDrag: EventEmitter<MouseEvent>;
    /** Emit an event when the document scrolls while dragging */
    onDragScroll: EventEmitter<DragScrollEvent>;
    /** Emit an event when the dragging finishes */
    onDragEnd: EventEmitter<void>;
    /** Emit when the user drops an item in a drop area */
    onDrop: EventEmitter<T>;
    /** Emit when the user drags over a drop area */
    onDropEnter: EventEmitter<void>;
    /** Emit when the user drags out of a drop area */
    onDropLeave: EventEmitter<void>;
    /** Store the element we have cloned */
    private _clone;
    /** Store the dragging state */
    private _isDragging;
    /** Store the mouse offset for the cloned element position */
    private _offset;
    /** The nearest scrolling ancestor, populated while dragging */
    private _scrollParent;
    /** The current scroll position of _scrollParent */
    private _scrollPosition;
    /** The scroll event listener handle */
    private _scrollListener;
    /** The offset in pixels currently being scrolled while dragging */
    private _scrollOffset;
    /** The current `setInterval` handle for periodic scrolling */
    private _scrollIntervalHandle;
    /** Create an observable from the mouse down event */
    private readonly _mousedown$;
    /** Create an observable from the mouse move event */
    private readonly _mousemove$;
    /** Create an observable from the mouse up event */
    private readonly _mouseup$;
    /** Use an observable to unsubscribe from all subscriptions */
    protected _onDestroy: Subject<void>;
    constructor();
    /** Emit events and create clone when drag starts */
    dragStart(event: MouseEvent): void;
    /** Emit event and update clone position when dragging moves */
    dragMove(event: MouseEvent): void;
    /** Emit event and destroy clone when dragging ends */
    dragEnd(): void;
    /** Emit the onDragScroll event */
    scroll(): void;
    /** Create an exact clone of an element */
    cloneNode(event: MouseEvent): void;
    /** Position the clone relative to the mouse */
    updateNodePosition(event: MouseEvent): void;
    /** Inline all styles to ensure styling is consistent regardless of its position in the dom */
    inlineStyles(source: Element, target: Element): void;
    /** Unsubscribe from all subscriptions */
    ngOnDestroy(): void;
    private updateScrolling;
    private getScrollParent;
    private createScrollEventListener;
    private removeScrollEventListener;
    private getScrollOffsets;
    private startScrolling;
    private stopScrolling;
    private performScroll;
    static ɵfac: i0.ɵɵFactoryDeclaration<DragDirective<any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<DragDirective<any>, "[uxDrag]", never, { "clone": { "alias": "clone"; "required": false; }; "group": { "alias": "group"; "required": false; }; "model": { "alias": "model"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; }, { "onDragStart": "onDragStart"; "onDrag": "onDrag"; "onDragScroll": "onDragScroll"; "onDragEnd": "onDragEnd"; "onDrop": "onDrop"; "onDropEnter": "onDropEnter"; "onDropLeave": "onDropLeave"; }, never, never, false, never>;
}
