gesturx 1.10.1 → 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.d.ts +10 -4
- package/dist/index.js +53 -50
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -79,11 +79,14 @@ declare interface PinchRecognizerOptions {
|
|
|
79
79
|
|
|
80
80
|
export declare class Recognizable<T extends Recognizer<any, any>[]> implements RecognizableInterface<T> {
|
|
81
81
|
protected options: RecognizableOptions<T>;
|
|
82
|
-
events$: Observable<
|
|
82
|
+
events$: Observable<{
|
|
83
|
+
event: ObservedValueOf<T[number]["events$"]>;
|
|
84
|
+
recognizer: T[number];
|
|
85
|
+
}>;
|
|
83
86
|
recognizers: T;
|
|
84
87
|
state$: Observable<RecognizableState>;
|
|
85
88
|
constructor(options: RecognizableOptions<T>);
|
|
86
|
-
update({ disableTextSelection, ...rest }: Partial<RecognizableOptions<T>>): void;
|
|
89
|
+
update({ disableTextSelection, ...rest }: Partial<Omit<RecognizableOptions<T>, "recognizers">>): void;
|
|
87
90
|
}
|
|
88
91
|
|
|
89
92
|
declare interface RecognizableInterface<T extends Recognizer<any, any>[]> {
|
|
@@ -96,7 +99,10 @@ declare interface RecognizableInterface<T extends Recognizer<any, any>[]> {
|
|
|
96
99
|
/**
|
|
97
100
|
* Dispatch events from all recognizer in one place.
|
|
98
101
|
*/
|
|
99
|
-
readonly events$: Observable<
|
|
102
|
+
readonly events$: Observable<{
|
|
103
|
+
event: ObservedValueOf<T[number]["events$"]>;
|
|
104
|
+
recognizer: T[number];
|
|
105
|
+
}>;
|
|
100
106
|
/**
|
|
101
107
|
* Global state based on registered recognizers.
|
|
102
108
|
*
|
|
@@ -109,7 +115,7 @@ declare interface RecognizableInterface<T extends Recognizer<any, any>[]> {
|
|
|
109
115
|
*
|
|
110
116
|
* The options are in fact passed down to all of the recognizers.
|
|
111
117
|
* Use it to initialize the container when you want to start
|
|
112
|
-
*
|
|
118
|
+
* listening to gesture events.
|
|
113
119
|
*/
|
|
114
120
|
update(options: RecognizerConfig<unknown>): void;
|
|
115
121
|
}
|
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
|
|
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
|
|
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",
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
},
|
|
194
|
+
}, we = ({
|
|
194
195
|
container: t,
|
|
195
196
|
afterEventReceived: i = (e) => e
|
|
196
197
|
}) => {
|
|
197
|
-
const e =
|
|
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 }) =>
|
|
247
|
+
({ container: p, afterEventReceived: a }) => we({
|
|
247
248
|
container: p,
|
|
248
249
|
afterEventReceived: a
|
|
249
250
|
}).pointerEvents$
|
|
250
251
|
),
|
|
251
|
-
|
|
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,
|
|
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, ((
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
419
|
+
D()
|
|
419
420
|
), o = this.panEnd$.pipe(
|
|
420
421
|
c((s) => ({
|
|
421
422
|
type: "panEnd",
|
|
422
423
|
...s
|
|
423
424
|
})),
|
|
424
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
),
|
|
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
|
|
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:
|
|
539
|
-
), d = (
|
|
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((
|
|
548
|
+
H((P) => {
|
|
548
549
|
const m = y(
|
|
549
|
-
T(
|
|
550
|
+
T(P),
|
|
550
551
|
this.pointerDown$
|
|
551
552
|
).pipe(M(1)), E = m.pipe(d), X = m.pipe(
|
|
552
|
-
|
|
553
|
-
initialPointerEvent:
|
|
553
|
+
Ie({
|
|
554
|
+
initialPointerEvent: P,
|
|
554
555
|
pointerEvent$: this.pointerEvent$,
|
|
555
556
|
tolerance: s
|
|
556
557
|
})
|
|
557
558
|
), B = m.pipe(
|
|
558
|
-
|
|
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
|
-
|
|
593
|
+
D()
|
|
593
594
|
);
|
|
594
595
|
}
|
|
595
596
|
update(e) {
|
|
596
597
|
super.update(e);
|
|
597
598
|
}
|
|
598
599
|
}
|
|
599
|
-
class
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
719
|
+
D()
|
|
719
720
|
);
|
|
720
721
|
})
|
|
721
722
|
);
|
|
722
723
|
return y(n, p, a);
|
|
723
724
|
}),
|
|
724
|
-
|
|
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,14 +731,16 @@ class ze extends O {
|
|
|
730
731
|
super.update(e, e.options);
|
|
731
732
|
}
|
|
732
733
|
}
|
|
733
|
-
class
|
|
734
|
+
class Oe {
|
|
734
735
|
constructor(i) {
|
|
735
736
|
$(this, "events$");
|
|
736
737
|
$(this, "recognizers");
|
|
737
738
|
$(this, "state$");
|
|
738
739
|
this.options = i, this.recognizers = i.recognizers, this.events$ = y(
|
|
739
|
-
...i.recognizers.map(
|
|
740
|
-
|
|
740
|
+
...i.recognizers.map(
|
|
741
|
+
(e) => e.events$.pipe(c((n) => ({ event: n, recognizer: e })))
|
|
742
|
+
)
|
|
743
|
+
).pipe(D()), this.state$ = j(
|
|
741
744
|
this.recognizers.map((e) => e.state$)
|
|
742
745
|
).pipe(
|
|
743
746
|
c(
|
|
@@ -757,12 +760,12 @@ class Fe {
|
|
|
757
760
|
}
|
|
758
761
|
}
|
|
759
762
|
export {
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
+
be as PanRecognizer,
|
|
764
|
+
Fe as PinchRecognizer,
|
|
765
|
+
Oe as Recognizable,
|
|
763
766
|
O as Recognizer,
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
+
ze as RotateRecognizer,
|
|
768
|
+
Ce as SwipeRecognizer,
|
|
769
|
+
Re as TapRecognizer
|
|
767
770
|
};
|
|
768
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: <explanation>\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<ObservedValueOf<T[number][\"events$\"]>>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) => recognizer.events$),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<RecognizableOptions<T>>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialPoint","index","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
|
|
1
|
+
{"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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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -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 v,w;const s=p(n),a=(t==null?void 0:t.center)??s,l=(t==null?void 0:t.deltaX)??0,o=(t==null?void 0:t.deltaY)??0,r=((v=t==null?void 0:t.latestActivePointers)==null?void 0:v.length)??1,h=((w=n.latestActivePointers)==null?void 0:w.length)??1,d=["pointerdown","pointercancel","pointerleave","pointerup"].includes(n.event.type)&&r!==h,$=h>0,{deltaX:f,deltaY:m}=d&&$||n.event.type==="pointercancel"?W(s,s,l,o):W(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2&&n.event.type!=="pointercancel"?B((t==null?void 0:t.latestActivePointers)??[],n.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...n,center:s,deltaX:f,deltaY:m,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:n,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,d=a??[],f=Date.now()-l,{velocityX:m,velocityY:y}=H(f,n,s),v=N(a);return{deltaX:n,deltaY:s,velocityX:m,velocityY:y,delay:f,center:o,pointers:d,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:v}}))},K=({container:i,afterEventReceived:p=t=>t})=>{const t=J({afterEventReceived:p,container:i}),n=e.fromEvent(i,"pointerup").pipe(e.map(p)),s=e.fromEvent(i,"pointermove").pipe(e.map(p)),a=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return{pointerEvents$:e.merge(t,l,a,n,s),pointerDown$:t,pointerCancel$:l,pointerLeave$:a,pointerUp$:n,pointerMove$:s}};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(U));c(this,"failWithActive$");const n=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}).pointerEvents$),e.share()),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(O);const s=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=s.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(o=>{const r=o.start$.pipe(e.map(()=>!0)),h=o.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(U,e.switchMap(a=>{var f,m,y;const l=Math.max(1,((f=a.panConfig)==null?void 0:f.numInputs)??1),o=Math.max(0,((m=a.panConfig)==null?void 0:m.posThreshold)??0),r=Math.max(0,((y=a.panConfig)==null?void 0:y.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),d=v=>v.pipe(e.filter(w=>w.pointers.length>=l)),$=v=>v.pipe(e.filter(w=>w.pointers.length<l));return h.pipe(d,e.exhaustMap(({pointers:v})=>{const w=h.pipe($,e.first(),e.share()),k=e.timer(r),R=e.merge(...v.map(g=>e.of(g)),this.pointerDown$).pipe(e.mergeMap(g=>e.merge(this.pointerMove$,e.of(g)).pipe(T(g),e.filter(M=>C(g,M,o)))),e.first()).pipe(e.switchMap(()=>k),e.withLatestFrom(h),e.map(([,{event:g,pointers:M}])=>({type:"start",event:g,latestActivePointers:M})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(w)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:g,pointers:M})=>({type:"move",event:g,latestActivePointers:M})))),e.takeUntil(w)),A=R.pipe(e.mergeMap(()=>w.pipe(e.map(({event:g,pointers:M})=>({type:"end",event:g,latestActivePointers:M}))))),b=e.merge(R,S,A).pipe(e.shareReplay(1));return b.pipe(X,e.withLatestFrom(b),e.map(([g,{type:M}])=>({...g,type:M})))}))}),e.tap(a=>{n.next({fingers:a.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(a=>a.type==="start"),e.map(({type:a,...l})=>l)),this.panMove$=this.pan$.pipe(e.filter(a=>a.type==="move"),e.map(({type:a,...l})=>l)),this.panEnd$=this.pan$.pipe(e.filter(a=>a.type==="end"),e.map(({type:a,...l})=>l)),this.state$=n.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const n=this.configSubject.getValue();this.configSubject.next({...n,...p,...p.options&&{options:{...n.options,...p.options}},panConfig:{...n.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const n=this.panStart$.pipe(e.map(o=>({type:"panStart",...o})),e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.share()),s=this.panEnd$.pipe(e.map(o=>({type:"panEnd",...o})),e.share()),a=this.panMove$.pipe(e.map(o=>({type:"panMove",...o})));this.events$=n.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),d=this.failWithActive$.pipe(e.filter(m=>m),e.first()),$=e.merge(h,a,s).pipe(e.tap(m=>{r=m}),e.takeUntil(d)),f=d.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge($,f)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="panStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{const{escapeVelocity:s=.9}=n.options??{};return this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,a])=>!a),e.switchMap(([a])=>this.panEnd$.pipe(Z(s),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})),e.takeUntil(this.failWithActive$.pipe(e.filter(l=>l))))),e.share())}))}update(t){super.update(t)}}const j=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(n=>e.timer(i).pipe(e.takeUntil(p.pipe(O,T(n)))))),ee=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>n=>n.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(i,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{var f,m;const s=((f=n.options)==null?void 0:f.maxTaps)??1,a=((m=n.options)==null?void 0:m.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=n.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),d=y=>y.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(y=>{const v=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),w=v.pipe(d),k=v.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=v.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(A=>A)),this.pointerCancel$,h,k,Y),S=w.pipe(G,e.filter(A=>A.length<=s),e.map(A=>({type:"tap",taps:A.length,latestActivePointers:A,event:A[0]})),e.shareReplay(1));return S.pipe(X,e.withLatestFrom(S),e.map(([A,{type:b,taps:g}])=>({...A,type:b,taps:g})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ne extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=n.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((o,r)=>{const h=((o==null?void 0:o.angle)??0)+r.deltaPointersAngle;return{...o,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=s.pipe(e.filter(o=>o.type==="move"),e.map(o=>({...o,type:"rotateMove"}))),l=s.pipe(e.filter(o=>o.type==="end"),e.map(o=>({...o,type:"rotateEnd"})));return e.merge(n,a,l)}),e.share())}update(t){super.update(t,t.options)}}const z=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((n,s)=>{const l=((n==null?void 0:n.pointers.length)??0)!==s.pointers.length,o=(n==null?void 0:n.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:n&&"initialPointersAverageDistance"in n?n.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,d=s.pointersAverageDistance-r,$=s.pointersAverageDistance-r,f=l||o===0?1:s.pointersAverageDistance/o;return{...n,...s,type:i,initialPointersAverageDistance:r,scale:h,distance:d,deltaDistance:$,deltaDistanceScale:f}},p),e.map(({initialPointersAverageDistance:n,...s})=>s));class ie extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");c(this,"end$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.switchMap(o=>e.of(o).pipe(z({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),s=this.failWithActive$.pipe(e.filter(o=>o),e.first()),a=n.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),z({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=n.pipe(e.switchMap(o=>{let r=o;return this.pan$.pipe(e.switchMap(h=>h.type==="end"?e.of(h):(r=h,e.NEVER)),e.takeUntil(s),e.defaultIfEmpty(null),e.map(h=>h||r),z({type:"pinchEnd",initialEvent:r}),e.share())}));return e.merge(n,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(n=>n.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(n=>n.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((n,s)=>({fingers:Math.max(n.fingers,s.fingers)})))),this.update(p)}update({disableTextSelection:p,...t}){t.container&&(t.container.style.touchAction="none",p&&(t.container.style.userSelect="none"));for(const n of this.options.recognizers)n.update(t)}}u.PanRecognizer=Q,u.PinchRecognizer=ie,u.Recognizable=pe,u.Recognizer=D,u.RotateRecognizer=ne,u.SwipeRecognizer=x,u.TapRecognizer=te,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
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
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { type Observable, filter } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\ttype Observable,\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { type Observable, filter } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { type Observable, map, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: new Date().getTime(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\ttype Observable,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { type Observable, filter } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\nimport { isRecognizedAsSwipe } from \"./operators\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmergeMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\ttype Observable,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\ttype Observable,\n\tfilter,\n\tmap,\n\tmerge,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\tmap((event) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap(() =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tscan<\n\t\t\t\t\t\t\t\tRecognizerPanEvent,\n\t\t\t\t\t\t\t\tRecognizerPanEvent & { angle: number; deltaAngle: number },\n\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t>((acc, current) => {\n\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { type Observable, map, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: !!acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tNEVER,\n\ttype Observable,\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent;\n\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\tswitchMap((event) => {\n\t\t\t\t\t\t\t\tif (event.type === \"end\") {\n\t\t\t\t\t\t\t\t\treturn of(event);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\n\t\t\t\t\t\t\t\treturn NEVER;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEventOrNull) =>\n\t\t\t\t\t\t\t\tendEventOrNull ? endEventOrNull : latestEvent,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchEnd\",\n\t\t\t\t\t\t\t\tinitialEvent: latestEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\ttype Observable,\n\ttype ObservedValueOf,\n\tcombineLatest,\n\tmap,\n\tmerge,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<ObservedValueOf<T[number][\"events$\"]>>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) => recognizer.events$),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<RecognizableOptions<T>>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialPoint","index","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
|
|
1
|
+
{"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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"}
|