gesturx 1.11.8 → 1.11.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +21 -0
- package/dist/index.js +88 -62
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,27 @@ export declare interface FailWith {
|
|
|
7
7
|
end$: Observable<unknown>;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
export declare interface HoldEvent extends RecognizerEvent {
|
|
11
|
+
type: "holdStart" | "holdEnd";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export declare class HoldRecognizer extends Recognizer<HoldRecognizerOptions, HoldEvent> implements HoldRecognizerInterface {
|
|
15
|
+
events$: Observable<HoldEvent>;
|
|
16
|
+
constructor(options?: RecognizerConfig<HoldRecognizerOptions>);
|
|
17
|
+
update(options: RecognizerConfig<HoldRecognizerOptions>): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
declare interface HoldRecognizerInterface extends Recognizer<HoldRecognizerOptions, HoldEvent> {
|
|
21
|
+
events$: Observable<HoldEvent>;
|
|
22
|
+
update(options: RecognizerConfig<HoldRecognizerOptions>): void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare interface HoldRecognizerOptions {
|
|
26
|
+
posThreshold?: number;
|
|
27
|
+
delay?: number;
|
|
28
|
+
numInputs?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
10
31
|
declare type PanConfig = {
|
|
11
32
|
posThreshold?: number;
|
|
12
33
|
delay?: number;
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ function j(e) {
|
|
|
24
24
|
y: t.y / n
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
function
|
|
27
|
+
function ee(e, t) {
|
|
28
28
|
if (e.length !== t.length) throw Error("Initial and new points arrays must have the same length.");
|
|
29
29
|
let n = j(e), r = j(t), i = 0;
|
|
30
30
|
e.forEach((e, a) => {
|
|
@@ -39,24 +39,24 @@ function M(e, t) {
|
|
|
39
39
|
}
|
|
40
40
|
//#endregion
|
|
41
41
|
//#region src/core/utils/utils.ts
|
|
42
|
-
function
|
|
42
|
+
function M(e) {
|
|
43
43
|
return e != null;
|
|
44
44
|
}
|
|
45
|
-
var
|
|
46
|
-
function
|
|
45
|
+
var N = (e) => e.length > 0, P = (e) => e.pipe(c(N));
|
|
46
|
+
function F(e, t, n) {
|
|
47
47
|
let r = j([e]), i = j([t]);
|
|
48
48
|
return Math.abs(i.x - r.x) >= n || Math.abs(i.y - r.y) >= n;
|
|
49
49
|
}
|
|
50
|
-
var
|
|
50
|
+
var I = (e, t, n) => ({
|
|
51
51
|
velocityX: e > 0 ? t / e : 0,
|
|
52
52
|
velocityY: e > 0 ? n / e : 0
|
|
53
53
|
});
|
|
54
54
|
//#endregion
|
|
55
55
|
//#region src/core/utils/events.ts
|
|
56
|
-
function
|
|
56
|
+
function L(e) {
|
|
57
57
|
return (t) => t.pipe(c((t) => t.pointerId === e.pointerId));
|
|
58
58
|
}
|
|
59
|
-
var
|
|
59
|
+
var R = (e) => e.type === "pointerleave" || e.type === "pointercancel" || e.type === "pointerup", z = (e) => e.button === 0, B = ({ container: e, afterEventReceived: t = (e) => e }) => u(e, "pointerdown").pipe(f(t), c(z)), V = ({ pointerEvent$: e }) => (t) => {
|
|
60
60
|
let n = e.pipe(c((e) => e.type === "pointerup")), r = e.pipe(c((e) => e.type === "pointerleave")), i = e.pipe(c((e) => e.type === "pointercancel")), o = e.pipe(c((e) => e.type === "pointermove")), s = u(window, "contextmenu"), l = (e) => [
|
|
61
61
|
"pointercancel",
|
|
62
62
|
"pointerleave",
|
|
@@ -65,7 +65,7 @@ var z = (e) => e.type === "pointerleave" || e.type === "pointercancel" || e.type
|
|
|
65
65
|
].includes(e.type);
|
|
66
66
|
return t.pipe(m((e) => {
|
|
67
67
|
let t = a(() => h(e));
|
|
68
|
-
return p(t, p(o, i, r, n, s)).pipe(
|
|
68
|
+
return p(t, p(o, i, r, n, s)).pipe(L(e), C((e) => !l(e), !0));
|
|
69
69
|
}), g((e, t) => {
|
|
70
70
|
if (l(t)) {
|
|
71
71
|
let { [t.pointerId]: n, ...r } = (e == null ? void 0 : e.pointers) ?? {};
|
|
@@ -83,12 +83,15 @@ var z = (e) => e.type === "pointerleave" || e.type === "pointercancel" || e.type
|
|
|
83
83
|
};
|
|
84
84
|
}, void 0), f(({ event: e, pointers: t }) => ({
|
|
85
85
|
event: e,
|
|
86
|
-
pointers: Object.values(t).filter(
|
|
86
|
+
pointers: Object.values(t).filter(M)
|
|
87
87
|
})));
|
|
88
|
-
}, H = (
|
|
88
|
+
}, H = () => v({
|
|
89
|
+
bufferSize: 1,
|
|
90
|
+
refCount: !0
|
|
91
|
+
}), U = (e) => e.pipe(c((e) => !!e.container)), W = (e) => e.pipe(c(R)), G = (e, t, n, r) => ({
|
|
89
92
|
deltaX: e.x - t.x + n,
|
|
90
93
|
deltaY: e.y - t.y + r
|
|
91
|
-
}),
|
|
94
|
+
}), K = (e) => {
|
|
92
95
|
let t = (e) => j(e.latestActivePointers.length ? e.latestActivePointers : [e.event]);
|
|
93
96
|
return e.pipe(g((e, n) => {
|
|
94
97
|
var r, i;
|
|
@@ -97,7 +100,7 @@ var z = (e) => e.type === "pointerleave" || e.type === "pointercancel" || e.type
|
|
|
97
100
|
"pointercancel",
|
|
98
101
|
"pointerleave",
|
|
99
102
|
"pointerup"
|
|
100
|
-
].includes(n.event.type) && l !== u && u > 0 || n.event.type === "pointercancel" ?
|
|
103
|
+
].includes(n.event.type) && l !== u && u > 0 || n.event.type === "pointercancel" ? G(a, a, s, c) : G(a, o, s, c), { degreesDelta: p } = l === u && l >= 2 && u >= 2 && n.event.type !== "pointercancel" ? ee((e == null ? void 0 : e.latestActivePointers) ?? [], n.latestActivePointers ?? []) : { degreesDelta: 0 };
|
|
101
104
|
return {
|
|
102
105
|
startTime: Date.now(),
|
|
103
106
|
...e,
|
|
@@ -108,7 +111,7 @@ var z = (e) => e.type === "pointerleave" || e.type === "pointercancel" || e.type
|
|
|
108
111
|
deltaPointersAngle: p
|
|
109
112
|
};
|
|
110
113
|
}, void 0), f((e) => {
|
|
111
|
-
let { deltaX: t, deltaY: n, latestActivePointers: r, startTime: i, center: a, event: o, deltaPointersAngle: s } = e, c = r ?? [], l = Date.now() - i, { velocityX: u, velocityY: d } =
|
|
114
|
+
let { deltaX: t, deltaY: n, latestActivePointers: r, startTime: i, center: a, event: o, deltaPointersAngle: s } = e, c = r ?? [], l = Date.now() - i, { velocityX: u, velocityY: d } = I(l, t, n);
|
|
112
115
|
return {
|
|
113
116
|
deltaX: t,
|
|
114
117
|
deltaY: n,
|
|
@@ -123,7 +126,7 @@ var z = (e) => e.type === "pointerleave" || e.type === "pointercancel" || e.type
|
|
|
123
126
|
pointersAverageDistance: O(r)
|
|
124
127
|
};
|
|
125
128
|
}));
|
|
126
|
-
},
|
|
129
|
+
}, q = ({ container: e, afterEventReceived: t = (e) => e }) => {
|
|
127
130
|
let n = B({
|
|
128
131
|
afterEventReceived: t,
|
|
129
132
|
container: e
|
|
@@ -139,36 +142,36 @@ var z = (e) => e.type === "pointerleave" || e.type === "pointercancel" || e.type
|
|
|
139
142
|
};
|
|
140
143
|
//#endregion
|
|
141
144
|
//#region \0@oxc-project+runtime@0.151.0/helpers/esm/typeof.js
|
|
142
|
-
function
|
|
145
|
+
function J(e) {
|
|
143
146
|
"@babel/helpers - typeof";
|
|
144
|
-
return
|
|
147
|
+
return J = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(e) {
|
|
145
148
|
return typeof e;
|
|
146
149
|
} : function(e) {
|
|
147
150
|
return e && typeof Symbol == "function" && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e;
|
|
148
|
-
},
|
|
151
|
+
}, J(e);
|
|
149
152
|
}
|
|
150
153
|
//#endregion
|
|
151
154
|
//#region \0@oxc-project+runtime@0.151.0/helpers/esm/toPrimitive.js
|
|
152
|
-
function
|
|
153
|
-
if (
|
|
155
|
+
function Y(e, t) {
|
|
156
|
+
if (J(e) != "object" || !e) return e;
|
|
154
157
|
var n = e[Symbol.toPrimitive];
|
|
155
158
|
if (n !== void 0) {
|
|
156
159
|
var r = n.call(e, t || "default");
|
|
157
|
-
if (
|
|
160
|
+
if (J(r) != "object") return r;
|
|
158
161
|
throw TypeError("@@toPrimitive must return a primitive value.");
|
|
159
162
|
}
|
|
160
163
|
return (t === "string" ? String : Number)(e);
|
|
161
164
|
}
|
|
162
165
|
//#endregion
|
|
163
166
|
//#region \0@oxc-project+runtime@0.151.0/helpers/esm/toPropertyKey.js
|
|
164
|
-
function
|
|
165
|
-
var t =
|
|
166
|
-
return
|
|
167
|
+
function X(e) {
|
|
168
|
+
var t = Y(e, "string");
|
|
169
|
+
return J(t) == "symbol" ? t : t + "";
|
|
167
170
|
}
|
|
168
171
|
//#endregion
|
|
169
172
|
//#region \0@oxc-project+runtime@0.151.0/helpers/esm/defineProperty.js
|
|
170
|
-
function
|
|
171
|
-
return (t =
|
|
173
|
+
function Z(e, t, n) {
|
|
174
|
+
return (t = X(t)) in e ? Object.defineProperty(e, t, {
|
|
172
175
|
value: n,
|
|
173
176
|
enumerable: !0,
|
|
174
177
|
configurable: !0,
|
|
@@ -177,36 +180,33 @@ function X(e, t, n) {
|
|
|
177
180
|
}
|
|
178
181
|
//#endregion
|
|
179
182
|
//#region src/core/recognizer/Recognizer.ts
|
|
180
|
-
var
|
|
183
|
+
var Q = class {
|
|
181
184
|
constructor(t, r) {
|
|
182
|
-
|
|
185
|
+
Z(this, "configSubject", new e({})), Z(this, "pan$", void 0), Z(this, "panStart$", void 0), Z(this, "panMove$", void 0), Z(this, "panEnd$", void 0), Z(this, "pointerEvent$", void 0), Z(this, "pointerDown$", void 0), Z(this, "pointerUp$", void 0), Z(this, "pointerCancel$", void 0), Z(this, "pointerMove$", void 0), Z(this, "pointerOff$", void 0), Z(this, "state$", void 0), Z(this, "config$", this.configSubject.pipe(U)), Z(this, "failWithActive$", void 0);
|
|
183
186
|
let i = new e({ fingers: 0 });
|
|
184
|
-
this.pointerEvent$ = this.config$.pipe(x(({ container: e, afterEventReceived: t }) =>
|
|
187
|
+
this.pointerEvent$ = this.config$.pipe(x(({ container: e, afterEventReceived: t }) => q({
|
|
185
188
|
container: e,
|
|
186
189
|
afterEventReceived: t
|
|
187
|
-
}).pointerEvents$), _()), this.pointerDown$ = this.pointerEvent$.pipe(c((e) => e.type === "pointerdown")), this.pointerUp$ = this.pointerEvent$.pipe(c((e) => e.type === "pointerup")), this.pointerMove$ = this.pointerEvent$.pipe(c((e) => e.type === "pointermove")), this.pointerCancel$ = this.pointerEvent$.pipe(c((e) => e.type === "pointercancel")), this.pointerOff$ = this.pointerEvent$.pipe(
|
|
190
|
+
}).pointerEvents$), _()), this.pointerDown$ = this.pointerEvent$.pipe(c((e) => e.type === "pointerdown")), this.pointerUp$ = this.pointerEvent$.pipe(c((e) => e.type === "pointerup")), this.pointerMove$ = this.pointerEvent$.pipe(c((e) => e.type === "pointermove")), this.pointerCancel$ = this.pointerEvent$.pipe(c((e) => e.type === "pointercancel")), this.pointerOff$ = this.pointerEvent$.pipe(W);
|
|
188
191
|
let a = this.config$.pipe(f(({ failWith: e }) => e), o());
|
|
189
192
|
this.failWithActive$ = a.pipe(x((e) => {
|
|
190
193
|
let t = e == null ? void 0 : e.map((e) => {
|
|
191
194
|
let t = e.start$.pipe(f(() => !0)), n = e.end$.pipe(f(() => !1));
|
|
192
|
-
return p(t, n).pipe(b(!1)
|
|
195
|
+
return p(t, n).pipe(b(!1));
|
|
193
196
|
});
|
|
194
197
|
return t != null && t.length ? n(t) : n([h(!1)]);
|
|
195
|
-
}), f((e) => e.some((e) => e)), v(1)), this.pan$ = this.configSubject.pipe(
|
|
198
|
+
}), f((e) => e.some((e) => e)), v(1)), this.pan$ = this.configSubject.pipe(U, x((e) => {
|
|
196
199
|
var t, n, r;
|
|
197
200
|
let i = Math.max(1, ((t = e.panConfig) == null ? void 0 : t.numInputs) ?? 1), a = Math.max(0, ((n = e.panConfig) == null ? void 0 : n.posThreshold) ?? 0), o = Math.max(0, ((r = e.panConfig) == null ? void 0 : r.delay) ?? 0), u = this.pointerDown$.pipe(V({
|
|
198
201
|
pointerEvent$: this.pointerEvent$,
|
|
199
202
|
trackMove: !0
|
|
200
|
-
}),
|
|
203
|
+
}), H()), d = (e) => e.pipe(c((e) => e.pointers.length >= i)), g = (e) => e.pipe(c((e) => e.pointers.length < i));
|
|
201
204
|
return u.pipe(d, s(({ pointers: e }) => {
|
|
202
|
-
let t = u.pipe(g, l(), _()), n = T(o), r = p(...e.map((e) => h(e)), this.pointerDown$).pipe(m((e) => p(this.pointerMove$, h(e)).pipe(
|
|
205
|
+
let t = u.pipe(g, l(), _()), n = T(o), r = p(...e.map((e) => h(e)), this.pointerDown$).pipe(m((e) => p(this.pointerMove$, h(e)).pipe(L(e), c((t) => F(e, t, a)))), l()).pipe(x(() => n), E(u), f(([, { event: e, pointers: t }]) => ({
|
|
203
206
|
type: "start",
|
|
204
207
|
event: e,
|
|
205
208
|
latestActivePointers: t
|
|
206
|
-
})),
|
|
207
|
-
bufferSize: 1,
|
|
208
|
-
refCount: !1
|
|
209
|
-
}), S(t)), i = r.pipe(m(() => u.pipe(y(1), f(({ event: e, pointers: t }) => ({
|
|
209
|
+
})), H(), S(t)), i = r.pipe(m(() => u.pipe(y(1), f(({ event: e, pointers: t }) => ({
|
|
210
210
|
type: "move",
|
|
211
211
|
event: e,
|
|
212
212
|
latestActivePointers: t
|
|
@@ -214,15 +214,15 @@ var Z = class {
|
|
|
214
214
|
type: "end",
|
|
215
215
|
event: e,
|
|
216
216
|
latestActivePointers: t
|
|
217
|
-
}))))), d = p(r, i, s).pipe(
|
|
218
|
-
return d.pipe(
|
|
217
|
+
}))))), d = p(r, i, s).pipe(H());
|
|
218
|
+
return d.pipe(K, E(d), f(([e, { type: t }]) => ({
|
|
219
219
|
...e,
|
|
220
220
|
type: t
|
|
221
221
|
})));
|
|
222
222
|
}));
|
|
223
223
|
}), w((e) => {
|
|
224
224
|
i.next({ fingers: e.pointers.length });
|
|
225
|
-
}), _()), this.panStart$ = this.pan$.pipe(c((e) => e.type === "start"), f(({ type: e, ...t }) => t)), this.panMove$ = this.pan$.pipe(c((e) => e.type === "move"), f(({ type: e, ...t }) => t)), this.panEnd$ = this.pan$.pipe(c((e) => e.type === "end"), f(({ type: e, ...t }) => t)), this.state$ = i.asObservable(), this.updateInternal(t ?? {}, r);
|
|
225
|
+
}), _({ resetOnRefCountZero: () => T(0) })), this.panStart$ = this.pan$.pipe(c((e) => e.type === "start"), f(({ type: e, ...t }) => t)), this.panMove$ = this.pan$.pipe(c((e) => e.type === "move"), f(({ type: e, ...t }) => t)), this.panEnd$ = this.pan$.pipe(c((e) => e.type === "end"), f(({ type: e, ...t }) => t)), this.state$ = i.asObservable(), this.updateInternal(t ?? {}, r);
|
|
226
226
|
}
|
|
227
227
|
updateInternal(e, t) {
|
|
228
228
|
let n = this.configSubject.getValue();
|
|
@@ -242,13 +242,39 @@ var Z = class {
|
|
|
242
242
|
update(e, t) {
|
|
243
243
|
this.updateInternal(e, t);
|
|
244
244
|
}
|
|
245
|
-
},
|
|
245
|
+
}, te = class extends Q {
|
|
246
|
+
constructor(e = {}) {
|
|
247
|
+
super(e, {
|
|
248
|
+
numInputs: 1,
|
|
249
|
+
delay: 0,
|
|
250
|
+
posThreshold: 0,
|
|
251
|
+
...e.options
|
|
252
|
+
}), Z(this, "events$", void 0);
|
|
253
|
+
let t = this.panStart$.pipe(E(this.failWithActive$), c(([, e]) => !e), f(([e]) => ({
|
|
254
|
+
type: "holdStart",
|
|
255
|
+
...e
|
|
256
|
+
})));
|
|
257
|
+
this.events$ = t.pipe(x((e) => {
|
|
258
|
+
let t = this.failWithActive$.pipe(c((e) => e), l()), n = this.panEnd$.pipe(l(), f((e) => ({
|
|
259
|
+
type: "holdEnd",
|
|
260
|
+
...e
|
|
261
|
+
})), S(t)), r = t.pipe(f(() => ({
|
|
262
|
+
...e,
|
|
263
|
+
type: "holdEnd"
|
|
264
|
+
})), S(this.panEnd$));
|
|
265
|
+
return p(h(e), n, r);
|
|
266
|
+
}), _());
|
|
267
|
+
}
|
|
268
|
+
update(e) {
|
|
269
|
+
super.update(e, e.options);
|
|
270
|
+
}
|
|
271
|
+
}, ne = class extends Q {
|
|
246
272
|
constructor(e) {
|
|
247
273
|
var t;
|
|
248
274
|
super(e, {
|
|
249
275
|
...e == null ? void 0 : e.options,
|
|
250
276
|
posThreshold: (e == null || (t = e.options) == null ? void 0 : t.posThreshold) ?? 15
|
|
251
|
-
}),
|
|
277
|
+
}), Z(this, "events$", void 0), Z(this, "start$", void 0), Z(this, "end$", void 0);
|
|
252
278
|
let n = this.panStart$.pipe(f((e) => ({
|
|
253
279
|
type: "panStart",
|
|
254
280
|
...e
|
|
@@ -284,16 +310,16 @@ var Z = class {
|
|
|
284
310
|
deltaDistance: c,
|
|
285
311
|
deltaDistanceScale: l
|
|
286
312
|
};
|
|
287
|
-
}, t), f(({ initialPointersAverageDistance: e, ...t }) => t)),
|
|
313
|
+
}, t), f(({ initialPointersAverageDistance: e, ...t }) => t)), re = class extends Q {
|
|
288
314
|
constructor(e) {
|
|
289
315
|
super(e, {
|
|
290
316
|
...e == null ? void 0 : e.options,
|
|
291
317
|
numInputs: 2
|
|
292
|
-
}),
|
|
318
|
+
}), Z(this, "events$", void 0), Z(this, "start$", void 0), Z(this, "end$", void 0), this.events$ = this.config$.pipe(x(() => {
|
|
293
319
|
let e, t = this.panStart$.pipe(E(this.failWithActive$), c(([, e]) => !e), f(([e]) => e), x((e) => h(e).pipe($({
|
|
294
320
|
type: "pinchStart",
|
|
295
321
|
initialEvent: void 0
|
|
296
|
-
}))),
|
|
322
|
+
}))), H()), n = this.failWithActive$.pipe(c((e) => e), l()), r = t.pipe(x((e) => this.pan$.pipe(C((e) => e.type !== "end"), $({
|
|
297
323
|
type: "pinchMove",
|
|
298
324
|
initialEvent: e
|
|
299
325
|
}), S(n)))), a = t.pipe(x((t) => this.pan$.pipe(c((e) => e.type === "end"), S(n), i(null), f((n) => {
|
|
@@ -315,9 +341,9 @@ var Z = class {
|
|
|
315
341
|
update(e) {
|
|
316
342
|
super.update(e, e.options);
|
|
317
343
|
}
|
|
318
|
-
},
|
|
344
|
+
}, ie = class {
|
|
319
345
|
constructor(e) {
|
|
320
|
-
|
|
346
|
+
Z(this, "options", void 0), Z(this, "events$", void 0), Z(this, "recognizers", void 0), Z(this, "state$", void 0), this.options = e, this.recognizers = e.recognizers, this.events$ = p(...e.recognizers.map((e) => e.events$.pipe(f((t) => ({
|
|
321
347
|
event: t,
|
|
322
348
|
recognizer: e
|
|
323
349
|
}))))).pipe(_()), this.state$ = n(this.recognizers.map((e) => e.state$)).pipe(f((e) => e.reduce((e, t) => ({ fingers: Math.max(e.fingers, t.fingers) })))), this.update(e);
|
|
@@ -326,19 +352,19 @@ var Z = class {
|
|
|
326
352
|
t.container && (t.container.style.touchAction = "none", e && (t.container.style.userSelect = "none"));
|
|
327
353
|
for (let e of this.options.recognizers) e.update(t);
|
|
328
354
|
}
|
|
329
|
-
},
|
|
355
|
+
}, ae = class extends Q {
|
|
330
356
|
constructor(e = {}) {
|
|
331
357
|
super(e, {
|
|
332
358
|
numInputs: 2,
|
|
333
359
|
posThreshold: 15,
|
|
334
360
|
...e.options
|
|
335
|
-
}),
|
|
361
|
+
}), Z(this, "events$", void 0), this.events$ = this.config$.pipe(x(() => {
|
|
336
362
|
let e = this.panStart$.pipe(E(this.failWithActive$), c(([, e]) => !e), f(([e]) => ({
|
|
337
363
|
...e,
|
|
338
364
|
type: "rotateStart",
|
|
339
365
|
angle: 0,
|
|
340
366
|
deltaAngle: 0
|
|
341
|
-
})),
|
|
367
|
+
})), H()), t = e.pipe(x((e) => {
|
|
342
368
|
let t = {
|
|
343
369
|
...e,
|
|
344
370
|
type: "start"
|
|
@@ -371,14 +397,14 @@ var Z = class {
|
|
|
371
397
|
update(e) {
|
|
372
398
|
super.update(e, e.options);
|
|
373
399
|
}
|
|
374
|
-
},
|
|
400
|
+
}, oe = (e) => (t) => t.pipe(c((t) => Math.abs(t.velocityX) >= e || Math.abs(t.velocityY) >= e)), se = class extends Q {
|
|
375
401
|
constructor(e) {
|
|
376
402
|
super(e, {
|
|
377
403
|
posThreshold: 0,
|
|
378
404
|
numInputs: 1
|
|
379
|
-
}),
|
|
405
|
+
}), Z(this, "events$", void 0), this.events$ = this.config$.pipe(x((e) => {
|
|
380
406
|
let { escapeVelocity: t = .9 } = e.options ?? {};
|
|
381
|
-
return this.panStart$.pipe(E(this.failWithActive$), c(([, e]) => !e), x(([e]) => this.panEnd$.pipe(
|
|
407
|
+
return this.panStart$.pipe(E(this.failWithActive$), c(([, e]) => !e), x(([e]) => this.panEnd$.pipe(oe(t), f((t) => ({
|
|
382
408
|
type: "swipe",
|
|
383
409
|
angle: A(e.event, t.event),
|
|
384
410
|
...t
|
|
@@ -388,29 +414,29 @@ var Z = class {
|
|
|
388
414
|
update(e) {
|
|
389
415
|
super.update(e);
|
|
390
416
|
}
|
|
391
|
-
},
|
|
417
|
+
}, ce = ({ timeout: e, pointerEvent$: t }) => (n) => n.pipe(m((n) => T(e).pipe(S(t.pipe(W, L(n)))))), le = ({ initialPointerEvent: e, pointerEvent$: t, tolerance: n }) => (r) => r.pipe(m((r) => t.pipe(L(r), C((e) => !R(e), !0), c((t) => F(e, t, n))))), ue = class extends Q {
|
|
392
418
|
constructor(e) {
|
|
393
|
-
super(e),
|
|
419
|
+
super(e), Z(this, "events$", void 0), this.events$ = this.config$.pipe(x((e) => {
|
|
394
420
|
var n, i;
|
|
395
421
|
let a = ((n = e.options) == null ? void 0 : n.maxTaps) ?? 1, o = ((i = e.options) == null ? void 0 : i.multiTapThreshold) ?? 100 * (a - 1), { maximumPressTime: u = 150, tolerance: m = 10 } = e.options ?? {}, g = this.pointerDown$.pipe(V({
|
|
396
422
|
pointerEvent$: this.pointerEvent$,
|
|
397
423
|
trackMove: !0
|
|
398
|
-
}),
|
|
424
|
+
}), H()), _ = g.pipe(c(({ pointers: e }) => e.length > 1)), v = (e) => e.pipe(t(this.pointerUp$.pipe(r(o))), l());
|
|
399
425
|
return p(this.pointerDown$, g.pipe(d())).pipe(s((e) => {
|
|
400
|
-
let t = p(h(e), this.pointerDown$).pipe(
|
|
426
|
+
let t = p(h(e), this.pointerDown$).pipe(H()), n = t.pipe(v), r = t.pipe(le({
|
|
401
427
|
initialPointerEvent: e,
|
|
402
428
|
pointerEvent$: this.pointerEvent$,
|
|
403
429
|
tolerance: m
|
|
404
|
-
})), i = t.pipe(
|
|
430
|
+
})), i = t.pipe(ce({
|
|
405
431
|
pointerEvent$: this.pointerEvent$,
|
|
406
432
|
timeout: u
|
|
407
|
-
})), o = p(this.failWithActive$.pipe(c((e) => e)), this.pointerCancel$, _, r, i), s = n.pipe(
|
|
433
|
+
})), o = p(this.failWithActive$.pipe(c((e) => e)), this.pointerCancel$, _, r, i), s = n.pipe(P, c((e) => e.length <= a), f((e) => ({
|
|
408
434
|
type: "tap",
|
|
409
435
|
taps: e.length,
|
|
410
436
|
latestActivePointers: e,
|
|
411
437
|
event: e[0]
|
|
412
|
-
})),
|
|
413
|
-
return s.pipe(
|
|
438
|
+
})), H());
|
|
439
|
+
return s.pipe(K, E(s), f(([e, { type: t, taps: n }]) => ({
|
|
414
440
|
...e,
|
|
415
441
|
type: t,
|
|
416
442
|
taps: n
|
|
@@ -423,6 +449,6 @@ var Z = class {
|
|
|
423
449
|
}
|
|
424
450
|
};
|
|
425
451
|
//#endregion
|
|
426
|
-
export {
|
|
452
|
+
export { te as HoldRecognizer, ne as PanRecognizer, re as PinchRecognizer, ie as Recognizable, Q as Recognizer, ae as RotateRecognizer, se as SwipeRecognizer, ue as TapRecognizer };
|
|
427
453
|
|
|
428
454
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["calculateDistance","pointB","pointA","calculateAverageDistance","n","pointerEvents","sum","i","innerSum","event1","event2","calculateRadianAngleBetweenPoints","deltaX","pointerB","pointerA","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","point","acc","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","initialPoint","angleDelta","index","radianDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","start","startEvent","end","endEvent","posThreshold","calculateVelocity","delay","matchPointer","newPointer","pointer","isPointerOffEvent","pointerEvent","isPrimaryButtonPress","event","fromPointerDown","fromEvent","container","map","afterEventReceived","trackPointers","pointerUp$","pointerEvent$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown$","defer","of","pointerDown","merge","takeWhile","scan","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","_acc$latestActivePoin","_curr$latestActivePoi","curr","prevActivePointersNumber","currActivePointersNumber","deltaPointersAngle","latestActivePointers","startTime","getPointerEvents","_typeof","o","toPrimitive","t","e","r","toPropertyKey","_defineProperty","Recognizer","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","start$","recognizer","end$","startWith","shareReplay","combineLatest","runnings","running","_config$panConfig","_config$panConfig2","_config$panConfig3","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","tap","panConfig","existingConfig","PanRecognizer","_config$options","failWithActive","panMove$","latestEvent","panStartEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","scanPanEventToPinchEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","initialEvent","PinchRecognizer","latestPinchEvent","pinchStarted$","pinchMove$","pinchEnd$","defaultIfEmpty","pinchStartEvent","options","Recognizable","states","state","disableTextSelection","RotateRecognizer","rotateStart$","rotate$","rotateStartEvent","angle","current","rotateMove$","rotateEnd$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","_config$options2","maxTaps","multiTapThreshold","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","maximumPressTime","takeUntil$","active"],"sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { filter, type Observable } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\n/**\n * A press of the primary button: a left click, a finger or a pen's tip. A\n * right click is for the context menu, a middle click for the browser, and a\n * pen's barrel button or eraser for the app.\n *\n * @see https://w3c.github.io/pointerevents/#the-button-property\n */\nconst isPrimaryButtonPress = (event: PointerEvent) => event.button === 0;\n\n/**\n * The presses that start a gesture. Every recognizer tracks a pointer from its\n * press, so a pointer pressed with another button starts none: no tap, pan or\n * pinch, and no share of a multi tap.\n */\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t\tfilter(isPrimaryButtonPress),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { filter, type Observable } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { map, type Observable, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { map, type Observable, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers,\n\t\t\t\t * otherwise it is the one of the event we continue from (the pinch\n\t\t\t\t * start for the first move)\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance = hasChangedFingers\n\t\t\t\t\t? 0\n\t\t\t\t\t: curr.pointersAverageDistance - previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tlet latestPinchEvent: PinchEvent | undefined;\n\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t// only for this pinch, the next ones may move again\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEvent) => {\n\t\t\t\t\t\t\t\tconst latestEvent = latestPinchEvent ?? pinchStartEvent;\n\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * It ends where it got to: lifting a finger leaves too few\n\t\t\t\t\t\t\t\t * to measure the distance, and a failWith cancelling it\n\t\t\t\t\t\t\t\t * moves none. So nothing changed since the latest event.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...(endEvent ?? latestEvent),\n\t\t\t\t\t\t\t\t\ttype: \"pinchEnd\" as const,\n\t\t\t\t\t\t\t\t\tscale: latestEvent.scale,\n\t\t\t\t\t\t\t\t\tdistance: latestEvent.distance,\n\t\t\t\t\t\t\t\t\tdeltaDistance: 0,\n\t\t\t\t\t\t\t\t\tdeltaDistanceScale: 1,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestPinchEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\tcombineLatest,\n\tmap,\n\tmerge,\n\ttype Observable,\n\ttype ObservedValueOf,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\ntype RotatingEvent = RecognizerPanEvent & { angle: number; deltaAngle: number };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap((rotateStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: RotatingEvent = {\n\t\t\t\t\t\t\t...rotateStartEvent,\n\t\t\t\t\t\t\ttype: \"start\",\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst events$ = this.pan$.pipe(\n\t\t\t\t\t\t\tscan<RecognizerPanEvent, RotatingEvent, undefined>(\n\t\t\t\t\t\t\t\t(acc, current) => {\n\t\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// cancelled by failWith: it ends on the angle it reached\n\t\t\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(this.panEnd$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { filter, type Observable } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\tfilter,\n\tmap,\n\ttype Observable,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport { isRecognizedAsSwipe } from \"./operators\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\tfilter,\n\tmergeMap,\n\ttype Observable,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["calculateDistance","pointB","pointA","calculateAverageDistance","n","pointerEvents","sum","i","innerSum","event1","event2","calculateRadianAngleBetweenPoints","deltaX","pointerB","pointerA","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","point","acc","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","initialPoint","angleDelta","index","radianDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","start","startEvent","end","endEvent","posThreshold","calculateVelocity","delay","matchPointer","newPointer","pointer","isPointerOffEvent","pointerEvent","isPrimaryButtonPress","event","fromPointerDown","fromEvent","container","map","afterEventReceived","trackPointers","pointerUp$","pointerEvent$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown$","defer","of","pointerDown","merge","takeWhile","scan","_deleted","rest","pointers","shareLatest","shareReplay","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","_acc$latestActivePoin","_curr$latestActivePoi","curr","prevActivePointersNumber","currActivePointersNumber","deltaPointersAngle","latestActivePointers","startTime","getPointerEvents","_typeof","o","toPrimitive","t","e","r","toPropertyKey","_defineProperty","Recognizer","BehaviorSubject","stateSubject","switchMap","share","failWith$","failWith","distinctUntilChanged","areRunnings$","start$","recognizer","end$","startWith","combineLatest","runnings","running","_config$panConfig","_config$panConfig2","_config$panConfig3","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","tap","panConfig","existingConfig","HoldRecognizer","options","failWithActive","failingActive$","isActive","trailingEndEventIfFailed$","holdStartEvent","PanRecognizer","_config$options","panMove$","latestEvent","panStartEvent","panStarted$","events$","scanPanEventToPinchEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","initialEvent","PinchRecognizer","latestPinchEvent","pinchStarted$","pinchMove$","pinchEnd$","defaultIfEmpty","pinchStartEvent","Recognizable","states","state","disableTextSelection","RotateRecognizer","rotateStart$","rotate$","rotateStartEvent","angle","current","rotateMove$","rotateEnd$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","_config$options2","maxTaps","multiTapThreshold","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","maximumPressTime","takeUntil$","active"],"sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/utils/operators.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/hold/HoldRecognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { filter, type Observable } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\n/**\n * A press of the primary button: a left click, a finger or a pen's tip. A\n * right click is for the context menu, a middle click for the browser, and a\n * pen's barrel button or eraser for the app.\n *\n * @see https://w3c.github.io/pointerevents/#the-button-property\n */\nconst isPrimaryButtonPress = (event: PointerEvent) => event.button === 0;\n\n/**\n * The presses that start a gesture. Every recognizer tracks a pointer from its\n * press, so a pointer pressed with another button starts none: no tap, pan or\n * pinch, and no share of a multi tap.\n */\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t\tfilter(isPrimaryButtonPress),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import {\n\tdistinctUntilChanged,\n\tfilter,\n\ttype Observable,\n\tshareReplay,\n} from \"rxjs\";\n\nexport const emitOnceWhen =\n\t<T>(condition: (value: T) => boolean) =>\n\t(stream: Observable<T>) =>\n\t\tstream.pipe(\n\t\t\t// only emit once when we have a condition switch\n\t\t\tdistinctUntilChanged((previous, current) => {\n\t\t\t\tconst previousHasLessThan = condition(previous);\n\t\t\t\tconst currentHasLessThan = condition(current);\n\n\t\t\t\treturn previousHasLessThan === currentHasLessThan;\n\t\t\t}),\n\t\t\t// make sure to only pass true\n\t\t\tfilter(condition),\n\t\t);\n\n/**\n * Shares the latest value with late subscribers, and unsubscribes from the\n * source along with the last subscriber, which shareReplay(1) doesn't do.\n */\nexport const shareLatest = <T>() =>\n\tshareReplay<T>({ bufferSize: 1, refCount: true });\n","import { filter, type Observable } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { map, type Observable, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { shareLatest } from \"../utils/operators\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(startWith(false));\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\t/**\n\t\t\t * Keeps following the failWith recognizers once subscribed: they can't\n\t\t\t * be asked whether they run, so a recognizer subscribing again later\n\t\t\t * would miss the gesture of one that started in between.\n\t\t\t */\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareLatest(),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareLatest(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare({\n\t\t\t\t/**\n\t\t\t\t * A tick later, so that resubscribing right away, as a React effect\n\t\t\t\t * does, keeps following the fingers already pressed.\n\t\t\t\t */\n\t\t\t\tresetOnRefCountZero: () => timer(0),\n\t\t\t}),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tHoldEvent,\n\tHoldRecognizerInterface,\n\tHoldRecognizerOptions,\n} from \"./HoldRecognizerInterface\";\n\nexport type { HoldEvent };\n\nexport class HoldRecognizer\n\textends Recognizer<HoldRecognizerOptions, HoldEvent>\n\timplements HoldRecognizerInterface\n{\n\tpublic events$: Observable<HoldEvent>;\n\n\tconstructor(options: RecognizerConfig<HoldRecognizerOptions> = {}) {\n\t\tsuper(options, {\n\t\t\tnumInputs: 1,\n\t\t\tdelay: 0,\n\t\t\tposThreshold: 0,\n\t\t\t...options.options,\n\t\t});\n\n\t\tconst start$ = this.panStart$.pipe(\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"holdStart\" as const,\n\t\t\t\t\t...event,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\tthis.events$ = start$.pipe(\n\t\t\tswitchMap((holdStartEvent) => {\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst end$ = this.panEnd$.pipe(\n\t\t\t\t\tfirst(),\n\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: \"holdEnd\" as const,\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\t// cancelled by failWith: it ends where it started\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({ ...holdStartEvent, type: \"holdEnd\" as const })),\n\t\t\t\t\ttakeUntil(this.panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(of(holdStartEvent), end$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<HoldRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { map, type Observable, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers,\n\t\t\t\t * otherwise it is the one of the event we continue from (the pinch\n\t\t\t\t * start for the first move)\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance = hasChangedFingers\n\t\t\t\t\t? 0\n\t\t\t\t\t: curr.pointersAverageDistance - previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { shareLatest } from \"../utils/operators\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tlet latestPinchEvent: PinchEvent | undefined;\n\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t// only for this pinch, the next ones may move again\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEvent) => {\n\t\t\t\t\t\t\t\tconst latestEvent = latestPinchEvent ?? pinchStartEvent;\n\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * It ends where it got to: lifting a finger leaves too few\n\t\t\t\t\t\t\t\t * to measure the distance, and a failWith cancelling it\n\t\t\t\t\t\t\t\t * moves none. So nothing changed since the latest event.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...(endEvent ?? latestEvent),\n\t\t\t\t\t\t\t\t\ttype: \"pinchEnd\" as const,\n\t\t\t\t\t\t\t\t\tscale: latestEvent.scale,\n\t\t\t\t\t\t\t\t\tdistance: latestEvent.distance,\n\t\t\t\t\t\t\t\t\tdeltaDistance: 0,\n\t\t\t\t\t\t\t\t\tdeltaDistanceScale: 1,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestPinchEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\tcombineLatest,\n\tmap,\n\tmerge,\n\ttype Observable,\n\ttype ObservedValueOf,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tscan,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport { shareLatest } from \"../utils/operators\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\ntype RotatingEvent = RecognizerPanEvent & { angle: number; deltaAngle: number };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap((rotateStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: RotatingEvent = {\n\t\t\t\t\t\t\t...rotateStartEvent,\n\t\t\t\t\t\t\ttype: \"start\",\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst events$ = this.pan$.pipe(\n\t\t\t\t\t\t\tscan<RecognizerPanEvent, RotatingEvent, undefined>(\n\t\t\t\t\t\t\t\t(acc, current) => {\n\t\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// cancelled by failWith: it ends on the angle it reached\n\t\t\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(this.panEnd$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { filter, type Observable } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\tfilter,\n\tmap,\n\ttype Observable,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport { isRecognizedAsSwipe } from \"./operators\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\tfilter,\n\tmergeMap,\n\ttype Observable,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { shareLatest } from \"../utils/operators\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareLatest());\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareLatest(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n"],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("rxjs")):typeof define==`function`&&define.amd?define([`exports`,`rxjs`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.gesturx={},e.rxjs))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function n(e,t){return Math.sqrt((t.x-e.x)**2+(t.y-e.y)**2)}function r(e){let t=e.length;return t<2?0:e.reduce((t,r,i)=>t+e.slice(i+1).reduce((e,t)=>e+n(r,t),0),0)/(t*(t-1)/2)}function i(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.atan2(r,n)}function a(e,t){return i(e,t)*(180/Math.PI)}function o(e){let t=e.reduce((e,t)=>(e.x+=t.x,e.y+=t.y,e),{x:0,y:0}),n=e.length||1;return{x:t.x/n,y:t.y/n}}function s(e,t){if(e.length!==t.length)throw Error(`Initial and new points arrays must have the same length.`);let n=o(e),r=o(t),a=0;e.forEach((e,o)=>{let s=i(n,e),c=i(r,t[o]??e)-s;c>Math.PI?c-=2*Math.PI:c<-Math.PI&&(c+=2*Math.PI),a+=c});let s=a/e.length;return{radianDelta:s,degreesDelta:180/Math.PI*s}}function c(e){return e!=null}var l=e=>e.length>0,u=e=>e.pipe((0,t.filter)(l));function d(e,t,n){let r=o([e]),i=o([t]);return Math.abs(i.x-r.x)>=n||Math.abs(i.y-r.y)>=n}var f=(e,t,n)=>({velocityX:e>0?t/e:0,velocityY:e>0?n/e:0});function p(e){return n=>n.pipe((0,t.filter)(t=>t.pointerId===e.pointerId))}var m=e=>e.type===`pointerleave`||e.type===`pointercancel`||e.type===`pointerup`,h=e=>e.button===0,g=({container:e,afterEventReceived:n=e=>e})=>(0,t.fromEvent)(e,`pointerdown`).pipe((0,t.map)(n),(0,t.filter)(h)),_=({pointerEvent$:e})=>n=>{let r=e.pipe((0,t.filter)(e=>e.type===`pointerup`)),i=e.pipe((0,t.filter)(e=>e.type===`pointerleave`)),a=e.pipe((0,t.filter)(e=>e.type===`pointercancel`)),o=e.pipe((0,t.filter)(e=>e.type===`pointermove`)),s=(0,t.fromEvent)(window,`contextmenu`),l=e=>[`pointercancel`,`pointerleave`,`pointerup`,`contextmenu`].includes(e.type);return n.pipe((0,t.mergeMap)(e=>{let n=(0,t.defer)(()=>(0,t.of)(e));return(0,t.merge)(n,(0,t.merge)(o,a,i,r,s)).pipe(p(e),(0,t.takeWhile)(e=>!l(e),!0))}),(0,t.scan)((e,t)=>{if(l(t)){let{[t.pointerId]:n,...r}=(e==null?void 0:e.pointers)??{};return{event:t,pointers:r}}return{event:t,pointers:{...(e==null?void 0:e.pointers)??{},[t.pointerId]:t}}},void 0),(0,t.map)(({event:e,pointers:t})=>({event:e,pointers:Object.values(t).filter(c)})))},v=e=>e.pipe((0,t.filter)(e=>!!e.container)),y=e=>e.pipe((0,t.filter)(m)),b=(e,t,n,r)=>({deltaX:e.x-t.x+n,deltaY:e.y-t.y+r}),x=e=>{let n=e=>o(e.latestActivePointers.length?e.latestActivePointers:[e.event]);return e.pipe((0,t.scan)((e,t)=>{var r,i;let a=n(t),o=(e==null?void 0:e.center)??a,c=(e==null?void 0:e.deltaX)??0,l=(e==null?void 0:e.deltaY)??0,u=(e==null||(r=e.latestActivePointers)==null?void 0:r.length)??1,d=((i=t.latestActivePointers)==null?void 0:i.length)??1,{deltaX:f,deltaY:p}=[`pointerdown`,`pointercancel`,`pointerleave`,`pointerup`].includes(t.event.type)&&u!==d&&d>0||t.event.type===`pointercancel`?b(a,a,c,l):b(a,o,c,l),{degreesDelta:m}=u===d&&u>=2&&d>=2&&t.event.type!==`pointercancel`?s((e==null?void 0:e.latestActivePointers)??[],t.latestActivePointers??[]):{degreesDelta:0};return{startTime:Date.now(),...e,...t,center:a,deltaX:f,deltaY:p,deltaPointersAngle:m}},void 0),(0,t.map)(e=>{let{deltaX:t,deltaY:n,latestActivePointers:i,startTime:a,center:o,event:s,deltaPointersAngle:c}=e,l=i??[],u=Date.now()-a,{velocityX:d,velocityY:p}=f(u,t,n);return{deltaX:t,deltaY:n,velocityX:d,velocityY:p,delay:u,center:o,pointers:l,startTime:a,event:s,deltaPointersAngle:c,pointersAverageDistance:r(i)}}))},S=({container:e,afterEventReceived:n=e=>e})=>{let r=g({afterEventReceived:n,container:e}),i=(0,t.fromEvent)(e,`pointerup`).pipe((0,t.map)(n)),a=(0,t.fromEvent)(e,`pointermove`).pipe((0,t.map)(n)),o=(0,t.fromEvent)(e,`pointerleave`).pipe((0,t.map)(n)),s=(0,t.fromEvent)(e,`pointercancel`).pipe((0,t.map)(n));return{pointerEvents$:(0,t.merge)(r,s,o,i,a),pointerDown$:r,pointerCancel$:s,pointerLeave$:o,pointerUp$:i,pointerMove$:a}};function C(e){"@babel/helpers - typeof";return C=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},C(e)}function w(e,t){if(C(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(C(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function T(e){var t=w(e,`string`);return C(t)==`symbol`?t:t+``}function E(e,t,n){return(t=T(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var D=class{constructor(e,n){E(this,`configSubject`,new t.BehaviorSubject({})),E(this,`pan$`,void 0),E(this,`panStart$`,void 0),E(this,`panMove$`,void 0),E(this,`panEnd$`,void 0),E(this,`pointerEvent$`,void 0),E(this,`pointerDown$`,void 0),E(this,`pointerUp$`,void 0),E(this,`pointerCancel$`,void 0),E(this,`pointerMove$`,void 0),E(this,`pointerOff$`,void 0),E(this,`state$`,void 0),E(this,`config$`,this.configSubject.pipe(v)),E(this,`failWithActive$`,void 0);let r=new t.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe((0,t.switchMap)(({container:e,afterEventReceived:t})=>S({container:e,afterEventReceived:t}).pointerEvents$),(0,t.share)()),this.pointerDown$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointerdown`)),this.pointerUp$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointerup`)),this.pointerMove$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointermove`)),this.pointerCancel$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointercancel`)),this.pointerOff$=this.pointerEvent$.pipe(y);let i=this.config$.pipe((0,t.map)(({failWith:e})=>e),(0,t.distinctUntilChanged)());this.failWithActive$=i.pipe((0,t.switchMap)(e=>{let n=e==null?void 0:e.map(e=>{let n=e.start$.pipe((0,t.map)(()=>!0)),r=e.end$.pipe((0,t.map)(()=>!1));return(0,t.merge)(n,r).pipe((0,t.startWith)(!1),(0,t.shareReplay)(1))});return n!=null&&n.length?(0,t.combineLatest)(n):(0,t.combineLatest)([(0,t.of)(!1)])}),(0,t.map)(e=>e.some(e=>e)),(0,t.shareReplay)(1)),this.pan$=this.configSubject.pipe(v,(0,t.switchMap)(e=>{var n,r,i;let a=Math.max(1,((n=e.panConfig)==null?void 0:n.numInputs)??1),o=Math.max(0,((r=e.panConfig)==null?void 0:r.posThreshold)??0),s=Math.max(0,((i=e.panConfig)==null?void 0:i.delay)??0),c=this.pointerDown$.pipe(_({pointerEvent$:this.pointerEvent$,trackMove:!0}),(0,t.shareReplay)(1)),l=e=>e.pipe((0,t.filter)(e=>e.pointers.length>=a)),u=e=>e.pipe((0,t.filter)(e=>e.pointers.length<a));return c.pipe(l,(0,t.exhaustMap)(({pointers:e})=>{let n=c.pipe(u,(0,t.first)(),(0,t.share)()),r=(0,t.timer)(s),i=(0,t.merge)(...e.map(e=>(0,t.of)(e)),this.pointerDown$).pipe((0,t.mergeMap)(e=>(0,t.merge)(this.pointerMove$,(0,t.of)(e)).pipe(p(e),(0,t.filter)(t=>d(e,t,o)))),(0,t.first)()).pipe((0,t.switchMap)(()=>r),(0,t.withLatestFrom)(c),(0,t.map)(([,{event:e,pointers:t}])=>({type:`start`,event:e,latestActivePointers:t})),(0,t.shareReplay)({bufferSize:1,refCount:!1}),(0,t.takeUntil)(n)),a=i.pipe((0,t.mergeMap)(()=>c.pipe((0,t.skip)(1),(0,t.map)(({event:e,pointers:t})=>({type:`move`,event:e,latestActivePointers:t})))),(0,t.takeUntil)(n)),l=i.pipe((0,t.mergeMap)(()=>n.pipe((0,t.map)(({event:e,pointers:t})=>({type:`end`,event:e,latestActivePointers:t}))))),f=(0,t.merge)(i,a,l).pipe((0,t.shareReplay)(1));return f.pipe(x,(0,t.withLatestFrom)(f),(0,t.map)(([e,{type:t}])=>({...e,type:t})))}))}),(0,t.tap)(e=>{r.next({fingers:e.pointers.length})}),(0,t.share)()),this.panStart$=this.pan$.pipe((0,t.filter)(e=>e.type===`start`),(0,t.map)(({type:e,...t})=>t)),this.panMove$=this.pan$.pipe((0,t.filter)(e=>e.type===`move`),(0,t.map)(({type:e,...t})=>t)),this.panEnd$=this.pan$.pipe((0,t.filter)(e=>e.type===`end`),(0,t.map)(({type:e,...t})=>t)),this.state$=r.asObservable(),this.updateInternal(e??{},n)}updateInternal(e,t){let n=this.configSubject.getValue();this.configSubject.next({...n,...e,...e.options&&{options:{...n.options,...e.options}},panConfig:{...n.panConfig,...t}})}update(e,t){this.updateInternal(e,t)}},O=class extends D{constructor(e){var n;super(e,{...e==null?void 0:e.options,posThreshold:(e==null||(n=e.options)==null?void 0:n.posThreshold)??15}),E(this,`events$`,void 0),E(this,`start$`,void 0),E(this,`end$`,void 0);let r=this.panStart$.pipe((0,t.map)(e=>({type:`panStart`,...e})),(0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.map)(([e])=>e),(0,t.share)()),i=this.panEnd$.pipe((0,t.map)(e=>({type:`panEnd`,...e})),(0,t.share)()),a=this.panMove$.pipe((0,t.map)(e=>({type:`panMove`,...e})));this.events$=r.pipe((0,t.switchMap)(e=>{let n=e,r=(0,t.of)(e),o=this.failWithActive$.pipe((0,t.filter)(e=>e),(0,t.first)()),s=(0,t.merge)(r,a,i).pipe((0,t.tap)(e=>{n=e}),(0,t.takeUntil)(o)),c=o.pipe((0,t.map)(()=>({...n,type:`panEnd`})),(0,t.takeUntil)(i));return(0,t.merge)(s,c)}),(0,t.share)()),this.start$=this.events$.pipe((0,t.filter)(e=>e.type===`panStart`)),this.end$=this.events$.pipe((0,t.filter)(e=>e.type===`panEnd`))}update(e){super.update(e,e.options)}},k=({type:e,initialEvent:n})=>r=>r.pipe((0,t.scan)((t,n)=>{let r=((t==null?void 0:t.pointers.length)??0)!==n.pointers.length,i=(t==null?void 0:t.pointersAverageDistance)??n.pointersAverageDistance,a=r?n.pointersAverageDistance:t&&`initialPointersAverageDistance`in t?t.initialPointersAverageDistance:i,o=a===0?1:n.pointersAverageDistance/a,s=n.pointersAverageDistance-a,c=r?0:n.pointersAverageDistance-i,l=r||i===0?1:n.pointersAverageDistance/i;return{...t,...n,type:e,initialPointersAverageDistance:a,scale:o,distance:s,deltaDistance:c,deltaDistanceScale:l}},n),(0,t.map)(({initialPointersAverageDistance:e,...t})=>t)),A=class extends D{constructor(e){super(e,{...e==null?void 0:e.options,numInputs:2}),E(this,`events$`,void 0),E(this,`start$`,void 0),E(this,`end$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(()=>{let e,n=this.panStart$.pipe((0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.map)(([e])=>e),(0,t.switchMap)(e=>(0,t.of)(e).pipe(k({type:`pinchStart`,initialEvent:void 0}))),(0,t.shareReplay)(1)),r=this.failWithActive$.pipe((0,t.filter)(e=>e),(0,t.first)()),i=n.pipe((0,t.switchMap)(e=>this.pan$.pipe((0,t.takeWhile)(e=>e.type!==`end`),k({type:`pinchMove`,initialEvent:e}),(0,t.takeUntil)(r)))),a=n.pipe((0,t.switchMap)(n=>this.pan$.pipe((0,t.filter)(e=>e.type===`end`),(0,t.takeUntil)(r),(0,t.defaultIfEmpty)(null),(0,t.map)(t=>{let r=e??n;return{...t??r,type:`pinchEnd`,scale:r.scale,distance:r.distance,deltaDistance:0,deltaDistanceScale:1}}),(0,t.share)())));return(0,t.merge)(n,i,a).pipe((0,t.tap)(t=>{e=t}))}),(0,t.share)()),this.start$=this.events$.pipe((0,t.filter)(e=>e.type===`pinchStart`)),this.end$=this.events$.pipe((0,t.filter)(e=>e.type===`pinchEnd`))}update(e){super.update(e,e.options)}},j=class{constructor(e){E(this,`options`,void 0),E(this,`events$`,void 0),E(this,`recognizers`,void 0),E(this,`state$`,void 0),this.options=e,this.recognizers=e.recognizers,this.events$=(0,t.merge)(...e.recognizers.map(e=>e.events$.pipe((0,t.map)(t=>({event:t,recognizer:e}))))).pipe((0,t.share)()),this.state$=(0,t.combineLatest)(this.recognizers.map(e=>e.state$)).pipe((0,t.map)(e=>e.reduce((e,t)=>({fingers:Math.max(e.fingers,t.fingers)})))),this.update(e)}update({disableTextSelection:e,...t}){t.container&&(t.container.style.touchAction=`none`,e&&(t.container.style.userSelect=`none`));for(let e of this.options.recognizers)e.update(t)}},M=class extends D{constructor(e={}){super(e,{numInputs:2,posThreshold:15,...e.options}),E(this,`events$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(()=>{let e=this.panStart$.pipe((0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.map)(([e])=>({...e,type:`rotateStart`,angle:0,deltaAngle:0})),(0,t.shareReplay)(1)),n=e.pipe((0,t.switchMap)(e=>{let n={...e,type:`start`},r=this.failWithActive$.pipe((0,t.filter)(e=>e),(0,t.first)()),i=this.pan$.pipe((0,t.scan)((e,t)=>{let n=((e==null?void 0:e.angle)??0)+t.deltaPointersAngle;return{...e,...t,angle:n,deltaAngle:t.deltaPointersAngle}},void 0),(0,t.tap)(e=>{n=e}),(0,t.takeUntil)(r)),a=r.pipe((0,t.map)(()=>({...n,type:`end`,deltaAngle:0})),(0,t.takeUntil)(this.panEnd$));return(0,t.merge)(i,a)}),(0,t.share)()),r=n.pipe((0,t.filter)(e=>e.type===`move`),(0,t.map)(e=>({...e,type:`rotateMove`}))),i=n.pipe((0,t.filter)(e=>e.type===`end`),(0,t.map)(e=>({...e,type:`rotateEnd`})));return(0,t.merge)(e,r,i)}),(0,t.share)())}update(e){super.update(e,e.options)}},N=e=>n=>n.pipe((0,t.filter)(t=>Math.abs(t.velocityX)>=e||Math.abs(t.velocityY)>=e)),P=class extends D{constructor(e){super(e,{posThreshold:0,numInputs:1}),E(this,`events$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(e=>{let{escapeVelocity:n=.9}=e.options??{};return this.panStart$.pipe((0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.switchMap)(([e])=>this.panEnd$.pipe(N(n),(0,t.map)(t=>({type:`swipe`,angle:a(e.event,t.event),...t})),(0,t.takeUntil)(this.failWithActive$.pipe((0,t.filter)(e=>e))))),(0,t.share)())}))}update(e){super.update(e)}},F=({timeout:e,pointerEvent$:n})=>r=>r.pipe((0,t.mergeMap)(r=>(0,t.timer)(e).pipe((0,t.takeUntil)(n.pipe(y,p(r)))))),I=({initialPointerEvent:e,pointerEvent$:n,tolerance:r})=>i=>i.pipe((0,t.mergeMap)(i=>n.pipe(p(i),(0,t.takeWhile)(e=>!m(e),!0),(0,t.filter)(t=>d(e,t,r))))),L=class extends D{constructor(e){super(e),E(this,`events$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(e=>{var n,r;let i=((n=e.options)==null?void 0:n.maxTaps)??1,a=((r=e.options)==null?void 0:r.multiTapThreshold)??100*(i-1),{maximumPressTime:o=150,tolerance:s=10}=e.options??{},c=this.pointerDown$.pipe(_({pointerEvent$:this.pointerEvent$,trackMove:!0}),(0,t.shareReplay)(1)),l=c.pipe((0,t.filter)(({pointers:e})=>e.length>1)),d=e=>e.pipe((0,t.buffer)(this.pointerUp$.pipe((0,t.debounceTime)(a))),(0,t.first)());return(0,t.merge)(this.pointerDown$,c.pipe((0,t.ignoreElements)())).pipe((0,t.exhaustMap)(e=>{let n=(0,t.merge)((0,t.of)(e),this.pointerDown$).pipe((0,t.shareReplay)(1)),r=n.pipe(d),a=n.pipe(I({initialPointerEvent:e,pointerEvent$:this.pointerEvent$,tolerance:s})),c=n.pipe(F({pointerEvent$:this.pointerEvent$,timeout:o})),f=(0,t.merge)(this.failWithActive$.pipe((0,t.filter)(e=>e)),this.pointerCancel$,l,a,c),p=r.pipe(u,(0,t.filter)(e=>e.length<=i),(0,t.map)(e=>({type:`tap`,taps:e.length,latestActivePointers:e,event:e[0]})),(0,t.shareReplay)(1));return p.pipe(x,(0,t.withLatestFrom)(p),(0,t.map)(([e,{type:t,taps:n}])=>({...e,type:t,taps:n})),(0,t.takeUntil)(f))}))}),(0,t.share)())}update(e){super.update(e)}};e.PanRecognizer=O,e.PinchRecognizer=A,e.Recognizable=j,e.Recognizer=D,e.RotateRecognizer=M,e.SwipeRecognizer=P,e.TapRecognizer=L});
|
|
1
|
+
"use strict";(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("rxjs")):typeof define==`function`&&define.amd?define([`exports`,`rxjs`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.gesturx={},e.rxjs))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function n(e,t){return Math.sqrt((t.x-e.x)**2+(t.y-e.y)**2)}function r(e){let t=e.length;return t<2?0:e.reduce((t,r,i)=>t+e.slice(i+1).reduce((e,t)=>e+n(r,t),0),0)/(t*(t-1)/2)}function i(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.atan2(r,n)}function a(e,t){return i(e,t)*(180/Math.PI)}function o(e){let t=e.reduce((e,t)=>(e.x+=t.x,e.y+=t.y,e),{x:0,y:0}),n=e.length||1;return{x:t.x/n,y:t.y/n}}function s(e,t){if(e.length!==t.length)throw Error(`Initial and new points arrays must have the same length.`);let n=o(e),r=o(t),a=0;e.forEach((e,o)=>{let s=i(n,e),c=i(r,t[o]??e)-s;c>Math.PI?c-=2*Math.PI:c<-Math.PI&&(c+=2*Math.PI),a+=c});let s=a/e.length;return{radianDelta:s,degreesDelta:180/Math.PI*s}}function c(e){return e!=null}var l=e=>e.length>0,u=e=>e.pipe((0,t.filter)(l));function d(e,t,n){let r=o([e]),i=o([t]);return Math.abs(i.x-r.x)>=n||Math.abs(i.y-r.y)>=n}var f=(e,t,n)=>({velocityX:e>0?t/e:0,velocityY:e>0?n/e:0});function p(e){return n=>n.pipe((0,t.filter)(t=>t.pointerId===e.pointerId))}var m=e=>e.type===`pointerleave`||e.type===`pointercancel`||e.type===`pointerup`,h=e=>e.button===0,g=({container:e,afterEventReceived:n=e=>e})=>(0,t.fromEvent)(e,`pointerdown`).pipe((0,t.map)(n),(0,t.filter)(h)),_=({pointerEvent$:e})=>n=>{let r=e.pipe((0,t.filter)(e=>e.type===`pointerup`)),i=e.pipe((0,t.filter)(e=>e.type===`pointerleave`)),a=e.pipe((0,t.filter)(e=>e.type===`pointercancel`)),o=e.pipe((0,t.filter)(e=>e.type===`pointermove`)),s=(0,t.fromEvent)(window,`contextmenu`),l=e=>[`pointercancel`,`pointerleave`,`pointerup`,`contextmenu`].includes(e.type);return n.pipe((0,t.mergeMap)(e=>{let n=(0,t.defer)(()=>(0,t.of)(e));return(0,t.merge)(n,(0,t.merge)(o,a,i,r,s)).pipe(p(e),(0,t.takeWhile)(e=>!l(e),!0))}),(0,t.scan)((e,t)=>{if(l(t)){let{[t.pointerId]:n,...r}=(e==null?void 0:e.pointers)??{};return{event:t,pointers:r}}return{event:t,pointers:{...(e==null?void 0:e.pointers)??{},[t.pointerId]:t}}},void 0),(0,t.map)(({event:e,pointers:t})=>({event:e,pointers:Object.values(t).filter(c)})))},v=()=>(0,t.shareReplay)({bufferSize:1,refCount:!0}),y=e=>e.pipe((0,t.filter)(e=>!!e.container)),b=e=>e.pipe((0,t.filter)(m)),x=(e,t,n,r)=>({deltaX:e.x-t.x+n,deltaY:e.y-t.y+r}),S=e=>{let n=e=>o(e.latestActivePointers.length?e.latestActivePointers:[e.event]);return e.pipe((0,t.scan)((e,t)=>{var r,i;let a=n(t),o=(e==null?void 0:e.center)??a,c=(e==null?void 0:e.deltaX)??0,l=(e==null?void 0:e.deltaY)??0,u=(e==null||(r=e.latestActivePointers)==null?void 0:r.length)??1,d=((i=t.latestActivePointers)==null?void 0:i.length)??1,{deltaX:f,deltaY:p}=[`pointerdown`,`pointercancel`,`pointerleave`,`pointerup`].includes(t.event.type)&&u!==d&&d>0||t.event.type===`pointercancel`?x(a,a,c,l):x(a,o,c,l),{degreesDelta:m}=u===d&&u>=2&&d>=2&&t.event.type!==`pointercancel`?s((e==null?void 0:e.latestActivePointers)??[],t.latestActivePointers??[]):{degreesDelta:0};return{startTime:Date.now(),...e,...t,center:a,deltaX:f,deltaY:p,deltaPointersAngle:m}},void 0),(0,t.map)(e=>{let{deltaX:t,deltaY:n,latestActivePointers:i,startTime:a,center:o,event:s,deltaPointersAngle:c}=e,l=i??[],u=Date.now()-a,{velocityX:d,velocityY:p}=f(u,t,n);return{deltaX:t,deltaY:n,velocityX:d,velocityY:p,delay:u,center:o,pointers:l,startTime:a,event:s,deltaPointersAngle:c,pointersAverageDistance:r(i)}}))},C=({container:e,afterEventReceived:n=e=>e})=>{let r=g({afterEventReceived:n,container:e}),i=(0,t.fromEvent)(e,`pointerup`).pipe((0,t.map)(n)),a=(0,t.fromEvent)(e,`pointermove`).pipe((0,t.map)(n)),o=(0,t.fromEvent)(e,`pointerleave`).pipe((0,t.map)(n)),s=(0,t.fromEvent)(e,`pointercancel`).pipe((0,t.map)(n));return{pointerEvents$:(0,t.merge)(r,s,o,i,a),pointerDown$:r,pointerCancel$:s,pointerLeave$:o,pointerUp$:i,pointerMove$:a}};function w(e){"@babel/helpers - typeof";return w=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},w(e)}function T(e,t){if(w(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(w(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function E(e){var t=T(e,`string`);return w(t)==`symbol`?t:t+``}function D(e,t,n){return(t=E(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var O=class{constructor(e,n){D(this,`configSubject`,new t.BehaviorSubject({})),D(this,`pan$`,void 0),D(this,`panStart$`,void 0),D(this,`panMove$`,void 0),D(this,`panEnd$`,void 0),D(this,`pointerEvent$`,void 0),D(this,`pointerDown$`,void 0),D(this,`pointerUp$`,void 0),D(this,`pointerCancel$`,void 0),D(this,`pointerMove$`,void 0),D(this,`pointerOff$`,void 0),D(this,`state$`,void 0),D(this,`config$`,this.configSubject.pipe(y)),D(this,`failWithActive$`,void 0);let r=new t.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe((0,t.switchMap)(({container:e,afterEventReceived:t})=>C({container:e,afterEventReceived:t}).pointerEvents$),(0,t.share)()),this.pointerDown$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointerdown`)),this.pointerUp$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointerup`)),this.pointerMove$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointermove`)),this.pointerCancel$=this.pointerEvent$.pipe((0,t.filter)(e=>e.type===`pointercancel`)),this.pointerOff$=this.pointerEvent$.pipe(b);let i=this.config$.pipe((0,t.map)(({failWith:e})=>e),(0,t.distinctUntilChanged)());this.failWithActive$=i.pipe((0,t.switchMap)(e=>{let n=e==null?void 0:e.map(e=>{let n=e.start$.pipe((0,t.map)(()=>!0)),r=e.end$.pipe((0,t.map)(()=>!1));return(0,t.merge)(n,r).pipe((0,t.startWith)(!1))});return n!=null&&n.length?(0,t.combineLatest)(n):(0,t.combineLatest)([(0,t.of)(!1)])}),(0,t.map)(e=>e.some(e=>e)),(0,t.shareReplay)(1)),this.pan$=this.configSubject.pipe(y,(0,t.switchMap)(e=>{var n,r,i;let a=Math.max(1,((n=e.panConfig)==null?void 0:n.numInputs)??1),o=Math.max(0,((r=e.panConfig)==null?void 0:r.posThreshold)??0),s=Math.max(0,((i=e.panConfig)==null?void 0:i.delay)??0),c=this.pointerDown$.pipe(_({pointerEvent$:this.pointerEvent$,trackMove:!0}),v()),l=e=>e.pipe((0,t.filter)(e=>e.pointers.length>=a)),u=e=>e.pipe((0,t.filter)(e=>e.pointers.length<a));return c.pipe(l,(0,t.exhaustMap)(({pointers:e})=>{let n=c.pipe(u,(0,t.first)(),(0,t.share)()),r=(0,t.timer)(s),i=(0,t.merge)(...e.map(e=>(0,t.of)(e)),this.pointerDown$).pipe((0,t.mergeMap)(e=>(0,t.merge)(this.pointerMove$,(0,t.of)(e)).pipe(p(e),(0,t.filter)(t=>d(e,t,o)))),(0,t.first)()).pipe((0,t.switchMap)(()=>r),(0,t.withLatestFrom)(c),(0,t.map)(([,{event:e,pointers:t}])=>({type:`start`,event:e,latestActivePointers:t})),v(),(0,t.takeUntil)(n)),a=i.pipe((0,t.mergeMap)(()=>c.pipe((0,t.skip)(1),(0,t.map)(({event:e,pointers:t})=>({type:`move`,event:e,latestActivePointers:t})))),(0,t.takeUntil)(n)),l=i.pipe((0,t.mergeMap)(()=>n.pipe((0,t.map)(({event:e,pointers:t})=>({type:`end`,event:e,latestActivePointers:t}))))),f=(0,t.merge)(i,a,l).pipe(v());return f.pipe(S,(0,t.withLatestFrom)(f),(0,t.map)(([e,{type:t}])=>({...e,type:t})))}))}),(0,t.tap)(e=>{r.next({fingers:e.pointers.length})}),(0,t.share)({resetOnRefCountZero:()=>(0,t.timer)(0)})),this.panStart$=this.pan$.pipe((0,t.filter)(e=>e.type===`start`),(0,t.map)(({type:e,...t})=>t)),this.panMove$=this.pan$.pipe((0,t.filter)(e=>e.type===`move`),(0,t.map)(({type:e,...t})=>t)),this.panEnd$=this.pan$.pipe((0,t.filter)(e=>e.type===`end`),(0,t.map)(({type:e,...t})=>t)),this.state$=r.asObservable(),this.updateInternal(e??{},n)}updateInternal(e,t){let n=this.configSubject.getValue();this.configSubject.next({...n,...e,...e.options&&{options:{...n.options,...e.options}},panConfig:{...n.panConfig,...t}})}update(e,t){this.updateInternal(e,t)}},k=class extends O{constructor(e={}){super(e,{numInputs:1,delay:0,posThreshold:0,...e.options}),D(this,`events$`,void 0);let n=this.panStart$.pipe((0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.map)(([e])=>({type:`holdStart`,...e})));this.events$=n.pipe((0,t.switchMap)(e=>{let n=this.failWithActive$.pipe((0,t.filter)(e=>e),(0,t.first)()),r=this.panEnd$.pipe((0,t.first)(),(0,t.map)(e=>({type:`holdEnd`,...e})),(0,t.takeUntil)(n)),i=n.pipe((0,t.map)(()=>({...e,type:`holdEnd`})),(0,t.takeUntil)(this.panEnd$));return(0,t.merge)((0,t.of)(e),r,i)}),(0,t.share)())}update(e){super.update(e,e.options)}},A=class extends O{constructor(e){var n;super(e,{...e==null?void 0:e.options,posThreshold:(e==null||(n=e.options)==null?void 0:n.posThreshold)??15}),D(this,`events$`,void 0),D(this,`start$`,void 0),D(this,`end$`,void 0);let r=this.panStart$.pipe((0,t.map)(e=>({type:`panStart`,...e})),(0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.map)(([e])=>e),(0,t.share)()),i=this.panEnd$.pipe((0,t.map)(e=>({type:`panEnd`,...e})),(0,t.share)()),a=this.panMove$.pipe((0,t.map)(e=>({type:`panMove`,...e})));this.events$=r.pipe((0,t.switchMap)(e=>{let n=e,r=(0,t.of)(e),o=this.failWithActive$.pipe((0,t.filter)(e=>e),(0,t.first)()),s=(0,t.merge)(r,a,i).pipe((0,t.tap)(e=>{n=e}),(0,t.takeUntil)(o)),c=o.pipe((0,t.map)(()=>({...n,type:`panEnd`})),(0,t.takeUntil)(i));return(0,t.merge)(s,c)}),(0,t.share)()),this.start$=this.events$.pipe((0,t.filter)(e=>e.type===`panStart`)),this.end$=this.events$.pipe((0,t.filter)(e=>e.type===`panEnd`))}update(e){super.update(e,e.options)}},j=({type:e,initialEvent:n})=>r=>r.pipe((0,t.scan)((t,n)=>{let r=((t==null?void 0:t.pointers.length)??0)!==n.pointers.length,i=(t==null?void 0:t.pointersAverageDistance)??n.pointersAverageDistance,a=r?n.pointersAverageDistance:t&&`initialPointersAverageDistance`in t?t.initialPointersAverageDistance:i,o=a===0?1:n.pointersAverageDistance/a,s=n.pointersAverageDistance-a,c=r?0:n.pointersAverageDistance-i,l=r||i===0?1:n.pointersAverageDistance/i;return{...t,...n,type:e,initialPointersAverageDistance:a,scale:o,distance:s,deltaDistance:c,deltaDistanceScale:l}},n),(0,t.map)(({initialPointersAverageDistance:e,...t})=>t)),M=class extends O{constructor(e){super(e,{...e==null?void 0:e.options,numInputs:2}),D(this,`events$`,void 0),D(this,`start$`,void 0),D(this,`end$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(()=>{let e,n=this.panStart$.pipe((0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.map)(([e])=>e),(0,t.switchMap)(e=>(0,t.of)(e).pipe(j({type:`pinchStart`,initialEvent:void 0}))),v()),r=this.failWithActive$.pipe((0,t.filter)(e=>e),(0,t.first)()),i=n.pipe((0,t.switchMap)(e=>this.pan$.pipe((0,t.takeWhile)(e=>e.type!==`end`),j({type:`pinchMove`,initialEvent:e}),(0,t.takeUntil)(r)))),a=n.pipe((0,t.switchMap)(n=>this.pan$.pipe((0,t.filter)(e=>e.type===`end`),(0,t.takeUntil)(r),(0,t.defaultIfEmpty)(null),(0,t.map)(t=>{let r=e??n;return{...t??r,type:`pinchEnd`,scale:r.scale,distance:r.distance,deltaDistance:0,deltaDistanceScale:1}}),(0,t.share)())));return(0,t.merge)(n,i,a).pipe((0,t.tap)(t=>{e=t}))}),(0,t.share)()),this.start$=this.events$.pipe((0,t.filter)(e=>e.type===`pinchStart`)),this.end$=this.events$.pipe((0,t.filter)(e=>e.type===`pinchEnd`))}update(e){super.update(e,e.options)}},N=class{constructor(e){D(this,`options`,void 0),D(this,`events$`,void 0),D(this,`recognizers`,void 0),D(this,`state$`,void 0),this.options=e,this.recognizers=e.recognizers,this.events$=(0,t.merge)(...e.recognizers.map(e=>e.events$.pipe((0,t.map)(t=>({event:t,recognizer:e}))))).pipe((0,t.share)()),this.state$=(0,t.combineLatest)(this.recognizers.map(e=>e.state$)).pipe((0,t.map)(e=>e.reduce((e,t)=>({fingers:Math.max(e.fingers,t.fingers)})))),this.update(e)}update({disableTextSelection:e,...t}){t.container&&(t.container.style.touchAction=`none`,e&&(t.container.style.userSelect=`none`));for(let e of this.options.recognizers)e.update(t)}},P=class extends O{constructor(e={}){super(e,{numInputs:2,posThreshold:15,...e.options}),D(this,`events$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(()=>{let e=this.panStart$.pipe((0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.map)(([e])=>({...e,type:`rotateStart`,angle:0,deltaAngle:0})),v()),n=e.pipe((0,t.switchMap)(e=>{let n={...e,type:`start`},r=this.failWithActive$.pipe((0,t.filter)(e=>e),(0,t.first)()),i=this.pan$.pipe((0,t.scan)((e,t)=>{let n=((e==null?void 0:e.angle)??0)+t.deltaPointersAngle;return{...e,...t,angle:n,deltaAngle:t.deltaPointersAngle}},void 0),(0,t.tap)(e=>{n=e}),(0,t.takeUntil)(r)),a=r.pipe((0,t.map)(()=>({...n,type:`end`,deltaAngle:0})),(0,t.takeUntil)(this.panEnd$));return(0,t.merge)(i,a)}),(0,t.share)()),r=n.pipe((0,t.filter)(e=>e.type===`move`),(0,t.map)(e=>({...e,type:`rotateMove`}))),i=n.pipe((0,t.filter)(e=>e.type===`end`),(0,t.map)(e=>({...e,type:`rotateEnd`})));return(0,t.merge)(e,r,i)}),(0,t.share)())}update(e){super.update(e,e.options)}},F=e=>n=>n.pipe((0,t.filter)(t=>Math.abs(t.velocityX)>=e||Math.abs(t.velocityY)>=e)),I=class extends O{constructor(e){super(e,{posThreshold:0,numInputs:1}),D(this,`events$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(e=>{let{escapeVelocity:n=.9}=e.options??{};return this.panStart$.pipe((0,t.withLatestFrom)(this.failWithActive$),(0,t.filter)(([,e])=>!e),(0,t.switchMap)(([e])=>this.panEnd$.pipe(F(n),(0,t.map)(t=>({type:`swipe`,angle:a(e.event,t.event),...t})),(0,t.takeUntil)(this.failWithActive$.pipe((0,t.filter)(e=>e))))),(0,t.share)())}))}update(e){super.update(e)}},L=({timeout:e,pointerEvent$:n})=>r=>r.pipe((0,t.mergeMap)(r=>(0,t.timer)(e).pipe((0,t.takeUntil)(n.pipe(b,p(r)))))),R=({initialPointerEvent:e,pointerEvent$:n,tolerance:r})=>i=>i.pipe((0,t.mergeMap)(i=>n.pipe(p(i),(0,t.takeWhile)(e=>!m(e),!0),(0,t.filter)(t=>d(e,t,r))))),z=class extends O{constructor(e){super(e),D(this,`events$`,void 0),this.events$=this.config$.pipe((0,t.switchMap)(e=>{var n,r;let i=((n=e.options)==null?void 0:n.maxTaps)??1,a=((r=e.options)==null?void 0:r.multiTapThreshold)??100*(i-1),{maximumPressTime:o=150,tolerance:s=10}=e.options??{},c=this.pointerDown$.pipe(_({pointerEvent$:this.pointerEvent$,trackMove:!0}),v()),l=c.pipe((0,t.filter)(({pointers:e})=>e.length>1)),d=e=>e.pipe((0,t.buffer)(this.pointerUp$.pipe((0,t.debounceTime)(a))),(0,t.first)());return(0,t.merge)(this.pointerDown$,c.pipe((0,t.ignoreElements)())).pipe((0,t.exhaustMap)(e=>{let n=(0,t.merge)((0,t.of)(e),this.pointerDown$).pipe(v()),r=n.pipe(d),a=n.pipe(R({initialPointerEvent:e,pointerEvent$:this.pointerEvent$,tolerance:s})),c=n.pipe(L({pointerEvent$:this.pointerEvent$,timeout:o})),f=(0,t.merge)(this.failWithActive$.pipe((0,t.filter)(e=>e)),this.pointerCancel$,l,a,c),p=r.pipe(u,(0,t.filter)(e=>e.length<=i),(0,t.map)(e=>({type:`tap`,taps:e.length,latestActivePointers:e,event:e[0]})),v());return p.pipe(S,(0,t.withLatestFrom)(p),(0,t.map)(([e,{type:t,taps:n}])=>({...e,type:t,taps:n})),(0,t.takeUntil)(f))}))}),(0,t.share)())}update(e){super.update(e)}};e.HoldRecognizer=k,e.PanRecognizer=A,e.PinchRecognizer=M,e.Recognizable=N,e.Recognizer=O,e.RotateRecognizer=P,e.SwipeRecognizer=I,e.TapRecognizer=z});
|
|
2
2
|
//# sourceMappingURL=index.umd.cjs.map
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","names":["filter","filter","fromEvent","map","mergeMap","defer","of","merge","takeWhile","scan","filter","scan","map","fromEvent","map","merge","BehaviorSubject","switchMap","share","filter","map","distinctUntilChanged","merge","startWith","shareReplay","combineLatest","of","exhaustMap","first","timer","mergeMap","withLatestFrom","takeUntil","skip","tap","map","withLatestFrom","filter","share","switchMap","of","first","merge","tap","takeUntil","scan","map","switchMap","withLatestFrom","filter","map","of","shareReplay","first","takeWhile","takeUntil","defaultIfEmpty","share","merge","tap","merge","map","share","combineLatest","switchMap","withLatestFrom","filter","map","shareReplay","first","scan","tap","takeUntil","merge","share","filter","switchMap","withLatestFrom","filter","map","takeUntil","share","mergeMap","timer","takeUntil","takeWhile","filter","switchMap","shareReplay","filter","buffer","debounceTime","first","merge","ignoreElements","exhaustMap","of","map","withLatestFrom","takeUntil","share","factory","global","exports","calculateDistance","pointB","pointA","calculateAverageDistance","n","pointerEvents","sum","innerSum","event1","event2","calculateRadianAngleBetweenPoints","deltaX","pointerB","pointerA","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","point","acc","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","initialPoint","angleDelta","index","radianDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","rxjs","isWithinPosThreshold","start","startEvent","end","endEvent","posThreshold","calculateVelocity","delay","matchPointer","newPointer","pointer","isPointerOffEvent","pointerEvent","isPrimaryButtonPress","event","fromPointerDown","container","afterEventReceived","trackPointers","pointerUp$","pointerEvent$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","pointerDown$","pointerDown","_deleted","rest","pointers","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","_acc$latestActivePoin","_curr$latestActivePoi","curr","prevActivePointersNumber","currActivePointersNumber","deltaPointersAngle","latestActivePointers","startTime","getPointerEvents","_typeof","o","toPrimitive","t","e","i","r","toPropertyKey","_defineProperty","Recognizer","stateSubject","failWith$","failWith","areRunnings$","start$","recognizer","end$","runnings","running","_config$panConfig","_config$panConfig2","_config$panConfig3","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","initialPointerEvents","panReleased$","delay$","panStart$","panUpdate$","panEnd$","rawEvent$","recognizerEvent","panConfig","existingConfig","PanRecognizer","_config$options","failWithActive","panMove$","latestEvent","panStartEvent","panStarted$","failingActive$","isActive","events$","trailingEndEventIfFailed$","scanPanEventToPinchEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","initialEvent","PinchRecognizer","latestPinchEvent","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","options","Recognizable","states","state","disableTextSelection","RotateRecognizer","rotateStart$","rotate$","rotateStartEvent","angle","current","rotateMove$","rotateEnd$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","_config$options2","maxTaps","multiTapThreshold","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","maximumPressTime","takeUntil$","active"],"sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { filter, type Observable } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\n/**\n * A press of the primary button: a left click, a finger or a pen's tip. A\n * right click is for the context menu, a middle click for the browser, and a\n * pen's barrel button or eraser for the app.\n *\n * @see https://w3c.github.io/pointerevents/#the-button-property\n */\nconst isPrimaryButtonPress = (event: PointerEvent) => event.button === 0;\n\n/**\n * The presses that start a gesture. Every recognizer tracks a pointer from its\n * press, so a pointer pressed with another button starts none: no tap, pan or\n * pinch, and no share of a multi tap.\n */\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t\tfilter(isPrimaryButtonPress),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import { filter, type Observable } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { map, type Observable, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(\n\t\t\t\t\t\tstartWith(false),\n\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay({\n\t\t\t\t\t\t\t\tbufferSize: 1,\n\t\t\t\t\t\t\t\trefCount: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { map, type Observable, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers,\n\t\t\t\t * otherwise it is the one of the event we continue from (the pinch\n\t\t\t\t * start for the first move)\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance = hasChangedFingers\n\t\t\t\t\t? 0\n\t\t\t\t\t: curr.pointersAverageDistance - previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tlet latestPinchEvent: PinchEvent | undefined;\n\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t// only for this pinch, the next ones may move again\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEvent) => {\n\t\t\t\t\t\t\t\tconst latestEvent = latestPinchEvent ?? pinchStartEvent;\n\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * It ends where it got to: lifting a finger leaves too few\n\t\t\t\t\t\t\t\t * to measure the distance, and a failWith cancelling it\n\t\t\t\t\t\t\t\t * moves none. So nothing changed since the latest event.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...(endEvent ?? latestEvent),\n\t\t\t\t\t\t\t\t\ttype: \"pinchEnd\" as const,\n\t\t\t\t\t\t\t\t\tscale: latestEvent.scale,\n\t\t\t\t\t\t\t\t\tdistance: latestEvent.distance,\n\t\t\t\t\t\t\t\t\tdeltaDistance: 0,\n\t\t\t\t\t\t\t\t\tdeltaDistanceScale: 1,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestPinchEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\tcombineLatest,\n\tmap,\n\tmerge,\n\ttype Observable,\n\ttype ObservedValueOf,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tscan,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\ntype RotatingEvent = RecognizerPanEvent & { angle: number; deltaAngle: number };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap((rotateStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: RotatingEvent = {\n\t\t\t\t\t\t\t...rotateStartEvent,\n\t\t\t\t\t\t\ttype: \"start\",\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst events$ = this.pan$.pipe(\n\t\t\t\t\t\t\tscan<RecognizerPanEvent, RotatingEvent, undefined>(\n\t\t\t\t\t\t\t\t(acc, current) => {\n\t\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// cancelled by failWith: it ends on the angle it reached\n\t\t\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(this.panEnd$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { filter, type Observable } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\tfilter,\n\tmap,\n\ttype Observable,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport { isRecognizedAsSwipe } from \"./operators\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\tfilter,\n\tmergeMap,\n\ttype Observable,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareReplay(1),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareReplay(1));\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareReplay(1),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n"],"mappings":"4TAEA,SAAgBwG,EAAkB,EAAe,EAAuB,CACvE,OAAO,KAAK,MAAMC,EAAO,EAAIC,EAAO,IAAM,GAAKD,EAAO,EAAIC,EAAO,IAAM,CAAC,CACzE,CAEA,SAAgBC,EAAyB,EAAgC,CACxE,IAAMC,EAAIC,EAAc,OAcxB,OAbID,EAAI,EAAU,EAEIC,EAAc,QAAQ,EAAK,EAAQ,IAEvDC,EACAD,EAAc,MAAM,EAAI,CAAC,CAAC,CAAC,QAAQ,EAAU,IACrCE,EAAWP,EAAkBQ,EAAQC,CAAM,EAChD,CAAC,EAEH,CAII,GADgBL,GAAKA,EAAI,GAAM,EAEvC,CAEA,SAAgBM,EACf,EACA,EACS,CAET,IAAMC,EAASC,EAAS,EAAIC,EAAS,EAC/BC,EAASF,EAAS,EAAIC,EAAS,EAMrC,OAHuB,KAAK,MAAMC,EAAQH,CAGnC,CACR,CAEA,SAAgBI,EACf,EACA,EACS,CAQT,OANuBL,EAAkCG,EAAUD,CAG5C,GAAkB,IAAM,KAAK,GAIrD,CAEA,SAAgBI,EAAkB,EAAiB,CAClD,IAAMV,EAAMW,EAAO,QACjB,EAAK,KACL,EAAI,GAAKC,EAAM,EACf,EAAI,GAAKA,EAAM,EAERC,GAER,CAAE,EAAG,EAAG,EAAG,CAAE,CACd,EAEMC,EAAYH,EAAO,QAAU,EAEnC,MAAO,CACN,EAAGX,EAAI,EAAIc,EACX,EAAGd,EAAI,EAAIc,CACZ,CACD,CAEA,SAAgBC,EACf,EACA,EACC,CACD,GAAIC,EAAc,SAAWC,EAAU,OACtC,MAAU,MAAM,0DAA0D,EAG3E,IAAMC,EAAkBR,EAAkBM,CAAa,EACjDG,EAAcT,EAAkBO,CAAS,EAE3CG,EAAkB,EAEtBJ,EAAc,SAAS,EAAc,IAAU,CAC9C,IAAMK,EAAejB,EACpBc,EACAI,CACD,EAMIC,EALanB,EAChBe,EACAF,EAAUO,IAAUF,CAGJ,EAAWD,EAGxBE,EAAa,KAAK,GACrB,GAAc,EAAI,KAAK,GACbA,EAAa,CAAC,KAAK,KAC7B,GAAc,EAAI,KAAK,IAGxB,GAAmBA,CACpB,CAAC,EAGD,IAAME,EAAcL,EAAkBJ,EAAc,OAGpD,MAAO,CAAE,cAAa,aAFc,IAAM,KAAK,GAA1BS,CAEc,CACpC,CC7GA,SAAgBC,EACf,EACgD,CAChD,OAAOC,GAAQ,IAChB,CAEA,IAAaC,EAAwB,GACpCC,EAAO,OAAS,EAEJC,EACZ,GAC6BC,EAAO,MAAA,EAAK7I,EAAAA,OAAAA,CAAO0I,CAAiB,CAAC,EAEnE,SAAgBK,EACf,EACA,EACA,EACC,CACD,IAAMC,EAAQxB,EAAkB,CAACyB,CAAU,CAAC,EACtCC,EAAM1B,EAAkB,CAAC2B,CAAQ,CAAC,EAGxC,OACC,KAAK,IAAID,EAAI,EAAIF,EAAM,CAAC,GAAKI,GAC7B,KAAK,IAAIF,EAAI,EAAIF,EAAM,CAAC,GAAKI,CAE/B,CAMA,IAAaC,GACZ,EACA,EACA,KAKO,CACN,UAJiBC,EAAQ,EAAInC,EAASmC,EAAQ,EAK9C,UAJiBA,EAAQ,EAAIhC,EAASgC,EAAQ,CAK/C,GChCD,SAAgBC,EAAa,EAAuB,CACnD,MAAQ,IACPV,EAAO,MAAA,EACN5I,EAAAA,OAAAA,CAAQ,GAAeuJ,EAAW,YAAcC,EAAQ,SAAS,CAClE,CACF,CAEA,IAAaC,EAAqB,GACjCC,EAAa,OAAS,gBACtBA,EAAa,OAAS,iBACtBA,EAAa,OAAS,YASjBC,EAAwB,GAAwBC,EAAM,SAAW,EAO1DC,GAAmB,CAC/B,YACA,qBAAsB,GAAUD,MAAA,EAKhC3J,EAAAA,UAAAA,CAAwB6J,EAAW,aAAa,CAAC,CAAC,MAAA,EACjD5J,EAAAA,IAAAA,CAAI6J,CAAkB,GAAA,EACtB/J,EAAAA,OAAAA,CAAO2J,CAAoB,CAC5B,EAKYK,GACX,CACA,mBAUA,GAAqC,CAMrC,IAAMC,EAAaC,EAAc,MAAA,EAChClK,EAAAA,OAAAA,CAAQ,GAAU4J,EAAM,OAAS,WAAW,CAC7C,EACMO,EAAgBD,EAAc,MAAA,EACnClK,EAAAA,OAAAA,CAAQ,GAAU4J,EAAM,OAAS,cAAc,CAChD,EACMQ,EAAiBF,EAAc,MAAA,EACpClK,EAAAA,OAAAA,CAAQ,GAAU4J,EAAM,OAAS,eAAe,CACjD,EACMS,EAAeH,EAAc,MAAA,EAClClK,EAAAA,OAAAA,CAAQ,GAAU4J,EAAM,OAAS,aAAa,CAC/C,EACMU,GAAA,EAAerK,EAAAA,UAAAA,CAAwB,OAAQ,aAAa,EAE5DsK,EAAoB,GACzB,CAAC,gBAAiB,eAAgB,YAAa,aAAa,CAAC,CAAC,SAC7DX,EAAM,IACP,EAED,OAAOhB,EAAO,MAAA,EACbzI,EAAAA,SAAAA,CAAU,GAAgB,CACzB,IAAMqK,GAAA,EAAepK,EAAAA,MAAAA,MAAAA,EAAYC,EAAAA,GAAAA,CAAGoK,CAAW,CAAC,EAgBhD,OAAA,EAdkBnK,EAAAA,MAAAA,CACjBkK,GAAA,EACAlK,EAAAA,MAAAA,CACC+J,EACAD,EACAD,EACAF,EACAK,CACD,CACD,CAAC,CAAC,KACDhB,EAAamB,CAAW,GAAA,EACxBlK,EAAAA,UAAAA,CAAW,GAAU,CAACgK,EAAiBX,CAAK,EAAG,EAAI,CAG7C,CACR,CAAC,GAAA,EACDpJ,EAAAA,KAAAA,EAA8C,EAAK,IAAU,CAC5D,GAAI+J,EAAiBX,CAAK,EAAG,CAC5B,GAAM,EAAGA,EAAM,WAAYc,EAAU,GAAGC,IAAAjD,GAAA,KAAA,IAAA,GAASA,EAAK,WAAY,CAAC,EAInE,MAAO,CACN,QACA,SAAUiD,CACX,CACD,CAEA,MAAO,CACN,QACA,SAAU,CACT,IAAAjD,GAAA,KAAA,IAAA,GAAIA,EAAK,WAAY,CAAC,GACrBkC,EAAM,WAAYA,CACpB,CACD,CACD,EAAG,IAAA,EAAS,GAAA,EACZ1J,EAAAA,IAAAA,EAAK,CAAE,QAAO,eAAgB,CAC7B,QACA,SAAU,OAAO,OAAO0K,CAAQ,CAAC,CAAC,OAAOrC,CAAS,CACnD,EAAE,CACH,CACD,ECtIYsC,EACZ,GAEAjC,EAAO,MAAA,EACNnI,EAAAA,OAAAA,CACE,GAAqD,CAAC,CAACqK,EAAO,SAChE,CACD,EAEYC,EAAoB,GAChCnC,EAAO,MAAA,EAAKnI,EAAAA,OAAAA,CAAOgJ,CAAiB,CAAC,ECShCuB,GACL,EACA,EACA,EACA,KAKO,CACN,OAJcC,EAAU,EAAIC,EAAW,EAAIC,EAK3C,OAJcF,EAAU,EAAIC,EAAW,EAAIE,CAK5C,GAGYC,EACZ,GACiC,CACjC,IAAMC,EAAqB,GAC1B/D,EACEgE,EAAK,qBAAqB,OAExBA,EAAK,qBADL,CAACA,EAAK,KAAK,CAEf,EAED,OAAO3C,EAAO,MAAA,EACblI,EAAAA,KAAAA,EAA0C,EAAK,IAAS,SACvD,IAAMuK,EAAYK,EAAkBI,CAAI,EAClCR,GAAAxD,GAAA,KAAA,IAAA,GAAaA,EAAK,SAAUuD,EAC5BE,GAAAzD,GAAA,KAAA,IAAA,GAAaA,EAAK,SAAU,EAC5B0D,GAAA1D,GAAA,KAAA,IAAA,GAAaA,EAAK,SAAU,EAC5BiE,GAAAjE,GAAA,OAAA,EAA2BA,EAAK,uBAAA,KAAA,IAAA,GAAA8D,EAAsB,SAAU,EAChEI,IAAA,EAA2BF,EAAK,uBAAA,KAAA,IAAA,GAAAD,EAAsB,SAAU,EAShE,CAAE,SAAQ,UANf,CAAC,cAAe,gBAAiB,eAAgB,WAAW,CAAC,CAAC,SAC7DC,EAAK,MAAM,IACZ,GAAKC,IAA6BC,GAEPA,EAA2B,GAQtDF,EAAK,MAAM,OAAS,gBACjBV,EAAkBC,EAAWA,EAAWE,EAAYC,CAAU,EAC9DJ,EAAkBC,EAAWC,EAAYC,EAAYC,CAAU,EAE7D,CAAE,aAAcS,GACrBF,IAA6BC,GAC7BD,GAA4B,GAC5BC,GAA4B,GAK5BF,EAAK,MAAM,OAAS,gBACjB9D,GAAAF,GAAA,KAAA,IAAA,GACAA,EAAK,uBAAwB,CAAC,EAC9BgE,EAAK,sBAAwB,CAAC,CAC/B,EACC,CAAE,aAAc,CAAE,EAEtB,MAAO,CACN,UAAW,KAAK,IAAI,EACpB,GAAGhE,EACH,GAAGgE,EACH,OAAQT,EACR,SACA,SACA,oBACD,CACD,EAAG,IAAA,EAAS,GAAA,EACZtK,EAAAA,IAAAA,CAAK,GAAS,CACb,GAAM,CACL,SACA,SACA,uBACA,YACA,SACA,QACA,sBACG4K,EACE7C,EAASoD,GAAwB,CAAC,EAIlCzC,EADM,KAAK,IACH,EAAM0C,EAEd,CAAE,YAAW,aAAc3C,EAAkBC,EAAOnC,EAAQG,CAAM,EAIxE,MAAO,CACN,SACA,SACA,YACA,YACA,QACA,SACA,SAAUqB,EACV,YACA,QACA,qBACA,wBAbAhC,EAAyBoF,CAazB,CACD,CACD,CAAC,CACF,CACD,EClIaE,GAAoB,CAChC,YACA,qBAAsB,GAAUpC,KAI3B,CACL,IAAMY,EAAeX,EAAgB,CAAE,qBAAoB,WAAU,CAAC,EAChEI,GAAA,EAAarJ,EAAAA,UAAAA,CAAwBkJ,EAAW,WAAW,CAAC,CAAC,MAAA,EAClEjJ,EAAAA,IAAAA,CAAIkJ,CAAkB,CACvB,EACMM,GAAA,EAAezJ,EAAAA,UAAAA,CAAwBkJ,EAAW,aAAa,CAAC,CAAC,MAAA,EACtEjJ,EAAAA,IAAAA,CAAIkJ,CAAkB,CACvB,EAIMI,GAAA,EAAgBvJ,EAAAA,UAAAA,CAAwBkJ,EAAW,cAAc,CAAC,CAAC,MAAA,EACxEjJ,EAAAA,IAAAA,CAAIkJ,CAAkB,CACvB,EAKMK,GAAA,EAAiBxJ,EAAAA,UAAAA,CACtBkJ,EACA,eACD,CAAC,CAAC,MAAA,EAAKjJ,EAAAA,IAAAA,CAAIkJ,CAAkB,CAAC,EAU9B,MAAO,CACN,gBAAA,EATsBjJ,EAAAA,MAAAA,CACtB0J,EACAJ,EACAD,EACAF,EACAI,CAIA,EACA,eACA,iBACA,gBACA,aACA,cACD,CACD,srBCWA,IAAsBqC,EAAtB,KAGE,CA4BD,YAAY,EAAoC,EAAuB,CA3BvED,EAAA,KAAA,gBAA0B,IAAI1L,EAAAA,gBAI5B,CAAC,CAAC,CAAA,EACJ0L,EAAA,KAAA,OAAA,IAAA,EAAA,EACAA,EAAA,KAAA,YAAA,IAAA,EAAA,EACAA,EAAA,KAAA,WAAA,IAAA,EAAA,EACAA,EAAA,KAAA,UAAA,IAAA,EAAA,EAEAA,EAAA,KAAA,gBAAA,IAAA,EAAA,EACAA,EAAA,KAAA,eAAA,IAAA,EAAA,EACAA,EAAA,KAAA,aAAA,IAAA,EAAA,EACAA,EAAA,KAAA,iBAAA,IAAA,EAAA,EACAA,EAAA,KAAA,eAAA,IAAA,EAAA,EACAA,EAAA,KAAA,cAAA,IAAA,EAAA,EAEAA,EAAA,KAAA,SAAA,IAAA,EAAA,EACAA,EAAA,KAAA,UAAiB,KAAK,cAAc,KAAK5B,CAAa,CAAA,EAOtD4B,EAAA,KAAA,kBAAA,IAAA,EAAA,EAGC,IAAME,EAAe,IAAI5L,EAAAA,gBAAuB,CAC/C,QAAS,CACV,CAAC,EAED,KAAK,cAAgB,KAAK,QAAQ,MAAA,EACjCC,EAAAA,UAAAA,EACE,CAAE,YAAW,wBACbgL,EAAiB,CAChB,YACA,oBACD,CAAC,CAAC,CAAC,cACL,GAAA,EACA/K,EAAAA,MAAAA,CAAM,CACP,EAEA,KAAK,aAAe,KAAK,cAAc,MAAA,EACtCC,EAAAA,OAAAA,CAAQ,GAAU0I,EAAM,OAAS,aAAa,CAC/C,EAEA,KAAK,WAAa,KAAK,cAAc,MAAA,EACpC1I,EAAAA,OAAAA,CAAQ,GAAU0I,EAAM,OAAS,WAAW,CAC7C,EAEA,KAAK,aAAe,KAAK,cAAc,MAAA,EACtC1I,EAAAA,OAAAA,CAAQ,GAAU0I,EAAM,OAAS,aAAa,CAC/C,EAEA,KAAK,eAAiB,KAAK,cAAc,MAAA,EACxC1I,EAAAA,OAAAA,CAAQ,GAAU0I,EAAM,OAAS,eAAe,CACjD,EAEA,KAAK,YAAc,KAAK,cAAc,KAAKmB,CAAgB,EAE3D,IAAM6B,EAAY,KAAK,QAAQ,MAAA,EAC9BzL,EAAAA,IAAAA,EAAK,CAAE,cAAe0L,CAAQ,GAAA,EAC9BzL,EAAAA,qBAAAA,CAAqB,CACtB,EAEA,KAAK,gBAAkBwL,EAAU,MAAA,EAChC5L,EAAAA,UAAAA,CAAW,GAAa,CACvB,IAAM8L,EAAAD,GAAA,KAAA,IAAA,GAAeA,EAAU,IAAK,GAAe,CAClD,IAAME,EAASC,EAAW,OAAO,MAAA,EAAK7L,EAAAA,IAAAA,KAAU,EAAI,CAAC,EAE/C8L,EAAOD,EAAW,KAAK,MAAA,EAAK7L,EAAAA,IAAAA,KAAU,EAAK,CAAC,EAOlD,OAAA,EALmBE,EAAAA,MAAAA,CAAM0L,EAAQE,CAAI,CAAC,CAAC,MAAA,EACtC3L,EAAAA,UAAAA,CAAU,EAAK,GAAA,EACfC,EAAAA,YAAAA,CAAY,CAAC,CAGP,CACR,CAAC,EAMD,OAJIuL,GAAA,MAACA,EAAc,QAInB,EAAOtL,EAAAA,cAAAA,CAAcsL,CAAY,GAHhC,EAAOtL,EAAAA,cAAAA,CAAc,EAAA,EAACC,EAAAA,GAAAA,CAAG,EAAK,CAAC,CAAC,CAIlC,CAAC,GAAA,EACDN,EAAAA,IAAAA,CAAK,GAAa+L,EAAS,KAAM,GAAYC,CAAO,CAAC,GAAA,EACrD5L,EAAAA,YAAAA,CAAY,CAAC,CACd,EAEA,KAAK,KAAO,KAAK,cAAc,KAC9BsJ,GAAA,EACA7J,EAAAA,UAAAA,CAAW,GAAW,WACrB,IAAMuM,EAAY,KAAK,IAAI,IAAA,EAAGzC,EAAO,YAAA,KAAA,IAAA,GAAAsC,EAAW,YAAa,CAAC,EACxDjE,EAAe,KAAK,IAAI,IAAA,EAAG2B,EAAO,YAAA,KAAA,IAAA,GAAAuC,EAAW,eAAgB,CAAC,EAC9DhE,EAAQ,KAAK,IAAI,IAAA,EAAGyB,EAAO,YAAA,KAAA,IAAA,GAAAwC,EAAW,QAAS,CAAC,EAEhDE,EAAiB,KAAK,aAAa,KACxCxD,EAAc,CACb,cAAe,KAAK,cACpB,UAAW,EACZ,CAAC,GAAA,EACDzI,EAAAA,YAAAA,CAAY,CAAC,CACd,EAEMkM,EACL,GAEA7E,EAAO,MAAA,EACN1H,EAAAA,OAAAA,CAEE,GAEAwH,EAAO,SAAS,QAAU6E,CAC5B,CACD,EAEKG,EACL,GAKA9E,EAAO,MAAA,EAAK1H,EAAAA,OAAAA,CAAQ,GAAWwH,EAAO,SAAS,OAAS6E,CAAS,CAAC,EAEnE,OAAOC,EAAe,KACrBC,GAAA,EACA/L,EAAAA,WAAAA,EAAY,CAAE,SAAUiM,KAA2B,CAClD,IAAMC,EAAeJ,EAAe,KACnCE,GAAA,EACA/L,EAAAA,MAAAA,CAAM,GAAA,EACNV,EAAAA,MAAAA,CAAM,CACP,EAEM4M,GAAA,EAASjM,EAAAA,MAAAA,CAAMyH,CAAK,EAqBpByE,GAAA,EAnB+BzM,EAAAA,MAAAA,CACpC,GAAGsM,EAAqB,IAAK,IAAA,EAAiBlM,EAAAA,GAAAA,CAAGiI,CAAY,CAAC,EAC9D,KAAK,YACN,CAAC,CAAC,MAAA,EACD7H,EAAAA,SAAAA,CAAU,IAAA,EACTR,EAAAA,MAAAA,CAAM,KAAK,cAAA,EAAcI,EAAAA,GAAAA,CAAGgJ,CAAW,CAAC,CAAC,CAAC,KACzCnB,EAAamB,CAAW,GAAA,EACxBvJ,EAAAA,OAAAA,CAAQ,GACP4H,EACC2B,EACAf,EACAP,CACD,CACD,CACD,CACD,GAAA,EACAxH,EAAAA,MAAAA,CAAM,CAGW,CAAA,CAA6B,MAAA,EAC9CX,EAAAA,UAAAA,KAAgB6M,CAAM,GAAA,EACtB/L,EAAAA,eAAAA,CAAe0L,CAAc,GAAA,EAC7BrM,EAAAA,IAAAA,EAAK,EAAG,CAAE,QAAO,gBAAiB,CACjC,KAAM,QACN,QACA,qBAAsByJ,CACvB,EAAE,GAAA,EACFrJ,EAAAA,YAAAA,CAAY,CACX,WAAY,EACZ,SAAU,EACX,CAAC,GAAA,EACDQ,EAAAA,UAAAA,CAAU6L,CAAY,CACvB,EAEMG,EAAaD,EAAU,MAAA,EAC5BjM,EAAAA,SAAAA,KACC2L,EAAe,MAAA,EACdxL,EAAAA,KAAAA,CAAK,CAAC,GAAA,EACNb,EAAAA,IAAAA,EAAK,CAAE,QAAO,eAAgB,CAC7B,KAAM,OACN,QACA,qBAAsByJ,CACvB,EAAE,CACH,CACD,GAAA,EACA7I,EAAAA,UAAAA,CAAU6L,CAAY,CACvB,EAEMI,EAAUF,EAAU,MAAA,EACzBjM,EAAAA,SAAAA,KACC+L,EAAa,MAAA,EACZzM,EAAAA,IAAAA,EAAK,CAAE,QAAO,eAAgB,CAC7B,KAAM,MACN,QACA,qBAAsByJ,CACvB,EAAE,CACH,CACD,CACD,EAEMqD,GAAA,EAAY5M,EAAAA,MAAAA,CAAMyM,EAAWC,EAAYC,CAAO,CAAC,CAAC,MAAA,EACvDzM,EAAAA,YAAAA,CAAY,CAAC,CACd,EAEA,OAAO0M,EAAU,KAChB5C,GAAA,EACAvJ,EAAAA,eAAAA,CAAemM,CAAS,GAAA,EACxB9M,EAAAA,IAAAA,EAAK,CAAC+M,EAAiB,CAAE,YAAa,CACrC,GAAGA,EACH,MACD,EAAE,CACH,CACD,CAAC,CACF,CACD,CAAC,GAAA,EACDjM,EAAAA,IAAAA,CAAK,GAAU,CACd0K,EAAa,KAAK,CACjB,QAAS/C,EAAM,SAAS,MACzB,CAAC,CACF,CAAC,GAAA,EACD3I,EAAAA,MAAAA,CAAM,CACP,EAEA,KAAK,UAAY,KAAK,KAAK,MAAA,EAC1BC,EAAAA,OAAAA,CAAQ,GAAU0I,EAAM,OAAS,OAAO,GAAA,EACxCzI,EAAAA,IAAAA,EAAK,CAAE,OAAM,GAAGwJ,KAAWA,CAAI,CAChC,EAEA,KAAK,SAAW,KAAK,KAAK,MAAA,EACzBzJ,EAAAA,OAAAA,CAAQ,GAAU0I,EAAM,OAAS,MAAM,GAAA,EACvCzI,EAAAA,IAAAA,EAAK,CAAE,OAAM,GAAGwJ,KAAWA,CAAI,CAChC,EAEA,KAAK,QAAU,KAAK,KAAK,MAAA,EACxBzJ,EAAAA,OAAAA,CAAQ,GAAU0I,EAAM,OAAS,KAAK,GAAA,EACtCzI,EAAAA,IAAAA,EAAK,CAAE,OAAM,GAAGwJ,KAAWA,CAAI,CAChC,EAEA,KAAK,OAASgC,EAAa,aAAa,EAExC,KAAK,eAAe7B,GAAU,CAAC,EAAGqD,CAAS,CAC5C,CAEA,eACC,EACA,EACC,CACD,IAAMC,EAAiB,KAAK,cAAc,SAAS,EAEnD,KAAK,cAAc,KAAK,CACvB,GAAGA,EACH,GAAGtD,EACH,GAAIA,EAAO,SAAW,CACrB,QAAS,CAAE,GAAGsD,EAAe,QAAS,GAAGtD,EAAO,OAAQ,CACzD,EACA,UAAW,CACV,GAAGsD,EAAe,UAClB,GAAGD,CACJ,CACD,CAAC,CACF,CAEA,OACC,EACA,EACC,CACD,KAAK,eAAerD,EAAQqD,CAAS,CACtC,CACD,EClTaE,EAAb,cACS3B,CAET,CAKC,YAAY,EAAiD,OAC5D,MAAM5B,EAAQ,CACb,GAAAA,GAAA,KAAA,IAAA,GAAGA,EAAQ,QACX,cAAAA,GAAA,OAAA,EAAcA,EAAQ,UAAA,KAAA,IAAA,GAAAwD,EAAS,eAAgB,EAChD,CAAC,EARF7B,EAAA,KAAA,UAAA,IAAA,EAAA,EACAA,EAAA,KAAA,SAAA,IAAA,EAAA,EACAA,EAAA,KAAA,OAAA,IAAA,EAAA,EAQC,IAAMqB,EAAY,KAAK,UAAU,MAAA,EAChC5L,EAAAA,IAAAA,CAAK,IAAW,CACf,KAAM,WACN,GAAG0H,CACJ,EAAE,GAAA,EACFzH,EAAAA,eAAAA,CAAe,KAAK,eAAe,GAAA,EACnCC,EAAAA,OAAAA,EAAQ,EAAGmM,KAAoB,CAACA,CAAc,GAAA,EAC9CrM,EAAAA,IAAAA,EAAK,CAAC0H,KAAWA,CAAK,GAAA,EACtBvH,EAAAA,MAAAA,CAAM,CACP,EAEM2L,EAAU,KAAK,QAAQ,MAAA,EAC5B9L,EAAAA,IAAAA,CAAK,IAAW,CACf,KAAM,SACN,GAAG0H,CACJ,EAAE,GAAA,EACFvH,EAAAA,MAAAA,CAAM,CACP,EAEMmM,EAAW,KAAK,SAAS,MAAA,EAC9BtM,EAAAA,IAAAA,CAAK,IAAW,CACf,KAAM,UACN,GAAG0H,CACJ,EAAE,CACH,EAEA,KAAK,QAAUkE,EAAU,MAAA,EACxBxL,EAAAA,UAAAA,CAAW,GAAkB,CAC5B,IAAImM,EAAwBC,EAEtBC,GAAA,EAAcpM,EAAAA,GAAAA,CAAGmM,CAAa,EAE9BE,EAAiB,KAAK,gBAAgB,MAAA,EAC3CxM,EAAAA,OAAAA,CAAQ,GAAayM,CAAQ,GAAA,EAC7BrM,EAAAA,MAAAA,CAAM,CACP,EAEMsM,GAAA,EAAUrM,EAAAA,MAAAA,CAAMkM,EAAaH,EAAUR,CAAO,CAAC,CAAC,MAAA,EACrDtL,EAAAA,IAAAA,CAAK,GAAU,CACd,EAAckH,CACf,CAAC,GAAA,EACDjH,EAAAA,UAAAA,CAAUiM,CAAc,CACzB,EAEMG,EAA4BH,EAAe,MAAA,EAChD1M,EAAAA,IAAAA,MAAW,CACV,GAAGuM,EACH,KAAM,QACP,EAAE,GAAA,EACF9L,EAAAA,UAAAA,CAAUqL,CAAO,CAClB,EAEA,OAAA,EAAOvL,EAAAA,MAAAA,CAAMqM,EAASC,CAAyB,CAChD,CAAC,GAAA,EACD1M,EAAAA,MAAAA,CAAM,CACP,EAEA,KAAK,OAAS,KAAK,QAAQ,MAAA,EAC1BD,EAAAA,OAAAA,CAAQ,GAAUwH,EAAM,OAAS,UAAU,CAC5C,EAEA,KAAK,KAAO,KAAK,QAAQ,MAAA,EAAKxH,EAAAA,OAAAA,CAAQ,GAAUwH,EAAM,OAAS,QAAQ,CAAC,CACzE,CAEA,OAAc,EAAgD,CAC7D,MAAM,OAAOkB,EAAQA,EAAO,OAAO,CACpC,CACD,ECnGakE,GACX,CACA,OACA,kBAKA,GACApG,EAAO,MAAA,EACNhG,EAAAA,KAAAA,EAMG,EAAK,IAAS,CAEhB,IAAMqM,IAAAvH,GAAA,KAAA,IAAA,GADyBA,EAAK,SAAS,SAAU,KAE3BgE,EAAK,SAAS,OACpCwD,GAAAxH,GAAA,KAAA,IAAA,GACLA,EAAK,0BAA2BgE,EAAK,wBAQhCyD,EAAiCF,EACpCvD,EAAK,wBACLhE,GAAO,mCAAoCA,EAC1CA,EAAI,+BACJwH,EAKEE,EACLD,IAAmC,EAChC,EACAzD,EAAK,wBAA0ByD,EAE7BE,EACL3D,EAAK,wBAA0ByD,EAE1BG,EAAgBL,EACnB,EACAvD,EAAK,wBAA0BwD,EAM5BK,EACLN,GAAqBC,IAAoC,EACtD,EACAxD,EAAK,wBAA0BwD,EAEnC,MAAO,CACN,GAAGxH,EACH,GAAGgE,EACH,OACA,iCACA,QACA,WACA,gBACA,oBACD,CACD,EAAG8D,CAAY,GAAA,EACf3M,EAAAA,IAAAA,EAAK,CAAE,iCAAgC,GAAG8H,KAAuBA,CAAI,CACtE,ECjDW8E,EAAb,cACS/C,CAET,CAMC,YAAY,EAAmD,CAC9D,MAAM5B,EAAQ,CACb,GAAAA,GAAA,KAAA,IAAA,GAAGA,EAAQ,QACX,UAAW,CACZ,CAAC,EATF2B,EAAA,KAAA,UAAA,IAAA,EAAA,EAEAA,EAAA,KAAA,SAAA,IAAA,EAAA,EACAA,EAAA,KAAA,OAAA,IAAA,EAAA,EAQC,KAAK,QAAU,KAAK,QAAQ,MAAA,EAC3B3J,EAAAA,UAAAA,KAAgB,CACf,IAAI4M,EAEEC,EAAgB,KAAK,UAAU,MAAA,EACpC5M,EAAAA,eAAAA,CAAe,KAAK,eAAe,GAAA,EACnCC,EAAAA,OAAAA,EAAQ,EAAGuL,KAAoB,CAACA,CAAc,GAAA,EAC9CtL,EAAAA,IAAAA,EAAK,CAAC2G,KAAWA,CAAK,GAAA,EACtB9G,EAAAA,UAAAA,CAAW,IAAA,EACVI,EAAAA,GAAAA,CAAG0G,CAAK,CAAC,CAAC,KAEToF,EAAyB,CACxB,KAAM,aACN,aAAc,IAAA,EACf,CAAC,CACF,CACD,GAAA,EACA7L,EAAAA,YAAAA,CAAY,CAAC,CACd,EAEMyL,EAAiB,KAAK,gBAAgB,MAAA,EAC3C5L,EAAAA,OAAAA,CAAQ,GAAa6L,CAAQ,GAAA,EAC7BzL,EAAAA,MAAAA,CAAM,CACP,EAEMwM,EAAaD,EAAc,MAAA,EAChC7M,EAAAA,UAAAA,CAAW,GACH,KAAK,KAAK,MAAA,EAChBO,EAAAA,UAAAA,CAAW,GAAUuG,EAAM,OAAS,KAAK,EACzCoF,EAAyB,CACxB,KAAM,YACN,cACD,CAAC,GAAA,EAED1L,EAAAA,UAAAA,CAAUsL,CAAc,CACzB,CACA,CACF,EAEMiB,EAAYF,EAAc,MAAA,EAC/B7M,EAAAA,UAAAA,CAAW,GACV,KAAK,KAAK,MAAA,EACTE,EAAAA,OAAAA,CAAQ,GAAU4G,EAAM,OAAS,KAAK,GAAA,EACtCtG,EAAAA,UAAAA,CAAUsL,CAAc,GAAA,EACxBrL,EAAAA,eAAAA,CAAe,IAAI,GAAA,EACnBN,EAAAA,IAAAA,CAAK,GAAa,CACjB,IAAMwL,EAAciB,GAAoBI,EAOxC,MAAO,CACN,GAAI5G,GAAYuF,EAChB,KAAM,WACN,MAAOA,EAAY,MACnB,SAAUA,EAAY,SACtB,cAAe,EACf,mBAAoB,CACrB,CACD,CAAC,GAAA,EACDjL,EAAAA,MAAAA,CAAM,CACP,CACD,CACD,EAEA,OAAA,EAAOC,EAAAA,MAAAA,CAAMkM,EAAeC,EAAYC,CAAS,CAAC,CAAC,MAAA,EAClDnM,EAAAA,IAAAA,CAAK,GAAU,CACd,EAAmBkG,CACpB,CAAC,CACF,CACD,CAAC,GAAA,EACDpG,EAAAA,MAAAA,CAAM,CACP,EAEA,KAAK,OAAS,KAAK,QAAQ,MAAA,EAC1BR,EAAAA,OAAAA,CAAQ,GAAU4G,EAAM,OAAS,YAAY,CAC9C,EAEA,KAAK,KAAO,KAAK,QAAQ,MAAA,EAAK5G,EAAAA,OAAAA,CAAQ,GAAU4G,EAAM,OAAS,UAAU,CAAC,CAC3E,CAEA,OAAc,EAAmD,CAChE,MAAM,OAAOmG,EAASA,EAAQ,OAAO,CACtC,CACD,ECrGaC,EAAb,KAEA,CAUC,YAAY,EAA2C,CAAjCvD,EAAA,KAAA,UAAA,IAAA,EAAA,EATtBA,EAAA,KAAA,UAAA,IAAA,EAAA,EAKAA,EAAA,KAAA,cAAA,IAAA,EAAA,EAEAA,EAAA,KAAA,SAAA,IAAA,EAAA,EAEsB,KAAA,QAAAsD,EACrB,KAAK,YAAcA,EAAQ,YAE3B,KAAK,SAAA,EAAUpM,EAAAA,MAAAA,CACd,GAAGoM,EAAQ,YAAY,IAAK,GAC3B/C,EAAW,QAAQ,MAAA,EAAKpJ,EAAAA,IAAAA,CAAK,IAAW,CAAE,QAAO,YAAW,EAAE,CAAC,CAChE,CACD,CAAC,CAAC,MAAA,EAAKC,EAAAA,MAAAA,CAAM,CAAC,EAEd,KAAK,QAAA,EAASC,EAAAA,cAAAA,CACb,KAAK,YAAY,IAAK,GAAekJ,EAAW,MAAM,CACvD,CAAC,CAAC,MAAA,EACDpJ,EAAAA,IAAAA,CAAK,GACJqM,EAAO,QAAQ,EAAK,KAAW,CAC9B,QAAS,KAAK,IAAIvI,EAAI,QAASwI,EAAM,OAAO,CAC7C,EAAE,CACH,CACD,EAEA,KAAK,OAAOH,CAAO,CACpB,CAEA,OAAc,CACb,uBACA,GAAGpF,GACqD,CACpDA,EAAK,YAMR,EAAK,UAAU,MAAM,YAAc,OAK/BwF,IACH,EAAK,UAAU,MAAM,WAAa,SAIpC,IAAK,IAAMnD,KAAc,KAAK,QAAQ,YACrCA,EAAW,OAAOrC,CAAI,CAExB,CACD,ECvDayF,EAAb,cACS1D,CAET,CAGC,YAAY,EAAoD,CAAC,EAAG,CACnE,MAAM5B,EAAQ,CACb,UAAW,EACX,aAAc,GACd,GAAGA,EAAO,OACX,CAAC,EAPF2B,EAAA,KAAA,UAAA,IAAA,EAAA,EASC,KAAK,QAAU,KAAK,QAAQ,MAAA,EAC3B1I,EAAAA,UAAAA,KAAgB,CACf,IAAMsM,EAAe,KAAK,UAAU,MAAA,EACnCrM,EAAAA,eAAAA,CAAe,KAAK,eAAe,GAAA,EACnCC,EAAAA,OAAAA,EAAQ,EAAGsK,KAAoB,CAACA,CAAc,GAAA,EAC9CrK,EAAAA,IAAAA,EAAK,CAAC0F,MAAY,CACjB,GAAGA,EACH,KAAM,cACN,MAAO,EACP,WAAY,CACb,EAAE,GAAA,EACFzF,EAAAA,YAAAA,CAAY,CAAC,CACd,EAEMmM,EAAUD,EAAa,MAAA,EAC5BtM,EAAAA,UAAAA,CAAW,GAAqB,CAC/B,IAAI0K,EAA6B,CAChC,GAAG8B,EACH,KAAM,OACP,EAEM3B,EAAiB,KAAK,gBAAgB,MAAA,EAC3C3K,EAAAA,OAAAA,CAAQ,GAAa4K,CAAQ,GAAA,EAC7BzK,EAAAA,MAAAA,CAAM,CACP,EAEM0K,EAAU,KAAK,KAAK,MAAA,EACzBzK,EAAAA,KAAAA,EACE,EAAK,IAAY,CACjB,IAAMmM,IAAA9I,GAAA,KAAA,IAAA,GAASA,EAAK,QAAS,GAAK+I,EAAQ,mBAE1C,MAAO,CACN,GAAG/I,EACH,GAAG+I,EACH,QACA,WAAYA,EAAQ,kBACrB,CACD,EACA,IAAA,EACD,GAAA,EACAnM,EAAAA,IAAAA,CAAK,GAAU,CACd,EAAcsF,CACf,CAAC,GAAA,EACDrF,EAAAA,UAAAA,CAAUqK,CAAc,CACzB,EAGMG,EAA4BH,EAAe,MAAA,EAChD1K,EAAAA,IAAAA,MAAW,CACV,GAAGuK,EACH,KAAM,MACN,WAAY,CACb,EAAE,GAAA,EACFlK,EAAAA,UAAAA,CAAU,KAAK,OAAO,CACvB,EAEA,OAAA,EAAOC,EAAAA,MAAAA,CAAMsK,EAASC,CAAyB,CAChD,CAAC,GAAA,EACDtK,EAAAA,MAAAA,CAAM,CACP,EAEMiM,EAAcJ,EAAQ,MAAA,EAC3BrM,EAAAA,OAAAA,CAAQ,GAAU2F,EAAM,OAAS,MAAM,GAAA,EACvC1F,EAAAA,IAAAA,CAAK,IAAW,CAAE,GAAG0F,EAAO,KAAM,YAAsB,EAAE,CAC3D,EAEM+G,EAAaL,EAAQ,MAAA,EAC1BrM,EAAAA,OAAAA,CAAQ,GAAU2F,EAAM,OAAS,KAAK,GAAA,EACtC1F,EAAAA,IAAAA,CAAK,IAAW,CAAE,GAAG0F,EAAO,KAAM,WAAqB,EAAE,CAC1D,EAEA,OAAA,EAAOpF,EAAAA,MAAAA,CAAM6L,EAAcK,EAAaC,CAAU,CACnD,CAAC,GAAA,EACDlM,EAAAA,MAAAA,CAAM,CACP,CACD,CAEA,OAAc,EAAoD,CACjE,MAAM,OAAOsL,EAASA,EAAQ,OAAO,CACtC,CACD,ECvHaa,EACX,GAA4B,GAC5BhI,EAAO,MAAA,EACNlE,EAAAA,OAAAA,CAAQ,GAEN,KAAK,IAAIkF,EAAM,SAAS,GAAKiH,GAC7B,KAAK,IAAIjH,EAAM,SAAS,GAAKiH,CAE9B,CACF,ECQWC,EAAb,cACSpE,CAET,CAGC,YAAY,EAAmD,CAC9D,MAAM5B,EAAQ,CACb,aAAc,EACd,UAAW,CACZ,CAAC,EANF2B,EAAA,KAAA,UAAA,IAAA,EAAA,EAQC,KAAK,QAAU,KAAK,QAAQ,MAAA,EAC3B9H,EAAAA,UAAAA,CAAW,GAAoB,CAC9B,GAAM,CAAE,iBAAiB,IAAQoM,EAAgB,SAAW,CAAC,EAE7D,OAAO,KAAK,UAAU,MAAA,EACrBnM,EAAAA,eAAAA,CAAe,KAAK,eAAe,GAAA,EACnCC,EAAAA,OAAAA,EAAQ,EAAG0J,KAAoB,CAACA,CAAc,GAAA,EAC9C5J,EAAAA,UAAAA,EAAW,CAACqE,KACJ,KAAK,QAAQ,KACnB4H,EAAoBC,CAAc,GAAA,EAClC/L,EAAAA,IAAAA,CAAK,IACG,CACN,KAAM,QACN,MAAOwC,EACN0B,EAAW,MACXY,EAAM,KACP,EACA,GAAGA,CACJ,EACA,GAAA,EACD7E,EAAAA,UAAAA,CACC,KAAK,gBAAgB,MAAA,EAAKF,EAAAA,OAAAA,CAAQ,GAAagK,CAAQ,CAAC,CACzD,CACD,CACA,GAAA,EACD7J,EAAAA,MAAAA,CAAM,CACP,CACD,CAAC,CACF,CACD,CAEA,OAAc,EAAkD,CAC/D,MAAM,OAAO8F,CAAM,CACpB,CACD,ECtDakG,GACX,CACA,UACA,mBAKA,GACApI,EAAO,MAAA,EACN3D,EAAAA,SAAAA,CAAU,IAAA,EACTC,EAAAA,MAAAA,CAAM+L,CAAO,CAAC,CAAC,MAAA,EACd9L,EAAAA,UAAAA,CACC+E,EAAc,KAAKa,EAAkBzB,EAAamB,CAAW,CAAC,CAC/D,CACD,CACD,CACD,EAEWyG,GACX,CACA,sBACA,gBACA,eAMA,GACAtI,EAAO,MAAA,EACN3D,EAAAA,SAAAA,CAAU,GACTiF,EAAc,KACbZ,EAAamB,CAAW,GAAA,EACxBrF,EAAAA,UAAAA,CAAW,GAAU,CAACqE,EAAkBG,CAAK,EAAG,EAAI,GAAA,EACpDvE,EAAAA,OAAAA,CAAQ,GACPyD,EAAqBqI,EAAqBvH,EAAOwH,CAAS,CAC3D,CACD,CACD,CACD,ECtBWC,EAAb,cACS3E,CAET,CAGC,YAAY,EAAkD,CAC7D,MAAMqD,CAAO,EAHdtD,EAAA,KAAA,UAAA,IAAA,EAAA,EAKC,KAAK,QAAU,KAAK,QAAQ,MAAA,EAC3BnH,EAAAA,UAAAA,CAAW,GAAW,SACrB,IAAMiM,IAAA,EAAUzG,EAAO,UAAA,KAAA,IAAA,GAAAwD,EAAS,UAAW,EAKrCkD,IAAA,EACL1G,EAAO,UAAA,KAAA,IAAA,GAAAwG,EAAS,oBAAqB,KAAOC,EAAU,GAEjD,CAAE,mBAAmB,IAAK,YAAY,IAAOzG,EAAO,SAAW,CAAC,EAEhE2G,EAAkB,KAAK,aAAa,KACzCzH,EAAc,CACb,cAAe,KAAK,cACpB,UAAW,EACZ,CAAC,GAAA,EACDzE,EAAAA,YAAAA,CAAY,CAAC,CACd,EAEMmM,EAA+BD,EAAgB,MAAA,EACpDjM,EAAAA,OAAAA,EAAQ,CAAE,cAAeoF,EAAS,OAAS,CAAC,CAC7C,EAEM+G,EAAsB,GAC3B/I,EAAO,MAAA,EACNnD,EAAAA,OAAAA,CAAO,KAAK,WAAW,MAAA,EAAKC,EAAAA,aAAAA,CAAa8L,CAAiB,CAAC,CAAC,GAAA,EAC5D7L,EAAAA,MAAAA,CAAM,CACP,EAqED,OAAA,EAnEaC,EAAAA,MAAAA,CACZ,KAAK,aACL6L,EAAgB,MAAA,EAAK5L,EAAAA,eAAAA,CAAe,CAAC,CACtC,CAAC,CAAC,MAAA,EACDC,EAAAA,WAAAA,CAAY,GAAwB,CACnC,IAAM8L,GAAA,EAAgBhM,EAAAA,MAAAA,EAAAA,EACrBG,EAAAA,GAAAA,CAAGoL,CAAmB,EACtB,KAAK,YACN,CAAC,CAAC,MAAA,EAAK5L,EAAAA,YAAAA,CAAY,CAAC,CAAC,EAEfsM,EACLD,EAAc,KAAKD,CAAkB,EAKhCG,EAAgCF,EAAc,KACnDV,EAAyB,CACxB,sBACA,cAAe,KAAK,cACpB,WACD,CAAC,CACF,EAKMa,EAA+BH,EAAc,KAClDZ,EAAuB,CACtB,cAAe,KAAK,cACpB,QAASgB,CACV,CAAC,CACF,EAEMC,GAAA,EAAarM,EAAAA,MAAAA,CAClB,KAAK,gBAAgB,MAAA,EAAKJ,EAAAA,OAAAA,CAAQ,GAAW0M,CAAM,CAAC,EACpD,KAAK,eACLR,EACAI,EACAC,CACD,EAEM9D,EAAY4D,EAAsB,KACvClJ,GAAA,EACAnD,EAAAA,OAAAA,CAAQ,GAAWkD,EAAO,QAAU6I,CAAO,GAAA,EAC3CvL,EAAAA,IAAAA,CAAK,IAAY,CAChB,KAAM,MACN,KAAM0C,EAAO,OACb,qBAAsBA,EACtB,MAAOA,EAAO,EACf,EAAE,GAAA,EACFnD,EAAAA,YAAAA,CAAY,CAAC,CACd,EAEA,OAAO0I,EAAU,KAChB5C,GAAA,EACApF,EAAAA,eAAAA,CAAegI,CAAS,GAAA,EACxBjI,EAAAA,IAAAA,EAAK,CAACkI,EAAiB,CAAE,OAAM,YAAa,CAC3C,GAAGA,EACH,OACA,MACD,EAAE,GAAA,EACFhI,EAAAA,UAAAA,CAAU+L,CAAU,CACrB,CACD,CAAC,CAGK,CACR,CAAC,GAAA,EACD9L,EAAAA,MAAAA,CAAM,CACP,CACD,CAEA,OAAc,EAAsD,CACnE,MAAM,OAAO2E,CAAM,CACpB,CACD"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","names":["filter","filter","fromEvent","map","mergeMap","defer","of","merge","takeWhile","scan","shareReplay","filter","scan","map","fromEvent","map","merge","BehaviorSubject","switchMap","share","filter","map","distinctUntilChanged","merge","startWith","combineLatest","of","shareReplay","exhaustMap","first","timer","mergeMap","withLatestFrom","takeUntil","skip","tap","withLatestFrom","filter","map","switchMap","first","takeUntil","merge","of","share","map","withLatestFrom","filter","share","switchMap","of","first","merge","tap","takeUntil","scan","map","switchMap","withLatestFrom","filter","map","of","first","takeWhile","takeUntil","defaultIfEmpty","share","merge","tap","merge","map","share","combineLatest","switchMap","withLatestFrom","filter","map","first","scan","tap","takeUntil","merge","share","filter","switchMap","withLatestFrom","filter","map","takeUntil","share","mergeMap","timer","takeUntil","takeWhile","filter","switchMap","filter","buffer","debounceTime","first","merge","ignoreElements","exhaustMap","of","map","withLatestFrom","takeUntil","share","factory","global","exports","calculateDistance","pointB","pointA","calculateAverageDistance","n","pointerEvents","sum","innerSum","event1","event2","calculateRadianAngleBetweenPoints","deltaX","pointerB","pointerA","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","point","acc","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","initialPoint","angleDelta","index","radianDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","rxjs","isWithinPosThreshold","start","startEvent","end","endEvent","posThreshold","calculateVelocity","delay","matchPointer","newPointer","pointer","isPointerOffEvent","pointerEvent","isPrimaryButtonPress","event","fromPointerDown","container","afterEventReceived","trackPointers","pointerUp$","pointerEvent$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","pointerDown$","pointerDown","_deleted","rest","pointers","shareLatest","isValidConfig","config","filterPointerOff","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","_acc$latestActivePoin","_curr$latestActivePoi","curr","prevActivePointersNumber","currActivePointersNumber","deltaPointersAngle","latestActivePointers","startTime","getPointerEvents","_typeof","o","toPrimitive","t","e","i","r","toPropertyKey","_defineProperty","Recognizer","stateSubject","failWith$","failWith","areRunnings$","start$","recognizer","end$","runnings","running","_config$panConfig","_config$panConfig2","_config$panConfig3","numInputs","trackPointers$","hasEnoughFingers","hasNotEnoughFingers","initialPointerEvents","panReleased$","delay$","panStart$","panUpdate$","panEnd$","rawEvent$","recognizerEvent","panConfig","existingConfig","HoldRecognizer","options","failWithActive","failingActive$","isActive","trailingEndEventIfFailed$","holdStartEvent","PanRecognizer","_config$options","panMove$","latestEvent","panStartEvent","panStarted$","events$","scanPanEventToPinchEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","initialEvent","PinchRecognizer","latestPinchEvent","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","Recognizable","states","state","disableTextSelection","RotateRecognizer","rotateStart$","rotate$","rotateStartEvent","angle","current","rotateMove$","rotateEnd$","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","_config$options2","maxTaps","multiTapThreshold","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","maximumPressTime","takeUntil$","active"],"sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/utils/operators.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/hold/HoldRecognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/pinch/scanPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts"],"sourcesContent":["export type Point = { x: number; y: number };\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n\treturn Math.sqrt((pointB.x - pointA.x) ** 2 + (pointB.y - pointA.y) ** 2);\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n\tconst n = pointerEvents.length;\n\tif (n < 2) return 0; // No distance if fewer than 2 pointers\n\n\tconst totalDistance = pointerEvents.reduce((sum, event1, i) => {\n\t\treturn (\n\t\t\tsum +\n\t\t\tpointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n\t\t\t\treturn innerSum + calculateDistance(event1, event2);\n\t\t\t}, 0)\n\t\t);\n\t}, 0);\n\n\t// Number of pairs is n choose 2: n * (n - 1) / 2\n\tconst numberOfPairs = (n * (n - 1)) / 2;\n\treturn totalDistance / numberOfPairs;\n}\n\nexport function calculateRadianAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the differences in coordinates\n\tconst deltaX = pointerB.x - pointerA.x;\n\tconst deltaY = pointerB.y - pointerA.y;\n\n\t// Calculate the angle in radians\n\tconst angleInRadians = Math.atan2(deltaY, deltaX);\n\n\t// Return the angle in degrees\n\treturn angleInRadians;\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n\tpointerA: Point,\n\tpointerB: Point,\n): number {\n\t// Calculate the angle in radians\n\tconst angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB);\n\n\t// Convert the angle to degrees (optional)\n\tconst angleInDegrees = angleInRadians * (180 / Math.PI);\n\n\t// Return the angle in degrees\n\treturn angleInDegrees;\n}\n\nexport function calculateCentroid(points: Point[]) {\n\tconst sum = points.reduce(\n\t\t(acc, point) => {\n\t\t\tacc.x += point.x;\n\t\t\tacc.y += point.y;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ x: 0, y: 0 },\n\t);\n\n\tconst numPoints = points.length || 1;\n\n\treturn {\n\t\tx: sum.x / numPoints,\n\t\ty: sum.y / numPoints,\n\t};\n}\n\nexport function calculateAngleDelta(\n\tinitialPoints: Point[],\n\tnewPoints: Point[],\n) {\n\tif (initialPoints.length !== newPoints.length) {\n\t\tthrow new Error(\"Initial and new points arrays must have the same length.\");\n\t}\n\n\tconst initialCentroid = calculateCentroid(initialPoints);\n\tconst newCentroid = calculateCentroid(newPoints);\n\n\tlet totalAngleDelta = 0;\n\n\tinitialPoints.forEach((initialPoint, index) => {\n\t\tconst initialAngle = calculateRadianAngleBetweenPoints(\n\t\t\tinitialCentroid,\n\t\t\tinitialPoint,\n\t\t);\n\t\tconst newAngle = calculateRadianAngleBetweenPoints(\n\t\t\tnewCentroid,\n\t\t\tnewPoints[index] ?? initialPoint,\n\t\t);\n\n\t\tlet angleDelta = newAngle - initialAngle;\n\n\t\t// Normalize the angle delta to be within [-PI, PI]\n\t\tif (angleDelta > Math.PI) {\n\t\t\tangleDelta -= 2 * Math.PI;\n\t\t} else if (angleDelta < -Math.PI) {\n\t\t\tangleDelta += 2 * Math.PI;\n\t\t}\n\n\t\ttotalAngleDelta += angleDelta;\n\t});\n\n\t// Return the average angle delta\n\tconst radianDelta = totalAngleDelta / initialPoints.length;\n\tconst degreesDelta = radianDelta * (180 / Math.PI);\n\n\treturn { radianDelta, degreesDelta };\n}\n","import { filter, type Observable } from \"rxjs\";\nimport { calculateCentroid } from \"./geometry\";\n\nexport function isDefined<T>(\n\targ: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n\treturn arg !== null && arg !== undefined;\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n\tevents.length > 0;\n\nexport const filterNotEmpty = <T>(\n\tstream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem));\n\nexport function isWithinPosThreshold(\n\tstartEvent: PointerEvent,\n\tendEvent: PointerEvent,\n\tposThreshold: number,\n) {\n\tconst start = calculateCentroid([startEvent]);\n\tconst end = calculateCentroid([endEvent]);\n\n\t// Determines if the movement qualifies as a drag\n\treturn (\n\t\tMath.abs(end.x - start.x) >= posThreshold ||\n\t\tMath.abs(end.y - start.y) >= posThreshold\n\t);\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n\tdelay: number,\n\tdeltaX: number,\n\tdeltaY: number,\n) => {\n\tconst velocityX = delay > 0 ? deltaX / delay : 0;\n\tconst velocityY = delay > 0 ? deltaY / delay : 0;\n\n\treturn {\n\t\tvelocityX,\n\t\tvelocityY,\n\t};\n};\n","import {\n\tdefer,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tscan,\n\ttakeWhile,\n} from \"rxjs\";\nimport { isDefined } from \"./utils\";\n\nexport function matchPointer(pointer: PointerEvent) {\n\treturn (stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((newPointer) => newPointer.pointerId === pointer.pointerId),\n\t\t);\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n\tpointerEvent.type === \"pointerleave\" ||\n\tpointerEvent.type === \"pointercancel\" ||\n\tpointerEvent.type === \"pointerup\";\n\n/**\n * A press of the primary button: a left click, a finger or a pen's tip. A\n * right click is for the context menu, a middle click for the browser, and a\n * pen's barrel button or eraser for the app.\n *\n * @see https://w3c.github.io/pointerevents/#the-button-property\n */\nconst isPrimaryButtonPress = (event: PointerEvent) => event.button === 0;\n\n/**\n * The presses that start a gesture. Every recognizer tracks a pointer from its\n * press, so a pointer pressed with another button starts none: no tap, pan or\n * pinch, and no share of a multi tap.\n */\nexport const fromPointerDown = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) =>\n\tfromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n\t\tmap(afterEventReceived),\n\t\tfilter(isPrimaryButtonPress),\n\t);\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n\t({\n\t\tpointerEvent$,\n\t}: {\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t\t/**\n\t\t * Setting this value to false will not update the list\n\t\t * on pointer move. Use it if you only need to track number of active\n\t\t * fingers.\n\t\t */\n\t\ttrackMove: boolean;\n\t}) =>\n\t(stream: Observable<PointerEvent>) => {\n\t\ttype PointersState = {\n\t\t\tevent: PointerEvent;\n\t\t\tpointers: Record<number, PointerEvent | undefined>;\n\t\t};\n\n\t\tconst pointerUp$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\t\tconst pointerLeave$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerleave\"),\n\t\t);\n\t\tconst pointerCancel$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\t\tconst pointerMove$ = pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\t\tconst contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\");\n\n\t\tconst isPointerRemoved = (event: PointerEvent) =>\n\t\t\t[\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n\t\t\t\tevent.type,\n\t\t\t);\n\n\t\treturn stream.pipe(\n\t\t\tmergeMap((pointerDown) => {\n\t\t\t\tconst pointerDown$ = defer(() => of(pointerDown));\n\n\t\t\t\tconst tracking$ = merge(\n\t\t\t\t\tpointerDown$,\n\t\t\t\t\tmerge(\n\t\t\t\t\t\tpointerMove$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerLeave$,\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tcontextMenu$,\n\t\t\t\t\t),\n\t\t\t\t).pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerRemoved(event), true),\n\t\t\t\t);\n\n\t\t\t\treturn tracking$;\n\t\t\t}),\n\t\t\tscan<PointerEvent, PointersState, undefined>((acc, event) => {\n\t\t\t\tif (isPointerRemoved(event)) {\n\t\t\t\t\tconst { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {};\n\n\t\t\t\t\tvoid _deleted;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpointers: rest,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tevent,\n\t\t\t\t\tpointers: {\n\t\t\t\t\t\t...(acc?.pointers ?? {}),\n\t\t\t\t\t\t[event.pointerId]: event,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}, undefined),\n\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\tevent,\n\t\t\t\tpointers: Object.values(pointers).filter(isDefined),\n\t\t\t})),\n\t\t);\n\t};\n","import {\n\tdistinctUntilChanged,\n\tfilter,\n\ttype Observable,\n\tshareReplay,\n} from \"rxjs\";\n\nexport const emitOnceWhen =\n\t<T>(condition: (value: T) => boolean) =>\n\t(stream: Observable<T>) =>\n\t\tstream.pipe(\n\t\t\t// only emit once when we have a condition switch\n\t\t\tdistinctUntilChanged((previous, current) => {\n\t\t\t\tconst previousHasLessThan = condition(previous);\n\t\t\t\tconst currentHasLessThan = condition(current);\n\n\t\t\t\treturn previousHasLessThan === currentHasLessThan;\n\t\t\t}),\n\t\t\t// make sure to only pass true\n\t\t\tfilter(condition),\n\t\t);\n\n/**\n * Shares the latest value with late subscribers, and unsubscribes from the\n * source along with the last subscriber, which shareReplay(1) doesn't do.\n */\nexport const shareLatest = <T>() =>\n\tshareReplay<T>({ bufferSize: 1, refCount: true });\n","import { filter, type Observable } from \"rxjs\";\nimport { isPointerOffEvent } from \"../utils/events\";\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n\tstream: Observable<T>,\n) =>\n\tstream.pipe(\n\t\tfilter(\n\t\t\t(config): config is T & { container: HTMLElement } => !!config.container,\n\t\t),\n\t);\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n\tstream.pipe(filter(isPointerOffEvent));\n","import { map, type Observable, scan } from \"rxjs\";\nimport {\n\tcalculateAngleDelta,\n\tcalculateAverageDistance,\n\tcalculateCentroid,\n} from \"../utils/geometry\";\nimport { calculateVelocity } from \"../utils/utils\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\n\nexport interface RecognizerEventInput {\n\tevent: PointerEvent;\n\tlatestActivePointers: PointerEvent[];\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n\tstartTime: number;\n\tcenter: { x: number; y: number };\n\tdeltaX: number;\n\tdeltaY: number;\n\tdeltaPointersAngle: number;\n}\n\nconst calculateNewDelta = (\n\tnewCenter: { x: number; y: number },\n\tprevCenter: { x: number; y: number },\n\tprevDeltaX: number,\n\tprevDeltaY: number,\n) => {\n\tconst deltaX = newCenter.x - prevCenter.x + prevDeltaX;\n\tconst deltaY = newCenter.y - prevCenter.y + prevDeltaY;\n\n\treturn {\n\t\tdeltaX,\n\t\tdeltaY,\n\t};\n};\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n\tstream: Observable<T>,\n): Observable<RecognizerEvent> => {\n\tconst getCenterFromData = (data: T) =>\n\t\tcalculateCentroid(\n\t\t\t!data.latestActivePointers.length\n\t\t\t\t? [data.event]\n\t\t\t\t: data.latestActivePointers,\n\t\t);\n\n\treturn stream.pipe(\n\t\tscan<T, RecognizerEventState, undefined>((acc, curr) => {\n\t\t\tconst newCenter = getCenterFromData(curr);\n\t\t\tconst prevCenter = acc?.center ?? newCenter;\n\t\t\tconst prevDeltaX = acc?.deltaX ?? 0;\n\t\t\tconst prevDeltaY = acc?.deltaY ?? 0;\n\t\t\tconst prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1;\n\t\t\tconst currActivePointersNumber = curr.latestActivePointers?.length ?? 1;\n\n\t\t\tconst hasAddedOrRemovedAFinger =\n\t\t\t\t[\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n\t\t\t\t\tcurr.event.type,\n\t\t\t\t) && prevActivePointersNumber !== currActivePointersNumber;\n\n\t\t\tconst hasAtLeastOneFinger = currActivePointersNumber > 0;\n\n\t\t\tconst { deltaX, deltaY } =\n\t\t\t\t(hasAddedOrRemovedAFinger && hasAtLeastOneFinger) ||\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type === \"pointercancel\"\n\t\t\t\t\t? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n\t\t\t\t\t: calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY);\n\n\t\t\tconst { degreesDelta: deltaPointersAngle } =\n\t\t\t\tprevActivePointersNumber === currActivePointersNumber &&\n\t\t\t\tprevActivePointersNumber >= 2 &&\n\t\t\t\tcurrActivePointersNumber >= 2 &&\n\t\t\t\t/**\n\t\t\t\t * A pointercancel cean come after a drag event and heven being completely\n\t\t\t\t * desync, leading to erroned values. We should just ignore it.\n\t\t\t\t */\n\t\t\t\tcurr.event.type !== \"pointercancel\"\n\t\t\t\t\t? calculateAngleDelta(\n\t\t\t\t\t\t\tacc?.latestActivePointers ?? [],\n\t\t\t\t\t\t\tcurr.latestActivePointers ?? [],\n\t\t\t\t\t\t)\n\t\t\t\t\t: { degreesDelta: 0 };\n\n\t\t\treturn {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t\t...acc,\n\t\t\t\t...curr,\n\t\t\t\tcenter: newCenter,\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t};\n\t\t}, undefined),\n\t\tmap((data) => {\n\t\t\tconst {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tlatestActivePointers,\n\t\t\t\tstartTime,\n\t\t\t\tcenter,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t} = data;\n\t\t\tconst events = latestActivePointers ?? [];\n\n\t\t\t// Calculate the change in time\n\t\t\tconst now = Date.now();\n\t\t\tconst delay = now - startTime;\n\n\t\t\tconst { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY);\n\t\t\tconst pointersAverageDistance =\n\t\t\t\tcalculateAverageDistance(latestActivePointers);\n\n\t\t\treturn {\n\t\t\t\tdeltaX,\n\t\t\t\tdeltaY,\n\t\t\t\tvelocityX,\n\t\t\t\tvelocityY,\n\t\t\t\tdelay,\n\t\t\t\tcenter,\n\t\t\t\tpointers: events,\n\t\t\t\tstartTime,\n\t\t\t\tevent,\n\t\t\t\tdeltaPointersAngle,\n\t\t\t\tpointersAverageDistance,\n\t\t\t} satisfies RecognizerEvent;\n\t\t}),\n\t);\n};\n","import { fromEvent, map, merge } from \"rxjs\";\nimport { fromPointerDown } from \"../utils/events\";\n\nexport const getPointerEvents = ({\n\tcontainer,\n\tafterEventReceived = (event) => event,\n}: {\n\tcontainer: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n}) => {\n\tconst pointerDown$ = fromPointerDown({ afterEventReceived, container });\n\tconst pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\tconst pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Mostly used to handle cursor leaving window on mouse pointers.\n\t */\n\tconst pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n\t\tmap(afterEventReceived),\n\t);\n\t/**\n\t * Handle things such as contextual menu popup or\n\t * native swipe navigation conflict.\n\t */\n\tconst pointerCancel$ = fromEvent<PointerEvent>(\n\t\tcontainer,\n\t\t\"pointercancel\",\n\t).pipe(map(afterEventReceived));\n\n\tconst pointerEvents$ = merge(\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t);\n\n\treturn {\n\t\tpointerEvents$,\n\t\tpointerDown$,\n\t\tpointerCancel$,\n\t\tpointerLeave$,\n\t\tpointerUp$,\n\t\tpointerMove$,\n\t};\n};\n","import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\tmergeMap,\n\ttype Observable,\n\tof,\n\tshare,\n\tshareReplay,\n\tskip,\n\tstartWith,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\ttimer,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { matchPointer, trackPointers } from \"../utils/events\";\nimport { shareLatest } from \"../utils/operators\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\nimport { filterPointerOff, isValidConfig } from \"./operators\";\nimport type { RecognizerEvent } from \"./RecognizerEvent\";\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\";\nimport { getPointerEvents } from \"./utils\";\n\ntype PanConfig = {\n\tposThreshold?: number;\n\tdelay?: number;\n\t/**\n\t * Number of inputs to trigger the event.\n\t * Default to 1\n\t */\n\tnumInputs?: number;\n};\n\nexport interface FailWith {\n\tstart$: Observable<unknown>;\n\tend$: Observable<unknown>;\n}\n\nexport type RecognizerConfig<Options> = {\n\tcontainer?: HTMLElement;\n\tafterEventReceived?: (event: PointerEvent) => PointerEvent;\n\toptions?: Options;\n\tfailWith?: FailWith[];\n};\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n\ttype: \"start\" | \"move\" | \"end\";\n}\n\nexport type State = {\n\tfingers: number;\n};\n\nexport abstract class Recognizer<\n\tOptions extends object = never,\n\tEvent extends RecognizerEvent = RecognizerEvent,\n> {\n\tprotected configSubject = new BehaviorSubject<\n\t\tRecognizerConfig<Options> & {\n\t\t\tpanConfig?: PanConfig;\n\t\t}\n\t>({});\n\tprotected pan$: Observable<RecognizerPanEvent>;\n\tprotected panStart$: Observable<RecognizerEvent>;\n\tprotected panMove$: Observable<RecognizerEvent>;\n\tprotected panEnd$: Observable<RecognizerEvent>;\n\n\tprotected pointerEvent$: Observable<PointerEvent>;\n\tprotected pointerDown$: Observable<PointerEvent>;\n\tprotected pointerUp$: Observable<PointerEvent>;\n\tprotected pointerCancel$: Observable<PointerEvent>;\n\tprotected pointerMove$: Observable<PointerEvent>;\n\tprotected pointerOff$: Observable<PointerEvent>;\n\n\tpublic state$: Observable<State>;\n\tpublic config$ = this.configSubject.pipe(isValidConfig);\n\n\tabstract events$: Observable<Event>;\n\n\t/**\n\t * Track active running failWith recognizers\n\t */\n\tprotected failWithActive$: Observable<boolean>;\n\n\tconstructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n\t\tconst stateSubject = new BehaviorSubject<State>({\n\t\t\tfingers: 0,\n\t\t});\n\n\t\tthis.pointerEvent$ = this.config$.pipe(\n\t\t\tswitchMap(\n\t\t\t\t({ container, afterEventReceived }) =>\n\t\t\t\t\tgetPointerEvents({\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\tafterEventReceived,\n\t\t\t\t\t}).pointerEvents$,\n\t\t\t),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.pointerDown$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerdown\"),\n\t\t);\n\n\t\tthis.pointerUp$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointerup\"),\n\t\t);\n\n\t\tthis.pointerMove$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointermove\"),\n\t\t);\n\n\t\tthis.pointerCancel$ = this.pointerEvent$.pipe(\n\t\t\tfilter((event) => event.type === \"pointercancel\"),\n\t\t);\n\n\t\tthis.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff);\n\n\t\tconst failWith$ = this.config$.pipe(\n\t\t\tmap(({ failWith }) => failWith),\n\t\t\tdistinctUntilChanged(),\n\t\t);\n\n\t\tthis.failWithActive$ = failWith$.pipe(\n\t\t\tswitchMap((failWith) => {\n\t\t\t\tconst areRunnings$ = failWith?.map((recognizer) => {\n\t\t\t\t\tconst start$ = recognizer.start$.pipe(map(() => true));\n\n\t\t\t\t\tconst end$ = recognizer.end$.pipe(map(() => false));\n\n\t\t\t\t\tconst isRunning$ = merge(start$, end$).pipe(startWith(false));\n\n\t\t\t\t\treturn isRunning$;\n\t\t\t\t});\n\n\t\t\t\tif (!areRunnings$?.length) {\n\t\t\t\t\treturn combineLatest([of(false)]);\n\t\t\t\t}\n\n\t\t\t\treturn combineLatest(areRunnings$);\n\t\t\t}),\n\t\t\tmap((runnings) => runnings.some((running) => running)),\n\t\t\t/**\n\t\t\t * Keeps following the failWith recognizers once subscribed: they can't\n\t\t\t * be asked whether they run, so a recognizer subscribing again later\n\t\t\t * would miss the gesture of one that started in between.\n\t\t\t */\n\t\t\tshareReplay(1),\n\t\t);\n\n\t\tthis.pan$ = this.configSubject.pipe(\n\t\t\tisValidConfig,\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst numInputs = Math.max(1, config.panConfig?.numInputs ?? 1);\n\t\t\t\tconst posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0);\n\t\t\t\tconst delay = Math.max(0, config.panConfig?.delay ?? 0);\n\n\t\t\t\tconst trackPointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst hasEnoughFingers = (\n\t\t\t\t\tstream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tfilter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tevents,\n\t\t\t\t\t\t\t): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n\t\t\t\t\t\t\t\tevents.pointers.length >= numInputs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tconst hasNotEnoughFingers = (\n\t\t\t\t\tstream: Observable<{\n\t\t\t\t\t\tevent: PointerEvent;\n\t\t\t\t\t\tpointers: PointerEvent[];\n\t\t\t\t\t}>,\n\t\t\t\t) =>\n\t\t\t\t\tstream.pipe(filter((events) => events.pointers.length < numInputs));\n\n\t\t\t\treturn trackPointers$.pipe(\n\t\t\t\t\thasEnoughFingers,\n\t\t\t\t\texhaustMap(({ pointers: initialPointerEvents }) => {\n\t\t\t\t\t\tconst panReleased$ = trackPointers$.pipe(\n\t\t\t\t\t\t\thasNotEnoughFingers,\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst delay$ = timer(delay);\n\n\t\t\t\t\t\tconst pointerDownPassingThreshold$ = merge(\n\t\t\t\t\t\t\t...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(\n\t\t\t\t\t\t\tmergeMap((pointerDown) =>\n\t\t\t\t\t\t\t\tmerge(this.pointerMove$, of(pointerDown)).pipe(\n\t\t\t\t\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\t\t\t\t\tfilter((pointerEvent) =>\n\t\t\t\t\t\t\t\t\t\tisWithinPosThreshold(\n\t\t\t\t\t\t\t\t\t\t\tpointerDown,\n\t\t\t\t\t\t\t\t\t\t\tpointerEvent,\n\t\t\t\t\t\t\t\t\t\t\tposThreshold,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panStart$ = pointerDownPassingThreshold$.pipe(\n\t\t\t\t\t\t\tswitchMap(() => delay$),\n\t\t\t\t\t\t\twithLatestFrom(trackPointers$),\n\t\t\t\t\t\t\tmap(([, { event, pointers }]) => ({\n\t\t\t\t\t\t\t\ttype: \"start\" as const,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareLatest(),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panUpdate$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\ttrackPointers$.pipe(\n\t\t\t\t\t\t\t\t\tskip(1),\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"move\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttakeUntil(panReleased$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst panEnd$ = panStart$.pipe(\n\t\t\t\t\t\t\tmergeMap(() =>\n\t\t\t\t\t\t\t\tpanReleased$.pipe(\n\t\t\t\t\t\t\t\t\tmap(({ event, pointers }) => ({\n\t\t\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tlatestActivePointers: pointers,\n\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n\t\t\t\t\t\t\tshareLatest(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\ttap((event) => {\n\t\t\t\tstateSubject.next({\n\t\t\t\t\tfingers: event.pointers.length,\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshare({\n\t\t\t\t/**\n\t\t\t\t * A tick later, so that resubscribing right away, as a React effect\n\t\t\t\t * does, keeps following the fingers already pressed.\n\t\t\t\t */\n\t\t\t\tresetOnRefCountZero: () => timer(0),\n\t\t\t}),\n\t\t);\n\n\t\tthis.panStart$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"start\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panMove$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.panEnd$ = this.pan$.pipe(\n\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\tmap(({ type, ...rest }) => rest),\n\t\t);\n\n\t\tthis.state$ = stateSubject.asObservable();\n\n\t\tthis.updateInternal(config ?? {}, panConfig);\n\t}\n\n\tprivate updateInternal(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tconst existingConfig = this.configSubject.getValue();\n\n\t\tthis.configSubject.next({\n\t\t\t...existingConfig,\n\t\t\t...config,\n\t\t\t...(config.options && {\n\t\t\t\toptions: { ...existingConfig.options, ...config.options },\n\t\t\t}),\n\t\t\tpanConfig: {\n\t\t\t\t...existingConfig.panConfig,\n\t\t\t\t...panConfig,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic update(\n\t\tconfig: Partial<RecognizerConfig<Options>>,\n\t\tpanConfig?: PanConfig,\n\t) {\n\t\tthis.updateInternal(config, panConfig);\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tHoldEvent,\n\tHoldRecognizerInterface,\n\tHoldRecognizerOptions,\n} from \"./HoldRecognizerInterface\";\n\nexport type { HoldEvent };\n\nexport class HoldRecognizer\n\textends Recognizer<HoldRecognizerOptions, HoldEvent>\n\timplements HoldRecognizerInterface\n{\n\tpublic events$: Observable<HoldEvent>;\n\n\tconstructor(options: RecognizerConfig<HoldRecognizerOptions> = {}) {\n\t\tsuper(options, {\n\t\t\tnumInputs: 1,\n\t\t\tdelay: 0,\n\t\t\tposThreshold: 0,\n\t\t\t...options.options,\n\t\t});\n\n\t\tconst start$ = this.panStart$.pipe(\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"holdStart\" as const,\n\t\t\t\t\t...event,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\tthis.events$ = start$.pipe(\n\t\t\tswitchMap((holdStartEvent) => {\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst end$ = this.panEnd$.pipe(\n\t\t\t\t\tfirst(),\n\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: \"holdEnd\" as const,\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\t// cancelled by failWith: it ends where it started\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({ ...holdStartEvent, type: \"holdEnd\" as const })),\n\t\t\t\t\ttakeUntil(this.panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(of(holdStartEvent), end$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<HoldRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tPanEvent,\n\tPanRecognizerInterface,\n\tPanRecognizerOptions,\n} from \"./PanRecognizerInterface\";\n\nexport type { PanEvent };\n\nexport class PanRecognizer\n\textends Recognizer<PanRecognizerOptions, PanEvent>\n\timplements PanRecognizerInterface\n{\n\tpublic events$: Observable<PanEvent>;\n\tpublic start$: Observable<PanEvent>;\n\tpublic end$: Observable<PanEvent>;\n\n\tconstructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tposThreshold: config?.options?.posThreshold ?? 15,\n\t\t});\n\n\t\tconst panStart$ = this.panStart$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panStart\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\tmap(([event]) => event),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panEnd$ = this.panEnd$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t\tshare(),\n\t\t);\n\n\t\tconst panMove$ = this.panMove$.pipe(\n\t\t\tmap((event) => ({\n\t\t\t\ttype: \"panMove\" as const,\n\t\t\t\t...event,\n\t\t\t})),\n\t\t);\n\n\t\tthis.events$ = panStart$.pipe(\n\t\t\tswitchMap((panStartEvent) => {\n\t\t\t\tlet latestEvent: PanEvent = panStartEvent;\n\n\t\t\t\tconst panStarted$ = of(panStartEvent);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst events$ = merge(panStarted$, panMove$, panEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t);\n\n\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\ttype: \"panEnd\" as const,\n\t\t\t\t\t})),\n\t\t\t\t\ttakeUntil(panEnd$),\n\t\t\t\t);\n\n\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"panStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"panEnd\"));\n\t}\n\n\tpublic update(config: RecognizerConfig<PanRecognizerOptions>) {\n\t\tsuper.update(config, config.options);\n\t}\n}\n","import { map, type Observable, scan } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\nimport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport const scanPanEventToPinchEvent =\n\t({\n\t\ttype,\n\t\tinitialEvent,\n\t}: {\n\t\ttype: PinchEvent[\"type\"];\n\t\tinitialEvent: PinchEvent | RecognizerEvent | undefined;\n\t}) =>\n\t(stream: Observable<RecognizerEvent | PinchEvent>) =>\n\t\tstream.pipe(\n\t\t\tscan<\n\t\t\t\tRecognizerEvent | PinchEvent,\n\t\t\t\tPinchEvent & {\n\t\t\t\t\tinitialPointersAverageDistance: number;\n\t\t\t\t},\n\t\t\t\tPinchEvent | RecognizerEvent | undefined\n\t\t\t>((acc, curr) => {\n\t\t\t\tconst previousPointersLength = acc?.pointers.length ?? 0;\n\t\t\t\tconst hasChangedFingers =\n\t\t\t\t\tpreviousPointersLength !== curr.pointers.length;\n\t\t\t\tconst previousPointersAverageDistance =\n\t\t\t\t\tacc?.pointersAverageDistance ?? curr.pointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * initial average distance is reset every time we change fingers,\n\t\t\t\t * otherwise it is the one of the event we continue from (the pinch\n\t\t\t\t * start for the first move)\n\t\t\t\t * @important in case of 1 finger, distance will be 0\n\t\t\t\t */\n\t\t\t\tconst initialPointersAverageDistance = hasChangedFingers\n\t\t\t\t\t? curr.pointersAverageDistance\n\t\t\t\t\t: acc && \"initialPointersAverageDistance\" in acc\n\t\t\t\t\t\t? acc.initialPointersAverageDistance\n\t\t\t\t\t\t: previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t */\n\t\t\t\tconst scale =\n\t\t\t\t\tinitialPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / initialPointersAverageDistance;\n\n\t\t\t\tconst distance =\n\t\t\t\t\tcurr.pointersAverageDistance - initialPointersAverageDistance;\n\n\t\t\t\tconst deltaDistance = hasChangedFingers\n\t\t\t\t\t? 0\n\t\t\t\t\t: curr.pointersAverageDistance - previousPointersAverageDistance;\n\n\t\t\t\t/**\n\t\t\t\t * @important When finger is 1, distance is 0\n\t\t\t\t * Same when fingers change\n\t\t\t\t */\n\t\t\t\tconst deltaDistanceScale =\n\t\t\t\t\thasChangedFingers || previousPointersAverageDistance === 0\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: curr.pointersAverageDistance / previousPointersAverageDistance;\n\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t...curr,\n\t\t\t\t\ttype,\n\t\t\t\t\tinitialPointersAverageDistance,\n\t\t\t\t\tscale,\n\t\t\t\t\tdistance,\n\t\t\t\t\tdeltaDistance,\n\t\t\t\t\tdeltaDistanceScale,\n\t\t\t\t};\n\t\t\t}, initialEvent),\n\t\t\tmap(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n\t\t);\n","import {\n\tdefaultIfEmpty,\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttakeWhile,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { shareLatest } from \"../utils/operators\";\nimport type {\n\tPinchEvent,\n\tPinchRecognizerInterface,\n\tPinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\";\nimport { scanPanEventToPinchEvent } from \"./scanPanEventToPinchEvent\";\n\nexport type { PinchEvent } from \"./PinchRecognizerInterface\";\n\nexport class PinchRecognizer\n\textends Recognizer<PinchRecognizerOptions, PinchEvent>\n\timplements PinchRecognizerInterface\n{\n\tpublic events$: Observable<PinchEvent>;\n\n\tpublic start$: Observable<PinchEvent>;\n\tpublic end$: Observable<PinchEvent>;\n\n\tconstructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\t...config?.options,\n\t\t\tnumInputs: 2,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tlet latestPinchEvent: PinchEvent | undefined;\n\n\t\t\t\tconst pinchStarted$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => event),\n\t\t\t\t\tswitchMap((event) =>\n\t\t\t\t\t\tof(event).pipe(\n\t\t\t\t\t\t\t// we don't want a scan on pinch start\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchStart\",\n\t\t\t\t\t\t\t\tinitialEvent: undefined,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\tfirst(),\n\t\t\t\t);\n\n\t\t\t\tconst pinchMove$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((initialEvent) => {\n\t\t\t\t\t\treturn this.pan$.pipe(\n\t\t\t\t\t\t\ttakeWhile((event) => event.type !== \"end\"),\n\t\t\t\t\t\t\tscanPanEventToPinchEvent({\n\t\t\t\t\t\t\t\ttype: \"pinchMove\",\n\t\t\t\t\t\t\t\tinitialEvent,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t// only for this pinch, the next ones may move again\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst pinchEnd$ = pinchStarted$.pipe(\n\t\t\t\t\tswitchMap((pinchStartEvent) =>\n\t\t\t\t\t\tthis.pan$.pipe(\n\t\t\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t\tdefaultIfEmpty(null),\n\t\t\t\t\t\t\tmap((endEvent) => {\n\t\t\t\t\t\t\t\tconst latestEvent = latestPinchEvent ?? pinchStartEvent;\n\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * It ends where it got to: lifting a finger leaves too few\n\t\t\t\t\t\t\t\t * to measure the distance, and a failWith cancelling it\n\t\t\t\t\t\t\t\t * moves none. So nothing changed since the latest event.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...(endEvent ?? latestEvent),\n\t\t\t\t\t\t\t\t\ttype: \"pinchEnd\" as const,\n\t\t\t\t\t\t\t\t\tscale: latestEvent.scale,\n\t\t\t\t\t\t\t\t\tdistance: latestEvent.distance,\n\t\t\t\t\t\t\t\t\tdeltaDistance: 0,\n\t\t\t\t\t\t\t\t\tdeltaDistanceScale: 1,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tshare(),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn merge(pinchStarted$, pinchMove$, pinchEnd$).pipe(\n\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\tlatestPinchEvent = event;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\n\t\tthis.start$ = this.events$.pipe(\n\t\t\tfilter((event) => event.type === \"pinchStart\"),\n\t\t);\n\n\t\tthis.end$ = this.events$.pipe(filter((event) => event.type === \"pinchEnd\"));\n\t}\n\n\tpublic update(options: RecognizerConfig<PinchRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import {\n\tcombineLatest,\n\tmap,\n\tmerge,\n\ttype Observable,\n\ttype ObservedValueOf,\n\tshare,\n} from \"rxjs\";\nimport type { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\";\nimport type {\n\tRecognizableInterface,\n\tRecognizableState,\n} from \"./RecognizableInterface\";\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype RecognizableOptions<T extends Recognizer<any, any>[]> = {\n\trecognizers: T;\n\t/**\n\t * If you don't need to have text selection, set this to true\n\t * to improve dragging gesture. This will prevent accidental\n\t * text selection on your component.\n\t */\n\tdisableTextSelection?: boolean;\n} & RecognizerConfig<unknown>;\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport class Recognizable<T extends Recognizer<any, any>[]>\n\timplements RecognizableInterface<T>\n{\n\tevents$: Observable<{\n\t\tevent: ObservedValueOf<T[number][\"events$\"]>;\n\t\trecognizer: T[number];\n\t}>;\n\n\trecognizers: T;\n\n\tstate$: Observable<RecognizableState>;\n\n\tconstructor(protected options: RecognizableOptions<T>) {\n\t\tthis.recognizers = options.recognizers;\n\n\t\tthis.events$ = merge(\n\t\t\t...options.recognizers.map((recognizer) =>\n\t\t\t\trecognizer.events$.pipe(map((event) => ({ event, recognizer }))),\n\t\t\t),\n\t\t).pipe(share());\n\n\t\tthis.state$ = combineLatest(\n\t\t\tthis.recognizers.map((recognizer) => recognizer.state$),\n\t\t).pipe(\n\t\t\tmap((states) =>\n\t\t\t\tstates.reduce((acc, state) => ({\n\t\t\t\t\tfingers: Math.max(acc.fingers, state.fingers),\n\t\t\t\t})),\n\t\t\t),\n\t\t);\n\n\t\tthis.update(options);\n\t}\n\n\tpublic update({\n\t\tdisableTextSelection,\n\t\t...rest\n\t}: Partial<Omit<RecognizableOptions<T>, \"recognizers\">>) {\n\t\tif (rest.container) {\n\t\t\t/**\n\t\t\t * We have to disable touch-action otherwise every events will be followed\n\t\t\t * by a cancel event since the browser will try to handle touch.\n\t\t\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n\t\t\t */\n\t\t\trest.container.style.touchAction = \"none\";\n\n\t\t\t/**\n\t\t\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t\t\t */\n\t\t\tif (disableTextSelection) {\n\t\t\t\trest.container.style.userSelect = \"none\";\n\t\t\t}\n\t\t}\n\n\t\tfor (const recognizer of this.options.recognizers) {\n\t\t\trecognizer.update(rest);\n\t\t}\n\t}\n}\n","import {\n\tfilter,\n\tfirst,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tscan,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\ttap,\n\twithLatestFrom,\n} from \"rxjs\";\nimport {\n\tRecognizer,\n\ttype RecognizerConfig,\n\ttype RecognizerPanEvent,\n} from \"../recognizer/Recognizer\";\nimport { shareLatest } from \"../utils/operators\";\nimport type {\n\tRotateEvent,\n\tRotateRecognizerInterface,\n\tRotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\";\n\nexport type { RotateEvent };\n\ntype RotatingEvent = RecognizerPanEvent & { angle: number; deltaAngle: number };\n\nexport class RotateRecognizer\n\textends Recognizer<RotateRecognizerOptions, RotateEvent>\n\timplements RotateRecognizerInterface\n{\n\tpublic events$: Observable<RotateEvent>;\n\n\tconstructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n\t\tsuper(config, {\n\t\t\tnumInputs: 2,\n\t\t\tposThreshold: 15,\n\t\t\t...config.options,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tconst rotateStart$ = this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tmap(([event]) => ({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\ttype: \"rotateStart\" as const,\n\t\t\t\t\t\tangle: 0,\n\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t})),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst rotate$ = rotateStart$.pipe(\n\t\t\t\t\tswitchMap((rotateStartEvent) => {\n\t\t\t\t\t\tlet latestEvent: RotatingEvent = {\n\t\t\t\t\t\t\t...rotateStartEvent,\n\t\t\t\t\t\t\ttype: \"start\",\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst failingActive$ = this.failWithActive$.pipe(\n\t\t\t\t\t\t\tfilter((isActive) => isActive),\n\t\t\t\t\t\t\tfirst(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst events$ = this.pan$.pipe(\n\t\t\t\t\t\t\tscan<RecognizerPanEvent, RotatingEvent, undefined>(\n\t\t\t\t\t\t\t\t(acc, current) => {\n\t\t\t\t\t\t\t\t\tconst angle = (acc?.angle ?? 0) + current.deltaPointersAngle;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t\t...current,\n\t\t\t\t\t\t\t\t\t\tangle,\n\t\t\t\t\t\t\t\t\t\tdeltaAngle: current.deltaPointersAngle,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttap((event) => {\n\t\t\t\t\t\t\t\tlatestEvent = event;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(failingActive$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// cancelled by failWith: it ends on the angle it reached\n\t\t\t\t\t\tconst trailingEndEventIfFailed$ = failingActive$.pipe(\n\t\t\t\t\t\t\tmap(() => ({\n\t\t\t\t\t\t\t\t...latestEvent,\n\t\t\t\t\t\t\t\ttype: \"end\" as const,\n\t\t\t\t\t\t\t\tdeltaAngle: 0,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(this.panEnd$),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn merge(events$, trailingEndEventIfFailed$);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\n\t\t\t\tconst rotateMove$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"move\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateMove\" as const })),\n\t\t\t\t);\n\n\t\t\t\tconst rotateEnd$ = rotate$.pipe(\n\t\t\t\t\tfilter((event) => event.type === \"end\"),\n\t\t\t\t\tmap((event) => ({ ...event, type: \"rotateEnd\" as const })),\n\t\t\t\t);\n\n\t\t\t\treturn merge(rotateStart$, rotateMove$, rotateEnd$);\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(options: RecognizerConfig<RotateRecognizerOptions>) {\n\t\tsuper.update(options, options.options);\n\t}\n}\n","import { filter, type Observable } from \"rxjs\";\nimport type { RecognizerEvent } from \"../recognizer/RecognizerEvent\";\n\nexport const isRecognizedAsSwipe =\n\t(escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n\t\tstream.pipe(\n\t\t\tfilter((event) => {\n\t\t\t\treturn (\n\t\t\t\t\tMath.abs(event.velocityX) >= escapeVelocity ||\n\t\t\t\t\tMath.abs(event.velocityY) >= escapeVelocity\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n","import {\n\tfilter,\n\tmap,\n\ttype Observable,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\";\nimport { isRecognizedAsSwipe } from \"./operators\";\nimport type {\n\tSwipeEvent,\n\tSwipeRecognizerInterface,\n\tSwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\";\n\nexport type { SwipeEvent };\n\nexport class SwipeRecognizer\n\textends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n\timplements SwipeRecognizerInterface\n{\n\tpublic events$: Observable<SwipeEvent>;\n\n\tconstructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper(config, {\n\t\t\tposThreshold: 0,\n\t\t\tnumInputs: 1,\n\t\t});\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((initializedWith) => {\n\t\t\t\tconst { escapeVelocity = 0.9 } = initializedWith.options ?? {};\n\n\t\t\t\treturn this.panStart$.pipe(\n\t\t\t\t\twithLatestFrom(this.failWithActive$),\n\t\t\t\t\tfilter(([, failWithActive]) => !failWithActive),\n\t\t\t\t\tswitchMap(([startEvent]) => {\n\t\t\t\t\t\treturn this.panEnd$.pipe(\n\t\t\t\t\t\t\tisRecognizedAsSwipe(escapeVelocity),\n\t\t\t\t\t\t\tmap((event) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: \"swipe\" as const,\n\t\t\t\t\t\t\t\t\tangle: calculateDegreeAngleBetweenPoints(\n\t\t\t\t\t\t\t\t\t\tstartEvent.event,\n\t\t\t\t\t\t\t\t\t\tevent.event,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((isActive) => isActive)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t\tshare(),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n\t\tsuper.update(config);\n\t}\n}\n","import {\n\tfilter,\n\tmergeMap,\n\ttype Observable,\n\ttakeUntil,\n\ttakeWhile,\n\ttimer,\n} from \"rxjs\";\nimport { filterPointerOff } from \"../recognizer/operators\";\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\";\nimport { isWithinPosThreshold } from \"../utils/utils\";\n\nexport const takeWhenPressedTooLong =\n\t({\n\t\ttimeout,\n\t\tpointerEvent$,\n\t}: {\n\t\ttimeout: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\ttimer(timeout).pipe(\n\t\t\t\t\ttakeUntil(\n\t\t\t\t\t\tpointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\nexport const takeWhenOutsideThreshold =\n\t({\n\t\tinitialPointerEvent,\n\t\tpointerEvent$,\n\t\ttolerance,\n\t}: {\n\t\tinitialPointerEvent: PointerEvent;\n\t\ttolerance: number;\n\t\tpointerEvent$: Observable<PointerEvent>;\n\t}) =>\n\t(stream: Observable<PointerEvent>) =>\n\t\tstream.pipe(\n\t\t\tmergeMap((pointerDown) =>\n\t\t\t\tpointerEvent$.pipe(\n\t\t\t\t\tmatchPointer(pointerDown),\n\t\t\t\t\ttakeWhile((event) => !isPointerOffEvent(event), true),\n\t\t\t\t\tfilter((event) =>\n\t\t\t\t\t\tisWithinPosThreshold(initialPointerEvent, event, tolerance),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n","import {\n\tbuffer,\n\tdebounceTime,\n\texhaustMap,\n\tfilter,\n\tfirst,\n\tignoreElements,\n\tmap,\n\tmerge,\n\ttype Observable,\n\tof,\n\tshare,\n\tswitchMap,\n\ttakeUntil,\n\twithLatestFrom,\n} from \"rxjs\";\nimport { Recognizer, type RecognizerConfig } from \"../recognizer/Recognizer\";\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\";\nimport { trackPointers } from \"../utils/events\";\nimport { shareLatest } from \"../utils/operators\";\nimport { filterNotEmpty } from \"../utils/utils\";\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\";\nimport type {\n\tTapEvent,\n\tTapRecognizerInterface,\n\tTapRecognizerOptions,\n} from \"./TapRecognizerInterface\";\n\nexport type { TapEvent };\n\nexport class TapRecognizer\n\textends Recognizer<TapRecognizerOptions, TapEvent>\n\timplements TapRecognizerInterface\n{\n\tpublic events$: Observable<TapEvent>;\n\n\tconstructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n\t\tsuper(options);\n\n\t\tthis.events$ = this.config$.pipe(\n\t\t\tswitchMap((config) => {\n\t\t\t\tconst maxTaps = config.options?.maxTaps ?? 1;\n\t\t\t\t/**\n\t\t\t\t * We default to reasonable multiplier of 100 to give time\n\t\t\t\t * for each tap\n\t\t\t\t */\n\t\t\t\tconst multiTapThreshold =\n\t\t\t\t\tconfig.options?.multiTapThreshold ?? 100 * (maxTaps - 1);\n\n\t\t\t\tconst { maximumPressTime = 150, tolerance = 10 } = config.options ?? {};\n\n\t\t\t\tconst activePointers$ = this.pointerDown$.pipe(\n\t\t\t\t\ttrackPointers({\n\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\ttrackMove: true,\n\t\t\t\t\t}),\n\t\t\t\t\tshareLatest(),\n\t\t\t\t);\n\n\t\t\t\tconst hasMoreThanOneActivePointer$ = activePointers$.pipe(\n\t\t\t\t\tfilter(({ pointers }) => pointers.length > 1),\n\t\t\t\t);\n\n\t\t\t\tconst bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n\t\t\t\t\tstream.pipe(\n\t\t\t\t\t\tbuffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n\t\t\t\t\t\tfirst(),\n\t\t\t\t\t);\n\n\t\t\t\tconst tap$ = merge(\n\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\tactivePointers$.pipe(ignoreElements()),\n\t\t\t\t).pipe(\n\t\t\t\t\texhaustMap((initialPointerEvent) => {\n\t\t\t\t\t\tconst pointerDowns$ = merge(\n\t\t\t\t\t\t\tof(initialPointerEvent),\n\t\t\t\t\t\t\tthis.pointerDown$,\n\t\t\t\t\t\t).pipe(shareLatest());\n\n\t\t\t\t\t\tconst pointerDownsBuffered$ =\n\t\t\t\t\t\t\tpointerDowns$.pipe(bufferPointerDowns);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `tolerance`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenOutsideThreshold({\n\t\t\t\t\t\t\t\tinitialPointerEvent,\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttolerance,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Exit condition for `maximumPressTime`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n\t\t\t\t\t\t\ttakeWhenPressedTooLong({\n\t\t\t\t\t\t\t\tpointerEvent$: this.pointerEvent$,\n\t\t\t\t\t\t\t\ttimeout: maximumPressTime,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst takeUntil$ = merge(\n\t\t\t\t\t\t\tthis.failWithActive$.pipe(filter((active) => active)),\n\t\t\t\t\t\t\tthis.pointerCancel$,\n\t\t\t\t\t\t\thasMoreThanOneActivePointer$,\n\t\t\t\t\t\t\tclickedTooFarFromOriginalTap$,\n\t\t\t\t\t\t\thasFingersPressedForTooLong$,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst rawEvent$ = pointerDownsBuffered$.pipe(\n\t\t\t\t\t\t\tfilterNotEmpty,\n\t\t\t\t\t\t\tfilter((events) => events.length <= maxTaps),\n\t\t\t\t\t\t\tmap((events) => ({\n\t\t\t\t\t\t\t\ttype: \"tap\" as const,\n\t\t\t\t\t\t\t\ttaps: events.length,\n\t\t\t\t\t\t\t\tlatestActivePointers: events,\n\t\t\t\t\t\t\t\tevent: events[0],\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tshareLatest(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn rawEvent$.pipe(\n\t\t\t\t\t\t\tscanToRecognizerEvent,\n\t\t\t\t\t\t\twithLatestFrom(rawEvent$),\n\t\t\t\t\t\t\tmap(([recognizerEvent, { type, taps }]) => ({\n\t\t\t\t\t\t\t\t...recognizerEvent,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\ttaps,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\ttakeUntil(takeUntil$),\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn tap$;\n\t\t\t}),\n\t\t\tshare(),\n\t\t);\n\t}\n\n\tpublic update(config: RecognizerConfig<TapRecognizerOptions>): void {\n\t\tsuper.update(config);\n\t}\n}\n"],"mappings":"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"}
|