import type { GraphComponent } from "../../components/canvas/GraphComponent";
import type { CursorLayerCursorTypes } from "../../components/canvas/layers/cursorLayer/CursorLayer";
/**
 * Options for creating a custom drag operation via DragService.startOperation()
 */
export type DragOperationOptions = {
    /** Document to attach listeners to. Defaults to graph canvas document if not provided */
    document?: Document;
    /** Cursor to show during drag */
    cursor?: CursorLayerCursorTypes;
    component?: GraphComponent;
    /** Enable autopanning when dragging near edges */
    autopanning?: boolean;
    /** Stop drag when mouse leaves the document */
    stopOnMouseLeave?: boolean;
    /**
     * Minimum distance in pixels the mouse must move before drag starts.
     * If not set, uses graph's dragThreshold setting.
     */
    threshold?: number;
    /**
     * Initial event to use for threshold calculation.
     * If not set, uses the first mousemove event.
     */
    initialEvent?: MouseEvent;
    /**
     * Blocks browser text selection for the drag session.
     * @default true
     */
    suppressTextSelection?: boolean;
};
/**
 * Callbacks for custom drag operation lifecycle
 */
export type DragOperationCallbacks = {
    /** Called when drag starts (first mousemove after mousedown) */
    onStart?: (event: MouseEvent, coords: [number, number]) => void;
    /** Called on each mousemove during drag */
    onUpdate?: (event: MouseEvent, coords: [number, number]) => void;
    /** Called when drag ends (mouseup) */
    onEnd?: (event: MouseEvent, coords: [number, number]) => void;
};
/**
 * Current state of drag operation, accessible via DragService.$state signal
 */
export type DragState = {
    /** Whether a drag operation is currently in progress */
    isDragging: boolean;
    /** The initial mouse event that started the drag operation (for checking modifiers like shiftKey) */
    initialEvent: MouseEvent | null;
    /** The current mouse event (updated on each drag move) */
    currentEvent: MouseEvent | null;
    /** Components participating in the current drag operation */
    components: GraphComponent[];
    /** Set of component type names (constructor names) participating in drag */
    componentTypes: Set<string>;
    /** Whether multiple components are being dragged */
    isMultiple: boolean;
    /** Whether all dragged components are of the same type */
    isHomogeneous: boolean;
    /** Starting coordinates in world space when drag began */
    startCoords: [number, number] | null;
    /** Current coordinates in world space */
    currentCoords: [number, number] | null;
};
/**
 * Context passed to drag lifecycle methods
 */
export type DragContext = {
    /** The native mouse event */
    sourceEvent: MouseEvent;
    /** Starting coordinates in world space when drag began */
    startCoords: [number, number];
    /** Previous coordinates in world space from last frame */
    prevCoords: [number, number];
    /** Current coordinates in world space */
    currentCoords: [number, number];
    /** All components participating in this drag operation */
    components: GraphComponent[];
};
/**
 * Diff values passed to handleDrag method
 */
export type DragDiff = {
    /** Starting coordinates in world space when drag began */
    startCoords: [number, number];
    /** Previous coordinates in world space from last frame */
    prevCoords: [number, number];
    /** Current coordinates in world space */
    currentCoords: [number, number];
    /** Absolute X displacement from start (currentCoords.x - startCoords.x) */
    diffX: number;
    /** Absolute Y displacement from start (currentCoords.y - startCoords.y) */
    diffY: number;
    /** Incremental X change since last frame (currentCoords.x - prevCoords.x) */
    deltaX: number;
    /** Incremental Y change since last frame (currentCoords.y - prevCoords.y) */
    deltaY: number;
};
