react-native-gesture-handler 2.12.1 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. package/RNGestureHandler.podspec +0 -15
  2. package/android/build.gradle +5 -76
  3. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +16 -1
  4. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +43 -18
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +120 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt +7 -0
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt +5 -0
  8. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +43 -16
  9. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +21 -0
  10. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +9 -1
  11. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +10 -0
  12. package/ios/Handlers/RNHoverHandler.h +12 -0
  13. package/ios/Handlers/RNHoverHandler.m +152 -0
  14. package/ios/RNGestureHandlerButtonComponentView.mm +2 -0
  15. package/ios/RNGestureHandlerEvents.h +1 -0
  16. package/ios/RNGestureHandlerEvents.m +10 -0
  17. package/ios/RNGestureHandlerManager.mm +2 -0
  18. package/ios/RNManualActivationRecognizer.m +2 -1
  19. package/ios/RNRootViewGestureRecognizer.m +7 -2
  20. package/lib/commonjs/RNGestureHandlerModule.macos.js +3 -1
  21. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  22. package/lib/commonjs/RNGestureHandlerModule.web.js +7 -2
  23. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  24. package/lib/commonjs/RNGestureHandlerModule.windows.js +3 -1
  25. package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -1
  26. package/lib/commonjs/components/DrawerLayout.js +1 -0
  27. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  28. package/lib/commonjs/components/touchables/GenericTouchable.js +1 -2
  29. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  30. package/lib/commonjs/components/touchables/TouchableHighlight.js.map +1 -1
  31. package/lib/commonjs/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
  32. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  33. package/lib/commonjs/components/touchables/TouchableWithoutFeedback.js.map +1 -1
  34. package/lib/commonjs/components/touchables/index.js.map +1 -1
  35. package/lib/commonjs/handlers/createHandler.js +3 -3
  36. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  37. package/lib/commonjs/handlers/gestureHandlerCommon.js +1 -1
  38. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  39. package/lib/commonjs/handlers/gestures/GestureDetector.js +3 -1
  40. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  41. package/lib/commonjs/handlers/gestures/gesture.js +5 -0
  42. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  43. package/lib/commonjs/handlers/gestures/gestureObjects.js +5 -0
  44. package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -1
  45. package/lib/commonjs/handlers/gestures/hoverGesture.js +74 -0
  46. package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -0
  47. package/lib/commonjs/index.js +8 -0
  48. package/lib/commonjs/index.js.map +1 -1
  49. package/lib/commonjs/web/handlers/FlingGestureHandler.js +0 -10
  50. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  51. package/lib/commonjs/web/handlers/GestureHandler.js +61 -88
  52. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  53. package/lib/commonjs/web/handlers/HoverGestureHandler.js +62 -0
  54. package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -0
  55. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +6 -7
  56. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  57. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +12 -4
  58. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  59. package/lib/commonjs/web/handlers/PanGestureHandler.js +2 -7
  60. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  61. package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -10
  62. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  63. package/lib/commonjs/web/interfaces.js +1 -1
  64. package/lib/commonjs/web/interfaces.js.map +1 -1
  65. package/lib/commonjs/web/tools/EventManager.js +18 -4
  66. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  67. package/lib/commonjs/web/tools/GestureHandlerDelegate.js +6 -0
  68. package/lib/commonjs/web/tools/GestureHandlerDelegate.js.map +1 -0
  69. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +5 -7
  70. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  71. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +118 -0
  72. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -0
  73. package/lib/commonjs/web/tools/PointerEventManager.js +38 -5
  74. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  75. package/lib/commonjs/web/tools/TouchEventManager.js +2 -2
  76. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  77. package/lib/module/RNGestureHandlerModule.macos.js +2 -1
  78. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  79. package/lib/module/RNGestureHandlerModule.web.js +6 -3
  80. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  81. package/lib/module/RNGestureHandlerModule.windows.js +2 -1
  82. package/lib/module/RNGestureHandlerModule.windows.js.map +1 -1
  83. package/lib/module/components/DrawerLayout.js +1 -0
  84. package/lib/module/components/DrawerLayout.js.map +1 -1
  85. package/lib/module/components/touchables/GenericTouchable.js +1 -2
  86. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  87. package/lib/module/components/touchables/TouchableHighlight.js.map +1 -1
  88. package/lib/module/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
  89. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  90. package/lib/module/components/touchables/TouchableWithoutFeedback.js.map +1 -1
  91. package/lib/module/components/touchables/index.js.map +1 -1
  92. package/lib/module/handlers/createHandler.js +3 -3
  93. package/lib/module/handlers/createHandler.js.map +1 -1
  94. package/lib/module/handlers/gestureHandlerCommon.js +1 -1
  95. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  96. package/lib/module/handlers/gestures/GestureDetector.js +2 -1
  97. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  98. package/lib/module/handlers/gestures/gesture.js +5 -0
  99. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  100. package/lib/module/handlers/gestures/gestureObjects.js +4 -0
  101. package/lib/module/handlers/gestures/gestureObjects.js.map +1 -1
  102. package/lib/module/handlers/gestures/hoverGesture.js +62 -0
  103. package/lib/module/handlers/gestures/hoverGesture.js.map +1 -0
  104. package/lib/module/index.js +1 -0
  105. package/lib/module/index.js.map +1 -1
  106. package/lib/module/web/handlers/FlingGestureHandler.js +0 -10
  107. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  108. package/lib/module/web/handlers/GestureHandler.js +61 -84
  109. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  110. package/lib/module/web/handlers/HoverGestureHandler.js +47 -0
  111. package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -0
  112. package/lib/module/web/handlers/LongPressGestureHandler.js +5 -7
  113. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  114. package/lib/module/web/handlers/NativeViewGestureHandler.js +11 -4
  115. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  116. package/lib/module/web/handlers/PanGestureHandler.js +2 -7
  117. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  118. package/lib/module/web/handlers/TapGestureHandler.js +0 -10
  119. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  120. package/lib/module/web/interfaces.js +1 -1
  121. package/lib/module/web/interfaces.js.map +1 -1
  122. package/lib/module/web/tools/EventManager.js +18 -4
  123. package/lib/module/web/tools/EventManager.js.map +1 -1
  124. package/lib/module/web/tools/GestureHandlerDelegate.js +2 -0
  125. package/lib/module/web/tools/GestureHandlerDelegate.js.map +1 -0
  126. package/lib/module/web/tools/GestureHandlerOrchestrator.js +5 -6
  127. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  128. package/lib/module/web/tools/GestureHandlerWebDelegate.js +102 -0
  129. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -0
  130. package/lib/module/web/tools/PointerEventManager.js +39 -6
  131. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  132. package/lib/module/web/tools/TouchEventManager.js +2 -2
  133. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  134. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +1 -1
  135. package/lib/typescript/RNGestureHandlerModule.web.d.ts +3 -1
  136. package/lib/typescript/RNGestureHandlerModule.windows.d.ts +1 -1
  137. package/lib/typescript/components/DrawerLayout.d.ts +7 -1
  138. package/lib/typescript/components/touchables/GenericTouchable.d.ts +3 -2
  139. package/lib/typescript/components/touchables/TouchableHighlight.d.ts +4 -3
  140. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +3 -2
  141. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +4 -5
  142. package/lib/typescript/components/touchables/TouchableWithoutFeedback.d.ts +1 -0
  143. package/lib/typescript/components/touchables/index.d.ts +3 -0
  144. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  145. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +3 -1
  146. package/lib/typescript/handlers/gestures/gesture.d.ts +2 -1
  147. package/lib/typescript/handlers/gestures/gestureObjects.d.ts +2 -0
  148. package/lib/typescript/handlers/gestures/hoverGesture.d.ts +32 -0
  149. package/lib/typescript/index.d.ts +4 -0
  150. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +0 -6
  151. package/lib/typescript/web/handlers/GestureHandler.d.ts +12 -17
  152. package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +10 -0
  153. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +0 -4
  154. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -1
  155. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +0 -4
  156. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +0 -6
  157. package/lib/typescript/web/interfaces.d.ts +4 -3
  158. package/lib/typescript/web/tools/EventManager.d.ts +9 -5
  159. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +22 -0
  160. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +21 -0
  161. package/lib/typescript/web/tools/NodeManager.d.ts +2 -2
  162. package/lib/typescript/web/tools/PointerEventManager.d.ts +1 -1
  163. package/lib/typescript/web/tools/TouchEventManager.d.ts +1 -1
  164. package/package.json +2 -2
  165. package/src/RNGestureHandlerModule.macos.ts +5 -1
  166. package/src/RNGestureHandlerModule.web.ts +7 -1
  167. package/src/RNGestureHandlerModule.windows.ts +5 -1
  168. package/src/components/DrawerLayout.tsx +9 -0
  169. package/src/components/touchables/GenericTouchable.tsx +4 -4
  170. package/src/components/touchables/TouchableHighlight.tsx +6 -3
  171. package/src/components/touchables/TouchableNativeFeedback.android.tsx +5 -4
  172. package/src/components/touchables/TouchableOpacity.tsx +6 -7
  173. package/src/components/touchables/TouchableWithoutFeedback.tsx +3 -1
  174. package/src/components/touchables/index.ts +3 -0
  175. package/src/handlers/createHandler.tsx +4 -2
  176. package/src/handlers/gestureHandlerCommon.ts +39 -0
  177. package/src/handlers/gestures/GestureDetector.tsx +2 -0
  178. package/src/handlers/gestures/gesture.ts +6 -0
  179. package/src/handlers/gestures/gestureObjects.ts +5 -0
  180. package/src/handlers/gestures/hoverGesture.ts +83 -0
  181. package/src/index.ts +8 -0
  182. package/src/web/handlers/FlingGestureHandler.ts +0 -11
  183. package/src/web/handlers/GestureHandler.ts +68 -88
  184. package/src/web/handlers/HoverGestureHandler.ts +43 -0
  185. package/src/web/handlers/LongPressGestureHandler.ts +5 -7
  186. package/src/web/handlers/NativeViewGestureHandler.ts +11 -4
  187. package/src/web/handlers/PanGestureHandler.ts +1 -6
  188. package/src/web/handlers/TapGestureHandler.ts +0 -11
  189. package/src/web/interfaces.ts +4 -2
  190. package/src/web/tools/EventManager.ts +15 -7
  191. package/src/web/tools/GestureHandlerDelegate.ts +23 -0
  192. package/src/web/tools/GestureHandlerOrchestrator.ts +7 -6
  193. package/src/web/tools/GestureHandlerWebDelegate.ts +115 -0
  194. package/src/web/tools/PointerEventManager.ts +46 -16
  195. package/src/web/tools/TouchEventManager.ts +3 -3
@@ -3,7 +3,6 @@ import { PointerType } from '../interfaces';
3
3
 
4
4
  import GestureHandler from '../handlers/GestureHandler';
5
5
  import PointerTracker from './PointerTracker';
6
- import { isPointerInBounds } from '../utils';
7
6
 
8
7
  export default class GestureHandlerOrchestrator {
9
8
  private static instance: GestureHandlerOrchestrator;
@@ -301,7 +300,7 @@ export default class GestureHandlerOrchestrator {
301
300
 
302
301
  if (
303
302
  !PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&
304
- handler.getView() !== otherHandler.getView()
303
+ handler.getDelegate().getView() !== otherHandler.getDelegate().getView()
305
304
  ) {
306
305
  return this.checkOverlap(handler, otherHandler);
307
306
  }
@@ -329,8 +328,10 @@ export default class GestureHandlerOrchestrator {
329
328
  const handlerY: number = handler.getTracker().getLastY(pointer);
330
329
 
331
330
  if (
332
- isPointerInBounds(handler.getView(), { x: handlerX, y: handlerY }) &&
333
- isPointerInBounds(otherHandler.getView(), { x: handlerX, y: handlerY })
331
+ handler.getDelegate().isPointerInBounds({ x: handlerX, y: handlerY }) &&
332
+ otherHandler
333
+ .getDelegate()
334
+ .isPointerInBounds({ x: handlerX, y: handlerY })
334
335
  ) {
335
336
  overlap = true;
336
337
  }
@@ -341,8 +342,8 @@ export default class GestureHandlerOrchestrator {
341
342
  const otherY: number = otherHandler.getTracker().getLastY(pointer);
342
343
 
343
344
  if (
344
- isPointerInBounds(handler.getView(), { x: otherX, y: otherY }) &&
345
- isPointerInBounds(otherHandler.getView(), { x: otherX, y: otherY })
345
+ handler.getDelegate().isPointerInBounds({ x: otherX, y: otherY }) &&
346
+ otherHandler.getDelegate().isPointerInBounds({ x: otherX, y: otherY })
346
347
  ) {
347
348
  overlap = true;
348
349
  }
@@ -0,0 +1,115 @@
1
+ import { findNodeHandle } from 'react-native';
2
+ import type GestureHandler from '../handlers/GestureHandler';
3
+ import {
4
+ GestureHandlerDelegate,
5
+ MeasureResult,
6
+ } from './GestureHandlerDelegate';
7
+ import PointerEventManager from './PointerEventManager';
8
+ import TouchEventManager from './TouchEventManager';
9
+ import { State } from '../../State';
10
+ import { isPointerInBounds } from '../utils';
11
+ import EventManager from './EventManager';
12
+
13
+ export class GestureHandlerWebDelegate
14
+ implements GestureHandlerDelegate<HTMLElement>
15
+ {
16
+ private view!: HTMLElement;
17
+ private gestureHandler!: GestureHandler;
18
+ private eventManagers: EventManager<unknown>[] = [];
19
+
20
+ getView(): HTMLElement {
21
+ return this.view;
22
+ }
23
+
24
+ init(viewRef: number, handler: GestureHandler): void {
25
+ if (!viewRef) {
26
+ throw new Error(
27
+ `Cannot find HTML Element for handler ${handler.getTag()}`
28
+ );
29
+ }
30
+
31
+ this.gestureHandler = handler;
32
+ this.view = findNodeHandle(viewRef) as unknown as HTMLElement;
33
+
34
+ this.view.style['touchAction'] = 'none';
35
+ //@ts-ignore This one disables default events on Safari
36
+ this.view.style['WebkitTouchCallout'] = 'none';
37
+
38
+ const config = handler.getConfig();
39
+
40
+ if (!config.userSelect) {
41
+ this.view.style['webkitUserSelect'] = 'none';
42
+ this.view.style['userSelect'] = 'none';
43
+ } else {
44
+ this.view.style['webkitUserSelect'] = config.userSelect;
45
+ this.view.style['userSelect'] = config.userSelect;
46
+ }
47
+
48
+ this.eventManagers.push(new PointerEventManager(this.view));
49
+ this.eventManagers.push(new TouchEventManager(this.view));
50
+
51
+ this.eventManagers.forEach((manager) =>
52
+ this.gestureHandler.attachEventManager(manager)
53
+ );
54
+ }
55
+
56
+ isPointerInBounds({ x, y }: { x: number; y: number }): boolean {
57
+ return isPointerInBounds(this.view, { x, y });
58
+ }
59
+
60
+ measureView(): MeasureResult {
61
+ const rect = this.view.getBoundingClientRect();
62
+
63
+ return {
64
+ pageX: rect.left,
65
+ pageY: rect.top,
66
+ width: rect.width,
67
+ height: rect.height,
68
+ };
69
+ }
70
+
71
+ reset(): void {
72
+ this.eventManagers.forEach((manager: EventManager<unknown>) =>
73
+ manager.resetManager()
74
+ );
75
+ }
76
+
77
+ tryResetCursor() {
78
+ const config = this.gestureHandler.getConfig();
79
+
80
+ if (
81
+ config.activeCursor &&
82
+ config.activeCursor !== 'auto' &&
83
+ this.gestureHandler.getState() === State.ACTIVE
84
+ ) {
85
+ this.view.style.cursor = 'auto';
86
+ }
87
+ }
88
+
89
+ onBegin(): void {
90
+ // no-op for now
91
+ }
92
+
93
+ onActivate(): void {
94
+ const config = this.gestureHandler.getConfig();
95
+
96
+ if (
97
+ (!this.view.style.cursor || this.view.style.cursor === 'auto') &&
98
+ config.activeCursor
99
+ ) {
100
+ this.view.style.cursor = config.activeCursor;
101
+ }
102
+ }
103
+
104
+ onEnd(): void {
105
+ this.tryResetCursor();
106
+ }
107
+
108
+ onCancel(): void {
109
+ this.tryResetCursor();
110
+ }
111
+
112
+ onFail(): void {
113
+ this.tryResetCursor();
114
+ }
115
+ }
@@ -1,13 +1,8 @@
1
- import {
2
- AdaptedEvent,
3
- EventTypes,
4
- MouseButtons,
5
- PointerType,
6
- } from '../interfaces';
1
+ import { AdaptedEvent, EventTypes, PointerType } from '../interfaces';
7
2
  import EventManager from './EventManager';
8
3
  import { isPointerInBounds } from '../utils';
9
4
 
10
- export default class PointerEventManager extends EventManager {
5
+ export default class PointerEventManager extends EventManager<HTMLElement> {
11
6
  private trackedPointers = new Set<number>();
12
7
 
13
8
  public setListeners(): void {
@@ -69,14 +64,24 @@ export default class PointerEventManager extends EventManager {
69
64
  return;
70
65
  }
71
66
 
72
- if (
73
- event.pointerType === PointerType.MOUSE &&
74
- event.buttons !== MouseButtons.LEFT
75
- ) {
76
- return;
77
- }
78
-
79
67
  const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.MOVE);
68
+ const target = event.target as HTMLElement;
69
+
70
+ // You may be wondering why are we setting pointer capture here, when we
71
+ // already set it in `pointerdown` handler. Well, that's a great question,
72
+ // for which I don't have an answer. Specification (https://www.w3.org/TR/pointerevents2/#dom-element-setpointercapture)
73
+ // says that the requirement for `setPointerCapture` to work is that pointer
74
+ // must be in 'active buttons state`, otherwise it will fail silently, which
75
+ // is lovely. Obviously, when `pointerdown` is fired, one of the buttons
76
+ // (when using mouse) is pressed, but that doesn't mean that `setPointerCapture`
77
+ // will succeed, for some reason. Since it fails silently, we don't actually know
78
+ // if it worked or not (there's `gotpointercapture` event, but the complexity of
79
+ // incorporating it here seems stupid), so we just call it again here, every time
80
+ // pointer moves until it succeeds.
81
+ // God, I do love web development.
82
+ if (!target.hasPointerCapture(event.pointerId)) {
83
+ target.setPointerCapture(event.pointerId);
84
+ }
80
85
 
81
86
  const inBounds: boolean = isPointerInBounds(this.view, {
82
87
  x: adaptedEvent.x,
@@ -97,8 +102,8 @@ export default class PointerEventManager extends EventManager {
97
102
  }
98
103
  } else {
99
104
  if (pointerIndex >= 0) {
100
- adaptedEvent.eventType = EventTypes.OUT;
101
- this.onPointerOut(adaptedEvent);
105
+ adaptedEvent.eventType = EventTypes.LEAVE;
106
+ this.onPointerLeave(adaptedEvent);
102
107
  this.markAsOutOfBounds(adaptedEvent.pointerId);
103
108
  } else {
104
109
  this.onPointerOutOfBounds(adaptedEvent);
@@ -122,6 +127,31 @@ export default class PointerEventManager extends EventManager {
122
127
  this.trackedPointers.clear();
123
128
  });
124
129
 
130
+ // onPointerEnter and onPointerLeave are triggered by a custom logic responsible for
131
+ // handling shouldCancelWhenOutside flag, and are unreliable unless the pointer is down.
132
+ // We therefore use pointerenter and pointerleave events to handle the hover gesture,
133
+ // mapping them to onPointerMoveOver and onPointerMoveOut respectively.
134
+
135
+ this.view.addEventListener('pointerenter', (event: PointerEvent): void => {
136
+ if (event.pointerType === PointerType.TOUCH) {
137
+ return;
138
+ }
139
+
140
+ const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.ENTER);
141
+
142
+ this.onPointerMoveOver(adaptedEvent);
143
+ });
144
+
145
+ this.view.addEventListener('pointerleave', (event: PointerEvent): void => {
146
+ if (event.pointerType === PointerType.TOUCH) {
147
+ return;
148
+ }
149
+
150
+ const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.LEAVE);
151
+
152
+ this.onPointerMoveOut(adaptedEvent);
153
+ });
154
+
125
155
  this.view.addEventListener(
126
156
  'lostpointercapture',
127
157
  (event: PointerEvent): void => {
@@ -8,7 +8,7 @@ import {
8
8
  import EventManager from './EventManager';
9
9
  import { isPointerInBounds } from '../utils';
10
10
 
11
- export default class TouchEventManager extends EventManager {
11
+ export default class TouchEventManager extends EventManager<HTMLElement> {
12
12
  public setListeners(): void {
13
13
  this.view.addEventListener('touchstart', (event: TouchEvent) => {
14
14
  for (let i = 0; i < event.changedTouches.length; ++i) {
@@ -75,8 +75,8 @@ export default class TouchEventManager extends EventManager {
75
75
  }
76
76
  } else {
77
77
  if (pointerIndex >= 0) {
78
- adaptedEvent.eventType = EventTypes.OUT;
79
- this.onPointerOut(adaptedEvent);
78
+ adaptedEvent.eventType = EventTypes.LEAVE;
79
+ this.onPointerLeave(adaptedEvent);
80
80
  this.markAsOutOfBounds(adaptedEvent.pointerId);
81
81
  } else {
82
82
  this.onPointerOutOfBounds(adaptedEvent);