import { ContainerOptions } from './exportTypes';
export declare type Position = {
    x: number;
    y: number;
};
export declare type MousePosition = {
    clientX: number;
    clientY: number;
};
export interface Rect {
    left: number;
    right: number;
    top: number;
    bottom: number;
}
export declare type OffsetSize = {
    offsetWidth: number;
    offsetHeight: number;
};
export declare type Axis = 'x' | 'y';
export declare enum ScrollAxis {
    x = "x",
    y = "y",
    xy = "xy"
}
export declare type Boundary = {
    begin: number;
    end: number;
};
export declare type TopLeft = {
    top: number;
    left: number;
};
export declare type Dictionary = {
    [key: string]: any;
};
export declare type Orientation = 'horizontal' | 'vertical';
export declare type ElementX = HTMLElement & Dictionary;
export interface ScrolableInfo {
    element: HTMLElement;
    getRect: () => Rect;
    descendants: ScrolableInfo[];
    axis: Axis;
}
export interface DragInfo {
    dragResult: DragResult;
    draggableInfo: DraggableInfo;
}
export interface DragResult {
    pos: number;
    addedIndex: number | null;
    removedIndex: number | null;
    elementSize: number;
    shadowBeginEnd: Boundary & {
        beginAdjustment: number;
        rect?: TopLeft;
        dropArea?: Boundary;
    };
    containerBoxChanged?: boolean;
    dropPlaceholderContainer?: HTMLDivElement;
}
export interface DraggableInfo {
    invalidateShadow: boolean | null;
    targetElement: HTMLElement | null;
    payload?: any;
    element?: HTMLElement;
    size: OffsetSize;
    container: IContainer;
    elementIndex: number;
    position: Position;
    mousePosition: Position;
    groupName?: string;
    ghostParent: HTMLElement | null;
    relevantContainers: IContainer[];
    cancelDrop?: boolean;
}
export interface ContainerProps {
    element: ElementX;
    draggables: ElementX[];
    getOptions: () => ContainerOptions;
    layout: LayoutManager;
}
export interface IContainer {
    element: HTMLElement;
    draggables: HTMLElement[];
    layout: LayoutManager;
    isDragRelevant: (sourceContainer: IContainer, payload: any) => boolean;
    dispose: (container: IContainer) => void;
    prepareDrag: (container: IContainer, relevantContainer: IContainer[]) => void;
    handleDrag: (draggableInfo: DraggableInfo) => DragResult | null;
    handleDrop: (draggableInfo: DraggableInfo) => void;
    getDragResult: () => DragResult | null;
    getTranslateCalculator: (info: {
        dragResult: DragResult;
    }) => any;
    onTranslated: () => void;
    getOptions: () => ContainerOptions;
    setDraggables: () => void;
    fireRemoveElement: () => void;
    getScrollMaxSpeed: () => number | undefined;
    setOptions: (options: ContainerOptions, merge?: boolean) => void;
    shouldUseTransformForGhost: () => boolean;
}
export interface GhostInfo {
    topLeft: {
        x: number;
        y: number;
    };
    ghost: HTMLElement;
    centerDelta: Position;
    positionDelta: {
        left: number;
        top: number;
    };
}
export interface LayoutManager {
    getSize: (element: HTMLElement | OffsetSize) => number;
    getContainerRectangles: () => {
        rect: any;
        visibleRect: any;
        lastVisibleRect: any;
    };
    getBeginEndOfDOMRect: (rect: Rect) => {
        begin: any;
        end: any;
    };
    getBeginEndOfContainer: () => {
        begin: any;
        end: any;
    };
    getBeginEndOfContainerVisibleRect: () => {
        begin: any;
        end: any;
    };
    getBeginEnd: (element: HTMLElement) => {
        begin: number;
        end: number;
    };
    getAxisValue: (position: Position) => Axis;
    setTranslation: (element: ElementX, translation: number) => void;
    getTranslation: (element: ElementX) => number;
    setVisibility: (element: ElementX, isVisible: boolean) => void;
    isVisible: (element: ElementX) => boolean;
    isInVisibleRect: (x: number, y: number) => boolean;
    setSize: (element: HTMLElement | CSSStyleDeclaration, size: string) => void;
    getTopLeftOfElementBegin: (begin: number) => {
        top: number;
        left: number;
    };
    getScrollSize: (element: HTMLElement) => number;
    getScrollValue: (element: HTMLElement) => number;
    setScrollValue: (element: HTMLElement, val: number) => void;
    invalidate: () => void;
    invalidateRects: () => void;
    getPosition: (position: Position) => Rect;
    setBegin: (style: CSSStyleDeclaration, value: string) => void;
}
