/**
 * Point in 2D space.
 *
 * @public
 */
export interface IPoint {
    /**
     * X coordinate.
     */
    x: number;
    /**
     * Y coordinate.
     */
    y: number;
}
/**
 * Drag axis constraint.
 *
 * @public
 */
export type DragAxis = 'x' | 'y' | null;
/**
 * Layout direction (for RTL/LTR support).
 *
 * @public
 */
export type Direction = 'ltr' | 'rtl';
/**
 * Drop list orientation.
 *
 * @public
 */
export type DropListOrientation = 'horizontal' | 'vertical' | 'mixed';
/**
 * Preview container location.
 *
 * @public
 */
export type PreviewContainer = 'global' | 'parent' | HTMLElement;
/**
 * Drag start delay configuration.
 *
 * @public
 */
export type DragStartDelay = number | {
    touch: number;
    mouse: number;
};
/**
 * Minimum distance (in pixels) the pointer must travel before drag starts.
 * Can be a single number for all inputs, or separate values for touch and mouse.
 *
 * @public
 */
export type DragStartDistance = number | {
    touch: number;
    mouse: number;
};
/**
 * Configuration for constraining drag position.
 *
 * @public
 */
export type DragConstrainPosition = (userPointerPosition: IPoint, dragRef: unknown, dimensions: DOMRect, pickupPositionInElement: IPoint) => IPoint;
/**
 * Configuration for DragRef.
 *
 * @public
 */
export interface IDragRefConfig {
    /**
     * Whether dragging is disabled.
     *
     * @defaultValue false
     */
    disabled?: boolean;
    /**
     * Lock dragging to a specific axis.
     *
     * @defaultValue null
     */
    lockAxis?: DragAxis;
    /**
     * Root element to use for dragging (if different from host).
     */
    rootElement?: HTMLElement;
    /**
     * Where to insert the preview element.
     *
     * @defaultValue 'global'
     */
    previewContainer?: PreviewContainer;
    /**
     * CSS class(es) to apply to the preview element.
     */
    previewClass?: string | Array<string>;
    /**
     * Delay before drag starts.
     *
     * @defaultValue 0
     */
    dragStartDelay?: DragStartDelay;
    /**
     * Minimum distance in pixels the pointer must move before a drag operation starts.
     * Useful to prevent accidental drags when the element also handles click events.
     *
     * @defaultValue 0
     */
    dragStartDistance?: DragStartDistance;
    /**
     * Boundary element or selector to constrain dragging within.
     */
    boundaryElement?: string | HTMLElement | null;
    /**
     * Custom function to constrain drag position.
     */
    constrainPosition?: DragConstrainPosition;
    /**
     * Scale factor for the dragged element.
     *
     * @defaultValue 1
     */
    scale?: number;
    /**
     * Z-index for the preview element.
     */
    zIndex?: number;
    /**
     * Threshold for pointer direction change detection (in pixels).
     *
     * @defaultValue 5
     */
    pointerDirectionChangeThreshold?: number;
    /**
     * Layout direction (ltr/rtl).
     *
     * @defaultValue 'ltr'
     */
    direction?: Direction;
    /**
     * Parent DragRef (for nested draggables).
     */
    parentDragRef?: unknown;
    /**
     * Custom preview template element or function.
     */
    previewTemplate?: HTMLElement | (() => HTMLElement);
    /**
     * Custom placeholder template element or function.
     */
    placeholderTemplate?: HTMLElement | (() => HTMLElement);
    /**
     * How the drag preview is created.
     * - `'ghost'`: Creates a separate `<mosaik-ghost>` clone (legacy behavior).
     * - `'element'`: Uses the actual dragged element with `position: fixed` (default).
     *
     * @defaultValue 'element'
     */
    previewMode?: 'ghost' | 'element';
}
/**
 * Configuration for DropListRef.
 *
 * @public
 */
export interface IDropListRefConfig {
    /**
     * Whether dropping is disabled.
     *
     * @defaultValue false
     */
    disabled?: boolean;
    /**
     * Orientation of the drop list.
     *
     * @defaultValue 'vertical'
     */
    orientation?: DropListOrientation;
    /**
     * Lock axis for items in the list.
     *
     * @defaultValue null
     */
    lockAxis?: DragAxis;
    /**
     * Whether sorting within the list is disabled.
     *
     * @defaultValue false
     */
    sortingDisabled?: boolean;
    /**
     * Whether auto-scrolling is disabled.
     *
     * @defaultValue false
     */
    autoScrollDisabled?: boolean;
    /**
     * Auto-scroll step size in pixels.
     *
     * @defaultValue 2
     */
    autoScrollStep?: number;
    /**
     * Predicate to determine if an item can enter this list.
     */
    enterPredicate?: (drag: unknown, drop: unknown) => boolean;
    /**
     * Predicate to determine if an item can be sorted at a given index.
     */
    sortPredicate?: (index: number, drag: unknown, drop: unknown) => boolean;
    /**
     * Selector for the actual container element (if different from host).
     */
    elementContainerSelector?: string | null;
    /**
     * Unique identifier for this drop list.
     */
    id?: string;
    /**
     * Custom data associated with this drop list.
     */
    data?: unknown;
}
/**
 * Direction of pointer movement.
 *
 * @public
 */
export interface IPointerDirection {
    /**
     * Horizontal direction: 1 (right), -1 (left), 0 (none).
     */
    x: number;
    /**
     * Vertical direction: 1 (down), -1 (up), 0 (none).
     */
    y: number;
}
/**
 * Base interface for drag events.
 *
 * @public
 */
export interface IBaseDragEventDetail {
    /**
     * The DragRef that emitted the event.
     */
    source: unknown;
    /**
     * Current pointer position.
     */
    pointerPosition: IPoint;
    /**
     * Delta since drag started.
     */
    delta: IPoint;
    /**
     * Total distance dragged.
     */
    distance: IPoint;
    /**
     * Native event (if available).
     */
    event?: PointerEvent | KeyboardEvent;
}
/**
 * Drag start event detail.
 *
 * @public
 */
export interface IDragStartEventDetail extends IBaseDragEventDetail {
    /**
     * Event type.
     */
    type: 'dragStart';
}
/**
 * Drag move event detail.
 *
 * @public
 */
export interface IDragMoveEventDetail extends IBaseDragEventDetail {
    /**
     * Event type.
     */
    type: 'dragMove';
}
/**
 * Drag end event detail.
 *
 * @public
 */
export interface IDragEndEventDetail extends IBaseDragEventDetail {
    /**
     * Event type.
     */
    type: 'dragEnd';
    /**
     * Whether the item was dropped in a valid location.
     */
    dropped: boolean;
}
/**
 * Drag release event detail (before animations).
 *
 * @public
 */
export interface IDragReleaseEventDetail extends IBaseDragEventDetail {
    /**
     * Event type.
     */
    type: 'dragRelease';
}
/**
 * Drag enter event detail (entering a drop list).
 *
 * @public
 */
export interface IDragEnterEventDetail {
    /**
     * Event type.
     */
    type: 'dragEnter';
    /**
     * The item being dragged.
     */
    item: unknown;
    /**
     * The drop list being entered.
     */
    container: unknown;
    /**
     * Current index in the container.
     */
    currentIndex: number;
}
/**
 * Drag exit event detail (leaving a drop list).
 *
 * @public
 */
export interface IDragExitEventDetail {
    /**
     * Event type.
     */
    type: 'dragExit';
    /**
     * The item being dragged.
     */
    item: unknown;
    /**
     * The drop list being exited.
     */
    container: unknown;
}
/**
 * Drop event detail.
 *
 * @public
 */
export interface IDropEventDetail<TData = unknown, TItemData = TData> {
    /**
     * Event type.
     */
    type: 'drop';
    /**
     * The drop list where the item was before.
     */
    previousContainer: unknown;
    /**
     * The drop list where the item is now.
     */
    container: unknown;
    /**
     * The item that was dropped.
     */
    item: unknown;
    /**
     * Previous index in the previous container.
     */
    previousIndex: number;
    /**
     * Current index in the current container.
     */
    currentIndex: number;
    /**
     * Whether the pointer is over the container.
     */
    isPointerOverContainer: boolean;
    /**
     * Distance the item was dragged.
     */
    distance: IPoint;
    /**
     * Data from previous container.
     */
    previousData?: TData;
    /**
     * Data from current container.
     */
    currentData?: TData;
    /**
     * Data from the dragged item.
     */
    itemData?: TItemData;
}
/**
 * Drop list sorted event detail.
 *
 * @public
 */
export interface IDropListSortEventDetail {
    /**
     * Event type.
     */
    type: 'sorted';
    /**
     * The item being sorted.
     */
    item: unknown;
    /**
     * The drop list.
     */
    container: unknown;
    /**
     * Previous index.
     */
    previousIndex: number;
    /**
     * Current index.
     */
    currentIndex: number;
}
/**
 * Alias for IDropListSortEventDetail.
 *
 * @public
 */
export type ISortEventDetail = IDropListSortEventDetail;
/**
 * Drop list enter event detail.
 *
 * @public
 */
export interface IDropListEnterEventDetail extends IDragEnterEventDetail {
}
/**
 * Drop list exit event detail.
 *
 * @public
 */
export interface IDropListExitEventDetail extends IDragExitEventDetail {
}
//# sourceMappingURL=Types.d.ts.map