@tamagui/native 2.0.0-rc.8 → 2.0.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 (306) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/dist/cjs/PressBoundary.cjs +92 -0
  3. package/dist/cjs/PressBoundary.native.js +105 -0
  4. package/dist/cjs/PressBoundary.native.js.map +1 -0
  5. package/dist/cjs/burntState.cjs +14 -12
  6. package/dist/cjs/burntState.native.js +18 -16
  7. package/dist/cjs/burntState.native.js.map +1 -1
  8. package/dist/cjs/components.cjs +20 -15
  9. package/dist/cjs/components.native.js +24 -22
  10. package/dist/cjs/components.native.js.map +1 -1
  11. package/dist/cjs/gesture-handler.cjs +36 -0
  12. package/dist/cjs/gesture-handler.native.js +39 -0
  13. package/dist/cjs/gesture-handler.native.js.map +1 -0
  14. package/dist/cjs/gestureState.cjs +201 -23
  15. package/dist/cjs/gestureState.native.js +217 -39
  16. package/dist/cjs/gestureState.native.js.map +1 -1
  17. package/dist/cjs/globalState.cjs +17 -11
  18. package/dist/cjs/globalState.native.js +17 -11
  19. package/dist/cjs/globalState.native.js.map +1 -1
  20. package/dist/cjs/index.cjs +27 -20
  21. package/dist/cjs/index.native.js +27 -20
  22. package/dist/cjs/index.native.js.map +1 -1
  23. package/dist/cjs/keyboardControllerState.cjs +14 -12
  24. package/dist/cjs/keyboardControllerState.native.js +23 -21
  25. package/dist/cjs/keyboardControllerState.native.js.map +1 -1
  26. package/dist/cjs/linearGradientState.cjs +14 -12
  27. package/dist/cjs/linearGradientState.native.js +17 -15
  28. package/dist/cjs/linearGradientState.native.js.map +1 -1
  29. package/dist/cjs/nativeMenuContext.cjs +29 -0
  30. package/dist/cjs/nativeMenuContext.native.js +32 -0
  31. package/dist/cjs/nativeMenuContext.native.js.map +1 -0
  32. package/dist/cjs/portalState.cjs +14 -12
  33. package/dist/cjs/portalState.native.js +17 -15
  34. package/dist/cjs/portalState.native.js.map +1 -1
  35. package/dist/cjs/safeAreaState.cjs +38 -30
  36. package/dist/cjs/safeAreaState.native.js +39 -31
  37. package/dist/cjs/safeAreaState.native.js.map +1 -1
  38. package/dist/cjs/setup-burnt.cjs +9 -8
  39. package/dist/cjs/setup-burnt.native.js +9 -8
  40. package/dist/cjs/setup-burnt.native.js.map +1 -1
  41. package/dist/cjs/setup-expo-linear-gradient.cjs +9 -8
  42. package/dist/cjs/setup-expo-linear-gradient.native.js +9 -8
  43. package/dist/cjs/setup-expo-linear-gradient.native.js.map +1 -1
  44. package/dist/cjs/setup-gesture-handler.cjs +69 -20
  45. package/dist/cjs/setup-gesture-handler.native.js +69 -20
  46. package/dist/cjs/setup-gesture-handler.native.js.map +1 -1
  47. package/dist/cjs/setup-keyboard-controller.native.js +20 -17
  48. package/dist/cjs/setup-safe-area.cjs +3 -1
  49. package/dist/cjs/setup-safe-area.native.js +15 -17
  50. package/dist/cjs/setup-safe-area.native.js.map +1 -1
  51. package/dist/cjs/setup-teleport.cjs +13 -13
  52. package/dist/cjs/setup-teleport.native.js +13 -13
  53. package/dist/cjs/setup-teleport.native.js.map +1 -1
  54. package/dist/cjs/setup-worklets.cjs +11 -8
  55. package/dist/cjs/setup-worklets.native.js +11 -8
  56. package/dist/cjs/setup-worklets.native.js.map +1 -1
  57. package/dist/cjs/setup-zeego.cjs +12 -9
  58. package/dist/cjs/setup-zeego.native.js +12 -9
  59. package/dist/cjs/setup-zeego.native.js.map +1 -1
  60. package/dist/cjs/types.cjs +7 -5
  61. package/dist/cjs/types.native.js +7 -5
  62. package/dist/cjs/types.native.js.map +1 -1
  63. package/dist/cjs/workletsState.cjs +14 -12
  64. package/dist/cjs/workletsState.native.js +20 -18
  65. package/dist/cjs/workletsState.native.js.map +1 -1
  66. package/dist/cjs/zeegoState.cjs +14 -12
  67. package/dist/cjs/zeegoState.native.js +18 -16
  68. package/dist/cjs/zeegoState.native.js.map +1 -1
  69. package/dist/esm/PressBoundary.mjs +56 -0
  70. package/dist/esm/PressBoundary.mjs.map +1 -0
  71. package/dist/esm/PressBoundary.native.js +66 -0
  72. package/dist/esm/PressBoundary.native.js.map +1 -0
  73. package/dist/esm/burntState.mjs +2 -2
  74. package/dist/esm/burntState.native.js +2 -2
  75. package/dist/esm/components.mjs +6 -3
  76. package/dist/esm/components.mjs.map +1 -1
  77. package/dist/esm/components.native.js +10 -10
  78. package/dist/esm/components.native.js.map +1 -1
  79. package/dist/esm/gesture-handler.mjs +6 -0
  80. package/dist/esm/gesture-handler.mjs.map +1 -0
  81. package/dist/esm/gesture-handler.native.js +6 -0
  82. package/dist/esm/gesture-handler.native.js.map +1 -0
  83. package/dist/esm/gestureState.mjs +186 -13
  84. package/dist/esm/gestureState.mjs.map +1 -1
  85. package/dist/esm/gestureState.native.js +198 -25
  86. package/dist/esm/gestureState.native.js.map +1 -1
  87. package/dist/esm/globalState.mjs +5 -1
  88. package/dist/esm/globalState.mjs.map +1 -1
  89. package/dist/esm/globalState.native.js +5 -1
  90. package/dist/esm/globalState.native.js.map +1 -1
  91. package/dist/esm/index.js +12 -28
  92. package/dist/esm/index.js.map +1 -6
  93. package/dist/esm/index.mjs +3 -1
  94. package/dist/esm/index.mjs.map +1 -1
  95. package/dist/esm/index.native.js +3 -1
  96. package/dist/esm/index.native.js.map +1 -1
  97. package/dist/esm/keyboardControllerState.mjs +2 -2
  98. package/dist/esm/keyboardControllerState.native.js +2 -2
  99. package/dist/esm/linearGradientState.mjs +2 -2
  100. package/dist/esm/linearGradientState.native.js +2 -2
  101. package/dist/esm/nativeMenuContext.mjs +4 -0
  102. package/dist/esm/nativeMenuContext.mjs.map +1 -0
  103. package/dist/esm/nativeMenuContext.native.js +4 -0
  104. package/dist/esm/nativeMenuContext.native.js.map +1 -0
  105. package/dist/esm/portalState.mjs +2 -2
  106. package/dist/esm/portalState.native.js +2 -2
  107. package/dist/esm/safeAreaState.mjs +26 -20
  108. package/dist/esm/safeAreaState.mjs.map +1 -1
  109. package/dist/esm/safeAreaState.native.js +26 -20
  110. package/dist/esm/safeAreaState.native.js.map +1 -1
  111. package/dist/esm/setup-burnt.mjs +9 -8
  112. package/dist/esm/setup-burnt.mjs.map +1 -1
  113. package/dist/esm/setup-burnt.native.js +9 -8
  114. package/dist/esm/setup-burnt.native.js.map +1 -1
  115. package/dist/esm/setup-expo-linear-gradient.mjs +9 -8
  116. package/dist/esm/setup-expo-linear-gradient.mjs.map +1 -1
  117. package/dist/esm/setup-expo-linear-gradient.native.js +9 -8
  118. package/dist/esm/setup-expo-linear-gradient.native.js.map +1 -1
  119. package/dist/esm/setup-gesture-handler.mjs +43 -21
  120. package/dist/esm/setup-gesture-handler.mjs.map +1 -1
  121. package/dist/esm/setup-gesture-handler.native.js +43 -21
  122. package/dist/esm/setup-gesture-handler.native.js.map +1 -1
  123. package/dist/esm/setup-keyboard-controller.native.js +20 -17
  124. package/dist/esm/setup-safe-area.mjs +2 -0
  125. package/dist/esm/setup-safe-area.mjs.map +1 -1
  126. package/dist/esm/setup-safe-area.native.js +15 -17
  127. package/dist/esm/setup-safe-area.native.js.map +1 -1
  128. package/dist/esm/setup-teleport.mjs +13 -13
  129. package/dist/esm/setup-teleport.mjs.map +1 -1
  130. package/dist/esm/setup-teleport.native.js +13 -13
  131. package/dist/esm/setup-teleport.native.js.map +1 -1
  132. package/dist/esm/setup-worklets.mjs +11 -8
  133. package/dist/esm/setup-worklets.mjs.map +1 -1
  134. package/dist/esm/setup-worklets.native.js +11 -8
  135. package/dist/esm/setup-worklets.native.js.map +1 -1
  136. package/dist/esm/setup-zeego.mjs +12 -9
  137. package/dist/esm/setup-zeego.mjs.map +1 -1
  138. package/dist/esm/setup-zeego.native.js +12 -9
  139. package/dist/esm/setup-zeego.native.js.map +1 -1
  140. package/dist/esm/workletsState.mjs +2 -2
  141. package/dist/esm/workletsState.native.js +2 -2
  142. package/dist/esm/zeegoState.mjs +2 -2
  143. package/dist/esm/zeegoState.native.js +2 -2
  144. package/gesture-handler/index.cjs +1 -0
  145. package/gesture-handler/index.js +1 -0
  146. package/gesture-handler/index.native.cjs +1 -0
  147. package/gesture-handler/index.native.js +1 -0
  148. package/gesture-handler.cjs +1 -0
  149. package/package.json +57 -123
  150. package/setup-burnt/index.cjs +2 -0
  151. package/setup-burnt/index.js +2 -0
  152. package/setup-burnt/index.native.cjs +2 -0
  153. package/setup-burnt/index.native.js +2 -0
  154. package/setup-burnt.cjs +1 -0
  155. package/setup-expo-linear-gradient/index.cjs +2 -0
  156. package/setup-expo-linear-gradient/index.js +2 -0
  157. package/setup-expo-linear-gradient/index.native.cjs +2 -0
  158. package/setup-expo-linear-gradient/index.native.js +2 -0
  159. package/setup-expo-linear-gradient.cjs +1 -0
  160. package/setup-gesture-handler/index.cjs +2 -0
  161. package/setup-gesture-handler/index.js +2 -0
  162. package/setup-gesture-handler/index.native.cjs +2 -0
  163. package/setup-gesture-handler/index.native.js +2 -0
  164. package/setup-gesture-handler.cjs +1 -0
  165. package/setup-keyboard-controller/index.cjs +2 -0
  166. package/setup-keyboard-controller/index.js +2 -0
  167. package/setup-keyboard-controller/index.native.cjs +2 -0
  168. package/setup-keyboard-controller/index.native.js +2 -0
  169. package/setup-keyboard-controller.cjs +1 -0
  170. package/setup-safe-area/index.cjs +2 -0
  171. package/setup-safe-area/index.js +2 -0
  172. package/setup-safe-area/index.native.cjs +2 -0
  173. package/setup-safe-area/index.native.js +2 -0
  174. package/setup-safe-area.cjs +1 -0
  175. package/setup-teleport/index.cjs +2 -0
  176. package/setup-teleport/index.js +2 -0
  177. package/setup-teleport/index.native.cjs +2 -0
  178. package/setup-teleport/index.native.js +2 -0
  179. package/setup-teleport.cjs +1 -0
  180. package/setup-worklets/index.cjs +2 -0
  181. package/setup-worklets/index.js +2 -0
  182. package/setup-worklets/index.native.cjs +2 -0
  183. package/setup-worklets/index.native.js +2 -0
  184. package/setup-worklets.cjs +1 -0
  185. package/setup-zeego/index.cjs +2 -0
  186. package/setup-zeego/index.js +2 -0
  187. package/setup-zeego/index.native.cjs +2 -0
  188. package/setup-zeego/index.native.js +2 -0
  189. package/setup-zeego.cjs +1 -0
  190. package/src/PressBoundary.tsx +81 -0
  191. package/src/gesture-handler.ts +17 -0
  192. package/src/gestureState.ts +319 -11
  193. package/src/index.ts +13 -1
  194. package/src/nativeMenuContext.ts +4 -0
  195. package/src/setup-gesture-handler.ts +52 -10
  196. package/src/types.ts +4 -0
  197. package/tsconfig.json +12 -0
  198. package/types/PressBoundary.d.ts +14 -0
  199. package/types/PressBoundary.d.ts.map +11 -0
  200. package/types/burntState.d.ts.map +2 -2
  201. package/types/components.d.ts.map +2 -2
  202. package/types/gesture-handler.d.ts +8 -0
  203. package/types/gesture-handler.d.ts.map +11 -0
  204. package/types/gestureState.d.ts +5 -0
  205. package/types/gestureState.d.ts.map +4 -4
  206. package/types/globalState.d.ts.map +2 -2
  207. package/types/index.d.ts +4 -1
  208. package/types/index.d.ts.map +4 -4
  209. package/types/keyboardControllerState.d.ts.map +2 -2
  210. package/types/linearGradientState.d.ts.map +2 -2
  211. package/types/nativeMenuContext.d.ts +4 -0
  212. package/types/nativeMenuContext.d.ts.map +11 -0
  213. package/types/portalState.d.ts.map +2 -2
  214. package/types/safeAreaState.d.ts.map +2 -2
  215. package/types/setup-burnt.d.ts.map +2 -2
  216. package/types/setup-expo-linear-gradient.d.ts.map +2 -2
  217. package/types/setup-gesture-handler.d.ts +8 -1
  218. package/types/setup-gesture-handler.d.ts.map +4 -4
  219. package/types/setup-keyboard-controller.d.ts.map +2 -2
  220. package/types/setup-keyboard-controller.web.d.ts.map +2 -2
  221. package/types/setup-safe-area.d.ts.map +2 -2
  222. package/types/setup-teleport.d.ts.map +2 -2
  223. package/types/setup-worklets.d.ts.map +2 -2
  224. package/types/setup-zeego.d.ts.map +2 -2
  225. package/types/types.d.ts +1 -0
  226. package/types/types.d.ts.map +4 -4
  227. package/types/workletsState.d.ts.map +2 -2
  228. package/types/zeegoState.d.ts.map +2 -2
  229. package/dist/cjs/burntState.js +0 -39
  230. package/dist/cjs/burntState.js.map +0 -6
  231. package/dist/cjs/components.js +0 -41
  232. package/dist/cjs/components.js.map +0 -6
  233. package/dist/cjs/gestureState.js +0 -57
  234. package/dist/cjs/gestureState.js.map +0 -6
  235. package/dist/cjs/globalState.js +0 -34
  236. package/dist/cjs/globalState.js.map +0 -6
  237. package/dist/cjs/index.js +0 -33
  238. package/dist/cjs/index.js.map +0 -6
  239. package/dist/cjs/keyboardControllerState.js +0 -42
  240. package/dist/cjs/keyboardControllerState.js.map +0 -6
  241. package/dist/cjs/linearGradientState.js +0 -38
  242. package/dist/cjs/linearGradientState.js.map +0 -6
  243. package/dist/cjs/portalState.js +0 -38
  244. package/dist/cjs/portalState.js.map +0 -6
  245. package/dist/cjs/safeAreaState.js +0 -48
  246. package/dist/cjs/safeAreaState.js.map +0 -6
  247. package/dist/cjs/setup-burnt.js +0 -18
  248. package/dist/cjs/setup-burnt.js.map +0 -6
  249. package/dist/cjs/setup-expo-linear-gradient.js +0 -17
  250. package/dist/cjs/setup-expo-linear-gradient.js.map +0 -6
  251. package/dist/cjs/setup-gesture-handler.js +0 -24
  252. package/dist/cjs/setup-gesture-handler.js.map +0 -6
  253. package/dist/cjs/setup-keyboard-controller.js +0 -1
  254. package/dist/cjs/setup-keyboard-controller.js.map +0 -6
  255. package/dist/cjs/setup-safe-area.js +0 -2
  256. package/dist/cjs/setup-safe-area.js.map +0 -6
  257. package/dist/cjs/setup-teleport.js +0 -17
  258. package/dist/cjs/setup-teleport.js.map +0 -6
  259. package/dist/cjs/setup-worklets.js +0 -20
  260. package/dist/cjs/setup-worklets.js.map +0 -6
  261. package/dist/cjs/setup-zeego.js +0 -19
  262. package/dist/cjs/setup-zeego.js.map +0 -6
  263. package/dist/cjs/types.js +0 -14
  264. package/dist/cjs/types.js.map +0 -6
  265. package/dist/cjs/workletsState.js +0 -41
  266. package/dist/cjs/workletsState.js.map +0 -6
  267. package/dist/cjs/zeegoState.js +0 -39
  268. package/dist/cjs/zeegoState.js.map +0 -6
  269. package/dist/esm/burntState.js +0 -23
  270. package/dist/esm/burntState.js.map +0 -6
  271. package/dist/esm/components.js +0 -26
  272. package/dist/esm/components.js.map +0 -6
  273. package/dist/esm/gestureState.js +0 -41
  274. package/dist/esm/gestureState.js.map +0 -6
  275. package/dist/esm/globalState.js +0 -18
  276. package/dist/esm/globalState.js.map +0 -6
  277. package/dist/esm/keyboardControllerState.js +0 -26
  278. package/dist/esm/keyboardControllerState.js.map +0 -6
  279. package/dist/esm/linearGradientState.js +0 -22
  280. package/dist/esm/linearGradientState.js.map +0 -6
  281. package/dist/esm/portalState.js +0 -22
  282. package/dist/esm/portalState.js.map +0 -6
  283. package/dist/esm/safeAreaState.js +0 -32
  284. package/dist/esm/safeAreaState.js.map +0 -6
  285. package/dist/esm/setup-burnt.js +0 -18
  286. package/dist/esm/setup-burnt.js.map +0 -6
  287. package/dist/esm/setup-expo-linear-gradient.js +0 -17
  288. package/dist/esm/setup-expo-linear-gradient.js.map +0 -6
  289. package/dist/esm/setup-gesture-handler.js +0 -24
  290. package/dist/esm/setup-gesture-handler.js.map +0 -6
  291. package/dist/esm/setup-keyboard-controller.js +0 -1
  292. package/dist/esm/setup-keyboard-controller.js.map +0 -6
  293. package/dist/esm/setup-safe-area.js +0 -2
  294. package/dist/esm/setup-safe-area.js.map +0 -6
  295. package/dist/esm/setup-teleport.js +0 -17
  296. package/dist/esm/setup-teleport.js.map +0 -6
  297. package/dist/esm/setup-worklets.js +0 -20
  298. package/dist/esm/setup-worklets.js.map +0 -6
  299. package/dist/esm/setup-zeego.js +0 -19
  300. package/dist/esm/setup-zeego.js.map +0 -6
  301. package/dist/esm/types.js +0 -1
  302. package/dist/esm/types.js.map +0 -6
  303. package/dist/esm/workletsState.js +0 -25
  304. package/dist/esm/workletsState.js.map +0 -6
  305. package/dist/esm/zeegoState.js +0 -23
  306. package/dist/esm/zeegoState.js.map +0 -6
@@ -6,8 +6,123 @@ const state = createGlobalState<GestureState>(`gesture`, {
6
6
  Gesture: null,
7
7
  GestureDetector: null,
8
8
  ScrollView: null,
9
+ RootView: null,
9
10
  })
10
11
 
12
+ type GestureEnabledFreezeState = {
13
+ frozen: boolean
14
+ enabled: boolean
15
+ warned: boolean
16
+ }
17
+
18
+ const GESTURE_ENABLED_FREEZE_KEY = '__tamagui_gesture_enabled_freeze__'
19
+
20
+ function getGestureEnabledFreezeState(): GestureEnabledFreezeState {
21
+ const g = globalThis as typeof globalThis & {
22
+ [GESTURE_ENABLED_FREEZE_KEY]?: GestureEnabledFreezeState
23
+ }
24
+
25
+ if (!g[GESTURE_ENABLED_FREEZE_KEY]) {
26
+ g[GESTURE_ENABLED_FREEZE_KEY] = {
27
+ frozen: false,
28
+ enabled: false,
29
+ warned: false,
30
+ }
31
+ }
32
+
33
+ return g[GESTURE_ENABLED_FREEZE_KEY]!
34
+ }
35
+
36
+ function warnGestureEnabledMutationIgnored(source: string) {
37
+ const freezeState = getGestureEnabledFreezeState()
38
+
39
+ if (freezeState.warned || process.env.NODE_ENV === 'production') {
40
+ return
41
+ }
42
+
43
+ freezeState.warned = true
44
+
45
+ console.warn(
46
+ `[Tamagui] Ignored ${source} because gesture handler press events were already ` +
47
+ `${freezeState.enabled ? 'enabled' : 'disabled'} when TamaguiProvider mounted. ` +
48
+ `Configure gesture handler mode before the first render.`
49
+ )
50
+ }
51
+
52
+ export function canChangeGestureHandlerEnabled(
53
+ nextEnabled: boolean,
54
+ source: string
55
+ ): boolean {
56
+ const freezeState = getGestureEnabledFreezeState()
57
+
58
+ if (!freezeState.frozen || freezeState.enabled === nextEnabled) {
59
+ return true
60
+ }
61
+
62
+ warnGestureEnabledMutationIgnored(source)
63
+ return false
64
+ }
65
+
66
+ let pressGestureDebugId = 0
67
+ let externalPressDebugId = 0
68
+
69
+ // distance in dp the finger may travel before a press is treated as a
70
+ // scroll/drag and cancelled. tracked in absolute (screen) coordinates by the
71
+ // Tap's onTouchesMove (see createPressGesture) so a view translating under a
72
+ // stationary finger - a sheet sliding on keyboard open/close, a sheet open
73
+ // animation - does not cancel the press; only genuine finger travel does.
74
+ // this also makes scroll-cancels-press work for any scroll container (a plain
75
+ // RN ScrollView/FlatList or an RNGH one), since the press cancels itself
76
+ // rather than relying on a parent RNGH gesture to steal it.
77
+ const PRESS_MOVE_CANCEL_DISTANCE = 12
78
+ const PRESS_MOVE_CANCEL_DISTANCE_SQ =
79
+ PRESS_MOVE_CANCEL_DISTANCE * PRESS_MOVE_CANCEL_DISTANCE
80
+
81
+ // minimal shapes of the RNGH gesture events createPressGesture reads. RNGH is
82
+ // injected at runtime (GestureState.Gesture is untyped), so this module keeps
83
+ // no type dependency on react-native-gesture-handler - these name just the
84
+ // fields the press gesture touches.
85
+ type GesturePoint = {
86
+ absoluteX: number
87
+ absoluteY: number
88
+ }
89
+ type GestureBeginEvent = Partial<GesturePoint>
90
+ type GestureTouchEvent = {
91
+ changedTouches?: GesturePoint[]
92
+ allTouches?: GesturePoint[]
93
+ }
94
+
95
+ type PressOwnerSource = 'internal' | 'external' | null
96
+
97
+ function getEventPointerId(e: any): number | null {
98
+ const pointerId =
99
+ e?.pointerId ??
100
+ e?.pointer?.id ??
101
+ e?.event?.pointerId ??
102
+ e?.event?.pointer?.id ??
103
+ e?.nativeEvent?.pointerId ??
104
+ e?.nativeEvent?.id ??
105
+ e?.event?.nativeEvent?.pointerId ??
106
+ e?.event?.nativeEvent?.id ??
107
+ null
108
+
109
+ return pointerId == null || Number.isNaN(pointerId) ? null : Number(pointerId)
110
+ }
111
+
112
+ /**
113
+ * Global press coordination - ensures only innermost pressable fires press events,
114
+ * matching RN Pressable/responder system semantics where deepest component wins.
115
+ * Uses a grace period to allow child gestures to steal ownership from parent,
116
+ * since RNGH fires parent gestures before child gestures.
117
+ */
118
+ const pressState = {
119
+ owner: null as object | null,
120
+ ownerId: null as number | null,
121
+ ownerSource: null as PressOwnerSource,
122
+ ownerPointerId: null as number | null,
123
+ timestamp: 0,
124
+ }
125
+
11
126
  export interface Insets {
12
127
  top?: number
13
128
  left?: number
@@ -16,6 +131,7 @@ export interface Insets {
16
131
  }
17
132
 
18
133
  export type PressGestureConfig = {
134
+ debugName?: string | null
19
135
  onPressIn?: (e: any) => void
20
136
  onPressOut?: (e: any) => void
21
137
  onPress?: (e: any) => void
@@ -32,6 +148,49 @@ export interface GestureHandlerAccessor {
32
148
  createPressGesture(config: PressGestureConfig): any
33
149
  }
34
150
 
151
+ export type ExternalPressOwnershipToken = object
152
+
153
+ function resetPressOwner() {
154
+ pressState.owner = null
155
+ pressState.ownerId = null
156
+ pressState.ownerSource = null
157
+ pressState.ownerPointerId = null
158
+ pressState.timestamp = 0
159
+ }
160
+
161
+ function resetStaleOwner(now: number, debugName?: string | null) {
162
+ if (now - pressState.timestamp > 2000) {
163
+ resetPressOwner()
164
+ }
165
+ }
166
+
167
+ export function claimExternalPressOwnership(
168
+ debugName?: string | null
169
+ ): ExternalPressOwnershipToken {
170
+ const now = Date.now()
171
+ resetStaleOwner(now, debugName)
172
+
173
+ const token = {}
174
+ const ownerId = ++externalPressDebugId
175
+
176
+ pressState.owner = token
177
+ pressState.ownerId = ownerId
178
+ pressState.ownerSource = 'external'
179
+ pressState.timestamp = now
180
+
181
+ return token
182
+ }
183
+
184
+ export function releaseExternalPressOwnership(
185
+ token: ExternalPressOwnershipToken | null | undefined,
186
+ debugName?: string | null
187
+ ): void {
188
+ if (!token || pressState.owner !== token) {
189
+ return
190
+ }
191
+ resetPressOwner()
192
+ }
193
+
35
194
  export function getGestureHandler(): GestureHandlerAccessor {
36
195
  return {
37
196
  get isEnabled(): boolean {
@@ -41,10 +200,21 @@ export function getGestureHandler(): GestureHandlerAccessor {
41
200
  return state.get()
42
201
  },
43
202
  set(updates: Partial<GestureState>): void {
203
+ if (
204
+ updates.enabled !== undefined &&
205
+ !canChangeGestureHandlerEnabled(updates.enabled, 'getGestureHandler().set()')
206
+ ) {
207
+ return
208
+ }
209
+
44
210
  Object.assign(state.get(), updates)
45
211
  },
46
212
 
47
213
  disable(): void {
214
+ if (!canChangeGestureHandlerEnabled(false, 'getGestureHandler().disable()')) {
215
+ return
216
+ }
217
+
48
218
  state.get().enabled = false
49
219
  },
50
220
 
@@ -54,19 +224,153 @@ export function getGestureHandler(): GestureHandlerAccessor {
54
224
 
55
225
  const longPressDuration = config.delayLongPress ?? 500
56
226
 
57
- // Tap gesture for regular presses
58
- // Use long maxDuration to not cancel during long presses
227
+ // unique token for this gesture instance - used to track ownership
228
+ const myToken = {}
229
+ const myDebugId = ++pressGestureDebugId
230
+ // mutable gesture state kept on an object so handler bodies that get
231
+ // workletized by react-native-worklets (>=0.7.4) see live values.
232
+ // primitive `let`s get frozen into the worklet's serialized __closure
233
+ // at factory time, so reassignments from workletized handlers never
234
+ // propagate out. object property mutation goes through the captured
235
+ // reference and is always observed.
236
+ const flags = {
237
+ didLongPress: false,
238
+ didPressIn: false,
239
+ pressInTimer: null as ReturnType<typeof setTimeout> | null,
240
+ // absolute (screen) coords of the press start, and whether the finger
241
+ // has since travelled far enough to be treated as a scroll/drag.
242
+ moveStartX: null as number | null,
243
+ moveStartY: 0,
244
+ cancelledByMove: false,
245
+ }
246
+
247
+ // Grace period for child gestures to steal ownership from parent.
248
+ // RNGH fires parent before child, but we want innermost to win.
249
+ // Claims typically span a few ms, 24ms gives enough room to observe
250
+ // ordering while debugging slower frames.
251
+ const GRACE_PERIOD_MS = process.env.TAMAGUI_RNGH_PRESS_DELAY
252
+ ? +process.env.TAMAGUI_RNGH_PRESS_DELAY
253
+ : 24
254
+
255
+ const tryClaimOwnership = (e: any) => {
256
+ const now = Date.now()
257
+ resetStaleOwner(now, config.debugName)
258
+
259
+ const currentPointerId = getEventPointerId(e)
260
+ const isSameTouchPointer =
261
+ currentPointerId == null ||
262
+ pressState.ownerPointerId == null ||
263
+ pressState.ownerPointerId === currentPointerId
264
+
265
+ if (
266
+ pressState.owner === null ||
267
+ (pressState.ownerSource === 'internal' && isSameTouchPointer)
268
+ ) {
269
+ pressState.owner = myToken
270
+ pressState.ownerId = myDebugId
271
+ pressState.ownerSource = 'internal'
272
+ pressState.ownerPointerId = currentPointerId
273
+ pressState.timestamp = now
274
+ }
275
+ return pressState.owner === myToken
276
+ }
277
+
278
+ const isOwner = () => pressState.owner === myToken
279
+
280
+ const releaseOwnership = () => {
281
+ if (flags.pressInTimer) {
282
+ clearTimeout(flags.pressInTimer)
283
+ flags.pressInTimer = null
284
+ }
285
+ if (pressState.owner === myToken) {
286
+ resetPressOwner()
287
+ }
288
+ }
289
+
290
+ const firePressIn = (e: any) => {
291
+ if (!flags.didPressIn && isOwner()) {
292
+ flags.didPressIn = true
293
+ config.onPressIn?.(e)
294
+ }
295
+ }
296
+
297
+ const schedulePressIn = (e: any) => {
298
+ if (flags.pressInTimer) {
299
+ clearTimeout(flags.pressInTimer)
300
+ }
301
+ flags.pressInTimer = setTimeout(() => {
302
+ flags.pressInTimer = null
303
+ if (isOwner()) {
304
+ firePressIn(e)
305
+ }
306
+ }, GRACE_PERIOD_MS + 1)
307
+ }
308
+
309
+ // Tap gesture for regular presses.
310
+ //
311
+ // maxDuration is long so long-presses aren't cut off. We deliberately do
312
+ // not use RNGH's .maxDistance(): it measures finger travel in the gesture
313
+ // view's own coordinate space, so a view that translates under a
314
+ // stationary finger (a sheet sliding on keyboard open/close, a sheet open
315
+ // animation) reads as finger movement and silently cancels the press -
316
+ // onPress never fires. Instead onTouchesMove tracks the finger in
317
+ // absolute (screen) coordinates and cancels only on genuine finger
318
+ // travel. That also makes scroll-cancels-press work for any scroll
319
+ // container, since the press cancels itself instead of depending on a
320
+ // parent RNGH gesture to steal the touch.
59
321
  const tap = Gesture.Tap()
60
322
  .runOnJS(true)
61
323
  .maxDuration(10000) // allow very long presses
62
- .onBegin((e: any) => {
63
- config.onPressIn?.(e)
324
+ .onBegin((e: GestureBeginEvent) => {
325
+ flags.didLongPress = false
326
+ flags.didPressIn = false
327
+ flags.cancelledByMove = false
328
+ flags.moveStartX = typeof e.absoluteX === 'number' ? e.absoluteX : null
329
+ flags.moveStartY = typeof e.absoluteY === 'number' ? e.absoluteY : 0
330
+ tryClaimOwnership(e)
331
+ // Defer onPressIn until after the grace window so child pressables
332
+ // can steal ownership, but flush it on tap end for very fast taps.
333
+ schedulePressIn(e)
334
+ })
335
+ .onTouchesMove((e: GestureTouchEvent) => {
336
+ if (flags.cancelledByMove || flags.moveStartX === null) return
337
+ const touch = e.changedTouches?.[0] ?? e.allTouches?.[0]
338
+ if (!touch) return
339
+ const dx = touch.absoluteX - flags.moveStartX
340
+ const dy = touch.absoluteY - flags.moveStartY
341
+ if (dx * dx + dy * dy <= PRESS_MOVE_CANCEL_DISTANCE_SQ) return
342
+ // finger has travelled far enough to be a scroll/drag, not a tap.
343
+ // release the pressStyle now (mid-scroll, so it doesn't stay stuck)
344
+ // and make onEnd skip onPress on finger lift.
345
+ flags.cancelledByMove = true
346
+ if (flags.pressInTimer) {
347
+ clearTimeout(flags.pressInTimer)
348
+ flags.pressInTimer = null
349
+ }
350
+ if (flags.didPressIn) {
351
+ flags.didPressIn = false
352
+ config.onPressOut?.(e)
353
+ }
354
+ releaseOwnership()
64
355
  })
65
- .onEnd((e: any) => {
66
- config.onPress?.(e)
356
+ .onEnd((e: unknown) => {
357
+ if (isOwner() && !flags.didLongPress && !flags.cancelledByMove) {
358
+ firePressIn(e)
359
+ config.onPress?.(e)
360
+ }
67
361
  })
68
- .onFinalize((e: any) => {
69
- config.onPressOut?.(e)
362
+ .onFinalize((e: unknown) => {
363
+ if (isOwner()) {
364
+ config.onPressOut?.(e)
365
+ releaseOwnership()
366
+ } else if (flags.didPressIn) {
367
+ // we already fired onPressIn but lost ownership before finalize
368
+ // (e.g. finger dragged onto a sibling pressable and that one
369
+ // claimed ownership). fire onPressOut so callers can clear their
370
+ // press state - otherwise pressStyle stays stuck on this view.
371
+ flags.didPressIn = false
372
+ config.onPressOut?.(e)
373
+ }
70
374
  })
71
375
 
72
376
  if (config.hitSlop) tap.hitSlop(config.hitSlop)
@@ -78,9 +382,13 @@ export function getGestureHandler(): GestureHandlerAccessor {
78
382
  const longPress = Gesture.LongPress()
79
383
  .runOnJS(true)
80
384
  .minDuration(longPressDuration)
81
- .onBegin((e: any) => config.onPressIn?.(e))
82
- .onStart((e: any) => config.onLongPress?.(e))
83
- .onFinalize((e: any) => config.onPressOut?.(e))
385
+ .onStart((e: any) => {
386
+ flags.didLongPress = true
387
+ if (isOwner()) {
388
+ firePressIn(e)
389
+ config.onLongPress?.(e)
390
+ }
391
+ })
84
392
 
85
393
  if (config.hitSlop) longPress.hitSlop(config.hitSlop)
86
394
 
package/src/index.ts CHANGED
@@ -42,7 +42,18 @@ export type { PortalAccessor } from './portalState'
42
42
 
43
43
  // gesture handler
44
44
  export { getGestureHandler } from './gestureState'
45
- export type { GestureHandlerAccessor, PressGestureConfig } from './gestureState'
45
+ export {
46
+ claimExternalPressOwnership as unstable_claimExternalPressOwnership,
47
+ releaseExternalPressOwnership as unstable_releaseExternalPressOwnership,
48
+ } from './gestureState'
49
+ export type {
50
+ ExternalPressOwnershipToken,
51
+ GestureHandlerAccessor,
52
+ PressGestureConfig,
53
+ } from './gestureState'
54
+ // NOTE: setupGestureHandler is exported from setup-gesture-handler.ts entry point,
55
+ // not here, to avoid bundler pulling in RNGH require during tree-shaking
56
+ export type { GestureHandlerConfig } from './setup-gesture-handler'
46
57
 
47
58
  // worklets
48
59
  export { getWorklets } from './workletsState'
@@ -67,6 +78,7 @@ export type { KeyboardControllerState } from './keyboardControllerState'
67
78
  // zeego (native menus)
68
79
  export { getZeego } from './zeegoState'
69
80
  export type { ZeegoAccessor } from './zeegoState'
81
+ export { NativeMenuContext } from './nativeMenuContext'
70
82
 
71
83
  // burnt (native toasts)
72
84
  export { getBurnt } from './burntState'
@@ -0,0 +1,4 @@
1
+ import type React from 'react'
2
+ import { createContext } from 'react'
3
+
4
+ export const NativeMenuContext: React.Context<boolean> = createContext(false)
@@ -5,41 +5,83 @@
5
5
  *
6
6
  * @example
7
7
  * ```tsx
8
+ * // auto-setup with all features enabled
8
9
  * import '@tamagui/native/setup-gesture-handler'
10
+ *
11
+ * // or configure selectively
12
+ * import { setupGestureHandler } from '@tamagui/native/setup-gesture-handler'
13
+ * setupGestureHandler({ pressEvents: true, sheet: false })
9
14
  * ```
10
15
  *
11
16
  * This automatically detects and configures react-native-gesture-handler
12
17
  * for use with Sheet and other gesture-aware components.
13
18
  */
14
19
 
15
- import { getGestureHandler } from './gestureState'
20
+ import { canChangeGestureHandlerEnabled, getGestureHandler } from './gestureState'
21
+
22
+ export interface GestureHandlerConfig {
23
+ /** use RNGH for press events on Tamagui components (default: true) */
24
+ pressEvents?: boolean
25
+ /** use RNGH for Sheet drag gestures (default: true) */
26
+ sheet?: boolean
27
+ }
28
+
29
+ let currentConfig: GestureHandlerConfig = {
30
+ pressEvents: true,
31
+ sheet: true,
32
+ }
33
+
34
+ export function getGestureHandlerConfig(): GestureHandlerConfig {
35
+ return currentConfig
36
+ }
16
37
 
17
- function setup() {
38
+ export function setupGestureHandler(config?: GestureHandlerConfig): void {
18
39
  const g = globalThis as any
19
- if (g.__tamagui_native_gesture_setup_complete) {
20
- return
40
+
41
+ // override config if provided
42
+ if (config) {
43
+ currentConfig = config
44
+
45
+ if (
46
+ config.pressEvents !== undefined &&
47
+ !canChangeGestureHandlerEnabled(
48
+ config.pressEvents !== false,
49
+ 'setupGestureHandler()'
50
+ )
51
+ ) {
52
+ currentConfig = {
53
+ ...currentConfig,
54
+ pressEvents: getGestureHandler().isEnabled,
55
+ }
56
+ }
21
57
  }
58
+
59
+ // allow re-running setup to change config
60
+ const isFirstRun = !g.__tamagui_native_gesture_setup_complete
22
61
  g.__tamagui_native_gesture_setup_complete = true
23
62
 
24
63
  try {
25
64
  // dynamically require RNGH - it should already be imported by the app
26
65
  const rngh = require('react-native-gesture-handler')
27
- const { Gesture, GestureDetector, ScrollView } = rngh
66
+ const { Gesture, GestureDetector, ScrollView, GestureHandlerRootView } = rngh
28
67
 
29
68
  if (Gesture && GestureDetector) {
69
+ // only enable if pressEvents is true
30
70
  getGestureHandler().set({
31
- enabled: true,
71
+ enabled: currentConfig.pressEvents !== false,
32
72
  Gesture,
33
73
  GestureDetector,
34
74
  ScrollView: ScrollView || null,
75
+ RootView: GestureHandlerRootView || null,
35
76
  })
36
77
 
37
- // also set on the legacy key for backward compat with @tamagui/sheet
78
+ // sheet state - only enable if sheet is true
38
79
  g.__tamagui_sheet_gesture_state__ = {
39
- enabled: true,
80
+ enabled: currentConfig.sheet !== false,
40
81
  Gesture,
41
82
  GestureDetector,
42
83
  ScrollView: ScrollView || null,
84
+ RootView: GestureHandlerRootView || null,
43
85
  }
44
86
  }
45
87
  } catch {
@@ -47,5 +89,5 @@ function setup() {
47
89
  }
48
90
  }
49
91
 
50
- // run setup immediately on import
51
- setup()
92
+ // run setup immediately on import (can be overridden by calling setupGestureHandler)
93
+ setupGestureHandler()
package/src/types.ts CHANGED
@@ -10,6 +10,10 @@ export interface GestureState {
10
10
  Gesture: any
11
11
  GestureDetector: any
12
12
  ScrollView: any
13
+ // rngh's GestureHandlerRootView. native portals can render outside the app's
14
+ // root gesture view, so components that portal rngh gestures need to
15
+ // re-establish one around their content.
16
+ RootView: any
13
17
  }
14
18
 
15
19
  export interface WorkletsState {
package/tsconfig.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "composite": true,
5
+ "isolatedDeclarations": true
6
+ },
7
+ "exclude": [
8
+ "types",
9
+ "dist",
10
+ "**/__tests__"
11
+ ]
12
+ }
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { View, type ViewProps } from "react-native";
3
+ export interface PressBoundaryProps extends ViewProps {
4
+ enabled?: boolean;
5
+ /**
6
+ * Alias for enabling the boundary. The behavior is limited to Tamagui's
7
+ * shared press ownership and does not patch arbitrary RN bubbling.
8
+ */
9
+ stopPropagation?: boolean;
10
+ debugName?: string | null;
11
+ }
12
+ export declare const PressBoundary: React.ForwardRefExoticComponent<PressBoundaryProps & React.RefAttributes<View>>;
13
+
14
+ //# sourceMappingURL=PressBoundary.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,WAAW,iBAAiB;AAOrC,iBAAiB,2BAA2B,UAAU;CACpD;;;;;CAKA;CACA;;AAiBF,OAAO,cAAM,eAAe,MAAM,0BAChC,qBAAqB,MAAM,cAAc",
3
+ "names": [],
4
+ "sources": [
5
+ "src/PressBoundary.tsx"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "import React from 'react'\nimport { View, type ViewProps } from 'react-native'\nimport {\n claimExternalPressOwnership,\n releaseExternalPressOwnership,\n type ExternalPressOwnershipToken,\n} from './gestureState'\n\nexport interface PressBoundaryProps extends ViewProps {\n enabled?: boolean\n /**\n * Alias for enabling the boundary. The behavior is limited to Tamagui's\n * shared press ownership and does not patch arbitrary RN bubbling.\n */\n stopPropagation?: boolean\n debugName?: string | null\n}\n\nfunction composeFirst<T extends (...args: any[]) => void>(ours: T, theirs?: T) {\n return (...args: Parameters<T>) => {\n ours(...args)\n theirs?.(...args)\n }\n}\n\nfunction composeLast<T extends (...args: any[]) => void>(theirs: T | undefined, ours: T) {\n return (...args: Parameters<T>) => {\n theirs?.(...args)\n ours(...args)\n }\n}\n\nexport const PressBoundary: React.ForwardRefExoticComponent<\n PressBoundaryProps & React.RefAttributes<View>\n> = React.forwardRef<View, PressBoundaryProps>(function PressBoundary(\n {\n enabled,\n stopPropagation,\n debugName,\n onTouchStart,\n onTouchEnd,\n onTouchCancel,\n onResponderGrant,\n onResponderRelease,\n onResponderTerminate,\n ...props\n },\n forwardedRef\n) {\n const tokenRef = React.useRef<ExternalPressOwnershipToken | null>(null)\n const isEnabled = enabled ?? stopPropagation ?? true\n\n const claim = React.useCallback((): void => {\n if (!isEnabled) return\n if (tokenRef.current) {\n releaseExternalPressOwnership(tokenRef.current, debugName)\n }\n tokenRef.current = claimExternalPressOwnership(debugName)\n }, [debugName, isEnabled])\n\n const release = React.useCallback((): void => {\n if (!tokenRef.current) return\n releaseExternalPressOwnership(tokenRef.current, debugName)\n tokenRef.current = null\n }, [debugName])\n\n React.useEffect(() => release, [release])\n\n return (\n <View\n ref={forwardedRef}\n {...props}\n onTouchStart={composeFirst(claim, onTouchStart)}\n onTouchEnd={composeLast(onTouchEnd, release)}\n onTouchCancel={composeLast(onTouchCancel, release)}\n onResponderGrant={composeFirst(claim, onResponderGrant)}\n onResponderRelease={composeLast(onResponderRelease, release)}\n onResponderTerminate={composeLast(onResponderTerminate, release)}\n />\n )\n})\n"
10
+ ]
11
+ }
@@ -4,8 +4,8 @@
4
4
  "sources": [
5
5
  "src/burntState.ts"
6
6
  ],
7
+ "version": 3,
7
8
  "sourcesContent": [
8
9
  "import { createGlobalState } from './globalState'\nimport type { BurntState } from './types'\n\nconst state = createGlobalState<BurntState>(`burnt`, {\n enabled: false,\n toast: null,\n dismissAllAlerts: null,\n})\n\nexport interface BurntAccessor {\n readonly isEnabled: boolean\n readonly state: BurntState\n set(newState: BurntState): void\n}\n\nexport function getBurnt(): BurntAccessor {\n return {\n get isEnabled(): boolean {\n return state.get().enabled\n },\n get state(): BurntState {\n return state.get()\n },\n set(newState: BurntState): void {\n state.set(newState)\n },\n }\n}\n"
9
- ],
10
- "version": 3
10
+ ]
11
11
  }
@@ -4,8 +4,8 @@
4
4
  "sources": [
5
5
  "src/components.tsx"
6
6
  ],
7
+ "version": 3,
7
8
  "sourcesContent": [
8
9
  "import type { ReactNode } from 'react'\nimport { getPortal } from './portalState'\nimport type {\n NativePortalProps,\n NativePortalHostProps,\n NativePortalProviderProps,\n} from './types'\n\nexport type { NativePortalProps, NativePortalHostProps, NativePortalProviderProps }\n\n/**\n * Renders children into a teleport Portal when available.\n * Returns null when teleport is not set up (allows fallback handling by caller).\n */\nexport function NativePortal({\n hostName = 'root',\n children,\n}: NativePortalProps): ReactNode {\n const state = getPortal().state\n if (state.type !== 'teleport') return null\n\n const { Portal } = (globalThis as any).__tamagui_teleport\n return <Portal hostName={hostName}>{children}</Portal>\n}\n\n/**\n * Renders a teleport PortalHost when available.\n * Returns null when teleport is not set up.\n */\nexport function NativePortalHost({ name }: NativePortalHostProps): ReactNode {\n const state = getPortal().state\n if (state.type !== 'teleport') return null\n\n const { PortalHost } = (globalThis as any).__tamagui_teleport\n return <PortalHost name={name} />\n}\n\n/**\n * Wraps children with teleport PortalProvider when available.\n * Returns children as-is when teleport is not set up.\n */\nexport function NativePortalProvider({ children }: NativePortalProviderProps): ReactNode {\n const state = getPortal().state\n if (state.type !== 'teleport') return <>{children}</>\n\n const { PortalProvider } = (globalThis as any).__tamagui_teleport\n return <PortalProvider>{children}</PortalProvider>\n}\n"
9
- ],
10
- "version": 3
10
+ ]
11
11
  }
@@ -0,0 +1,8 @@
1
+ export { getGestureHandler } from "./gestureState";
2
+ export type { ExternalPressOwnershipToken, GestureHandlerAccessor, PressGestureConfig } from "./gestureState";
3
+ export { claimExternalPressOwnership as unstable_claimExternalPressOwnership, releaseExternalPressOwnership as unstable_releaseExternalPressOwnership } from "./gestureState";
4
+ export { PressBoundary } from "./PressBoundary";
5
+ export type { PressBoundaryProps } from "./PressBoundary";
6
+ export { getGestureHandlerConfig, setupGestureHandler, type GestureHandlerConfig } from "./setup-gesture-handler";
7
+
8
+ //# sourceMappingURL=gesture-handler.d.ts.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "mappings": "AAAA,SAAS,yBAAyB;AAClC,cACE,6BACA,wBACA,0BACK;AACP,SACE,+BAA+B,sCAC/B,iCAAiC,8CAC5B;AACP,SAAS,qBAAqB;AAC9B,cAAc,0BAA0B;AACxC,SACE,yBACA,0BACK,4BACA",
3
+ "names": [],
4
+ "sources": [
5
+ "src/gesture-handler.ts"
6
+ ],
7
+ "version": 3,
8
+ "sourcesContent": [
9
+ "export { getGestureHandler } from './gestureState'\nexport type {\n ExternalPressOwnershipToken,\n GestureHandlerAccessor,\n PressGestureConfig,\n} from './gestureState'\nexport {\n claimExternalPressOwnership as unstable_claimExternalPressOwnership,\n releaseExternalPressOwnership as unstable_releaseExternalPressOwnership,\n} from './gestureState'\nexport { PressBoundary } from './PressBoundary'\nexport type { PressBoundaryProps } from './PressBoundary'\nexport {\n getGestureHandlerConfig,\n setupGestureHandler,\n type GestureHandlerConfig,\n} from './setup-gesture-handler'\n"
10
+ ]
11
+ }
@@ -1,4 +1,5 @@
1
1
  import type { GestureState } from "./types";
2
+ export declare function canChangeGestureHandlerEnabled(nextEnabled: boolean, source: string): boolean;
2
3
  export interface Insets {
3
4
  top?: number;
4
5
  left?: number;
@@ -6,6 +7,7 @@ export interface Insets {
6
7
  right?: number;
7
8
  }
8
9
  export type PressGestureConfig = {
10
+ debugName?: string | null;
9
11
  onPressIn?: (e: any) => void;
10
12
  onPressOut?: (e: any) => void;
11
13
  onPress?: (e: any) => void;
@@ -20,6 +22,9 @@ export interface GestureHandlerAccessor {
20
22
  disable(): void;
21
23
  createPressGesture(config: PressGestureConfig): any;
22
24
  }
25
+ export type ExternalPressOwnershipToken = object;
26
+ export declare function claimExternalPressOwnership(debugName?: string | null): ExternalPressOwnershipToken;
27
+ export declare function releaseExternalPressOwnership(token: ExternalPressOwnershipToken | null | undefined, debugName?: string | null): void;
23
28
  export declare function getGestureHandler(): GestureHandlerAccessor;
24
29
 
25
30
  //# sourceMappingURL=gestureState.d.ts.map