gesturx 1.7.5 → 1.7.6

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/README.md CHANGED
@@ -4,7 +4,7 @@ Modern multi touch gesture recognizer using rxjs.
4
4
 
5
5
  # Documentation
6
6
 
7
- Head over the [documentation](https://github.com/mbret/gesturx/wiki/Documentation).
7
+ Head over the [documentation](https://bret-maxime.gitbook.io/gesturx).
8
8
 
9
9
  # Demo
10
10
 
package/dist/index.d.ts CHANGED
@@ -57,6 +57,7 @@ export declare interface PinchEvent extends RecognizerEvent {
57
57
 
58
58
  export declare class PinchRecognizer extends Recognizer<PinchRecognizerOptions, PinchEvent> implements PinchRecognizerInterface {
59
59
  events$: Observable<PinchEvent>;
60
+ start$: Observable<PinchEvent>;
60
61
  constructor(config?: RecognizerConfig<PinchRecognizerOptions>);
61
62
  update(options: RecognizerConfig<PinchRecognizerOptions>): void;
62
63
  }
@@ -140,7 +141,7 @@ export declare abstract class Recognizer<Options extends object = never, Event e
140
141
  state$: Observable<State>;
141
142
  abstract events$: Observable<Event>;
142
143
  protected failWith$: Observable<unknown>;
143
- protected config$: Observable<RecognizerConfig<Options> & {
144
+ config$: Observable<RecognizerConfig<Options> & {
144
145
  panConfig?: PanConfig | undefined;
145
146
  } & {
146
147
  container: HTMLElement;
package/dist/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  var ee = Object.defineProperty;
2
2
  var te = (n, s, e) => s in n ? ee(n, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[s] = e;
3
3
  var h = (n, s, e) => te(n, typeof s != "symbol" ? s + "" : s, e);
4
- import { filter as c, fromEvent as S, mergeMap as T, defer as ne, of as b, merge as y, takeWhile as N, scan as O, map as u, BehaviorSubject as B, switchMap as v, NEVER as se, shareReplay as x, exhaustMap as G, first as Y, share as f, timer as H, withLatestFrom as j, takeUntil as k, skip as ie, tap as pe, ignoreElements as oe, buffer as re, debounceTime as ae, startWith as le, pairwise as he, combineLatest as ce } from "rxjs";
5
- function ue(n, s) {
4
+ import { filter as c, fromEvent as S, mergeMap as T, defer as ne, of as b, merge as y, takeWhile as N, scan as O, map as u, BehaviorSubject as B, switchMap as v, distinctUntilChanged as se, NEVER as ie, shareReplay as x, exhaustMap as _, first as X, share as f, timer as G, withLatestFrom as Y, takeUntil as k, skip as pe, tap as oe, ignoreElements as re, buffer as ae, debounceTime as le, startWith as he, pairwise as ce, combineLatest as ue } from "rxjs";
5
+ function $e(n, s) {
6
6
  return Math.sqrt(
7
7
  Math.pow(s.x - n.x, 2) + Math.pow(s.y - n.y, 2)
8
8
  );
9
9
  }
10
- function $e(n) {
10
+ function de(n) {
11
11
  const s = n.length;
12
12
  if (s < 2) return 0;
13
- const e = n.reduce((t, o, a) => t + n.slice(a + 1).reduce((r, p) => r + ue(o, p), 0), 0), i = s * (s - 1) / 2;
13
+ const e = n.reduce((t, o, a) => t + n.slice(a + 1).reduce((r, p) => r + $e(o, p), 0), 0), i = s * (s - 1) / 2;
14
14
  return e / i;
15
15
  }
16
- function U(n, s) {
16
+ function j(n, s) {
17
17
  const e = s.x - n.x, i = s.y - n.y;
18
18
  return Math.atan2(i, e);
19
19
  }
20
- function de(n, s) {
21
- return U(n, s) * (180 / Math.PI);
20
+ function ge(n, s) {
21
+ return j(n, s) * (180 / Math.PI);
22
22
  }
23
23
  function C(n) {
24
24
  const s = n.reduce(
@@ -30,17 +30,17 @@ function C(n) {
30
30
  y: s.y / e
31
31
  };
32
32
  }
33
- function ge(n, s) {
33
+ function ve(n, s) {
34
34
  if (n.length !== s.length)
35
35
  throw new Error("Initial and new points arrays must have the same length.");
36
36
  const e = C(n), i = C(s);
37
37
  let t = 0;
38
38
  for (let r = 0; r < n.length; r++) {
39
- const p = U(
39
+ const p = j(
40
40
  e,
41
41
  n[r]
42
42
  );
43
- let $ = U(
43
+ let $ = j(
44
44
  i,
45
45
  s[r]
46
46
  ) - p;
@@ -49,15 +49,15 @@ function ge(n, s) {
49
49
  const o = t / n.length, a = o * (180 / Math.PI);
50
50
  return { radianDelta: o, degreesDelta: a };
51
51
  }
52
- function ve(n) {
52
+ function ye(n) {
53
53
  return n != null;
54
54
  }
55
- const ye = (n) => n.length > 0, me = (n) => n.pipe(c(ye));
56
- function J(n, s, e) {
55
+ const me = (n) => n.length > 0, De = (n) => n.pipe(c(me));
56
+ function H(n, s, e) {
57
57
  const i = C([n]), t = C([s]);
58
58
  return Math.abs(t.x - i.x) >= e || Math.abs(t.y - i.y) >= e;
59
59
  }
60
- const De = (n, s, e) => {
60
+ const Pe = (n, s, e) => {
61
61
  const i = n > 0 ? s / n : 0, t = n > 0 ? e / n : 0;
62
62
  return {
63
63
  velocityX: i,
@@ -69,12 +69,12 @@ function F(n) {
69
69
  c((e) => e.pointerId === n.pointerId)
70
70
  );
71
71
  }
72
- const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.type === "pointerup", Pe = ({
72
+ const J = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.type === "pointerup", fe = ({
73
73
  container: n,
74
74
  afterEventReceived: s = (e) => e
75
75
  }) => S(n, "pointerdown").pipe(
76
76
  u(s)
77
- ), Q = ({
77
+ ), K = ({
78
78
  pointerEvent$: n
79
79
  }) => (s) => {
80
80
  const e = n.pipe(
@@ -123,7 +123,7 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
123
123
  }, void 0),
124
124
  u(({ event: p, pointers: l }) => ({
125
125
  event: p,
126
- pointers: Object.values(l).filter(ve)
126
+ pointers: Object.values(l).filter(ye)
127
127
  }))
128
128
  );
129
129
  }, q = (n, s, e, i) => {
@@ -132,7 +132,7 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
132
132
  deltaX: t,
133
133
  deltaY: o
134
134
  };
135
- }, Z = (n) => {
135
+ }, Q = (n) => {
136
136
  const s = (e) => C(
137
137
  e.latestActivePointers.length ? e.latestActivePointers : [e.event]
138
138
  );
@@ -141,7 +141,7 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
141
141
  var g, E;
142
142
  const t = s(i), o = (e == null ? void 0 : e.center) ?? t, a = (e == null ? void 0 : e.deltaX) ?? 0, r = (e == null ? void 0 : e.deltaY) ?? 0, p = ((g = e == null ? void 0 : e.latestActivePointers) == null ? void 0 : g.length) ?? 1, l = ((E = i.latestActivePointers) == null ? void 0 : E.length) ?? 1, $ = ["pointerdown", "pointercancel", "pointerleave", "pointerup"].includes(
143
143
  i.event.type
144
- ) && p !== l, D = l > 0, { deltaX: d, deltaY: A } = $ && D ? q(t, t, a, r) : q(t, o, a, r), { degreesDelta: P } = p === l && p >= 2 && l >= 2 ? ge(
144
+ ) && p !== l, D = l > 0, { deltaX: d, deltaY: A } = $ && D ? q(t, t, a, r) : q(t, o, a, r), { degreesDelta: P } = p === l && p >= 2 && l >= 2 ? ve(
145
145
  (e == null ? void 0 : e.latestActivePointers) ?? [],
146
146
  i.latestActivePointers ?? []
147
147
  ) : { degreesDelta: 0 };
@@ -164,7 +164,7 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
164
164
  center: r,
165
165
  event: p,
166
166
  deltaPointersAngle: l
167
- } = e, $ = o ?? [], d = Date.now() - a, { velocityX: A, velocityY: P } = De(d, i, t), g = $e(o);
167
+ } = e, $ = o ?? [], d = Date.now() - a, { velocityX: A, velocityY: P } = Pe(d, i, t), g = de(o);
168
168
  return {
169
169
  deltaX: i,
170
170
  deltaY: t,
@@ -180,15 +180,15 @@ const K = (n) => n.type === "pointerleave" || n.type === "pointercancel" || n.ty
180
180
  };
181
181
  })
182
182
  );
183
- }, _ = (n) => n.pipe(
183
+ }, W = (n) => n.pipe(
184
184
  c(
185
185
  (s) => !!s.container
186
186
  )
187
- ), W = (n) => n.pipe(c(K)), Ae = ({
187
+ ), Z = (n) => n.pipe(c(J)), Ae = ({
188
188
  container: n,
189
189
  afterEventReceived: s = (e) => e
190
190
  }) => {
191
- const e = Pe({ afterEventReceived: s, container: n }), i = S(n, "pointerup").pipe(
191
+ const e = fe({ afterEventReceived: s, container: n }), i = S(n, "pointerup").pipe(
192
192
  u(s)
193
193
  ), t = S(n, "pointermove").pipe(
194
194
  u(s)
@@ -221,7 +221,7 @@ class z {
221
221
  h(this, "pointerOff$");
222
222
  h(this, "state$");
223
223
  h(this, "failWith$");
224
- h(this, "config$", this.configSubject.pipe(_));
224
+ h(this, "config$", this.configSubject.pipe(W));
225
225
  const i = new B({
226
226
  fingers: 0
227
227
  });
@@ -240,16 +240,19 @@ class z {
240
240
  c((t) => t.type === "pointermove")
241
241
  ), this.pointerCancel$ = this.pointerEvent$.pipe(
242
242
  c((t) => t.type === "pointercancel")
243
- ), this.pointerOff$ = this.pointerEvent$.pipe(W), this.failWith$ = this.config$.pipe(
243
+ ), this.pointerOff$ = this.pointerEvent$.pipe(Z), this.failWith$ = this.config$.pipe(
244
+ se(
245
+ (t, o) => t.failWith === o.failWith
246
+ ),
244
247
  v(
245
- ({ failWith: t }) => t != null && t.length ? y(...(t == null ? void 0 : t.map(({ start$: o }) => o)) ?? []) : se
248
+ ({ failWith: t }) => t != null && t.length ? y(...(t == null ? void 0 : t.map(({ start$: o }) => o)) ?? []) : ie
246
249
  )
247
250
  ), this.pan$ = this.configSubject.pipe(
248
- _,
251
+ W,
249
252
  v((t) => {
250
253
  var D, d, A;
251
254
  const o = Math.max(1, ((D = t.panConfig) == null ? void 0 : D.numInputs) ?? 1), a = Math.max(0, ((d = t.panConfig) == null ? void 0 : d.posThreshold) ?? 0), r = Math.max(0, ((A = t.panConfig) == null ? void 0 : A.delay) ?? 0), p = this.pointerDown$.pipe(
252
- Q({
255
+ K({
253
256
  pointerEvent$: this.pointerEvent$,
254
257
  trackMove: !0
255
258
  }),
@@ -261,12 +264,12 @@ class z {
261
264
  ), $ = (P) => P.pipe(c((g) => g.pointers.length < o));
262
265
  return p.pipe(
263
266
  l,
264
- G(({ pointers: P }) => {
267
+ _(({ pointers: P }) => {
265
268
  const g = p.pipe(
266
269
  $,
267
- Y(),
270
+ X(),
268
271
  f()
269
- ), E = H(r), I = y(
272
+ ), E = G(r), I = y(
270
273
  ...P.map((m) => b(m)),
271
274
  this.pointerDown$
272
275
  ).pipe(
@@ -274,7 +277,7 @@ class z {
274
277
  (m) => y(this.pointerMove$, b(m)).pipe(
275
278
  F(m),
276
279
  c(
277
- (M) => J(
280
+ (M) => H(
278
281
  m,
279
282
  M,
280
283
  a
@@ -282,10 +285,10 @@ class z {
282
285
  )
283
286
  )
284
287
  ),
285
- Y()
288
+ X()
286
289
  ).pipe(
287
290
  v(() => E),
288
- j(p),
291
+ Y(p),
289
292
  u(([, { event: m, pointers: M }]) => ({
290
293
  type: "start",
291
294
  event: m,
@@ -299,7 +302,7 @@ class z {
299
302
  ), w = I.pipe(
300
303
  T(
301
304
  () => p.pipe(
302
- ie(1),
305
+ pe(1),
303
306
  u(({ event: m, pointers: M }) => ({
304
307
  type: "move",
305
308
  event: m,
@@ -322,8 +325,8 @@ class z {
322
325
  x(1)
323
326
  );
324
327
  return R.pipe(
325
- Z,
326
- j(R),
328
+ Q,
329
+ Y(R),
327
330
  u(([m, { type: M }]) => ({
328
331
  ...m,
329
332
  type: M
@@ -332,7 +335,7 @@ class z {
332
335
  })
333
336
  );
334
337
  }),
335
- pe((t) => {
338
+ oe((t) => {
336
339
  i.next({
337
340
  fingers: t.pointers.length
338
341
  });
@@ -367,7 +370,7 @@ class z {
367
370
  this.updateInternal(s, e);
368
371
  }
369
372
  }
370
- class Ie extends z {
373
+ class Se extends z {
371
374
  constructor(e) {
372
375
  var o;
373
376
  super(e, {
@@ -405,10 +408,10 @@ class Ie extends z {
405
408
  super.update(e, e.options);
406
409
  }
407
410
  }
408
- const fe = (n) => (s) => s.pipe(
411
+ const we = (n) => (s) => s.pipe(
409
412
  c((e) => Math.abs(e.velocityX) >= n || Math.abs(e.velocityY) >= n)
410
413
  );
411
- class Se extends z {
414
+ class Te extends z {
412
415
  constructor(e) {
413
416
  super(e, {
414
417
  posThreshold: 0,
@@ -420,10 +423,10 @@ class Se extends z {
420
423
  const { escapeVelocity: t = 0.9 } = i.options ?? {};
421
424
  return this.panStart$.pipe(
422
425
  v((o) => this.panEnd$.pipe(
423
- fe(t),
426
+ we(t),
424
427
  u((a) => ({
425
428
  type: "swipe",
426
- angle: de(
429
+ angle: ge(
427
430
  o.event,
428
431
  a.event
429
432
  ),
@@ -439,18 +442,18 @@ class Se extends z {
439
442
  super.update(e);
440
443
  }
441
444
  }
442
- const we = ({
445
+ const Me = ({
443
446
  timeout: n,
444
447
  pointerEvent$: s
445
448
  }) => (e) => e.pipe(
446
449
  T(
447
- (i) => H(n).pipe(
450
+ (i) => G(n).pipe(
448
451
  k(
449
- s.pipe(W, F(i))
452
+ s.pipe(Z, F(i))
450
453
  )
451
454
  )
452
455
  )
453
- ), Me = ({
456
+ ), xe = ({
454
457
  initialPointerEvent: n,
455
458
  pointerEvent$: s,
456
459
  tolerance: e
@@ -458,14 +461,14 @@ const we = ({
458
461
  T(
459
462
  (t) => s.pipe(
460
463
  F(t),
461
- N((o) => !K(o), !0),
464
+ N((o) => !J(o), !0),
462
465
  c(
463
- (o) => J(n, o, e)
466
+ (o) => H(n, o, e)
464
467
  )
465
468
  )
466
469
  )
467
470
  );
468
- class Te extends z {
471
+ class be extends z {
469
472
  constructor(e) {
470
473
  super(e);
471
474
  h(this, "events$");
@@ -477,7 +480,7 @@ class Te extends z {
477
480
  maxTaps: a = 1,
478
481
  tolerance: r = 10
479
482
  } = i.options ?? {}, p = this.pointerDown$.pipe(
480
- Q({
483
+ K({
481
484
  pointerEvent$: this.pointerEvent$,
482
485
  trackMove: !0
483
486
  }),
@@ -485,25 +488,25 @@ class Te extends z {
485
488
  ), l = p.pipe(
486
489
  c(({ pointers: d }) => d.length > 1)
487
490
  ), $ = (d) => d.pipe(
488
- re(this.pointerUp$.pipe(ae(t))),
489
- Y()
491
+ ae(this.pointerUp$.pipe(le(t))),
492
+ X()
490
493
  );
491
494
  return y(
492
495
  this.pointerDown$,
493
- p.pipe(oe())
496
+ p.pipe(re())
494
497
  ).pipe(
495
- G((d) => {
498
+ _((d) => {
496
499
  const A = y(
497
500
  b(d),
498
501
  this.pointerDown$
499
502
  ).pipe(x(1)), P = A.pipe($), g = A.pipe(
500
- Me({
503
+ xe({
501
504
  initialPointerEvent: d,
502
505
  pointerEvent$: this.pointerEvent$,
503
506
  tolerance: r
504
507
  })
505
508
  ), E = A.pipe(
506
- we({
509
+ Me({
507
510
  pointerEvent$: this.pointerEvent$,
508
511
  timeout: o
509
512
  })
@@ -514,7 +517,7 @@ class Te extends z {
514
517
  g,
515
518
  E
516
519
  ), I = P.pipe(
517
- me,
520
+ De,
518
521
  c((w) => w.length <= a),
519
522
  u((w) => ({
520
523
  type: "tap",
@@ -525,8 +528,8 @@ class Te extends z {
525
528
  x(1)
526
529
  );
527
530
  return I.pipe(
528
- Z,
529
- j(I),
531
+ Q,
532
+ Y(I),
530
533
  u(([w, { type: L, taps: R }]) => ({
531
534
  ...w,
532
535
  type: L,
@@ -544,7 +547,7 @@ class Te extends z {
544
547
  super.update(e);
545
548
  }
546
549
  }
547
- class be extends z {
550
+ class Ce extends z {
548
551
  constructor(e = {}) {
549
552
  super(e, {
550
553
  numInputs: 2,
@@ -593,7 +596,7 @@ class be extends z {
593
596
  super.update(e, e.options);
594
597
  }
595
598
  }
596
- const X = ({
599
+ const U = ({
597
600
  type: n,
598
601
  initialEvent: s
599
602
  }) => (e) => e.pipe(
@@ -612,68 +615,70 @@ const X = ({
612
615
  }, s),
613
616
  u(({ initialPointersAverageDistance: i, ...t }) => t)
614
617
  );
615
- class Ce extends z {
618
+ class ze extends z {
616
619
  constructor(e) {
617
620
  super(e, {
618
621
  ...e == null ? void 0 : e.options,
619
622
  numInputs: 2
620
623
  });
621
624
  h(this, "events$");
625
+ h(this, "start$");
626
+ const i = this.panStart$.pipe(
627
+ v(
628
+ (t) => b(t).pipe(
629
+ U({
630
+ type: "pinchStart",
631
+ initialEvent: void 0
632
+ })
633
+ )
634
+ ),
635
+ f()
636
+ );
622
637
  this.events$ = this.config$.pipe(
623
638
  v(() => {
624
- const i = this.panStart$.pipe(
625
- v(
626
- (a) => b(a).pipe(
627
- X({
628
- type: "pinchStart",
629
- initialEvent: void 0
630
- })
631
- )
632
- ),
633
- x(1)
634
- ), t = i.pipe(
635
- v((a) => this.pan$.pipe(
636
- N((r) => r.type !== "end"),
637
- X({
639
+ const t = i.pipe(x(1)), o = t.pipe(
640
+ v((r) => this.pan$.pipe(
641
+ N((p) => p.type !== "end"),
642
+ U({
638
643
  type: "pinchMove",
639
- initialEvent: a
644
+ initialEvent: r
640
645
  })
641
646
  ))
642
- ), o = i.pipe(
647
+ ), a = t.pipe(
643
648
  v(
644
- (a) => this.pan$.pipe(
649
+ (r) => this.pan$.pipe(
645
650
  // we cannot have a panEnd without a previous event so it will always emit
646
- le(a),
647
- he(),
648
- c(([, r]) => r.type === "end"),
651
+ he(r),
652
+ ce(),
653
+ c(([, p]) => p.type === "end"),
649
654
  v(
650
- ([r, p]) => b(p).pipe(
651
- X({
655
+ ([p, l]) => b(l).pipe(
656
+ U({
652
657
  type: "pinchEnd",
653
- initialEvent: r
658
+ initialEvent: p
654
659
  })
655
660
  )
656
661
  )
657
662
  )
658
663
  )
659
664
  );
660
- return y(i, t, o);
665
+ return y(t, o, a);
661
666
  }),
662
667
  f()
663
- );
668
+ ), this.start$ = i;
664
669
  }
665
670
  update(e) {
666
671
  super.update(e, e.options);
667
672
  }
668
673
  }
669
- class ze {
674
+ class Re {
670
675
  constructor(s) {
671
676
  h(this, "events$");
672
677
  h(this, "recognizers");
673
678
  h(this, "state$");
674
679
  this.options = s, this.recognizers = s.recognizers, this.events$ = y(
675
680
  ...s.recognizers.map((e) => e.events$)
676
- ).pipe(f()), this.state$ = ce(
681
+ ).pipe(f()), this.state$ = ue(
677
682
  this.recognizers.map((e) => e.state$)
678
683
  ).pipe(
679
684
  u(
@@ -690,12 +695,12 @@ class ze {
690
695
  }
691
696
  }
692
697
  export {
693
- Ie as PanRecognizer,
694
- Ce as PinchRecognizer,
695
- ze as Recognizable,
698
+ Se as PanRecognizer,
699
+ ze as PinchRecognizer,
700
+ Re as Recognizable,
696
701
  z as Recognizer,
697
- be as RotateRecognizer,
698
- Se as SwipeRecognizer,
699
- Te as TapRecognizer
702
+ Ce as RotateRecognizer,
703
+ Te as SwipeRecognizer,
704
+ be as TapRecognizer
700
705
  };
701
706
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n NEVER,\n Observable,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n protected config$ = this.configSubject.pipe(isValidConfig)\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n this.failWith$ = this.config$.pipe(\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = panEnd$\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWith$,\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const pinchMove$ = pinchStart$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStart$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStart$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","failWith","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n NEVER,\n Observable,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n public config$ = this.configSubject.pipe(isValidConfig)\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n this.failWith$ = this.config$.pipe(\n distinctUntilChanged(\n (previous, current) => previous.failWith === current.failWith,\n ),\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = panEnd$\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWith$,\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n share(),\n )\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = pinchStart$.pipe(shareReplay(1))\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = pinchStart$\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","distinctUntilChanged","previous","current","failWith","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(u,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):(u=typeof globalThis<"u"?globalThis:u||self,e(u.gesturx={},u.rxjs))})(this,function(u,e){"use strict";var pe=Object.defineProperty;var oe=(u,e,P)=>e in u?pe(u,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):u[e]=P;var c=(u,e,P)=>oe(u,typeof e!="symbol"?e+"":e,P);function P(i,p){return Math.sqrt(Math.pow(p.x-i.x,2)+Math.pow(p.y-i.y,2))}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((n,s,l)=>n+i.slice(l+1).reduce((r,a)=>r+P(s,a),0),0),o=p*(p-1)/2;return t/o}function b(i,p){const t=p.x-i.x,o=p.y-i.y;return Math.atan2(o,t)}function V(i,p){return b(i,p)*(180/Math.PI)}function R(i){const p=i.reduce((o,n)=>(o.x+=n.x,o.y+=n.y,o),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=R(i),o=R(p);let n=0;for(let r=0;r<i.length;r++){const a=b(t,i[r]);let g=b(o,p[r])-a;g>Math.PI?g-=2*Math.PI:g<-Math.PI&&(g+=2*Math.PI),n+=g}const s=n/i.length,l=s*(180/Math.PI);return{radianDelta:s,degreesDelta:l}}function q(i){return i!=null}const W=i=>i.length>0,_=i=>i.pipe(e.filter(W));function k(i,p,t){const o=R([i]),n=R([p]);return Math.abs(n.x-o.x)>=t||Math.abs(n.y-o.y)>=t}const G=(i,p,t)=>{const o=i>0?p/i:0,n=i>0?t/i:0;return{velocityX:o,velocityY:n}};function S(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const C=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",H=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),O=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(a=>a.type==="pointerup")),o=i.pipe(e.filter(a=>a.type==="pointerleave")),n=i.pipe(e.filter(a=>a.type==="pointercancel")),s=i.pipe(e.filter(a=>a.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),r=a=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(a.type);return p.pipe(e.mergeMap(a=>{const h=e.defer(()=>e.of(a));return e.merge(h,e.merge(s,n,o,t,l)).pipe(S(a),e.takeWhile(v=>!r(v),!0))}),e.scan((a,h)=>{if(r(h)){const{[h.pointerId]:g,...v}=(a==null?void 0:a.pointers)??{};return{event:h,pointers:v}}return{event:h,pointers:{...(a==null?void 0:a.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:a,pointers:h})=>({event:a,pointers:Object.values(h).filter(q)})))},F=(i,p,t,o)=>{const n=i.x-p.x+t,s=i.y-p.y+o;return{deltaX:n,deltaY:s}},L=i=>{const p=t=>R(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,o)=>{var $,A;const n=p(o),s=(t==null?void 0:t.center)??n,l=(t==null?void 0:t.deltaX)??0,r=(t==null?void 0:t.deltaY)??0,a=(($=t==null?void 0:t.latestActivePointers)==null?void 0:$.length)??1,h=((A=o.latestActivePointers)==null?void 0:A.length)??1,g=["pointerdown","pointercancel","pointerleave","pointerup"].includes(o.event.type)&&a!==h,v=h>0,{deltaX:d,deltaY:y}=g&&v?F(n,n,l,r):F(n,s,l,r),{degreesDelta:f}=a===h&&a>=2&&h>=2?B((t==null?void 0:t.latestActivePointers)??[],o.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...o,center:n,deltaX:d,deltaY:y,deltaPointersAngle:f}},void 0),e.map(t=>{const{deltaX:o,deltaY:n,latestActivePointers:s,startTime:l,center:r,event:a,deltaPointersAngle:h}=t,g=s??[],d=Date.now()-l,{velocityX:y,velocityY:f}=G(d,o,n),$=N(s);return{deltaX:o,deltaY:n,velocityX:y,velocityY:f,delay:d,center:r,pointers:g,startTime:l,event:a,deltaPointersAngle:h,pointersAverageDistance:$}}))},U=i=>i.pipe(e.filter(p=>!!p.container)),X=i=>i.pipe(e.filter(C)),J=({container:i,afterEventReceived:p=t=>t})=>{const t=H({afterEventReceived:p,container:i}),o=e.fromEvent(i,"pointerup").pipe(e.map(p)),n=e.fromEvent(i,"pointermove").pipe(e.map(p)),s=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return e.merge(t,l,s,o,n)};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"failWith$");c(this,"config$",this.configSubject.pipe(U));const o=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:n,afterEventReceived:s})=>J({container:n,afterEventReceived:s}))),this.pointerDown$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X),this.failWith$=this.config$.pipe(e.switchMap(({failWith:n})=>n!=null&&n.length?e.merge(...(n==null?void 0:n.map(({start$:s})=>s))??[]):e.NEVER)),this.pan$=this.configSubject.pipe(U,e.switchMap(n=>{var v,d,y;const s=Math.max(1,((v=n.panConfig)==null?void 0:v.numInputs)??1),l=Math.max(0,((d=n.panConfig)==null?void 0:d.posThreshold)??0),r=Math.max(0,((y=n.panConfig)==null?void 0:y.delay)??0),a=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=f=>f.pipe(e.filter($=>$.pointers.length>=s)),g=f=>f.pipe(e.filter($=>$.pointers.length<s));return a.pipe(h,e.exhaustMap(({pointers:f})=>{const $=a.pipe(g,e.first(),e.share()),A=e.timer(r),E=e.merge(...f.map(m=>e.of(m)),this.pointerDown$).pipe(e.mergeMap(m=>e.merge(this.pointerMove$,e.of(m)).pipe(S(m),e.filter(w=>k(m,w,l)))),e.first()).pipe(e.switchMap(()=>A),e.withLatestFrom(a),e.map(([,{event:m,pointers:w}])=>({type:"start",event:m,latestActivePointers:w})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil($)),M=E.pipe(e.mergeMap(()=>a.pipe(e.skip(1),e.map(({event:m,pointers:w})=>({type:"move",event:m,latestActivePointers:w})))),e.takeUntil($)),z=E.pipe(e.mergeMap(()=>$.pipe(e.map(({event:m,pointers:w})=>({type:"end",event:m,latestActivePointers:w}))))),T=e.merge(E,M,z).pipe(e.shareReplay(1));return T.pipe(L,e.withLatestFrom(T),e.map(([m,{type:w}])=>({...m,type:w})))}))}),e.tap(n=>{o.next({fingers:n.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(n=>n.type==="start"),e.map(({type:n,...s})=>s)),this.panMove$=this.pan$.pipe(e.filter(n=>n.type==="move"),e.map(({type:n,...s})=>s)),this.panEnd$=this.pan$.pipe(e.filter(n=>n.type==="end"),e.map(({type:n,...s})=>s)),this.state$=o.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const o=this.configSubject.getValue();this.configSubject.next({...o,...p,...p.options&&{options:{...o.options,...p.options}},panConfig:{...o.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class K extends D{constructor(t){var s;super(t,{...t,posThreshold:((s=t==null?void 0:t.options)==null?void 0:s.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const o=this.panStart$.pipe(e.map(l=>({type:"panStart",...l})),e.share()),n=this.panEnd$.pipe(e.map(l=>({type:"panEnd",...l})),e.share());this.events$=e.merge(o,this.panMove$.pipe(e.map(l=>({type:"panMove",...l}))),n),this.start$=o,this.end$=n}update(t){super.update(t,t.options)}}const Q=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class Z extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{escapeVelocity:n=.9}=o.options??{};return this.panStart$.pipe(e.switchMap(s=>this.panEnd$.pipe(Q(n),e.map(l=>({type:"swipe",angle:V(s.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const x=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(o=>e.timer(i).pipe(e.takeUntil(p.pipe(X,S(o)))))),j=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>o=>o.pipe(e.mergeMap(n=>p.pipe(S(n),e.takeWhile(s=>!C(s),!0),e.filter(s=>k(i,s,t)))));class ee extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{multiTapThreshold:n=0,maximumPressTime:s=150,maxTaps:l=1,tolerance:r=10}=o.options??{},a=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=a.pipe(e.filter(({pointers:d})=>d.length>1)),g=d=>d.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(n))),e.first());return e.merge(this.pointerDown$,a.pipe(e.ignoreElements())).pipe(e.exhaustMap(d=>{const y=e.merge(e.of(d),this.pointerDown$).pipe(e.shareReplay(1)),f=y.pipe(g),$=y.pipe(j({initialPointerEvent:d,pointerEvent$:this.pointerEvent$,tolerance:r})),A=y.pipe(x({pointerEvent$:this.pointerEvent$,timeout:s})),Y=e.merge(this.failWith$,this.pointerCancel$,h,$,A),E=f.pipe(_,e.filter(M=>M.length<=l),e.map(M=>({type:"tap",taps:M.length,latestActivePointers:M,event:M[0]})),e.shareReplay(1));return E.pipe(L,e.withLatestFrom(E),e.map(([M,{type:z,taps:T}])=>({...M,type:z,taps:T})),e.takeUntil(Y))}))}),e.share())}update(t){super.update(t)}}class te extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.map(r=>({...r,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),n=o.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((r,a)=>{const h=((r==null?void 0:r.angle)??0)+a.deltaPointersAngle;return{...r,...a,angle:h,deltaAngle:a.deltaPointersAngle}},void 0))),e.share()),s=n.pipe(e.filter(r=>r.type==="move"),e.map(r=>({...r,type:"rotateMove"}))),l=n.pipe(e.filter(r=>r.type==="end"),e.map(r=>({...r,type:"rotateEnd"})));return e.merge(o,s,l)}),e.share())}update(t){super.update(t,t.options)}}const I=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((o,n)=>{const l=((o==null?void 0:o.pointers.length)??0)!==n.pointers.length,r=(o==null?void 0:o.pointersAverageDistance)??n.pointersAverageDistance,a=l?n.pointersAverageDistance:o&&"initialPointersAverageDistance"in o?o.initialPointersAverageDistance:n.pointersAverageDistance,h=a===0?1:n.pointersAverageDistance/a,g=n.pointersAverageDistance-a,v=n.pointersAverageDistance-a,d=l||r===0?1:n.pointersAverageDistance/r;return{...o,...n,type:i,initialPointersAverageDistance:a,scale:h,distance:g,deltaDistance:v,deltaDistanceScale:d}},p),e.map(({initialPointersAverageDistance:o,...n})=>n));class ne extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.switchMap(l=>e.of(l).pipe(I({type:"pinchStart",initialEvent:void 0}))),e.shareReplay(1)),n=o.pipe(e.switchMap(l=>this.pan$.pipe(e.takeWhile(r=>r.type!=="end"),I({type:"pinchMove",initialEvent:l})))),s=o.pipe(e.switchMap(l=>this.pan$.pipe(e.startWith(l),e.pairwise(),e.filter(([,r])=>r.type==="end"),e.switchMap(([r,a])=>e.of(a).pipe(I({type:"pinchEnd",initialEvent:r}))))));return e.merge(o,n,s)}),e.share())}update(t){super.update(t,t.options)}}class ie{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((o,n)=>({fingers:Math.max(o.fingers,n.fingers)})))),this.update(p)}update(p){p.container&&(p.container.style.touchAction="none",p.container.style.userSelect="none"),this.options.recognizers.forEach(t=>{t.update(p)})}}u.PanRecognizer=K,u.PinchRecognizer=ne,u.Recognizable=ie,u.Recognizer=D,u.RotateRecognizer=te,u.SwipeRecognizer=Z,u.TapRecognizer=ee,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
1
+ (function(u,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("rxjs")):typeof define=="function"&&define.amd?define(["exports","rxjs"],e):(u=typeof globalThis<"u"?globalThis:u||self,e(u.gesturx={},u.rxjs))})(this,function(u,e){"use strict";var pe=Object.defineProperty;var oe=(u,e,P)=>e in u?pe(u,e,{enumerable:!0,configurable:!0,writable:!0,value:P}):u[e]=P;var c=(u,e,P)=>oe(u,typeof e!="symbol"?e+"":e,P);function P(i,p){return Math.sqrt(Math.pow(p.x-i.x,2)+Math.pow(p.y-i.y,2))}function N(i){const p=i.length;if(p<2)return 0;const t=i.reduce((n,s,l)=>n+i.slice(l+1).reduce((r,a)=>r+P(s,a),0),0),o=p*(p-1)/2;return t/o}function b(i,p){const t=p.x-i.x,o=p.y-i.y;return Math.atan2(o,t)}function V(i,p){return b(i,p)*(180/Math.PI)}function R(i){const p=i.reduce((o,n)=>(o.x+=n.x,o.y+=n.y,o),{x:0,y:0}),t=i.length||1;return{x:p.x/t,y:p.y/t}}function B(i,p){if(i.length!==p.length)throw new Error("Initial and new points arrays must have the same length.");const t=R(i),o=R(p);let n=0;for(let r=0;r<i.length;r++){const a=b(t,i[r]);let g=b(o,p[r])-a;g>Math.PI?g-=2*Math.PI:g<-Math.PI&&(g+=2*Math.PI),n+=g}const s=n/i.length,l=s*(180/Math.PI);return{radianDelta:s,degreesDelta:l}}function W(i){return i!=null}const q=i=>i.length>0,_=i=>i.pipe(e.filter(q));function C(i,p,t){const o=R([i]),n=R([p]);return Math.abs(n.x-o.x)>=t||Math.abs(n.y-o.y)>=t}const G=(i,p,t)=>{const o=i>0?p/i:0,n=i>0?t/i:0;return{velocityX:o,velocityY:n}};function S(i){return p=>p.pipe(e.filter(t=>t.pointerId===i.pointerId))}const k=i=>i.type==="pointerleave"||i.type==="pointercancel"||i.type==="pointerup",H=({container:i,afterEventReceived:p=t=>t})=>e.fromEvent(i,"pointerdown").pipe(e.map(p)),O=({pointerEvent$:i})=>p=>{const t=i.pipe(e.filter(a=>a.type==="pointerup")),o=i.pipe(e.filter(a=>a.type==="pointerleave")),n=i.pipe(e.filter(a=>a.type==="pointercancel")),s=i.pipe(e.filter(a=>a.type==="pointermove")),l=e.fromEvent(window,"contextmenu"),r=a=>["pointercancel","pointerleave","pointerup","contextmenu"].includes(a.type);return p.pipe(e.mergeMap(a=>{const h=e.defer(()=>e.of(a));return e.merge(h,e.merge(s,n,o,t,l)).pipe(S(a),e.takeWhile(v=>!r(v),!0))}),e.scan((a,h)=>{if(r(h)){const{[h.pointerId]:g,...v}=(a==null?void 0:a.pointers)??{};return{event:h,pointers:v}}return{event:h,pointers:{...(a==null?void 0:a.pointers)??{},[h.pointerId]:h}}},void 0),e.map(({event:a,pointers:h})=>({event:a,pointers:Object.values(h).filter(W)})))},F=(i,p,t,o)=>{const n=i.x-p.x+t,s=i.y-p.y+o;return{deltaX:n,deltaY:s}},L=i=>{const p=t=>R(t.latestActivePointers.length?t.latestActivePointers:[t.event]);return i.pipe(e.scan((t,o)=>{var $,A;const n=p(o),s=(t==null?void 0:t.center)??n,l=(t==null?void 0:t.deltaX)??0,r=(t==null?void 0:t.deltaY)??0,a=(($=t==null?void 0:t.latestActivePointers)==null?void 0:$.length)??1,h=((A=o.latestActivePointers)==null?void 0:A.length)??1,g=["pointerdown","pointercancel","pointerleave","pointerup"].includes(o.event.type)&&a!==h,v=h>0,{deltaX:d,deltaY:y}=g&&v?F(n,n,l,r):F(n,s,l,r),{degreesDelta:f}=a===h&&a>=2&&h>=2?B((t==null?void 0:t.latestActivePointers)??[],o.latestActivePointers??[]):{degreesDelta:0};return{startTime:new Date().getTime(),...t,...o,center:n,deltaX:d,deltaY:y,deltaPointersAngle:f}},void 0),e.map(t=>{const{deltaX:o,deltaY:n,latestActivePointers:s,startTime:l,center:r,event:a,deltaPointersAngle:h}=t,g=s??[],d=Date.now()-l,{velocityX:y,velocityY:f}=G(d,o,n),$=N(s);return{deltaX:o,deltaY:n,velocityX:y,velocityY:f,delay:d,center:r,pointers:g,startTime:l,event:a,deltaPointersAngle:h,pointersAverageDistance:$}}))},U=i=>i.pipe(e.filter(p=>!!p.container)),X=i=>i.pipe(e.filter(k)),J=({container:i,afterEventReceived:p=t=>t})=>{const t=H({afterEventReceived:p,container:i}),o=e.fromEvent(i,"pointerup").pipe(e.map(p)),n=e.fromEvent(i,"pointermove").pipe(e.map(p)),s=e.fromEvent(i,"pointerleave").pipe(e.map(p)),l=e.fromEvent(i,"pointercancel").pipe(e.map(p));return e.merge(t,l,s,o,n)};class D{constructor(p,t){c(this,"configSubject",new e.BehaviorSubject({}));c(this,"pan$");c(this,"panStart$");c(this,"panMove$");c(this,"panEnd$");c(this,"pointerEvent$");c(this,"pointerDown$");c(this,"pointerUp$");c(this,"pointerCancel$");c(this,"pointerMove$");c(this,"pointerOff$");c(this,"state$");c(this,"failWith$");c(this,"config$",this.configSubject.pipe(U));const o=new e.BehaviorSubject({fingers:0});this.pointerEvent$=this.config$.pipe(e.switchMap(({container:n,afterEventReceived:s})=>J({container:n,afterEventReceived:s}))),this.pointerDown$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerdown")),this.pointerUp$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointerup")),this.pointerMove$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointermove")),this.pointerCancel$=this.pointerEvent$.pipe(e.filter(n=>n.type==="pointercancel")),this.pointerOff$=this.pointerEvent$.pipe(X),this.failWith$=this.config$.pipe(e.distinctUntilChanged((n,s)=>n.failWith===s.failWith),e.switchMap(({failWith:n})=>n!=null&&n.length?e.merge(...(n==null?void 0:n.map(({start$:s})=>s))??[]):e.NEVER)),this.pan$=this.configSubject.pipe(U,e.switchMap(n=>{var v,d,y;const s=Math.max(1,((v=n.panConfig)==null?void 0:v.numInputs)??1),l=Math.max(0,((d=n.panConfig)==null?void 0:d.posThreshold)??0),r=Math.max(0,((y=n.panConfig)==null?void 0:y.delay)??0),a=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=f=>f.pipe(e.filter($=>$.pointers.length>=s)),g=f=>f.pipe(e.filter($=>$.pointers.length<s));return a.pipe(h,e.exhaustMap(({pointers:f})=>{const $=a.pipe(g,e.first(),e.share()),A=e.timer(r),E=e.merge(...f.map(m=>e.of(m)),this.pointerDown$).pipe(e.mergeMap(m=>e.merge(this.pointerMove$,e.of(m)).pipe(S(m),e.filter(w=>C(m,w,l)))),e.first()).pipe(e.switchMap(()=>A),e.withLatestFrom(a),e.map(([,{event:m,pointers:w}])=>({type:"start",event:m,latestActivePointers:w})),e.shareReplay({bufferSize:1,refCount:!1}),e.takeUntil($)),M=E.pipe(e.mergeMap(()=>a.pipe(e.skip(1),e.map(({event:m,pointers:w})=>({type:"move",event:m,latestActivePointers:w})))),e.takeUntil($)),z=E.pipe(e.mergeMap(()=>$.pipe(e.map(({event:m,pointers:w})=>({type:"end",event:m,latestActivePointers:w}))))),T=e.merge(E,M,z).pipe(e.shareReplay(1));return T.pipe(L,e.withLatestFrom(T),e.map(([m,{type:w}])=>({...m,type:w})))}))}),e.tap(n=>{o.next({fingers:n.pointers.length})}),e.share()),this.panStart$=this.pan$.pipe(e.filter(n=>n.type==="start"),e.map(({type:n,...s})=>s)),this.panMove$=this.pan$.pipe(e.filter(n=>n.type==="move"),e.map(({type:n,...s})=>s)),this.panEnd$=this.pan$.pipe(e.filter(n=>n.type==="end"),e.map(({type:n,...s})=>s)),this.state$=o.asObservable(),this.updateInternal(p??{},t)}updateInternal(p,t){const o=this.configSubject.getValue();this.configSubject.next({...o,...p,...p.options&&{options:{...o.options,...p.options}},panConfig:{...o.panConfig,...t}})}update(p,t){this.updateInternal(p,t)}}class K extends D{constructor(t){var s;super(t,{...t,posThreshold:((s=t==null?void 0:t.options)==null?void 0:s.posThreshold)??15});c(this,"events$");c(this,"start$");c(this,"end$");const o=this.panStart$.pipe(e.map(l=>({type:"panStart",...l})),e.share()),n=this.panEnd$.pipe(e.map(l=>({type:"panEnd",...l})),e.share());this.events$=e.merge(o,this.panMove$.pipe(e.map(l=>({type:"panMove",...l}))),n),this.start$=o,this.end$=n}update(t){super.update(t,t.options)}}const Q=i=>p=>p.pipe(e.filter(t=>Math.abs(t.velocityX)>=i||Math.abs(t.velocityY)>=i));class Z extends D{constructor(t){super(t,{posThreshold:0,numInputs:1});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{escapeVelocity:n=.9}=o.options??{};return this.panStart$.pipe(e.switchMap(s=>this.panEnd$.pipe(Q(n),e.map(l=>({type:"swipe",angle:V(s.event,l.event),...l})))),e.share())}))}update(t){super.update(t)}}const x=({timeout:i,pointerEvent$:p})=>t=>t.pipe(e.mergeMap(o=>e.timer(i).pipe(e.takeUntil(p.pipe(X,S(o)))))),j=({initialPointerEvent:i,pointerEvent$:p,tolerance:t})=>o=>o.pipe(e.mergeMap(n=>p.pipe(S(n),e.takeWhile(s=>!k(s),!0),e.filter(s=>C(i,s,t)))));class ee extends D{constructor(t){super(t);c(this,"events$");this.events$=this.config$.pipe(e.switchMap(o=>{const{multiTapThreshold:n=0,maximumPressTime:s=150,maxTaps:l=1,tolerance:r=10}=o.options??{},a=this.pointerDown$.pipe(O({pointerEvent$:this.pointerEvent$,trackMove:!0}),e.shareReplay(1)),h=a.pipe(e.filter(({pointers:d})=>d.length>1)),g=d=>d.pipe(e.buffer(this.pointerUp$.pipe(e.debounceTime(n))),e.first());return e.merge(this.pointerDown$,a.pipe(e.ignoreElements())).pipe(e.exhaustMap(d=>{const y=e.merge(e.of(d),this.pointerDown$).pipe(e.shareReplay(1)),f=y.pipe(g),$=y.pipe(j({initialPointerEvent:d,pointerEvent$:this.pointerEvent$,tolerance:r})),A=y.pipe(x({pointerEvent$:this.pointerEvent$,timeout:s})),Y=e.merge(this.failWith$,this.pointerCancel$,h,$,A),E=f.pipe(_,e.filter(M=>M.length<=l),e.map(M=>({type:"tap",taps:M.length,latestActivePointers:M,event:M[0]})),e.shareReplay(1));return E.pipe(L,e.withLatestFrom(E),e.map(([M,{type:z,taps:T}])=>({...M,type:z,taps:T})),e.takeUntil(Y))}))}),e.share())}update(t){super.update(t)}}class te extends D{constructor(t={}){super(t,{numInputs:2,posThreshold:15,...t.options});c(this,"events$");this.events$=this.config$.pipe(e.switchMap(()=>{const o=this.panStart$.pipe(e.map(r=>({...r,type:"rotateStart",angle:0,deltaAngle:0})),e.shareReplay(1)),n=o.pipe(e.switchMap(()=>this.pan$.pipe(e.scan((r,a)=>{const h=((r==null?void 0:r.angle)??0)+a.deltaPointersAngle;return{...r,...a,angle:h,deltaAngle:a.deltaPointersAngle}},void 0))),e.share()),s=n.pipe(e.filter(r=>r.type==="move"),e.map(r=>({...r,type:"rotateMove"}))),l=n.pipe(e.filter(r=>r.type==="end"),e.map(r=>({...r,type:"rotateEnd"})));return e.merge(o,s,l)}),e.share())}update(t){super.update(t,t.options)}}const I=({type:i,initialEvent:p})=>t=>t.pipe(e.scan((o,n)=>{const l=((o==null?void 0:o.pointers.length)??0)!==n.pointers.length,r=(o==null?void 0:o.pointersAverageDistance)??n.pointersAverageDistance,a=l?n.pointersAverageDistance:o&&"initialPointersAverageDistance"in o?o.initialPointersAverageDistance:n.pointersAverageDistance,h=a===0?1:n.pointersAverageDistance/a,g=n.pointersAverageDistance-a,v=n.pointersAverageDistance-a,d=l||r===0?1:n.pointersAverageDistance/r;return{...o,...n,type:i,initialPointersAverageDistance:a,scale:h,distance:g,deltaDistance:v,deltaDistanceScale:d}},p),e.map(({initialPointersAverageDistance:o,...n})=>n));class ne extends D{constructor(t){super(t,{...t==null?void 0:t.options,numInputs:2});c(this,"events$");c(this,"start$");const o=this.panStart$.pipe(e.switchMap(n=>e.of(n).pipe(I({type:"pinchStart",initialEvent:void 0}))),e.share());this.events$=this.config$.pipe(e.switchMap(()=>{const n=o.pipe(e.shareReplay(1)),s=n.pipe(e.switchMap(r=>this.pan$.pipe(e.takeWhile(a=>a.type!=="end"),I({type:"pinchMove",initialEvent:r})))),l=n.pipe(e.switchMap(r=>this.pan$.pipe(e.startWith(r),e.pairwise(),e.filter(([,a])=>a.type==="end"),e.switchMap(([a,h])=>e.of(h).pipe(I({type:"pinchEnd",initialEvent:a}))))));return e.merge(n,s,l)}),e.share()),this.start$=o}update(t){super.update(t,t.options)}}class ie{constructor(p){c(this,"events$");c(this,"recognizers");c(this,"state$");this.options=p,this.recognizers=p.recognizers,this.events$=e.merge(...p.recognizers.map(t=>t.events$)).pipe(e.share()),this.state$=e.combineLatest(this.recognizers.map(t=>t.state$)).pipe(e.map(t=>t.reduce((o,n)=>({fingers:Math.max(o.fingers,n.fingers)})))),this.update(p)}update(p){p.container&&(p.container.style.touchAction="none",p.container.style.userSelect="none"),this.options.recognizers.forEach(t=>{t.update(p)})}}u.PanRecognizer=K,u.PinchRecognizer=ne,u.Recognizable=ie,u.Recognizer=D,u.RotateRecognizer=te,u.SwipeRecognizer=Z,u.TapRecognizer=ee,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n NEVER,\n Observable,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n protected config$ = this.configSubject.pipe(isValidConfig)\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n this.failWith$ = this.config$.pipe(\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = panEnd$\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWith$,\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n shareReplay(1),\n )\n\n const pinchMove$ = pinchStart$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStart$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStart$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","failWith","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","current","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/core/utils/geometry.ts","../src/core/utils/utils.ts","../src/core/utils/events.ts","../src/core/recognizer/scanToRecognizerEvent.ts","../src/core/recognizer/operators.ts","../src/core/recognizer/utils.ts","../src/core/recognizer/Recognizer.ts","../src/core/pan/PanRecognizer.ts","../src/core/swipe/operators.ts","../src/core/swipe/SwipeRecognizer.ts","../src/core/tap/operators.ts","../src/core/tap/TapRecognizer.ts","../src/core/rotate/RotateRecognizer.ts","../src/core/pinch/mapPanEventToPinchEvent.ts","../src/core/pinch/PinchRecognizer.ts","../src/core/recognizable/Recognizable.ts"],"sourcesContent":["export type Point = { x: number; y: number }\n\nexport function calculateDistance(pointA: Point, pointB: Point): number {\n return Math.sqrt(\n Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2),\n )\n}\n\nexport function calculateAverageDistance(pointerEvents: Point[]): number {\n const n = pointerEvents.length\n if (n < 2) return 0 // No distance if fewer than 2 pointers\n\n const totalDistance = pointerEvents.reduce((sum, event1, i) => {\n return (\n sum +\n pointerEvents.slice(i + 1).reduce((innerSum, event2) => {\n return innerSum + calculateDistance(event1, event2)\n }, 0)\n )\n }, 0)\n\n // Number of pairs is n choose 2: n * (n - 1) / 2\n const numberOfPairs = (n * (n - 1)) / 2\n return totalDistance / numberOfPairs\n}\n\nexport function calculateRadianAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the differences in coordinates\n const deltaX = pointerB.x - pointerA.x\n const deltaY = pointerB.y - pointerA.y\n\n // Calculate the angle in radians\n const angleInRadians = Math.atan2(deltaY, deltaX)\n\n // Return the angle in degrees\n return angleInRadians\n}\n\nexport function calculateDegreeAngleBetweenPoints(\n pointerA: Point,\n pointerB: Point,\n): number {\n // Calculate the angle in radians\n const angleInRadians = calculateRadianAngleBetweenPoints(pointerA, pointerB)\n\n // Convert the angle to degrees (optional)\n const angleInDegrees = angleInRadians * (180 / Math.PI)\n\n // Return the angle in degrees\n return angleInDegrees\n}\n\nexport function calculateCentroid(points: Point[]) {\n const sum = points.reduce(\n (acc, point) => {\n acc.x += point.x\n acc.y += point.y\n\n return acc\n },\n { x: 0, y: 0 },\n )\n\n const numPoints = points.length || 1\n\n return {\n x: sum.x / numPoints,\n y: sum.y / numPoints,\n }\n}\n\nexport function calculateAngleDelta(\n initialPoints: Point[],\n newPoints: Point[],\n) {\n if (initialPoints.length !== newPoints.length) {\n throw new Error(\"Initial and new points arrays must have the same length.\")\n }\n\n const initialCentroid = calculateCentroid(initialPoints)\n const newCentroid = calculateCentroid(newPoints)\n\n let totalAngleDelta = 0\n\n for (let i = 0; i < initialPoints.length; i++) {\n const initialAngle = calculateRadianAngleBetweenPoints(\n initialCentroid,\n initialPoints[i]!,\n )\n const newAngle = calculateRadianAngleBetweenPoints(\n newCentroid,\n newPoints[i]!,\n )\n\n let angleDelta = newAngle - initialAngle\n\n // Normalize the angle delta to be within [-PI, PI]\n if (angleDelta > Math.PI) {\n angleDelta -= 2 * Math.PI\n } else if (angleDelta < -Math.PI) {\n angleDelta += 2 * Math.PI\n }\n\n totalAngleDelta += angleDelta\n }\n\n // Return the average angle delta\n const radianDelta = totalAngleDelta / initialPoints.length\n const degreesDelta = radianDelta * (180 / Math.PI)\n\n return { radianDelta, degreesDelta }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { calculateCentroid } from \"./geometry\"\n\nexport function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n\nexport const hasAtLeastOneItem = <T>(events: T[]): events is [T, ...T[]] =>\n events.length > 0\n\nexport const filterNotEmpty = <T>(\n stream: Observable<T[]>,\n): Observable<[T, ...T[]]> => stream.pipe(filter(hasAtLeastOneItem))\n\nexport function isWithinPosThreshold(\n startEvent: PointerEvent,\n endEvent: PointerEvent,\n posThreshold: number,\n) {\n const start = calculateCentroid([startEvent])\n const end = calculateCentroid([endEvent])\n\n // Determines if the movement qualifies as a drag\n return (\n Math.abs(end.x - start.x) >= posThreshold ||\n Math.abs(end.y - start.y) >= posThreshold\n )\n}\n\n/**\n * Avoid division by zero\n * Calculate velocity in pixels per second\n */\nexport const calculateVelocity = (\n delay: number,\n deltaX: number,\n deltaY: number,\n) => {\n const velocityX = delay > 0 ? deltaX / delay : 0\n const velocityY = delay > 0 ? deltaY / delay : 0\n\n return {\n velocityX,\n velocityY,\n }\n}\n","import {\n Observable,\n defer,\n filter,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n scan,\n takeWhile,\n} from \"rxjs\"\nimport { isDefined } from \"./utils\"\n\nexport function matchPointer(pointer: PointerEvent) {\n return (stream: Observable<PointerEvent>) =>\n stream.pipe(\n filter((newPointer) => newPointer.pointerId === pointer.pointerId),\n )\n}\n\nexport const isPointerOffEvent = (pointerEvent: PointerEvent) =>\n pointerEvent.type === \"pointerleave\" ||\n pointerEvent.type === \"pointercancel\" ||\n pointerEvent.type === \"pointerup\"\n\nexport const fromPointerDown = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) =>\n fromEvent<PointerEvent>(container, \"pointerdown\").pipe(\n map(afterEventReceived),\n )\n\n/**\n * Track all pointerEvent for active fingers\n */\nexport const trackPointers =\n ({\n pointerEvent$,\n }: {\n pointerEvent$: Observable<PointerEvent>\n /**\n * Setting this value to false will not update the list\n * on pointer move. Use it if you only need to track number of active\n * fingers.\n */\n trackMove: boolean\n }) =>\n (stream: Observable<PointerEvent>) => {\n type PointersState = {\n event: PointerEvent\n pointers: Record<number, PointerEvent | undefined>\n }\n\n const pointerUp$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n const pointerLeave$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointerleave\"),\n )\n const pointerCancel$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n const pointerMove$ = pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n const contextMenu$ = fromEvent<PointerEvent>(window, \"contextmenu\")\n\n const isPointerRemoved = (event: PointerEvent) =>\n [\"pointercancel\", \"pointerleave\", \"pointerup\", \"contextmenu\"].includes(\n event.type,\n )\n\n return stream.pipe(\n mergeMap((pointerDown) => {\n const pointerDown$ = defer(() => of(pointerDown))\n\n const tracking$ = merge(\n pointerDown$,\n merge(\n pointerMove$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n contextMenu$,\n ),\n ).pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerRemoved(event), true),\n )\n\n return tracking$\n }),\n scan<PointerEvent, PointersState, undefined>((acc, event) => {\n if (isPointerRemoved(event)) {\n const { [event.pointerId]: _deleted, ...rest } = acc?.pointers ?? {}\n\n void _deleted\n\n return {\n event,\n pointers: rest,\n }\n }\n\n return {\n event,\n pointers: {\n ...(acc?.pointers ?? {}),\n [event.pointerId]: event,\n },\n }\n }, undefined),\n map(({ event, pointers }) => ({\n event,\n pointers: Object.values(pointers).filter(isDefined),\n })),\n )\n }\n","import { Observable, map, scan } from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { calculateVelocity } from \"../utils/utils\"\nimport {\n calculateAngleDelta,\n calculateAverageDistance,\n calculateCentroid,\n} from \"../utils/geometry\"\n\nexport interface RecognizerEventInput {\n event: PointerEvent\n latestActivePointers: PointerEvent[]\n}\n\ninterface RecognizerEventState extends RecognizerEventInput {\n startTime: number\n center: { x: number; y: number }\n deltaX: number\n deltaY: number\n deltaPointersAngle: number\n}\n\nconst calculateNewDelta = (\n newCenter: { x: number; y: number },\n prevCenter: { x: number; y: number },\n prevDeltaX: number,\n prevDeltaY: number,\n) => {\n const deltaX = newCenter.x - prevCenter.x + prevDeltaX\n const deltaY = newCenter.y - prevCenter.y + prevDeltaY\n\n return {\n deltaX,\n deltaY,\n }\n}\n\nexport const scanToRecognizerEvent = <T extends RecognizerEventInput>(\n stream: Observable<T>,\n): Observable<RecognizerEvent> => {\n const getCenterFromData = (data: T) =>\n calculateCentroid(\n !data.latestActivePointers.length\n ? [data.event]\n : data.latestActivePointers,\n )\n\n return stream.pipe(\n scan<T, RecognizerEventState, undefined>((acc, curr) => {\n const newCenter = getCenterFromData(curr)\n const prevCenter = acc?.center ?? newCenter\n const prevDeltaX = acc?.deltaX ?? 0\n const prevDeltaY = acc?.deltaY ?? 0\n const prevActivePointersNumber = acc?.latestActivePointers?.length ?? 1\n const currActivePointersNumber = curr.latestActivePointers?.length ?? 1\n\n const hasAddedOrRemovedAFinger =\n [\"pointerdown\", \"pointercancel\", \"pointerleave\", \"pointerup\"].includes(\n curr.event.type,\n ) && prevActivePointersNumber !== currActivePointersNumber\n\n const hasAtLeastOneFinger = currActivePointersNumber > 0\n\n const { deltaX, deltaY } =\n hasAddedOrRemovedAFinger && hasAtLeastOneFinger\n ? calculateNewDelta(newCenter, newCenter, prevDeltaX, prevDeltaY)\n : calculateNewDelta(newCenter, prevCenter, prevDeltaX, prevDeltaY)\n\n const { degreesDelta: deltaPointersAngle } =\n prevActivePointersNumber === currActivePointersNumber &&\n prevActivePointersNumber >= 2 &&\n currActivePointersNumber >= 2\n ? calculateAngleDelta(\n acc?.latestActivePointers ?? [],\n curr.latestActivePointers ?? [],\n )\n : { degreesDelta: 0 }\n\n return {\n startTime: new Date().getTime(),\n ...acc,\n ...curr,\n center: newCenter,\n deltaX,\n deltaY,\n deltaPointersAngle,\n }\n }, undefined),\n map((data) => {\n const {\n deltaX,\n deltaY,\n latestActivePointers,\n startTime,\n center,\n event,\n deltaPointersAngle,\n } = data\n const events = latestActivePointers ?? []\n\n // Calculate the change in time\n const now = Date.now()\n const delay = now - startTime\n\n const { velocityX, velocityY } = calculateVelocity(delay, deltaX, deltaY)\n const pointersAverageDistance =\n calculateAverageDistance(latestActivePointers)\n\n return {\n deltaX,\n deltaY,\n velocityX,\n velocityY,\n delay,\n center,\n pointers: events,\n startTime,\n event,\n deltaPointersAngle,\n pointersAverageDistance,\n } satisfies RecognizerEvent\n }),\n )\n}\n","import { Observable, filter } from \"rxjs\"\nimport { isPointerOffEvent } from \"../utils/events\"\n\nexport const isValidConfig = <T extends { container?: HTMLElement }>(\n stream: Observable<T>,\n) =>\n stream.pipe(\n filter(\n (config): config is T & { container: HTMLElement } => !!config.container,\n ),\n )\n\nexport const filterPointerOff = (stream: Observable<PointerEvent>) =>\n stream.pipe(filter(isPointerOffEvent))\n","import { fromEvent, map, merge } from \"rxjs\"\nimport { fromPointerDown } from \"../utils/events\"\n\nexport const getPointerEvents = ({\n container,\n afterEventReceived = (event) => event,\n}: {\n container: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n}) => {\n const pointerDown$ = fromPointerDown({ afterEventReceived, container })\n const pointerUp$ = fromEvent<PointerEvent>(container, \"pointerup\").pipe(\n map(afterEventReceived),\n )\n const pointerMove$ = fromEvent<PointerEvent>(container, \"pointermove\").pipe(\n map(afterEventReceived),\n )\n /**\n * Mostly used to handle cursor leaving window on mouse pointers.\n */\n const pointerLeave$ = fromEvent<PointerEvent>(container, \"pointerleave\").pipe(\n map(afterEventReceived),\n )\n /**\n * Handle things such as contextual menu popup or\n * native swipe navigation conflict.\n */\n const pointerCancel$ = fromEvent<PointerEvent>(\n container,\n \"pointercancel\",\n ).pipe(map(afterEventReceived))\n\n return merge(\n pointerDown$,\n pointerCancel$,\n pointerLeave$,\n pointerUp$,\n pointerMove$,\n )\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BehaviorSubject,\n NEVER,\n Observable,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n map,\n merge,\n mergeMap,\n of,\n share,\n shareReplay,\n skip,\n switchMap,\n takeUntil,\n tap,\n timer,\n withLatestFrom,\n} from \"rxjs\"\nimport { RecognizerEvent } from \"./RecognizerEvent\"\nimport { trackPointers, matchPointer } from \"../utils/events\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"./scanToRecognizerEvent\"\nimport { filterPointerOff, isValidConfig } from \"./operators\"\nimport { getPointerEvents } from \"./utils\"\n\ntype PanConfig = {\n posThreshold?: number\n delay?: number\n /**\n * Number of inputs to trigger the event.\n * Default to 1\n */\n numInputs?: number\n}\n\nexport type RecognizerConfig<Options> = {\n container?: HTMLElement\n afterEventReceived?: (event: PointerEvent) => PointerEvent\n options?: Options\n failWith?: { start$: Observable<unknown> }[]\n}\n\nexport interface RecognizerPanEvent extends RecognizerEvent {\n type: \"start\" | \"move\" | \"end\"\n}\n\nexport type State = {\n fingers: number\n}\n\nexport abstract class Recognizer<\n Options extends object = never,\n Event extends RecognizerEvent = RecognizerEvent,\n> {\n protected configSubject = new BehaviorSubject<\n RecognizerConfig<Options> & {\n panConfig?: PanConfig\n }\n >({})\n protected pan$: Observable<RecognizerPanEvent>\n protected panStart$: Observable<RecognizerEvent>\n protected panMove$: Observable<RecognizerEvent>\n protected panEnd$: Observable<RecognizerEvent>\n\n protected pointerEvent$: Observable<PointerEvent>\n protected pointerDown$: Observable<PointerEvent>\n protected pointerUp$: Observable<PointerEvent>\n protected pointerCancel$: Observable<PointerEvent>\n protected pointerMove$: Observable<PointerEvent>\n protected pointerOff$: Observable<PointerEvent>\n\n public state$: Observable<State>\n\n abstract events$: Observable<Event>\n\n protected failWith$: Observable<unknown>\n\n public config$ = this.configSubject.pipe(isValidConfig)\n\n constructor(config?: RecognizerConfig<Options>, panConfig?: PanConfig) {\n const stateSubject = new BehaviorSubject<State>({\n fingers: 0,\n })\n\n this.pointerEvent$ = this.config$.pipe(\n switchMap(({ container, afterEventReceived }) =>\n getPointerEvents({\n container,\n afterEventReceived,\n }),\n ),\n )\n\n this.pointerDown$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerdown\"),\n )\n\n this.pointerUp$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointerup\"),\n )\n\n this.pointerMove$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointermove\"),\n )\n\n this.pointerCancel$ = this.pointerEvent$.pipe(\n filter((event) => event.type === \"pointercancel\"),\n )\n\n this.pointerOff$ = this.pointerEvent$.pipe(filterPointerOff)\n\n this.failWith$ = this.config$.pipe(\n distinctUntilChanged(\n (previous, current) => previous.failWith === current.failWith,\n ),\n switchMap(({ failWith }) =>\n !failWith?.length\n ? NEVER\n : merge(...(failWith?.map(({ start$ }) => start$) ?? [])),\n ),\n )\n\n this.pan$ = this.configSubject.pipe(\n isValidConfig,\n switchMap((config) => {\n const numInputs = Math.max(1, config.panConfig?.numInputs ?? 1)\n const posThreshold = Math.max(0, config.panConfig?.posThreshold ?? 0)\n const delay = Math.max(0, config.panConfig?.delay ?? 0)\n\n const trackPointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasEnoughFingers = (\n stream: Observable<{ event: PointerEvent; pointers: PointerEvent[] }>,\n ) =>\n stream.pipe(\n filter(\n (\n events,\n ): events is { event: PointerEvent; pointers: [PointerEvent] } =>\n events.pointers.length >= numInputs,\n ),\n )\n\n const hasNotEnoughFingers = (\n stream: Observable<{\n event: PointerEvent\n pointers: PointerEvent[]\n }>,\n ) => stream.pipe(filter((events) => events.pointers.length < numInputs))\n\n return trackPointers$.pipe(\n hasEnoughFingers,\n exhaustMap(({ pointers: initialPointerEvents }) => {\n const panReleased$ = trackPointers$.pipe(\n hasNotEnoughFingers,\n first(),\n share(),\n )\n\n const delay$ = timer(delay)\n\n const pointerDownPassingThreshold$ = merge(\n ...initialPointerEvents.map((pointerEvent) => of(pointerEvent)),\n this.pointerDown$,\n ).pipe(\n mergeMap((pointerDown) =>\n merge(this.pointerMove$, of(pointerDown)).pipe(\n matchPointer(pointerDown),\n filter((pointerEvent) =>\n isWithinPosThreshold(\n pointerDown,\n pointerEvent,\n posThreshold,\n ),\n ),\n ),\n ),\n first(),\n )\n\n const panStart$ = pointerDownPassingThreshold$.pipe(\n switchMap(() => delay$),\n withLatestFrom(trackPointers$),\n map(([, { event, pointers }]) => ({\n type: \"start\" as const,\n event,\n latestActivePointers: pointers,\n })),\n shareReplay({\n bufferSize: 1,\n refCount: false,\n }),\n takeUntil(panReleased$),\n )\n\n const panUpdate$ = panStart$.pipe(\n mergeMap(() =>\n trackPointers$.pipe(\n skip(1),\n map(({ event, pointers }) => ({\n type: \"move\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n takeUntil(panReleased$),\n )\n\n const panEnd$ = panStart$.pipe(\n mergeMap(() =>\n panReleased$.pipe(\n map(({ event, pointers }) => ({\n type: \"end\" as const,\n event,\n latestActivePointers: pointers,\n })),\n ),\n ),\n )\n\n const rawEvent$ = merge(panStart$, panUpdate$, panEnd$).pipe(\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type }]) => ({\n ...recognizerEvent,\n type,\n })),\n )\n }),\n )\n }),\n tap((event) => {\n stateSubject.next({\n fingers: event.pointers.length,\n })\n }),\n share(),\n )\n\n this.panStart$ = this.pan$.pipe(\n filter((event) => event.type === \"start\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panMove$ = this.pan$.pipe(\n filter((event) => event.type === \"move\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.panEnd$ = this.pan$.pipe(\n filter((event) => event.type === \"end\"),\n map(({ type, ...rest }) => rest),\n )\n\n this.state$ = stateSubject.asObservable()\n\n this.updateInternal(config ?? {}, panConfig)\n }\n\n private updateInternal(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n const existingConfig = this.configSubject.getValue()\n\n this.configSubject.next({\n ...existingConfig,\n ...config,\n ...(config.options && {\n options: { ...existingConfig.options, ...config.options },\n }),\n panConfig: {\n ...existingConfig.panConfig,\n ...panConfig,\n },\n })\n }\n\n public update(\n config: Partial<RecognizerConfig<Options>>,\n panConfig?: PanConfig,\n ) {\n this.updateInternal(config, panConfig)\n }\n}\n","import { Observable, map, merge, share } from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n PanEvent,\n PanRecognizerInterface,\n PanRecognizerOptions,\n} from \"./PanRecognizerInterface\"\n\nexport { type PanEvent }\n\nexport class PanRecognizer\n extends Recognizer<PanRecognizerOptions, PanEvent>\n implements PanRecognizerInterface\n{\n public events$: Observable<PanEvent>\n public start$: Observable<PanEvent>\n public end$: Observable<PanEvent>\n\n constructor(config?: RecognizerConfig<PanRecognizerOptions>) {\n super(config, {\n ...config,\n posThreshold: config?.options?.posThreshold ?? 15,\n })\n\n const panStart$ = this.panStart$.pipe(\n map((event) => ({\n type: \"panStart\" as const,\n ...event,\n })),\n share(),\n )\n\n const panEnd$ = this.panEnd$.pipe(\n map((event) => ({\n type: \"panEnd\" as const,\n ...event,\n })),\n share(),\n )\n\n this.events$ = merge(\n panStart$,\n this.panMove$.pipe(\n map((event) => ({\n type: \"panMove\" as const,\n ...event,\n })),\n ),\n panEnd$,\n )\n\n this.start$ = panStart$\n\n this.end$ = panEnd$\n }\n\n public update(config: RecognizerConfig<PanRecognizerOptions>) {\n super.update(config, config.options)\n }\n}\n","import { Observable, filter } from \"rxjs\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const isRecognizedAsSwipe =\n (escapeVelocity: number) => (stream: Observable<RecognizerEvent>) =>\n stream.pipe(\n filter((event) => {\n return (\n Math.abs(event.velocityX) >= escapeVelocity ||\n Math.abs(event.velocityY) >= escapeVelocity\n )\n }),\n )\n","import { Observable, map, share, switchMap } from \"rxjs\"\nimport { calculateDegreeAngleBetweenPoints } from \"../utils/geometry\"\nimport { isRecognizedAsSwipe } from \"./operators\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n SwipeEvent,\n SwipeRecognizerInterface,\n SwipeRecognizerOptions,\n} from \"./SwipeRecognizerInterface\"\n\nexport { type SwipeEvent }\n\nexport class SwipeRecognizer\n extends Recognizer<SwipeRecognizerOptions, SwipeEvent>\n implements SwipeRecognizerInterface\n{\n public events$: Observable<SwipeEvent>\n\n constructor(config?: RecognizerConfig<SwipeRecognizerOptions>) {\n super(config, {\n posThreshold: 0,\n numInputs: 1,\n })\n\n this.events$ = this.config$.pipe(\n switchMap((initializedWith) => {\n const { escapeVelocity = 0.9 } = initializedWith.options ?? {}\n\n return this.panStart$.pipe(\n switchMap((startEvent) => {\n return this.panEnd$.pipe(\n isRecognizedAsSwipe(escapeVelocity),\n map((event) => {\n return {\n type: \"swipe\" as const,\n angle: calculateDegreeAngleBetweenPoints(\n startEvent.event,\n event.event,\n ),\n ...event,\n }\n }),\n )\n }),\n share(),\n )\n }),\n )\n }\n\n public update(config: RecognizerConfig<SwipeRecognizerOptions>) {\n super.update(config)\n }\n}\n","import { Observable, filter, mergeMap, takeUntil, takeWhile, timer } from \"rxjs\"\nimport { isPointerOffEvent, matchPointer } from \"../utils/events\"\nimport { filterPointerOff } from \"../recognizer/operators\"\nimport { isWithinPosThreshold } from \"../utils/utils\"\n\nexport const takeWhenPressedTooLong =\n ({\n timeout,\n pointerEvent$,\n }: {\n timeout: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n timer(timeout).pipe(\n takeUntil(\n pointerEvent$.pipe(filterPointerOff, matchPointer(pointerDown)),\n ),\n ),\n ),\n )\n\nexport const takeWhenOutsideThreshold =\n ({\n initialPointerEvent,\n pointerEvent$,\n tolerance,\n }: {\n initialPointerEvent: PointerEvent\n tolerance: number\n pointerEvent$: Observable<PointerEvent>\n }) =>\n (stream: Observable<PointerEvent>) =>\n stream.pipe(\n mergeMap((pointerDown) =>\n pointerEvent$.pipe(\n matchPointer(pointerDown),\n takeWhile((event) => !isPointerOffEvent(event), true),\n filter((event) =>\n isWithinPosThreshold(initialPointerEvent, event, tolerance),\n ),\n ),\n ),\n )\n","import {\n Observable,\n buffer,\n debounceTime,\n exhaustMap,\n filter,\n first,\n ignoreElements,\n map,\n merge,\n of,\n share,\n shareReplay,\n switchMap,\n takeUntil,\n withLatestFrom,\n} from \"rxjs\"\nimport { filterNotEmpty } from \"../utils/utils\"\nimport { scanToRecognizerEvent } from \"../recognizer/scanToRecognizerEvent\"\nimport { trackPointers } from \"../utils/events\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n TapEvent,\n TapRecognizerInterface,\n TapRecognizerOptions,\n} from \"./TapRecognizerInterface\"\nimport { takeWhenOutsideThreshold, takeWhenPressedTooLong } from \"./operators\"\n\nexport { type TapEvent }\n\nexport class TapRecognizer\n extends Recognizer<TapRecognizerOptions, TapEvent>\n implements TapRecognizerInterface\n{\n public events$: Observable<TapEvent>\n\n constructor(options?: RecognizerConfig<TapRecognizerOptions>) {\n super(options)\n\n this.events$ = this.config$.pipe(\n switchMap((config) => {\n const {\n multiTapThreshold = 0,\n maximumPressTime = 150,\n maxTaps = 1,\n tolerance = 10,\n } = config.options ?? {}\n\n const activePointers$ = this.pointerDown$.pipe(\n trackPointers({\n pointerEvent$: this.pointerEvent$,\n trackMove: true,\n }),\n shareReplay(1),\n )\n\n const hasMoreThanOneActivePointer$ = activePointers$.pipe(\n filter(({ pointers }) => pointers.length > 1),\n )\n\n const bufferPointerDowns = (stream: Observable<PointerEvent>) =>\n stream.pipe(\n buffer(this.pointerUp$.pipe(debounceTime(multiTapThreshold))),\n first(),\n )\n\n const tap$ = merge(\n this.pointerDown$,\n activePointers$.pipe(ignoreElements()),\n ).pipe(\n exhaustMap((initialPointerEvent) => {\n const pointerDowns$ = merge(\n of(initialPointerEvent),\n this.pointerDown$,\n ).pipe(shareReplay(1))\n\n const pointerDownsBuffered$ = pointerDowns$.pipe(bufferPointerDowns)\n\n /**\n * Exit condition for `tolerance`\n */\n const clickedTooFarFromOriginalTap$ = pointerDowns$.pipe(\n takeWhenOutsideThreshold({\n initialPointerEvent,\n pointerEvent$: this.pointerEvent$,\n tolerance,\n }),\n )\n\n /**\n * Exit condition for `maximumPressTime`\n */\n const hasFingersPressedForTooLong$ = pointerDowns$.pipe(\n takeWhenPressedTooLong({\n pointerEvent$: this.pointerEvent$,\n timeout: maximumPressTime,\n }),\n )\n\n const takeUntil$ = merge(\n this.failWith$,\n this.pointerCancel$,\n hasMoreThanOneActivePointer$,\n clickedTooFarFromOriginalTap$,\n hasFingersPressedForTooLong$,\n )\n\n const rawEvent$ = pointerDownsBuffered$.pipe(\n filterNotEmpty,\n filter((events) => events.length <= maxTaps),\n map((events) => ({\n type: \"tap\" as const,\n taps: events.length,\n latestActivePointers: events,\n event: events[0],\n })),\n shareReplay(1),\n )\n\n return rawEvent$.pipe(\n scanToRecognizerEvent,\n withLatestFrom(rawEvent$),\n map(([recognizerEvent, { type, taps }]) => ({\n ...recognizerEvent,\n type,\n taps,\n })),\n takeUntil(takeUntil$),\n )\n }),\n )\n\n return tap$\n }),\n share(),\n )\n }\n\n public update(config: RecognizerConfig<TapRecognizerOptions>): void {\n super.update(config)\n }\n}\n","import {\n Observable,\n filter,\n map,\n merge,\n scan,\n share,\n shareReplay,\n switchMap,\n} from \"rxjs\"\nimport {\n Recognizer,\n RecognizerConfig,\n RecognizerPanEvent,\n} from \"../recognizer/Recognizer\"\nimport {\n RotateEvent,\n RotateRecognizerInterface,\n RotateRecognizerOptions,\n} from \"./RotateRecognizerInterface\"\n\nexport { type RotateEvent }\n\nexport class RotateRecognizer\n extends Recognizer<RotateRecognizerOptions, RotateEvent>\n implements RotateRecognizerInterface\n{\n public events$: Observable<RotateEvent>\n\n constructor(config: RecognizerConfig<RotateRecognizerOptions> = {}) {\n super(config, {\n numInputs: 2,\n posThreshold: 15,\n ...config.options,\n })\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const rotateStart$ = this.panStart$.pipe(\n map((event) => ({\n ...event,\n type: \"rotateStart\" as const,\n angle: 0,\n deltaAngle: 0,\n })),\n shareReplay(1),\n )\n\n const rotate$ = rotateStart$.pipe(\n switchMap(() =>\n this.pan$.pipe(\n scan<\n RecognizerPanEvent,\n RecognizerPanEvent & { angle: number; deltaAngle: number },\n undefined\n >((acc, current) => {\n const angle = (acc?.angle ?? 0) + current.deltaPointersAngle\n\n return {\n ...acc,\n ...current,\n angle,\n deltaAngle: current.deltaPointersAngle,\n }\n }, undefined),\n ),\n ),\n share(),\n )\n\n const rotateMove$ = rotate$.pipe(\n filter((event) => event.type === \"move\"),\n map((event) => ({ ...event, type: \"rotateMove\" as const })),\n )\n\n const rotateEnd$ = rotate$.pipe(\n filter((event) => event.type === \"end\"),\n map((event) => ({ ...event, type: \"rotateEnd\" as const })),\n )\n\n return merge(rotateStart$, rotateMove$, rotateEnd$)\n }),\n share(),\n )\n }\n\n public update(options: RecognizerConfig<RotateRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Observable, map, scan } from \"rxjs\"\nimport { PinchEvent } from \"./PinchRecognizerInterface\"\nimport { RecognizerEvent } from \"../recognizer/RecognizerEvent\"\n\nexport const mapPanEventToPinchEvent =\n ({\n type,\n initialEvent,\n }: {\n type: PinchEvent[\"type\"]\n initialEvent: PinchEvent | RecognizerEvent | undefined\n }) =>\n (stream: Observable<RecognizerEvent | PinchEvent>) =>\n stream.pipe(\n scan<\n RecognizerEvent | PinchEvent,\n PinchEvent & {\n initialPointersAverageDistance: number\n },\n PinchEvent | RecognizerEvent | undefined\n >((acc, curr) => {\n const previousPointersLength = acc?.pointers.length ?? 0\n const hasChangedFingers =\n previousPointersLength !== curr.pointers.length\n const previousPointersAverageDistance =\n acc?.pointersAverageDistance ?? curr.pointersAverageDistance\n\n /**\n * initial average distance is reset every time we change fingers\n * @important in case of 1 finger, distance will be 0\n */\n const initialPointersAverageDistance = hasChangedFingers\n ? curr.pointersAverageDistance\n : !!acc && \"initialPointersAverageDistance\" in acc\n ? acc.initialPointersAverageDistance\n : curr.pointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n */\n const scale =\n initialPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / initialPointersAverageDistance\n\n const distance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n const deltaDistance =\n curr.pointersAverageDistance - initialPointersAverageDistance\n\n /**\n * @important When finger is 1, distance is 0\n * Same when fingers change\n */\n const deltaDistanceScale =\n hasChangedFingers || previousPointersAverageDistance === 0\n ? 1\n : curr.pointersAverageDistance / previousPointersAverageDistance\n\n return {\n ...acc,\n ...curr,\n type,\n initialPointersAverageDistance,\n scale,\n distance,\n deltaDistance,\n deltaDistanceScale,\n }\n }, initialEvent),\n map(({ initialPointersAverageDistance, ...rest }): PinchEvent => rest),\n )\n","import {\n Observable,\n filter,\n merge,\n of,\n pairwise,\n share,\n shareReplay,\n startWith,\n switchMap,\n takeWhile,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport { mapPanEventToPinchEvent } from \"./mapPanEventToPinchEvent\"\nimport {\n PinchEvent,\n PinchRecognizerInterface,\n PinchRecognizerOptions,\n} from \"./PinchRecognizerInterface\"\n\nexport { type PinchEvent } from \"./PinchRecognizerInterface\"\n\nexport class PinchRecognizer\n extends Recognizer<PinchRecognizerOptions, PinchEvent>\n implements PinchRecognizerInterface\n{\n public events$: Observable<PinchEvent>\n\n public start$: Observable<PinchEvent>\n\n constructor(config?: RecognizerConfig<PinchRecognizerOptions>) {\n super(config, {\n ...config?.options,\n numInputs: 2,\n })\n\n const pinchStart$ = this.panStart$.pipe(\n switchMap((event) =>\n of(event).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchStart\",\n initialEvent: undefined,\n }),\n ),\n ),\n share(),\n )\n\n this.events$ = this.config$.pipe(\n switchMap(() => {\n const pinchStarted$ = pinchStart$.pipe(shareReplay(1))\n\n const pinchMove$ = pinchStarted$.pipe(\n switchMap((initialEvent) => {\n return this.pan$.pipe(\n takeWhile((event) => event.type !== \"end\"),\n mapPanEventToPinchEvent({\n type: \"pinchMove\",\n initialEvent,\n }),\n )\n }),\n )\n\n const pinchEnd$ = pinchStarted$.pipe(\n switchMap((pinchStartEvent) =>\n this.pan$.pipe(\n // we cannot have a panEnd without a previous event so it will always emit\n startWith(pinchStartEvent),\n pairwise(),\n filter(([, currEvent]) => currEvent.type === \"end\"),\n switchMap(([previousEvent, currEvent]) =>\n of(currEvent).pipe(\n mapPanEventToPinchEvent({\n type: \"pinchEnd\",\n initialEvent: previousEvent,\n }),\n ),\n ),\n ),\n ),\n )\n\n return merge(pinchStarted$, pinchMove$, pinchEnd$)\n }),\n share(),\n )\n\n this.start$ = pinchStart$\n }\n\n public update(options: RecognizerConfig<PinchRecognizerOptions>) {\n super.update(options, options.options)\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Observable,\n ObservedValueOf,\n combineLatest,\n map,\n merge,\n share,\n} from \"rxjs\"\nimport { Recognizer, RecognizerConfig } from \"../recognizer/Recognizer\"\nimport {\n RecognizableInterface,\n RecognizableState,\n} from \"./RecognizableInterface\"\n\nexport class Recognizable<T extends Recognizer<any, any>[]>\n implements RecognizableInterface<T>\n{\n events$: Observable<ObservedValueOf<T[number][\"events$\"]>>\n\n recognizers: T\n\n state$: Observable<RecognizableState>\n\n constructor(\n protected options: {\n recognizers: T\n } & RecognizerConfig<unknown>,\n ) {\n this.recognizers = options.recognizers\n\n this.events$ = merge(\n ...options.recognizers.map((recognizer) => recognizer.events$),\n ).pipe(share())\n\n this.state$ = combineLatest(\n this.recognizers.map((recognizer) => recognizer.state$),\n ).pipe(\n map((states) =>\n states.reduce((acc, state) => ({\n fingers: Math.max(acc.fingers, state.fingers),\n })),\n ),\n )\n\n this.update(options)\n }\n\n public update(options: RecognizerConfig<unknown>) {\n if (options.container) {\n /**\n * We have to disable touch-action otherwise every events will be followed\n * by a cancel event since the browser will try to handle touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action\n */\n options.container.style.touchAction = `none`\n\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n */\n options.container.style.userSelect = `none`\n }\n\n this.options.recognizers.forEach((recognizer) => {\n recognizer.update(options)\n })\n }\n}\n"],"names":["calculateDistance","pointA","pointB","calculateAverageDistance","pointerEvents","n","totalDistance","sum","event1","i","innerSum","event2","numberOfPairs","calculateRadianAngleBetweenPoints","pointerA","pointerB","deltaX","deltaY","calculateDegreeAngleBetweenPoints","calculateCentroid","points","acc","point","numPoints","calculateAngleDelta","initialPoints","newPoints","initialCentroid","newCentroid","totalAngleDelta","initialAngle","angleDelta","radianDelta","degreesDelta","isDefined","arg","hasAtLeastOneItem","events","filterNotEmpty","stream","filter","isWithinPosThreshold","startEvent","endEvent","posThreshold","start","end","calculateVelocity","delay","velocityX","velocityY","matchPointer","pointer","newPointer","isPointerOffEvent","pointerEvent","fromPointerDown","container","afterEventReceived","event","fromEvent","map","trackPointers","pointerEvent$","pointerUp$","pointerLeave$","pointerCancel$","pointerMove$","contextMenu$","isPointerRemoved","mergeMap","pointerDown","pointerDown$","defer","of","merge","takeWhile","scan","_deleted","rest","pointers","calculateNewDelta","newCenter","prevCenter","prevDeltaX","prevDeltaY","scanToRecognizerEvent","getCenterFromData","data","curr","prevActivePointersNumber","_a","currActivePointersNumber","_b","hasAddedOrRemovedAFinger","hasAtLeastOneFinger","deltaPointersAngle","latestActivePointers","startTime","center","pointersAverageDistance","isValidConfig","config","filterPointerOff","getPointerEvents","Recognizer","panConfig","__publicField","BehaviorSubject","stateSubject","switchMap","distinctUntilChanged","previous","current","failWith","start$","NEVER","numInputs","trackPointers$","shareReplay","hasEnoughFingers","hasNotEnoughFingers","exhaustMap","initialPointerEvents","panReleased$","first","share","delay$","timer","panStart$","withLatestFrom","takeUntil","panUpdate$","skip","panEnd$","rawEvent$","recognizerEvent","type","tap","existingConfig","PanRecognizer","isRecognizedAsSwipe","escapeVelocity","SwipeRecognizer","initializedWith","takeWhenPressedTooLong","timeout","takeWhenOutsideThreshold","initialPointerEvent","tolerance","TapRecognizer","options","multiTapThreshold","maximumPressTime","maxTaps","activePointers$","hasMoreThanOneActivePointer$","bufferPointerDowns","buffer","debounceTime","ignoreElements","pointerDowns$","pointerDownsBuffered$","clickedTooFarFromOriginalTap$","hasFingersPressedForTooLong$","takeUntil$","taps","RotateRecognizer","rotateStart$","rotate$","angle","rotateMove$","rotateEnd$","mapPanEventToPinchEvent","initialEvent","hasChangedFingers","previousPointersAverageDistance","initialPointersAverageDistance","scale","distance","deltaDistance","deltaDistanceScale","PinchRecognizer","pinchStart$","pinchStarted$","pinchMove$","pinchEnd$","pinchStartEvent","startWith","pairwise","currEvent","previousEvent","Recognizable","recognizer","combineLatest","states","state"],"mappings":"uaAEgB,SAAAA,EAAkBC,EAAeC,EAAuB,CACtE,OAAO,KAAK,KACV,KAAK,IAAIA,EAAO,EAAID,EAAO,EAAG,CAAC,EAAI,KAAK,IAAIC,EAAO,EAAID,EAAO,EAAG,CAAC,CAAA,CAEtE,CAEO,SAASE,EAAyBC,EAAgC,CACvE,MAAMC,EAAID,EAAc,OACpB,GAAAC,EAAI,EAAU,MAAA,GAElB,MAAMC,EAAgBF,EAAc,OAAO,CAACG,EAAKC,EAAQC,IAErDF,EACAH,EAAc,MAAMK,EAAI,CAAC,EAAE,OAAO,CAACC,EAAUC,IACpCD,EAAWV,EAAkBQ,EAAQG,CAAM,EACjD,CAAC,EAEL,CAAC,EAGEC,EAAiBP,GAAKA,EAAI,GAAM,EACtC,OAAOC,EAAgBM,CACzB,CAEgB,SAAAC,EACdC,EACAC,EACQ,CAEF,MAAAC,EAASD,EAAS,EAAID,EAAS,EAC/BG,EAASF,EAAS,EAAID,EAAS,EAM9B,OAHgB,KAAK,MAAMG,EAAQD,CAAM,CAIlD,CAEgB,SAAAE,EACdJ,EACAC,EACQ,CAQD,OANgBF,EAAkCC,EAAUC,CAAQ,GAGlC,IAAM,KAAK,GAItD,CAEO,SAASI,EAAkBC,EAAiB,CACjD,MAAMb,EAAMa,EAAO,OACjB,CAACC,EAAKC,KACJD,EAAI,GAAKC,EAAM,EACfD,EAAI,GAAKC,EAAM,EAERD,GAET,CAAE,EAAG,EAAG,EAAG,CAAE,CAAA,EAGTE,EAAYH,EAAO,QAAU,EAE5B,MAAA,CACL,EAAGb,EAAI,EAAIgB,EACX,EAAGhB,EAAI,EAAIgB,CAAA,CAEf,CAEgB,SAAAC,EACdC,EACAC,EACA,CACI,GAAAD,EAAc,SAAWC,EAAU,OAC/B,MAAA,IAAI,MAAM,0DAA0D,EAGtE,MAAAC,EAAkBR,EAAkBM,CAAa,EACjDG,EAAcT,EAAkBO,CAAS,EAE/C,IAAIG,EAAkB,EAEtB,QAASpB,EAAI,EAAGA,EAAIgB,EAAc,OAAQhB,IAAK,CAC7C,MAAMqB,EAAejB,EACnBc,EACAF,EAAchB,CAAC,CAAA,EAOjB,IAAIsB,EALalB,EACfe,EACAF,EAAUjB,CAAC,CAAA,EAGeqB,EAGxBC,EAAa,KAAK,GACpBA,GAAc,EAAI,KAAK,GACdA,EAAa,CAAC,KAAK,KAC5BA,GAAc,EAAI,KAAK,IAGNF,GAAAE,CACrB,CAGM,MAAAC,EAAcH,EAAkBJ,EAAc,OAC9CQ,EAAeD,GAAe,IAAM,KAAK,IAExC,MAAA,CAAE,YAAAA,EAAa,aAAAC,EACxB,CC/GO,SAASC,EACdC,EAC+C,CACxC,OAAAA,GAAQ,IACjB,CAEO,MAAMC,EAAwBC,GACnCA,EAAO,OAAS,EAELC,EACXC,GAC4BA,EAAO,KAAKC,EAAA,OAAOJ,CAAiB,CAAC,EAEnD,SAAAK,EACdC,EACAC,EACAC,EACA,CACA,MAAMC,EAAQ1B,EAAkB,CAACuB,CAAU,CAAC,EACtCI,EAAM3B,EAAkB,CAACwB,CAAQ,CAAC,EAGxC,OACE,KAAK,IAAIG,EAAI,EAAID,EAAM,CAAC,GAAKD,GAC7B,KAAK,IAAIE,EAAI,EAAID,EAAM,CAAC,GAAKD,CAEjC,CAMO,MAAMG,EAAoB,CAC/BC,EACAhC,EACAC,IACG,CACH,MAAMgC,EAAYD,EAAQ,EAAIhC,EAASgC,EAAQ,EACzCE,EAAYF,EAAQ,EAAI/B,EAAS+B,EAAQ,EAExC,MAAA,CACL,UAAAC,EACA,UAAAC,CAAA,CAEJ,ECjCO,SAASC,EAAaC,EAAuB,CAC3C,OAACb,GACNA,EAAO,KACLC,SAAQa,GAAeA,EAAW,YAAcD,EAAQ,SAAS,CAAA,CAEvE,CAEa,MAAAE,EAAqBC,GAChCA,EAAa,OAAS,gBACtBA,EAAa,OAAS,iBACtBA,EAAa,OAAS,YAEXC,EAAkB,CAAC,CAC9B,UAAAC,EACA,mBAAAC,EAAsBC,GAAUA,CAClC,IAIEC,YAAwBH,EAAW,aAAa,EAAE,KAChDI,EAAAA,IAAIH,CAAkB,CACxB,EAKWI,EACX,CAAC,CACC,cAAAC,CACF,IASCxB,GAAqC,CAMpC,MAAMyB,EAAaD,EAAc,KAC/BvB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,WAAW,CAAA,EAExCM,EAAgBF,EAAc,KAClCvB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,cAAc,CAAA,EAE3CO,EAAiBH,EAAc,KACnCvB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,eAAe,CAAA,EAE5CQ,EAAeJ,EAAc,KACjCvB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,aAAa,CAAA,EAE1CS,EAAeR,EAAAA,UAAwB,OAAQ,aAAa,EAE5DS,EAAoBV,GACxB,CAAC,gBAAiB,eAAgB,YAAa,aAAa,EAAE,SAC5DA,EAAM,IAAA,EAGV,OAAOpB,EAAO,KACZ+B,EAAA,SAAUC,GAAgB,CACxB,MAAMC,EAAeC,EAAA,MAAM,IAAMC,EAAAA,GAAGH,CAAW,CAAC,EAgBzC,OAdWI,EAAA,MAChBH,EACAG,EAAA,MACER,EACAD,EACAD,EACAD,EACAI,CACF,CAAA,EACA,KACAjB,EAAaoB,CAAW,EACxBK,YAAWjB,GAAU,CAACU,EAAiBV,CAAK,EAAG,EAAI,CAAA,CAG9C,CACR,EACDkB,OAA6C,CAACxD,EAAKsC,IAAU,CACvD,GAAAU,EAAiBV,CAAK,EAAG,CACrB,KAAA,CAAE,CAACA,EAAM,SAAS,EAAGmB,EAAU,GAAGC,IAAS1D,GAAA,YAAAA,EAAK,WAAY,GAI3D,MAAA,CACL,MAAAsC,EACA,SAAUoB,CAAA,CAEd,CAEO,MAAA,CACL,MAAApB,EACA,SAAU,CACR,IAAItC,GAAA,YAAAA,EAAK,WAAY,CAAC,EACtB,CAACsC,EAAM,SAAS,EAAGA,CACrB,CAAA,GAED,MAAS,EACZE,EAAAA,IAAI,CAAC,CAAE,MAAAF,EAAO,SAAAqB,MAAgB,CAC5B,MAAArB,EACA,SAAU,OAAO,OAAOqB,CAAQ,EAAE,OAAO9C,CAAS,CAAA,EAClD,CAAA,CAEN,ECpGI+C,EAAoB,CACxBC,EACAC,EACAC,EACAC,IACG,CACH,MAAMrE,EAASkE,EAAU,EAAIC,EAAW,EAAIC,EACtCnE,EAASiE,EAAU,EAAIC,EAAW,EAAIE,EAErC,MAAA,CACL,OAAArE,EACA,OAAAC,CAAA,CAEJ,EAEaqE,EACX/C,GACgC,CAC1B,MAAAgD,EAAqBC,GACzBrE,EACGqE,EAAK,qBAAqB,OAEvBA,EAAK,qBADL,CAACA,EAAK,KAAK,CACN,EAGb,OAAOjD,EAAO,KACZsC,OAAyC,CAACxD,EAAKoE,IAAS,SAChD,MAAAP,EAAYK,EAAkBE,CAAI,EAClCN,GAAa9D,GAAA,YAAAA,EAAK,SAAU6D,EAC5BE,GAAa/D,GAAA,YAAAA,EAAK,SAAU,EAC5BgE,GAAahE,GAAA,YAAAA,EAAK,SAAU,EAC5BqE,IAA2BC,EAAAtE,GAAA,YAAAA,EAAK,uBAAL,YAAAsE,EAA2B,SAAU,EAChEC,IAA2BC,EAAAJ,EAAK,uBAAL,YAAAI,EAA2B,SAAU,EAEhEC,EACJ,CAAC,cAAe,gBAAiB,eAAgB,WAAW,EAAE,SAC5DL,EAAK,MAAM,IAAA,GACRC,IAA6BE,EAE9BG,EAAsBH,EAA2B,EAEjD,CAAE,OAAA5E,EAAQ,OAAAC,CACd,EAAA6E,GAA4BC,EACxBd,EAAkBC,EAAWA,EAAWE,EAAYC,CAAU,EAC9DJ,EAAkBC,EAAWC,EAAYC,EAAYC,CAAU,EAE/D,CAAE,aAAcW,CAAmB,EACvCN,IAA6BE,GAC7BF,GAA4B,GAC5BE,GAA4B,EACxBpE,GACEH,GAAA,YAAAA,EAAK,uBAAwB,CAAC,EAC9BoE,EAAK,sBAAwB,CAAC,CAAA,EAEhC,CAAE,aAAc,GAEf,MAAA,CACL,UAAW,IAAI,KAAK,EAAE,QAAQ,EAC9B,GAAGpE,EACH,GAAGoE,EACH,OAAQP,EACR,OAAAlE,EACA,OAAAC,EACA,mBAAA+E,CAAA,GAED,MAAS,EACZnC,EAAA,IAAK2B,GAAS,CACN,KAAA,CACJ,OAAAxE,EACA,OAAAC,EACA,qBAAAgF,EACA,UAAAC,EACA,OAAAC,EACA,MAAAxC,EACA,mBAAAqC,CACE,EAAAR,EACEnD,EAAS4D,GAAwB,GAIjCjD,EADM,KAAK,MACGkD,EAEd,CAAE,UAAAjD,EAAW,UAAAC,GAAcH,EAAkBC,EAAOhC,EAAQC,CAAM,EAClEmF,EACJjG,EAAyB8F,CAAoB,EAExC,MAAA,CACL,OAAAjF,EACA,OAAAC,EACA,UAAAgC,EACA,UAAAC,EACA,MAAAF,EACA,OAAAmD,EACA,SAAU9D,EACV,UAAA6D,EACA,MAAAvC,EACA,mBAAAqC,EACA,wBAAAI,CAAA,CACF,CACD,CAAA,CAEL,ECxHaC,EACX9D,GAEAA,EAAO,KACLC,EAAA,OACG8D,GAAqD,CAAC,CAACA,EAAO,SACjE,CACF,EAEWC,EAAoBhE,GAC/BA,EAAO,KAAKC,EAAAA,OAAOc,CAAiB,CAAC,ECV1BkD,EAAmB,CAAC,CAC/B,UAAA/C,EACA,mBAAAC,EAAsBC,GAAUA,CAClC,IAGM,CACJ,MAAMa,EAAehB,EAAgB,CAAE,mBAAAE,EAAoB,UAAAD,CAAW,CAAA,EAChEO,EAAaJ,EAAA,UAAwBH,EAAW,WAAW,EAAE,KACjEI,EAAAA,IAAIH,CAAkB,CAAA,EAElBS,EAAeP,EAAA,UAAwBH,EAAW,aAAa,EAAE,KACrEI,EAAAA,IAAIH,CAAkB,CAAA,EAKlBO,EAAgBL,EAAA,UAAwBH,EAAW,cAAc,EAAE,KACvEI,EAAAA,IAAIH,CAAkB,CAAA,EAMlBQ,EAAiBN,EAAA,UACrBH,EACA,eACA,EAAA,KAAKI,EAAAA,IAAIH,CAAkB,CAAC,EAEvB,OAAAiB,EAAA,MACLH,EACAN,EACAD,EACAD,EACAG,CAAA,CAEJ,ECeO,MAAesC,CAGpB,CA0BA,YAAYH,EAAoCI,EAAuB,CAzB7DC,EAAA,qBAAgB,IAAIC,kBAI5B,CAAA,CAAE,GACMD,EAAA,aACAA,EAAA,kBACAA,EAAA,iBACAA,EAAA,gBAEAA,EAAA,sBACAA,EAAA,qBACAA,EAAA,mBACAA,EAAA,uBACAA,EAAA,qBACAA,EAAA,oBAEHA,EAAA,eAIGA,EAAA,kBAEHA,EAAA,eAAU,KAAK,cAAc,KAAKN,CAAa,GAG9C,MAAAQ,EAAe,IAAID,kBAAuB,CAC9C,QAAS,CAAA,CACV,EAEI,KAAA,cAAgB,KAAK,QAAQ,KAChCE,EAAA,UAAU,CAAC,CAAE,UAAArD,EAAW,mBAAAC,KACtB8C,EAAiB,CACf,UAAA/C,EACA,mBAAAC,CAAA,CACD,CACH,CAAA,EAGG,KAAA,aAAe,KAAK,cAAc,KACrClB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,aAAa,CAAA,EAG3C,KAAA,WAAa,KAAK,cAAc,KACnCnB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,WAAW,CAAA,EAGzC,KAAA,aAAe,KAAK,cAAc,KACrCnB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,aAAa,CAAA,EAG3C,KAAA,eAAiB,KAAK,cAAc,KACvCnB,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,eAAe,CAAA,EAGlD,KAAK,YAAc,KAAK,cAAc,KAAK4C,CAAgB,EAEtD,KAAA,UAAY,KAAK,QAAQ,KAC5BQ,EAAA,qBACE,CAACC,EAAUC,IAAYD,EAAS,WAAaC,EAAQ,QACvD,EACAH,EAAA,UAAU,CAAC,CAAE,SAAAI,CAAA,IACVA,GAAA,MAAAA,EAAU,OAEPvC,EAAA,MAAM,IAAIuC,GAAA,YAAAA,EAAU,IAAI,CAAC,CAAE,OAAAC,KAAaA,KAAW,CAAA,CAAG,EADtDC,EACA,KACN,CAAA,EAGG,KAAA,KAAO,KAAK,cAAc,KAC7Bf,EACAS,EAAA,UAAWR,GAAW,WACpB,MAAMe,EAAY,KAAK,IAAI,IAAGf,EAAAA,EAAO,YAAPA,YAAAA,EAAkB,YAAa,CAAC,EACxD1D,EAAe,KAAK,IAAI,IAAG0D,EAAAA,EAAO,YAAPA,YAAAA,EAAkB,eAAgB,CAAC,EAC9DtD,EAAQ,KAAK,IAAI,IAAGsD,EAAAA,EAAO,YAAPA,YAAAA,EAAkB,QAAS,CAAC,EAEhDgB,EAAiB,KAAK,aAAa,KACvCxD,EAAc,CACZ,cAAe,KAAK,cACpB,UAAW,EAAA,CACZ,EACDyD,EAAAA,YAAY,CAAC,CAAA,EAGTC,EACJjF,GAEAA,EAAO,KACLC,EAAA,OAEIH,GAEAA,EAAO,SAAS,QAAUgF,CAC9B,CAAA,EAGEI,EACJlF,GAIGA,EAAO,KAAKC,EAAA,OAAQH,GAAWA,EAAO,SAAS,OAASgF,CAAS,CAAC,EAEvE,OAAOC,EAAe,KACpBE,EACAE,EAAAA,WAAW,CAAC,CAAE,SAAUC,KAA2B,CACjD,MAAMC,EAAeN,EAAe,KAClCG,EACAI,QAAM,EACNC,QAAM,CAAA,EAGFC,EAASC,QAAMhF,CAAK,EAqBpBiF,EAnB+BtD,EAAA,MACnC,GAAGgD,EAAqB,IAAKpE,GAAiBmB,EAAA,GAAGnB,CAAY,CAAC,EAC9D,KAAK,YAAA,EACL,KACAe,EAAA,SAAUC,GACRI,EAAAA,MAAM,KAAK,aAAcD,KAAGH,CAAW,CAAC,EAAE,KACxCpB,EAAaoB,CAAW,EACxB/B,EAAA,OAAQe,GACNd,EACE8B,EACAhB,EACAX,CACF,CACF,CACF,CACF,EACAiF,QAAM,CAAA,EAGuC,KAC7Cf,EAAA,UAAU,IAAMiB,CAAM,EACtBG,EAAAA,eAAeZ,CAAc,EAC7BzD,EAAAA,IAAI,CAAC,CAAG,CAAA,CAAE,MAAAF,EAAO,SAAAqB,CAAU,CAAA,KAAO,CAChC,KAAM,QACN,MAAArB,EACA,qBAAsBqB,CAAA,EACtB,EACFuC,cAAY,CACV,WAAY,EACZ,SAAU,EAAA,CACX,EACDY,EAAAA,UAAUP,CAAY,CAAA,EAGlBQ,EAAaH,EAAU,KAC3B3D,EAAA,SAAS,IACPgD,EAAe,KACbe,EAAAA,KAAK,CAAC,EACNxE,EAAAA,IAAI,CAAC,CAAE,MAAAF,EAAO,SAAAqB,MAAgB,CAC5B,KAAM,OACN,MAAArB,EACA,qBAAsBqB,CAAA,EACtB,CACJ,CACF,EACAmD,EAAAA,UAAUP,CAAY,CAAA,EAGlBU,EAAUL,EAAU,KACxB3D,EAAA,SAAS,IACPsD,EAAa,KACX/D,EAAAA,IAAI,CAAC,CAAE,MAAAF,EAAO,SAAAqB,MAAgB,CAC5B,KAAM,MACN,MAAArB,EACA,qBAAsBqB,CAAA,EACtB,CACJ,CACF,CAAA,EAGIuD,EAAY5D,EAAAA,MAAMsD,EAAWG,EAAYE,CAAO,EAAE,KACtDf,EAAAA,YAAY,CAAC,CAAA,EAGf,OAAOgB,EAAU,KACfjD,EACA4C,EAAAA,eAAeK,CAAS,EACxB1E,EAAAA,IAAI,CAAC,CAAC2E,EAAiB,CAAE,KAAAC,CAAM,CAAA,KAAO,CACpC,GAAGD,EACH,KAAAC,CAAA,EACA,CAAA,CACJ,CACD,CAAA,CACH,CACD,EACDC,EAAA,IAAK/E,GAAU,CACbkD,EAAa,KAAK,CAChB,QAASlD,EAAM,SAAS,MAAA,CACzB,CAAA,CACF,EACDmE,QAAM,CAAA,EAGH,KAAA,UAAY,KAAK,KAAK,KACzBtF,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,OAAO,EACxCE,EAAAA,IAAI,CAAC,CAAE,KAAA4E,EAAM,GAAG1D,CAAA,IAAWA,CAAI,CAAA,EAG5B,KAAA,SAAW,KAAK,KAAK,KACxBvC,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,MAAM,EACvCE,EAAAA,IAAI,CAAC,CAAE,KAAA4E,EAAM,GAAG1D,CAAA,IAAWA,CAAI,CAAA,EAG5B,KAAA,QAAU,KAAK,KAAK,KACvBvC,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,KAAK,EACtCE,EAAAA,IAAI,CAAC,CAAE,KAAA4E,EAAM,GAAG1D,CAAA,IAAWA,CAAI,CAAA,EAG5B,KAAA,OAAS8B,EAAa,eAE3B,KAAK,eAAeP,GAAU,CAAC,EAAGI,CAAS,CAC7C,CAEQ,eACNJ,EACAI,EACA,CACM,MAAAiC,EAAiB,KAAK,cAAc,SAAS,EAEnD,KAAK,cAAc,KAAK,CACtB,GAAGA,EACH,GAAGrC,EACH,GAAIA,EAAO,SAAW,CACpB,QAAS,CAAE,GAAGqC,EAAe,QAAS,GAAGrC,EAAO,OAAQ,CAC1D,EACA,UAAW,CACT,GAAGqC,EAAe,UAClB,GAAGjC,CACL,CAAA,CACD,CACH,CAEO,OACLJ,EACAI,EACA,CACK,KAAA,eAAeJ,EAAQI,CAAS,CACvC,CACF,CCjSO,MAAMkC,UACHnC,CAEV,CAKE,YAAYH,EAAiD,OAC3D,MAAMA,EAAQ,CACZ,GAAGA,EACH,eAAcX,EAAAW,GAAA,YAAAA,EAAQ,UAAR,YAAAX,EAAiB,eAAgB,EAAA,CAChD,EARIgB,EAAA,gBACAA,EAAA,eACAA,EAAA,aAQC,MAAAsB,EAAY,KAAK,UAAU,KAC/BpE,EAAA,IAAKF,IAAW,CACd,KAAM,WACN,GAAGA,CAAA,EACH,EACFmE,QAAM,CAAA,EAGFQ,EAAU,KAAK,QAAQ,KAC3BzE,EAAA,IAAKF,IAAW,CACd,KAAM,SACN,GAAGA,CAAA,EACH,EACFmE,QAAM,CAAA,EAGR,KAAK,QAAUnD,EAAA,MACbsD,EACA,KAAK,SAAS,KACZpE,EAAA,IAAKF,IAAW,CACd,KAAM,UACN,GAAGA,CAAA,EACH,CACJ,EACA2E,CAAA,EAGF,KAAK,OAASL,EAEd,KAAK,KAAOK,CACd,CAEO,OAAOhC,EAAgD,CACtD,MAAA,OAAOA,EAAQA,EAAO,OAAO,CACrC,CACF,CCxDO,MAAMuC,EACVC,GAA4BvG,GAC3BA,EAAO,KACLC,EAAA,OAAQmB,GAEJ,KAAK,IAAIA,EAAM,SAAS,GAAKmF,GAC7B,KAAK,IAAInF,EAAM,SAAS,GAAKmF,CAEhC,CACH,ECAG,MAAMC,UACHtC,CAEV,CAGE,YAAYH,EAAmD,CAC7D,MAAMA,EAAQ,CACZ,aAAc,EACd,UAAW,CAAA,CACZ,EANIK,EAAA,gBAQA,KAAA,QAAU,KAAK,QAAQ,KAC1BG,EAAA,UAAWkC,GAAoB,CAC7B,KAAM,CAAE,eAAAF,EAAiB,EAAA,EAAQE,EAAgB,SAAW,CAAA,EAE5D,OAAO,KAAK,UAAU,KACpBlC,EAAA,UAAWpE,GACF,KAAK,QAAQ,KAClBmG,EAAoBC,CAAc,EAClCjF,EAAA,IAAKF,IACI,CACL,KAAM,QACN,MAAOzC,EACLwB,EAAW,MACXiB,EAAM,KACR,EACA,GAAGA,CAAA,EAEN,CAAA,CAEJ,EACDmE,QAAM,CAAA,CACR,CACD,CAAA,CAEL,CAEO,OAAOxB,EAAkD,CAC9D,MAAM,OAAOA,CAAM,CACrB,CACF,CChDO,MAAM2C,EACX,CAAC,CACC,QAAAC,EACA,cAAAnF,CACF,IAICxB,GACCA,EAAO,KACL+B,EAAA,SAAUC,GACRyD,EAAAA,MAAMkB,CAAO,EAAE,KACbf,EAAA,UACEpE,EAAc,KAAKwC,EAAkBpD,EAAaoB,CAAW,CAAC,CAChE,CACF,CACF,CACF,EAES4E,EACX,CAAC,CACC,oBAAAC,EACA,cAAArF,EACA,UAAAsF,CACF,IAKC9G,GACCA,EAAO,KACL+B,EAAA,SAAUC,GACRR,EAAc,KACZZ,EAAaoB,CAAW,EACxBK,YAAWjB,GAAU,CAACL,EAAkBK,CAAK,EAAG,EAAI,EACpDnB,EAAA,OAAQmB,GACNlB,EAAqB2G,EAAqBzF,EAAO0F,CAAS,CAC5D,CACF,CACF,CACF,ECfG,MAAMC,WACH7C,CAEV,CAGE,YAAY8C,EAAkD,CAC5D,MAAMA,CAAO,EAHR5C,EAAA,gBAKA,KAAA,QAAU,KAAK,QAAQ,KAC1BG,EAAA,UAAWR,GAAW,CACd,KAAA,CACJ,kBAAAkD,EAAoB,EACpB,iBAAAC,EAAmB,IACnB,QAAAC,EAAU,EACV,UAAAL,EAAY,EAAA,EACV/C,EAAO,SAAW,GAEhBqD,EAAkB,KAAK,aAAa,KACxC7F,EAAc,CACZ,cAAe,KAAK,cACpB,UAAW,EAAA,CACZ,EACDyD,EAAAA,YAAY,CAAC,CAAA,EAGTqC,EAA+BD,EAAgB,KACnDnH,SAAO,CAAC,CAAE,SAAAwC,KAAeA,EAAS,OAAS,CAAC,CAAA,EAGxC6E,EAAsBtH,GAC1BA,EAAO,KACLuH,SAAO,KAAK,WAAW,KAAKC,EAAa,aAAAP,CAAiB,CAAC,CAAC,EAC5D3B,QAAM,CAAA,EAqEH,OAlEMlD,EAAA,MACX,KAAK,aACLgF,EAAgB,KAAKK,EAAAA,gBAAgB,CAAA,EACrC,KACAtC,EAAA,WAAY0B,GAAwB,CAClC,MAAMa,EAAgBtF,EAAA,MACpBD,EAAAA,GAAG0E,CAAmB,EACtB,KAAK,YACL,EAAA,KAAK7B,EAAAA,YAAY,CAAC,CAAC,EAEf2C,EAAwBD,EAAc,KAAKJ,CAAkB,EAK7DM,EAAgCF,EAAc,KAClDd,EAAyB,CACvB,oBAAAC,EACA,cAAe,KAAK,cACpB,UAAAC,CAAA,CACD,CAAA,EAMGe,EAA+BH,EAAc,KACjDhB,EAAuB,CACrB,cAAe,KAAK,cACpB,QAASQ,CAAA,CACV,CAAA,EAGGY,EAAa1F,EAAA,MACjB,KAAK,UACL,KAAK,eACLiF,EACAO,EACAC,CAAA,EAGI7B,EAAY2B,EAAsB,KACtC5H,EACAE,EAAAA,OAAQH,GAAWA,EAAO,QAAUqH,CAAO,EAC3C7F,EAAA,IAAKxB,IAAY,CACf,KAAM,MACN,KAAMA,EAAO,OACb,qBAAsBA,EACtB,MAAOA,EAAO,CAAC,CAAA,EACf,EACFkF,EAAAA,YAAY,CAAC,CAAA,EAGf,OAAOgB,EAAU,KACfjD,EACA4C,EAAAA,eAAeK,CAAS,EACxB1E,EAAA,IAAI,CAAC,CAAC2E,EAAiB,CAAE,KAAAC,EAAM,KAAA6B,CAAM,CAAA,KAAO,CAC1C,GAAG9B,EACH,KAAAC,EACA,KAAA6B,CAAA,EACA,EACFnC,EAAAA,UAAUkC,CAAU,CAAA,CACtB,CACD,CAAA,CAGI,CACR,EACDvC,QAAM,CAAA,CAEV,CAEO,OAAOxB,EAAsD,CAClE,MAAM,OAAOA,CAAM,CACrB,CACF,CCtHO,MAAMiE,WACH9D,CAEV,CAGE,YAAYH,EAAoD,GAAI,CAClE,MAAMA,EAAQ,CACZ,UAAW,EACX,aAAc,GACd,GAAGA,EAAO,OAAA,CACX,EAPIK,EAAA,gBASA,KAAA,QAAU,KAAK,QAAQ,KAC1BG,EAAAA,UAAU,IAAM,CACR,MAAA0D,EAAe,KAAK,UAAU,KAClC3G,EAAA,IAAKF,IAAW,CACd,GAAGA,EACH,KAAM,cACN,MAAO,EACP,WAAY,CAAA,EACZ,EACF4D,EAAAA,YAAY,CAAC,CAAA,EAGTkD,EAAUD,EAAa,KAC3B1D,EAAA,UAAU,IACR,KAAK,KAAK,KACRjC,OAIE,CAACxD,EAAK4F,IAAY,CAClB,MAAMyD,IAASrJ,GAAA,YAAAA,EAAK,QAAS,GAAK4F,EAAQ,mBAEnC,MAAA,CACL,GAAG5F,EACH,GAAG4F,EACH,MAAAyD,EACA,WAAYzD,EAAQ,kBAAA,GAErB,MAAS,CACd,CACF,EACAa,QAAM,CAAA,EAGF6C,EAAcF,EAAQ,KAC1BjI,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,MAAM,EACvCE,EAAA,IAAKF,IAAW,CAAE,GAAGA,EAAO,KAAM,cAAwB,CAAA,EAGtDiH,EAAaH,EAAQ,KACzBjI,EAAAA,OAAQmB,GAAUA,EAAM,OAAS,KAAK,EACtCE,EAAA,IAAKF,IAAW,CAAE,GAAGA,EAAO,KAAM,aAAuB,CAAA,EAGpD,OAAAgB,QAAM6F,EAAcG,EAAaC,CAAU,CAAA,CACnD,EACD9C,QAAM,CAAA,CAEV,CAEO,OAAOyB,EAAoD,CAC1D,MAAA,OAAOA,EAASA,EAAQ,OAAO,CACvC,CACF,CCpFO,MAAMsB,EACX,CAAC,CACC,KAAApC,EACA,aAAAqC,CACF,IAICvI,GACCA,EAAO,KACLsC,OAME,CAACxD,EAAKoE,IAAS,CAET,MAAAsF,IADyB1J,GAAA,YAAAA,EAAK,SAAS,SAAU,KAE1BoE,EAAK,SAAS,OACrCuF,GACJ3J,GAAA,YAAAA,EAAK,0BAA2BoE,EAAK,wBAMjCwF,EAAiCF,EACnCtF,EAAK,wBACHpE,GAAO,mCAAoCA,EAC3CA,EAAI,+BACJoE,EAAK,wBAKLyF,EACJD,IAAmC,EAC/B,EACAxF,EAAK,wBAA0BwF,EAE/BE,EACJ1F,EAAK,wBAA0BwF,EAE3BG,EACJ3F,EAAK,wBAA0BwF,EAM3BI,EACJN,GAAqBC,IAAoC,EACrD,EACAvF,EAAK,wBAA0BuF,EAE9B,MAAA,CACL,GAAG3J,EACH,GAAGoE,EACH,KAAAgD,EACA,+BAAAwC,EACA,MAAAC,EACA,SAAAC,EACA,cAAAC,EACA,mBAAAC,CAAA,GAEDP,CAAY,EACfjH,EAAAA,IAAI,CAAC,CAAE,+BAAAoH,EAAgC,GAAGlG,CAAA,IAAuBA,CAAI,CACvE,ECnDG,MAAMuG,WACH7E,CAEV,CAKE,YAAYH,EAAmD,CAC7D,MAAMA,EAAQ,CACZ,GAAGA,GAAA,YAAAA,EAAQ,QACX,UAAW,CAAA,CACZ,EARIK,EAAA,gBAEAA,EAAA,eAQC,MAAA4E,EAAc,KAAK,UAAU,KACjCzE,EAAA,UAAWnD,GACTe,EAAAA,GAAGf,CAAK,EAAE,KACRkH,EAAwB,CACtB,KAAM,aACN,aAAc,MAAA,CACf,CACH,CACF,EACA/C,QAAM,CAAA,EAGH,KAAA,QAAU,KAAK,QAAQ,KAC1BhB,EAAAA,UAAU,IAAM,CACd,MAAM0E,EAAgBD,EAAY,KAAKhE,EAAAA,YAAY,CAAC,CAAC,EAE/CkE,EAAaD,EAAc,KAC/B1E,EAAA,UAAWgE,GACF,KAAK,KAAK,KACflG,EAAAA,UAAWjB,GAAUA,EAAM,OAAS,KAAK,EACzCkH,EAAwB,CACtB,KAAM,YACN,aAAAC,CAAA,CACD,CAAA,CAEJ,CAAA,EAGGY,EAAYF,EAAc,KAC9B1E,EAAA,UAAW6E,GACT,KAAK,KAAK,KAERC,EAAAA,UAAUD,CAAe,EACzBE,WAAS,EACTrJ,EAAA,OAAO,CAAC,CAAA,CAAGsJ,CAAS,IAAMA,EAAU,OAAS,KAAK,EAClDhF,EAAA,UAAU,CAAC,CAACiF,EAAeD,CAAS,IAClCpH,EAAAA,GAAGoH,CAAS,EAAE,KACZjB,EAAwB,CACtB,KAAM,WACN,aAAckB,CAAA,CACf,CACH,CACF,CACF,CACF,CAAA,EAGK,OAAApH,QAAM6G,EAAeC,EAAYC,CAAS,CAAA,CAClD,EACD5D,QAAM,CAAA,EAGR,KAAK,OAASyD,CAChB,CAEO,OAAOhC,EAAmD,CACzD,MAAA,OAAOA,EAASA,EAAQ,OAAO,CACvC,CACF,CC/EO,MAAMyC,EAEb,CAOE,YACYzC,EAGV,CAVF5C,EAAA,gBAEAA,EAAA,oBAEAA,EAAA,eAGY,KAAA,QAAA4C,EAIV,KAAK,YAAcA,EAAQ,YAE3B,KAAK,QAAU5E,EAAA,MACb,GAAG4E,EAAQ,YAAY,IAAK0C,GAAeA,EAAW,OAAO,CAAA,EAC7D,KAAKnE,EAAA,MAAA,CAAO,EAEd,KAAK,OAASoE,EAAA,cACZ,KAAK,YAAY,IAAKD,GAAeA,EAAW,MAAM,CAAA,EACtD,KACApI,EAAA,IAAKsI,GACHA,EAAO,OAAO,CAAC9K,EAAK+K,KAAW,CAC7B,QAAS,KAAK,IAAI/K,EAAI,QAAS+K,EAAM,OAAO,CAAA,EAC5C,CACJ,CAAA,EAGF,KAAK,OAAO7C,CAAO,CACrB,CAEO,OAAOA,EAAoC,CAC5CA,EAAQ,YAMFA,EAAA,UAAU,MAAM,YAAc,OAK9BA,EAAA,UAAU,MAAM,WAAa,QAGvC,KAAK,QAAQ,YAAY,QAAS0C,GAAe,CAC/CA,EAAW,OAAO1C,CAAO,CAAA,CAC1B,CACH,CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gesturx",
3
3
  "private": false,
4
- "version": "1.7.5",
4
+ "version": "1.7.6",
5
5
  "type": "module",
6
6
  "main": "./dist/index.umd.cjs",
7
7
  "module": "./dist/index.js",