gesturx 0.0.0 → 1.1.0

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.
Files changed (45) hide show
  1. package/README.md +17 -1
  2. package/dist/core/index.d.ts +4 -0
  3. package/dist/core/manager.d.ts +15 -0
  4. package/dist/core/pan/PanRecognizer.d.ts +19 -0
  5. package/dist/core/pinch/PinchRecognizer.d.ts +29 -0
  6. package/dist/core/recognizer/Recognizer.d.ts +21 -0
  7. package/dist/core/recognizer/RecognizerEvent.d.ts +42 -0
  8. package/dist/core/recognizer/mapToRecognizerEvent.d.ts +8 -0
  9. package/dist/core/rotate/RotateRecognizer.d.ts +24 -0
  10. package/dist/core/swipe/SwipeRecognizer.d.ts +30 -0
  11. package/dist/core/swipe/SwipeRecognizer.test.d.ts +1 -0
  12. package/dist/core/swipe/isRecognizedAsSwipe.d.ts +4 -0
  13. package/dist/core/tap/TapRecognizer.d.ts +20 -0
  14. package/dist/core/tap/TapRecognizer.test.d.ts +1 -0
  15. package/dist/core/utils/events.d.ts +40 -0
  16. package/dist/core/utils/geometry.d.ts +17 -0
  17. package/dist/core/utils/utils.d.ts +17 -0
  18. package/dist/core/utils/utils.test.d.ts +1 -0
  19. package/dist/demo/App.d.ts +2 -0
  20. package/dist/demo/DebugBox.d.ts +5 -0
  21. package/dist/demo/useManager.d.ts +11 -0
  22. package/dist/demo/useTap.d.ts +5 -0
  23. package/dist/index.js +505 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/index.umd.cjs +2 -0
  26. package/dist/index.umd.cjs.map +1 -0
  27. package/dist/main.d.ts +1 -0
  28. package/dist/theme.d.ts +1 -0
  29. package/package.json +19 -3
  30. package/.github/workflows/publish.yml +0 -17
  31. package/.prettierrc.json +0 -1
  32. package/eslint.config.js +0 -9
  33. package/index.html +0 -13
  34. package/src/core/manager.ts +0 -45
  35. package/src/core/tapRecognizer.test.ts +0 -542
  36. package/src/core/tapRecognizer.ts +0 -143
  37. package/src/core/types.ts +0 -3
  38. package/src/core/utils.ts +0 -211
  39. package/src/main.ts +0 -19
  40. package/src/style.css +0 -29
  41. package/src/vite-env.d.ts +0 -1
  42. package/tsconfig.json +0 -23
  43. package/vite.config.ts +0 -33
  44. package/vitest.config.ts +0 -8
  45. /package/{public → dist}/vite.svg +0 -0
package/README.md CHANGED
@@ -1,3 +1,19 @@
1
1
  # gesturx
2
2
 
3
- Gesture recognizer using rxjs
3
+ Modern multi touch gesture recognizer using rxjs.
4
+
5
+ # Documentation
6
+
7
+ Head over the [wiki](https://github.com/mbret/gesturx/wiki).
8
+
9
+ # Demo
10
+
11
+ [https://gesturx.vercel.app/](https://gesturx.vercel.app/)
12
+
13
+ # License
14
+
15
+ MIT
16
+
17
+ # author
18
+
19
+ [mbret](https://github.com/mbret)
@@ -0,0 +1,4 @@
1
+ export { PanRecognizer } from './pan/PanRecognizer';
2
+ export { SwipeRecognizer } from './swipe/SwipeRecognizer';
3
+ export { TapRecognizer } from './tap/TapRecognizer';
4
+ export { createManager } from './manager';
@@ -0,0 +1,15 @@
1
+ import { TapRecognizer } from './tap/TapRecognizer';
2
+ import { PanRecognizer } from './pan/PanRecognizer';
3
+ import { SwipeRecognizer } from './swipe/SwipeRecognizer';
4
+ import { RotateRecognizer } from './rotate/RotateRecognizer';
5
+ import { PinchRecognizer } from './pinch/PinchRecognizer';
6
+
7
+ export type Manager = ReturnType<typeof createManager>;
8
+ export declare const createManager: ({ afterEventReceived, recognizers, }: {
9
+ recognizers: (TapRecognizer | PanRecognizer | SwipeRecognizer | RotateRecognizer | PinchRecognizer)[];
10
+ afterEventReceived?: (event: PointerEvent) => PointerEvent;
11
+ }) => {
12
+ events$: import('rxjs').Observable<import('./pan/PanRecognizer').PanEvent | import('./swipe/SwipeRecognizer').SwipeEvent | import('./tap/TapRecognizer').TapEvent | import('./rotate/RotateRecognizer').RotateEvent | import('./pinch/PinchRecognizer').PinchEvent>;
13
+ initialize: (container: HTMLElement) => void;
14
+ recognizers: (PanRecognizer | SwipeRecognizer | TapRecognizer | RotateRecognizer | PinchRecognizer)[];
15
+ };
@@ -0,0 +1,19 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Recognizer } from '../recognizer/Recognizer';
3
+ import { RecognizerEvent } from '../recognizer/RecognizerEvent';
4
+
5
+ export interface PanEvent extends RecognizerEvent {
6
+ type: "panStart" | "panMove" | "panEnd";
7
+ }
8
+ type Options = {
9
+ posThreshold?: number;
10
+ };
11
+ export declare class PanRecognizer extends Recognizer<Options> {
12
+ protected options: Options;
13
+ events$: Observable<PanEvent>;
14
+ start$: Observable<PanEvent>;
15
+ end$: Observable<PanEvent>;
16
+ fingers$: Observable<number>;
17
+ constructor(options?: Options);
18
+ }
19
+ export {};
@@ -0,0 +1,29 @@
1
+ import { Observable } from 'rxjs';
2
+ import { RecognizerEvent } from '../recognizer/RecognizerEvent';
3
+ import { Recognizer } from '../recognizer/Recognizer';
4
+
5
+ export interface PinchEvent extends RecognizerEvent {
6
+ type: "pinchStart" | "pinchMove" | "pinchEnd";
7
+ scale: number;
8
+ /**
9
+ * Distance between start and current
10
+ */
11
+ distance: number;
12
+ /**
13
+ * Delta distance between events
14
+ */
15
+ deltaDistance: number;
16
+ /**
17
+ * Delta scale between events
18
+ */
19
+ deltaDistanceScale: number;
20
+ }
21
+ type Options = {
22
+ posThreshold?: number;
23
+ };
24
+ export declare class PinchRecognizer extends Recognizer<Options> {
25
+ protected options: Options;
26
+ events$: Observable<PinchEvent>;
27
+ constructor(options?: Options);
28
+ }
29
+ export {};
@@ -0,0 +1,21 @@
1
+ import { BehaviorSubject, Observable } from 'rxjs';
2
+
3
+ type RecognizerConfig<Options> = {
4
+ container?: HTMLElement;
5
+ afterEventReceived?: (event: PointerEvent) => PointerEvent;
6
+ options?: Options;
7
+ };
8
+ type ValidRecognizerConfig<Options> = Required<Pick<RecognizerConfig<Options>, "container">> & RecognizerConfig<Options>;
9
+ export interface RecognizerOptions {
10
+ failWith?: {
11
+ start$: Observable<unknown>;
12
+ }[];
13
+ }
14
+ export declare class Recognizer<Options> {
15
+ protected config$: BehaviorSubject<RecognizerConfig<Options>>;
16
+ protected validConfig$: Observable<ValidRecognizerConfig<Options>>;
17
+ constructor(options: Options);
18
+ initialize(config: RecognizerConfig<Options>): void;
19
+ update(options: Options): void;
20
+ }
21
+ export {};
@@ -0,0 +1,42 @@
1
+ export interface RecognizerEvent {
2
+ center: {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ event: PointerEvent;
7
+ /**
8
+ * Contain the last known pointer event for each active fingers.
9
+ * It should contain a unique list, with n being the number of active fingers.
10
+ */
11
+ pointers: PointerEvent[];
12
+ /**
13
+ * Delay between the user action and the event recognition
14
+ */
15
+ delay: number;
16
+ deltaX: number;
17
+ deltaY: number;
18
+ /**
19
+ * @important
20
+ * Can be negative, 0, positive
21
+ */
22
+ velocityX: number;
23
+ /**
24
+ * @important
25
+ * Can be negative, 0, positive
26
+ */
27
+ velocityY: number;
28
+ startTime: number;
29
+ /**
30
+ * Angle delta (in degrees) between pointers between this event
31
+ * and the previous one.
32
+ *
33
+ * @important
34
+ * - Will only register a delta if the previous event and current event
35
+ * have the same amount of fingers
36
+ */
37
+ deltaPointersAngle: number;
38
+ /**
39
+ * Average distance between all pointers
40
+ */
41
+ pointersAverageDistance: number;
42
+ }
@@ -0,0 +1,8 @@
1
+ import { Observable } from 'rxjs';
2
+ import { RecognizerEvent } from './RecognizerEvent';
3
+
4
+ export interface RecognizerEventInput {
5
+ event: PointerEvent;
6
+ latestActivePointers: PointerEvent[];
7
+ }
8
+ export declare const mapToRecognizerEvent: <T extends RecognizerEventInput>(stream: Observable<T>) => Observable<RecognizerEvent>;
@@ -0,0 +1,24 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Recognizer } from '../recognizer/Recognizer';
3
+ import { RecognizerEvent } from '../recognizer/RecognizerEvent';
4
+
5
+ export interface RotateEvent extends RecognizerEvent {
6
+ type: "rotate" | "rotateStart" | "rotateEnd";
7
+ /**
8
+ * Current rotation angle
9
+ */
10
+ angle: number;
11
+ /**
12
+ * Delta angle between events
13
+ */
14
+ deltaAngle: number;
15
+ }
16
+ type Options = {
17
+ posThreshold?: number;
18
+ };
19
+ export declare class RotateRecognizer extends Recognizer<Options> {
20
+ protected options: Options;
21
+ events$: Observable<RotateEvent>;
22
+ constructor(options?: Options);
23
+ }
24
+ export {};
@@ -0,0 +1,30 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Recognizer } from '../recognizer/Recognizer';
3
+ import { RecognizerEvent } from '../recognizer/RecognizerEvent';
4
+
5
+ export interface SwipeEvent extends RecognizerEvent {
6
+ type: "swipe";
7
+ /**
8
+ * Angle between first pointer and last one in degree
9
+ *
10
+ * (-90)
11
+ * (+/-180) <- | -> (+/-0)
12
+ * (+90)
13
+ */
14
+ angle: number;
15
+ }
16
+ type Options = {
17
+ /**
18
+ * The minimum velocity (px/ms) that the gesture has to obtain by the end event.
19
+ */
20
+ escapeVelocity?: number;
21
+ numInputs?: number;
22
+ maxRestTime?: number;
23
+ posThreshold?: number;
24
+ };
25
+ export declare class SwipeRecognizer extends Recognizer<Options> {
26
+ protected options: Options;
27
+ events$: Observable<SwipeEvent>;
28
+ constructor(options?: Options);
29
+ }
30
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { Observable } from 'rxjs';
2
+ import { PanEvent } from '../pan/PanRecognizer';
3
+
4
+ export declare const isRecognizedAsSwipe: (escapeVelocity: number) => (stream: Observable<PanEvent>) => Observable<PanEvent>;
@@ -0,0 +1,20 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Recognizer, RecognizerOptions } from '../recognizer/Recognizer';
3
+ import { RecognizerEvent } from '../recognizer/RecognizerEvent';
4
+
5
+ export interface TapEvent extends RecognizerEvent {
6
+ type: "tap";
7
+ taps: number;
8
+ }
9
+ interface Options extends RecognizerOptions {
10
+ multiTapThreshold?: number;
11
+ maximumPressTime?: number;
12
+ maxTaps?: number;
13
+ posThreshold?: number;
14
+ }
15
+ export declare class TapRecognizer extends Recognizer<Options> {
16
+ protected options: Options;
17
+ events$: Observable<TapEvent>;
18
+ constructor(options: Options);
19
+ }
20
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import { Observable } from 'rxjs';
2
+
3
+ export declare function matchPointer(pointer: PointerEvent): (stream: Observable<PointerEvent>) => Observable<PointerEvent>;
4
+ export declare const getPointerEvents: ({ container, afterEventReceived, }: {
5
+ container: HTMLElement;
6
+ afterEventReceived?: (event: PointerEvent) => PointerEvent;
7
+ }) => {
8
+ pointerDown$: Observable<PointerEvent>;
9
+ pointerCancel$: Observable<PointerEvent>;
10
+ pointerLeave$: Observable<PointerEvent>;
11
+ pointerUp$: Observable<PointerEvent>;
12
+ pointerMove$: Observable<PointerEvent>;
13
+ };
14
+ export declare const fromPointerDown: ({ container, afterEventReceived, }: {
15
+ container: HTMLElement;
16
+ afterEventReceived?: (event: PointerEvent) => PointerEvent;
17
+ }) => Observable<PointerEvent>;
18
+ /**
19
+ * @todo test the strict stability
20
+ * @important
21
+ * Stable function, will not emit if the pointers don't change
22
+ */
23
+ export declare const trackActivePointers: ({ container, }: {
24
+ container: HTMLElement;
25
+ }) => Observable<PointerEvent[]>;
26
+ /**
27
+ * Track all pointerEvent for active fingers
28
+ */
29
+ export declare const trackFingers: ({ pointerCancel$, pointerLeave$, pointerUp$, pointerMove$, trackMove, }: {
30
+ pointerUp$: Observable<PointerEvent>;
31
+ pointerLeave$: Observable<PointerEvent>;
32
+ pointerCancel$: Observable<PointerEvent>;
33
+ pointerMove$: Observable<PointerEvent>;
34
+ /**
35
+ * Setting this value to false will not update the list
36
+ * on pointer move. Use it if you only need to track number of active
37
+ * fingers.
38
+ */
39
+ trackMove: boolean;
40
+ }) => (stream: Observable<PointerEvent>) => Observable<PointerEvent[]>;
@@ -0,0 +1,17 @@
1
+ type Point = {
2
+ x: number;
3
+ y: number;
4
+ };
5
+ export declare function calculateDistance(pointA: Point, pointB: Point): number;
6
+ export declare function calculateAverageDistance(pointerEvents: Point[]): number;
7
+ export declare function calculateRadianAngleBetweenPoints(pointerA: Point, pointerB: Point): number;
8
+ export declare function calculateDegreeAngleBetweenPoints(pointerA: Point, pointerB: Point): number;
9
+ export declare function calculateCentroid(points: Point[]): {
10
+ x: number;
11
+ y: number;
12
+ };
13
+ export declare function calculateAngleDelta(initialPoints: Point[], newPoints: Point[]): {
14
+ radianDelta: number;
15
+ degreesDelta: number;
16
+ };
17
+ export {};
@@ -0,0 +1,17 @@
1
+ import { Observable } from 'rxjs';
2
+
3
+ export declare function isDefined<T>(arg: T | null | undefined): arg is T extends null | undefined ? never : T;
4
+ export declare const hasAtLeastOneItem: <T>(events: T[]) => events is [T, ...T[]];
5
+ export declare const filterNotEmpty: <T>(stream: Observable<T[]>) => Observable<[T, ...T[]]>;
6
+ export declare function isOutsidePosThreshold(startEvent: PointerEvent, endEvent: PointerEvent, posThreshold: number): boolean;
7
+ export declare const fromFailWith: (failWith?: {
8
+ start$: Observable<unknown>;
9
+ }[]) => Observable<unknown>;
10
+ /**
11
+ * Avoid division by zero
12
+ * Calculate velocity in pixels per second
13
+ */
14
+ export declare const calculateVelocity: (delay: number, deltaX: number, deltaY: number) => {
15
+ velocityX: number;
16
+ velocityY: number;
17
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ declare function App(): import("react/jsx-runtime").JSX.Element;
2
+ export default App;
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ export declare const DebugBox: ({ children }: {
4
+ children: ReactNode;
5
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { PanRecognizer, SwipeRecognizer, TapRecognizer } from '../core';
2
+ import { RotateRecognizer } from '../core/rotate/RotateRecognizer';
3
+ import { PinchRecognizer } from '../core/pinch/PinchRecognizer';
4
+
5
+ export declare const useManager: (container?: HTMLElement) => {
6
+ manager: {
7
+ events$: import('rxjs').Observable<import('../core/pan/PanRecognizer').PanEvent | import('../core/swipe/SwipeRecognizer').SwipeEvent | import('../core/tap/TapRecognizer').TapEvent | import('../core/rotate/RotateRecognizer').RotateEvent | import('../core/pinch/PinchRecognizer').PinchEvent>;
8
+ initialize: (container: HTMLElement) => void;
9
+ recognizers: (PanRecognizer | SwipeRecognizer | TapRecognizer | RotateRecognizer | PinchRecognizer)[];
10
+ };
11
+ };
@@ -0,0 +1,5 @@
1
+ import { Manager } from '../core/manager';
2
+
3
+ export declare const useTap: (manager: Manager) => {
4
+ tapDebug: import("react/jsx-runtime").JSX.Element;
5
+ };