UNPKG

@mui/x-internal-gestures

Version:

The core engine of GestureEvents, a modern and robust multi-pointer gesture detection library for JavaScript.

116 lines 4.85 kB
import { ActiveGesturesRegistry } from "./ActiveGesturesRegistry.js"; import { Gesture, GestureEventData, GestureOptions, type BaseGestureOptions } from "./Gesture.js"; import type { KeyboardManager } from "./KeyboardManager.js"; import { PointerData, PointerManager } from "./PointerManager.js"; import { TargetElement } from "./types/TargetElement.js"; /** * Base configuration options that can be overridden per pointer mode. */ export type BasePointerGestureOptions = BaseGestureOptions & { /** * Minimum number of pointers required to activate the gesture. * The gesture will not start until at least this many pointers are active. * * @default 1 */ minPointers?: number; /** * Maximum number of pointers allowed for this gesture to remain active. * If more than this many pointers are detected, the gesture may be canceled. * * @default Infinity (no maximum) */ maxPointers?: number; }; /** * Configuration options for pointer-based gestures, extending the base GestureOptions. * * These options provide fine-grained control over how pointer events are interpreted * and when the gesture should be recognized. */ export interface PointerGestureOptions<GestureName extends string> extends GestureOptions<GestureName, BasePointerGestureOptions> {} export type PointerGestureEventData<CustomData extends Record<string, unknown> = Record<string, unknown>> = GestureEventData<CustomData> & { /** The original event that triggered this gesture */ srcEvent: PointerEvent; }; /** * Base class for all pointer-based gestures. * * This class extends the base Gesture class with specialized functionality for * handling pointer events via the PointerManager. It provides common logic for * determining when a gesture should activate, tracking pointer movements, and * managing pointer thresholds. * * All pointer-based gesture implementations should extend this class rather than * the base Gesture class. * * @example * ```ts * import { PointerGesture } from './PointerGesture'; * * class CustomGesture extends PointerGesture { * constructor(options) { * super(options); * } * * clone(overrides) { * return new CustomGesture({ * name: this.name, * // ... other options * ...overrides, * }); * } * * handlePointerEvent = (pointers, event) => { * // Handle pointer events here * } * } * ``` */ export declare abstract class PointerGesture<GestureName extends string> extends Gesture<GestureName> { /** Function to unregister from the PointerManager when destroying this gesture */ protected unregisterHandler: (() => void) | null; /** The original target element when the gesture began, used to prevent limbo state if target is removed */ protected originalTarget: TargetElement | null; protected abstract readonly optionsType: PointerGestureOptions<GestureName>; protected abstract readonly mutableOptionsType: Omit<typeof this.optionsType, 'name'>; /** * Minimum number of simultaneous pointers required to activate the gesture. * The gesture will not start until at least this many pointers are active. */ protected minPointers: number; /** * Maximum number of simultaneous pointers allowed for this gesture. * If more than this many pointers are detected, the gesture may be canceled. */ protected maxPointers: number; constructor(options: PointerGestureOptions<GestureName>); init(element: TargetElement, pointerManager: PointerManager, gestureRegistry: ActiveGesturesRegistry<GestureName>, keyboardManager: KeyboardManager): void; protected updateOptions(options: typeof this.mutableOptionsType): void; protected getBaseConfig(): { requiredKeys: import("./KeyboardManager.js").KeyboardKey[]; minPointers: number; maxPointers: number; }; protected isWithinPointerCount(pointers: PointerData[], pointerMode: string): boolean; /** * Handler for pointer events from the PointerManager. * Concrete gesture implementations must override this method to provide * gesture-specific logic for recognizing and tracking the gesture. * * @param pointers - Map of active pointers by pointer ID * @param event - The original pointer event from the browser */ protected abstract handlePointerEvent(pointers: Map<number, PointerData>, event: PointerEvent): void; /** * Calculate the target element for the gesture based on the active pointers. * * It takes into account the original target element. * * @param pointers - Map of active pointers by pointer ID * @param calculatedTarget - The target element calculated from getTargetElement * @returns A list of relevant pointers for this gesture */ protected getRelevantPointers(pointers: PointerData[], calculatedTarget: TargetElement): PointerData[]; destroy(): void; }