gesturx 1.8.9 → 1.8.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n (hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n /**\n * A pointercancel cean come after a drag event and heven being completely\n * desync, leading to erroned values. We should just ignore it.\n */\n curr.event.type === \"pointercancel\"\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2 &&\n /**\n * A pointercancel cean come after a drag event and heven being completely\n * desync, leading to erroned values. We should just ignore it.\n */\n curr.event.type !== \"pointercancel\"\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n const pointerEvents$ = merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n\n return {\n pointerEvents$,\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n Observable,\n combineLatest,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n startWith,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport interface FailWith {\n start$: Observable<unknown>\n end$: Observable<unknown>\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: FailWith[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n public config$ = this.configSubject.pipe(isValidConfig)\n\n abstract events$: Observable<Event>\n\n /**\n * Track active running failWith recognizers\n */\n protected failWithActive$: Observable<boolean>\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(\n ({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }).pointerEvents$,\n ),\n share(),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const panStarted$ = of(panStartEvent)\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const trailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, trailingEndEventIfFailed$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import {\n Observable,\n filter,\n map,\n share,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n switchMap(([startEvent]) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n takeUntil(\n this.failWithActive$.pipe(filter((isActive) => isActive)),\n ),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const scanPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n NEVER,\n Observable,\n defaultIfEmpty,\n filter,\n first,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n takeWhile,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = this.panStart$.pipe(\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n switchMap((event) =>\n of(event).pipe(\n // we don't want a scan on pinch start\n scanPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n scanPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n takeUntil(failingActive$),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) => {\n let latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent\n\n return this.pan$.pipe(\n switchMap((event) => {\n if (event.type === \"end\") {\n return of(event)\n }\n\n latestEvent = event\n\n return NEVER\n }),\n takeUntil(failingActive$),\n defaultIfEmpty(null),\n map((endEventOrNull) =>\n endEventOrNull ? endEventOrNull : latestEvent,\n ),\n scanPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: latestEvent,\n }),\n share(),\n )\n }),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n recognizers: T\n /**\n * If you don't need to have text selection, set this to true\n * to improve dragging gesture. This will prevent accidental\n * text selection on your component.\n */\n disableTextSelection?: boolean\n} & RecognizerConfig<unknown>\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(protected options: RecognizableOptions<T>) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update({\n disableTextSelection,\n ...rest\n }: Partial<RecognizableOptions<T>>) {\n if (rest.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n rest.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n if (disableTextSelection) {\n rest.container.style.userSelect = `none`\n }\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(rest)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { type Observable, filter } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\ttype Observable,\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { type Observable, filter } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { type Observable, map, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: new Date().getTime(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\ttype Observable,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { type Observable, filter } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\nimport { isRecognizedAsSwipe } from \"./operators\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmergeMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\ttype Observable,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tmerge,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\tmap((event) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap(() =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tscan<\n\t\t\t\t\t\t\t\tRecognizerPanEvent,\n\t\t\t\t\t\t\t\tRecognizerPanEvent & { angle: number; deltaAngle: number },\n\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t>((acc, current) => {\n\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { type Observable, map, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: !!acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tNEVER,\n\ttype Observable,\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent;\n\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\tswitchMap((event) => {\n\t\t\t\t\t\t\t\tif (event.type === \"end\") {\n\t\t\t\t\t\t\t\t\treturn of(event);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\n\t\t\t\t\t\t\t\treturn NEVER;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEventOrNull) =>\n\t\t\t\t\t\t\t\tendEventOrNull ? endEventOrNull : latestEvent,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchEnd\",\n\t\t\t\t\t\t\t\tinitialEvent: latestEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\ttype Observable,\n\ttype ObservedValueOf,\n\tcombineLatest,\n\tmap,\n\tmerge,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<ObservedValueOf<T[number][\"events$\"]>>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) => recognizer.events$),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<RecognizableOptions<T>>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialPoint","index","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
package/package.json CHANGED
@@ -1,64 +1,61 @@
1
1
  {
2
- "name": "gesturx",
3
- "private": false,
4
- "version": "1.8.9",
5
- "type": "module",
6
- "main": "./dist/index.umd.cjs",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "import": "./dist/index.js",
12
- "require": "./dist/index.umd.cjs"
13
- }
14
- },
15
- "files": [
16
- "dist"
17
- ],
18
- "scripts": {
19
- "dev": "vite",
20
- "build": "tsc && vite build",
21
- "build:lib": "tsc && cross-env LIB_MODE=true vite build",
22
- "preview": "vite preview",
23
- "lint": "prettier --write . && eslint --fix .",
24
- "test": "vitest",
25
- "coverage": "vitest run --coverage"
26
- },
27
- "devDependencies": {
28
- "@chakra-ui/react": "^3.1.1",
29
- "@emotion/react": "^11.11.4",
30
- "@emotion/styled": "^11.11.5",
31
- "@eslint/compat": "^1.1.0",
32
- "@eslint/js": "^9.15.0",
33
- "@types/eslint__js": "^8.42.3",
34
- "@types/node": "^22.9.0",
35
- "@types/react": "^18.3.2",
36
- "@types/react-dom": "^18.3.0",
37
- "@vitejs/plugin-react": "^4.3.0",
38
- "@vitest/coverage-v8": "^2.1.5",
39
- "cross-env": "^7.0.3",
40
- "eslint": "^9.16.0",
41
- "eslint-plugin-react": "^7.34.2",
42
- "framer-motion": "^11.2.6",
43
- "globals": "^15.6.0",
44
- "happy-dom": "^15.11.6",
45
- "prettier": "^3.3.1",
46
- "react": "^18.3.1",
47
- "react-dom": "^18.3.1",
48
- "rollup-plugin-node-externals": "^7.1.3",
49
- "rxjs": "^7.8.1",
50
- "typescript": "^5.6.3",
51
- "typescript-eslint": "^8.14.0",
52
- "vite": "^6.0.3",
53
- "vite-plugin-dts": "^4.3.0",
54
- "vite-plugin-eslint": "^1.8.1",
55
- "vitest": "^2.1.5"
56
- },
57
- "peerDependencies": {
58
- "rxjs": "7.x"
59
- },
60
- "dependencies": {
61
- "next-themes": "^0.4.3",
62
- "react-icons": "^5.4.0"
63
- }
2
+ "name": "gesturx",
3
+ "private": false,
4
+ "version": "1.8.10",
5
+ "type": "module",
6
+ "main": "./dist/index.umd.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.umd.cjs"
13
+ }
14
+ },
15
+ "files": ["dist"],
16
+ "scripts": {
17
+ "dev": "vite",
18
+ "build": "tsc && vite build",
19
+ "build:lib": "tsc && cross-env LIB_MODE=true vite build",
20
+ "preview": "vite preview",
21
+ "check": "npx @biomejs/biome check .",
22
+ "test": "vitest",
23
+ "coverage": "vitest run --coverage",
24
+ "prepare": "husky"
25
+ },
26
+ "devDependencies": {
27
+ "@biomejs/biome": "1.9.4",
28
+ "@chakra-ui/react": "^3.1.1",
29
+ "@emotion/react": "^11.11.4",
30
+ "@emotion/styled": "^11.11.5",
31
+ "@types/node": "^22.9.0",
32
+ "@types/react": "^19.0.0",
33
+ "@types/react-dom": "^19.0.0",
34
+ "@vitejs/plugin-react": "^4.3.0",
35
+ "@vitest/coverage-v8": "^3.0.5",
36
+ "cross-env": "^7.0.3",
37
+ "framer-motion": "^12.4.2",
38
+ "globals": "^15.6.0",
39
+ "happy-dom": "^17.1.0",
40
+ "husky": "^9.1.7",
41
+ "lint-staged": "^15.3.0",
42
+ "react": "^19.0.0",
43
+ "react-dom": "^19.0.0",
44
+ "rollup-plugin-node-externals": "^8.0.0",
45
+ "rxjs": "^7.8.1",
46
+ "typescript": "^5.6.3",
47
+ "vite": "^6.0.3",
48
+ "vite-plugin-dts": "^4.3.0",
49
+ "vitest": "^3.0.5",
50
+ "next-themes": "^0.4.3",
51
+ "react-icons": "^5.4.0"
52
+ },
53
+ "peerDependencies": {
54
+ "rxjs": "7.x"
55
+ },
56
+ "lint-staged": {
57
+ "*": [
58
+ "biome check --no-errors-on-unmatched --files-ignore-unknown=true --write"
59
+ ]
60
+ }
64
61
  }