/**
* Generic draggable utility based on Pointer Events API.
* Zero dependencies — replaces ad-hoc pointer event loops across the library.
*
* Supports: mouse, touch, pen. Uses pointer capture for reliable tracking.
*
* @example Svelte attachment for horizontal reordering
* ```svelte
*
*
*
{ element.style.opacity = '0.4'; },
* onDragMove: ({ clientX, clientY }) => { updateDropIndicator(clientX, clientY); },
* onDragEnd: ({ element }) => { element.style.opacity = ''; finalizeReorder(); },
* })}>
* ```
*/
import type { Attachment } from 'svelte/attachments';
export interface DragStartEvent {
/** The element being dragged */
element: HTMLElement;
/** Initial pointer X */
startX: number;
/** Initial pointer Y */
startY: number;
/** Current pointer X */
clientX: number;
/** Current pointer Y */
clientY: number;
/** Original PointerEvent */
originalEvent: PointerEvent;
}
export interface DragMoveEvent {
element: HTMLElement;
startX: number;
startY: number;
clientX: number;
clientY: number;
/** Delta from start X */
deltaX: number;
/** Delta from start Y */
deltaY: number;
originalEvent: PointerEvent;
}
export interface DragEndEvent {
element: HTMLElement;
startX: number;
startY: number;
clientX: number;
clientY: number;
deltaX: number;
deltaY: number;
/** Whether the drag exceeded the threshold (true = real drag, false = cancelled/tap) */
didDrag: boolean;
originalEvent: PointerEvent;
}
export interface DraggableOptions {
/**
* Pixel distance before drag activates (prevents accidental drags on click).
* @default 5
*/
threshold?: number;
/**
* Constrain drag to an axis. `'both'` allows free movement.
* @default 'both'
*/
axis?: 'horizontal' | 'vertical' | 'both';
/**
* Whether dragging is disabled.
* @default false
*/
disabled?: boolean;
/**
* Cursor to show during drag.
* @default 'grabbing'
*/
cursor?: string;
/**
* Called once when drag threshold is exceeded.
*/
onDragStart?: (event: DragStartEvent) => void;
/**
* Called on every pointer move during an active drag.
*/
onDragMove?: (event: DragMoveEvent) => void;
/**
* Called when the pointer is released or cancelled.
*/
onDragEnd?: (event: DragEndEvent) => void;
}
/**
* Svelte attachment that makes an element draggable via Pointer Events.
*
* Usage: ``
*/
export declare function createDraggable(opts: DraggableOptions): Attachment;
/**
* Finds the closest element with a specific data attribute under the pointer.
* Useful for identifying drop targets during drag.
*/
export declare function findDropTarget(clientX: number, clientY: number, attribute: string): HTMLElement | null;