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.
- package/README.md +17 -1
- package/dist/core/index.d.ts +4 -0
- package/dist/core/manager.d.ts +15 -0
- package/dist/core/pan/PanRecognizer.d.ts +19 -0
- package/dist/core/pinch/PinchRecognizer.d.ts +29 -0
- package/dist/core/recognizer/Recognizer.d.ts +21 -0
- package/dist/core/recognizer/RecognizerEvent.d.ts +42 -0
- package/dist/core/recognizer/mapToRecognizerEvent.d.ts +8 -0
- package/dist/core/rotate/RotateRecognizer.d.ts +24 -0
- package/dist/core/swipe/SwipeRecognizer.d.ts +30 -0
- package/dist/core/swipe/SwipeRecognizer.test.d.ts +1 -0
- package/dist/core/swipe/isRecognizedAsSwipe.d.ts +4 -0
- package/dist/core/tap/TapRecognizer.d.ts +20 -0
- package/dist/core/tap/TapRecognizer.test.d.ts +1 -0
- package/dist/core/utils/events.d.ts +40 -0
- package/dist/core/utils/geometry.d.ts +17 -0
- package/dist/core/utils/utils.d.ts +17 -0
- package/dist/core/utils/utils.test.d.ts +1 -0
- package/dist/demo/App.d.ts +2 -0
- package/dist/demo/DebugBox.d.ts +5 -0
- package/dist/demo/useManager.d.ts +11 -0
- package/dist/demo/useTap.d.ts +5 -0
- package/dist/index.js +505 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.cjs +2 -0
- package/dist/index.umd.cjs.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/theme.d.ts +1 -0
- package/package.json +19 -3
- package/.github/workflows/publish.yml +0 -17
- package/.prettierrc.json +0 -1
- package/eslint.config.js +0 -9
- package/index.html +0 -13
- package/src/core/manager.ts +0 -45
- package/src/core/tapRecognizer.test.ts +0 -542
- package/src/core/tapRecognizer.ts +0 -143
- package/src/core/types.ts +0 -3
- package/src/core/utils.ts +0 -211
- package/src/main.ts +0 -19
- package/src/style.css +0 -29
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.json +0 -23
- package/vite.config.ts +0 -33
- package/vitest.config.ts +0 -8
- /package/{public → dist}/vite.svg +0 -0
package/README.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
1
|
# gesturx
|
|
2
2
|
|
|
3
|
-
|
|
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,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,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,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
|
+
};
|