gesturx 1.8.9 → 1.9.0

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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.js","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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"}
@@ -1,2 +1,2 @@
1
- (function($,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):($=typeof globalThis<"u"?globalThis:$||self,e($.gesturx={},$.rxjs))})(this,function($,e){"use strict";var oe=Object.defineProperty;var ae=($,e,P)=>e in $?oe($,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):$[e]=P;var c=($,e,P)=>ae($,typeof e!="symbol"?e+"":e,P);function P(i,p){return Math.sqrt(Math.pow(p.x-i.x,2)+Math.pow(p.y-i.y,2))}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((s,a,l)=>s+i.slice(l+1).reduce((o,r)=>o+P(a,r),0),0),n=p*(p-1)/2;return t/n}function I(i,p){const t=p.x-i.x,n=p.y-i.y;return Math.atan2(n,t)}function V(i,p){return I(i,p)*(180/Math.PI)}function E(i){const p=i.reduce((n,s)=>(n.x+=s.x,n.y+=s.y,n),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(i),n=E(p);let s=0;for(let o=0;o<i.length;o++){const r=I(t,i[o]);let u=I(n,p[o])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),s+=u}const a=s/i.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(i){return i!=null}const _=i=>i.length>0,G=i=>i.pipe(e.filter(_));function C(i,p,t){const n=E([i]),s=E([p]);return Math.abs(s.x-n.x)>=t||Math.abs(s.y-n.y)>=t}const H=(i,p,t)=>{const n=i>0?p/i:0,s=i>0?t/i:0;return{velocityX:n,velocityY:s}};function T(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const F=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",J=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),L=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(r=>r.type==="pointerup")),n=i.pipe(e.filter(r=>r.type==="pointerleave")),s=i.pipe(e.filter(r=>r.type==="pointercancel")),a=i.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),o=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return p.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,s,n,t,l)).pipe(T(r),e.takeWhile(f=>!o(f),!0))}),e.scan((r,h)=>{if(o(h)){const{[h.pointerId]:u,...f}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:f}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},U=(i,p,t,n)=>{const s=i.x-p.x+t,a=i.y-p.y+n;return{deltaX:s,deltaY:a}},O=i=>{const p=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,n)=>{var v,M;const s=p(n),a=(t==null?void 0:t.center)??s,l=(t==null?void 0:t.deltaX)??0,o=(t==null?void 0:t.deltaY)??0,r=((v=t==null?void 0:t.latestActivePointers)==null?void 0:v.length)??1,h=((M=n.latestActivePointers)==null?void 0:M.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(n.event.type)&&r!==h,f=h>0,{deltaX:g,deltaY:m}=u&&f||n.event.type==="pointercancel"?U(s,s,l,o):U(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2&&n.event.type!=="pointercancel"?B((t==null?void 0:t.latestActivePointers)??[],n.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...n,center:s,deltaX:g,deltaY:m,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:n,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,u=a??[],g=Date.now()-l,{velocityX:m,velocityY:y}=H(g,n,s),v=N(a);return{deltaX:n,deltaY:s,velocityX:m,velocityY:y,delay:g,center:o,pointers:u,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:v}}))},W=i=>i.pipe(e.filter(p=>!!p.container)),X=i=>i.pipe(e.filter(F)),K=({container:i,afterEventReceived:p=t=>t})=>{const t=J({afterEventReceived:p,container:i}),n=e.fromEvent(i,"pointerup").pipe(e.map(p)),s=e.fromEvent(i,"pointermove").pipe(e.map(p)),a=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return{pointerEvents$:e.merge(t,l,a,n,s),pointerDown$:t,pointerCancel$:l,pointerLeave$:a,pointerUp$:n,pointerMove$:s}};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(W));c(this,"failWithActive$");const n=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}).pointerEvents$),e.share()),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X);const s=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=s.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(o=>{const r=o.start$.pipe(e.map(()=>!0)),h=o.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(W,e.switchMap(a=>{var g,m,y;const l=Math.max(1,((g=a.panConfig)==null?void 0:g.numInputs)??1),o=Math.max(0,((m=a.panConfig)==null?void 0:m.posThreshold)??0),r=Math.max(0,((y=a.panConfig)==null?void 0:y.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),u=v=>v.pipe(e.filter(M=>M.pointers.length>=l)),f=v=>v.pipe(e.filter(M=>M.pointers.length<l));return h.pipe(u,e.exhaustMap(({pointers:v})=>{const M=h.pipe(f,e.first(),e.share()),z=e.timer(r),R=e.merge(...v.map(d=>e.of(d)),this.pointerDown$).pipe(e.mergeMap(d=>e.merge(this.pointerMove$,e.of(d)).pipe(T(d),e.filter(A=>C(d,A,o)))),e.first()).pipe(e.switchMap(()=>z),e.withLatestFrom(h),e.map(([,{event:d,pointers:A}])=>({type:"start",event:d,latestActivePointers:A})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(M)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:d,pointers:A})=>({type:"move",event:d,latestActivePointers:A})))),e.takeUntil(M)),w=R.pipe(e.mergeMap(()=>M.pipe(e.map(({event:d,pointers:A})=>({type:"end",event:d,latestActivePointers:A}))))),b=e.merge(R,S,w).pipe(e.shareReplay(1));return b.pipe(O,e.withLatestFrom(b),e.map(([d,{type:A}])=>({...d,type:A})))}))}),e.tap(a=>{n.next({fingers:a.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(a=>a.type==="start"),e.map(({type:a,...l})=>l)),this.panMove$=this.pan$.pipe(e.filter(a=>a.type==="move"),e.map(({type:a,...l})=>l)),this.panEnd$=this.pan$.pipe(e.filter(a=>a.type==="end"),e.map(({type:a,...l})=>l)),this.state$=n.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const n=this.configSubject.getValue();this.configSubject.next({...n,...p,...p.options&&{options:{...n.options,...p.options}},panConfig:{...n.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const n=this.panStart$.pipe(e.map(o=>({type:"panStart",...o})),e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.share()),s=this.panEnd$.pipe(e.map(o=>({type:"panEnd",...o})),e.share()),a=this.panMove$.pipe(e.map(o=>({type:"panMove",...o})));this.events$=n.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),u=this.failWithActive$.pipe(e.filter(m=>m),e.first()),f=e.merge(h,a,s).pipe(e.tap(m=>{r=m}),e.takeUntil(u)),g=u.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge(f,g)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="panStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{const{escapeVelocity:s=.9}=n.options??{};return this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,a])=>!a),e.switchMap(([a])=>this.panEnd$.pipe(Z(s),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})),e.takeUntil(this.failWithActive$.pipe(e.filter(l=>l))))),e.share())}))}update(t){super.update(t)}}const j=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(n=>e.timer(i).pipe(e.takeUntil(p.pipe(X,T(n)))))),ee=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>n=>n.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(i,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{var g,m;const s=((g=n.options)==null?void 0:g.maxTaps)??1,a=((m=n.options)==null?void 0:m.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=n.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),u=y=>y.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(y=>{const v=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),M=v.pipe(u),z=v.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=v.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(w=>w)),this.pointerCancel$,h,z,Y),S=M.pipe(G,e.filter(w=>w.length<=s),e.map(w=>({type:"tap",taps:w.length,latestActivePointers:w,event:w[0]})),e.shareReplay(1));return S.pipe(O,e.withLatestFrom(S),e.map(([w,{type:b,taps:d}])=>({...w,type:b,taps:d})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ne extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=n.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((o,r)=>{const h=((o==null?void 0:o.angle)??0)+r.deltaPointersAngle;return{...o,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=s.pipe(e.filter(o=>o.type==="move"),e.map(o=>({...o,type:"rotateMove"}))),l=s.pipe(e.filter(o=>o.type==="end"),e.map(o=>({...o,type:"rotateEnd"})));return e.merge(n,a,l)}),e.share())}update(t){super.update(t,t.options)}}const k=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((n,s)=>{const l=((n==null?void 0:n.pointers.length)??0)!==s.pointers.length,o=(n==null?void 0:n.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:n&&"initialPointersAverageDistance"in n?n.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,u=s.pointersAverageDistance-r,f=s.pointersAverageDistance-r,g=l||o===0?1:s.pointersAverageDistance/o;return{...n,...s,type:i,initialPointersAverageDistance:r,scale:h,distance:u,deltaDistance:f,deltaDistanceScale:g}},p),e.map(({initialPointersAverageDistance:n,...s})=>s));class ie extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");c(this,"end$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.switchMap(o=>e.of(o).pipe(k({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),s=this.failWithActive$.pipe(e.filter(o=>o),e.first()),a=n.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),k({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=n.pipe(e.switchMap(o=>{let r=o;return this.pan$.pipe(e.switchMap(h=>h.type==="end"?e.of(h):(r=h,e.NEVER)),e.takeUntil(s),e.defaultIfEmpty(null),e.map(h=>h||r),k({type:"pinchEnd",initialEvent:r}),e.share())}));return e.merge(n,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(n=>n.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(n=>n.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((n,s)=>({fingers:Math.max(n.fingers,s.fingers)})))),this.update(p)}update({disableTextSelection:p,...t}){t.container&&(t.container.style.touchAction="none",p&&(t.container.style.userSelect="none")),this.options.recognizers.forEach(n=>{n.update(t)})}}$.PanRecognizer=Q,$.PinchRecognizer=ie,$.Recognizable=pe,$.Recognizer=D,$.RotateRecognizer=ne,$.SwipeRecognizer=x,$.TapRecognizer=te,Object.defineProperty($,Symbol.toStringTag,{value:"Module"})});
1
+ (function(u,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):(u=typeof globalThis<"u"?globalThis:u||self,e(u.gesturx={},u.rxjs))})(this,function(u,e){"use strict";var oe=Object.defineProperty;var ae=(u,e,P)=>e in u?oe(u,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):u[e]=P;var c=(u,e,P)=>ae(u,typeof e!="symbol"?e+"":e,P);function P(i,p){return Math.sqrt((p.x-i.x)**2+(p.y-i.y)**2)}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((s,a,l)=>s+i.slice(l+1).reduce((o,r)=>o+P(a,r),0),0),n=p*(p-1)/2;return t/n}function I(i,p){const t=p.x-i.x,n=p.y-i.y;return Math.atan2(n,t)}function V(i,p){return I(i,p)*(180/Math.PI)}function E(i){const p=i.reduce((n,s)=>(n.x+=s.x,n.y+=s.y,n),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(i),n=E(p);let s=0;i.forEach((o,r)=>{const h=I(t,o);let $=I(n,p[r]??o)-h;$>Math.PI?$-=2*Math.PI:$<-Math.PI&&($+=2*Math.PI),s+=$});const a=s/i.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(i){return i!=null}const _=i=>i.length>0,G=i=>i.pipe(e.filter(_));function C(i,p,t){const n=E([i]),s=E([p]);return Math.abs(s.x-n.x)>=t||Math.abs(s.y-n.y)>=t}const H=(i,p,t)=>{const n=i>0?p/i:0,s=i>0?t/i:0;return{velocityX:n,velocityY:s}};function T(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const F=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",J=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),L=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(r=>r.type==="pointerup")),n=i.pipe(e.filter(r=>r.type==="pointerleave")),s=i.pipe(e.filter(r=>r.type==="pointercancel")),a=i.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),o=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return p.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,s,n,t,l)).pipe(T(r),e.takeWhile($=>!o($),!0))}),e.scan((r,h)=>{if(o(h)){const{[h.pointerId]:d,...$}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:$}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},U=i=>i.pipe(e.filter(p=>!!p.container)),O=i=>i.pipe(e.filter(F)),W=(i,p,t,n)=>{const s=i.x-p.x+t,a=i.y-p.y+n;return{deltaX:s,deltaY:a}},X=i=>{const p=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,n)=>{var v,w;const s=p(n),a=(t==null?void 0:t.center)??s,l=(t==null?void 0:t.deltaX)??0,o=(t==null?void 0:t.deltaY)??0,r=((v=t==null?void 0:t.latestActivePointers)==null?void 0:v.length)??1,h=((w=n.latestActivePointers)==null?void 0:w.length)??1,d=["pointerdown","pointercancel","pointerleave","pointerup"].includes(n.event.type)&&r!==h,$=h>0,{deltaX:f,deltaY:m}=d&&$||n.event.type==="pointercancel"?W(s,s,l,o):W(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2&&n.event.type!=="pointercancel"?B((t==null?void 0:t.latestActivePointers)??[],n.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...n,center:s,deltaX:f,deltaY:m,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:n,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,d=a??[],f=Date.now()-l,{velocityX:m,velocityY:y}=H(f,n,s),v=N(a);return{deltaX:n,deltaY:s,velocityX:m,velocityY:y,delay:f,center:o,pointers:d,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:v}}))},K=({container:i,afterEventReceived:p=t=>t})=>{const t=J({afterEventReceived:p,container:i}),n=e.fromEvent(i,"pointerup").pipe(e.map(p)),s=e.fromEvent(i,"pointermove").pipe(e.map(p)),a=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return{pointerEvents$:e.merge(t,l,a,n,s),pointerDown$:t,pointerCancel$:l,pointerLeave$:a,pointerUp$:n,pointerMove$:s}};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(U));c(this,"failWithActive$");const n=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}).pointerEvents$),e.share()),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(O);const s=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=s.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(o=>{const r=o.start$.pipe(e.map(()=>!0)),h=o.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(U,e.switchMap(a=>{var f,m,y;const l=Math.max(1,((f=a.panConfig)==null?void 0:f.numInputs)??1),o=Math.max(0,((m=a.panConfig)==null?void 0:m.posThreshold)??0),r=Math.max(0,((y=a.panConfig)==null?void 0:y.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),d=v=>v.pipe(e.filter(w=>w.pointers.length>=l)),$=v=>v.pipe(e.filter(w=>w.pointers.length<l));return h.pipe(d,e.exhaustMap(({pointers:v})=>{const w=h.pipe($,e.first(),e.share()),k=e.timer(r),R=e.merge(...v.map(g=>e.of(g)),this.pointerDown$).pipe(e.mergeMap(g=>e.merge(this.pointerMove$,e.of(g)).pipe(T(g),e.filter(M=>C(g,M,o)))),e.first()).pipe(e.switchMap(()=>k),e.withLatestFrom(h),e.map(([,{event:g,pointers:M}])=>({type:"start",event:g,latestActivePointers:M})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(w)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:g,pointers:M})=>({type:"move",event:g,latestActivePointers:M})))),e.takeUntil(w)),A=R.pipe(e.mergeMap(()=>w.pipe(e.map(({event:g,pointers:M})=>({type:"end",event:g,latestActivePointers:M}))))),b=e.merge(R,S,A).pipe(e.shareReplay(1));return b.pipe(X,e.withLatestFrom(b),e.map(([g,{type:M}])=>({...g,type:M})))}))}),e.tap(a=>{n.next({fingers:a.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(a=>a.type==="start"),e.map(({type:a,...l})=>l)),this.panMove$=this.pan$.pipe(e.filter(a=>a.type==="move"),e.map(({type:a,...l})=>l)),this.panEnd$=this.pan$.pipe(e.filter(a=>a.type==="end"),e.map(({type:a,...l})=>l)),this.state$=n.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const n=this.configSubject.getValue();this.configSubject.next({...n,...p,...p.options&&{options:{...n.options,...p.options}},panConfig:{...n.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const n=this.panStart$.pipe(e.map(o=>({type:"panStart",...o})),e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.share()),s=this.panEnd$.pipe(e.map(o=>({type:"panEnd",...o})),e.share()),a=this.panMove$.pipe(e.map(o=>({type:"panMove",...o})));this.events$=n.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),d=this.failWithActive$.pipe(e.filter(m=>m),e.first()),$=e.merge(h,a,s).pipe(e.tap(m=>{r=m}),e.takeUntil(d)),f=d.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge($,f)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="panStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{const{escapeVelocity:s=.9}=n.options??{};return this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,a])=>!a),e.switchMap(([a])=>this.panEnd$.pipe(Z(s),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})),e.takeUntil(this.failWithActive$.pipe(e.filter(l=>l))))),e.share())}))}update(t){super.update(t)}}const j=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(n=>e.timer(i).pipe(e.takeUntil(p.pipe(O,T(n)))))),ee=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>n=>n.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(i,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{var f,m;const s=((f=n.options)==null?void 0:f.maxTaps)??1,a=((m=n.options)==null?void 0:m.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=n.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),d=y=>y.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(y=>{const v=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),w=v.pipe(d),k=v.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=v.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(A=>A)),this.pointerCancel$,h,k,Y),S=w.pipe(G,e.filter(A=>A.length<=s),e.map(A=>({type:"tap",taps:A.length,latestActivePointers:A,event:A[0]})),e.shareReplay(1));return S.pipe(X,e.withLatestFrom(S),e.map(([A,{type:b,taps:g}])=>({...A,type:b,taps:g})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ne extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=n.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((o,r)=>{const h=((o==null?void 0:o.angle)??0)+r.deltaPointersAngle;return{...o,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=s.pipe(e.filter(o=>o.type==="move"),e.map(o=>({...o,type:"rotateMove"}))),l=s.pipe(e.filter(o=>o.type==="end"),e.map(o=>({...o,type:"rotateEnd"})));return e.merge(n,a,l)}),e.share())}update(t){super.update(t,t.options)}}const z=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((n,s)=>{const l=((n==null?void 0:n.pointers.length)??0)!==s.pointers.length,o=(n==null?void 0:n.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:n&&"initialPointersAverageDistance"in n?n.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,d=s.pointersAverageDistance-r,$=s.pointersAverageDistance-r,f=l||o===0?1:s.pointersAverageDistance/o;return{...n,...s,type:i,initialPointersAverageDistance:r,scale:h,distance:d,deltaDistance:$,deltaDistanceScale:f}},p),e.map(({initialPointersAverageDistance:n,...s})=>s));class ie extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");c(this,"end$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.switchMap(o=>e.of(o).pipe(z({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),s=this.failWithActive$.pipe(e.filter(o=>o),e.first()),a=n.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),z({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=n.pipe(e.switchMap(o=>{let r=o;return this.pan$.pipe(e.switchMap(h=>h.type==="end"?e.of(h):(r=h,e.NEVER)),e.takeUntil(s),e.defaultIfEmpty(null),e.map(h=>h||r),z({type:"pinchEnd",initialEvent:r}),e.share())}));return e.merge(n,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(n=>n.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(n=>n.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((n,s)=>({fingers:Math.max(n.fingers,s.fingers)})))),this.update(p)}update({disableTextSelection:p,...t}){t.container&&(t.container.style.touchAction="none",p&&(t.container.style.userSelect="none"));for(const n of this.options.recognizers)n.update(t)}}u.PanRecognizer=Q,u.PinchRecognizer=ie,u.Recognizable=pe,u.Recognizer=D,u.RotateRecognizer=ne,u.SwipeRecognizer=x,u.TapRecognizer=te,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.cjs.map