gesturx 1.11.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  var ie = Object.defineProperty;
2
2
  var se = (t, i, e) => i in t ? ie(t, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[i] = e;
3
3
  var $ = (t, i, e) => se(t, typeof i != "symbol" ? i + "" : i, e);
4
- import { filter as h, fromEvent as S, mergeMap as b, defer as pe, of as T, merge as y, takeWhile as V, scan as L, map as c, BehaviorSubject as q, switchMap as g, share as P, distinctUntilChanged as oe, startWith as re, shareReplay as M, combineLatest as j, exhaustMap as H, first as z, timer as J, withLatestFrom as C, takeUntil as I, skip as ae, tap as K, ignoreElements as le, buffer as he, debounceTime as ce, NEVER as $e, defaultIfEmpty as ue } from "rxjs";
4
+ import { filter as h, fromEvent as S, mergeMap as b, defer as pe, of as T, merge as y, takeWhile as V, scan as L, map as c, BehaviorSubject as q, switchMap as g, share as D, distinctUntilChanged as oe, startWith as re, shareReplay as M, combineLatest as j, exhaustMap as H, first as z, timer as J, withLatestFrom as C, takeUntil as I, skip as ae, tap as K, ignoreElements as le, buffer as he, debounceTime as ce, NEVER as $e, defaultIfEmpty as ue } from "rxjs";
5
5
  function de(t, i) {
6
6
  return Math.sqrt((i.x - t.x) ** 2 + (i.y - t.y) ** 2);
7
7
  }
@@ -55,7 +55,7 @@ function Q(t, i, e) {
55
55
  const n = F([t]), o = F([i]);
56
56
  return Math.abs(o.x - n.x) >= e || Math.abs(o.y - n.y) >= e;
57
57
  }
58
- const De = (t, i, e) => {
58
+ const Pe = (t, i, e) => {
59
59
  const n = t > 0 ? i / t : 0, o = t > 0 ? e / t : 0;
60
60
  return {
61
61
  velocityX: n,
@@ -67,11 +67,12 @@ function U(t) {
67
67
  h((e) => e.pointerId === t.pointerId)
68
68
  );
69
69
  }
70
- const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.type === "pointerup", Pe = ({
70
+ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.type === "pointerup", De = (t) => t.button === 0, Ee = ({
71
71
  container: t,
72
72
  afterEventReceived: i = (e) => e
73
73
  }) => S(t, "pointerdown").pipe(
74
- c(i)
74
+ c(i),
75
+ h(De)
75
76
  ), ee = ({
76
77
  pointerEvent$: t
77
78
  }) => (i) => {
@@ -147,7 +148,7 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
147
148
  * A pointercancel cean come after a drag event and heven being completely
148
149
  * desync, leading to erroned values. We should just ignore it.
149
150
  */
150
- n.event.type === "pointercancel" ? G(o, o, a, s) : G(o, p, a, s), { degreesDelta: D } = r === l && r >= 2 && l >= 2 && /**
151
+ n.event.type === "pointercancel" ? G(o, o, a, s) : G(o, p, a, s), { degreesDelta: P } = r === l && r >= 2 && l >= 2 && /**
151
152
  * A pointercancel cean come after a drag event and heven being completely
152
153
  * desync, leading to erroned values. We should just ignore it.
153
154
  */
@@ -162,7 +163,7 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
162
163
  center: o,
163
164
  deltaX: f,
164
165
  deltaY: A,
165
- deltaPointersAngle: D
166
+ deltaPointersAngle: P
166
167
  };
167
168
  }, void 0),
168
169
  c((e) => {
@@ -174,12 +175,12 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
174
175
  center: s,
175
176
  event: r,
176
177
  deltaPointersAngle: l
177
- } = e, d = p ?? [], f = Date.now() - a, { velocityX: A, velocityY: D } = De(f, n, o), m = ve(p);
178
+ } = e, d = p ?? [], f = Date.now() - a, { velocityX: A, velocityY: P } = Pe(f, n, o), m = ve(p);
178
179
  return {
179
180
  deltaX: n,
180
181
  deltaY: o,
181
182
  velocityX: A,
182
- velocityY: D,
183
+ velocityY: P,
183
184
  delay: f,
184
185
  center: s,
185
186
  pointers: d,
@@ -190,11 +191,11 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
190
191
  };
191
192
  })
192
193
  );
193
- }, Ee = ({
194
+ }, we = ({
194
195
  container: t,
195
196
  afterEventReceived: i = (e) => e
196
197
  }) => {
197
- const e = Pe({ afterEventReceived: i, container: t }), n = S(t, "pointerup").pipe(
198
+ const e = Ee({ afterEventReceived: i, container: t }), n = S(t, "pointerup").pipe(
198
199
  c(i)
199
200
  ), o = S(t, "pointermove").pipe(
200
201
  c(i)
@@ -243,12 +244,12 @@ class O {
243
244
  });
244
245
  this.pointerEvent$ = this.config$.pipe(
245
246
  g(
246
- ({ container: p, afterEventReceived: a }) => Ee({
247
+ ({ container: p, afterEventReceived: a }) => we({
247
248
  container: p,
248
249
  afterEventReceived: a
249
250
  }).pointerEvents$
250
251
  ),
251
- P()
252
+ D()
252
253
  ), this.pointerDown$ = this.pointerEvent$.pipe(
253
254
  h((p) => p.type === "pointerdown")
254
255
  ), this.pointerUp$ = this.pointerEvent$.pipe(
@@ -278,8 +279,8 @@ class O {
278
279
  ), this.pan$ = this.configSubject.pipe(
279
280
  _,
280
281
  g((p) => {
281
- var f, A, D;
282
- const a = Math.max(1, ((f = p.panConfig) == null ? void 0 : f.numInputs) ?? 1), s = Math.max(0, ((A = p.panConfig) == null ? void 0 : A.posThreshold) ?? 0), r = Math.max(0, ((D = p.panConfig) == null ? void 0 : D.delay) ?? 0), l = this.pointerDown$.pipe(
282
+ var f, A, P;
283
+ const a = Math.max(1, ((f = p.panConfig) == null ? void 0 : f.numInputs) ?? 1), s = Math.max(0, ((A = p.panConfig) == null ? void 0 : A.posThreshold) ?? 0), r = Math.max(0, ((P = p.panConfig) == null ? void 0 : P.delay) ?? 0), l = this.pointerDown$.pipe(
283
284
  ee({
284
285
  pointerEvent$: this.pointerEvent$
285
286
  }),
@@ -295,7 +296,7 @@ class O {
295
296
  const E = l.pipe(
296
297
  u,
297
298
  z(),
298
- P()
299
+ D()
299
300
  ), X = J(r), R = y(
300
301
  ...m.map((v) => T(v)),
301
302
  this.pointerDown$
@@ -367,7 +368,7 @@ class O {
367
368
  fingers: p.pointers.length
368
369
  });
369
370
  }),
370
- P()
371
+ D()
371
372
  ), this.panStart$ = this.pan$.pipe(
372
373
  h((p) => p.type === "start"),
373
374
  c(({ type: p, ...a }) => a)
@@ -397,7 +398,7 @@ class O {
397
398
  this.updateInternal(i, e);
398
399
  }
399
400
  }
400
- class Se extends O {
401
+ class be extends O {
401
402
  constructor(e) {
402
403
  var a;
403
404
  super(e, {
@@ -415,13 +416,13 @@ class Se extends O {
415
416
  C(this.failWithActive$),
416
417
  h(([, s]) => !s),
417
418
  c(([s]) => s),
418
- P()
419
+ D()
419
420
  ), o = this.panEnd$.pipe(
420
421
  c((s) => ({
421
422
  type: "panEnd",
422
423
  ...s
423
424
  })),
424
- P()
425
+ D()
425
426
  ), p = this.panMove$.pipe(
426
427
  c((s) => ({
427
428
  type: "panMove",
@@ -448,7 +449,7 @@ class Se extends O {
448
449
  );
449
450
  return y(u, f);
450
451
  }),
451
- P()
452
+ D()
452
453
  ), this.start$ = this.events$.pipe(
453
454
  h((s) => s.type === "panStart")
454
455
  ), this.end$ = this.events$.pipe(h((s) => s.type === "panEnd"));
@@ -457,10 +458,10 @@ class Se extends O {
457
458
  super.update(e, e.options);
458
459
  }
459
460
  }
460
- const we = (t) => (i) => i.pipe(
461
+ const Me = (t) => (i) => i.pipe(
461
462
  h((e) => Math.abs(e.velocityX) >= t || Math.abs(e.velocityY) >= t)
462
463
  );
463
- class be extends O {
464
+ class Ce extends O {
464
465
  constructor(e) {
465
466
  super(e, {
466
467
  posThreshold: 0,
@@ -474,7 +475,7 @@ class be extends O {
474
475
  C(this.failWithActive$),
475
476
  h(([, p]) => !p),
476
477
  g(([p]) => this.panEnd$.pipe(
477
- we(o),
478
+ Me(o),
478
479
  c((a) => ({
479
480
  type: "swipe",
480
481
  angle: ge(
@@ -487,7 +488,7 @@ class be extends O {
487
488
  this.failWithActive$.pipe(h((a) => a))
488
489
  )
489
490
  )),
490
- P()
491
+ D()
491
492
  );
492
493
  })
493
494
  );
@@ -496,7 +497,7 @@ class be extends O {
496
497
  super.update(e);
497
498
  }
498
499
  }
499
- const Me = ({
500
+ const xe = ({
500
501
  timeout: t,
501
502
  pointerEvent$: i
502
503
  }) => (e) => e.pipe(
@@ -507,7 +508,7 @@ const Me = ({
507
508
  )
508
509
  )
509
510
  )
510
- ), xe = ({
511
+ ), Ie = ({
511
512
  initialPointerEvent: t,
512
513
  pointerEvent$: i,
513
514
  tolerance: e
@@ -522,7 +523,7 @@ const Me = ({
522
523
  )
523
524
  )
524
525
  );
525
- class Ce extends O {
526
+ class Re extends O {
526
527
  constructor(e) {
527
528
  super(e);
528
529
  $(this, "events$");
@@ -535,8 +536,8 @@ class Ce extends O {
535
536
  }),
536
537
  M(1)
537
538
  ), l = r.pipe(
538
- h(({ pointers: D }) => D.length > 1)
539
- ), d = (D) => D.pipe(
539
+ h(({ pointers: P }) => P.length > 1)
540
+ ), d = (P) => P.pipe(
540
541
  he(this.pointerUp$.pipe(ce(p))),
541
542
  z()
542
543
  );
@@ -544,18 +545,18 @@ class Ce extends O {
544
545
  this.pointerDown$,
545
546
  r.pipe(le())
546
547
  ).pipe(
547
- H((D) => {
548
+ H((P) => {
548
549
  const m = y(
549
- T(D),
550
+ T(P),
550
551
  this.pointerDown$
551
552
  ).pipe(M(1)), E = m.pipe(d), X = m.pipe(
552
- xe({
553
- initialPointerEvent: D,
553
+ Ie({
554
+ initialPointerEvent: P,
554
555
  pointerEvent$: this.pointerEvent$,
555
556
  tolerance: s
556
557
  })
557
558
  ), B = m.pipe(
558
- Me({
559
+ xe({
559
560
  pointerEvent$: this.pointerEvent$,
560
561
  timeout: a
561
562
  })
@@ -589,14 +590,14 @@ class Ce extends O {
589
590
  })
590
591
  );
591
592
  }),
592
- P()
593
+ D()
593
594
  );
594
595
  }
595
596
  update(e) {
596
597
  super.update(e);
597
598
  }
598
599
  }
599
- class Re extends O {
600
+ class ze extends O {
600
601
  constructor(e = {}) {
601
602
  super(e, {
602
603
  numInputs: 2,
@@ -628,7 +629,7 @@ class Re extends O {
628
629
  }, void 0)
629
630
  )
630
631
  ),
631
- P()
632
+ D()
632
633
  ), p = o.pipe(
633
634
  h((s) => s.type === "move"),
634
635
  c((s) => ({ ...s, type: "rotateMove" }))
@@ -638,7 +639,7 @@ class Re extends O {
638
639
  );
639
640
  return y(n, p, a);
640
641
  }),
641
- P()
642
+ D()
642
643
  );
643
644
  }
644
645
  update(e) {
@@ -664,7 +665,7 @@ const Y = ({
664
665
  }, i),
665
666
  c(({ initialPointersAverageDistance: n, ...o }) => o)
666
667
  );
667
- class ze extends O {
668
+ class Fe extends O {
668
669
  constructor(e) {
669
670
  super(e, {
670
671
  ...e == null ? void 0 : e.options,
@@ -715,13 +716,13 @@ class ze extends O {
715
716
  type: "pinchEnd",
716
717
  initialEvent: r
717
718
  }),
718
- P()
719
+ D()
719
720
  );
720
721
  })
721
722
  );
722
723
  return y(n, p, a);
723
724
  }),
724
- P()
725
+ D()
725
726
  ), this.start$ = this.events$.pipe(
726
727
  h((n) => n.type === "pinchStart")
727
728
  ), this.end$ = this.events$.pipe(h((n) => n.type === "pinchEnd"));
@@ -730,7 +731,7 @@ class ze extends O {
730
731
  super.update(e, e.options);
731
732
  }
732
733
  }
733
- class Fe {
734
+ class Oe {
734
735
  constructor(i) {
735
736
  $(this, "events$");
736
737
  $(this, "recognizers");
@@ -739,7 +740,7 @@ class Fe {
739
740
  ...i.recognizers.map(
740
741
  (e) => e.events$.pipe(c((n) => ({ event: n, recognizer: e })))
741
742
  )
742
- ).pipe(P()), this.state$ = j(
743
+ ).pipe(D()), this.state$ = j(
743
744
  this.recognizers.map((e) => e.state$)
744
745
  ).pipe(
745
746
  c(
@@ -759,12 +760,12 @@ class Fe {
759
760
  }
760
761
  }
761
762
  export {
762
- Se as PanRecognizer,
763
- ze as PinchRecognizer,
764
- Fe as Recognizable,
763
+ be as PanRecognizer,
764
+ Fe as PinchRecognizer,
765
+ Oe as Recognizable,
765
766
  O as Recognizer,
766
- Re as RotateRecognizer,
767
- be as SwipeRecognizer,
768
- Ce as TapRecognizer
767
+ ze as RotateRecognizer,
768
+ Ce as SwipeRecognizer,
769
+ Re as TapRecognizer
769
770
  };
770
771
  //# sourceMappingURL=index.js.map
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/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { type Observable, filter } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\ttype Observable,\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { type Observable, filter } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { type Observable, map, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: new Date().getTime(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\ttype Observable,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { type Observable, filter } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\nimport { isRecognizedAsSwipe } from \"./operators\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmergeMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\ttype Observable,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tmerge,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\tmap((event) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap(() =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tscan<\n\t\t\t\t\t\t\t\tRecognizerPanEvent,\n\t\t\t\t\t\t\t\tRecognizerPanEvent & { angle: number; deltaAngle: number },\n\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t>((acc, current) => {\n\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { type Observable, map, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: !!acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tNEVER,\n\ttype Observable,\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent;\n\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\tswitchMap((event) => {\n\t\t\t\t\t\t\t\tif (event.type === \"end\") {\n\t\t\t\t\t\t\t\t\treturn of(event);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\n\t\t\t\t\t\t\t\treturn NEVER;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEventOrNull) =>\n\t\t\t\t\t\t\t\tendEventOrNull ? endEventOrNull : latestEvent,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchEnd\",\n\t\t\t\t\t\t\t\tinitialEvent: latestEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\ttype Observable,\n\ttype ObservedValueOf,\n\tcombineLatest,\n\tmap,\n\tmerge,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialPoint","index","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { type Observable, filter } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\ttype Observable,\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\n/**\n * A press of the primary button: a left click, a finger or a pen's tip. A\n * right click is for the context menu, a middle click for the browser, and a\n * pen's barrel button or eraser for the app.\n *\n * @see https://w3c.github.io/pointerevents/#the-button-property\n */\nconst isPrimaryButtonPress = (event: PointerEvent) => event.button === 0;\n\n/**\n * The presses that start a gesture. Every recognizer tracks a pointer from its\n * press, so a pointer pressed with another button starts none: no tap, pan or\n * pinch, and no share of a multi tap.\n */\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t\tfilter(isPrimaryButtonPress),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { type Observable, filter } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { type Observable, map, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: new Date().getTime(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\ttype Observable,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { type Observable, filter } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\nimport { isRecognizedAsSwipe } from \"./operators\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmergeMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\ttype Observable,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tmerge,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\tmap((event) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap(() =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tscan<\n\t\t\t\t\t\t\t\tRecognizerPanEvent,\n\t\t\t\t\t\t\t\tRecognizerPanEvent & { angle: number; deltaAngle: number },\n\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t>((acc, current) => {\n\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { type Observable, map, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: !!acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tNEVER,\n\ttype Observable,\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent;\n\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\tswitchMap((event) => {\n\t\t\t\t\t\t\t\tif (event.type === \"end\") {\n\t\t\t\t\t\t\t\t\treturn of(event);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\n\t\t\t\t\t\t\t\treturn NEVER;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEventOrNull) =>\n\t\t\t\t\t\t\t\tendEventOrNull ? endEventOrNull : latestEvent,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchEnd\",\n\t\t\t\t\t\t\t\tinitialEvent: latestEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\ttype Observable,\n\ttype ObservedValueOf,\n\tcombineLatest,\n\tmap,\n\tmerge,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialPoint","index","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","isPrimaryButtonPress","event","fromPointerDown","container","afterEventReceived","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(u,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):(u=typeof globalThis<"u"?globalThis:u||self,e(u.gesturx={},u.rxjs))})(this,function(u,e){"use strict";var oe=Object.defineProperty;var ae=(u,e,P)=>e in u?oe(u,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):u[e]=P;var c=(u,e,P)=>ae(u,typeof e!="symbol"?e+"":e,P);function P(i,p){return Math.sqrt((p.x-i.x)**2+(p.y-i.y)**2)}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((s,a,l)=>s+i.slice(l+1).reduce((o,r)=>o+P(a,r),0),0),n=p*(p-1)/2;return t/n}function I(i,p){const t=p.x-i.x,n=p.y-i.y;return Math.atan2(n,t)}function V(i,p){return I(i,p)*(180/Math.PI)}function E(i){const p=i.reduce((n,s)=>(n.x+=s.x,n.y+=s.y,n),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(i),n=E(p);let s=0;i.forEach((o,r)=>{const h=I(t,o);let $=I(n,p[r]??o)-h;$>Math.PI?$-=2*Math.PI:$<-Math.PI&&($+=2*Math.PI),s+=$});const a=s/i.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(i){return i!=null}const _=i=>i.length>0,G=i=>i.pipe(e.filter(_));function C(i,p,t){const n=E([i]),s=E([p]);return Math.abs(s.x-n.x)>=t||Math.abs(s.y-n.y)>=t}const H=(i,p,t)=>{const n=i>0?p/i:0,s=i>0?t/i:0;return{velocityX:n,velocityY:s}};function T(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const F=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",J=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),L=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(r=>r.type==="pointerup")),n=i.pipe(e.filter(r=>r.type==="pointerleave")),s=i.pipe(e.filter(r=>r.type==="pointercancel")),a=i.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),o=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return p.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,s,n,t,l)).pipe(T(r),e.takeWhile($=>!o($),!0))}),e.scan((r,h)=>{if(o(h)){const{[h.pointerId]:d,...$}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:$}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},U=i=>i.pipe(e.filter(p=>!!p.container)),O=i=>i.pipe(e.filter(F)),W=(i,p,t,n)=>{const s=i.x-p.x+t,a=i.y-p.y+n;return{deltaX:s,deltaY:a}},X=i=>{const p=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,n)=>{var m,w;const s=p(n),a=(t==null?void 0:t.center)??s,l=(t==null?void 0:t.deltaX)??0,o=(t==null?void 0:t.deltaY)??0,r=((m=t==null?void 0:t.latestActivePointers)==null?void 0:m.length)??1,h=((w=n.latestActivePointers)==null?void 0:w.length)??1,d=["pointerdown","pointercancel","pointerleave","pointerup"].includes(n.event.type)&&r!==h,$=h>0,{deltaX:f,deltaY:v}=d&&$||n.event.type==="pointercancel"?W(s,s,l,o):W(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2&&n.event.type!=="pointercancel"?B((t==null?void 0:t.latestActivePointers)??[],n.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...n,center:s,deltaX:f,deltaY:v,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:n,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,d=a??[],f=Date.now()-l,{velocityX:v,velocityY:y}=H(f,n,s),m=N(a);return{deltaX:n,deltaY:s,velocityX:v,velocityY:y,delay:f,center:o,pointers:d,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:m}}))},K=({container:i,afterEventReceived:p=t=>t})=>{const t=J({afterEventReceived:p,container:i}),n=e.fromEvent(i,"pointerup").pipe(e.map(p)),s=e.fromEvent(i,"pointermove").pipe(e.map(p)),a=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return{pointerEvents$:e.merge(t,l,a,n,s),pointerDown$:t,pointerCancel$:l,pointerLeave$:a,pointerUp$:n,pointerMove$:s}};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(U));c(this,"failWithActive$");const n=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}).pointerEvents$),e.share()),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(O);const s=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=s.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(o=>{const r=o.start$.pipe(e.map(()=>!0)),h=o.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(U,e.switchMap(a=>{var f,v,y;const l=Math.max(1,((f=a.panConfig)==null?void 0:f.numInputs)??1),o=Math.max(0,((v=a.panConfig)==null?void 0:v.posThreshold)??0),r=Math.max(0,((y=a.panConfig)==null?void 0:y.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),d=m=>m.pipe(e.filter(w=>w.pointers.length>=l)),$=m=>m.pipe(e.filter(w=>w.pointers.length<l));return h.pipe(d,e.exhaustMap(({pointers:m})=>{const w=h.pipe($,e.first(),e.share()),k=e.timer(r),R=e.merge(...m.map(g=>e.of(g)),this.pointerDown$).pipe(e.mergeMap(g=>e.merge(this.pointerMove$,e.of(g)).pipe(T(g),e.filter(M=>C(g,M,o)))),e.first()).pipe(e.switchMap(()=>k),e.withLatestFrom(h),e.map(([,{event:g,pointers:M}])=>({type:"start",event:g,latestActivePointers:M})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(w)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:g,pointers:M})=>({type:"move",event:g,latestActivePointers:M})))),e.takeUntil(w)),A=R.pipe(e.mergeMap(()=>w.pipe(e.map(({event:g,pointers:M})=>({type:"end",event:g,latestActivePointers:M}))))),b=e.merge(R,S,A).pipe(e.shareReplay(1));return b.pipe(X,e.withLatestFrom(b),e.map(([g,{type:M}])=>({...g,type:M})))}))}),e.tap(a=>{n.next({fingers:a.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(a=>a.type==="start"),e.map(({type:a,...l})=>l)),this.panMove$=this.pan$.pipe(e.filter(a=>a.type==="move"),e.map(({type:a,...l})=>l)),this.panEnd$=this.pan$.pipe(e.filter(a=>a.type==="end"),e.map(({type:a,...l})=>l)),this.state$=n.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const n=this.configSubject.getValue();this.configSubject.next({...n,...p,...p.options&&{options:{...n.options,...p.options}},panConfig:{...n.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const n=this.panStart$.pipe(e.map(o=>({type:"panStart",...o})),e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.share()),s=this.panEnd$.pipe(e.map(o=>({type:"panEnd",...o})),e.share()),a=this.panMove$.pipe(e.map(o=>({type:"panMove",...o})));this.events$=n.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),d=this.failWithActive$.pipe(e.filter(v=>v),e.first()),$=e.merge(h,a,s).pipe(e.tap(v=>{r=v}),e.takeUntil(d)),f=d.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge($,f)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="panStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{const{escapeVelocity:s=.9}=n.options??{};return this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,a])=>!a),e.switchMap(([a])=>this.panEnd$.pipe(Z(s),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})),e.takeUntil(this.failWithActive$.pipe(e.filter(l=>l))))),e.share())}))}update(t){super.update(t)}}const j=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(n=>e.timer(i).pipe(e.takeUntil(p.pipe(O,T(n)))))),ee=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>n=>n.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(i,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{var f,v;const s=((f=n.options)==null?void 0:f.maxTaps)??1,a=((v=n.options)==null?void 0:v.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=n.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),d=y=>y.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(y=>{const m=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),w=m.pipe(d),k=m.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=m.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(A=>A)),this.pointerCancel$,h,k,Y),S=w.pipe(G,e.filter(A=>A.length<=s),e.map(A=>({type:"tap",taps:A.length,latestActivePointers:A,event:A[0]})),e.shareReplay(1));return S.pipe(X,e.withLatestFrom(S),e.map(([A,{type:b,taps:g}])=>({...A,type:b,taps:g})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ne extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=n.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((o,r)=>{const h=((o==null?void 0:o.angle)??0)+r.deltaPointersAngle;return{...o,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=s.pipe(e.filter(o=>o.type==="move"),e.map(o=>({...o,type:"rotateMove"}))),l=s.pipe(e.filter(o=>o.type==="end"),e.map(o=>({...o,type:"rotateEnd"})));return e.merge(n,a,l)}),e.share())}update(t){super.update(t,t.options)}}const z=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((n,s)=>{const l=((n==null?void 0:n.pointers.length)??0)!==s.pointers.length,o=(n==null?void 0:n.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:n&&"initialPointersAverageDistance"in n?n.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,d=s.pointersAverageDistance-r,$=s.pointersAverageDistance-r,f=l||o===0?1:s.pointersAverageDistance/o;return{...n,...s,type:i,initialPointersAverageDistance:r,scale:h,distance:d,deltaDistance:$,deltaDistanceScale:f}},p),e.map(({initialPointersAverageDistance:n,...s})=>s));class ie extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");c(this,"end$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.switchMap(o=>e.of(o).pipe(z({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),s=this.failWithActive$.pipe(e.filter(o=>o),e.first()),a=n.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),z({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=n.pipe(e.switchMap(o=>{let r=o;return this.pan$.pipe(e.switchMap(h=>h.type==="end"?e.of(h):(r=h,e.NEVER)),e.takeUntil(s),e.defaultIfEmpty(null),e.map(h=>h||r),z({type:"pinchEnd",initialEvent:r}),e.share())}));return e.merge(n,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(n=>n.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(n=>n.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$.pipe(e.map(n=>({event:n,recognizer:t}))))).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((n,s)=>({fingers:Math.max(n.fingers,s.fingers)})))),this.update(p)}update({disableTextSelection:p,...t}){t.container&&(t.container.style.touchAction="none",p&&(t.container.style.userSelect="none"));for(const n of this.options.recognizers)n.update(t)}}u.PanRecognizer=Q,u.PinchRecognizer=ie,u.Recognizable=pe,u.Recognizer=D,u.RotateRecognizer=ne,u.SwipeRecognizer=x,u.TapRecognizer=te,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
1
+ (function(u,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):(u=typeof globalThis<"u"?globalThis:u||self,e(u.gesturx={},u.rxjs))})(this,function(u,e){"use strict";var ae=Object.defineProperty;var se=(u,e,P)=>e in u?ae(u,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):u[e]=P;var c=(u,e,P)=>se(u,typeof e!="symbol"?e+"":e,P);function P(i,p){return Math.sqrt((p.x-i.x)**2+(p.y-i.y)**2)}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((s,a,l)=>s+i.slice(l+1).reduce((o,r)=>o+P(a,r),0),0),n=p*(p-1)/2;return t/n}function I(i,p){const t=p.x-i.x,n=p.y-i.y;return Math.atan2(n,t)}function B(i,p){return I(i,p)*(180/Math.PI)}function E(i){const p=i.reduce((n,s)=>(n.x+=s.x,n.y+=s.y,n),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function V(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(i),n=E(p);let s=0;i.forEach((o,r)=>{const h=I(t,o);let $=I(n,p[r]??o)-h;$>Math.PI?$-=2*Math.PI:$<-Math.PI&&($+=2*Math.PI),s+=$});const a=s/i.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(i){return i!=null}const _=i=>i.length>0,G=i=>i.pipe(e.filter(_));function C(i,p,t){const n=E([i]),s=E([p]);return Math.abs(s.x-n.x)>=t||Math.abs(s.y-n.y)>=t}const H=(i,p,t)=>{const n=i>0?p/i:0,s=i>0?t/i:0;return{velocityX:n,velocityY:s}};function T(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const F=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",J=i=>i.button===0,K=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p),e.filter(J)),L=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(r=>r.type==="pointerup")),n=i.pipe(e.filter(r=>r.type==="pointerleave")),s=i.pipe(e.filter(r=>r.type==="pointercancel")),a=i.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),o=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return p.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,s,n,t,l)).pipe(T(r),e.takeWhile($=>!o($),!0))}),e.scan((r,h)=>{if(o(h)){const{[h.pointerId]:d,...$}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:$}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},U=i=>i.pipe(e.filter(p=>!!p.container)),O=i=>i.pipe(e.filter(F)),W=(i,p,t,n)=>{const s=i.x-p.x+t,a=i.y-p.y+n;return{deltaX:s,deltaY:a}},X=i=>{const p=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,n)=>{var m,w;const s=p(n),a=(t==null?void 0:t.center)??s,l=(t==null?void 0:t.deltaX)??0,o=(t==null?void 0:t.deltaY)??0,r=((m=t==null?void 0:t.latestActivePointers)==null?void 0:m.length)??1,h=((w=n.latestActivePointers)==null?void 0:w.length)??1,d=["pointerdown","pointercancel","pointerleave","pointerup"].includes(n.event.type)&&r!==h,$=h>0,{deltaX:f,deltaY:v}=d&&$||n.event.type==="pointercancel"?W(s,s,l,o):W(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2&&n.event.type!=="pointercancel"?V((t==null?void 0:t.latestActivePointers)??[],n.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...n,center:s,deltaX:f,deltaY:v,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:n,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,d=a??[],f=Date.now()-l,{velocityX:v,velocityY:y}=H(f,n,s),m=N(a);return{deltaX:n,deltaY:s,velocityX:v,velocityY:y,delay:f,center:o,pointers:d,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:m}}))},Q=({container:i,afterEventReceived:p=t=>t})=>{const t=K({afterEventReceived:p,container:i}),n=e.fromEvent(i,"pointerup").pipe(e.map(p)),s=e.fromEvent(i,"pointermove").pipe(e.map(p)),a=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return{pointerEvents$:e.merge(t,l,a,n,s),pointerDown$:t,pointerCancel$:l,pointerLeave$:a,pointerUp$:n,pointerMove$:s}};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(U));c(this,"failWithActive$");const n=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>Q({container:a,afterEventReceived:l}).pointerEvents$),e.share()),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(O);const s=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=s.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(o=>{const r=o.start$.pipe(e.map(()=>!0)),h=o.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(U,e.switchMap(a=>{var f,v,y;const l=Math.max(1,((f=a.panConfig)==null?void 0:f.numInputs)??1),o=Math.max(0,((v=a.panConfig)==null?void 0:v.posThreshold)??0),r=Math.max(0,((y=a.panConfig)==null?void 0:y.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),d=m=>m.pipe(e.filter(w=>w.pointers.length>=l)),$=m=>m.pipe(e.filter(w=>w.pointers.length<l));return h.pipe(d,e.exhaustMap(({pointers:m})=>{const w=h.pipe($,e.first(),e.share()),k=e.timer(r),R=e.merge(...m.map(g=>e.of(g)),this.pointerDown$).pipe(e.mergeMap(g=>e.merge(this.pointerMove$,e.of(g)).pipe(T(g),e.filter(M=>C(g,M,o)))),e.first()).pipe(e.switchMap(()=>k),e.withLatestFrom(h),e.map(([,{event:g,pointers:M}])=>({type:"start",event:g,latestActivePointers:M})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(w)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:g,pointers:M})=>({type:"move",event:g,latestActivePointers:M})))),e.takeUntil(w)),A=R.pipe(e.mergeMap(()=>w.pipe(e.map(({event:g,pointers:M})=>({type:"end",event:g,latestActivePointers:M}))))),b=e.merge(R,S,A).pipe(e.shareReplay(1));return b.pipe(X,e.withLatestFrom(b),e.map(([g,{type:M}])=>({...g,type:M})))}))}),e.tap(a=>{n.next({fingers:a.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(a=>a.type==="start"),e.map(({type:a,...l})=>l)),this.panMove$=this.pan$.pipe(e.filter(a=>a.type==="move"),e.map(({type:a,...l})=>l)),this.panEnd$=this.pan$.pipe(e.filter(a=>a.type==="end"),e.map(({type:a,...l})=>l)),this.state$=n.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const n=this.configSubject.getValue();this.configSubject.next({...n,...p,...p.options&&{options:{...n.options,...p.options}},panConfig:{...n.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class Z extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const n=this.panStart$.pipe(e.map(o=>({type:"panStart",...o})),e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.share()),s=this.panEnd$.pipe(e.map(o=>({type:"panEnd",...o})),e.share()),a=this.panMove$.pipe(e.map(o=>({type:"panMove",...o})));this.events$=n.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),d=this.failWithActive$.pipe(e.filter(v=>v),e.first()),$=e.merge(h,a,s).pipe(e.tap(v=>{r=v}),e.takeUntil(d)),f=d.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge($,f)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="panStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="panEnd"))}update(t){super.update(t,t.options)}}const x=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class j extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{const{escapeVelocity:s=.9}=n.options??{};return this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,a])=>!a),e.switchMap(([a])=>this.panEnd$.pipe(x(s),e.map(l=>({type:"swipe",angle:B(a.event,l.event),...l})),e.takeUntil(this.failWithActive$.pipe(e.filter(l=>l))))),e.share())}))}update(t){super.update(t)}}const ee=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(n=>e.timer(i).pipe(e.takeUntil(p.pipe(O,T(n)))))),te=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>n=>n.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(i,a,t)))));class ne extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{var f,v;const s=((f=n.options)==null?void 0:f.maxTaps)??1,a=((v=n.options)==null?void 0:v.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=n.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),d=y=>y.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(y=>{const m=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),w=m.pipe(d),k=m.pipe(te({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=m.pipe(ee({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(A=>A)),this.pointerCancel$,h,k,Y),S=w.pipe(G,e.filter(A=>A.length<=s),e.map(A=>({type:"tap",taps:A.length,latestActivePointers:A,event:A[0]})),e.shareReplay(1));return S.pipe(X,e.withLatestFrom(S),e.map(([A,{type:b,taps:g}])=>({...A,type:b,taps:g})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ie extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=n.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((o,r)=>{const h=((o==null?void 0:o.angle)??0)+r.deltaPointersAngle;return{...o,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=s.pipe(e.filter(o=>o.type==="move"),e.map(o=>({...o,type:"rotateMove"}))),l=s.pipe(e.filter(o=>o.type==="end"),e.map(o=>({...o,type:"rotateEnd"})));return e.merge(n,a,l)}),e.share())}update(t){super.update(t,t.options)}}const z=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((n,s)=>{const l=((n==null?void 0:n.pointers.length)??0)!==s.pointers.length,o=(n==null?void 0:n.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:n&&"initialPointersAverageDistance"in n?n.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,d=s.pointersAverageDistance-r,$=s.pointersAverageDistance-r,f=l||o===0?1:s.pointersAverageDistance/o;return{...n,...s,type:i,initialPointersAverageDistance:r,scale:h,distance:d,deltaDistance:$,deltaDistanceScale:f}},p),e.map(({initialPointersAverageDistance:n,...s})=>s));class pe extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");c(this,"end$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.switchMap(o=>e.of(o).pipe(z({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),s=this.failWithActive$.pipe(e.filter(o=>o),e.first()),a=n.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),z({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=n.pipe(e.switchMap(o=>{let r=o;return this.pan$.pipe(e.switchMap(h=>h.type==="end"?e.of(h):(r=h,e.NEVER)),e.takeUntil(s),e.defaultIfEmpty(null),e.map(h=>h||r),z({type:"pinchEnd",initialEvent:r}),e.share())}));return e.merge(n,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(n=>n.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(n=>n.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class oe{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$.pipe(e.map(n=>({event:n,recognizer:t}))))).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((n,s)=>({fingers:Math.max(n.fingers,s.fingers)})))),this.update(p)}update({disableTextSelection:p,...t}){t.container&&(t.container.style.touchAction="none",p&&(t.container.style.userSelect="none"));for(const n of this.options.recognizers)n.update(t)}}u.PanRecognizer=Z,u.PinchRecognizer=pe,u.Recognizable=oe,u.Recognizer=D,u.RotateRecognizer=ie,u.SwipeRecognizer=j,u.TapRecognizer=ne,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.cjs.map
@@ -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/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { type Observable, filter } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\ttype Observable,\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { type Observable, filter } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { type Observable, map, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: new Date().getTime(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\ttype Observable,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { type Observable, filter } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\nimport { isRecognizedAsSwipe } from \"./operators\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmergeMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\ttype Observable,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tmerge,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\tmap((event) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap(() =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tscan<\n\t\t\t\t\t\t\t\tRecognizerPanEvent,\n\t\t\t\t\t\t\t\tRecognizerPanEvent & { angle: number; deltaAngle: number },\n\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t>((acc, current) => {\n\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { type Observable, map, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: !!acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tNEVER,\n\ttype Observable,\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent;\n\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\tswitchMap((event) => {\n\t\t\t\t\t\t\t\tif (event.type === \"end\") {\n\t\t\t\t\t\t\t\t\treturn of(event);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\n\t\t\t\t\t\t\t\treturn NEVER;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEventOrNull) =>\n\t\t\t\t\t\t\t\tendEventOrNull ? endEventOrNull : latestEvent,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchEnd\",\n\t\t\t\t\t\t\t\tinitialEvent: latestEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\ttype Observable,\n\ttype ObservedValueOf,\n\tcombineLatest,\n\tmap,\n\tmerge,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialPoint","index","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { type Observable, filter } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\ttype Observable,\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\n/**\n * A press of the primary button: a left click, a finger or a pen's tip. A\n * right click is for the context menu, a middle click for the browser, and a\n * pen's barrel button or eraser for the app.\n *\n * @see https://w3c.github.io/pointerevents/#the-button-property\n */\nconst isPrimaryButtonPress = (event: PointerEvent) => event.button === 0;\n\n/**\n * The presses that start a gesture. Every recognizer tracks a pointer from its\n * press, so a pointer pressed with another button starts none: no tap, pan or\n * pinch, and no share of a multi tap.\n */\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t\tfilter(isPrimaryButtonPress),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { type Observable, filter } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { type Observable, map, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: new Date().getTime(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\ttype Observable,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { type Observable, filter } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\nimport { isRecognizedAsSwipe } from \"./operators\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmergeMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\ttype Observable,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tmerge,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\tmap((event) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap(() =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tscan<\n\t\t\t\t\t\t\t\tRecognizerPanEvent,\n\t\t\t\t\t\t\t\tRecognizerPanEvent & { angle: number; deltaAngle: number },\n\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t>((acc, current) => {\n\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { type Observable, map, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: !!acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tNEVER,\n\ttype Observable,\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent;\n\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\tswitchMap((event) => {\n\t\t\t\t\t\t\t\tif (event.type === \"end\") {\n\t\t\t\t\t\t\t\t\treturn of(event);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\n\t\t\t\t\t\t\t\treturn NEVER;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEventOrNull) =>\n\t\t\t\t\t\t\t\tendEventOrNull ? endEventOrNull : latestEvent,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchEnd\",\n\t\t\t\t\t\t\t\tinitialEvent: latestEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\ttype Observable,\n\ttype ObservedValueOf,\n\tcombineLatest,\n\tmap,\n\tmerge,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialPoint","index","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","isPrimaryButtonPress","event","fromPointerDown","container","afterEventReceived","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gesturx",
3
3
  "private": false,
4
- "version": "1.11.0",
4
+ "version": "1.11.1",
5
5
  "type": "module",
6
6
  "main": "./dist/index.umd.cjs",
7
7
  "module": "./dist/index.js",