gesturx 1.8.8 → 1.8.9
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/image.jpg +0 -0
- package/dist/index.js +113 -105
- 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/image.jpg
ADDED
|
Binary file
|
package/dist/index.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
var ie = Object.defineProperty;
|
|
2
|
-
var se = (t,
|
|
3
|
-
var $ = (t,
|
|
2
|
+
var se = (t, i, e) => i in t ? ie(t, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[i] = e;
|
|
3
|
+
var $ = (t, i, e) => se(t, typeof i != "symbol" ? i + "" : i, e);
|
|
4
4
|
import { filter as h, fromEvent as S, mergeMap as b, defer as pe, of as T, merge as g, takeWhile as V, scan as L, map as c, BehaviorSubject as q, switchMap as v, share as P, distinctUntilChanged as oe, startWith as re, shareReplay as M, combineLatest as j, exhaustMap as H, first as z, timer as J, withLatestFrom as C, takeUntil as I, skip as ae, tap as K, ignoreElements as le, buffer as he, debounceTime as ce, NEVER as $e, defaultIfEmpty as ue } from "rxjs";
|
|
5
|
-
function de(t,
|
|
5
|
+
function de(t, i) {
|
|
6
6
|
return Math.sqrt(
|
|
7
|
-
Math.pow(
|
|
7
|
+
Math.pow(i.x - t.x, 2) + Math.pow(i.y - t.y, 2)
|
|
8
8
|
);
|
|
9
9
|
}
|
|
10
10
|
function ve(t) {
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
13
|
-
const e = t.reduce((o, p, a) => o + t.slice(a + 1).reduce((s, r) => s + de(p, r), 0), 0),
|
|
14
|
-
return e /
|
|
11
|
+
const i = t.length;
|
|
12
|
+
if (i < 2) return 0;
|
|
13
|
+
const e = t.reduce((o, p, a) => o + t.slice(a + 1).reduce((s, r) => s + de(p, r), 0), 0), n = i * (i - 1) / 2;
|
|
14
|
+
return e / n;
|
|
15
15
|
}
|
|
16
|
-
function N(t,
|
|
17
|
-
const e =
|
|
18
|
-
return Math.atan2(
|
|
16
|
+
function N(t, i) {
|
|
17
|
+
const e = i.x - t.x, n = i.y - t.y;
|
|
18
|
+
return Math.atan2(n, e);
|
|
19
19
|
}
|
|
20
|
-
function ge(t,
|
|
21
|
-
return N(t,
|
|
20
|
+
function ge(t, i) {
|
|
21
|
+
return N(t, i) * (180 / Math.PI);
|
|
22
22
|
}
|
|
23
23
|
function k(t) {
|
|
24
|
-
const
|
|
25
|
-
(
|
|
24
|
+
const i = t.reduce(
|
|
25
|
+
(n, o) => (n.x += o.x, n.y += o.y, n),
|
|
26
26
|
{ x: 0, y: 0 }
|
|
27
27
|
), e = t.length || 1;
|
|
28
28
|
return {
|
|
29
|
-
x:
|
|
30
|
-
y:
|
|
29
|
+
x: i.x / e,
|
|
30
|
+
y: i.y / e
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
function ye(t,
|
|
34
|
-
if (t.length !==
|
|
33
|
+
function ye(t, i) {
|
|
34
|
+
if (t.length !== i.length)
|
|
35
35
|
throw new Error("Initial and new points arrays must have the same length.");
|
|
36
|
-
const e = k(t),
|
|
36
|
+
const e = k(t), n = k(i);
|
|
37
37
|
let o = 0;
|
|
38
38
|
for (let s = 0; s < t.length; s++) {
|
|
39
39
|
const r = N(
|
|
@@ -41,8 +41,8 @@ function ye(t, n) {
|
|
|
41
41
|
t[s]
|
|
42
42
|
);
|
|
43
43
|
let u = N(
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
n,
|
|
45
|
+
i[s]
|
|
46
46
|
) - r;
|
|
47
47
|
u > Math.PI ? u -= 2 * Math.PI : u < -Math.PI && (u += 2 * Math.PI), o += u;
|
|
48
48
|
}
|
|
@@ -53,33 +53,33 @@ function fe(t) {
|
|
|
53
53
|
return t != null;
|
|
54
54
|
}
|
|
55
55
|
const me = (t) => t.length > 0, Ae = (t) => t.pipe(h(me));
|
|
56
|
-
function Q(t,
|
|
57
|
-
const
|
|
58
|
-
return Math.abs(o.x -
|
|
56
|
+
function Q(t, i, e) {
|
|
57
|
+
const n = k([t]), o = k([i]);
|
|
58
|
+
return Math.abs(o.x - n.x) >= e || Math.abs(o.y - n.y) >= e;
|
|
59
59
|
}
|
|
60
|
-
const De = (t,
|
|
61
|
-
const
|
|
60
|
+
const De = (t, i, e) => {
|
|
61
|
+
const n = t > 0 ? i / t : 0, o = t > 0 ? e / t : 0;
|
|
62
62
|
return {
|
|
63
|
-
velocityX:
|
|
63
|
+
velocityX: n,
|
|
64
64
|
velocityY: o
|
|
65
65
|
};
|
|
66
66
|
};
|
|
67
67
|
function U(t) {
|
|
68
|
-
return (
|
|
68
|
+
return (i) => i.pipe(
|
|
69
69
|
h((e) => e.pointerId === t.pointerId)
|
|
70
70
|
);
|
|
71
71
|
}
|
|
72
72
|
const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.type === "pointerup", Pe = ({
|
|
73
73
|
container: t,
|
|
74
|
-
afterEventReceived:
|
|
74
|
+
afterEventReceived: i = (e) => e
|
|
75
75
|
}) => S(t, "pointerdown").pipe(
|
|
76
|
-
c(
|
|
76
|
+
c(i)
|
|
77
77
|
), ee = ({
|
|
78
78
|
pointerEvent$: t
|
|
79
|
-
}) => (
|
|
79
|
+
}) => (i) => {
|
|
80
80
|
const e = t.pipe(
|
|
81
81
|
h((r) => r.type === "pointerup")
|
|
82
|
-
),
|
|
82
|
+
), n = t.pipe(
|
|
83
83
|
h((r) => r.type === "pointerleave")
|
|
84
84
|
), o = t.pipe(
|
|
85
85
|
h((r) => r.type === "pointercancel")
|
|
@@ -88,7 +88,7 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
|
|
|
88
88
|
), a = S(window, "contextmenu"), s = (r) => ["pointercancel", "pointerleave", "pointerup", "contextmenu"].includes(
|
|
89
89
|
r.type
|
|
90
90
|
);
|
|
91
|
-
return
|
|
91
|
+
return i.pipe(
|
|
92
92
|
b((r) => {
|
|
93
93
|
const l = pe(() => T(r));
|
|
94
94
|
return g(
|
|
@@ -96,7 +96,7 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
|
|
|
96
96
|
g(
|
|
97
97
|
p,
|
|
98
98
|
o,
|
|
99
|
-
|
|
99
|
+
n,
|
|
100
100
|
e,
|
|
101
101
|
a
|
|
102
102
|
)
|
|
@@ -126,29 +126,37 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
|
|
|
126
126
|
pointers: Object.values(l).filter(fe)
|
|
127
127
|
}))
|
|
128
128
|
);
|
|
129
|
-
}, _ = (t,
|
|
130
|
-
const o = t.x -
|
|
129
|
+
}, _ = (t, i, e, n) => {
|
|
130
|
+
const o = t.x - i.x + e, p = t.y - i.y + n;
|
|
131
131
|
return {
|
|
132
132
|
deltaX: o,
|
|
133
133
|
deltaY: p
|
|
134
134
|
};
|
|
135
135
|
}, te = (t) => {
|
|
136
|
-
const
|
|
136
|
+
const i = (e) => k(
|
|
137
137
|
e.latestActivePointers.length ? e.latestActivePointers : [e.event]
|
|
138
138
|
);
|
|
139
139
|
return t.pipe(
|
|
140
|
-
L((e,
|
|
140
|
+
L((e, n) => {
|
|
141
141
|
var f, E;
|
|
142
|
-
const o = n
|
|
143
|
-
|
|
144
|
-
) && r !== l, m = l > 0, { deltaX: y, deltaY: A } = u && m
|
|
142
|
+
const o = i(n), p = (e == null ? void 0 : e.center) ?? o, a = (e == null ? void 0 : e.deltaX) ?? 0, s = (e == null ? void 0 : e.deltaY) ?? 0, r = ((f = e == null ? void 0 : e.latestActivePointers) == null ? void 0 : f.length) ?? 1, l = ((E = n.latestActivePointers) == null ? void 0 : E.length) ?? 1, u = ["pointerdown", "pointercancel", "pointerleave", "pointerup"].includes(
|
|
143
|
+
n.event.type
|
|
144
|
+
) && r !== l, m = l > 0, { deltaX: y, deltaY: A } = u && m || /**
|
|
145
|
+
* A pointercancel cean come after a drag event and heven being completely
|
|
146
|
+
* desync, leading to erroned values. We should just ignore it.
|
|
147
|
+
*/
|
|
148
|
+
n.event.type === "pointercancel" ? _(o, o, a, s) : _(o, p, a, s), { degreesDelta: D } = r === l && r >= 2 && l >= 2 && /**
|
|
149
|
+
* A pointercancel cean come after a drag event and heven being completely
|
|
150
|
+
* desync, leading to erroned values. We should just ignore it.
|
|
151
|
+
*/
|
|
152
|
+
n.event.type !== "pointercancel" ? ye(
|
|
145
153
|
(e == null ? void 0 : e.latestActivePointers) ?? [],
|
|
146
|
-
|
|
154
|
+
n.latestActivePointers ?? []
|
|
147
155
|
) : { degreesDelta: 0 };
|
|
148
156
|
return {
|
|
149
157
|
startTime: (/* @__PURE__ */ new Date()).getTime(),
|
|
150
158
|
...e,
|
|
151
|
-
...
|
|
159
|
+
...n,
|
|
152
160
|
center: o,
|
|
153
161
|
deltaX: y,
|
|
154
162
|
deltaY: A,
|
|
@@ -157,16 +165,16 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
|
|
|
157
165
|
}, void 0),
|
|
158
166
|
c((e) => {
|
|
159
167
|
const {
|
|
160
|
-
deltaX:
|
|
168
|
+
deltaX: n,
|
|
161
169
|
deltaY: o,
|
|
162
170
|
latestActivePointers: p,
|
|
163
171
|
startTime: a,
|
|
164
172
|
center: s,
|
|
165
173
|
event: r,
|
|
166
174
|
deltaPointersAngle: l
|
|
167
|
-
} = e, u = p ?? [], y = Date.now() - a, { velocityX: A, velocityY: D } = De(y,
|
|
175
|
+
} = e, u = p ?? [], y = Date.now() - a, { velocityX: A, velocityY: D } = De(y, n, o), f = ve(p);
|
|
168
176
|
return {
|
|
169
|
-
deltaX:
|
|
177
|
+
deltaX: n,
|
|
170
178
|
deltaY: o,
|
|
171
179
|
velocityX: A,
|
|
172
180
|
velocityY: D,
|
|
@@ -182,39 +190,39 @@ const Z = (t) => t.type === "pointerleave" || t.type === "pointercancel" || t.ty
|
|
|
182
190
|
);
|
|
183
191
|
}, G = (t) => t.pipe(
|
|
184
192
|
h(
|
|
185
|
-
(
|
|
193
|
+
(i) => !!i.container
|
|
186
194
|
)
|
|
187
195
|
), ne = (t) => t.pipe(h(Z)), Ee = ({
|
|
188
196
|
container: t,
|
|
189
|
-
afterEventReceived:
|
|
197
|
+
afterEventReceived: i = (e) => e
|
|
190
198
|
}) => {
|
|
191
|
-
const e = Pe({ afterEventReceived:
|
|
192
|
-
c(
|
|
199
|
+
const e = Pe({ afterEventReceived: i, container: t }), n = S(t, "pointerup").pipe(
|
|
200
|
+
c(i)
|
|
193
201
|
), o = S(t, "pointermove").pipe(
|
|
194
|
-
c(
|
|
202
|
+
c(i)
|
|
195
203
|
), p = S(t, "pointerleave").pipe(
|
|
196
|
-
c(
|
|
204
|
+
c(i)
|
|
197
205
|
), a = S(
|
|
198
206
|
t,
|
|
199
207
|
"pointercancel"
|
|
200
|
-
).pipe(c(
|
|
208
|
+
).pipe(c(i));
|
|
201
209
|
return {
|
|
202
210
|
pointerEvents$: g(
|
|
203
211
|
e,
|
|
204
212
|
a,
|
|
205
213
|
p,
|
|
206
|
-
|
|
214
|
+
n,
|
|
207
215
|
o
|
|
208
216
|
),
|
|
209
217
|
pointerDown$: e,
|
|
210
218
|
pointerCancel$: a,
|
|
211
219
|
pointerLeave$: p,
|
|
212
|
-
pointerUp$:
|
|
220
|
+
pointerUp$: n,
|
|
213
221
|
pointerMove$: o
|
|
214
222
|
};
|
|
215
223
|
};
|
|
216
224
|
class F {
|
|
217
|
-
constructor(
|
|
225
|
+
constructor(i, e) {
|
|
218
226
|
$(this, "configSubject", new q({}));
|
|
219
227
|
$(this, "pan$");
|
|
220
228
|
$(this, "panStart$");
|
|
@@ -232,7 +240,7 @@ class F {
|
|
|
232
240
|
* Track active running failWith recognizers
|
|
233
241
|
*/
|
|
234
242
|
$(this, "failWithActive$");
|
|
235
|
-
const
|
|
243
|
+
const n = new q({
|
|
236
244
|
fingers: 0
|
|
237
245
|
});
|
|
238
246
|
this.pointerEvent$ = this.config$.pipe(
|
|
@@ -358,7 +366,7 @@ class F {
|
|
|
358
366
|
);
|
|
359
367
|
}),
|
|
360
368
|
K((p) => {
|
|
361
|
-
|
|
369
|
+
n.next({
|
|
362
370
|
fingers: p.pointers.length
|
|
363
371
|
});
|
|
364
372
|
}),
|
|
@@ -372,24 +380,24 @@ class F {
|
|
|
372
380
|
), this.panEnd$ = this.pan$.pipe(
|
|
373
381
|
h((p) => p.type === "end"),
|
|
374
382
|
c(({ type: p, ...a }) => a)
|
|
375
|
-
), this.state$ =
|
|
383
|
+
), this.state$ = n.asObservable(), this.updateInternal(i ?? {}, e);
|
|
376
384
|
}
|
|
377
|
-
updateInternal(
|
|
378
|
-
const
|
|
385
|
+
updateInternal(i, e) {
|
|
386
|
+
const n = this.configSubject.getValue();
|
|
379
387
|
this.configSubject.next({
|
|
380
|
-
...i,
|
|
381
388
|
...n,
|
|
382
|
-
...
|
|
383
|
-
|
|
389
|
+
...i,
|
|
390
|
+
...i.options && {
|
|
391
|
+
options: { ...n.options, ...i.options }
|
|
384
392
|
},
|
|
385
393
|
panConfig: {
|
|
386
|
-
...
|
|
394
|
+
...n.panConfig,
|
|
387
395
|
...e
|
|
388
396
|
}
|
|
389
397
|
});
|
|
390
398
|
}
|
|
391
|
-
update(
|
|
392
|
-
this.updateInternal(
|
|
399
|
+
update(i, e) {
|
|
400
|
+
this.updateInternal(i, e);
|
|
393
401
|
}
|
|
394
402
|
}
|
|
395
403
|
class Se extends F {
|
|
@@ -402,7 +410,7 @@ class Se extends F {
|
|
|
402
410
|
$(this, "events$");
|
|
403
411
|
$(this, "start$");
|
|
404
412
|
$(this, "end$");
|
|
405
|
-
const
|
|
413
|
+
const n = this.panStart$.pipe(
|
|
406
414
|
c((s) => ({
|
|
407
415
|
type: "panStart",
|
|
408
416
|
...s
|
|
@@ -423,7 +431,7 @@ class Se extends F {
|
|
|
423
431
|
...s
|
|
424
432
|
}))
|
|
425
433
|
);
|
|
426
|
-
this.events$ =
|
|
434
|
+
this.events$ = n.pipe(
|
|
427
435
|
v((s) => {
|
|
428
436
|
let r = s;
|
|
429
437
|
const l = T(s), u = this.failWithActive$.pipe(
|
|
@@ -452,7 +460,7 @@ class Se extends F {
|
|
|
452
460
|
super.update(e, e.options);
|
|
453
461
|
}
|
|
454
462
|
}
|
|
455
|
-
const we = (t) => (
|
|
463
|
+
const we = (t) => (i) => i.pipe(
|
|
456
464
|
h((e) => Math.abs(e.velocityX) >= t || Math.abs(e.velocityY) >= t)
|
|
457
465
|
);
|
|
458
466
|
class be extends F {
|
|
@@ -463,8 +471,8 @@ class be extends F {
|
|
|
463
471
|
});
|
|
464
472
|
$(this, "events$");
|
|
465
473
|
this.events$ = this.config$.pipe(
|
|
466
|
-
v((
|
|
467
|
-
const { escapeVelocity: o = 0.9 } =
|
|
474
|
+
v((n) => {
|
|
475
|
+
const { escapeVelocity: o = 0.9 } = n.options ?? {};
|
|
468
476
|
return this.panStart$.pipe(
|
|
469
477
|
C(this.failWithActive$),
|
|
470
478
|
h(([, p]) => !p),
|
|
@@ -493,22 +501,22 @@ class be extends F {
|
|
|
493
501
|
}
|
|
494
502
|
const Me = ({
|
|
495
503
|
timeout: t,
|
|
496
|
-
pointerEvent$:
|
|
504
|
+
pointerEvent$: i
|
|
497
505
|
}) => (e) => e.pipe(
|
|
498
506
|
b(
|
|
499
|
-
(
|
|
507
|
+
(n) => J(t).pipe(
|
|
500
508
|
I(
|
|
501
|
-
|
|
509
|
+
i.pipe(ne, U(n))
|
|
502
510
|
)
|
|
503
511
|
)
|
|
504
512
|
)
|
|
505
513
|
), xe = ({
|
|
506
514
|
initialPointerEvent: t,
|
|
507
|
-
pointerEvent$:
|
|
515
|
+
pointerEvent$: i,
|
|
508
516
|
tolerance: e
|
|
509
|
-
}) => (
|
|
517
|
+
}) => (n) => n.pipe(
|
|
510
518
|
b(
|
|
511
|
-
(o) =>
|
|
519
|
+
(o) => i.pipe(
|
|
512
520
|
U(o),
|
|
513
521
|
V((p) => !Z(p), !0),
|
|
514
522
|
h(
|
|
@@ -522,9 +530,9 @@ class Ce extends F {
|
|
|
522
530
|
super(e);
|
|
523
531
|
$(this, "events$");
|
|
524
532
|
this.events$ = this.config$.pipe(
|
|
525
|
-
v((
|
|
533
|
+
v((n) => {
|
|
526
534
|
var y, A;
|
|
527
|
-
const o = ((y =
|
|
535
|
+
const o = ((y = n.options) == null ? void 0 : y.maxTaps) ?? 1, p = ((A = n.options) == null ? void 0 : A.multiTapThreshold) ?? 100 * (o - 1), { maximumPressTime: a = 150, tolerance: s = 10 } = n.options ?? {}, r = this.pointerDown$.pipe(
|
|
528
536
|
ee({
|
|
529
537
|
pointerEvent$: this.pointerEvent$,
|
|
530
538
|
trackMove: !0
|
|
@@ -602,7 +610,7 @@ class Re extends F {
|
|
|
602
610
|
$(this, "events$");
|
|
603
611
|
this.events$ = this.config$.pipe(
|
|
604
612
|
v(() => {
|
|
605
|
-
const
|
|
613
|
+
const n = this.panStart$.pipe(
|
|
606
614
|
c((s) => ({
|
|
607
615
|
...s,
|
|
608
616
|
type: "rotateStart",
|
|
@@ -610,7 +618,7 @@ class Re extends F {
|
|
|
610
618
|
deltaAngle: 0
|
|
611
619
|
})),
|
|
612
620
|
M(1)
|
|
613
|
-
), o =
|
|
621
|
+
), o = n.pipe(
|
|
614
622
|
v(
|
|
615
623
|
() => this.pan$.pipe(
|
|
616
624
|
L((s, r) => {
|
|
@@ -632,7 +640,7 @@ class Re extends F {
|
|
|
632
640
|
h((s) => s.type === "end"),
|
|
633
641
|
c((s) => ({ ...s, type: "rotateEnd" }))
|
|
634
642
|
);
|
|
635
|
-
return g(
|
|
643
|
+
return g(n, p, a);
|
|
636
644
|
}),
|
|
637
645
|
P()
|
|
638
646
|
);
|
|
@@ -643,12 +651,12 @@ class Re extends F {
|
|
|
643
651
|
}
|
|
644
652
|
const Y = ({
|
|
645
653
|
type: t,
|
|
646
|
-
initialEvent:
|
|
654
|
+
initialEvent: i
|
|
647
655
|
}) => (e) => e.pipe(
|
|
648
|
-
L((
|
|
649
|
-
const a = ((
|
|
656
|
+
L((n, o) => {
|
|
657
|
+
const a = ((n == null ? void 0 : n.pointers.length) ?? 0) !== o.pointers.length, s = (n == null ? void 0 : n.pointersAverageDistance) ?? o.pointersAverageDistance, r = a ? o.pointersAverageDistance : n && "initialPointersAverageDistance" in n ? n.initialPointersAverageDistance : o.pointersAverageDistance, l = r === 0 ? 1 : o.pointersAverageDistance / r, u = o.pointersAverageDistance - r, m = o.pointersAverageDistance - r, y = a || s === 0 ? 1 : o.pointersAverageDistance / s;
|
|
650
658
|
return {
|
|
651
|
-
...
|
|
659
|
+
...n,
|
|
652
660
|
...o,
|
|
653
661
|
type: t,
|
|
654
662
|
initialPointersAverageDistance: r,
|
|
@@ -657,8 +665,8 @@ const Y = ({
|
|
|
657
665
|
deltaDistance: m,
|
|
658
666
|
deltaDistanceScale: y
|
|
659
667
|
};
|
|
660
|
-
},
|
|
661
|
-
c(({ initialPointersAverageDistance:
|
|
668
|
+
}, i),
|
|
669
|
+
c(({ initialPointersAverageDistance: n, ...o }) => o)
|
|
662
670
|
);
|
|
663
671
|
class ze extends F {
|
|
664
672
|
constructor(e) {
|
|
@@ -671,7 +679,7 @@ class ze extends F {
|
|
|
671
679
|
$(this, "end$");
|
|
672
680
|
this.events$ = this.config$.pipe(
|
|
673
681
|
v(() => {
|
|
674
|
-
const
|
|
682
|
+
const n = this.panStart$.pipe(
|
|
675
683
|
C(this.failWithActive$),
|
|
676
684
|
h(([, s]) => !s),
|
|
677
685
|
c(([s]) => s),
|
|
@@ -688,7 +696,7 @@ class ze extends F {
|
|
|
688
696
|
), o = this.failWithActive$.pipe(
|
|
689
697
|
h((s) => s),
|
|
690
698
|
z()
|
|
691
|
-
), p =
|
|
699
|
+
), p = n.pipe(
|
|
692
700
|
v((s) => this.pan$.pipe(
|
|
693
701
|
V((r) => r.type !== "end"),
|
|
694
702
|
Y({
|
|
@@ -697,7 +705,7 @@ class ze extends F {
|
|
|
697
705
|
})
|
|
698
706
|
)),
|
|
699
707
|
I(o)
|
|
700
|
-
), a =
|
|
708
|
+
), a = n.pipe(
|
|
701
709
|
v((s) => {
|
|
702
710
|
let r = s;
|
|
703
711
|
return this.pan$.pipe(
|
|
@@ -715,40 +723,40 @@ class ze extends F {
|
|
|
715
723
|
);
|
|
716
724
|
})
|
|
717
725
|
);
|
|
718
|
-
return g(
|
|
726
|
+
return g(n, p, a);
|
|
719
727
|
}),
|
|
720
728
|
P()
|
|
721
729
|
), this.start$ = this.events$.pipe(
|
|
722
|
-
h((
|
|
723
|
-
), this.end$ = this.events$.pipe(h((
|
|
730
|
+
h((n) => n.type === "pinchStart")
|
|
731
|
+
), this.end$ = this.events$.pipe(h((n) => n.type === "pinchEnd"));
|
|
724
732
|
}
|
|
725
733
|
update(e) {
|
|
726
734
|
super.update(e, e.options);
|
|
727
735
|
}
|
|
728
736
|
}
|
|
729
737
|
class ke {
|
|
730
|
-
constructor(
|
|
738
|
+
constructor(i) {
|
|
731
739
|
$(this, "events$");
|
|
732
740
|
$(this, "recognizers");
|
|
733
741
|
$(this, "state$");
|
|
734
|
-
this.options =
|
|
735
|
-
...
|
|
742
|
+
this.options = i, this.recognizers = i.recognizers, this.events$ = g(
|
|
743
|
+
...i.recognizers.map((e) => e.events$)
|
|
736
744
|
).pipe(P()), this.state$ = j(
|
|
737
745
|
this.recognizers.map((e) => e.state$)
|
|
738
746
|
).pipe(
|
|
739
747
|
c(
|
|
740
|
-
(e) => e.reduce((
|
|
741
|
-
fingers: Math.max(
|
|
748
|
+
(e) => e.reduce((n, o) => ({
|
|
749
|
+
fingers: Math.max(n.fingers, o.fingers)
|
|
742
750
|
}))
|
|
743
751
|
)
|
|
744
|
-
), this.update(
|
|
752
|
+
), this.update(i);
|
|
745
753
|
}
|
|
746
754
|
update({
|
|
747
|
-
disableTextSelection:
|
|
755
|
+
disableTextSelection: i,
|
|
748
756
|
...e
|
|
749
757
|
}) {
|
|
750
|
-
e.container && (e.container.style.touchAction = "none",
|
|
751
|
-
|
|
758
|
+
e.container && (e.container.style.touchAction = "none", i && (e.container.style.userSelect = "none")), this.options.recognizers.forEach((n) => {
|
|
759
|
+
n.update(e);
|
|
752
760
|
});
|
|
753
761
|
}
|
|
754
762
|
}
|
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/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n const pointerEvents$ = merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n\n return {\n pointerEvents$,\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 interface FailWith {\n start$: Observable<unknown>\n end$: Observable<unknown>\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: FailWith[]\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(\n ({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }).pointerEvents$,\n ),\n share(),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const panStarted$ = of(panStartEvent)\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const trailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, trailingEndEventIfFailed$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import {\n Observable,\n filter,\n map,\n share,\n switchMap,\n takeUntil,\n withLatestFrom,\n} 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 withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\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 takeUntil(\n this.failWithActive$.pipe(filter((isActive) => isActive)),\n ),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const scanPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n NEVER,\n Observable,\n defaultIfEmpty,\n filter,\n first,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n takeWhile,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = this.panStart$.pipe(\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n switchMap((event) =>\n of(event).pipe(\n // we don't want a scan on pinch start\n scanPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n scanPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n takeUntil(failingActive$),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) => {\n let latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent\n\n return this.pan$.pipe(\n switchMap((event) => {\n if (event.type === \"end\") {\n return of(event)\n }\n\n latestEvent = event\n\n return NEVER\n }),\n takeUntil(failingActive$),\n defaultIfEmpty(null),\n map((endEventOrNull) =>\n endEventOrNull ? endEventOrNull : latestEvent,\n ),\n scanPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: latestEvent,\n }),\n share(),\n )\n }),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n recognizers: T\n /**\n * If you don't need to have text selection, set this to true\n * to improve dragging gesture. This will prevent accidental\n * text selection on your component.\n */\n disableTextSelection?: boolean\n} & RecognizerConfig<unknown>\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(protected options: RecognizableOptions<T>) {\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({\n disableTextSelection,\n ...rest\n }: Partial<RecognizableOptions<T>>) {\n if (rest.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 rest.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n if (disableTextSelection) {\n rest.container.style.userSelect = `none`\n }\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(rest)\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","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n (hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n /**\n * A pointercancel cean come after a drag event and heven being completely\n * desync, leading to erroned values. We should just ignore it.\n */\n curr.event.type === \"pointercancel\"\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 /**\n * A pointercancel cean come after a drag event and heven being completely\n * desync, leading to erroned values. We should just ignore it.\n */\n curr.event.type !== \"pointercancel\"\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 const pointerEvents$ = merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n\n return {\n pointerEvents$,\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 interface FailWith {\n start$: Observable<unknown>\n end$: Observable<unknown>\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: FailWith[]\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(\n ({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }).pointerEvents$,\n ),\n share(),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const panStarted$ = of(panStartEvent)\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const trailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, trailingEndEventIfFailed$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import {\n Observable,\n filter,\n map,\n share,\n switchMap,\n takeUntil,\n withLatestFrom,\n} 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 withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\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 takeUntil(\n this.failWithActive$.pipe(filter((isActive) => isActive)),\n ),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const scanPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n NEVER,\n Observable,\n defaultIfEmpty,\n filter,\n first,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n takeWhile,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = this.panStart$.pipe(\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n switchMap((event) =>\n of(event).pipe(\n // we don't want a scan on pinch start\n scanPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n scanPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n takeUntil(failingActive$),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) => {\n let latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent\n\n return this.pan$.pipe(\n switchMap((event) => {\n if (event.type === \"end\") {\n return of(event)\n }\n\n latestEvent = event\n\n return NEVER\n }),\n takeUntil(failingActive$),\n defaultIfEmpty(null),\n map((endEventOrNull) =>\n endEventOrNull ? endEventOrNull : latestEvent,\n ),\n scanPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: latestEvent,\n }),\n share(),\n )\n }),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n recognizers: T\n /**\n * If you don't need to have text selection, set this to true\n * to improve dragging gesture. This will prevent accidental\n * text selection on your component.\n */\n disableTextSelection?: boolean\n} & RecognizerConfig<unknown>\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(protected options: RecognizableOptions<T>) {\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({\n disableTextSelection,\n ...rest\n }: Partial<RecognizableOptions<T>>) {\n if (rest.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 rest.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n if (disableTextSelection) {\n rest.container.style.userSelect = `none`\n }\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(rest)\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","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function($,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):($=typeof globalThis<"u"?globalThis:$||self,e($.gesturx={},$.rxjs))})(this,function($,e){"use strict";var oe=Object.defineProperty;var ae=($,e,P)=>e in $?oe($,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):$[e]=P;var c=($,e,P)=>ae($,typeof e!="symbol"?e+"":e,P);function P(n,p){return Math.sqrt(Math.pow(p.x-n.x,2)+Math.pow(p.y-n.y,2))}function N(n){const p=n.length;if(p<2)return 0;const t=n.reduce((s,a,l)=>s+n.slice(l+1).reduce((o,r)=>o+P(a,r),0),0),i=p*(p-1)/2;return t/i}function I(n,p){const t=p.x-n.x,i=p.y-n.y;return Math.atan2(i,t)}function V(n,p){return I(n,p)*(180/Math.PI)}function E(n){const p=n.reduce((i,s)=>(i.x+=s.x,i.y+=s.y,i),{x:0,y:0}),t=n.length||1;return{x:p.x/t,y:p.y/t}}function B(n,p){if(n.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(n),i=E(p);let s=0;for(let o=0;o<n.length;o++){const r=I(t,n[o]);let u=I(i,p[o])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),s+=u}const a=s/n.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(n){return n!=null}const _=n=>n.length>0,G=n=>n.pipe(e.filter(_));function C(n,p,t){const i=E([n]),s=E([p]);return Math.abs(s.x-i.x)>=t||Math.abs(s.y-i.y)>=t}const H=(n,p,t)=>{const i=n>0?p/n:0,s=n>0?t/n:0;return{velocityX:i,velocityY:s}};function T(n){return p=>p.pipe(e.filter(t=>t.pointerId===n.pointerId))}const F=n=>n.type==="pointerleave"||n.type==="pointercancel"||n.type==="pointerup",J=({container:n,afterEventReceived:p=t=>t})=>e.fromEvent(n,"pointerdown").pipe(e.map(p)),L=({pointerEvent$:n})=>p=>{const t=n.pipe(e.filter(r=>r.type==="pointerup")),i=n.pipe(e.filter(r=>r.type==="pointerleave")),s=n.pipe(e.filter(r=>r.type==="pointercancel")),a=n.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),o=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return p.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,s,i,t,l)).pipe(T(r),e.takeWhile(f=>!o(f),!0))}),e.scan((r,h)=>{if(o(h)){const{[h.pointerId]:u,...f}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:f}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},U=(n,p,t,i)=>{const s=n.x-p.x+t,a=n.y-p.y+i;return{deltaX:s,deltaY:a}},O=n=>{const p=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return n.pipe(e.scan((t,i)=>{var v,M;const s=p(i),a=(t==null?void 0:t.center)??s,l=(t==null?void 0:t.deltaX)??0,o=(t==null?void 0:t.deltaY)??0,r=((v=t==null?void 0:t.latestActivePointers)==null?void 0:v.length)??1,h=((M=i.latestActivePointers)==null?void 0:M.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(i.event.type)&&r!==h,f=h>0,{deltaX:g,deltaY:m}=u&&f?U(s,s,l,o):U(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2?B((t==null?void 0:t.latestActivePointers)??[],i.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...i,center:s,deltaX:g,deltaY:m,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:i,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,u=a??[],g=Date.now()-l,{velocityX:m,velocityY:y}=H(g,i,s),v=N(a);return{deltaX:i,deltaY:s,velocityX:m,velocityY:y,delay:g,center:o,pointers:u,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:v}}))},W=n=>n.pipe(e.filter(p=>!!p.container)),X=n=>n.pipe(e.filter(F)),K=({container:n,afterEventReceived:p=t=>t})=>{const t=J({afterEventReceived:p,container:n}),i=e.fromEvent(n,"pointerup").pipe(e.map(p)),s=e.fromEvent(n,"pointermove").pipe(e.map(p)),a=e.fromEvent(n,"pointerleave").pipe(e.map(p)),l=e.fromEvent(n,"pointercancel").pipe(e.map(p));return{pointerEvents$:e.merge(t,l,a,i,s),pointerDown$:t,pointerCancel$:l,pointerLeave$:a,pointerUp$:i,pointerMove$:s}};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(W));c(this,"failWithActive$");const i=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}).pointerEvents$),e.share()),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X);const s=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=s.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(o=>{const r=o.start$.pipe(e.map(()=>!0)),h=o.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(W,e.switchMap(a=>{var g,m,y;const l=Math.max(1,((g=a.panConfig)==null?void 0:g.numInputs)??1),o=Math.max(0,((m=a.panConfig)==null?void 0:m.posThreshold)??0),r=Math.max(0,((y=a.panConfig)==null?void 0:y.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),u=v=>v.pipe(e.filter(M=>M.pointers.length>=l)),f=v=>v.pipe(e.filter(M=>M.pointers.length<l));return h.pipe(u,e.exhaustMap(({pointers:v})=>{const M=h.pipe(f,e.first(),e.share()),z=e.timer(r),R=e.merge(...v.map(d=>e.of(d)),this.pointerDown$).pipe(e.mergeMap(d=>e.merge(this.pointerMove$,e.of(d)).pipe(T(d),e.filter(A=>C(d,A,o)))),e.first()).pipe(e.switchMap(()=>z),e.withLatestFrom(h),e.map(([,{event:d,pointers:A}])=>({type:"start",event:d,latestActivePointers:A})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(M)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:d,pointers:A})=>({type:"move",event:d,latestActivePointers:A})))),e.takeUntil(M)),w=R.pipe(e.mergeMap(()=>M.pipe(e.map(({event:d,pointers:A})=>({type:"end",event:d,latestActivePointers:A}))))),b=e.merge(R,S,w).pipe(e.shareReplay(1));return b.pipe(O,e.withLatestFrom(b),e.map(([d,{type:A}])=>({...d,type:A})))}))}),e.tap(a=>{i.next({fingers:a.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(a=>a.type==="start"),e.map(({type:a,...l})=>l)),this.panMove$=this.pan$.pipe(e.filter(a=>a.type==="move"),e.map(({type:a,...l})=>l)),this.panEnd$=this.pan$.pipe(e.filter(a=>a.type==="end"),e.map(({type:a,...l})=>l)),this.state$=i.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const i=this.configSubject.getValue();this.configSubject.next({...i,...p,...p.options&&{options:{...i.options,...p.options}},panConfig:{...i.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const i=this.panStart$.pipe(e.map(o=>({type:"panStart",...o})),e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.share()),s=this.panEnd$.pipe(e.map(o=>({type:"panEnd",...o})),e.share()),a=this.panMove$.pipe(e.map(o=>({type:"panMove",...o})));this.events$=i.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),u=this.failWithActive$.pipe(e.filter(m=>m),e.first()),f=e.merge(h,a,s).pipe(e.tap(m=>{r=m}),e.takeUntil(u)),g=u.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge(f,g)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="panStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=n=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=n||Math.abs(t.velocityY)>=n));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(i=>{const{escapeVelocity:s=.9}=i.options??{};return this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,a])=>!a),e.switchMap(([a])=>this.panEnd$.pipe(Z(s),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})),e.takeUntil(this.failWithActive$.pipe(e.filter(l=>l))))),e.share())}))}update(t){super.update(t)}}const j=({timeout:n,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(i=>e.timer(n).pipe(e.takeUntil(p.pipe(X,T(i)))))),ee=({initialPointerEvent:n,pointerEvent$:p,tolerance:t})=>i=>i.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(n,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(i=>{var g,m;const s=((g=i.options)==null?void 0:g.maxTaps)??1,a=((m=i.options)==null?void 0:m.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=i.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),u=y=>y.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(y=>{const v=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),M=v.pipe(u),z=v.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=v.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(w=>w)),this.pointerCancel$,h,z,Y),S=M.pipe(G,e.filter(w=>w.length<=s),e.map(w=>({type:"tap",taps:w.length,latestActivePointers:w,event:w[0]})),e.shareReplay(1));return S.pipe(O,e.withLatestFrom(S),e.map(([w,{type:b,taps:d}])=>({...w,type:b,taps:d})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ne extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const i=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=i.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((o,r)=>{const h=((o==null?void 0:o.angle)??0)+r.deltaPointersAngle;return{...o,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=s.pipe(e.filter(o=>o.type==="move"),e.map(o=>({...o,type:"rotateMove"}))),l=s.pipe(e.filter(o=>o.type==="end"),e.map(o=>({...o,type:"rotateEnd"})));return e.merge(i,a,l)}),e.share())}update(t){super.update(t,t.options)}}const k=({type:n,initialEvent:p})=>t=>t.pipe(e.scan((i,s)=>{const l=((i==null?void 0:i.pointers.length)??0)!==s.pointers.length,o=(i==null?void 0:i.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:i&&"initialPointersAverageDistance"in i?i.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,u=s.pointersAverageDistance-r,f=s.pointersAverageDistance-r,g=l||o===0?1:s.pointersAverageDistance/o;return{...i,...s,type:n,initialPointersAverageDistance:r,scale:h,distance:u,deltaDistance:f,deltaDistanceScale:g}},p),e.map(({initialPointersAverageDistance:i,...s})=>s));class ie extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");c(this,"end$");this.events$=this.config$.pipe(e.switchMap(()=>{const i=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.switchMap(o=>e.of(o).pipe(k({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),s=this.failWithActive$.pipe(e.filter(o=>o),e.first()),a=i.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),k({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=i.pipe(e.switchMap(o=>{let r=o;return this.pan$.pipe(e.switchMap(h=>h.type==="end"?e.of(h):(r=h,e.NEVER)),e.takeUntil(s),e.defaultIfEmpty(null),e.map(h=>h||r),k({type:"pinchEnd",initialEvent:r}),e.share())}));return e.merge(i,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(i=>i.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(i=>i.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((i,s)=>({fingers:Math.max(i.fingers,s.fingers)})))),this.update(p)}update({disableTextSelection:p,...t}){t.container&&(t.container.style.touchAction="none",p&&(t.container.style.userSelect="none")),this.options.recognizers.forEach(i=>{i.update(t)})}}$.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(i,p){return Math.sqrt(Math.pow(p.x-i.x,2)+Math.pow(p.y-i.y,2))}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((s,a,l)=>s+i.slice(l+1).reduce((o,r)=>o+P(a,r),0),0),n=p*(p-1)/2;return t/n}function I(i,p){const t=p.x-i.x,n=p.y-i.y;return Math.atan2(n,t)}function V(i,p){return I(i,p)*(180/Math.PI)}function E(i){const p=i.reduce((n,s)=>(n.x+=s.x,n.y+=s.y,n),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=E(i),n=E(p);let s=0;for(let o=0;o<i.length;o++){const r=I(t,i[o]);let u=I(n,p[o])-r;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),s+=u}const a=s/i.length,l=a*(180/Math.PI);return{radianDelta:a,degreesDelta:l}}function q(i){return i!=null}const _=i=>i.length>0,G=i=>i.pipe(e.filter(_));function C(i,p,t){const n=E([i]),s=E([p]);return Math.abs(s.x-n.x)>=t||Math.abs(s.y-n.y)>=t}const H=(i,p,t)=>{const n=i>0?p/i:0,s=i>0?t/i:0;return{velocityX:n,velocityY:s}};function T(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const F=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",J=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),L=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(r=>r.type==="pointerup")),n=i.pipe(e.filter(r=>r.type==="pointerleave")),s=i.pipe(e.filter(r=>r.type==="pointercancel")),a=i.pipe(e.filter(r=>r.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),o=r=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(r.type);return p.pipe(e.mergeMap(r=>{const h=e.defer(()=>e.of(r));return e.merge(h,e.merge(a,s,n,t,l)).pipe(T(r),e.takeWhile(f=>!o(f),!0))}),e.scan((r,h)=>{if(o(h)){const{[h.pointerId]:u,...f}=(r==null?void 0:r.pointers)??{};return{event:h,pointers:f}}return{event:h,pointers:{...(r==null?void 0:r.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:r,pointers:h})=>({event:r,pointers:Object.values(h).filter(q)})))},U=(i,p,t,n)=>{const s=i.x-p.x+t,a=i.y-p.y+n;return{deltaX:s,deltaY:a}},O=i=>{const p=t=>E(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,n)=>{var v,M;const s=p(n),a=(t==null?void 0:t.center)??s,l=(t==null?void 0:t.deltaX)??0,o=(t==null?void 0:t.deltaY)??0,r=((v=t==null?void 0:t.latestActivePointers)==null?void 0:v.length)??1,h=((M=n.latestActivePointers)==null?void 0:M.length)??1,u=["pointerdown","pointercancel","pointerleave","pointerup"].includes(n.event.type)&&r!==h,f=h>0,{deltaX:g,deltaY:m}=u&&f||n.event.type==="pointercancel"?U(s,s,l,o):U(s,a,l,o),{degreesDelta:y}=r===h&&r>=2&&h>=2&&n.event.type!=="pointercancel"?B((t==null?void 0:t.latestActivePointers)??[],n.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...n,center:s,deltaX:g,deltaY:m,deltaPointersAngle:y}},void 0),e.map(t=>{const{deltaX:n,deltaY:s,latestActivePointers:a,startTime:l,center:o,event:r,deltaPointersAngle:h}=t,u=a??[],g=Date.now()-l,{velocityX:m,velocityY:y}=H(g,n,s),v=N(a);return{deltaX:n,deltaY:s,velocityX:m,velocityY:y,delay:g,center:o,pointers:u,startTime:l,event:r,deltaPointersAngle:h,pointersAverageDistance:v}}))},W=i=>i.pipe(e.filter(p=>!!p.container)),X=i=>i.pipe(e.filter(F)),K=({container:i,afterEventReceived:p=t=>t})=>{const t=J({afterEventReceived:p,container:i}),n=e.fromEvent(i,"pointerup").pipe(e.map(p)),s=e.fromEvent(i,"pointermove").pipe(e.map(p)),a=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return{pointerEvents$:e.merge(t,l,a,n,s),pointerDown$:t,pointerCancel$:l,pointerLeave$:a,pointerUp$:n,pointerMove$:s}};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"config$",this.configSubject.pipe(W));c(this,"failWithActive$");const n=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:a,afterEventReceived:l})=>K({container:a,afterEventReceived:l}).pointerEvents$),e.share()),this.pointerDown$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(a=>a.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X);const s=this.config$.pipe(e.map(({failWith:a})=>a),e.distinctUntilChanged());this.failWithActive$=s.pipe(e.switchMap(a=>{const l=a==null?void 0:a.map(o=>{const r=o.start$.pipe(e.map(()=>!0)),h=o.end$.pipe(e.map(()=>!1));return e.merge(r,h).pipe(e.startWith(!1),e.shareReplay(1))});return l!=null&&l.length?e.combineLatest(l):e.combineLatest([e.of(!1)])}),e.map(a=>a.some(l=>l)),e.shareReplay(1)),this.pan$=this.configSubject.pipe(W,e.switchMap(a=>{var g,m,y;const l=Math.max(1,((g=a.panConfig)==null?void 0:g.numInputs)??1),o=Math.max(0,((m=a.panConfig)==null?void 0:m.posThreshold)??0),r=Math.max(0,((y=a.panConfig)==null?void 0:y.delay)??0),h=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),u=v=>v.pipe(e.filter(M=>M.pointers.length>=l)),f=v=>v.pipe(e.filter(M=>M.pointers.length<l));return h.pipe(u,e.exhaustMap(({pointers:v})=>{const M=h.pipe(f,e.first(),e.share()),z=e.timer(r),R=e.merge(...v.map(d=>e.of(d)),this.pointerDown$).pipe(e.mergeMap(d=>e.merge(this.pointerMove$,e.of(d)).pipe(T(d),e.filter(A=>C(d,A,o)))),e.first()).pipe(e.switchMap(()=>z),e.withLatestFrom(h),e.map(([,{event:d,pointers:A}])=>({type:"start",event:d,latestActivePointers:A})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil(M)),S=R.pipe(e.mergeMap(()=>h.pipe(e.skip(1),e.map(({event:d,pointers:A})=>({type:"move",event:d,latestActivePointers:A})))),e.takeUntil(M)),w=R.pipe(e.mergeMap(()=>M.pipe(e.map(({event:d,pointers:A})=>({type:"end",event:d,latestActivePointers:A}))))),b=e.merge(R,S,w).pipe(e.shareReplay(1));return b.pipe(O,e.withLatestFrom(b),e.map(([d,{type:A}])=>({...d,type:A})))}))}),e.tap(a=>{n.next({fingers:a.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(a=>a.type==="start"),e.map(({type:a,...l})=>l)),this.panMove$=this.pan$.pipe(e.filter(a=>a.type==="move"),e.map(({type:a,...l})=>l)),this.panEnd$=this.pan$.pipe(e.filter(a=>a.type==="end"),e.map(({type:a,...l})=>l)),this.state$=n.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const n=this.configSubject.getValue();this.configSubject.next({...n,...p,...p.options&&{options:{...n.options,...p.options}},panConfig:{...n.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class Q extends D{constructor(t){var l;super(t,{...t,posThreshold:((l=t==null?void 0:t.options)==null?void 0:l.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const n=this.panStart$.pipe(e.map(o=>({type:"panStart",...o})),e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.share()),s=this.panEnd$.pipe(e.map(o=>({type:"panEnd",...o})),e.share()),a=this.panMove$.pipe(e.map(o=>({type:"panMove",...o})));this.events$=n.pipe(e.switchMap(o=>{let r=o;const h=e.of(o),u=this.failWithActive$.pipe(e.filter(m=>m),e.first()),f=e.merge(h,a,s).pipe(e.tap(m=>{r=m}),e.takeUntil(u)),g=u.pipe(e.map(()=>({...r,type:"panEnd"})),e.takeUntil(s));return e.merge(f,g)}),e.share()),this.start$=this.events$.pipe(e.filter(o=>o.type==="panStart")),this.end$=this.events$.pipe(e.filter(o=>o.type==="panEnd"))}update(t){super.update(t,t.options)}}const Z=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class x extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{const{escapeVelocity:s=.9}=n.options??{};return this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,a])=>!a),e.switchMap(([a])=>this.panEnd$.pipe(Z(s),e.map(l=>({type:"swipe",angle:V(a.event,l.event),...l})),e.takeUntil(this.failWithActive$.pipe(e.filter(l=>l))))),e.share())}))}update(t){super.update(t)}}const j=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(n=>e.timer(i).pipe(e.takeUntil(p.pipe(X,T(n)))))),ee=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>n=>n.pipe(e.mergeMap(s=>p.pipe(T(s),e.takeWhile(a=>!F(a),!0),e.filter(a=>C(i,a,t)))));class te extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(n=>{var g,m;const s=((g=n.options)==null?void 0:g.maxTaps)??1,a=((m=n.options)==null?void 0:m.multiTapThreshold)??100*(s-1),{maximumPressTime:l=150,tolerance:o=10}=n.options??{},r=this.pointerDown$.pipe(L({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=r.pipe(e.filter(({pointers:y})=>y.length>1)),u=y=>y.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(a))),e.first());return e.merge(this.pointerDown$,r.pipe(e.ignoreElements())).pipe(e.exhaustMap(y=>{const v=e.merge(e.of(y),this.pointerDown$).pipe(e.shareReplay(1)),M=v.pipe(u),z=v.pipe(ee({initialPointerEvent:y,pointerEvent$:this.pointerEvent$,tolerance:o})),Y=v.pipe(j({pointerEvent$:this.pointerEvent$,timeout:l})),R=e.merge(this.failWithActive$.pipe(e.filter(w=>w)),this.pointerCancel$,h,z,Y),S=M.pipe(G,e.filter(w=>w.length<=s),e.map(w=>({type:"tap",taps:w.length,latestActivePointers:w,event:w[0]})),e.shareReplay(1));return S.pipe(O,e.withLatestFrom(S),e.map(([w,{type:b,taps:d}])=>({...w,type:b,taps:d})),e.takeUntil(R))}))}),e.share())}update(t){super.update(t)}}class ne extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.map(o=>({...o,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),s=n.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((o,r)=>{const h=((o==null?void 0:o.angle)??0)+r.deltaPointersAngle;return{...o,...r,angle:h,deltaAngle:r.deltaPointersAngle}},void 0))),e.share()),a=s.pipe(e.filter(o=>o.type==="move"),e.map(o=>({...o,type:"rotateMove"}))),l=s.pipe(e.filter(o=>o.type==="end"),e.map(o=>({...o,type:"rotateEnd"})));return e.merge(n,a,l)}),e.share())}update(t){super.update(t,t.options)}}const k=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((n,s)=>{const l=((n==null?void 0:n.pointers.length)??0)!==s.pointers.length,o=(n==null?void 0:n.pointersAverageDistance)??s.pointersAverageDistance,r=l?s.pointersAverageDistance:n&&"initialPointersAverageDistance"in n?n.initialPointersAverageDistance:s.pointersAverageDistance,h=r===0?1:s.pointersAverageDistance/r,u=s.pointersAverageDistance-r,f=s.pointersAverageDistance-r,g=l||o===0?1:s.pointersAverageDistance/o;return{...n,...s,type:i,initialPointersAverageDistance:r,scale:h,distance:u,deltaDistance:f,deltaDistanceScale:g}},p),e.map(({initialPointersAverageDistance:n,...s})=>s));class ie extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");c(this,"end$");this.events$=this.config$.pipe(e.switchMap(()=>{const n=this.panStart$.pipe(e.withLatestFrom(this.failWithActive$),e.filter(([,o])=>!o),e.map(([o])=>o),e.switchMap(o=>e.of(o).pipe(k({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),s=this.failWithActive$.pipe(e.filter(o=>o),e.first()),a=n.pipe(e.switchMap(o=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),k({type:"pinchMove",initialEvent:o}))),e.takeUntil(s)),l=n.pipe(e.switchMap(o=>{let r=o;return this.pan$.pipe(e.switchMap(h=>h.type==="end"?e.of(h):(r=h,e.NEVER)),e.takeUntil(s),e.defaultIfEmpty(null),e.map(h=>h||r),k({type:"pinchEnd",initialEvent:r}),e.share())}));return e.merge(n,a,l)}),e.share()),this.start$=this.events$.pipe(e.filter(n=>n.type==="pinchStart")),this.end$=this.events$.pipe(e.filter(n=>n.type==="pinchEnd"))}update(t){super.update(t,t.options)}}class pe{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((n,s)=>({fingers:Math.max(n.fingers,s.fingers)})))),this.update(p)}update({disableTextSelection:p,...t}){t.container&&(t.container.style.touchAction="none",p&&(t.container.style.userSelect="none")),this.options.recognizers.forEach(n=>{n.update(t)})}}$.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/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n const pointerEvents$ = merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n\n return {\n pointerEvents$,\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 interface FailWith {\n start$: Observable<unknown>\n end$: Observable<unknown>\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: FailWith[]\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(\n ({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }).pointerEvents$,\n ),\n share(),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const panStarted$ = of(panStartEvent)\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const trailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, trailingEndEventIfFailed$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import {\n Observable,\n filter,\n map,\n share,\n switchMap,\n takeUntil,\n withLatestFrom,\n} 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 withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\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 takeUntil(\n this.failWithActive$.pipe(filter((isActive) => isActive)),\n ),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const scanPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n NEVER,\n Observable,\n defaultIfEmpty,\n filter,\n first,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n takeWhile,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = this.panStart$.pipe(\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n switchMap((event) =>\n of(event).pipe(\n // we don't want a scan on pinch start\n scanPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n scanPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n takeUntil(failingActive$),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) => {\n let latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent\n\n return this.pan$.pipe(\n switchMap((event) => {\n if (event.type === \"end\") {\n return of(event)\n }\n\n latestEvent = event\n\n return NEVER\n }),\n takeUntil(failingActive$),\n defaultIfEmpty(null),\n map((endEventOrNull) =>\n endEventOrNull ? endEventOrNull : latestEvent,\n ),\n scanPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: latestEvent,\n }),\n share(),\n )\n }),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n recognizers: T\n /**\n * If you don't need to have text selection, set this to true\n * to improve dragging gesture. This will prevent accidental\n * text selection on your component.\n */\n disableTextSelection?: boolean\n} & RecognizerConfig<unknown>\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(protected options: RecognizableOptions<T>) {\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({\n disableTextSelection,\n ...rest\n }: Partial<RecognizableOptions<T>>) {\n if (rest.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 rest.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n if (disableTextSelection) {\n rest.container.style.userSelect = `none`\n }\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(rest)\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","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n (hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n /**\n * A pointercancel cean come after a drag event and heven being completely\n * desync, leading to erroned values. We should just ignore it.\n */\n curr.event.type === \"pointercancel\"\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 /**\n * A pointercancel cean come after a drag event and heven being completely\n * desync, leading to erroned values. We should just ignore it.\n */\n curr.event.type !== \"pointercancel\"\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 const pointerEvents$ = merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n\n return {\n pointerEvents$,\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 interface FailWith {\n start$: Observable<unknown>\n end$: Observable<unknown>\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: FailWith[]\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(\n ({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }).pointerEvents$,\n ),\n share(),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n const failWith$ = this.config$.pipe(\n map(({ failWith }) => failWith),\n distinctUntilChanged(),\n )\n\n this.failWithActive$ = failWith$.pipe(\n switchMap((failWith) => {\n const areRunnings$ = failWith?.map((recognizer) => {\n const start$ = recognizer.start$.pipe(map(() => true))\n\n const end$ = recognizer.end$.pipe(map(() => false))\n\n const isRunning$ = merge(start$, end$).pipe(\n startWith(false),\n shareReplay(1),\n )\n\n return isRunning$\n })\n\n if (!areRunnings$?.length) {\n return combineLatest([of(false)])\n }\n\n return combineLatest(areRunnings$)\n }),\n map((runnings) => runnings.some((running) => running)),\n shareReplay(1),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import {\n Observable,\n filter,\n first,\n map,\n merge,\n of,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n const panMove$ = this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n )\n\n this.events$ = panStart$.pipe(\n switchMap((panStartEvent) => {\n let latestEvent: PanEvent = panStartEvent\n\n const panStarted$ = of(panStartEvent)\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n tap((event) => {\n latestEvent = event\n }),\n takeUntil(failingActive$),\n )\n\n const trailingEndEventIfFailed$ = failingActive$.pipe(\n map(() => ({\n ...latestEvent,\n type: \"panEnd\" as const,\n })),\n takeUntil(panEnd$),\n )\n\n return merge(events$, trailingEndEventIfFailed$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"panStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"))\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import {\n Observable,\n filter,\n map,\n share,\n switchMap,\n takeUntil,\n withLatestFrom,\n} 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 withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\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 takeUntil(\n this.failWithActive$.pipe(filter((isActive) => isActive)),\n ),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const maxTaps = config.options?.maxTaps ?? 1\n /**\n * We default to reasonable multiplier of 100 to give time\n * for each tap\n */\n const multiTapThreshold =\n config.options?.multiTapThreshold ?? 100 * (maxTaps - 1)\n\n const { maximumPressTime = 150, tolerance = 10 } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWithActive$.pipe(filter((active) => active)),\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const scanPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n NEVER,\n Observable,\n defaultIfEmpty,\n filter,\n first,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n takeWhile,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n public end$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = this.panStart$.pipe(\n withLatestFrom(this.failWithActive$),\n filter(([, failWithActive]) => !failWithActive),\n map(([event]) => event),\n switchMap((event) =>\n of(event).pipe(\n // we don't want a scan on pinch start\n scanPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const failingActive$ = this.failWithActive$.pipe(\n filter((isActive) => isActive),\n first(),\n )\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n scanPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n takeUntil(failingActive$),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) => {\n let latestEvent: PinchEvent | RecognizerPanEvent = pinchStartEvent\n\n return this.pan$.pipe(\n switchMap((event) => {\n if (event.type === \"end\") {\n return of(event)\n }\n\n latestEvent = event\n\n return NEVER\n }),\n takeUntil(failingActive$),\n defaultIfEmpty(null),\n map((endEventOrNull) =>\n endEventOrNull ? endEventOrNull : latestEvent,\n ),\n scanPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: latestEvent,\n }),\n share(),\n )\n }),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = this.events$.pipe(\n filter((event) => event.type === \"pinchStart\"),\n )\n\n this.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"))\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n recognizers: T\n /**\n * If you don't need to have text selection, set this to true\n * to improve dragging gesture. This will prevent accidental\n * text selection on your component.\n */\n disableTextSelection?: boolean\n} & RecognizerConfig<unknown>\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(protected options: RecognizableOptions<T>) {\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({\n disableTextSelection,\n ...rest\n }: Partial<RecognizableOptions<T>>) {\n if (rest.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 rest.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n if (disableTextSelection) {\n rest.container.style.userSelect = `none`\n }\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(rest)\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","share","failWith$","failWith","distinctUntilChanged","areRunnings$","recognizer","start$","end$","startWith","shareReplay","combineLatest","runnings","running","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","failWithActive","panMove$","panStartEvent","latestEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","maxTaps","multiTapThreshold","maximumPressTime","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","active","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","scanPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","NEVER","defaultIfEmpty","endEventOrNull","Recognizable","states","state","disableTextSelection"],"mappings":"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"}
|