import type { PointerSample } from '@geometra/core'; /** * Host-agnostic surface that every gesture recognizer in `@geometra/core` * implements. We redeclare it here rather than importing each recognizer type * so callers can pass any array of compatible recognizers (including user-built * ones) without having to list every union member. */ export interface CanvasGestureRecognizerLike { pointerDown(sample: PointerSample): void; pointerMove(sample: PointerSample): void; pointerUp(sample: PointerSample): void; pointerCancel(pointerId: number): void; } export interface AttachGestureRecognizersOptions { /** * When true (default), `pointermove` / `pointerup` / `pointercancel` are * attached to `document` so drags continue if the pointer leaves the canvas. * Set false to clamp all events to the canvas bounds (useful in test * environments without `document`). */ trackOutsideCanvas?: boolean; /** * High-resolution timestamp source. Defaults to `performance.now()` — or a * frozen `0` when `performance` is unavailable (SSR/Node test envs). */ now?: () => number; /** * Optional override for the document-like target used for outside-canvas * tracking. Primarily for tests that can't rely on a global `document`. */ documentTarget?: { addEventListener: Document['addEventListener']; removeEventListener: Document['removeEventListener']; }; } /** * Convert browser `PointerEvent`s into {@link PointerSample}s and fan them out * to one or more `@geometra/core` gesture recognizers (pan / swipe / pinch or * user-built state machines). Returns a cleanup function. * * Typical integration: * * ```ts * import { createPanRecognizer } from '@geometra/core' * import { attachGestureRecognizers } from '@geometra/renderer-canvas' * * const pan = createPanRecognizer({ onMove: e => setOffset(e.deltaX, e.deltaY) }) * const stop = attachGestureRecognizers(canvas, [pan]) * // ...later: stop() * ``` * * `pointerdown` is always attached to the canvas. `pointermove` / * `pointerup` / `pointercancel` are attached to `document` by default so drags * continue after the pointer leaves the canvas — the sample coordinates stay * relative to the canvas because we subtract `getBoundingClientRect()` on every * event. Set `trackOutsideCanvas: false` to clamp to the canvas. * * We track which pointer IDs have been seen via `pointerdown` on this canvas so * stray moves/ups from unrelated elements can't accidentally drive recognizer * state. */ export declare function attachGestureRecognizers(canvas: HTMLCanvasElement, recognizers: ReadonlyArray, options?: AttachGestureRecognizersOptions): () => void; //# sourceMappingURL=gestures.d.ts.map