gesturx 1.8.2 → 1.8.3
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.d.ts +2 -2
- package/dist/index.js +202 -198
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +2 -2
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/mapPanEventToPinchEvent.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 ? 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 ? 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 return merge(\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 type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown>; end$: Observable<unknown> }[]\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(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\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 { Observable, map, share, switchMap } 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 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 )\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 mapPanEventToPinchEvent =\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 { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\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 const pinchStart$ = this.panStart$.pipe(\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n share(),\n )\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = pinchStart$.pipe(shareReplay(1))\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 mapPanEventToPinchEvent({\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 mapPanEventToPinchEvent({\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\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(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\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(options: RecognizerConfig<unknown>) {\n if (options.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 options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","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","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","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$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state"],"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/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 ? 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 ? 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 return merge(\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 type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown>; end$: Observable<unknown> }[]\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(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\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 { Observable, map, share, switchMap } 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 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 )\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\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(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\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(options: RecognizerConfig<unknown>) {\n if (options.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 options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","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","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","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"],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -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 u=($,e,P)=>ae($,typeof e!="symbol"?e+"":e,P);function P(n,i){return Math.sqrt(Math.pow(i.x-n.x,2)+Math.pow(i.y-n.y,2))}function N(n){const i=n.length;if(i<2)return 0;const t=n.reduce((p,a,l)=>p+n.slice(l+1).reduce((s,r)=>s+P(a,r),0),0),o=i*(i-1)/2;return t/o}function I(n,i){const t=i.x-n.x,o=i.y-n.y;return Math.atan2(o,t)}function V(n,i){return I(n,i)*(180/Math.PI)}function E(n){const i=n.reduce((o,p)=>(o.x+=p.x,o.y+=p.y,o),{x:0,y:0}),t=n.length||1;return{x:i.x/t,y:i.y/t}}function B(n,i){if(n.length!==i.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(n),o=E(i);let p=0;for(let s=0;s<n.length;s++){const r=I(t,n[s]);let c=I(o,i[s])-r;c>Math.PI?c-=2*Math.PI:c<-Math.PI&&(c+=2*Math.PI),p+=c}const a=p/n.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(n){return n!=null}const _=n=>n.length>0,G=n=>n.pipe(e.filter(_));function C(n,i,t){const o=E([n]),p=E([i]);return Math.abs(p.x-o.x)>=t||Math.abs(p.y-o.y)>=t}const H=(n,i,t)=>{const o=n>0?i/n:0,p=n>0?t/n:0;return{velocityX:o,velocityY:p}};function S(n){return i=>i.pipe(e.filter(t=>t.pointerId===n.pointerId))}const F=n=>n.type==="pointerleave"||n.type==="pointercancel"||n.type==="pointerup",J=({container:n,afterEventReceived:i=t=>t})=>e.fromEvent(n,"pointerdown").pipe(e.map(i)),L=({pointerEvent$:n})=>i=>{const t=n.pipe(e.filter(r=>r.type==="pointerup")),o=n.pipe(e.filter(r=>r.type==="pointerleave")),p=n.pipe(e.filter(r=>r.type==="pointercancel")),a=n.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),s=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return i.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,p,o,t,l)).pipe(S(r),e.takeWhile(v=>!s(v),!0))}),e.scan((r,h)=>{if(s(h)){const{[h.pointerId]:c,...v}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:v}}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=(n,i,t,o)=>{const p=n.x-i.x+t,a=n.y-i.y+o;return{deltaX:p,deltaY:a}},O=n=>{const i=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return n.pipe(e.scan((t,o)=>{var m,M;const p=i(o),a=(t==null?void 0:t.center)??p,l=(t==null?void 0:t.deltaX)??0,s=(t==null?void 0:t.deltaY)??0,r=((m=t==null?void 0:t.latestActivePointers)==null?void 0:m.length)??1,h=((M=o.latestActivePointers)==null?void 0:M.length)??1,c=["pointerdown","pointercancel","pointerleave","pointerup"].includes(o.event.type)&&r!==h,v=h>0,{deltaX:g,deltaY:f}=c&&v?U(p,p,l,s):U(p,a,l,s),{degreesDelta:y}=r===h&&r>=2&&h>=2?B((t==null?void 0:t.latestActivePointers)??[],o.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...o,center:p,deltaX:g,deltaY:f,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:o,deltaY:p,latestActivePointers:a,startTime:l,center:s,event:r,deltaPointersAngle:h}=t,c=a??[],g=Date.now()-l,{velocityX:f,velocityY:y}=H(g,o,p),m=N(a);return{deltaX:o,deltaY:p,velocityX:f,velocityY:y,delay:g,center:s,pointers:c,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:m}}))},W=n=>n.pipe(e.filter(i=>!!i.container)),X=n=>n.pipe(e.filter(F)),K=({container:n,afterEventReceived:i=t=>t})=>{const t=J({afterEventReceived:i,container:n}),o=e.fromEvent(n,"pointerup").pipe(e.map(i)),p=e.fromEvent(n,"pointermove").pipe(e.map(i)),a=e.fromEvent(n,"pointerleave").pipe(e.map(i)),l=e.fromEvent(n,"pointercancel").pipe(e.map(i));return e.merge(t,l,a,o,p)};class D{constructor(i,t){u(this,"configSubject",new e.BehaviorSubject({}));u(this,"pan$");u(this,"panStart$");u(this,"panMove$");u(this,"panEnd$");u(this,"pointerEvent$");u(this,"pointerDown$");u(this,"pointerUp$");u(this,"pointerCancel$");u(this,"pointerMove$");u(this,"pointerOff$");u(this,"state$");u(this,"config$",this.configSubject.pipe(W));u(this,"failWithActive$");const o=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}))),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 p=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=p.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(s=>{const r=s.start$.pipe(e.map(()=>!0)),h=s.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,f,y;const l=Math.max(1,((g=a.panConfig)==null?void 0:g.numInputs)??1),s=Math.max(0,((f=a.panConfig)==null?void 0:f.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)),c=m=>m.pipe(e.filter(M=>M.pointers.length>=l)),v=m=>m.pipe(e.filter(M=>M.pointers.length<l));return h.pipe(c,e.exhaustMap(({pointers:m})=>{const M=h.pipe(v,e.first(),e.share()),z=e.timer(r),R=e.merge(...m.map(d=>e.of(d)),this.pointerDown$).pipe(e.mergeMap(d=>e.merge(this.pointerMove$,e.of(d)).pipe(S(d),e.filter(A=>C(d,A,s)))),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)),T=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,T,w).pipe(e.shareReplay(1));return b.pipe(O,e.withLatestFrom(b),e.map(([d,{type:A}])=>({...d,type:A})))}))}),e.tap(a=>{o.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$=o.asObservable(),this.updateInternal(i??{},t)}updateInternal(i,t){const o=this.configSubject.getValue();this.configSubject.next({...o,...i,...i.options&&{options:{...o.options,...i.options}},panConfig:{...o.panConfig,...t}})}update(i,t){this.updateInternal(i,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});u(this,"events$");u(this,"start$");u(this,"end$");const o=this.panStart$.pipe(e.map(s=>({type:"panStart",...s})),e.withLatestFrom(this.failWithActive$),e.filter(([,s])=>!s),e.map(([s])=>s),e.share()),p=this.panEnd$.pipe(e.map(s=>({type:"panEnd",...s})),e.share()),a=this.panMove$.pipe(e.map(s=>({type:"panMove",...s})));this.events$=o.pipe(e.switchMap(s=>{let r=s;const h=e.of(s),c=this.failWithActive$.pipe(e.filter(f=>f),e.first()),v=e.merge(h,a,p).pipe(e.tap(f=>{r=f}),e.takeUntil(c)),g=c.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(p));return e.merge(v,g)}),e.share()),this.start$=this.events$.pipe(e.filter(s=>s.type==="panStart")),this.end$=this.events$.pipe(e.filter(s=>s.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=n=>i=>i.pipe(e.filter(t=>Math.abs(t.velocityX)>=n||Math.abs(t.velocityY)>=n));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});u(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{escapeVelocity:p=.9}=o.options??{};return this.panStart$.pipe(e.switchMap(a=>this.panEnd$.pipe(Z(p),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const j=({timeout:n,pointerEvent$:i})=>t=>t.pipe(e.mergeMap(o=>e.timer(n).pipe(e.takeUntil(i.pipe(X,S(o)))))),ee=({initialPointerEvent:n,pointerEvent$:i,tolerance:t})=>o=>o.pipe(e.mergeMap(p=>i.pipe(S(p),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(n,a,t)))));class te extends D{constructor(t){super(t);u(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{var g,f;const p=((g=o.options)==null?void 0:g.maxTaps)??1,a=((f=o.options)==null?void 0:f.multiTapThreshold)??100*(p-1),{maximumPressTime:l=150,tolerance:s=10}=o.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),c=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 m=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),M=m.pipe(c),z=m.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:s})),Y=m.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(w=>w)),this.pointerCancel$,h,z,Y),T=M.pipe(G,e.filter(w=>w.length<=p),e.map(w=>({type:"tap",taps:w.length,latestActivePointers:w,event:w[0]})),e.shareReplay(1));return T.pipe(O,e.withLatestFrom(T),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});u(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.map(s=>({...s,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),p=o.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((s,r)=>{const h=((s==null?void 0:s.angle)??0)+r.deltaPointersAngle;return{...s,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=p.pipe(e.filter(s=>s.type==="move"),e.map(s=>({...s,type:"rotateMove"}))),l=p.pipe(e.filter(s=>s.type==="end"),e.map(s=>({...s,type:"rotateEnd"})));return e.merge(o,a,l)}),e.share())}update(t){super.update(t,t.options)}}const k=({type:n,initialEvent:i})=>t=>t.pipe(e.scan((o,p)=>{const l=((o==null?void 0:o.pointers.length)??0)!==p.pointers.length,s=(o==null?void 0:o.pointersAverageDistance)??p.pointersAverageDistance,r=l?p.pointersAverageDistance:o&&"initialPointersAverageDistance"in o?o.initialPointersAverageDistance:p.pointersAverageDistance,h=r===0?1:p.pointersAverageDistance/r,c=p.pointersAverageDistance-r,v=p.pointersAverageDistance-r,g=l||s===0?1:p.pointersAverageDistance/s;return{...o,...p,type:n,initialPointersAverageDistance:r,scale:h,distance:c,deltaDistance:v,deltaDistanceScale:g}},i),e.map(({initialPointersAverageDistance:o,...p})=>p));class ie extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});u(this,"events$");u(this,"start$");u(this,"end$");const o=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,p])=>!p),e.map(([p])=>p),k({type:"pinchStart",initialEvent:void 0}),e.share());this.events$=this.config$.pipe(e.switchMap(()=>{const p=o.pipe(e.shareReplay(1)),a=this.failWithActive$.pipe(e.filter(r=>r),e.first()),l=p.pipe(e.switchMap(r=>this.pan$.pipe(e.takeWhile(h=>h.type!=="end"),k({type:"pinchMove",initialEvent:r}))),e.takeUntil(a)),s=p.pipe(e.switchMap(r=>{let h=r;return this.pan$.pipe(e.switchMap(c=>c.type==="end"?e.of(c):(h=c,e.NEVER)),e.takeUntil(a),e.defaultIfEmpty(null),e.map(c=>c||h),k({type:"pinchEnd",initialEvent:h}),e.share())}));return e.merge(p,l,s)}),e.share()),this.start$=this.events$.pipe(e.filter(p=>p.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(p=>p.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(i){u(this,"events$");u(this,"recognizers");u(this,"state$");this.options=i,this.recognizers=i.recognizers,this.events$=e.merge(...i.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((o,p)=>({fingers:Math.max(o.fingers,p.fingers)})))),this.update(i)}update(i){i.container&&(i.container.style.touchAction="none",i.container.style.userSelect="none"),this.options.recognizers.forEach(t=>{t.update(i)})}}$.PanRecognizer=Q,$.PinchRecognizer=ie,$.Recognizable=pe,$.Recognizer=D,$.RotateRecognizer=ne,$.SwipeRecognizer=x,$.TapRecognizer=te,Object.defineProperty($,Symbol.toStringTag,{value:"Module"})});
|
|
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(n,p){return Math.sqrt(Math.pow(p.x-n.x,2)+Math.pow(p.y-n.y,2))}function N(n){const p=n.length;if(p<2)return 0;const t=n.reduce((s,a,l)=>s+n.slice(l+1).reduce((o,r)=>o+P(a,r),0),0),i=p*(p-1)/2;return t/i}function I(n,p){const t=p.x-n.x,i=p.y-n.y;return Math.atan2(i,t)}function V(n,p){return I(n,p)*(180/Math.PI)}function E(n){const p=n.reduce((i,s)=>(i.x+=s.x,i.y+=s.y,i),{x:0,y:0}),t=n.length||1;return{x:p.x/t,y:p.y/t}}function B(n,p){if(n.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(n),i=E(p);let s=0;for(let o=0;o<n.length;o++){const r=I(t,n[o]);let u=I(i,p[o])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),s+=u}const a=s/n.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(n){return n!=null}const _=n=>n.length>0,G=n=>n.pipe(e.filter(_));function C(n,p,t){const i=E([n]),s=E([p]);return Math.abs(s.x-i.x)>=t||Math.abs(s.y-i.y)>=t}const H=(n,p,t)=>{const i=n>0?p/n:0,s=n>0?t/n:0;return{velocityX:i,velocityY:s}};function T(n){return p=>p.pipe(e.filter(t=>t.pointerId===n.pointerId))}const F=n=>n.type==="pointerleave"||n.type==="pointercancel"||n.type==="pointerup",J=({container:n,afterEventReceived:p=t=>t})=>e.fromEvent(n,"pointerdown").pipe(e.map(p)),L=({pointerEvent$:n})=>p=>{const t=n.pipe(e.filter(r=>r.type==="pointerup")),i=n.pipe(e.filter(r=>r.type==="pointerleave")),s=n.pipe(e.filter(r=>r.type==="pointercancel")),a=n.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,i,t,l)).pipe(T(r),e.takeWhile(v=>!o(v),!0))}),e.scan((r,h)=>{if(o(h)){const{[h.pointerId]:u,...v}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:v}}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=(n,p,t,i)=>{const s=n.x-p.x+t,a=n.y-p.y+i;return{deltaX:s,deltaY:a}},O=n=>{const p=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return n.pipe(e.scan((t,i)=>{var m,M;const s=p(i),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=((m=t==null?void 0:t.latestActivePointers)==null?void 0:m.length)??1,h=((M=i.latestActivePointers)==null?void 0:M.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(i.event.type)&&r!==h,v=h>0,{deltaX:g,deltaY:f}=u&&v?U(s,s,l,o):U(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2?B((t==null?void 0:t.latestActivePointers)??[],i.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...i,center:s,deltaX:g,deltaY:f,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:i,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,u=a??[],g=Date.now()-l,{velocityX:f,velocityY:y}=H(g,i,s),m=N(a);return{deltaX:i,deltaY:s,velocityX:f,velocityY:y,delay:g,center:o,pointers:u,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:m}}))},W=n=>n.pipe(e.filter(p=>!!p.container)),X=n=>n.pipe(e.filter(F)),K=({container:n,afterEventReceived:p=t=>t})=>{const t=J({afterEventReceived:p,container:n}),i=e.fromEvent(n,"pointerup").pipe(e.map(p)),s=e.fromEvent(n,"pointermove").pipe(e.map(p)),a=e.fromEvent(n,"pointerleave").pipe(e.map(p)),l=e.fromEvent(n,"pointercancel").pipe(e.map(p));return e.merge(t,l,a,i,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 i=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}))),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,f,y;const l=Math.max(1,((g=a.panConfig)==null?void 0:g.numInputs)??1),o=Math.max(0,((f=a.panConfig)==null?void 0:f.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=m=>m.pipe(e.filter(M=>M.pointers.length>=l)),v=m=>m.pipe(e.filter(M=>M.pointers.length<l));return h.pipe(u,e.exhaustMap(({pointers:m})=>{const M=h.pipe(v,e.first(),e.share()),z=e.timer(r),R=e.merge(...m.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=>{i.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$=i.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const i=this.configSubject.getValue();this.configSubject.next({...i,...p,...p.options&&{options:{...i.options,...p.options}},panConfig:{...i.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 i=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$=i.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),u=this.failWithActive$.pipe(e.filter(f=>f),e.first()),v=e.merge(h,a,s).pipe(e.tap(f=>{r=f}),e.takeUntil(u)),g=u.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge(v,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=n=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=n||Math.abs(t.velocityY)>=n));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(i=>{const{escapeVelocity:s=.9}=i.options??{};return this.panStart$.pipe(e.switchMap(a=>this.panEnd$.pipe(Z(s),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const j=({timeout:n,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(i=>e.timer(n).pipe(e.takeUntil(p.pipe(X,T(i)))))),ee=({initialPointerEvent:n,pointerEvent$:p,tolerance:t})=>i=>i.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(n,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(i=>{var g,f;const s=((g=i.options)==null?void 0:g.maxTaps)??1,a=((f=i.options)==null?void 0:f.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=i.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 m=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),M=m.pipe(u),z=m.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=m.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 i=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=i.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(i,a,l)}),e.share())}update(t){super.update(t,t.options)}}const k=({type:n,initialEvent:p})=>t=>t.pipe(e.scan((i,s)=>{const l=((i==null?void 0:i.pointers.length)??0)!==s.pointers.length,o=(i==null?void 0:i.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:i&&"initialPointersAverageDistance"in i?i.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,u=s.pointersAverageDistance-r,v=s.pointersAverageDistance-r,g=l||o===0?1:s.pointersAverageDistance/o;return{...i,...s,type:n,initialPointersAverageDistance:r,scale:h,distance:u,deltaDistance:v,deltaDistanceScale:g}},p),e.map(({initialPointersAverageDistance:i,...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 i=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=i.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),k({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=i.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(i,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(i=>i.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(i=>i.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((i,s)=>({fingers:Math.max(i.fingers,s.fingers)})))),this.update(p)}update(p){p.container&&(p.container.style.touchAction="none",p.container.style.userSelect="none"),this.options.recognizers.forEach(t=>{t.update(p)})}}$.PanRecognizer=Q,$.PinchRecognizer=ie,$.Recognizable=pe,$.Recognizer=D,$.RotateRecognizer=ne,$.SwipeRecognizer=x,$.TapRecognizer=te,Object.defineProperty($,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=index.umd.cjs.map
|