gesturx 1.7.1 → 1.7.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 +8 -9
- 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 +8 -4
package/dist/index.d.ts
CHANGED
|
@@ -123,7 +123,7 @@ declare type RecognizableState = {
|
|
|
123
123
|
fingers: number;
|
|
124
124
|
};
|
|
125
125
|
|
|
126
|
-
export declare abstract class Recognizer<Options extends
|
|
126
|
+
export declare abstract class Recognizer<Options extends object = never, Event extends RecognizerEvent = RecognizerEvent> {
|
|
127
127
|
protected configSubject: BehaviorSubject<RecognizerConfig<Options> & {
|
|
128
128
|
panConfig?: PanConfig | undefined;
|
|
129
129
|
}>;
|
|
@@ -280,7 +280,7 @@ declare interface SwipeRecognizerOptions {
|
|
|
280
280
|
escapeVelocity?: number;
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
-
declare interface TapEvent extends RecognizerEvent {
|
|
283
|
+
export declare interface TapEvent extends RecognizerEvent {
|
|
284
284
|
type: "tap";
|
|
285
285
|
taps: number;
|
|
286
286
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var ee = Object.defineProperty;
|
|
2
2
|
var te = (n, s, e) => s in n ? ee(n, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[s] = e;
|
|
3
|
-
var l = (n, s, e) =>
|
|
3
|
+
var l = (n, s, e) => te(n, typeof s != "symbol" ? s + "" : s, e);
|
|
4
4
|
import { filter as h, mergeMap as S, defer as ne, of as T, merge as y, takeWhile as N, scan as O, map as c, fromEvent as b, BehaviorSubject as B, switchMap as v, NEVER as se, shareReplay as E, exhaustMap as G, first as Y, share as A, timer as H, withLatestFrom as j, takeUntil as k, skip as ie, tap as pe, ignoreElements as oe, buffer as re, debounceTime as ae, startWith as le, pairwise as he, combineLatest as ce } from "rxjs";
|
|
5
5
|
function ue(n, s) {
|
|
6
6
|
return Math.sqrt(
|
|
@@ -9,8 +9,7 @@ function ue(n, s) {
|
|
|
9
9
|
}
|
|
10
10
|
function $e(n) {
|
|
11
11
|
const s = n.length;
|
|
12
|
-
if (s < 2)
|
|
13
|
-
return 0;
|
|
12
|
+
if (s < 2) return 0;
|
|
14
13
|
const e = n.reduce((t, o, a) => t + n.slice(a + 1).reduce((p, r) => p + ue(o, r), 0), 0), i = s * (s - 1) / 2;
|
|
15
14
|
return e / i;
|
|
16
15
|
}
|
|
@@ -119,7 +118,7 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
|
|
|
119
118
|
pointers: Object.values(r).filter(ve)
|
|
120
119
|
}))
|
|
121
120
|
);
|
|
122
|
-
},
|
|
121
|
+
}, q = (n, s, e, i) => {
|
|
123
122
|
const t = n.x - s.x + e, o = n.y - s.y + i;
|
|
124
123
|
return {
|
|
125
124
|
deltaX: t,
|
|
@@ -134,7 +133,7 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
|
|
|
134
133
|
var g, x;
|
|
135
134
|
const t = s(i), o = (e == null ? void 0 : e.center) ?? t, a = (e == null ? void 0 : e.deltaX) ?? 0, p = (e == null ? void 0 : e.deltaY) ?? 0, r = ((g = e == null ? void 0 : e.latestActivePointers) == null ? void 0 : g.length) ?? 1, $ = ((x = i.latestActivePointers) == null ? void 0 : x.length) ?? 1, u = ["pointerdown", "pointercancel", "pointerleave", "pointerup"].includes(
|
|
136
135
|
i.event.type
|
|
137
|
-
) && r !== $, M = $ > 0, { deltaX: d, deltaY: P } = u && M ?
|
|
136
|
+
) && r !== $, M = $ > 0, { deltaX: d, deltaY: P } = u && M ? q(t, t, a, p) : q(t, o, a, p), { degreesDelta: D } = r === $ && r >= 2 && $ >= 2 ? ge(
|
|
138
137
|
(e == null ? void 0 : e.latestActivePointers) ?? [],
|
|
139
138
|
i.latestActivePointers ?? []
|
|
140
139
|
) : { degreesDelta: 0 };
|
|
@@ -173,7 +172,7 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
|
|
|
173
172
|
};
|
|
174
173
|
})
|
|
175
174
|
);
|
|
176
|
-
},
|
|
175
|
+
}, _ = (n) => n.pipe(
|
|
177
176
|
h(
|
|
178
177
|
(s) => !!s.container
|
|
179
178
|
)
|
|
@@ -214,7 +213,7 @@ class z {
|
|
|
214
213
|
l(this, "pointerOff$");
|
|
215
214
|
l(this, "state$");
|
|
216
215
|
l(this, "failWith$");
|
|
217
|
-
l(this, "config$", this.configSubject.pipe(
|
|
216
|
+
l(this, "config$", this.configSubject.pipe(_));
|
|
218
217
|
const i = new B({
|
|
219
218
|
fingers: 0
|
|
220
219
|
});
|
|
@@ -238,7 +237,7 @@ class z {
|
|
|
238
237
|
({ failWith: t }) => t != null && t.length ? y(...(t == null ? void 0 : t.map(({ start$: o }) => o)) ?? []) : se
|
|
239
238
|
)
|
|
240
239
|
), this.pan$ = this.configSubject.pipe(
|
|
241
|
-
|
|
240
|
+
_,
|
|
242
241
|
v((t) => {
|
|
243
242
|
var M, d, P;
|
|
244
243
|
const o = Math.max(1, ((M = t.panConfig) == null ? void 0 : M.numInputs) ?? 1), a = Math.max(0, ((d = t.panConfig) == null ? void 0 : d.posThreshold) ?? 0), p = Math.max(0, ((P = t.panConfig) == null ? void 0 : P.delay) ?? 0), r = this.pointerDown$.pipe(
|
|
@@ -638,7 +637,7 @@ class Ce extends z {
|
|
|
638
637
|
// we cannot have a panEnd without a previous event so it will always emit
|
|
639
638
|
le(a),
|
|
640
639
|
he(),
|
|
641
|
-
h(([
|
|
640
|
+
h(([, p]) => p.type === "end"),
|
|
642
641
|
v(
|
|
643
642
|
([p, r]) => T(r).pipe(
|
|
644
643
|
X({
|
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":["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 {\n Observable,\n filter,\n} 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\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\"].includes(event.type)\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(pointerMove$, pointerCancel$, pointerLeave$, pointerUp$),\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 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","import {\n BehaviorSubject,\n NEVER,\n Observable,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\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> }[]\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 Record<any, any>,\n Event extends 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\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n protected config$ = this.configSubject.pipe(isValidConfig)\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 this.failWith$ = this.config$.pipe(\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\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 { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\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 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 this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = 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 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 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 {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = 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.failWith$,\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 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","import { 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 Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } 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 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 pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const pinchMove$ = pinchStart$.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 )\n\n const pinchEnd$ = pinchStart$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([_, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStart$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","import {\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","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","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","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","_","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":";;;;AAEgB,SAAAA,GAAkBC,GAAeC,GAAuB;AACtE,SAAO,KAAK;AAAA,IACV,KAAK,IAAIA,EAAO,IAAID,EAAO,GAAG,CAAC,IAAI,KAAK,IAAIC,EAAO,IAAID,EAAO,GAAG,CAAC;AAAA,EAAA;AAEtE;AAEO,SAASE,GAAyBC,GAAgC;AACvE,QAAMC,IAAID,EAAc;AACxB,MAAIC,IAAI;AAAU,WAAA;AAElB,QAAMC,IAAgBF,EAAc,OAAO,CAACG,GAAKC,GAAQC,MAErDF,IACAH,EAAc,MAAMK,IAAI,CAAC,EAAE,OAAO,CAACC,GAAUC,MACpCD,IAAWV,GAAkBQ,GAAQG,CAAM,GACjD,CAAC,GAEL,CAAC,GAGEC,IAAiBP,KAAKA,IAAI,KAAM;AACtC,SAAOC,IAAgBM;AACzB;AAEgB,SAAAC,EACdC,GACAC,GACQ;AAEF,QAAAC,IAASD,EAAS,IAAID,EAAS,GAC/BG,IAASF,EAAS,IAAID,EAAS;AAM9B,SAHgB,KAAK,MAAMG,GAAQD,CAAM;AAIlD;AAEgB,SAAAE,GACdJ,GACAC,GACQ;AAQD,SANgBF,EAAkCC,GAAUC,CAAQ,KAGlC,MAAM,KAAK;AAItD;AAEO,SAASI,EAAkBC,GAAiB;AACjD,QAAMb,IAAMa,EAAO;AAAA,IACjB,CAACC,GAAKC,OACJD,EAAI,KAAKC,EAAM,GACfD,EAAI,KAAKC,EAAM,GAERD;AAAA,IAET,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAAA,GAGTE,IAAYH,EAAO,UAAU;AAE5B,SAAA;AAAA,IACL,GAAGb,EAAI,IAAIgB;AAAA,IACX,GAAGhB,EAAI,IAAIgB;AAAA,EAAA;AAEf;AAEgB,SAAAC,GACdC,GACAC,GACA;AACI,MAAAD,EAAc,WAAWC,EAAU;AAC/B,UAAA,IAAI,MAAM,0DAA0D;AAGtE,QAAAC,IAAkBR,EAAkBM,CAAa,GACjDG,IAAcT,EAAkBO,CAAS;AAE/C,MAAIG,IAAkB;AAEtB,WAASpB,IAAI,GAAGA,IAAIgB,EAAc,QAAQhB,KAAK;AAC7C,UAAMqB,IAAejB;AAAA,MACnBc;AAAA,MACAF,EAAchB,CAAC;AAAA,IAAA;AAOjB,QAAIsB,IALalB;AAAA,MACfe;AAAA,MACAF,EAAUjB,CAAC;AAAA,IAAA,IAGeqB;AAGxB,IAAAC,IAAa,KAAK,KACpBA,KAAc,IAAI,KAAK,KACdA,IAAa,CAAC,KAAK,OAC5BA,KAAc,IAAI,KAAK,KAGNF,KAAAE;AAAA,EACrB;AAGM,QAAAC,IAAcH,IAAkBJ,EAAc,QAC9CQ,IAAeD,KAAe,MAAM,KAAK;AAExC,SAAA,EAAE,aAAAA,GAAa,cAAAC;AACxB;AC5GO,SAASC,GACdC,GAC+C;AACxC,SAAAA,KAAQ;AACjB;AAEO,MAAMC,KAAoB,CAAIC,MACnCA,EAAO,SAAS,GAELC,KAAiB,CAC5BC,MAC4BA,EAAO,KAAKC,EAAOJ,EAAiB,CAAC;AAEnD,SAAAK,EACdC,GACAC,GACAC,GACA;AACA,QAAMC,IAAQ1B,EAAkB,CAACuB,CAAU,CAAC,GACtCI,IAAM3B,EAAkB,CAACwB,CAAQ,CAAC;AAGxC,SACE,KAAK,IAAIG,EAAI,IAAID,EAAM,CAAC,KAAKD,KAC7B,KAAK,IAAIE,EAAI,IAAID,EAAM,CAAC,KAAKD;AAEjC;AAMO,MAAMG,KAAoB,CAC/BC,GACAhC,GACAC,MACG;AACH,QAAMgC,IAAYD,IAAQ,IAAIhC,IAASgC,IAAQ,GACzCE,IAAYF,IAAQ,IAAI/B,IAAS+B,IAAQ;AAExC,SAAA;AAAA,IACL,WAAAC;AAAA,IACA,WAAAC;AAAA,EAAA;AAEJ;ACpCO,SAASC,EAAaC,GAAuB;AAC3C,SAAA,CAACb,MACNA,EAAO;AAAA,IACLC,EAAO,CAACa,MAAeA,EAAW,cAAcD,EAAQ,SAAS;AAAA,EAAA;AAEvE;AAEa,MAAAE,IAAoB,CAACC,MAChCA,EAAa,SAAS,kBACtBA,EAAa,SAAS,mBACtBA,EAAa,SAAS,aAEXC,KAAkB,CAAC;AAAA,EAC9B,WAAAC;AAAA,EACA,oBAAAC,IAAqB,CAACC,MAAUA;AAClC,MAIEC,EAAwBH,GAAW,aAAa,EAAE;AAAA,EAChDI,EAAIH,CAAkB;AACxB,GAKWI,IACX,CAAC;AAAA,EACC,eAAAC;AACF,MASA,CAACxB,MAAqC;AAMpC,QAAMyB,IAAaD,EAAc;AAAA,IAC/BvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,WAAW;AAAA,EAAA,GAExCM,IAAgBF,EAAc;AAAA,IAClCvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,cAAc;AAAA,EAAA,GAE3CO,IAAiBH,EAAc;AAAA,IACnCvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,eAAe;AAAA,EAAA,GAE5CQ,IAAeJ,EAAc;AAAA,IACjCvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,aAAa;AAAA,EAAA,GAG1CS,IAAmB,CAACT,MACxB,CAAC,iBAAiB,gBAAgB,WAAW,EAAE,SAASA,EAAM,IAAI;AAEpE,SAAOpB,EAAO;AAAA,IACZ8B,EAAS,CAACC,MAAgB;AACxB,YAAMC,IAAeC,GAAM,MAAMC,EAAGH,CAAW,CAAC;AAUzC,aARWI;AAAA,QAChBH;AAAA,QACAG,EAAMP,GAAcD,GAAgBD,GAAeD,CAAU;AAAA,MAAA,EAC7D;AAAA,QACAb,EAAamB,CAAW;AAAA,QACxBK,EAAU,CAAChB,MAAU,CAACS,EAAiBT,CAAK,GAAG,EAAI;AAAA,MAAA;AAAA,IAG9C,CACR;AAAA,IACDiB,EAA6C,CAACvD,GAAKsC,MAAU;AACvD,UAAAS,EAAiBT,CAAK,GAAG;AACrB,cAAA,EAAE,CAACA,EAAM,SAAS,GAAGkB,GAAU,GAAGC,OAASzD,KAAA,gBAAAA,EAAK,aAAY;AAE3D,eAAA;AAAA,UACL,OAAAsC;AAAA,UACA,UAAUmB;AAAA,QAAA;AAAA,MAEd;AAEO,aAAA;AAAA,QACL,OAAAnB;AAAA,QACA,UAAU;AAAA,UACR,IAAItC,KAAA,gBAAAA,EAAK,aAAY,CAAC;AAAA,UACtB,CAACsC,EAAM,SAAS,GAAGA;AAAA,QACrB;AAAA,MAAA;AAAA,OAED,MAAS;AAAA,IACZE,EAAI,CAAC,EAAE,OAAAF,GAAO,UAAAoB,SAAgB;AAAA,MAC5B,OAAApB;AAAA,MACA,UAAU,OAAO,OAAOoB,CAAQ,EAAE,OAAO7C,EAAS;AAAA,IAAA,EAClD;AAAA,EAAA;AAEN,GCzFI8C,IAAoB,CACxBC,GACAC,GACAC,GACAC,MACG;AACH,QAAMpE,IAASiE,EAAU,IAAIC,EAAW,IAAIC,GACtClE,IAASgE,EAAU,IAAIC,EAAW,IAAIE;AAErC,SAAA;AAAA,IACL,QAAApE;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ,GAEaoE,IAAwB,CACnC9C,MACgC;AAC1B,QAAA+C,IAAoB,CAACC,MACzBpE;AAAA,IACGoE,EAAK,qBAAqB,SAEvBA,EAAK,uBADL,CAACA,EAAK,KAAK;AAAA,EACN;AAGb,SAAOhD,EAAO;AAAA,IACZqC,EAAyC,CAACvD,GAAKmE,MAAS;;AAChD,YAAAP,IAAYK,EAAkBE,CAAI,GAClCN,KAAa7D,KAAA,gBAAAA,EAAK,WAAU4D,GAC5BE,KAAa9D,KAAA,gBAAAA,EAAK,WAAU,GAC5B+D,KAAa/D,KAAA,gBAAAA,EAAK,WAAU,GAC5BoE,MAA2BC,IAAArE,KAAA,gBAAAA,EAAK,yBAAL,gBAAAqE,EAA2B,WAAU,GAChEC,MAA2BC,IAAAJ,EAAK,yBAAL,gBAAAI,EAA2B,WAAU,GAEhEC,IACJ,CAAC,eAAe,iBAAiB,gBAAgB,WAAW,EAAE;AAAA,QAC5DL,EAAK,MAAM;AAAA,MAAA,KACRC,MAA6BE,GAE9BG,IAAsBH,IAA2B,GAEjD,EAAE,QAAA3E,GAAQ,QAAAC,EACd,IAAA4E,KAA4BC,IACxBd,EAAkBC,GAAWA,GAAWE,GAAYC,CAAU,IAC9DJ,EAAkBC,GAAWC,GAAYC,GAAYC,CAAU,GAE/D,EAAE,cAAcW,EAAmB,IACvCN,MAA6BE,KAC7BF,KAA4B,KAC5BE,KAA4B,IACxBnE;AAAA,SACEH,KAAA,gBAAAA,EAAK,yBAAwB,CAAC;AAAA,QAC9BmE,EAAK,wBAAwB,CAAC;AAAA,MAAA,IAEhC,EAAE,cAAc;AAEf,aAAA;AAAA,QACL,YAAW,oBAAI,KAAK,GAAE,QAAQ;AAAA,QAC9B,GAAGnE;AAAA,QACH,GAAGmE;AAAA,QACH,QAAQP;AAAA,QACR,QAAAjE;AAAA,QACA,QAAAC;AAAA,QACA,oBAAA8E;AAAA,MAAA;AAAA,OAED,MAAS;AAAA,IACZlC,EAAI,CAAC0B,MAAS;AACN,YAAA;AAAA,QACJ,QAAAvE;AAAA,QACA,QAAAC;AAAA,QACA,sBAAA+E;AAAA,QACA,WAAAC;AAAA,QACA,QAAAC;AAAA,QACA,OAAAvC;AAAA,QACA,oBAAAoC;AAAA,MACE,IAAAR,GACElD,IAAS2D,KAAwB,IAIjChD,IADM,KAAK,QACGiD,GAEd,EAAE,WAAAhD,GAAW,WAAAC,MAAcH,GAAkBC,GAAOhC,GAAQC,CAAM,GAClEkF,IACJhG,GAAyB6F,CAAoB;AAExC,aAAA;AAAA,QACL,QAAAhF;AAAA,QACA,QAAAC;AAAA,QACA,WAAAgC;AAAA,QACA,WAAAC;AAAA,QACA,OAAAF;AAAA,QACA,QAAAkD;AAAA,QACA,UAAU7D;AAAA,QACV,WAAA4D;AAAA,QACA,OAAAtC;AAAA,QACA,oBAAAoC;AAAA,QACA,yBAAAI;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EAAA;AAEL,GCxHaC,IAAgB,CAC3B7D,MAEAA,EAAO;AAAA,EACLC;AAAA,IACE,CAAC6D,MAAqD,CAAC,CAACA,EAAO;AAAA,EACjE;AACF,GAEWC,IAAmB,CAAC/D,MAC/BA,EAAO,KAAKC,EAAOc,CAAiB,CAAC,GCV1BiD,KAAmB,CAAC;AAAA,EAC/B,WAAA9C;AAAA,EACA,oBAAAC,IAAqB,CAACC,MAAUA;AAClC,MAGM;AACJ,QAAMY,IAAef,GAAgB,EAAE,oBAAAE,GAAoB,WAAAD,EAAW,CAAA,GAChEO,IAAaJ,EAAwBH,GAAW,WAAW,EAAE;AAAA,IACjEI,EAAIH,CAAkB;AAAA,EAAA,GAElBS,IAAeP,EAAwBH,GAAW,aAAa,EAAE;AAAA,IACrEI,EAAIH,CAAkB;AAAA,EAAA,GAKlBO,IAAgBL,EAAwBH,GAAW,cAAc,EAAE;AAAA,IACvEI,EAAIH,CAAkB;AAAA,EAAA,GAMlBQ,IAAiBN;AAAA,IACrBH;AAAA,IACA;AAAA,EACA,EAAA,KAAKI,EAAIH,CAAkB,CAAC;AAEvB,SAAAgB;AAAA,IACLH;AAAA,IACAL;AAAA,IACAD;AAAA,IACAD;AAAA,IACAG;AAAA,EAAA;AAEJ;ACaO,MAAeqC,EAGpB;AAAA,EA0BA,YAAYH,GAAoCI,GAAuB;AAzB7D,IAAAC,EAAA,uBAAgB,IAAIC,EAI5B,CAAA,CAAE;AACM,IAAAD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEH,IAAAA,EAAA;AAIG,IAAAA,EAAA;AAEA,IAAAA,EAAA,iBAAU,KAAK,cAAc,KAAKN,CAAa;AAGjD,UAAAQ,IAAe,IAAID,EAAuB;AAAA,MAC9C,SAAS;AAAA,IAAA,CACV;AAEI,SAAA,gBAAgB,KAAK,QAAQ;AAAA,MAChCE;AAAA,QAAU,CAAC,EAAE,WAAApD,GAAW,oBAAAC,QACtB6C,GAAiB;AAAA,UACf,WAAA9C;AAAA,UACA,oBAAAC;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA,GAGG,KAAA,eAAe,KAAK,cAAc;AAAA,MACrClB,EAAO,CAACmB,MAAUA,EAAM,SAAS,aAAa;AAAA,IAAA,GAG3C,KAAA,aAAa,KAAK,cAAc;AAAA,MACnCnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,WAAW;AAAA,IAAA,GAGzC,KAAA,eAAe,KAAK,cAAc;AAAA,MACrCnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,aAAa;AAAA,IAAA,GAG3C,KAAA,iBAAiB,KAAK,cAAc;AAAA,MACvCnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,eAAe;AAAA,IAAA,GAGlD,KAAK,cAAc,KAAK,cAAc,KAAK2C,CAAgB,GAEtD,KAAA,YAAY,KAAK,QAAQ;AAAA,MAC5BO;AAAA,QAAU,CAAC,EAAE,UAAAC,EAAA,MACVA,KAAA,QAAAA,EAAU,SAEPpC,EAAM,IAAIoC,KAAA,gBAAAA,EAAU,IAAI,CAAC,EAAE,QAAAC,QAAaA,OAAW,CAAA,CAAG,IADtDC;AAAA,MAEN;AAAA,IAAA,GAGG,KAAA,OAAO,KAAK,cAAc;AAAA,MAC7BZ;AAAA,MACAS,EAAU,CAACR,MAAW;;AACpB,cAAMY,IAAY,KAAK,IAAI,KAAGZ,IAAAA,EAAO,cAAPA,gBAAAA,EAAkB,cAAa,CAAC,GACxDzD,IAAe,KAAK,IAAI,KAAGyD,IAAAA,EAAO,cAAPA,gBAAAA,EAAkB,iBAAgB,CAAC,GAC9DrD,IAAQ,KAAK,IAAI,KAAGqD,IAAAA,EAAO,cAAPA,gBAAAA,EAAkB,UAAS,CAAC,GAEhDa,IAAiB,KAAK,aAAa;AAAA,UACvCpD,EAAc;AAAA,YACZ,eAAe,KAAK;AAAA,YACpB,WAAW;AAAA,UAAA,CACZ;AAAA,UACDqD,EAAY,CAAC;AAAA,QAAA,GAGTC,IAAmB,CACvB7E,MAEAA,EAAO;AAAA,UACLC;AAAA,YACE,CACEH,MAEAA,EAAO,SAAS,UAAU4E;AAAA,UAC9B;AAAA,QAAA,GAGEI,IAAsB,CAC1B9E,MAIGA,EAAO,KAAKC,EAAO,CAACH,MAAWA,EAAO,SAAS,SAAS4E,CAAS,CAAC;AAEvE,eAAOC,EAAe;AAAA,UACpBE;AAAA,UACAE,EAAW,CAAC,EAAE,UAAUC,QAA2B;AACjD,kBAAMC,IAAeN,EAAe;AAAA,cAClCG;AAAA,cACAI,EAAM;AAAA,cACNC,EAAM;AAAA,YAAA,GAGFC,IAASC,EAAM5E,CAAK,GAqBpB6E,IAnB+BnD;AAAA,cACnC,GAAG6C,EAAqB,IAAI,CAAChE,MAAiBkB,EAAGlB,CAAY,CAAC;AAAA,cAC9D,KAAK;AAAA,YAAA,EACL;AAAA,cACAc;AAAA,gBAAS,CAACC,MACRI,EAAM,KAAK,cAAcD,EAAGH,CAAW,CAAC,EAAE;AAAA,kBACxCnB,EAAamB,CAAW;AAAA,kBACxB9B;AAAA,oBAAO,CAACe,MACNd;AAAA,sBACE6B;AAAA,sBACAf;AAAA,sBACAX;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA6E,EAAM;AAAA,YAAA,EAGuC;AAAA,cAC7CZ,EAAU,MAAMc,CAAM;AAAA,cACtBG,EAAeZ,CAAc;AAAA,cAC7BrD,EAAI,CAAC,CAAG,EAAA,EAAE,OAAAF,GAAO,UAAAoB,EAAU,CAAA,OAAO;AAAA,gBAChC,MAAM;AAAA,gBACN,OAAApB;AAAA,gBACA,sBAAsBoB;AAAA,cAAA,EACtB;AAAA,cACFoC,EAAY;AAAA,gBACV,YAAY;AAAA,gBACZ,UAAU;AAAA,cAAA,CACX;AAAA,cACDY,EAAUP,CAAY;AAAA,YAAA,GAGlBQ,IAAaH,EAAU;AAAA,cAC3BxD;AAAA,gBAAS,MACP6C,EAAe;AAAA,kBACbe,GAAK,CAAC;AAAA,kBACNpE,EAAI,CAAC,EAAE,OAAAF,GAAO,UAAAoB,SAAgB;AAAA,oBAC5B,MAAM;AAAA,oBACN,OAAApB;AAAA,oBACA,sBAAsBoB;AAAA,kBAAA,EACtB;AAAA,gBACJ;AAAA,cACF;AAAA,cACAgD,EAAUP,CAAY;AAAA,YAAA,GAGlBU,IAAUL,EAAU;AAAA,cACxBxD;AAAA,gBAAS,MACPmD,EAAa;AAAA,kBACX3D,EAAI,CAAC,EAAE,OAAAF,GAAO,UAAAoB,SAAgB;AAAA,oBAC5B,MAAM;AAAA,oBACN,OAAApB;AAAA,oBACA,sBAAsBoB;AAAA,kBAAA,EACtB;AAAA,gBACJ;AAAA,cACF;AAAA,YAAA,GAGIoD,IAAYzD,EAAMmD,GAAWG,GAAYE,CAAO,EAAE;AAAA,cACtDf,EAAY,CAAC;AAAA,YAAA;AAGf,mBAAOgB,EAAU;AAAA,cACf9C;AAAA,cACAyC,EAAeK,CAAS;AAAA,cACxBtE,EAAI,CAAC,CAACuE,GAAiB,EAAE,MAAAC,EAAM,CAAA,OAAO;AAAA,gBACpC,GAAGD;AAAA,gBACH,MAAAC;AAAA,cAAA,EACA;AAAA,YAAA;AAAA,UACJ,CACD;AAAA,QAAA;AAAA,MACH,CACD;AAAA,MACDC,GAAI,CAAC3E,MAAU;AACb,QAAAiD,EAAa,KAAK;AAAA,UAChB,SAASjD,EAAM,SAAS;AAAA,QAAA,CACzB;AAAA,MAAA,CACF;AAAA,MACD+D,EAAM;AAAA,IAAA,GAGH,KAAA,YAAY,KAAK,KAAK;AAAA,MACzBlF,EAAO,CAACmB,MAAUA,EAAM,SAAS,OAAO;AAAA,MACxCE,EAAI,CAAC,EAAE,MAAAwE,GAAM,GAAGvD,EAAA,MAAWA,CAAI;AAAA,IAAA,GAG5B,KAAA,WAAW,KAAK,KAAK;AAAA,MACxBtC,EAAO,CAACmB,MAAUA,EAAM,SAAS,MAAM;AAAA,MACvCE,EAAI,CAAC,EAAE,MAAAwE,GAAM,GAAGvD,EAAA,MAAWA,CAAI;AAAA,IAAA,GAG5B,KAAA,UAAU,KAAK,KAAK;AAAA,MACvBtC,EAAO,CAACmB,MAAUA,EAAM,SAAS,KAAK;AAAA,MACtCE,EAAI,CAAC,EAAE,MAAAwE,GAAM,GAAGvD,EAAA,MAAWA,CAAI;AAAA,IAAA,GAG5B,KAAA,SAAS8B,EAAa,gBAE3B,KAAK,eAAeP,KAAU,CAAC,GAAGI,CAAS;AAAA,EAC7C;AAAA,EAEQ,eACNJ,GACAI,GACA;AACM,UAAA8B,IAAiB,KAAK,cAAc,SAAS;AAEnD,SAAK,cAAc,KAAK;AAAA,MACtB,GAAGA;AAAA,MACH,GAAGlC;AAAA,MACH,GAAIA,EAAO,WAAW;AAAA,QACpB,SAAS,EAAE,GAAGkC,EAAe,SAAS,GAAGlC,EAAO,QAAQ;AAAA,MAC1D;AAAA,MACA,WAAW;AAAA,QACT,GAAGkC,EAAe;AAAA,QAClB,GAAG9B;AAAA,MACL;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEO,OACLJ,GACAI,GACA;AACK,SAAA,eAAeJ,GAAQI,CAAS;AAAA,EACvC;AACF;AC9RO,MAAM+B,WACHhC,EAEV;AAAA,EAKE,YAAYH,GAAiD;;AAC3D,UAAMA,GAAQ;AAAA,MACZ,GAAGA;AAAA,MACH,gBAAcX,IAAAW,KAAA,gBAAAA,EAAQ,YAAR,gBAAAX,EAAiB,iBAAgB;AAAA,IAAA,CAChD;AARI,IAAAgB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAQC,UAAAmB,IAAY,KAAK,UAAU;AAAA,MAC/BhE,EAAI,CAACF,OAAW;AAAA,QACd,MAAM;AAAA,QACN,GAAGA;AAAA,MAAA,EACH;AAAA,MACF+D,EAAM;AAAA,IAAA,GAGFQ,IAAU,KAAK,QAAQ;AAAA,MAC3BrE,EAAI,CAACF,OAAW;AAAA,QACd,MAAM;AAAA,QACN,GAAGA;AAAA,MAAA,EACH;AAAA,MACF+D,EAAM;AAAA,IAAA;AAGR,SAAK,UAAUhD;AAAA,MACbmD;AAAA,MACA,KAAK,SAAS;AAAA,QACZhE,EAAI,CAACF,OAAW;AAAA,UACd,MAAM;AAAA,UACN,GAAGA;AAAA,QAAA,EACH;AAAA,MACJ;AAAA,MACAuE;AAAA,IAAA,GAGF,KAAK,SAASL,GAEd,KAAK,OAAOK;AAAA,EACd;AAAA,EAEO,OAAO7B,GAAgD;AACtD,UAAA,OAAOA,GAAQA,EAAO,OAAO;AAAA,EACrC;AACF;ACtDO,MAAMoC,KACX,CAACC,MAA2B,CAACnG,MAC3BA,EAAO;AAAA,EACLC,EAAO,CAACmB,MAEJ,KAAK,IAAIA,EAAM,SAAS,KAAK+E,KAC7B,KAAK,IAAI/E,EAAM,SAAS,KAAK+E,CAEhC;AACH;ACFG,MAAMC,WACHnC,EAEV;AAAA,EAGE,YAAYH,GAAmD;AAC7D,UAAMA,GAAQ;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,IAAA,CACZ;AANI,IAAAK,EAAA;AAQA,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BG,EAAU,CAAC+B,MAAoB;AAC7B,cAAM,EAAE,gBAAAF,IAAiB,IAAA,IAAQE,EAAgB,WAAW,CAAA;AAE5D,eAAO,KAAK,UAAU;AAAA,UACpB/B,EAAU,CAACnE,MACF,KAAK,QAAQ;AAAA,YAClB+F,GAAoBC,CAAc;AAAA,YAClC7E,EAAI,CAACF,OACI;AAAA,cACL,MAAM;AAAA,cACN,OAAOzC;AAAA,gBACLwB,EAAW;AAAA,gBACXiB,EAAM;AAAA,cACR;AAAA,cACA,GAAGA;AAAA,YAAA,EAEN;AAAA,UAAA,CAEJ;AAAA,UACD+D,EAAM;AAAA,QAAA;AAAA,MACR,CACD;AAAA,IAAA;AAAA,EAEL;AAAA,EAEO,OAAOrB,GAAkD;AAC9D,UAAM,OAAOA,CAAM;AAAA,EACrB;AACF;AC9CO,MAAMwC,KACX,CAAC;AAAA,EACC,SAAAC;AAAA,EACA,eAAA/E;AACF,MAIA,CAACxB,MACCA,EAAO;AAAA,EACL8B;AAAA,IAAS,CAACC,MACRsD,EAAMkB,CAAO,EAAE;AAAA,MACbf;AAAA,QACEhE,EAAc,KAAKuC,GAAkBnD,EAAamB,CAAW,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF,GAESyE,KACX,CAAC;AAAA,EACC,qBAAAC;AAAA,EACA,eAAAjF;AAAA,EACA,WAAAkF;AACF,MAKA,CAAC1G,MACCA,EAAO;AAAA,EACL8B;AAAA,IAAS,CAACC,MACRP,EAAc;AAAA,MACZZ,EAAamB,CAAW;AAAA,MACxBK,EAAU,CAAChB,MAAU,CAACL,EAAkBK,CAAK,GAAG,EAAI;AAAA,MACpDnB;AAAA,QAAO,CAACmB,MACNlB,EAAqBuG,GAAqBrF,GAAOsF,CAAS;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACF;ACjBG,MAAMC,WACH1C,EAEV;AAAA,EAGE,YAAY2C,GAAkD;AAC5D,UAAMA,CAAO;AAHR,IAAAzC,EAAA;AAKA,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BG,EAAU,CAACR,MAAW;AACd,cAAA;AAAA,UACJ,mBAAA+C,IAAoB;AAAA,UACpB,kBAAAC,IAAmB;AAAA,UACnB,SAAAC,IAAU;AAAA,UACV,WAAAL,IAAY;AAAA,QAAA,IACV5C,EAAO,WAAW,IAEhBkD,IAAkB,KAAK,aAAa;AAAA,UACxCzF,EAAc;AAAA,YACZ,eAAe,KAAK;AAAA,YACpB,WAAW;AAAA,UAAA,CACZ;AAAA,UACDqD,EAAY,CAAC;AAAA,QAAA,GAGTqC,IAA+BD,EAAgB;AAAA,UACnD/G,EAAO,CAAC,EAAE,UAAAuC,QAAeA,EAAS,SAAS,CAAC;AAAA,QAAA,GAGxC0E,IAAqB,CAAClH,MAC1BA,EAAO;AAAA,UACLmH,GAAO,KAAK,WAAW,KAAKC,GAAaP,CAAiB,CAAC,CAAC;AAAA,UAC5D3B,EAAM;AAAA,QAAA;AAqEH,eAlEM/C;AAAA,UACX,KAAK;AAAA,UACL6E,EAAgB,KAAKK,IAAgB;AAAA,QAAA,EACrC;AAAA,UACAtC,EAAW,CAAC0B,MAAwB;AAClC,kBAAMa,IAAgBnF;AAAA,cACpBD,EAAGuE,CAAmB;AAAA,cACtB,KAAK;AAAA,YACL,EAAA,KAAK7B,EAAY,CAAC,CAAC,GAEf2C,IAAwBD,EAAc,KAAKJ,CAAkB,GAK7DM,IAAgCF,EAAc;AAAA,cAClDd,GAAyB;AAAA,gBACvB,qBAAAC;AAAA,gBACA,eAAe,KAAK;AAAA,gBACpB,WAAAC;AAAA,cAAA,CACD;AAAA,YAAA,GAMGe,IAA+BH,EAAc;AAAA,cACjDhB,GAAuB;AAAA,gBACrB,eAAe,KAAK;AAAA,gBACpB,SAASQ;AAAA,cAAA,CACV;AAAA,YAAA,GAGGY,IAAavF;AAAA,cACjB,KAAK;AAAA,cACL,KAAK;AAAA,cACL8E;AAAA,cACAO;AAAA,cACAC;AAAA,YAAA,GAGI7B,IAAY2B,EAAsB;AAAA,cACtCxH;AAAA,cACAE,EAAO,CAACH,MAAWA,EAAO,UAAUiH,CAAO;AAAA,cAC3CzF,EAAI,CAACxB,OAAY;AAAA,gBACf,MAAM;AAAA,gBACN,MAAMA,EAAO;AAAA,gBACb,sBAAsBA;AAAA,gBACtB,OAAOA,EAAO,CAAC;AAAA,cAAA,EACf;AAAA,cACF8E,EAAY,CAAC;AAAA,YAAA;AAGf,mBAAOgB,EAAU;AAAA,cACf9C;AAAA,cACAyC,EAAeK,CAAS;AAAA,cACxBtE,EAAI,CAAC,CAACuE,GAAiB,EAAE,MAAAC,GAAM,MAAA6B,EAAM,CAAA,OAAO;AAAA,gBAC1C,GAAG9B;AAAA,gBACH,MAAAC;AAAA,gBACA,MAAA6B;AAAA,cAAA,EACA;AAAA,cACFnC,EAAUkC,CAAU;AAAA,YAAA;AAAA,UACtB,CACD;AAAA,QAAA;AAAA,MAGI,CACR;AAAA,MACDvC,EAAM;AAAA,IAAA;AAAA,EAEV;AAAA,EAEO,OAAOrB,GAAsD;AAClE,UAAM,OAAOA,CAAM;AAAA,EACrB;AACF;ACtHO,MAAM8D,WACH3D,EAEV;AAAA,EAGE,YAAYH,IAAoD,IAAI;AAClE,UAAMA,GAAQ;AAAA,MACZ,WAAW;AAAA,MACX,cAAc;AAAA,MACd,GAAGA,EAAO;AAAA,IAAA,CACX;AAPI,IAAAK,EAAA;AASA,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BG,EAAU,MAAM;AACR,cAAAuD,IAAe,KAAK,UAAU;AAAA,UAClCvG,EAAI,CAACF,OAAW;AAAA,YACd,GAAGA;AAAA,YACH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,UAAA,EACZ;AAAA,UACFwD,EAAY,CAAC;AAAA,QAAA,GAGTkD,IAAUD,EAAa;AAAA,UAC3BvD;AAAA,YAAU,MACR,KAAK,KAAK;AAAA,cACRjC,EAIE,CAACvD,GAAKiJ,MAAY;AAClB,sBAAMC,MAASlJ,KAAA,gBAAAA,EAAK,UAAS,KAAKiJ,EAAQ;AAEnC,uBAAA;AAAA,kBACL,GAAGjJ;AAAA,kBACH,GAAGiJ;AAAA,kBACH,OAAAC;AAAA,kBACA,YAAYD,EAAQ;AAAA,gBAAA;AAAA,iBAErB,MAAS;AAAA,YACd;AAAA,UACF;AAAA,UACA5C,EAAM;AAAA,QAAA,GAGF8C,IAAcH,EAAQ;AAAA,UAC1B7H,EAAO,CAACmB,MAAUA,EAAM,SAAS,MAAM;AAAA,UACvCE,EAAI,CAACF,OAAW,EAAE,GAAGA,GAAO,MAAM,eAAwB;AAAA,QAAA,GAGtD8G,IAAaJ,EAAQ;AAAA,UACzB7H,EAAO,CAACmB,MAAUA,EAAM,SAAS,KAAK;AAAA,UACtCE,EAAI,CAACF,OAAW,EAAE,GAAGA,GAAO,MAAM,cAAuB;AAAA,QAAA;AAGpD,eAAAe,EAAM0F,GAAcI,GAAaC,CAAU;AAAA,MAAA,CACnD;AAAA,MACD/C,EAAM;AAAA,IAAA;AAAA,EAEV;AAAA,EAEO,OAAOyB,GAAoD;AAC1D,UAAA,OAAOA,GAASA,EAAQ,OAAO;AAAA,EACvC;AACF;ACnFO,MAAMuB,IACX,CAAC;AAAA,EACC,MAAArC;AAAA,EACA,cAAAsC;AACF,MAIA,CAACpI,MACCA,EAAO;AAAA,EACLqC,EAME,CAACvD,GAAKmE,MAAS;AAET,UAAAoF,MADyBvJ,KAAA,gBAAAA,EAAK,SAAS,WAAU,OAE1BmE,EAAK,SAAS,QACrCqF,KACJxJ,KAAA,gBAAAA,EAAK,4BAA2BmE,EAAK,yBAMjCsF,IAAiCF,IACnCpF,EAAK,0BACHnE,KAAO,oCAAoCA,IAC3CA,EAAI,iCACJmE,EAAK,yBAKLuF,IACJD,MAAmC,IAC/B,IACAtF,EAAK,0BAA0BsF,GAE/BE,IACJxF,EAAK,0BAA0BsF,GAE3BG,IACJzF,EAAK,0BAA0BsF,GAM3BI,IACJN,KAAqBC,MAAoC,IACrD,IACArF,EAAK,0BAA0BqF;AAE9B,WAAA;AAAA,MACL,GAAGxJ;AAAA,MACH,GAAGmE;AAAA,MACH,MAAA6C;AAAA,MACA,gCAAAyC;AAAA,MACA,OAAAC;AAAA,MACA,UAAAC;AAAA,MACA,eAAAC;AAAA,MACA,oBAAAC;AAAA,IAAA;AAAA,KAEDP,CAAY;AAAA,EACf9G,EAAI,CAAC,EAAE,gCAAAiH,GAAgC,GAAGhG,EAAA,MAAuBA,CAAI;AACvE;AClDG,MAAMqG,WACH3E,EAEV;AAAA,EAGE,YAAYH,GAAmD;AAC7D,UAAMA,GAAQ;AAAA,MACZ,GAAGA,KAAA,gBAAAA,EAAQ;AAAA,MACX,WAAW;AAAA,IAAA,CACZ;AANI,IAAAK,EAAA;AAQA,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BG,EAAU,MAAM;AACR,cAAAuE,IAAc,KAAK,UAAU;AAAA,UACjCvE;AAAA,YAAU,CAAClD,MACTc,EAAGd,CAAK,EAAE;AAAA,cACR+G,EAAwB;AAAA,gBACtB,MAAM;AAAA,gBACN,cAAc;AAAA,cAAA,CACf;AAAA,YACH;AAAA,UACF;AAAA,UACAvD,EAAY,CAAC;AAAA,QAAA,GAGTkE,IAAaD,EAAY;AAAA,UAC7BvE,EAAU,CAAC8D,MACF,KAAK,KAAK;AAAA,YACfhG,EAAU,CAAChB,MAAUA,EAAM,SAAS,KAAK;AAAA,YACzC+G,EAAwB;AAAA,cACtB,MAAM;AAAA,cACN,cAAAC;AAAA,YAAA,CACD;AAAA,UAAA,CAEJ;AAAA,QAAA,GAGGW,IAAYF,EAAY;AAAA,UAC5BvE;AAAA,YAAU,CAAC0E,MACT,KAAK,KAAK;AAAA;AAAA,cAERC,GAAUD,CAAe;AAAA,cACzBE,GAAS;AAAA,cACTjJ,EAAO,CAAC,CAACkJ,GAAGC,CAAS,MAAMA,EAAU,SAAS,KAAK;AAAA,cACnD9E;AAAA,gBAAU,CAAC,CAAC+E,GAAeD,CAAS,MAClClH,EAAGkH,CAAS,EAAE;AAAA,kBACZjB,EAAwB;AAAA,oBACtB,MAAM;AAAA,oBACN,cAAckB;AAAA,kBAAA,CACf;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QAAA;AAGK,eAAAlH,EAAM0G,GAAaC,GAAYC,CAAS;AAAA,MAAA,CAChD;AAAA,MACD5D,EAAM;AAAA,IAAA;AAAA,EAEV;AAAA,EAEO,OAAOyB,GAAmD;AACzD,UAAA,OAAOA,GAASA,EAAQ,OAAO;AAAA,EACvC;AACF;AC1EO,MAAM0C,GAEb;AAAA,EAOE,YACY1C,GAGV;AAVF,IAAAzC,EAAA;AAEA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AAGY,SAAA,UAAAyC,GAIV,KAAK,cAAcA,EAAQ,aAE3B,KAAK,UAAUzE;AAAA,MACb,GAAGyE,EAAQ,YAAY,IAAI,CAAC2C,MAAeA,EAAW,OAAO;AAAA,IAAA,EAC7D,KAAKpE,EAAA,CAAO,GAEd,KAAK,SAASqE;AAAA,MACZ,KAAK,YAAY,IAAI,CAACD,MAAeA,EAAW,MAAM;AAAA,IAAA,EACtD;AAAA,MACAjI;AAAA,QAAI,CAACmI,MACHA,EAAO,OAAO,CAAC3K,GAAK4K,OAAW;AAAA,UAC7B,SAAS,KAAK,IAAI5K,EAAI,SAAS4K,EAAM,OAAO;AAAA,QAAA,EAC5C;AAAA,MACJ;AAAA,IAAA,GAGF,KAAK,OAAO9C,CAAO;AAAA,EACrB;AAAA,EAEO,OAAOA,GAAoC;AAChD,IAAIA,EAAQ,cAMFA,EAAA,UAAU,MAAM,cAAc,QAK9BA,EAAA,UAAU,MAAM,aAAa,SAGvC,KAAK,QAAQ,YAAY,QAAQ,CAAC2C,MAAe;AAC/C,MAAAA,EAAW,OAAO3C,CAAO;AAAA,IAAA,CAC1B;AAAA,EACH;AACF;"}
|
|
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\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\"].includes(event.type)\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(pointerMove$, pointerCancel$, pointerLeave$, pointerUp$),\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 NEVER,\n Observable,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\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> }[]\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\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n protected config$ = this.configSubject.pipe(isValidConfig)\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 this.failWith$ = this.config$.pipe(\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\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 { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\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 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 this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = 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 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 {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = 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.failWith$,\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 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 Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } 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 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 pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const pinchMove$ = pinchStart$.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 )\n\n const pinchEnd$ = pinchStart$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStart$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\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","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","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","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(c,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):(c=typeof globalThis<"u"?globalThis:c||self,e(c.gesturx={},c.rxjs))})(this,function(c,e){"use strict";var pe=Object.defineProperty;var oe=(c,e,P)=>e in c?pe(c,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):c[e]=P;var h=(c,e,P)=>(oe(c,typeof e!="symbol"?e+"":e,P),P);function P(i,p){return Math.sqrt(Math.pow(p.x-i.x,2)+Math.pow(p.y-i.y,2))}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((n,s,l)=>n+i.slice(l+1).reduce((a,r)=>a+P(s,r),0),0),o=p*(p-1)/2;return t/o}function b(i,p){const t=p.x-i.x,o=p.y-i.y;return Math.atan2(o,t)}function V(i,p){return b(i,p)*(180/Math.PI)}function R(i){const p=i.reduce((o,n)=>(o.x+=n.x,o.y+=n.y,o),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=R(i),o=R(p);let n=0;for(let a=0;a<i.length;a++){const r=b(t,i[a]);let u=b(o,p[a])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),n+=u}const s=n/i.length,l=s*(180/Math.PI);return{radianDelta:s,degreesDelta:l}}function q(i){return i!=null}const _=i=>i.length>0,W=i=>i.pipe(e.filter(_));function k(i,p,t){const o=R([i]),n=R([p]);return Math.abs(n.x-o.x)>=t||Math.abs(n.y-o.y)>=t}const G=(i,p,t)=>{const o=i>0?p/i:0,n=i>0?t/i:0;return{velocityX:o,velocityY:n}};function S(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const C=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",H=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),O=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(a=>a.type==="pointerup")),o=i.pipe(e.filter(a=>a.type==="pointerleave")),n=i.pipe(e.filter(a=>a.type==="pointercancel")),s=i.pipe(e.filter(a=>a.type==="pointermove")),l=a=>["pointercancel","pointerleave","pointerup"].includes(a.type);return p.pipe(e.mergeMap(a=>{const r=e.defer(()=>e.of(a));return e.merge(r,e.merge(s,n,o,t)).pipe(S(a),e.takeWhile(u=>!l(u),!0))}),e.scan((a,r)=>{if(l(r)){const{[r.pointerId]:g,...u}=(a==null?void 0:a.pointers)??{};return{event:r,pointers:u}}return{event:r,pointers:{...(a==null?void 0:a.pointers)??{},[r.pointerId]:r}}},void 0),e.map(({event:a,pointers:r})=>({event:a,pointers:Object.values(r).filter(q)})))},F=(i,p,t,o)=>{const n=i.x-p.x+t,s=i.y-p.y+o;return{deltaX:n,deltaY:s}},L=i=>{const p=t=>R(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,o)=>{var $,A;const n=p(o),s=(t==null?void 0:t.center)??n,l=(t==null?void 0:t.deltaX)??0,a=(t==null?void 0:t.deltaY)??0,r=(($=t==null?void 0:t.latestActivePointers)==null?void 0:$.length)??1,g=((A=o.latestActivePointers)==null?void 0:A.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(o.event.type)&&r!==g,w=g>0,{deltaX:d,deltaY:f}=u&&w?F(n,n,l,a):F(n,s,l,a),{degreesDelta:m}=r===g&&r>=2&&g>=2?B((t==null?void 0:t.latestActivePointers)??[],o.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...o,center:n,deltaX:d,deltaY:f,deltaPointersAngle:m}},void 0),e.map(t=>{const{deltaX:o,deltaY:n,latestActivePointers:s,startTime:l,center:a,event:r,deltaPointersAngle:g}=t,u=s??[],d=Date.now()-l,{velocityX:f,velocityY:m}=G(d,o,n),$=N(s);return{deltaX:o,deltaY:n,velocityX:f,velocityY:m,delay:d,center:a,pointers:u,startTime:l,event:r,deltaPointersAngle:g,pointersAverageDistance:$}}))},U=i=>i.pipe(e.filter(p=>!!p.container)),X=i=>i.pipe(e.filter(C)),J=({container:i,afterEventReceived:p=t=>t})=>{const t=H({afterEventReceived:p,container:i}),o=e.fromEvent(i,"pointerup").pipe(e.map(p)),n=e.fromEvent(i,"pointermove").pipe(e.map(p)),s=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return e.merge(t,l,s,o,n)};class D{constructor(p,t){h(this,"configSubject",new e.BehaviorSubject({}));h(this,"pan$");h(this,"panStart$");h(this,"panMove$");h(this,"panEnd$");h(this,"pointerEvent$");h(this,"pointerDown$");h(this,"pointerUp$");h(this,"pointerCancel$");h(this,"pointerMove$");h(this,"pointerOff$");h(this,"state$");h(this,"failWith$");h(this,"config$",this.configSubject.pipe(U));const o=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:n,afterEventReceived:s})=>J({container:n,afterEventReceived:s}))),this.pointerDown$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X),this.failWith$=this.config$.pipe(e.switchMap(({failWith:n})=>n!=null&&n.length?e.merge(...(n==null?void 0:n.map(({start$:s})=>s))??[]):e.NEVER)),this.pan$=this.configSubject.pipe(U,e.switchMap(n=>{var w,d,f;const s=Math.max(1,((w=n.panConfig)==null?void 0:w.numInputs)??1),l=Math.max(0,((d=n.panConfig)==null?void 0:d.posThreshold)??0),a=Math.max(0,((f=n.panConfig)==null?void 0:f.delay)??0),r=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),g=m=>m.pipe(e.filter($=>$.pointers.length>=s)),u=m=>m.pipe(e.filter($=>$.pointers.length<s));return r.pipe(g,e.exhaustMap(({pointers:m})=>{const $=r.pipe(u,e.first(),e.share()),A=e.timer(a),E=e.merge(...m.map(v=>e.of(v)),this.pointerDown$).pipe(e.mergeMap(v=>e.merge(this.pointerMove$,e.of(v)).pipe(S(v),e.filter(M=>k(v,M,l)))),e.first()).pipe(e.switchMap(()=>A),e.withLatestFrom(r),e.map(([,{event:v,pointers:M}])=>({type:"start",event:v,latestActivePointers:M})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil($)),y=E.pipe(e.mergeMap(()=>r.pipe(e.skip(1),e.map(({event:v,pointers:M})=>({type:"move",event:v,latestActivePointers:M})))),e.takeUntil($)),z=E.pipe(e.mergeMap(()=>$.pipe(e.map(({event:v,pointers:M})=>({type:"end",event:v,latestActivePointers:M}))))),T=e.merge(E,y,z).pipe(e.shareReplay(1));return T.pipe(L,e.withLatestFrom(T),e.map(([v,{type:M}])=>({...v,type:M})))}))}),e.tap(n=>{o.next({fingers:n.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(n=>n.type==="start"),e.map(({type:n,...s})=>s)),this.panMove$=this.pan$.pipe(e.filter(n=>n.type==="move"),e.map(({type:n,...s})=>s)),this.panEnd$=this.pan$.pipe(e.filter(n=>n.type==="end"),e.map(({type:n,...s})=>s)),this.state$=o.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const o=this.configSubject.getValue();this.configSubject.next({...o,...p,...p.options&&{options:{...o.options,...p.options}},panConfig:{...o.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class K extends D{constructor(t){var s;super(t,{...t,posThreshold:((s=t==null?void 0:t.options)==null?void 0:s.posThreshold)??15});h(this,"events$");h(this,"start$");h(this,"end$");const o=this.panStart$.pipe(e.map(l=>({type:"panStart",...l})),e.share()),n=this.panEnd$.pipe(e.map(l=>({type:"panEnd",...l})),e.share());this.events$=e.merge(o,this.panMove$.pipe(e.map(l=>({type:"panMove",...l}))),n),this.start$=o,this.end$=n}update(t){super.update(t,t.options)}}const Q=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class Z extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});h(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{escapeVelocity:n=.9}=o.options??{};return this.panStart$.pipe(e.switchMap(s=>this.panEnd$.pipe(Q(n),e.map(l=>({type:"swipe",angle:V(s.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const x=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(o=>e.timer(i).pipe(e.takeUntil(p.pipe(X,S(o)))))),j=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>o=>o.pipe(e.mergeMap(n=>p.pipe(S(n),e.takeWhile(s=>!C(s),!0),e.filter(s=>k(i,s,t)))));class ee extends D{constructor(t){super(t);h(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{multiTapThreshold:n=0,maximumPressTime:s=150,maxTaps:l=1,tolerance:a=10}=o.options??{},r=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),g=r.pipe(e.filter(({pointers:d})=>d.length>1)),u=d=>d.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(n))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(d=>{const f=e.merge(e.of(d),this.pointerDown$).pipe(e.shareReplay(1)),m=f.pipe(u),$=f.pipe(j({initialPointerEvent:d,pointerEvent$:this.pointerEvent$,tolerance:a})),A=f.pipe(x({pointerEvent$:this.pointerEvent$,timeout:s})),Y=e.merge(this.failWith$,this.pointerCancel$,g,$,A),E=m.pipe(W,e.filter(y=>y.length<=l),e.map(y=>({type:"tap",taps:y.length,latestActivePointers:y,event:y[0]})),e.shareReplay(1));return E.pipe(L,e.withLatestFrom(E),e.map(([y,{type:z,taps:T}])=>({...y,type:z,taps:T})),e.takeUntil(Y))}))}),e.share())}update(t){super.update(t)}}class te extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});h(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.map(a=>({...a,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),n=o.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((a,r)=>{const g=((a==null?void 0:a.angle)??0)+r.deltaPointersAngle;return{...a,...r,angle:g,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),s=n.pipe(e.filter(a=>a.type==="move"),e.map(a=>({...a,type:"rotateMove"}))),l=n.pipe(e.filter(a=>a.type==="end"),e.map(a=>({...a,type:"rotateEnd"})));return e.merge(o,s,l)}),e.share())}update(t){super.update(t,t.options)}}const I=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((o,n)=>{const l=((o==null?void 0:o.pointers.length)??0)!==n.pointers.length,a=(o==null?void 0:o.pointersAverageDistance)??n.pointersAverageDistance,r=l?n.pointersAverageDistance:o&&"initialPointersAverageDistance"in o?o.initialPointersAverageDistance:n.pointersAverageDistance,g=r===0?1:n.pointersAverageDistance/r,u=n.pointersAverageDistance-r,w=n.pointersAverageDistance-r,d=l||a===0?1:n.pointersAverageDistance/a;return{...o,...n,type:i,initialPointersAverageDistance:r,scale:g,distance:u,deltaDistance:w,deltaDistanceScale:d}},p),e.map(({initialPointersAverageDistance:o,...n})=>n));class ne extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});h(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.switchMap(l=>e.of(l).pipe(I({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),n=o.pipe(e.switchMap(l=>this.pan$.pipe(e.takeWhile(a=>a.type!=="end"),I({type:"pinchMove",initialEvent:l})))),s=o.pipe(e.switchMap(l=>this.pan$.pipe(e.startWith(l),e.pairwise(),e.filter(([a,r])=>r.type==="end"),e.switchMap(([a,r])=>e.of(r).pipe(I({type:"pinchEnd",initialEvent:a}))))));return e.merge(o,n,s)}),e.share())}update(t){super.update(t,t.options)}}class ie{constructor(p){h(this,"events$");h(this,"recognizers");h(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((o,n)=>({fingers:Math.max(o.fingers,n.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)})}}c.PanRecognizer=K,c.PinchRecognizer=ne,c.Recognizable=ie,c.Recognizer=D,c.RotateRecognizer=te,c.SwipeRecognizer=Z,c.TapRecognizer=ee,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(c,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):(c=typeof globalThis<"u"?globalThis:c||self,e(c.gesturx={},c.rxjs))})(this,function(c,e){"use strict";var pe=Object.defineProperty;var oe=(c,e,P)=>e in c?pe(c,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):c[e]=P;var h=(c,e,P)=>oe(c,typeof e!="symbol"?e+"":e,P);function P(i,p){return Math.sqrt(Math.pow(p.x-i.x,2)+Math.pow(p.y-i.y,2))}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((n,s,l)=>n+i.slice(l+1).reduce((a,r)=>a+P(s,r),0),0),o=p*(p-1)/2;return t/o}function b(i,p){const t=p.x-i.x,o=p.y-i.y;return Math.atan2(o,t)}function V(i,p){return b(i,p)*(180/Math.PI)}function R(i){const p=i.reduce((o,n)=>(o.x+=n.x,o.y+=n.y,o),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=R(i),o=R(p);let n=0;for(let a=0;a<i.length;a++){const r=b(t,i[a]);let u=b(o,p[a])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),n+=u}const s=n/i.length,l=s*(180/Math.PI);return{radianDelta:s,degreesDelta:l}}function q(i){return i!=null}const W=i=>i.length>0,_=i=>i.pipe(e.filter(W));function k(i,p,t){const o=R([i]),n=R([p]);return Math.abs(n.x-o.x)>=t||Math.abs(n.y-o.y)>=t}const G=(i,p,t)=>{const o=i>0?p/i:0,n=i>0?t/i:0;return{velocityX:o,velocityY:n}};function S(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const C=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",H=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),O=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(a=>a.type==="pointerup")),o=i.pipe(e.filter(a=>a.type==="pointerleave")),n=i.pipe(e.filter(a=>a.type==="pointercancel")),s=i.pipe(e.filter(a=>a.type==="pointermove")),l=a=>["pointercancel","pointerleave","pointerup"].includes(a.type);return p.pipe(e.mergeMap(a=>{const r=e.defer(()=>e.of(a));return e.merge(r,e.merge(s,n,o,t)).pipe(S(a),e.takeWhile(u=>!l(u),!0))}),e.scan((a,r)=>{if(l(r)){const{[r.pointerId]:g,...u}=(a==null?void 0:a.pointers)??{};return{event:r,pointers:u}}return{event:r,pointers:{...(a==null?void 0:a.pointers)??{},[r.pointerId]:r}}},void 0),e.map(({event:a,pointers:r})=>({event:a,pointers:Object.values(r).filter(q)})))},F=(i,p,t,o)=>{const n=i.x-p.x+t,s=i.y-p.y+o;return{deltaX:n,deltaY:s}},L=i=>{const p=t=>R(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,o)=>{var $,A;const n=p(o),s=(t==null?void 0:t.center)??n,l=(t==null?void 0:t.deltaX)??0,a=(t==null?void 0:t.deltaY)??0,r=(($=t==null?void 0:t.latestActivePointers)==null?void 0:$.length)??1,g=((A=o.latestActivePointers)==null?void 0:A.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(o.event.type)&&r!==g,w=g>0,{deltaX:d,deltaY:f}=u&&w?F(n,n,l,a):F(n,s,l,a),{degreesDelta:m}=r===g&&r>=2&&g>=2?B((t==null?void 0:t.latestActivePointers)??[],o.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...o,center:n,deltaX:d,deltaY:f,deltaPointersAngle:m}},void 0),e.map(t=>{const{deltaX:o,deltaY:n,latestActivePointers:s,startTime:l,center:a,event:r,deltaPointersAngle:g}=t,u=s??[],d=Date.now()-l,{velocityX:f,velocityY:m}=G(d,o,n),$=N(s);return{deltaX:o,deltaY:n,velocityX:f,velocityY:m,delay:d,center:a,pointers:u,startTime:l,event:r,deltaPointersAngle:g,pointersAverageDistance:$}}))},U=i=>i.pipe(e.filter(p=>!!p.container)),X=i=>i.pipe(e.filter(C)),J=({container:i,afterEventReceived:p=t=>t})=>{const t=H({afterEventReceived:p,container:i}),o=e.fromEvent(i,"pointerup").pipe(e.map(p)),n=e.fromEvent(i,"pointermove").pipe(e.map(p)),s=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return e.merge(t,l,s,o,n)};class D{constructor(p,t){h(this,"configSubject",new e.BehaviorSubject({}));h(this,"pan$");h(this,"panStart$");h(this,"panMove$");h(this,"panEnd$");h(this,"pointerEvent$");h(this,"pointerDown$");h(this,"pointerUp$");h(this,"pointerCancel$");h(this,"pointerMove$");h(this,"pointerOff$");h(this,"state$");h(this,"failWith$");h(this,"config$",this.configSubject.pipe(U));const o=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:n,afterEventReceived:s})=>J({container:n,afterEventReceived:s}))),this.pointerDown$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X),this.failWith$=this.config$.pipe(e.switchMap(({failWith:n})=>n!=null&&n.length?e.merge(...(n==null?void 0:n.map(({start$:s})=>s))??[]):e.NEVER)),this.pan$=this.configSubject.pipe(U,e.switchMap(n=>{var w,d,f;const s=Math.max(1,((w=n.panConfig)==null?void 0:w.numInputs)??1),l=Math.max(0,((d=n.panConfig)==null?void 0:d.posThreshold)??0),a=Math.max(0,((f=n.panConfig)==null?void 0:f.delay)??0),r=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),g=m=>m.pipe(e.filter($=>$.pointers.length>=s)),u=m=>m.pipe(e.filter($=>$.pointers.length<s));return r.pipe(g,e.exhaustMap(({pointers:m})=>{const $=r.pipe(u,e.first(),e.share()),A=e.timer(a),E=e.merge(...m.map(v=>e.of(v)),this.pointerDown$).pipe(e.mergeMap(v=>e.merge(this.pointerMove$,e.of(v)).pipe(S(v),e.filter(M=>k(v,M,l)))),e.first()).pipe(e.switchMap(()=>A),e.withLatestFrom(r),e.map(([,{event:v,pointers:M}])=>({type:"start",event:v,latestActivePointers:M})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil($)),y=E.pipe(e.mergeMap(()=>r.pipe(e.skip(1),e.map(({event:v,pointers:M})=>({type:"move",event:v,latestActivePointers:M})))),e.takeUntil($)),z=E.pipe(e.mergeMap(()=>$.pipe(e.map(({event:v,pointers:M})=>({type:"end",event:v,latestActivePointers:M}))))),T=e.merge(E,y,z).pipe(e.shareReplay(1));return T.pipe(L,e.withLatestFrom(T),e.map(([v,{type:M}])=>({...v,type:M})))}))}),e.tap(n=>{o.next({fingers:n.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(n=>n.type==="start"),e.map(({type:n,...s})=>s)),this.panMove$=this.pan$.pipe(e.filter(n=>n.type==="move"),e.map(({type:n,...s})=>s)),this.panEnd$=this.pan$.pipe(e.filter(n=>n.type==="end"),e.map(({type:n,...s})=>s)),this.state$=o.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const o=this.configSubject.getValue();this.configSubject.next({...o,...p,...p.options&&{options:{...o.options,...p.options}},panConfig:{...o.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class K extends D{constructor(t){var s;super(t,{...t,posThreshold:((s=t==null?void 0:t.options)==null?void 0:s.posThreshold)??15});h(this,"events$");h(this,"start$");h(this,"end$");const o=this.panStart$.pipe(e.map(l=>({type:"panStart",...l})),e.share()),n=this.panEnd$.pipe(e.map(l=>({type:"panEnd",...l})),e.share());this.events$=e.merge(o,this.panMove$.pipe(e.map(l=>({type:"panMove",...l}))),n),this.start$=o,this.end$=n}update(t){super.update(t,t.options)}}const Q=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class Z extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});h(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{escapeVelocity:n=.9}=o.options??{};return this.panStart$.pipe(e.switchMap(s=>this.panEnd$.pipe(Q(n),e.map(l=>({type:"swipe",angle:V(s.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const x=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(o=>e.timer(i).pipe(e.takeUntil(p.pipe(X,S(o)))))),j=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>o=>o.pipe(e.mergeMap(n=>p.pipe(S(n),e.takeWhile(s=>!C(s),!0),e.filter(s=>k(i,s,t)))));class ee extends D{constructor(t){super(t);h(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{multiTapThreshold:n=0,maximumPressTime:s=150,maxTaps:l=1,tolerance:a=10}=o.options??{},r=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),g=r.pipe(e.filter(({pointers:d})=>d.length>1)),u=d=>d.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(n))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(d=>{const f=e.merge(e.of(d),this.pointerDown$).pipe(e.shareReplay(1)),m=f.pipe(u),$=f.pipe(j({initialPointerEvent:d,pointerEvent$:this.pointerEvent$,tolerance:a})),A=f.pipe(x({pointerEvent$:this.pointerEvent$,timeout:s})),Y=e.merge(this.failWith$,this.pointerCancel$,g,$,A),E=m.pipe(_,e.filter(y=>y.length<=l),e.map(y=>({type:"tap",taps:y.length,latestActivePointers:y,event:y[0]})),e.shareReplay(1));return E.pipe(L,e.withLatestFrom(E),e.map(([y,{type:z,taps:T}])=>({...y,type:z,taps:T})),e.takeUntil(Y))}))}),e.share())}update(t){super.update(t)}}class te extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});h(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.map(a=>({...a,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),n=o.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((a,r)=>{const g=((a==null?void 0:a.angle)??0)+r.deltaPointersAngle;return{...a,...r,angle:g,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),s=n.pipe(e.filter(a=>a.type==="move"),e.map(a=>({...a,type:"rotateMove"}))),l=n.pipe(e.filter(a=>a.type==="end"),e.map(a=>({...a,type:"rotateEnd"})));return e.merge(o,s,l)}),e.share())}update(t){super.update(t,t.options)}}const I=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((o,n)=>{const l=((o==null?void 0:o.pointers.length)??0)!==n.pointers.length,a=(o==null?void 0:o.pointersAverageDistance)??n.pointersAverageDistance,r=l?n.pointersAverageDistance:o&&"initialPointersAverageDistance"in o?o.initialPointersAverageDistance:n.pointersAverageDistance,g=r===0?1:n.pointersAverageDistance/r,u=n.pointersAverageDistance-r,w=n.pointersAverageDistance-r,d=l||a===0?1:n.pointersAverageDistance/a;return{...o,...n,type:i,initialPointersAverageDistance:r,scale:g,distance:u,deltaDistance:w,deltaDistanceScale:d}},p),e.map(({initialPointersAverageDistance:o,...n})=>n));class ne extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});h(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.switchMap(l=>e.of(l).pipe(I({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),n=o.pipe(e.switchMap(l=>this.pan$.pipe(e.takeWhile(a=>a.type!=="end"),I({type:"pinchMove",initialEvent:l})))),s=o.pipe(e.switchMap(l=>this.pan$.pipe(e.startWith(l),e.pairwise(),e.filter(([,a])=>a.type==="end"),e.switchMap(([a,r])=>e.of(r).pipe(I({type:"pinchEnd",initialEvent:a}))))));return e.merge(o,n,s)}),e.share())}update(t){super.update(t,t.options)}}class ie{constructor(p){h(this,"events$");h(this,"recognizers");h(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((o,n)=>({fingers:Math.max(o.fingers,n.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)})}}c.PanRecognizer=K,c.PinchRecognizer=ne,c.Recognizable=ie,c.Recognizer=D,c.RotateRecognizer=te,c.SwipeRecognizer=Z,c.TapRecognizer=ee,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=index.umd.cjs.map
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["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 {\n Observable,\n filter,\n} 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\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\"].includes(event.type)\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(pointerMove$, pointerCancel$, pointerLeave$, pointerUp$),\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 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","import {\n BehaviorSubject,\n NEVER,\n Observable,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\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> }[]\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 Record<any, any>,\n Event extends 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\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n protected config$ = this.configSubject.pipe(isValidConfig)\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 this.failWith$ = this.config$.pipe(\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\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 { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\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 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 this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = 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 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 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 {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = 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.failWith$,\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 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","import { 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 Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } 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 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 pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const pinchMove$ = pinchStart$.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 )\n\n const pinchEnd$ = pinchStart$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([_, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStart$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","import {\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","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","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","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","_","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/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\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\"].includes(event.type)\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(pointerMove$, pointerCancel$, pointerLeave$, pointerUp$),\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 NEVER,\n Observable,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\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> }[]\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\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n protected config$ = this.configSubject.pipe(isValidConfig)\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 this.failWith$ = this.config$.pipe(\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\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 { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\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 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 this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = 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 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 {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = 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.failWith$,\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 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 Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } 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 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 pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const pinchMove$ = pinchStart$.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 )\n\n const pinchEnd$ = pinchStart$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStart$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\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","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","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","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gesturx",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.7.
|
|
4
|
+
"version": "1.7.3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.umd.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
11
|
"import": "./dist/index.js",
|
|
@@ -19,7 +20,7 @@
|
|
|
19
20
|
"build": "tsc && vite build",
|
|
20
21
|
"build:lib": "tsc && cross-env LIB_MODE=true vite build",
|
|
21
22
|
"preview": "vite preview",
|
|
22
|
-
"lint": "prettier --write . && eslint --fix .
|
|
23
|
+
"lint": "prettier --write . && eslint --fix .",
|
|
23
24
|
"test": "vitest",
|
|
24
25
|
"coverage": "vitest run --coverage"
|
|
25
26
|
},
|
|
@@ -28,7 +29,8 @@
|
|
|
28
29
|
"@chakra-ui/react": "^2.8.2",
|
|
29
30
|
"@emotion/react": "^11.11.4",
|
|
30
31
|
"@emotion/styled": "^11.11.5",
|
|
31
|
-
"@eslint/js": "^9.
|
|
32
|
+
"@eslint/js": "^9.5.0",
|
|
33
|
+
"@eslint/compat": "^1.1.0",
|
|
32
34
|
"@types/node": "^20.12.7",
|
|
33
35
|
"@types/react": "^18.3.2",
|
|
34
36
|
"@types/react-dom": "^18.3.0",
|
|
@@ -36,7 +38,9 @@
|
|
|
36
38
|
"@vitest/coverage-v8": "^1.5.0",
|
|
37
39
|
"cross-env": "^7.0.3",
|
|
38
40
|
"eslint": "^8.57.0",
|
|
41
|
+
"eslint-plugin-react": "^7.34.2",
|
|
39
42
|
"framer-motion": "^11.2.6",
|
|
43
|
+
"globals": "^15.6.0",
|
|
40
44
|
"happy-dom": "^14.7.1",
|
|
41
45
|
"prettier": "^3.3.1",
|
|
42
46
|
"react": "^18.3.1",
|
|
@@ -44,7 +48,7 @@
|
|
|
44
48
|
"rollup-plugin-node-externals": "^7.1.1",
|
|
45
49
|
"rxjs": "^7.8.1",
|
|
46
50
|
"typescript": "^5.4.5",
|
|
47
|
-
"typescript-eslint": "^7.
|
|
51
|
+
"typescript-eslint": "^7.13.0",
|
|
48
52
|
"vite": "^5.2.0",
|
|
49
53
|
"vite-plugin-dts": "^3.8.3",
|
|
50
54
|
"vite-plugin-eslint": "^1.8.1",
|