gesturx 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +81 -82
- 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.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var se = Object.defineProperty;
|
|
2
2
|
var pe = (t, n, e) => n in t ? se(t, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[n] = e;
|
|
3
3
|
var $ = (t, n, e) => pe(t, typeof n != "symbol" ? n + "" : n, e);
|
|
4
|
-
import { filter as h, fromEvent as I, mergeMap as S, defer as oe, of as T, merge as
|
|
4
|
+
import { filter as h, fromEvent as I, mergeMap as S, defer as oe, of as T, merge as y, takeWhile as V, scan as U, map as c, BehaviorSubject as q, switchMap as g, distinctUntilChanged as re, startWith as H, shareReplay as M, combineLatest as W, exhaustMap as J, first as F, share as P, timer as K, withLatestFrom as L, takeUntil as b, skip as ae, tap as Q, ignoreElements as le, buffer as he, debounceTime as ce, pairwise as $e } from "rxjs";
|
|
5
5
|
function ue(t, n) {
|
|
6
6
|
return Math.sqrt(
|
|
7
7
|
Math.pow(n.x - t.x, 2) + Math.pow(n.y - t.y, 2)
|
|
@@ -91,9 +91,9 @@ const ee = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.t
|
|
|
91
91
|
return n.pipe(
|
|
92
92
|
S((r) => {
|
|
93
93
|
const l = oe(() => T(r));
|
|
94
|
-
return
|
|
94
|
+
return y(
|
|
95
95
|
l,
|
|
96
|
-
|
|
96
|
+
y(
|
|
97
97
|
p,
|
|
98
98
|
s,
|
|
99
99
|
i,
|
|
@@ -198,7 +198,7 @@ const ee = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.t
|
|
|
198
198
|
t,
|
|
199
199
|
"pointercancel"
|
|
200
200
|
).pipe(c(n));
|
|
201
|
-
return
|
|
201
|
+
return y(
|
|
202
202
|
e,
|
|
203
203
|
a,
|
|
204
204
|
p,
|
|
@@ -229,7 +229,7 @@ class z {
|
|
|
229
229
|
fingers: 0
|
|
230
230
|
});
|
|
231
231
|
this.pointerEvent$ = this.config$.pipe(
|
|
232
|
-
|
|
232
|
+
g(
|
|
233
233
|
({ container: p, afterEventReceived: a }) => Pe({
|
|
234
234
|
container: p,
|
|
235
235
|
afterEventReceived: a
|
|
@@ -249,10 +249,10 @@ class z {
|
|
|
249
249
|
re()
|
|
250
250
|
);
|
|
251
251
|
this.failWithActive$ = s.pipe(
|
|
252
|
-
|
|
252
|
+
g((p) => {
|
|
253
253
|
const a = p == null ? void 0 : p.map((o) => {
|
|
254
254
|
const r = o.start$.pipe(c(() => !0)), l = o.end$.pipe(c(() => !1));
|
|
255
|
-
return
|
|
255
|
+
return y(r, l).pipe(
|
|
256
256
|
H(!1),
|
|
257
257
|
M(1)
|
|
258
258
|
);
|
|
@@ -263,7 +263,7 @@ class z {
|
|
|
263
263
|
M(1)
|
|
264
264
|
), this.pan$ = this.configSubject.pipe(
|
|
265
265
|
G,
|
|
266
|
-
|
|
266
|
+
g((p) => {
|
|
267
267
|
var d, E, A;
|
|
268
268
|
const a = Math.max(1, ((d = p.panConfig) == null ? void 0 : d.numInputs) ?? 1), o = Math.max(0, ((E = p.panConfig) == null ? void 0 : E.posThreshold) ?? 0), r = Math.max(0, ((A = p.panConfig) == null ? void 0 : A.delay) ?? 0), l = this.pointerDown$.pipe(
|
|
269
269
|
te({
|
|
@@ -282,17 +282,17 @@ class z {
|
|
|
282
282
|
const D = l.pipe(
|
|
283
283
|
f,
|
|
284
284
|
F(),
|
|
285
|
-
|
|
286
|
-
), Y = K(r), C =
|
|
287
|
-
...m.map((
|
|
285
|
+
P()
|
|
286
|
+
), Y = K(r), C = y(
|
|
287
|
+
...m.map((v) => T(v)),
|
|
288
288
|
this.pointerDown$
|
|
289
289
|
).pipe(
|
|
290
290
|
S(
|
|
291
|
-
(
|
|
292
|
-
X(
|
|
291
|
+
(v) => y(this.pointerMove$, T(v)).pipe(
|
|
292
|
+
X(v),
|
|
293
293
|
h(
|
|
294
294
|
(x) => Z(
|
|
295
|
-
|
|
295
|
+
v,
|
|
296
296
|
x,
|
|
297
297
|
o
|
|
298
298
|
)
|
|
@@ -301,11 +301,11 @@ class z {
|
|
|
301
301
|
),
|
|
302
302
|
F()
|
|
303
303
|
).pipe(
|
|
304
|
-
|
|
304
|
+
g(() => Y),
|
|
305
305
|
L(l),
|
|
306
|
-
c(([, { event:
|
|
306
|
+
c(([, { event: v, pointers: x }]) => ({
|
|
307
307
|
type: "start",
|
|
308
|
-
event:
|
|
308
|
+
event: v,
|
|
309
309
|
latestActivePointers: x
|
|
310
310
|
})),
|
|
311
311
|
M({
|
|
@@ -317,32 +317,32 @@ class z {
|
|
|
317
317
|
S(
|
|
318
318
|
() => l.pipe(
|
|
319
319
|
ae(1),
|
|
320
|
-
c(({ event:
|
|
320
|
+
c(({ event: v, pointers: x }) => ({
|
|
321
321
|
type: "move",
|
|
322
|
-
event:
|
|
322
|
+
event: v,
|
|
323
323
|
latestActivePointers: x
|
|
324
324
|
}))
|
|
325
325
|
)
|
|
326
326
|
),
|
|
327
327
|
b(D)
|
|
328
|
-
),
|
|
328
|
+
), w = C.pipe(
|
|
329
329
|
S(
|
|
330
330
|
() => D.pipe(
|
|
331
|
-
c(({ event:
|
|
331
|
+
c(({ event: v, pointers: x }) => ({
|
|
332
332
|
type: "end",
|
|
333
|
-
event:
|
|
333
|
+
event: v,
|
|
334
334
|
latestActivePointers: x
|
|
335
335
|
}))
|
|
336
336
|
)
|
|
337
337
|
)
|
|
338
|
-
), O =
|
|
338
|
+
), O = y(C, k, w).pipe(
|
|
339
339
|
M(1)
|
|
340
340
|
);
|
|
341
341
|
return O.pipe(
|
|
342
342
|
ne,
|
|
343
343
|
L(O),
|
|
344
|
-
c(([
|
|
345
|
-
...
|
|
344
|
+
c(([v, { type: x }]) => ({
|
|
345
|
+
...v,
|
|
346
346
|
type: x
|
|
347
347
|
}))
|
|
348
348
|
);
|
|
@@ -354,7 +354,7 @@ class z {
|
|
|
354
354
|
fingers: p.pointers.length
|
|
355
355
|
});
|
|
356
356
|
}),
|
|
357
|
-
|
|
357
|
+
P()
|
|
358
358
|
), this.panStart$ = this.pan$.pipe(
|
|
359
359
|
h((p) => p.type === "start"),
|
|
360
360
|
c(({ type: p, ...a }) => a)
|
|
@@ -402,41 +402,40 @@ class Ie extends z {
|
|
|
402
402
|
L(this.failWithActive$),
|
|
403
403
|
h(([, o]) => !o),
|
|
404
404
|
c(([o]) => o),
|
|
405
|
-
|
|
405
|
+
P()
|
|
406
406
|
), s = this.panEnd$.pipe(
|
|
407
407
|
c((o) => ({
|
|
408
408
|
type: "panEnd",
|
|
409
409
|
...o
|
|
410
410
|
})),
|
|
411
|
-
|
|
411
|
+
P()
|
|
412
412
|
), p = this.panMove$.pipe(
|
|
413
413
|
c((o) => ({
|
|
414
414
|
type: "panMove",
|
|
415
415
|
...o
|
|
416
416
|
}))
|
|
417
417
|
);
|
|
418
|
-
this.events$ =
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
)
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
)
|
|
418
|
+
this.events$ = i.pipe(
|
|
419
|
+
g((o) => {
|
|
420
|
+
let r = o;
|
|
421
|
+
const l = this.failWithActive$.pipe(
|
|
422
|
+
h((d) => d),
|
|
423
|
+
F()
|
|
424
|
+
), u = y(T(o), p, s).pipe(
|
|
425
|
+
Q((d) => {
|
|
426
|
+
r = d;
|
|
427
|
+
}),
|
|
428
|
+
b(l)
|
|
429
|
+
), f = l.pipe(
|
|
430
|
+
c(() => ({
|
|
431
|
+
...r,
|
|
432
|
+
type: "panEnd"
|
|
433
|
+
})),
|
|
434
|
+
b(s)
|
|
435
|
+
);
|
|
436
|
+
return y(u, f);
|
|
437
|
+
}),
|
|
438
|
+
P()
|
|
440
439
|
), this.start$ = this.events$.pipe(
|
|
441
440
|
h((o) => o.type === "panStart")
|
|
442
441
|
), this.end$ = this.events$.pipe(h((o) => o.type === "panEnd"));
|
|
@@ -456,10 +455,10 @@ class Se extends z {
|
|
|
456
455
|
});
|
|
457
456
|
$(this, "events$");
|
|
458
457
|
this.events$ = this.config$.pipe(
|
|
459
|
-
|
|
458
|
+
g((i) => {
|
|
460
459
|
const { escapeVelocity: s = 0.9 } = i.options ?? {};
|
|
461
460
|
return this.panStart$.pipe(
|
|
462
|
-
|
|
461
|
+
g((p) => this.panEnd$.pipe(
|
|
463
462
|
we(s),
|
|
464
463
|
c((a) => ({
|
|
465
464
|
type: "swipe",
|
|
@@ -470,7 +469,7 @@ class Se extends z {
|
|
|
470
469
|
...a
|
|
471
470
|
}))
|
|
472
471
|
)),
|
|
473
|
-
|
|
472
|
+
P()
|
|
474
473
|
);
|
|
475
474
|
})
|
|
476
475
|
);
|
|
@@ -510,7 +509,7 @@ class be extends z {
|
|
|
510
509
|
super(e);
|
|
511
510
|
$(this, "events$");
|
|
512
511
|
this.events$ = this.config$.pipe(
|
|
513
|
-
|
|
512
|
+
g((i) => {
|
|
514
513
|
var d, E;
|
|
515
514
|
const s = ((d = i.options) == null ? void 0 : d.maxTaps) ?? 1, p = ((E = i.options) == null ? void 0 : E.multiTapThreshold) ?? 100 * (s - 1), { maximumPressTime: a = 150, tolerance: o = 10 } = i.options ?? {}, r = this.pointerDown$.pipe(
|
|
516
515
|
te({
|
|
@@ -524,12 +523,12 @@ class be extends z {
|
|
|
524
523
|
he(this.pointerUp$.pipe(ce(p))),
|
|
525
524
|
F()
|
|
526
525
|
);
|
|
527
|
-
return
|
|
526
|
+
return y(
|
|
528
527
|
this.pointerDown$,
|
|
529
528
|
r.pipe(le())
|
|
530
529
|
).pipe(
|
|
531
530
|
J((A) => {
|
|
532
|
-
const m =
|
|
531
|
+
const m = y(
|
|
533
532
|
T(A),
|
|
534
533
|
this.pointerDown$
|
|
535
534
|
).pipe(M(1)), D = m.pipe(u), Y = m.pipe(
|
|
@@ -543,37 +542,37 @@ class be extends z {
|
|
|
543
542
|
pointerEvent$: this.pointerEvent$,
|
|
544
543
|
timeout: a
|
|
545
544
|
})
|
|
546
|
-
), C =
|
|
547
|
-
this.failWithActive$.pipe(h((
|
|
545
|
+
), C = y(
|
|
546
|
+
this.failWithActive$.pipe(h((w) => w)),
|
|
548
547
|
this.pointerCancel$,
|
|
549
548
|
l,
|
|
550
549
|
Y,
|
|
551
550
|
B
|
|
552
551
|
), k = D.pipe(
|
|
553
552
|
fe,
|
|
554
|
-
h((
|
|
555
|
-
c((
|
|
553
|
+
h((w) => w.length <= s),
|
|
554
|
+
c((w) => ({
|
|
556
555
|
type: "tap",
|
|
557
|
-
taps:
|
|
558
|
-
latestActivePointers:
|
|
559
|
-
event:
|
|
556
|
+
taps: w.length,
|
|
557
|
+
latestActivePointers: w,
|
|
558
|
+
event: w[0]
|
|
560
559
|
})),
|
|
561
560
|
M(1)
|
|
562
561
|
);
|
|
563
562
|
return k.pipe(
|
|
564
563
|
ne,
|
|
565
564
|
L(k),
|
|
566
|
-
c(([
|
|
567
|
-
...
|
|
565
|
+
c(([w, { type: O, taps: v }]) => ({
|
|
566
|
+
...w,
|
|
568
567
|
type: O,
|
|
569
|
-
taps:
|
|
568
|
+
taps: v
|
|
570
569
|
})),
|
|
571
570
|
b(C)
|
|
572
571
|
);
|
|
573
572
|
})
|
|
574
573
|
);
|
|
575
574
|
}),
|
|
576
|
-
|
|
575
|
+
P()
|
|
577
576
|
);
|
|
578
577
|
}
|
|
579
578
|
update(e) {
|
|
@@ -589,7 +588,7 @@ class Ce extends z {
|
|
|
589
588
|
});
|
|
590
589
|
$(this, "events$");
|
|
591
590
|
this.events$ = this.config$.pipe(
|
|
592
|
-
|
|
591
|
+
g(() => {
|
|
593
592
|
const i = this.panStart$.pipe(
|
|
594
593
|
c((o) => ({
|
|
595
594
|
...o,
|
|
@@ -599,7 +598,7 @@ class Ce extends z {
|
|
|
599
598
|
})),
|
|
600
599
|
M(1)
|
|
601
600
|
), s = i.pipe(
|
|
602
|
-
|
|
601
|
+
g(
|
|
603
602
|
() => this.pan$.pipe(
|
|
604
603
|
U((o, r) => {
|
|
605
604
|
const l = ((o == null ? void 0 : o.angle) ?? 0) + r.deltaPointersAngle;
|
|
@@ -612,7 +611,7 @@ class Ce extends z {
|
|
|
612
611
|
}, void 0)
|
|
613
612
|
)
|
|
614
613
|
),
|
|
615
|
-
|
|
614
|
+
P()
|
|
616
615
|
), p = s.pipe(
|
|
617
616
|
h((o) => o.type === "move"),
|
|
618
617
|
c((o) => ({ ...o, type: "rotateMove" }))
|
|
@@ -620,9 +619,9 @@ class Ce extends z {
|
|
|
620
619
|
h((o) => o.type === "end"),
|
|
621
620
|
c((o) => ({ ...o, type: "rotateEnd" }))
|
|
622
621
|
);
|
|
623
|
-
return
|
|
622
|
+
return y(i, p, a);
|
|
624
623
|
}),
|
|
625
|
-
|
|
624
|
+
P()
|
|
626
625
|
);
|
|
627
626
|
}
|
|
628
627
|
update(e) {
|
|
@@ -658,7 +657,7 @@ class Re extends z {
|
|
|
658
657
|
$(this, "start$");
|
|
659
658
|
$(this, "end$");
|
|
660
659
|
const i = this.panStart$.pipe(
|
|
661
|
-
|
|
660
|
+
g(
|
|
662
661
|
(s) => T(s).pipe(
|
|
663
662
|
j({
|
|
664
663
|
type: "pinchStart",
|
|
@@ -666,12 +665,12 @@ class Re extends z {
|
|
|
666
665
|
})
|
|
667
666
|
)
|
|
668
667
|
),
|
|
669
|
-
|
|
668
|
+
P()
|
|
670
669
|
);
|
|
671
670
|
this.events$ = this.config$.pipe(
|
|
672
|
-
|
|
671
|
+
g(() => {
|
|
673
672
|
const s = i.pipe(M(1)), p = s.pipe(
|
|
674
|
-
|
|
673
|
+
g((o) => this.pan$.pipe(
|
|
675
674
|
V((r) => r.type !== "end"),
|
|
676
675
|
j({
|
|
677
676
|
type: "pinchMove",
|
|
@@ -679,13 +678,13 @@ class Re extends z {
|
|
|
679
678
|
})
|
|
680
679
|
))
|
|
681
680
|
), a = s.pipe(
|
|
682
|
-
|
|
681
|
+
g(
|
|
683
682
|
(o) => this.pan$.pipe(
|
|
684
683
|
// we cannot have a panEnd without a previous event so it will always emit
|
|
685
684
|
H(o),
|
|
686
685
|
$e(),
|
|
687
686
|
h(([, r]) => r.type === "end"),
|
|
688
|
-
|
|
687
|
+
g(
|
|
689
688
|
([r, l]) => T(l).pipe(
|
|
690
689
|
j({
|
|
691
690
|
type: "pinchEnd",
|
|
@@ -696,9 +695,9 @@ class Re extends z {
|
|
|
696
695
|
)
|
|
697
696
|
)
|
|
698
697
|
);
|
|
699
|
-
return
|
|
698
|
+
return y(s, p, a);
|
|
700
699
|
}),
|
|
701
|
-
|
|
700
|
+
P()
|
|
702
701
|
), this.start$ = this.events$.pipe(
|
|
703
702
|
h((s) => s.type === "pinchStart")
|
|
704
703
|
), this.end$ = this.events$.pipe(h((s) => s.type === "pinchEnd"));
|
|
@@ -712,9 +711,9 @@ class ze {
|
|
|
712
711
|
$(this, "events$");
|
|
713
712
|
$(this, "recognizers");
|
|
714
713
|
$(this, "state$");
|
|
715
|
-
this.options = n, this.recognizers = n.recognizers, this.events$ =
|
|
714
|
+
this.options = n, this.recognizers = n.recognizers, this.events$ = y(
|
|
716
715
|
...n.recognizers.map((e) => e.events$)
|
|
717
|
-
).pipe(
|
|
716
|
+
).pipe(P()), this.state$ = W(
|
|
718
717
|
this.recognizers.map((e) => e.state$)
|
|
719
718
|
).pipe(
|
|
720
719
|
c(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n Observable,\n combineLatest,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n startWith,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown>; end$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n public config$ = this.configSubject.pipe(isValidConfig)\n\n abstract events$: Observable<Event>\n\n /**\n * Track active running failWith recognizers\n */\n protected failWithActive$: Observable<boolean>\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = merge(\n panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(of(panStartEvent), panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const tailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, tailingEndEventIfFailed$)\n }),\n ),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n share(),\n )\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = pinchStart$.pipe(shareReplay(1))\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","failingActive$","isActive","events$","tailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","pairwise","currEvent","previousEvent","Recognizable","states","state"],"mappings":";;;;AAEgB,SAAAA,GAAkBC,GAAeC,GAAuB;AACtE,SAAO,KAAK;AAAA,IACV,KAAK,IAAIA,EAAO,IAAID,EAAO,GAAG,CAAC,IAAI,KAAK,IAAIC,EAAO,IAAID,EAAO,GAAG,CAAC;AAAA,EAAA;AAEtE;AAEO,SAASE,GAAyBC,GAAgC;AACvE,QAAM,IAAIA,EAAc;AACpB,MAAA,IAAI,EAAU,QAAA;AAElB,QAAMC,IAAgBD,EAAc,OAAO,CAACE,GAAKC,GAAQC,MAErDF,IACAF,EAAc,MAAMI,IAAI,CAAC,EAAE,OAAO,CAACC,GAAUC,MACpCD,IAAWT,GAAkBO,GAAQG,CAAM,GACjD,CAAC,GAEL,CAAC,GAGEC,IAAiB,KAAK,IAAI,KAAM;AACtC,SAAON,IAAgBM;AACzB;AAEgB,SAAAC,EACdC,GACAC,GACQ;AAEF,QAAAC,IAASD,EAAS,IAAID,EAAS,GAC/BG,IAASF,EAAS,IAAID,EAAS;AAM9B,SAHgB,KAAK,MAAMG,GAAQD,CAAM;AAIlD;AAEgB,SAAAE,GACdJ,GACAC,GACQ;AAQD,SANgBF,EAAkCC,GAAUC,CAAQ,KAGlC,MAAM,KAAK;AAItD;AAEO,SAASI,EAAkBC,GAAiB;AACjD,QAAMb,IAAMa,EAAO;AAAA,IACjB,CAACC,GAAKC,OACJD,EAAI,KAAKC,EAAM,GACfD,EAAI,KAAKC,EAAM,GAERD;AAAA,IAET,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAAA,GAGTE,IAAYH,EAAO,UAAU;AAE5B,SAAA;AAAA,IACL,GAAGb,EAAI,IAAIgB;AAAA,IACX,GAAGhB,EAAI,IAAIgB;AAAA,EAAA;AAEf;AAEgB,SAAAC,GACdC,GACAC,GACA;AACI,MAAAD,EAAc,WAAWC,EAAU;AAC/B,UAAA,IAAI,MAAM,0DAA0D;AAGtE,QAAAC,IAAkBR,EAAkBM,CAAa,GACjDG,IAAcT,EAAkBO,CAAS;AAE/C,MAAIG,IAAkB;AAEtB,WAASpB,IAAI,GAAGA,IAAIgB,EAAc,QAAQhB,KAAK;AAC7C,UAAMqB,IAAejB;AAAA,MACnBc;AAAA,MACAF,EAAchB,CAAC;AAAA,IAAA;AAOjB,QAAIsB,IALalB;AAAA,MACfe;AAAA,MACAF,EAAUjB,CAAC;AAAA,IAAA,IAGeqB;AAGxB,IAAAC,IAAa,KAAK,KACpBA,KAAc,IAAI,KAAK,KACdA,IAAa,CAAC,KAAK,OAC5BA,KAAc,IAAI,KAAK,KAGNF,KAAAE;AAAA,EACrB;AAGM,QAAAC,IAAcH,IAAkBJ,EAAc,QAC9CQ,IAAeD,KAAe,MAAM,KAAK;AAExC,SAAA,EAAE,aAAAA,GAAa,cAAAC;AACxB;AC/GO,SAASC,GACdC,GAC+C;AACxC,SAAAA,KAAQ;AACjB;AAEO,MAAMC,KAAoB,CAAIC,MACnCA,EAAO,SAAS,GAELC,KAAiB,CAC5BC,MAC4BA,EAAO,KAAKC,EAAOJ,EAAiB,CAAC;AAEnD,SAAAK,EACdC,GACAC,GACAC,GACA;AACA,QAAMC,IAAQ1B,EAAkB,CAACuB,CAAU,CAAC,GACtCI,IAAM3B,EAAkB,CAACwB,CAAQ,CAAC;AAGxC,SACE,KAAK,IAAIG,EAAI,IAAID,EAAM,CAAC,KAAKD,KAC7B,KAAK,IAAIE,EAAI,IAAID,EAAM,CAAC,KAAKD;AAEjC;AAMO,MAAMG,KAAoB,CAC/BC,GACAhC,GACAC,MACG;AACH,QAAMgC,IAAYD,IAAQ,IAAIhC,IAASgC,IAAQ,GACzCE,IAAYF,IAAQ,IAAI/B,IAAS+B,IAAQ;AAExC,SAAA;AAAA,IACL,WAAAC;AAAA,IACA,WAAAC;AAAA,EAAA;AAEJ;ACjCO,SAASC,EAAaC,GAAuB;AAC3C,SAAA,CAACb,MACNA,EAAO;AAAA,IACLC,EAAO,CAACa,MAAeA,EAAW,cAAcD,EAAQ,SAAS;AAAA,EAAA;AAEvE;AAEa,MAAAE,KAAoB,CAACC,MAChCA,EAAa,SAAS,kBACtBA,EAAa,SAAS,mBACtBA,EAAa,SAAS,aAEXC,KAAkB,CAAC;AAAA,EAC9B,WAAAC;AAAA,EACA,oBAAAC,IAAqB,CAACC,MAAUA;AAClC,MAIEC,EAAwBH,GAAW,aAAa,EAAE;AAAA,EAChDI,EAAIH,CAAkB;AACxB,GAKWI,KACX,CAAC;AAAA,EACC,eAAAC;AACF,MASA,CAACxB,MAAqC;AAMpC,QAAMyB,IAAaD,EAAc;AAAA,IAC/BvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,WAAW;AAAA,EAAA,GAExCM,IAAgBF,EAAc;AAAA,IAClCvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,cAAc;AAAA,EAAA,GAE3CO,IAAiBH,EAAc;AAAA,IACnCvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,eAAe;AAAA,EAAA,GAE5CQ,IAAeJ,EAAc;AAAA,IACjCvB,EAAO,CAACmB,MAAUA,EAAM,SAAS,aAAa;AAAA,EAAA,GAE1CS,IAAeR,EAAwB,QAAQ,aAAa,GAE5DS,IAAmB,CAACV,MACxB,CAAC,iBAAiB,gBAAgB,aAAa,aAAa,EAAE;AAAA,IAC5DA,EAAM;AAAA,EAAA;AAGV,SAAOpB,EAAO;AAAA,IACZ+B,EAAS,CAACC,MAAgB;AACxB,YAAMC,IAAeC,GAAM,MAAMC,EAAGH,CAAW,CAAC;AAgBzC,aAdWI;AAAA,QAChBH;AAAA,QACAG;AAAA,UACER;AAAA,UACAD;AAAA,UACAD;AAAA,UACAD;AAAA,UACAI;AAAA,QACF;AAAA,MAAA,EACA;AAAA,QACAjB,EAAaoB,CAAW;AAAA,QACxBK,EAAU,CAACjB,MAAU,CAACU,EAAiBV,CAAK,GAAG,EAAI;AAAA,MAAA;AAAA,IAG9C,CACR;AAAA,IACDkB,EAA6C,CAACxD,GAAKsC,MAAU;AACvD,UAAAU,EAAiBV,CAAK,GAAG;AACrB,cAAA,EAAE,CAACA,EAAM,SAAS,GAAGmB,GAAU,GAAGC,OAAS1D,KAAA,gBAAAA,EAAK,aAAY;AAI3D,eAAA;AAAA,UACL,OAAAsC;AAAA,UACA,UAAUoB;AAAA,QAAA;AAAA,MAEd;AAEO,aAAA;AAAA,QACL,OAAApB;AAAA,QACA,UAAU;AAAA,UACR,IAAItC,KAAA,gBAAAA,EAAK,aAAY,CAAC;AAAA,UACtB,CAACsC,EAAM,SAAS,GAAGA;AAAA,QACrB;AAAA,MAAA;AAAA,OAED,MAAS;AAAA,IACZE,EAAI,CAAC,EAAE,OAAAF,GAAO,UAAAqB,SAAgB;AAAA,MAC5B,OAAArB;AAAA,MACA,UAAU,OAAO,OAAOqB,CAAQ,EAAE,OAAO9C,EAAS;AAAA,IAAA,EAClD;AAAA,EAAA;AAEN,GCpGI+C,IAAoB,CACxBC,GACAC,GACAC,GACAC,MACG;AACH,QAAMrE,IAASkE,EAAU,IAAIC,EAAW,IAAIC,GACtCnE,IAASiE,EAAU,IAAIC,EAAW,IAAIE;AAErC,SAAA;AAAA,IACL,QAAArE;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ,GAEaqE,KAAwB,CACnC/C,MACgC;AAC1B,QAAAgD,IAAoB,CAACC,MACzBrE;AAAA,IACGqE,EAAK,qBAAqB,SAEvBA,EAAK,uBADL,CAACA,EAAK,KAAK;AAAA,EACN;AAGb,SAAOjD,EAAO;AAAA,IACZsC,EAAyC,CAACxD,GAAKoE,MAAS;;AAChD,YAAAP,IAAYK,EAAkBE,CAAI,GAClCN,KAAa9D,KAAA,gBAAAA,EAAK,WAAU6D,GAC5BE,KAAa/D,KAAA,gBAAAA,EAAK,WAAU,GAC5BgE,KAAahE,KAAA,gBAAAA,EAAK,WAAU,GAC5BqE,MAA2BC,IAAAtE,KAAA,gBAAAA,EAAK,yBAAL,gBAAAsE,EAA2B,WAAU,GAChEC,MAA2BC,IAAAJ,EAAK,yBAAL,gBAAAI,EAA2B,WAAU,GAEhEC,IACJ,CAAC,eAAe,iBAAiB,gBAAgB,WAAW,EAAE;AAAA,QAC5DL,EAAK,MAAM;AAAA,MAAA,KACRC,MAA6BE,GAE9BG,IAAsBH,IAA2B,GAEjD,EAAE,QAAA5E,GAAQ,QAAAC,EACd,IAAA6E,KAA4BC,IACxBd,EAAkBC,GAAWA,GAAWE,GAAYC,CAAU,IAC9DJ,EAAkBC,GAAWC,GAAYC,GAAYC,CAAU,GAE/D,EAAE,cAAcW,EAAmB,IACvCN,MAA6BE,KAC7BF,KAA4B,KAC5BE,KAA4B,IACxBpE;AAAA,SACEH,KAAA,gBAAAA,EAAK,yBAAwB,CAAC;AAAA,QAC9BoE,EAAK,wBAAwB,CAAC;AAAA,MAAA,IAEhC,EAAE,cAAc;AAEf,aAAA;AAAA,QACL,YAAW,oBAAI,KAAK,GAAE,QAAQ;AAAA,QAC9B,GAAGpE;AAAA,QACH,GAAGoE;AAAA,QACH,QAAQP;AAAA,QACR,QAAAlE;AAAA,QACA,QAAAC;AAAA,QACA,oBAAA+E;AAAA,MAAA;AAAA,OAED,MAAS;AAAA,IACZnC,EAAI,CAAC2B,MAAS;AACN,YAAA;AAAA,QACJ,QAAAxE;AAAA,QACA,QAAAC;AAAA,QACA,sBAAAgF;AAAA,QACA,WAAAC;AAAA,QACA,QAAAC;AAAA,QACA,OAAAxC;AAAA,QACA,oBAAAqC;AAAA,MACE,IAAAR,GACEnD,IAAS4D,KAAwB,IAIjCjD,IADM,KAAK,QACGkD,GAEd,EAAE,WAAAjD,GAAW,WAAAC,MAAcH,GAAkBC,GAAOhC,GAAQC,CAAM,GAClEmF,IACJhG,GAAyB6F,CAAoB;AAExC,aAAA;AAAA,QACL,QAAAjF;AAAA,QACA,QAAAC;AAAA,QACA,WAAAgC;AAAA,QACA,WAAAC;AAAA,QACA,OAAAF;AAAA,QACA,QAAAmD;AAAA,QACA,UAAU9D;AAAA,QACV,WAAA6D;AAAA,QACA,OAAAvC;AAAA,QACA,oBAAAqC;AAAA,QACA,yBAAAI;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EAAA;AAEL,GCxHaC,IAAgB,CAC3B9D,MAEAA,EAAO;AAAA,EACLC;AAAA,IACE,CAAC8D,MAAqD,CAAC,CAACA,EAAO;AAAA,EACjE;AACF,GAEWC,KAAmB,CAAChE,MAC/BA,EAAO,KAAKC,EAAOc,EAAiB,CAAC,GCV1BkD,KAAmB,CAAC;AAAA,EAC/B,WAAA/C;AAAA,EACA,oBAAAC,IAAqB,CAACC,MAAUA;AAClC,MAGM;AACJ,QAAMa,IAAehB,GAAgB,EAAE,oBAAAE,GAAoB,WAAAD,EAAW,CAAA,GAChEO,IAAaJ,EAAwBH,GAAW,WAAW,EAAE;AAAA,IACjEI,EAAIH,CAAkB;AAAA,EAAA,GAElBS,IAAeP,EAAwBH,GAAW,aAAa,EAAE;AAAA,IACrEI,EAAIH,CAAkB;AAAA,EAAA,GAKlBO,IAAgBL,EAAwBH,GAAW,cAAc,EAAE;AAAA,IACvEI,EAAIH,CAAkB;AAAA,EAAA,GAMlBQ,IAAiBN;AAAA,IACrBH;AAAA,IACA;AAAA,EACA,EAAA,KAAKI,EAAIH,CAAkB,CAAC;AAEvB,SAAAiB;AAAA,IACLH;AAAA,IACAN;AAAA,IACAD;AAAA,IACAD;AAAA,IACAG;AAAA,EAAA;AAEJ;ACgBO,MAAesC,EAGpB;AAAA,EA4BA,YAAYH,GAAoCI,GAAuB;AA3B7D,IAAAC,EAAA,uBAAgB,IAAIC,EAI5B,CAAA,CAAE;AACM,IAAAD,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEH,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAAU,KAAK,cAAc,KAAKN,CAAa;AAO5C;AAAA;AAAA;AAAA,IAAAM,EAAA;AAGF,UAAAE,IAAe,IAAID,EAAuB;AAAA,MAC9C,SAAS;AAAA,IAAA,CACV;AAEI,SAAA,gBAAgB,KAAK,QAAQ;AAAA,MAChCE;AAAA,QAAU,CAAC,EAAE,WAAArD,GAAW,oBAAAC,QACtB8C,GAAiB;AAAA,UACf,WAAA/C;AAAA,UACA,oBAAAC;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA,GAGG,KAAA,eAAe,KAAK,cAAc;AAAA,MACrClB,EAAO,CAACmB,MAAUA,EAAM,SAAS,aAAa;AAAA,IAAA,GAG3C,KAAA,aAAa,KAAK,cAAc;AAAA,MACnCnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,WAAW;AAAA,IAAA,GAGzC,KAAA,eAAe,KAAK,cAAc;AAAA,MACrCnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,aAAa;AAAA,IAAA,GAG3C,KAAA,iBAAiB,KAAK,cAAc;AAAA,MACvCnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,eAAe;AAAA,IAAA,GAGlD,KAAK,cAAc,KAAK,cAAc,KAAK4C,EAAgB;AAErD,UAAAQ,IAAY,KAAK,QAAQ;AAAA,MAC7BlD,EAAI,CAAC,EAAE,UAAAmD,QAAeA,CAAQ;AAAA,MAC9BC,GAAqB;AAAA,IAAA;AAGvB,SAAK,kBAAkBF,EAAU;AAAA,MAC/BD,EAAU,CAACE,MAAa;AACtB,cAAME,IAAeF,KAAA,gBAAAA,EAAU,IAAI,CAACG,MAAe;AACjD,gBAAMC,IAASD,EAAW,OAAO,KAAKtD,EAAI,MAAM,EAAI,CAAC,GAE/CwD,IAAOF,EAAW,KAAK,KAAKtD,EAAI,MAAM,EAAK,CAAC;AAO3C,iBALYc,EAAMyC,GAAQC,CAAI,EAAE;AAAA,YACrCC,EAAU,EAAK;AAAA,YACfC,EAAY,CAAC;AAAA,UAAA;AAAA,QAGR;AAGL,eAACL,KAAA,QAAAA,EAAc,SAIZM,EAAcN,CAAY,IAHxBM,EAAc,CAAC9C,EAAG,EAAK,CAAC,CAAC;AAAA,MAGD,CAClC;AAAA,MACDb,EAAI,CAAC4D,MAAaA,EAAS,KAAK,CAACC,MAAYA,CAAO,CAAC;AAAA,MACrDH,EAAY,CAAC;AAAA,IAAA,GAGV,KAAA,OAAO,KAAK,cAAc;AAAA,MAC7BlB;AAAA,MACAS,EAAU,CAACR,MAAW;;AACpB,cAAMqB,IAAY,KAAK,IAAI,KAAGrB,IAAAA,EAAO,cAAPA,gBAAAA,EAAkB,cAAa,CAAC,GACxD1D,IAAe,KAAK,IAAI,KAAG0D,IAAAA,EAAO,cAAPA,gBAAAA,EAAkB,iBAAgB,CAAC,GAC9DtD,IAAQ,KAAK,IAAI,KAAGsD,IAAAA,EAAO,cAAPA,gBAAAA,EAAkB,UAAS,CAAC,GAEhDsB,IAAiB,KAAK,aAAa;AAAA,UACvC9D,GAAc;AAAA,YACZ,eAAe,KAAK;AAAA,YACpB,WAAW;AAAA,UAAA,CACZ;AAAA,UACDyD,EAAY,CAAC;AAAA,QAAA,GAGTM,IAAmB,CACvBtF,MAEAA,EAAO;AAAA,UACLC;AAAA,YACE,CACEH,MAEAA,EAAO,SAAS,UAAUsF;AAAA,UAC9B;AAAA,QAAA,GAGEG,IAAsB,CAC1BvF,MAIGA,EAAO,KAAKC,EAAO,CAACH,MAAWA,EAAO,SAAS,SAASsF,CAAS,CAAC;AAEvE,eAAOC,EAAe;AAAA,UACpBC;AAAA,UACAE,EAAW,CAAC,EAAE,UAAUC,QAA2B;AACjD,kBAAMC,IAAeL,EAAe;AAAA,cAClCE;AAAA,cACAI,EAAM;AAAA,cACNC,EAAM;AAAA,YAAA,GAGFC,IAASC,EAAMrF,CAAK,GAqBpBsF,IAnB+B3D;AAAA,cACnC,GAAGqD,EAAqB,IAAI,CAACzE,MAAiBmB,EAAGnB,CAAY,CAAC;AAAA,cAC9D,KAAK;AAAA,YAAA,EACL;AAAA,cACAe;AAAA,gBAAS,CAACC,MACRI,EAAM,KAAK,cAAcD,EAAGH,CAAW,CAAC,EAAE;AAAA,kBACxCpB,EAAaoB,CAAW;AAAA,kBACxB/B;AAAA,oBAAO,CAACe,MACNd;AAAA,sBACE8B;AAAA,sBACAhB;AAAA,sBACAX;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACAsF,EAAM;AAAA,YAAA,EAGuC;AAAA,cAC7CpB,EAAU,MAAMsB,CAAM;AAAA,cACtBG,EAAeX,CAAc;AAAA,cAC7B/D,EAAI,CAAC,CAAG,EAAA,EAAE,OAAAF,GAAO,UAAAqB,EAAU,CAAA,OAAO;AAAA,gBAChC,MAAM;AAAA,gBACN,OAAArB;AAAA,gBACA,sBAAsBqB;AAAA,cAAA,EACtB;AAAA,cACFuC,EAAY;AAAA,gBACV,YAAY;AAAA,gBACZ,UAAU;AAAA,cAAA,CACX;AAAA,cACDiB,EAAUP,CAAY;AAAA,YAAA,GAGlBQ,IAAaH,EAAU;AAAA,cAC3BhE;AAAA,gBAAS,MACPsD,EAAe;AAAA,kBACbc,GAAK,CAAC;AAAA,kBACN7E,EAAI,CAAC,EAAE,OAAAF,GAAO,UAAAqB,SAAgB;AAAA,oBAC5B,MAAM;AAAA,oBACN,OAAArB;AAAA,oBACA,sBAAsBqB;AAAA,kBAAA,EACtB;AAAA,gBACJ;AAAA,cACF;AAAA,cACAwD,EAAUP,CAAY;AAAA,YAAA,GAGlBU,IAAUL,EAAU;AAAA,cACxBhE;AAAA,gBAAS,MACP2D,EAAa;AAAA,kBACXpE,EAAI,CAAC,EAAE,OAAAF,GAAO,UAAAqB,SAAgB;AAAA,oBAC5B,MAAM;AAAA,oBACN,OAAArB;AAAA,oBACA,sBAAsBqB;AAAA,kBAAA,EACtB;AAAA,gBACJ;AAAA,cACF;AAAA,YAAA,GAGI4D,IAAYjE,EAAM2D,GAAWG,GAAYE,CAAO,EAAE;AAAA,cACtDpB,EAAY,CAAC;AAAA,YAAA;AAGf,mBAAOqB,EAAU;AAAA,cACftD;AAAA,cACAiD,EAAeK,CAAS;AAAA,cACxB/E,EAAI,CAAC,CAACgF,GAAiB,EAAE,MAAAC,EAAM,CAAA,OAAO;AAAA,gBACpC,GAAGD;AAAA,gBACH,MAAAC;AAAA,cAAA,EACA;AAAA,YAAA;AAAA,UACJ,CACD;AAAA,QAAA;AAAA,MACH,CACD;AAAA,MACDC,EAAI,CAACpF,MAAU;AACb,QAAAkD,EAAa,KAAK;AAAA,UAChB,SAASlD,EAAM,SAAS;AAAA,QAAA,CACzB;AAAA,MAAA,CACF;AAAA,MACDwE,EAAM;AAAA,IAAA,GAGH,KAAA,YAAY,KAAK,KAAK;AAAA,MACzB3F,EAAO,CAACmB,MAAUA,EAAM,SAAS,OAAO;AAAA,MACxCE,EAAI,CAAC,EAAE,MAAAiF,GAAM,GAAG/D,EAAA,MAAWA,CAAI;AAAA,IAAA,GAG5B,KAAA,WAAW,KAAK,KAAK;AAAA,MACxBvC,EAAO,CAACmB,MAAUA,EAAM,SAAS,MAAM;AAAA,MACvCE,EAAI,CAAC,EAAE,MAAAiF,GAAM,GAAG/D,EAAA,MAAWA,CAAI;AAAA,IAAA,GAG5B,KAAA,UAAU,KAAK,KAAK;AAAA,MACvBvC,EAAO,CAACmB,MAAUA,EAAM,SAAS,KAAK;AAAA,MACtCE,EAAI,CAAC,EAAE,MAAAiF,GAAM,GAAG/D,EAAA,MAAWA,CAAI;AAAA,IAAA,GAG5B,KAAA,SAAS8B,EAAa,gBAE3B,KAAK,eAAeP,KAAU,CAAC,GAAGI,CAAS;AAAA,EAC7C;AAAA,EAEQ,eACNJ,GACAI,GACA;AACM,UAAAsC,IAAiB,KAAK,cAAc,SAAS;AAEnD,SAAK,cAAc,KAAK;AAAA,MACtB,GAAGA;AAAA,MACH,GAAG1C;AAAA,MACH,GAAIA,EAAO,WAAW;AAAA,QACpB,SAAS,EAAE,GAAG0C,EAAe,SAAS,GAAG1C,EAAO,QAAQ;AAAA,MAC1D;AAAA,MACA,WAAW;AAAA,QACT,GAAG0C,EAAe;AAAA,QAClB,GAAGtC;AAAA,MACL;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEO,OACLJ,GACAI,GACA;AACK,SAAA,eAAeJ,GAAQI,CAAS;AAAA,EACvC;AACF;AC3SO,MAAMuC,WACHxC,EAEV;AAAA,EAKE,YAAYH,GAAiD;;AAC3D,UAAMA,GAAQ;AAAA,MACZ,GAAGA;AAAA,MACH,gBAAcX,IAAAW,KAAA,gBAAAA,EAAQ,YAAR,gBAAAX,EAAiB,iBAAgB;AAAA,IAAA,CAChD;AARI,IAAAgB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAQC,UAAA2B,IAAY,KAAK,UAAU;AAAA,MAC/BzE,EAAI,CAACF,OAAW;AAAA,QACd,MAAM;AAAA,QACN,GAAGA;AAAA,MAAA,EACH;AAAA,MACF4E,EAAe,KAAK,eAAe;AAAA,MACnC/F,EAAO,CAAC,CAAA,EAAG0G,CAAc,MAAM,CAACA,CAAc;AAAA,MAC9CrF,EAAI,CAAC,CAACF,CAAK,MAAMA,CAAK;AAAA,MACtBwE,EAAM;AAAA,IAAA,GAGFQ,IAAU,KAAK,QAAQ;AAAA,MAC3B9E,EAAI,CAACF,OAAW;AAAA,QACd,MAAM;AAAA,QACN,GAAGA;AAAA,MAAA,EACH;AAAA,MACFwE,EAAM;AAAA,IAAA,GAGFgB,IAAW,KAAK,SAAS;AAAA,MAC7BtF,EAAI,CAACF,OAAW;AAAA,QACd,MAAM;AAAA,QACN,GAAGA;AAAA,MAAA,EACH;AAAA,IAAA;AAGJ,SAAK,UAAUgB;AAAA,MACb2D,EAAU;AAAA,QACRxB,EAAU,CAACsC,MAAkB;AAC3B,cAAIC,IAAwBD;AAEtB,gBAAAE,IAAiB,KAAK,gBAAgB;AAAA,YAC1C9G,EAAO,CAAC+G,MAAaA,CAAQ;AAAA,YAC7BrB,EAAM;AAAA,UAAA,GAGFsB,IAAU7E,EAAMD,EAAG0E,CAAa,GAAGD,GAAUR,CAAO,EAAE;AAAA,YAC1DI,EAAI,CAACpF,MAAU;AACC,cAAA0F,IAAA1F;AAAA,YAAA,CACf;AAAA,YACD6E,EAAUc,CAAc;AAAA,UAAA,GAGpBG,IAA2BH,EAAe;AAAA,YAC9CzF,EAAI,OAAO;AAAA,cACT,GAAGwF;AAAA,cACH,MAAM;AAAA,YAAA,EACN;AAAA,YACFb,EAAUG,CAAO;AAAA,UAAA;AAGZ,iBAAAhE,EAAM6E,GAASC,CAAwB;AAAA,QAAA,CAC/C;AAAA,MACH;AAAA,IAAA,GAGG,KAAA,SAAS,KAAK,QAAQ;AAAA,MACzBjH,EAAO,CAACmB,MAAUA,EAAM,SAAS,UAAU;AAAA,IAAA,GAGxC,KAAA,OAAO,KAAK,QAAQ,KAAKnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,QAAQ,CAAC;AAAA,EAC1E;AAAA,EAEO,OAAO2C,GAAgD;AACtD,UAAA,OAAOA,GAAQA,EAAO,OAAO;AAAA,EACrC;AACF;ACnGO,MAAMoD,KACX,CAACC,MAA2B,CAACpH,MAC3BA,EAAO;AAAA,EACLC,EAAO,CAACmB,MAEJ,KAAK,IAAIA,EAAM,SAAS,KAAKgG,KAC7B,KAAK,IAAIhG,EAAM,SAAS,KAAKgG,CAEhC;AACH;ACAG,MAAMC,WACHnD,EAEV;AAAA,EAGE,YAAYH,GAAmD;AAC7D,UAAMA,GAAQ;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,IAAA,CACZ;AANI,IAAAK,EAAA;AAQA,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BG,EAAU,CAAC+C,MAAoB;AAC7B,cAAM,EAAE,gBAAAF,IAAiB,IAAA,IAAQE,EAAgB,WAAW,CAAA;AAE5D,eAAO,KAAK,UAAU;AAAA,UACpB/C,EAAU,CAACpE,MACF,KAAK,QAAQ;AAAA,YAClBgH,GAAoBC,CAAc;AAAA,YAClC9F,EAAI,CAACF,OACI;AAAA,cACL,MAAM;AAAA,cACN,OAAOzC;AAAA,gBACLwB,EAAW;AAAA,gBACXiB,EAAM;AAAA,cACR;AAAA,cACA,GAAGA;AAAA,YAAA,EAEN;AAAA,UAAA,CAEJ;AAAA,UACDwE,EAAM;AAAA,QAAA;AAAA,MACR,CACD;AAAA,IAAA;AAAA,EAEL;AAAA,EAEO,OAAO7B,GAAkD;AAC9D,UAAM,OAAOA,CAAM;AAAA,EACrB;AACF;AChDO,MAAMwD,KACX,CAAC;AAAA,EACC,SAAAC;AAAA,EACA,eAAAhG;AACF,MAIA,CAACxB,MACCA,EAAO;AAAA,EACL+B;AAAA,IAAS,CAACC,MACR8D,EAAM0B,CAAO,EAAE;AAAA,MACbvB;AAAA,QACEzE,EAAc,KAAKwC,IAAkBpD,EAAaoB,CAAW,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF,GAESyF,KACX,CAAC;AAAA,EACC,qBAAAC;AAAA,EACA,eAAAlG;AAAA,EACA,WAAAmG;AACF,MAKA,CAAC3H,MACCA,EAAO;AAAA,EACL+B;AAAA,IAAS,CAACC,MACRR,EAAc;AAAA,MACZZ,EAAaoB,CAAW;AAAA,MACxBK,EAAU,CAACjB,MAAU,CAACL,GAAkBK,CAAK,GAAG,EAAI;AAAA,MACpDnB;AAAA,QAAO,CAACmB,MACNlB,EAAqBwH,GAAqBtG,GAAOuG,CAAS;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACF;ACfG,MAAMC,WACH1D,EAEV;AAAA,EAGE,YAAY2D,GAAkD;AAC5D,UAAMA,CAAO;AAHR,IAAAzD,EAAA;AAKA,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BG,EAAU,CAACR,MAAW;;AACd,cAAA+D,MAAU1E,IAAAW,EAAO,YAAP,gBAAAX,EAAgB,YAAW,GAKrC2E,MACJzE,IAAAS,EAAO,YAAP,gBAAAT,EAAgB,sBAAqB,OAAOwE,IAAU,IAElD,EAAE,kBAAAE,IAAmB,KAAK,WAAAL,IAAY,OAAO5D,EAAO,WAAW,IAE/DkE,IAAkB,KAAK,aAAa;AAAA,UACxC1G,GAAc;AAAA,YACZ,eAAe,KAAK;AAAA,YACpB,WAAW;AAAA,UAAA,CACZ;AAAA,UACDyD,EAAY,CAAC;AAAA,QAAA,GAGTkD,IAA+BD,EAAgB;AAAA,UACnDhI,EAAO,CAAC,EAAE,UAAAwC,QAAeA,EAAS,SAAS,CAAC;AAAA,QAAA,GAGxC0F,IAAqB,CAACnI,MAC1BA,EAAO;AAAA,UACLoI,GAAO,KAAK,WAAW,KAAKC,GAAaN,CAAiB,CAAC,CAAC;AAAA,UAC5DpC,EAAM;AAAA,QAAA;AAqEH,eAlEMvD;AAAA,UACX,KAAK;AAAA,UACL6F,EAAgB,KAAKK,IAAgB;AAAA,QAAA,EACrC;AAAA,UACA9C,EAAW,CAACkC,MAAwB;AAClC,kBAAMa,IAAgBnG;AAAA,cACpBD,EAAGuF,CAAmB;AAAA,cACtB,KAAK;AAAA,YACL,EAAA,KAAK1C,EAAY,CAAC,CAAC,GAEfwD,IAAwBD,EAAc,KAAKJ,CAAkB,GAK7DM,IAAgCF,EAAc;AAAA,cAClDd,GAAyB;AAAA,gBACvB,qBAAAC;AAAA,gBACA,eAAe,KAAK;AAAA,gBACpB,WAAAC;AAAA,cAAA,CACD;AAAA,YAAA,GAMGe,IAA+BH,EAAc;AAAA,cACjDhB,GAAuB;AAAA,gBACrB,eAAe,KAAK;AAAA,gBACpB,SAASS;AAAA,cAAA,CACV;AAAA,YAAA,GAGGW,IAAavG;AAAA,cACjB,KAAK,gBAAgB,KAAKnC,EAAO,CAAC2I,MAAWA,CAAM,CAAC;AAAA,cACpD,KAAK;AAAA,cACLV;AAAA,cACAO;AAAA,cACAC;AAAA,YAAA,GAGIrC,IAAYmC,EAAsB;AAAA,cACtCzI;AAAA,cACAE,EAAO,CAACH,MAAWA,EAAO,UAAUgI,CAAO;AAAA,cAC3CxG,EAAI,CAACxB,OAAY;AAAA,gBACf,MAAM;AAAA,gBACN,MAAMA,EAAO;AAAA,gBACb,sBAAsBA;AAAA,gBACtB,OAAOA,EAAO,CAAC;AAAA,cAAA,EACf;AAAA,cACFkF,EAAY,CAAC;AAAA,YAAA;AAGf,mBAAOqB,EAAU;AAAA,cACftD;AAAA,cACAiD,EAAeK,CAAS;AAAA,cACxB/E,EAAI,CAAC,CAACgF,GAAiB,EAAE,MAAAC,GAAM,MAAAsC,EAAM,CAAA,OAAO;AAAA,gBAC1C,GAAGvC;AAAA,gBACH,MAAAC;AAAA,gBACA,MAAAsC;AAAA,cAAA,EACA;AAAA,cACF5C,EAAU0C,CAAU;AAAA,YAAA;AAAA,UACtB,CACD;AAAA,QAAA;AAAA,MAGI,CACR;AAAA,MACD/C,EAAM;AAAA,IAAA;AAAA,EAEV;AAAA,EAEO,OAAO7B,GAAsD;AAClE,UAAM,OAAOA,CAAM;AAAA,EACrB;AACF;ACzHO,MAAM+E,WACH5E,EAEV;AAAA,EAGE,YAAYH,IAAoD,IAAI;AAClE,UAAMA,GAAQ;AAAA,MACZ,WAAW;AAAA,MACX,cAAc;AAAA,MACd,GAAGA,EAAO;AAAA,IAAA,CACX;AAPI,IAAAK,EAAA;AASA,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BG,EAAU,MAAM;AACR,cAAAwE,IAAe,KAAK,UAAU;AAAA,UAClCzH,EAAI,CAACF,OAAW;AAAA,YACd,GAAGA;AAAA,YACH,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,UAAA,EACZ;AAAA,UACF4D,EAAY,CAAC;AAAA,QAAA,GAGTgE,IAAUD,EAAa;AAAA,UAC3BxE;AAAA,YAAU,MACR,KAAK,KAAK;AAAA,cACRjC,EAIE,CAACxD,GAAKmK,MAAY;AAClB,sBAAMC,MAASpK,KAAA,gBAAAA,EAAK,UAAS,KAAKmK,EAAQ;AAEnC,uBAAA;AAAA,kBACL,GAAGnK;AAAA,kBACH,GAAGmK;AAAA,kBACH,OAAAC;AAAA,kBACA,YAAYD,EAAQ;AAAA,gBAAA;AAAA,iBAErB,MAAS;AAAA,YACd;AAAA,UACF;AAAA,UACArD,EAAM;AAAA,QAAA,GAGFuD,IAAcH,EAAQ;AAAA,UAC1B/I,EAAO,CAACmB,MAAUA,EAAM,SAAS,MAAM;AAAA,UACvCE,EAAI,CAACF,OAAW,EAAE,GAAGA,GAAO,MAAM,eAAwB;AAAA,QAAA,GAGtDgI,IAAaJ,EAAQ;AAAA,UACzB/I,EAAO,CAACmB,MAAUA,EAAM,SAAS,KAAK;AAAA,UACtCE,EAAI,CAACF,OAAW,EAAE,GAAGA,GAAO,MAAM,cAAuB;AAAA,QAAA;AAGpD,eAAAgB,EAAM2G,GAAcI,GAAaC,CAAU;AAAA,MAAA,CACnD;AAAA,MACDxD,EAAM;AAAA,IAAA;AAAA,EAEV;AAAA,EAEO,OAAOiC,GAAoD;AAC1D,UAAA,OAAOA,GAASA,EAAQ,OAAO;AAAA,EACvC;AACF;ACpFO,MAAMwB,IACX,CAAC;AAAA,EACC,MAAA9C;AAAA,EACA,cAAA+C;AACF,MAIA,CAACtJ,MACCA,EAAO;AAAA,EACLsC,EAME,CAACxD,GAAKoE,MAAS;AAET,UAAAqG,MADyBzK,KAAA,gBAAAA,EAAK,SAAS,WAAU,OAE1BoE,EAAK,SAAS,QACrCsG,KACJ1K,KAAA,gBAAAA,EAAK,4BAA2BoE,EAAK,yBAMjCuG,IAAiCF,IACnCrG,EAAK,0BACHpE,KAAO,oCAAoCA,IAC3CA,EAAI,iCACJoE,EAAK,yBAKLwG,IACJD,MAAmC,IAC/B,IACAvG,EAAK,0BAA0BuG,GAE/BE,IACJzG,EAAK,0BAA0BuG,GAE3BG,IACJ1G,EAAK,0BAA0BuG,GAM3BI,IACJN,KAAqBC,MAAoC,IACrD,IACAtG,EAAK,0BAA0BsG;AAE9B,WAAA;AAAA,MACL,GAAG1K;AAAA,MACH,GAAGoE;AAAA,MACH,MAAAqD;AAAA,MACA,gCAAAkD;AAAA,MACA,OAAAC;AAAA,MACA,UAAAC;AAAA,MACA,eAAAC;AAAA,MACA,oBAAAC;AAAA,IAAA;AAAA,KAEDP,CAAY;AAAA,EACfhI,EAAI,CAAC,EAAE,gCAAAmI,GAAgC,GAAGjH,EAAA,MAAuBA,CAAI;AACvE;ACnDG,MAAMsH,WACH5F,EAEV;AAAA,EAME,YAAYH,GAAmD;AAC7D,UAAMA,GAAQ;AAAA,MACZ,GAAGA,KAAA,gBAAAA,EAAQ;AAAA,MACX,WAAW;AAAA,IAAA,CACZ;AATI,IAAAK,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAQC,UAAA2F,IAAc,KAAK,UAAU;AAAA,MACjCxF;AAAA,QAAU,CAACnD,MACTe,EAAGf,CAAK,EAAE;AAAA,UACRiI,EAAwB;AAAA,YACtB,MAAM;AAAA,YACN,cAAc;AAAA,UAAA,CACf;AAAA,QACH;AAAA,MACF;AAAA,MACAzD,EAAM;AAAA,IAAA;AAGH,SAAA,UAAU,KAAK,QAAQ;AAAA,MAC1BrB,EAAU,MAAM;AACd,cAAMyF,IAAgBD,EAAY,KAAK/E,EAAY,CAAC,CAAC,GAE/CiF,IAAaD,EAAc;AAAA,UAC/BzF,EAAU,CAAC+E,MACF,KAAK,KAAK;AAAA,YACfjH,EAAU,CAACjB,MAAUA,EAAM,SAAS,KAAK;AAAA,YACzCiI,EAAwB;AAAA,cACtB,MAAM;AAAA,cACN,cAAAC;AAAA,YAAA,CACD;AAAA,UAAA,CAEJ;AAAA,QAAA,GAGGY,IAAYF,EAAc;AAAA,UAC9BzF;AAAA,YAAU,CAAC4F,MACT,KAAK,KAAK;AAAA;AAAA,cAERpF,EAAUoF,CAAe;AAAA,cACzBC,GAAS;AAAA,cACTnK,EAAO,CAAC,CAAA,EAAGoK,CAAS,MAAMA,EAAU,SAAS,KAAK;AAAA,cAClD9F;AAAA,gBAAU,CAAC,CAAC+F,GAAeD,CAAS,MAClClI,EAAGkI,CAAS,EAAE;AAAA,kBACZhB,EAAwB;AAAA,oBACtB,MAAM;AAAA,oBACN,cAAciB;AAAA,kBAAA,CACf;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QAAA;AAGK,eAAAlI,EAAM4H,GAAeC,GAAYC,CAAS;AAAA,MAAA,CAClD;AAAA,MACDtE,EAAM;AAAA,IAAA,GAGH,KAAA,SAAS,KAAK,QAAQ;AAAA,MACzB3F,EAAO,CAACmB,MAAUA,EAAM,SAAS,YAAY;AAAA,IAAA,GAG1C,KAAA,OAAO,KAAK,QAAQ,KAAKnB,EAAO,CAACmB,MAAUA,EAAM,SAAS,UAAU,CAAC;AAAA,EAC5E;AAAA,EAEO,OAAOyG,GAAmD;AACzD,UAAA,OAAOA,GAASA,EAAQ,OAAO;AAAA,EACvC;AACF;ACpFO,MAAM0C,GAEb;AAAA,EAOE,YACY1C,GAGV;AAVF,IAAAzD,EAAA;AAEA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AAGY,SAAA,UAAAyD,GAIV,KAAK,cAAcA,EAAQ,aAE3B,KAAK,UAAUzF;AAAA,MACb,GAAGyF,EAAQ,YAAY,IAAI,CAACjD,MAAeA,EAAW,OAAO;AAAA,IAAA,EAC7D,KAAKgB,EAAA,CAAO,GAEd,KAAK,SAASX;AAAA,MACZ,KAAK,YAAY,IAAI,CAACL,MAAeA,EAAW,MAAM;AAAA,IAAA,EACtD;AAAA,MACAtD;AAAA,QAAI,CAACkJ,MACHA,EAAO,OAAO,CAAC1L,GAAK2L,OAAW;AAAA,UAC7B,SAAS,KAAK,IAAI3L,EAAI,SAAS2L,EAAM,OAAO;AAAA,QAAA,EAC5C;AAAA,MACJ;AAAA,IAAA,GAGF,KAAK,OAAO5C,CAAO;AAAA,EACrB;AAAA,EAEO,OAAOA,GAAoC;AAChD,IAAIA,EAAQ,cAMFA,EAAA,UAAU,MAAM,cAAc,QAK9BA,EAAA,UAAU,MAAM,aAAa,SAGvC,KAAK,QAAQ,YAAY,QAAQ,CAACjD,MAAe;AAC/C,MAAAA,EAAW,OAAOiD,CAAO;AAAA,IAAA,CAC1B;AAAA,EACH;AACF;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n Observable,\n combineLatest,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n startWith,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown>; end$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n public config$ = this.configSubject.pipe(isValidConfig)\n\n abstract events$: Observable<Event>\n\n /**\n * Track active running failWith recognizers\n */\n protected failWithActive$: Observable<boolean>\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(of(panStartEvent), panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const tailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, tailingEndEventIfFailed$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n share(),\n )\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = pinchStart$.pipe(shareReplay(1))\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","failingActive$","isActive","events$","tailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","pairwise","currEvent","previousEvent","Recognizable","states","state"],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function($,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):($=typeof globalThis<"u"?globalThis:$||self,e($.gesturx={},$.rxjs))})(this,function($,e){"use strict";var oe=Object.defineProperty;var ae=($,e,P)=>e in $?oe($,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):$[e]=P;var c=($,e,P)=>ae($,typeof e!="symbol"?e+"":e,P);function P(n,i){return Math.sqrt(Math.pow(i.x-n.x,2)+Math.pow(i.y-n.y,2))}function N(n){const i=n.length;if(i<2)return 0;const t=n.reduce((o,a,l)=>o+n.slice(l+1).reduce((s,r)=>s+P(a,r),0),0),p=i*(i-1)/2;return t/p}function I(n,i){const t=i.x-n.x,p=i.y-n.y;return Math.atan2(p,t)}function B(n,i){return I(n,i)*(180/Math.PI)}function E(n){const i=n.reduce((p,o)=>(p.x+=o.x,p.y+=o.y,p),{x:0,y:0}),t=n.length||1;return{x:i.x/t,y:i.y/t}}function V(n,i){if(n.length!==i.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(n),p=E(i);let o=0;for(let s=0;s<n.length;s++){const r=I(t,n[s]);let u=I(p,i[s])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),o+=u}const a=o/n.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(n){return n!=null}const _=n=>n.length>0,G=n=>n.pipe(e.filter(_));function C(n,i,t){const p=E([n]),o=E([i]);return Math.abs(o.x-p.x)>=t||Math.abs(o.y-p.y)>=t}const H=(n,i,t)=>{const p=n>0?i/n:0,o=n>0?t/n:0;return{velocityX:p,velocityY:o}};function T(n){return i=>i.pipe(e.filter(t=>t.pointerId===n.pointerId))}const F=n=>n.type==="pointerleave"||n.type==="pointercancel"||n.type==="pointerup",J=({container:n,afterEventReceived:i=t=>t})=>e.fromEvent(n,"pointerdown").pipe(e.map(i)),L=({pointerEvent$:n})=>i=>{const t=n.pipe(e.filter(r=>r.type==="pointerup")),p=n.pipe(e.filter(r=>r.type==="pointerleave")),o=n.pipe(e.filter(r=>r.type==="pointercancel")),a=n.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),s=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return i.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,o,p,t,l)).pipe(T(r),e.takeWhile(v=>!s(v),!0))}),e.scan((r,h)=>{if(s(h)){const{[h.pointerId]:u,...v}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:v}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},O=(n,i,t,p)=>{const o=n.x-i.x+t,a=n.y-i.y+p;return{deltaX:o,deltaY:a}},U=n=>{const i=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return n.pipe(e.scan((t,p)=>{var m,y;const o=i(p),a=(t==null?void 0:t.center)??o,l=(t==null?void 0:t.deltaX)??0,s=(t==null?void 0:t.deltaY)??0,r=((m=t==null?void 0:t.latestActivePointers)==null?void 0:m.length)??1,h=((y=p.latestActivePointers)==null?void 0:y.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(p.event.type)&&r!==h,v=h>0,{deltaX:g,deltaY:w}=u&&v?O(o,o,l,s):O(o,a,l,s),{degreesDelta:f}=r===h&&r>=2&&h>=2?V((t==null?void 0:t.latestActivePointers)??[],p.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...p,center:o,deltaX:g,deltaY:w,deltaPointersAngle:f}},void 0),e.map(t=>{const{deltaX:p,deltaY:o,latestActivePointers:a,startTime:l,center:s,event:r,deltaPointersAngle:h}=t,u=a??[],g=Date.now()-l,{velocityX:w,velocityY:f}=H(g,p,o),m=N(a);return{deltaX:p,deltaY:o,velocityX:w,velocityY:f,delay:g,center:s,pointers:u,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:m}}))},W=n=>n.pipe(e.filter(i=>!!i.container)),X=n=>n.pipe(e.filter(F)),K=({container:n,afterEventReceived:i=t=>t})=>{const t=J({afterEventReceived:i,container:n}),p=e.fromEvent(n,"pointerup").pipe(e.map(i)),o=e.fromEvent(n,"pointermove").pipe(e.map(i)),a=e.fromEvent(n,"pointerleave").pipe(e.map(i)),l=e.fromEvent(n,"pointercancel").pipe(e.map(i));return e.merge(t,l,a,p,o)};class D{constructor(i,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(W));c(this,"failWithActive$");const p=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}))),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X);const o=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=o.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(s=>{const r=s.start$.pipe(e.map(()=>!0)),h=s.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(W,e.switchMap(a=>{var g,w,f;const l=Math.max(1,((g=a.panConfig)==null?void 0:g.numInputs)??1),s=Math.max(0,((w=a.panConfig)==null?void 0:w.posThreshold)??0),r=Math.max(0,((f=a.panConfig)==null?void 0:f.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),u=m=>m.pipe(e.filter(y=>y.pointers.length>=l)),v=m=>m.pipe(e.filter(y=>y.pointers.length<l));return h.pipe(u,e.exhaustMap(({pointers:m})=>{const y=h.pipe(v,e.first(),e.share()),k=e.timer(r),R=e.merge(...m.map(d=>e.of(d)),this.pointerDown$).pipe(e.mergeMap(d=>e.merge(this.pointerMove$,e.of(d)).pipe(T(d),e.filter(A=>C(d,A,s)))),e.first()).pipe(e.switchMap(()=>k),e.withLatestFrom(h),e.map(([,{event:d,pointers:A}])=>({type:"start",event:d,latestActivePointers:A})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(y)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:d,pointers:A})=>({type:"move",event:d,latestActivePointers:A})))),e.takeUntil(y)),M=R.pipe(e.mergeMap(()=>y.pipe(e.map(({event:d,pointers:A})=>({type:"end",event:d,latestActivePointers:A}))))),b=e.merge(R,S,M).pipe(e.shareReplay(1));return b.pipe(U,e.withLatestFrom(b),e.map(([d,{type:A}])=>({...d,type:A})))}))}),e.tap(a=>{p.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$=p.asObservable(),this.updateInternal(i??{},t)}updateInternal(i,t){const p=this.configSubject.getValue();this.configSubject.next({...p,...i,...i.options&&{options:{...p.options,...i.options}},panConfig:{...p.panConfig,...t}})}update(i,t){this.updateInternal(i,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const p=this.panStart$.pipe(e.map(s=>({type:"panStart",...s})),e.withLatestFrom(this.failWithActive$),e.filter(([,s])=>!s),e.map(([s])=>s),e.share()),o=this.panEnd$.pipe(e.map(s=>({type:"panEnd",...s})),e.share()),a=this.panMove$.pipe(e.map(s=>({type:"panMove",...s})));this.events$=e.merge(p.pipe(e.switchMap(s=>{let r=s;const h=this.failWithActive$.pipe(e.filter(g=>g),e.first()),u=e.merge(e.of(s),a,o).pipe(e.tap(g=>{r=g}),e.takeUntil(h)),v=h.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(o));return e.merge(u,v)}))),this.start$=this.events$.pipe(e.filter(s=>s.type==="panStart")),this.end$=this.events$.pipe(e.filter(s=>s.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=n=>i=>i.pipe(e.filter(t=>Math.abs(t.velocityX)>=n||Math.abs(t.velocityY)>=n));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(p=>{const{escapeVelocity:o=.9}=p.options??{};return this.panStart$.pipe(e.switchMap(a=>this.panEnd$.pipe(Z(o),e.map(l=>({type:"swipe",angle:B(a.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const j=({timeout:n,pointerEvent$:i})=>t=>t.pipe(e.mergeMap(p=>e.timer(n).pipe(e.takeUntil(i.pipe(X,T(p)))))),ee=({initialPointerEvent:n,pointerEvent$:i,tolerance:t})=>p=>p.pipe(e.mergeMap(o=>i.pipe(T(o),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(n,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(p=>{var g,w;const o=((g=p.options)==null?void 0:g.maxTaps)??1,a=((w=p.options)==null?void 0:w.multiTapThreshold)??100*(o-1),{maximumPressTime:l=150,tolerance:s=10}=p.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:f})=>f.length>1)),u=f=>f.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(f=>{const m=e.merge(e.of(f),this.pointerDown$).pipe(e.shareReplay(1)),y=m.pipe(u),k=m.pipe(ee({initialPointerEvent:f,pointerEvent$:this.pointerEvent$,tolerance:s})),Y=m.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(M=>M)),this.pointerCancel$,h,k,Y),S=y.pipe(G,e.filter(M=>M.length<=o),e.map(M=>({type:"tap",taps:M.length,latestActivePointers:M,event:M[0]})),e.shareReplay(1));return S.pipe(U,e.withLatestFrom(S),e.map(([M,{type:b,taps:d}])=>({...M,type:b,taps:d})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ne extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const p=this.panStart$.pipe(e.map(s=>({...s,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),o=p.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((s,r)=>{const h=((s==null?void 0:s.angle)??0)+r.deltaPointersAngle;return{...s,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=o.pipe(e.filter(s=>s.type==="move"),e.map(s=>({...s,type:"rotateMove"}))),l=o.pipe(e.filter(s=>s.type==="end"),e.map(s=>({...s,type:"rotateEnd"})));return e.merge(p,a,l)}),e.share())}update(t){super.update(t,t.options)}}const z=({type:n,initialEvent:i})=>t=>t.pipe(e.scan((p,o)=>{const l=((p==null?void 0:p.pointers.length)??0)!==o.pointers.length,s=(p==null?void 0:p.pointersAverageDistance)??o.pointersAverageDistance,r=l?o.pointersAverageDistance:p&&"initialPointersAverageDistance"in p?p.initialPointersAverageDistance:o.pointersAverageDistance,h=r===0?1:o.pointersAverageDistance/r,u=o.pointersAverageDistance-r,v=o.pointersAverageDistance-r,g=l||s===0?1:o.pointersAverageDistance/s;return{...p,...o,type:n,initialPointersAverageDistance:r,scale:h,distance:u,deltaDistance:v,deltaDistanceScale:g}},i),e.map(({initialPointersAverageDistance:p,...o})=>o));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$");const p=this.panStart$.pipe(e.switchMap(o=>e.of(o).pipe(z({type:"pinchStart",initialEvent:void 0}))),e.share());this.events$=this.config$.pipe(e.switchMap(()=>{const o=p.pipe(e.shareReplay(1)),a=o.pipe(e.switchMap(s=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),z({type:"pinchMove",initialEvent:s})))),l=o.pipe(e.switchMap(s=>this.pan$.pipe(e.startWith(s),e.pairwise(),e.filter(([,r])=>r.type==="end"),e.switchMap(([r,h])=>e.of(h).pipe(z({type:"pinchEnd",initialEvent:r}))))));return e.merge(o,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(i){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=i,this.recognizers=i.recognizers,this.events$=e.merge(...i.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((p,o)=>({fingers:Math.max(p.fingers,o.fingers)})))),this.update(i)}update(i){i.container&&(i.container.style.touchAction="none",i.container.style.userSelect="none"),this.options.recognizers.forEach(t=>{t.update(i)})}}$.PanRecognizer=Q,$.PinchRecognizer=ie,$.Recognizable=pe,$.Recognizer=D,$.RotateRecognizer=ne,$.SwipeRecognizer=x,$.TapRecognizer=te,Object.defineProperty($,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function($,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):($=typeof globalThis<"u"?globalThis:$||self,e($.gesturx={},$.rxjs))})(this,function($,e){"use strict";var oe=Object.defineProperty;var ae=($,e,P)=>e in $?oe($,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):$[e]=P;var c=($,e,P)=>ae($,typeof e!="symbol"?e+"":e,P);function P(n,i){return Math.sqrt(Math.pow(i.x-n.x,2)+Math.pow(i.y-n.y,2))}function N(n){const i=n.length;if(i<2)return 0;const t=n.reduce((o,a,l)=>o+n.slice(l+1).reduce((s,r)=>s+P(a,r),0),0),p=i*(i-1)/2;return t/p}function I(n,i){const t=i.x-n.x,p=i.y-n.y;return Math.atan2(p,t)}function B(n,i){return I(n,i)*(180/Math.PI)}function E(n){const i=n.reduce((p,o)=>(p.x+=o.x,p.y+=o.y,p),{x:0,y:0}),t=n.length||1;return{x:i.x/t,y:i.y/t}}function V(n,i){if(n.length!==i.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(n),p=E(i);let o=0;for(let s=0;s<n.length;s++){const r=I(t,n[s]);let u=I(p,i[s])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),o+=u}const a=o/n.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(n){return n!=null}const _=n=>n.length>0,G=n=>n.pipe(e.filter(_));function C(n,i,t){const p=E([n]),o=E([i]);return Math.abs(o.x-p.x)>=t||Math.abs(o.y-p.y)>=t}const H=(n,i,t)=>{const p=n>0?i/n:0,o=n>0?t/n:0;return{velocityX:p,velocityY:o}};function T(n){return i=>i.pipe(e.filter(t=>t.pointerId===n.pointerId))}const F=n=>n.type==="pointerleave"||n.type==="pointercancel"||n.type==="pointerup",J=({container:n,afterEventReceived:i=t=>t})=>e.fromEvent(n,"pointerdown").pipe(e.map(i)),L=({pointerEvent$:n})=>i=>{const t=n.pipe(e.filter(r=>r.type==="pointerup")),p=n.pipe(e.filter(r=>r.type==="pointerleave")),o=n.pipe(e.filter(r=>r.type==="pointercancel")),a=n.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),s=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return i.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,o,p,t,l)).pipe(T(r),e.takeWhile(v=>!s(v),!0))}),e.scan((r,h)=>{if(s(h)){const{[h.pointerId]:u,...v}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:v}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},O=(n,i,t,p)=>{const o=n.x-i.x+t,a=n.y-i.y+p;return{deltaX:o,deltaY:a}},U=n=>{const i=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return n.pipe(e.scan((t,p)=>{var m,y;const o=i(p),a=(t==null?void 0:t.center)??o,l=(t==null?void 0:t.deltaX)??0,s=(t==null?void 0:t.deltaY)??0,r=((m=t==null?void 0:t.latestActivePointers)==null?void 0:m.length)??1,h=((y=p.latestActivePointers)==null?void 0:y.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(p.event.type)&&r!==h,v=h>0,{deltaX:d,deltaY:w}=u&&v?O(o,o,l,s):O(o,a,l,s),{degreesDelta:f}=r===h&&r>=2&&h>=2?V((t==null?void 0:t.latestActivePointers)??[],p.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...p,center:o,deltaX:d,deltaY:w,deltaPointersAngle:f}},void 0),e.map(t=>{const{deltaX:p,deltaY:o,latestActivePointers:a,startTime:l,center:s,event:r,deltaPointersAngle:h}=t,u=a??[],d=Date.now()-l,{velocityX:w,velocityY:f}=H(d,p,o),m=N(a);return{deltaX:p,deltaY:o,velocityX:w,velocityY:f,delay:d,center:s,pointers:u,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:m}}))},W=n=>n.pipe(e.filter(i=>!!i.container)),X=n=>n.pipe(e.filter(F)),K=({container:n,afterEventReceived:i=t=>t})=>{const t=J({afterEventReceived:i,container:n}),p=e.fromEvent(n,"pointerup").pipe(e.map(i)),o=e.fromEvent(n,"pointermove").pipe(e.map(i)),a=e.fromEvent(n,"pointerleave").pipe(e.map(i)),l=e.fromEvent(n,"pointercancel").pipe(e.map(i));return e.merge(t,l,a,p,o)};class D{constructor(i,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(W));c(this,"failWithActive$");const p=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}))),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X);const o=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=o.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(s=>{const r=s.start$.pipe(e.map(()=>!0)),h=s.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(W,e.switchMap(a=>{var d,w,f;const l=Math.max(1,((d=a.panConfig)==null?void 0:d.numInputs)??1),s=Math.max(0,((w=a.panConfig)==null?void 0:w.posThreshold)??0),r=Math.max(0,((f=a.panConfig)==null?void 0:f.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),u=m=>m.pipe(e.filter(y=>y.pointers.length>=l)),v=m=>m.pipe(e.filter(y=>y.pointers.length<l));return h.pipe(u,e.exhaustMap(({pointers:m})=>{const y=h.pipe(v,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(A=>C(g,A,s)))),e.first()).pipe(e.switchMap(()=>k),e.withLatestFrom(h),e.map(([,{event:g,pointers:A}])=>({type:"start",event:g,latestActivePointers:A})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(y)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:g,pointers:A})=>({type:"move",event:g,latestActivePointers:A})))),e.takeUntil(y)),M=R.pipe(e.mergeMap(()=>y.pipe(e.map(({event:g,pointers:A})=>({type:"end",event:g,latestActivePointers:A}))))),b=e.merge(R,S,M).pipe(e.shareReplay(1));return b.pipe(U,e.withLatestFrom(b),e.map(([g,{type:A}])=>({...g,type:A})))}))}),e.tap(a=>{p.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$=p.asObservable(),this.updateInternal(i??{},t)}updateInternal(i,t){const p=this.configSubject.getValue();this.configSubject.next({...p,...i,...i.options&&{options:{...p.options,...i.options}},panConfig:{...p.panConfig,...t}})}update(i,t){this.updateInternal(i,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const p=this.panStart$.pipe(e.map(s=>({type:"panStart",...s})),e.withLatestFrom(this.failWithActive$),e.filter(([,s])=>!s),e.map(([s])=>s),e.share()),o=this.panEnd$.pipe(e.map(s=>({type:"panEnd",...s})),e.share()),a=this.panMove$.pipe(e.map(s=>({type:"panMove",...s})));this.events$=p.pipe(e.switchMap(s=>{let r=s;const h=this.failWithActive$.pipe(e.filter(d=>d),e.first()),u=e.merge(e.of(s),a,o).pipe(e.tap(d=>{r=d}),e.takeUntil(h)),v=h.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(o));return e.merge(u,v)}),e.share()),this.start$=this.events$.pipe(e.filter(s=>s.type==="panStart")),this.end$=this.events$.pipe(e.filter(s=>s.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=n=>i=>i.pipe(e.filter(t=>Math.abs(t.velocityX)>=n||Math.abs(t.velocityY)>=n));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(p=>{const{escapeVelocity:o=.9}=p.options??{};return this.panStart$.pipe(e.switchMap(a=>this.panEnd$.pipe(Z(o),e.map(l=>({type:"swipe",angle:B(a.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const j=({timeout:n,pointerEvent$:i})=>t=>t.pipe(e.mergeMap(p=>e.timer(n).pipe(e.takeUntil(i.pipe(X,T(p)))))),ee=({initialPointerEvent:n,pointerEvent$:i,tolerance:t})=>p=>p.pipe(e.mergeMap(o=>i.pipe(T(o),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(n,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(p=>{var d,w;const o=((d=p.options)==null?void 0:d.maxTaps)??1,a=((w=p.options)==null?void 0:w.multiTapThreshold)??100*(o-1),{maximumPressTime:l=150,tolerance:s=10}=p.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:f})=>f.length>1)),u=f=>f.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(f=>{const m=e.merge(e.of(f),this.pointerDown$).pipe(e.shareReplay(1)),y=m.pipe(u),k=m.pipe(ee({initialPointerEvent:f,pointerEvent$:this.pointerEvent$,tolerance:s})),Y=m.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(M=>M)),this.pointerCancel$,h,k,Y),S=y.pipe(G,e.filter(M=>M.length<=o),e.map(M=>({type:"tap",taps:M.length,latestActivePointers:M,event:M[0]})),e.shareReplay(1));return S.pipe(U,e.withLatestFrom(S),e.map(([M,{type:b,taps:g}])=>({...M,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 p=this.panStart$.pipe(e.map(s=>({...s,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),o=p.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((s,r)=>{const h=((s==null?void 0:s.angle)??0)+r.deltaPointersAngle;return{...s,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=o.pipe(e.filter(s=>s.type==="move"),e.map(s=>({...s,type:"rotateMove"}))),l=o.pipe(e.filter(s=>s.type==="end"),e.map(s=>({...s,type:"rotateEnd"})));return e.merge(p,a,l)}),e.share())}update(t){super.update(t,t.options)}}const z=({type:n,initialEvent:i})=>t=>t.pipe(e.scan((p,o)=>{const l=((p==null?void 0:p.pointers.length)??0)!==o.pointers.length,s=(p==null?void 0:p.pointersAverageDistance)??o.pointersAverageDistance,r=l?o.pointersAverageDistance:p&&"initialPointersAverageDistance"in p?p.initialPointersAverageDistance:o.pointersAverageDistance,h=r===0?1:o.pointersAverageDistance/r,u=o.pointersAverageDistance-r,v=o.pointersAverageDistance-r,d=l||s===0?1:o.pointersAverageDistance/s;return{...p,...o,type:n,initialPointersAverageDistance:r,scale:h,distance:u,deltaDistance:v,deltaDistanceScale:d}},i),e.map(({initialPointersAverageDistance:p,...o})=>o));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$");const p=this.panStart$.pipe(e.switchMap(o=>e.of(o).pipe(z({type:"pinchStart",initialEvent:void 0}))),e.share());this.events$=this.config$.pipe(e.switchMap(()=>{const o=p.pipe(e.shareReplay(1)),a=o.pipe(e.switchMap(s=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),z({type:"pinchMove",initialEvent:s})))),l=o.pipe(e.switchMap(s=>this.pan$.pipe(e.startWith(s),e.pairwise(),e.filter(([,r])=>r.type==="end"),e.switchMap(([r,h])=>e.of(h).pipe(z({type:"pinchEnd",initialEvent:r}))))));return e.merge(o,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(i){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=i,this.recognizers=i.recognizers,this.events$=e.merge(...i.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((p,o)=>({fingers:Math.max(p.fingers,o.fingers)})))),this.update(i)}update(i){i.container&&(i.container.style.touchAction="none",i.container.style.userSelect="none"),this.options.recognizers.forEach(t=>{t.update(i)})}}$.PanRecognizer=Q,$.PinchRecognizer=ie,$.Recognizable=pe,$.Recognizer=D,$.RotateRecognizer=ne,$.SwipeRecognizer=x,$.TapRecognizer=te,Object.defineProperty($,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=index.umd.cjs.map
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n Observable,\n combineLatest,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n startWith,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown>; end$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n public config$ = this.configSubject.pipe(isValidConfig)\n\n abstract events$: Observable<Event>\n\n /**\n * Track active running failWith recognizers\n */\n protected failWithActive$: Observable<boolean>\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = merge(\n panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(of(panStartEvent), panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const tailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, tailingEndEventIfFailed$)\n }),\n ),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n share(),\n )\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = pinchStart$.pipe(shareReplay(1))\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","failingActive$","isActive","events$","tailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","pairwise","currEvent","previousEvent","Recognizable","states","state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n Observable,\n combineLatest,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n startWith,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown>; end$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n public config$ = this.configSubject.pipe(isValidConfig)\n\n abstract events$: Observable<Event>\n\n /**\n * Track active running failWith recognizers\n */\n protected failWithActive$: Observable<boolean>\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(of(panStartEvent), panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const tailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, tailingEndEventIfFailed$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n share(),\n )\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = pinchStart$.pipe(shareReplay(1))\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","failingActive$","isActive","events$","tailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","pairwise","currEvent","previousEvent","Recognizable","states","state"],"mappings":"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"}
|