@tamagui/native 2.0.0-rc.4 → 2.0.0-rc.40

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 (354) 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 +46 -0
  6. package/dist/cjs/burntState.native.js +49 -0
  7. package/dist/cjs/burntState.native.js.map +1 -0
  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 +124 -36
  15. package/dist/cjs/gestureState.native.js +130 -46
  16. package/dist/cjs/gestureState.native.js.map +1 -1
  17. package/dist/cjs/globalState.cjs +45 -0
  18. package/dist/cjs/globalState.native.js +48 -0
  19. package/dist/cjs/globalState.native.js.map +1 -0
  20. package/dist/cjs/index.cjs +28 -19
  21. package/dist/cjs/index.native.js +28 -19
  22. package/dist/cjs/index.native.js.map +1 -1
  23. package/dist/cjs/keyboardControllerState.cjs +26 -28
  24. package/dist/cjs/keyboardControllerState.native.js +26 -28
  25. package/dist/cjs/keyboardControllerState.native.js.map +1 -1
  26. package/dist/cjs/linearGradientState.cjs +19 -16
  27. package/dist/cjs/linearGradientState.native.js +19 -16
  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 +19 -16
  33. package/dist/cjs/portalState.native.js +19 -16
  34. package/dist/cjs/portalState.native.js.map +1 -1
  35. package/dist/cjs/safeAreaState.cjs +43 -38
  36. package/dist/cjs/safeAreaState.native.js +43 -38
  37. package/dist/cjs/safeAreaState.native.js.map +1 -1
  38. package/dist/cjs/setup-burnt.cjs +17 -0
  39. package/dist/cjs/setup-burnt.native.js +20 -0
  40. package/dist/cjs/setup-burnt.native.js.map +1 -0
  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 +58 -18
  45. package/dist/cjs/setup-gesture-handler.native.js +58 -18
  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 +13 -8
  58. package/dist/cjs/setup-zeego.native.js +13 -8
  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 +23 -25
  64. package/dist/cjs/workletsState.native.js +23 -25
  65. package/dist/cjs/workletsState.native.js.map +1 -1
  66. package/dist/cjs/zeegoState.cjs +19 -16
  67. package/dist/cjs/zeegoState.native.js +19 -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 +21 -0
  74. package/dist/esm/burntState.mjs.map +1 -0
  75. package/dist/esm/burntState.native.js +21 -0
  76. package/dist/esm/burntState.native.js.map +1 -0
  77. package/dist/esm/components.mjs +6 -3
  78. package/dist/esm/components.mjs.map +1 -1
  79. package/dist/esm/components.native.js +10 -10
  80. package/dist/esm/components.native.js.map +1 -1
  81. package/dist/esm/gesture-handler.mjs +6 -0
  82. package/dist/esm/gesture-handler.mjs.map +1 -0
  83. package/dist/esm/gesture-handler.native.js +6 -0
  84. package/dist/esm/gesture-handler.native.js.map +1 -0
  85. package/dist/esm/gestureState.mjs +110 -26
  86. package/dist/esm/gestureState.mjs.map +1 -1
  87. package/dist/esm/gestureState.native.js +116 -36
  88. package/dist/esm/gestureState.native.js.map +1 -1
  89. package/dist/esm/globalState.mjs +20 -0
  90. package/dist/esm/globalState.mjs.map +1 -0
  91. package/dist/esm/globalState.native.js +20 -0
  92. package/dist/esm/globalState.native.js.map +1 -0
  93. package/dist/esm/index.js +12 -26
  94. package/dist/esm/index.js.map +1 -6
  95. package/dist/esm/index.mjs +4 -1
  96. package/dist/esm/index.mjs.map +1 -1
  97. package/dist/esm/index.native.js +4 -1
  98. package/dist/esm/index.native.js.map +1 -1
  99. package/dist/esm/keyboardControllerState.mjs +14 -18
  100. package/dist/esm/keyboardControllerState.mjs.map +1 -1
  101. package/dist/esm/keyboardControllerState.native.js +14 -18
  102. package/dist/esm/keyboardControllerState.native.js.map +1 -1
  103. package/dist/esm/linearGradientState.mjs +7 -6
  104. package/dist/esm/linearGradientState.mjs.map +1 -1
  105. package/dist/esm/linearGradientState.native.js +7 -6
  106. package/dist/esm/linearGradientState.native.js.map +1 -1
  107. package/dist/esm/nativeMenuContext.mjs +4 -0
  108. package/dist/esm/nativeMenuContext.mjs.map +1 -0
  109. package/dist/esm/nativeMenuContext.native.js +4 -0
  110. package/dist/esm/nativeMenuContext.native.js.map +1 -0
  111. package/dist/esm/portalState.mjs +7 -6
  112. package/dist/esm/portalState.mjs.map +1 -1
  113. package/dist/esm/portalState.native.js +7 -6
  114. package/dist/esm/portalState.native.js.map +1 -1
  115. package/dist/esm/safeAreaState.mjs +31 -28
  116. package/dist/esm/safeAreaState.mjs.map +1 -1
  117. package/dist/esm/safeAreaState.native.js +31 -28
  118. package/dist/esm/safeAreaState.native.js.map +1 -1
  119. package/dist/esm/setup-burnt.mjs +18 -0
  120. package/dist/esm/setup-burnt.mjs.map +1 -0
  121. package/dist/esm/setup-burnt.native.js +18 -0
  122. package/dist/esm/setup-burnt.native.js.map +1 -0
  123. package/dist/esm/setup-expo-linear-gradient.mjs +9 -8
  124. package/dist/esm/setup-expo-linear-gradient.mjs.map +1 -1
  125. package/dist/esm/setup-expo-linear-gradient.native.js +9 -8
  126. package/dist/esm/setup-expo-linear-gradient.native.js.map +1 -1
  127. package/dist/esm/setup-gesture-handler.mjs +31 -18
  128. package/dist/esm/setup-gesture-handler.mjs.map +1 -1
  129. package/dist/esm/setup-gesture-handler.native.js +31 -18
  130. package/dist/esm/setup-gesture-handler.native.js.map +1 -1
  131. package/dist/esm/setup-keyboard-controller.native.js +20 -17
  132. package/dist/esm/setup-safe-area.mjs +2 -0
  133. package/dist/esm/setup-safe-area.mjs.map +1 -1
  134. package/dist/esm/setup-safe-area.native.js +15 -17
  135. package/dist/esm/setup-safe-area.native.js.map +1 -1
  136. package/dist/esm/setup-teleport.mjs +13 -13
  137. package/dist/esm/setup-teleport.mjs.map +1 -1
  138. package/dist/esm/setup-teleport.native.js +13 -13
  139. package/dist/esm/setup-teleport.native.js.map +1 -1
  140. package/dist/esm/setup-worklets.mjs +11 -8
  141. package/dist/esm/setup-worklets.mjs.map +1 -1
  142. package/dist/esm/setup-worklets.native.js +11 -8
  143. package/dist/esm/setup-worklets.native.js.map +1 -1
  144. package/dist/esm/setup-zeego.mjs +13 -8
  145. package/dist/esm/setup-zeego.mjs.map +1 -1
  146. package/dist/esm/setup-zeego.native.js +13 -8
  147. package/dist/esm/setup-zeego.native.js.map +1 -1
  148. package/dist/esm/workletsState.mjs +11 -15
  149. package/dist/esm/workletsState.mjs.map +1 -1
  150. package/dist/esm/workletsState.native.js +11 -15
  151. package/dist/esm/workletsState.native.js.map +1 -1
  152. package/dist/esm/zeegoState.mjs +7 -6
  153. package/dist/esm/zeegoState.mjs.map +1 -1
  154. package/dist/esm/zeegoState.native.js +7 -6
  155. package/dist/esm/zeegoState.native.js.map +1 -1
  156. package/gesture-handler/index.cjs +1 -0
  157. package/gesture-handler/index.js +1 -0
  158. package/gesture-handler/index.native.cjs +1 -0
  159. package/gesture-handler/index.native.js +1 -0
  160. package/gesture-handler.cjs +1 -0
  161. package/package.json +70 -69
  162. package/setup-burnt/index.cjs +2 -0
  163. package/setup-burnt/index.js +2 -0
  164. package/setup-burnt/index.native.cjs +2 -0
  165. package/setup-burnt/index.native.js +2 -0
  166. package/setup-burnt.cjs +1 -0
  167. package/setup-expo-linear-gradient/index.cjs +2 -0
  168. package/setup-expo-linear-gradient/index.js +2 -0
  169. package/setup-expo-linear-gradient/index.native.cjs +2 -0
  170. package/setup-expo-linear-gradient/index.native.js +2 -0
  171. package/setup-expo-linear-gradient.cjs +1 -0
  172. package/setup-gesture-handler/index.cjs +2 -0
  173. package/setup-gesture-handler/index.js +2 -0
  174. package/setup-gesture-handler/index.native.cjs +2 -0
  175. package/setup-gesture-handler/index.native.js +2 -0
  176. package/setup-gesture-handler.cjs +1 -0
  177. package/setup-keyboard-controller/index.cjs +2 -0
  178. package/setup-keyboard-controller/index.js +2 -0
  179. package/setup-keyboard-controller/index.native.cjs +2 -0
  180. package/setup-keyboard-controller/index.native.js +2 -0
  181. package/setup-keyboard-controller.cjs +1 -0
  182. package/setup-safe-area/index.cjs +2 -0
  183. package/setup-safe-area/index.js +2 -0
  184. package/setup-safe-area/index.native.cjs +2 -0
  185. package/setup-safe-area/index.native.js +2 -0
  186. package/setup-safe-area.cjs +1 -0
  187. package/setup-teleport/index.cjs +2 -0
  188. package/setup-teleport/index.js +2 -0
  189. package/setup-teleport/index.native.cjs +2 -0
  190. package/setup-teleport/index.native.js +2 -0
  191. package/setup-teleport.cjs +1 -0
  192. package/setup-worklets/index.cjs +2 -0
  193. package/setup-worklets/index.js +2 -0
  194. package/setup-worklets/index.native.cjs +2 -0
  195. package/setup-worklets/index.native.js +2 -0
  196. package/setup-worklets.cjs +1 -0
  197. package/setup-zeego/index.cjs +2 -0
  198. package/setup-zeego/index.js +2 -0
  199. package/setup-zeego/index.native.cjs +2 -0
  200. package/setup-zeego/index.native.js +2 -0
  201. package/setup-zeego.cjs +1 -0
  202. package/src/PressBoundary.tsx +81 -0
  203. package/src/burntState.ts +28 -0
  204. package/src/gesture-handler.ts +17 -0
  205. package/src/gestureState.ts +148 -26
  206. package/src/globalState.ts +32 -0
  207. package/src/index.ts +18 -1
  208. package/src/keyboardControllerState.ts +16 -31
  209. package/src/linearGradientState.ts +8 -4
  210. package/src/nativeMenuContext.ts +4 -0
  211. package/src/portalState.ts +8 -4
  212. package/src/safeAreaState.ts +16 -23
  213. package/src/setup-burnt.ts +38 -0
  214. package/src/setup-gesture-handler.ts +35 -8
  215. package/src/setup-zeego.ts +4 -1
  216. package/src/types.ts +17 -0
  217. package/src/workletsState.ts +11 -19
  218. package/src/zeegoState.ts +9 -4
  219. package/tsconfig.json +12 -0
  220. package/types/PressBoundary.d.ts +14 -0
  221. package/types/PressBoundary.d.ts.map +11 -0
  222. package/types/burntState.d.ts +9 -0
  223. package/types/burntState.d.ts.map +11 -0
  224. package/types/components.d.ts.map +2 -2
  225. package/types/gesture-handler.d.ts +8 -0
  226. package/types/gesture-handler.d.ts.map +11 -0
  227. package/types/gestureState.d.ts +4 -0
  228. package/types/gestureState.d.ts.map +4 -4
  229. package/types/globalState.d.ts +8 -0
  230. package/types/globalState.d.ts.map +11 -0
  231. package/types/index.d.ts +7 -2
  232. package/types/index.d.ts.map +4 -4
  233. package/types/keyboardControllerState.d.ts +2 -10
  234. package/types/keyboardControllerState.d.ts.map +4 -4
  235. package/types/linearGradientState.d.ts.map +4 -4
  236. package/types/nativeMenuContext.d.ts +4 -0
  237. package/types/nativeMenuContext.d.ts.map +11 -0
  238. package/types/portalState.d.ts.map +4 -4
  239. package/types/safeAreaState.d.ts.map +4 -4
  240. package/types/setup-burnt.d.ts +3 -0
  241. package/types/setup-burnt.d.ts.map +11 -0
  242. package/types/setup-expo-linear-gradient.d.ts.map +2 -2
  243. package/types/setup-gesture-handler.d.ts +8 -1
  244. package/types/setup-gesture-handler.d.ts.map +4 -4
  245. package/types/setup-keyboard-controller.d.ts.map +2 -2
  246. package/types/setup-keyboard-controller.web.d.ts.map +2 -2
  247. package/types/setup-safe-area.d.ts.map +2 -2
  248. package/types/setup-teleport.d.ts.map +2 -2
  249. package/types/setup-worklets.d.ts.map +2 -2
  250. package/types/setup-zeego.d.ts.map +3 -3
  251. package/types/types.d.ts +15 -0
  252. package/types/types.d.ts.map +4 -4
  253. package/types/workletsState.d.ts.map +4 -4
  254. package/types/zeegoState.d.ts.map +4 -4
  255. package/dist/cjs/components.js +0 -41
  256. package/dist/cjs/components.js.map +0 -6
  257. package/dist/cjs/gestureState.js +0 -62
  258. package/dist/cjs/gestureState.js.map +0 -6
  259. package/dist/cjs/index.js +0 -32
  260. package/dist/cjs/index.js.map +0 -6
  261. package/dist/cjs/keyboardControllerState.js +0 -46
  262. package/dist/cjs/keyboardControllerState.js.map +0 -6
  263. package/dist/cjs/linearGradientState.js +0 -34
  264. package/dist/cjs/linearGradientState.js.map +0 -6
  265. package/dist/cjs/portalState.js +0 -34
  266. package/dist/cjs/portalState.js.map +0 -6
  267. package/dist/cjs/safeAreaState.js +0 -52
  268. package/dist/cjs/safeAreaState.js.map +0 -6
  269. package/dist/cjs/setup-expo-linear-gradient.js +0 -17
  270. package/dist/cjs/setup-expo-linear-gradient.js.map +0 -6
  271. package/dist/cjs/setup-gesture-handler.js +0 -24
  272. package/dist/cjs/setup-gesture-handler.js.map +0 -6
  273. package/dist/cjs/setup-keyboard-controller.js +0 -1
  274. package/dist/cjs/setup-keyboard-controller.js.map +0 -6
  275. package/dist/cjs/setup-portal.cjs +0 -66
  276. package/dist/cjs/setup-portal.js +0 -53
  277. package/dist/cjs/setup-portal.js.map +0 -6
  278. package/dist/cjs/setup-portal.native.js +0 -74
  279. package/dist/cjs/setup-portal.native.js.map +0 -1
  280. package/dist/cjs/setup-safe-area.js +0 -2
  281. package/dist/cjs/setup-safe-area.js.map +0 -6
  282. package/dist/cjs/setup-teleport.js +0 -17
  283. package/dist/cjs/setup-teleport.js.map +0 -6
  284. package/dist/cjs/setup-worklets.js +0 -20
  285. package/dist/cjs/setup-worklets.js.map +0 -6
  286. package/dist/cjs/setup-zeego.js +0 -18
  287. package/dist/cjs/setup-zeego.js.map +0 -6
  288. package/dist/cjs/setup.cjs +0 -64
  289. package/dist/cjs/setup.js +0 -50
  290. package/dist/cjs/setup.js.map +0 -6
  291. package/dist/cjs/setup.native.js +0 -72
  292. package/dist/cjs/setup.native.js.map +0 -1
  293. package/dist/cjs/state.cjs +0 -36
  294. package/dist/cjs/state.js +0 -28
  295. package/dist/cjs/state.js.map +0 -6
  296. package/dist/cjs/state.native.js +0 -39
  297. package/dist/cjs/state.native.js.map +0 -1
  298. package/dist/cjs/types.js +0 -14
  299. package/dist/cjs/types.js.map +0 -6
  300. package/dist/cjs/workletsState.js +0 -45
  301. package/dist/cjs/workletsState.js.map +0 -6
  302. package/dist/cjs/zeegoState.js +0 -34
  303. package/dist/cjs/zeegoState.js.map +0 -6
  304. package/dist/esm/components.js +0 -26
  305. package/dist/esm/components.js.map +0 -6
  306. package/dist/esm/gestureState.js +0 -46
  307. package/dist/esm/gestureState.js.map +0 -6
  308. package/dist/esm/keyboardControllerState.js +0 -30
  309. package/dist/esm/keyboardControllerState.js.map +0 -6
  310. package/dist/esm/linearGradientState.js +0 -18
  311. package/dist/esm/linearGradientState.js.map +0 -6
  312. package/dist/esm/portalState.js +0 -18
  313. package/dist/esm/portalState.js.map +0 -6
  314. package/dist/esm/safeAreaState.js +0 -36
  315. package/dist/esm/safeAreaState.js.map +0 -6
  316. package/dist/esm/setup-expo-linear-gradient.js +0 -17
  317. package/dist/esm/setup-expo-linear-gradient.js.map +0 -6
  318. package/dist/esm/setup-gesture-handler.js +0 -24
  319. package/dist/esm/setup-gesture-handler.js.map +0 -6
  320. package/dist/esm/setup-keyboard-controller.js +0 -1
  321. package/dist/esm/setup-keyboard-controller.js.map +0 -6
  322. package/dist/esm/setup-portal.js +0 -37
  323. package/dist/esm/setup-portal.js.map +0 -6
  324. package/dist/esm/setup-portal.mjs +0 -43
  325. package/dist/esm/setup-portal.mjs.map +0 -1
  326. package/dist/esm/setup-portal.native.js +0 -48
  327. package/dist/esm/setup-portal.native.js.map +0 -1
  328. package/dist/esm/setup-safe-area.js +0 -2
  329. package/dist/esm/setup-safe-area.js.map +0 -6
  330. package/dist/esm/setup-teleport.js +0 -17
  331. package/dist/esm/setup-teleport.js.map +0 -6
  332. package/dist/esm/setup-worklets.js +0 -20
  333. package/dist/esm/setup-worklets.js.map +0 -6
  334. package/dist/esm/setup-zeego.js +0 -18
  335. package/dist/esm/setup-zeego.js.map +0 -6
  336. package/dist/esm/setup.js +0 -34
  337. package/dist/esm/setup.js.map +0 -6
  338. package/dist/esm/setup.mjs +0 -41
  339. package/dist/esm/setup.mjs.map +0 -1
  340. package/dist/esm/setup.native.js +0 -46
  341. package/dist/esm/setup.native.js.map +0 -1
  342. package/dist/esm/state.js +0 -12
  343. package/dist/esm/state.js.map +0 -6
  344. package/dist/esm/state.mjs +0 -12
  345. package/dist/esm/state.mjs.map +0 -1
  346. package/dist/esm/state.native.js +0 -12
  347. package/dist/esm/state.native.js.map +0 -1
  348. package/dist/esm/types.js +0 -1
  349. package/dist/esm/types.js.map +0 -6
  350. package/dist/esm/workletsState.js +0 -29
  351. package/dist/esm/workletsState.js.map +0 -6
  352. package/dist/esm/zeegoState.js +0 -18
  353. package/dist/esm/zeegoState.js.map +0 -6
  354. package/types/setup-portal.d.ts.map +0 -11
@@ -0,0 +1,28 @@
1
+ import { createGlobalState } from './globalState'
2
+ import type { BurntState } from './types'
3
+
4
+ const state = createGlobalState<BurntState>(`burnt`, {
5
+ enabled: false,
6
+ toast: null,
7
+ dismissAllAlerts: null,
8
+ })
9
+
10
+ export interface BurntAccessor {
11
+ readonly isEnabled: boolean
12
+ readonly state: BurntState
13
+ set(newState: BurntState): void
14
+ }
15
+
16
+ export function getBurnt(): BurntAccessor {
17
+ return {
18
+ get isEnabled(): boolean {
19
+ return state.get().enabled
20
+ },
21
+ get state(): BurntState {
22
+ return state.get()
23
+ },
24
+ set(newState: BurntState): void {
25
+ state.set(newState)
26
+ },
27
+ }
28
+ }
@@ -0,0 +1,17 @@
1
+ export { getGestureHandler } from './gestureState'
2
+ export type {
3
+ ExternalPressOwnershipToken,
4
+ GestureHandlerAccessor,
5
+ PressGestureConfig,
6
+ } from './gestureState'
7
+ export {
8
+ claimExternalPressOwnership as unstable_claimExternalPressOwnership,
9
+ releaseExternalPressOwnership as unstable_releaseExternalPressOwnership,
10
+ } from './gestureState'
11
+ export { PressBoundary } from './PressBoundary'
12
+ export type { PressBoundaryProps } from './PressBoundary'
13
+ export {
14
+ getGestureHandlerConfig,
15
+ setupGestureHandler,
16
+ type GestureHandlerConfig,
17
+ } from './setup-gesture-handler'
@@ -1,18 +1,29 @@
1
+ import { createGlobalState } from './globalState'
1
2
  import type { GestureState } from './types'
2
3
 
3
- const GLOBAL_KEY = '__tamagui_native_gesture_state__'
4
-
5
- function getGlobalState(): GestureState {
6
- const g = globalThis as any
7
- if (!g[GLOBAL_KEY]) {
8
- g[GLOBAL_KEY] = {
9
- enabled: false,
10
- Gesture: null,
11
- GestureDetector: null,
12
- ScrollView: null,
13
- }
14
- }
15
- return g[GLOBAL_KEY]
4
+ const state = createGlobalState<GestureState>(`gesture`, {
5
+ enabled: false,
6
+ Gesture: null,
7
+ GestureDetector: null,
8
+ ScrollView: null,
9
+ })
10
+
11
+ let pressGestureDebugId = 0
12
+ let externalPressDebugId = 0
13
+
14
+ type PressOwnerSource = 'internal' | 'external' | null
15
+
16
+ /**
17
+ * Global press coordination - ensures only innermost pressable fires press events,
18
+ * matching RN Pressable/responder system semantics where deepest component wins.
19
+ * Uses a grace period to allow child gestures to steal ownership from parent,
20
+ * since RNGH fires parent gestures before child gestures.
21
+ */
22
+ const pressState = {
23
+ owner: null as object | null,
24
+ ownerId: null as number | null,
25
+ ownerSource: null as PressOwnerSource,
26
+ timestamp: 0,
16
27
  }
17
28
 
18
29
  export interface Insets {
@@ -23,6 +34,7 @@ export interface Insets {
23
34
  }
24
35
 
25
36
  export type PressGestureConfig = {
37
+ debugName?: string | null
26
38
  onPressIn?: (e: any) => void
27
39
  onPressOut?: (e: any) => void
28
40
  onPress?: (e: any) => void
@@ -39,43 +51,137 @@ export interface GestureHandlerAccessor {
39
51
  createPressGesture(config: PressGestureConfig): any
40
52
  }
41
53
 
54
+ export type ExternalPressOwnershipToken = object
55
+
56
+ function resetPressOwner() {
57
+ pressState.owner = null
58
+ pressState.ownerId = null
59
+ pressState.ownerSource = null
60
+ pressState.timestamp = 0
61
+ }
62
+
63
+ function resetStaleOwner(now: number, debugName?: string | null) {
64
+ if (now - pressState.timestamp > 2000) {
65
+ resetPressOwner()
66
+ }
67
+ }
68
+
69
+ export function claimExternalPressOwnership(
70
+ debugName?: string | null
71
+ ): ExternalPressOwnershipToken {
72
+ const now = Date.now()
73
+ resetStaleOwner(now, debugName)
74
+
75
+ const token = {}
76
+ const ownerId = ++externalPressDebugId
77
+ const previousOwnerId = pressState.ownerId
78
+ const previousOwnerSource = pressState.ownerSource
79
+
80
+ pressState.owner = token
81
+ pressState.ownerId = ownerId
82
+ pressState.ownerSource = 'external'
83
+ pressState.timestamp = now
84
+
85
+ return token
86
+ }
87
+
88
+ export function releaseExternalPressOwnership(
89
+ token: ExternalPressOwnershipToken | null | undefined,
90
+ debugName?: string | null
91
+ ): void {
92
+ if (!token || pressState.owner !== token) {
93
+ return
94
+ }
95
+
96
+ resetPressOwner()
97
+ }
98
+
42
99
  export function getGestureHandler(): GestureHandlerAccessor {
43
100
  return {
44
101
  get isEnabled(): boolean {
45
- return getGlobalState().enabled
102
+ return state.get().enabled
46
103
  },
47
104
  get state(): GestureState {
48
- return getGlobalState()
105
+ return state.get()
49
106
  },
50
107
  set(updates: Partial<GestureState>): void {
51
- const state = getGlobalState()
52
- Object.assign(state, updates)
108
+ Object.assign(state.get(), updates)
53
109
  },
54
110
 
55
111
  disable(): void {
56
- const state = getGlobalState()
57
- state.enabled = false
112
+ state.get().enabled = false
58
113
  },
59
114
 
60
115
  createPressGesture(config: PressGestureConfig): any {
61
- const { Gesture } = getGlobalState()
116
+ const { Gesture } = state.get()
62
117
  if (!Gesture) return null
63
118
 
64
119
  const longPressDuration = config.delayLongPress ?? 500
65
120
 
121
+ // unique token for this gesture instance - used to track ownership
122
+ const myToken = {}
123
+ const myDebugId = ++pressGestureDebugId
124
+
125
+ // Grace period for child gestures to steal ownership from parent.
126
+ // RNGH fires parent before child, but we want innermost to win.
127
+ // Claims typically span a few ms, 24ms gives enough room to observe
128
+ // ordering while debugging slower frames.
129
+ const GRACE_PERIOD_MS = process.env.TAMAGUI_RNGH_PRESS_DELAY
130
+ ? +process.env.TAMAGUI_RNGH_PRESS_DELAY
131
+ : 24
132
+
133
+ const tryClaimOwnership = () => {
134
+ const now = Date.now()
135
+ resetStaleOwner(now, config.debugName)
136
+
137
+ // within grace period, last claimer wins (child fires after parent)
138
+ const withinGrace = now - pressState.timestamp < GRACE_PERIOD_MS
139
+ const previousOwnerId = pressState.ownerId
140
+ const previousOwnerSource = pressState.ownerSource
141
+ if (
142
+ pressState.owner === null ||
143
+ (withinGrace && pressState.ownerSource !== 'external')
144
+ ) {
145
+ pressState.owner = myToken
146
+ pressState.ownerId = myDebugId
147
+ pressState.ownerSource = 'internal'
148
+ pressState.timestamp = now
149
+ }
150
+ return pressState.owner === myToken
151
+ }
152
+
153
+ const isOwner = () => pressState.owner === myToken
154
+
155
+ const releaseOwnership = () => {
156
+ if (pressState.owner === myToken) {
157
+ resetPressOwner()
158
+ }
159
+ }
160
+
66
161
  // Tap gesture for regular presses
67
162
  // Use long maxDuration to not cancel during long presses
68
163
  const tap = Gesture.Tap()
69
164
  .runOnJS(true)
70
165
  .maxDuration(10000) // allow very long presses
71
166
  .onBegin((e: any) => {
72
- config.onPressIn?.(e)
167
+ tryClaimOwnership()
168
+ // defer onPressIn until after grace period to ensure we're the final owner
169
+ setTimeout(() => {
170
+ if (isOwner()) {
171
+ config.onPressIn?.(e)
172
+ }
173
+ }, GRACE_PERIOD_MS + 1)
73
174
  })
74
175
  .onEnd((e: any) => {
75
- config.onPress?.(e)
176
+ if (isOwner()) {
177
+ config.onPress?.(e)
178
+ }
76
179
  })
77
180
  .onFinalize((e: any) => {
78
- config.onPressOut?.(e)
181
+ if (isOwner()) {
182
+ config.onPressOut?.(e)
183
+ releaseOwnership()
184
+ }
79
185
  })
80
186
 
81
187
  if (config.hitSlop) tap.hitSlop(config.hitSlop)
@@ -87,9 +193,25 @@ export function getGestureHandler(): GestureHandlerAccessor {
87
193
  const longPress = Gesture.LongPress()
88
194
  .runOnJS(true)
89
195
  .minDuration(longPressDuration)
90
- .onBegin((e: any) => config.onPressIn?.(e))
91
- .onStart((e: any) => config.onLongPress?.(e))
92
- .onFinalize((e: any) => config.onPressOut?.(e))
196
+ .onBegin((e: any) => {
197
+ tryClaimOwnership()
198
+ setTimeout(() => {
199
+ if (isOwner()) {
200
+ config.onPressIn?.(e)
201
+ }
202
+ }, GRACE_PERIOD_MS + 1)
203
+ })
204
+ .onStart((e: any) => {
205
+ if (isOwner()) {
206
+ config.onLongPress?.(e)
207
+ }
208
+ })
209
+ .onFinalize((e: any) => {
210
+ if (isOwner()) {
211
+ config.onPressOut?.(e)
212
+ releaseOwnership()
213
+ }
214
+ })
93
215
 
94
216
  if (config.hitSlop) longPress.hitSlop(config.hitSlop)
95
217
 
@@ -0,0 +1,32 @@
1
+ export function createGlobalState<T extends { enabled: boolean }>(
2
+ key: string,
3
+ defaultValue: T
4
+ ): {
5
+ get: () => T
6
+ set: (next: T) => void
7
+ } {
8
+ const GLOBAL_KEY = `__tamagui_${key}__`
9
+
10
+ type TamaguiGlobal = typeof globalThis & {
11
+ [GLOBAL_KEY]?: T
12
+ }
13
+
14
+ function getGlobalState(): T {
15
+ const g = globalThis as TamaguiGlobal
16
+ if (!g[GLOBAL_KEY]) {
17
+ // reset on module load so reloadReactNative gets a clean state
18
+ // (globalThis persists across reloads but module scope re-evaluates)
19
+ g[GLOBAL_KEY] = defaultValue
20
+ }
21
+ return g[GLOBAL_KEY]!
22
+ }
23
+
24
+ function setGlobalState(newState: T): void {
25
+ ;(globalThis as TamaguiGlobal)[GLOBAL_KEY] = newState
26
+ }
27
+
28
+ return {
29
+ get: getGlobalState,
30
+ set: setGlobalState,
31
+ }
32
+ }
package/src/index.ts CHANGED
@@ -30,6 +30,7 @@ export type {
30
30
  SafeAreaMetrics,
31
31
  LinearGradientState,
32
32
  ZeegoState,
33
+ BurntState,
33
34
  NativePortalProps,
34
35
  NativePortalHostProps,
35
36
  NativePortalProviderProps,
@@ -41,7 +42,18 @@ export type { PortalAccessor } from './portalState'
41
42
 
42
43
  // gesture handler
43
44
  export { getGestureHandler } from './gestureState'
44
- 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'
45
57
 
46
58
  // worklets
47
59
  export { getWorklets } from './workletsState'
@@ -66,6 +78,11 @@ export type { KeyboardControllerState } from './keyboardControllerState'
66
78
  // zeego (native menus)
67
79
  export { getZeego } from './zeegoState'
68
80
  export type { ZeegoAccessor } from './zeegoState'
81
+ export { NativeMenuContext } from './nativeMenuContext'
82
+
83
+ // burnt (native toasts)
84
+ export { getBurnt } from './burntState'
85
+ export type { BurntAccessor } from './burntState'
69
86
 
70
87
  // components
71
88
  export { NativePortal, NativePortalHost, NativePortalProvider } from './components'
@@ -1,44 +1,29 @@
1
- const GLOBAL_KEY = '__tamagui_native_keyboard_controller_state__'
1
+ import { createGlobalState } from './globalState'
2
+ import type { KeyboardControllerState } from './types'
2
3
 
3
- export interface KeyboardControllerState {
4
- enabled: boolean
5
- KeyboardProvider: any
6
- KeyboardAwareScrollView: any
7
- useKeyboardHandler: any
8
- useReanimatedKeyboardAnimation: any
9
- KeyboardController: any
10
- KeyboardEvents: any
11
- KeyboardStickyView: any
12
- }
4
+ export type { KeyboardControllerState }
13
5
 
14
- function getGlobalState(): KeyboardControllerState {
15
- const g = globalThis as any
16
- if (!g[GLOBAL_KEY]) {
17
- g[GLOBAL_KEY] = {
18
- enabled: false,
19
- KeyboardProvider: null,
20
- KeyboardAwareScrollView: null,
21
- useKeyboardHandler: null,
22
- useReanimatedKeyboardAnimation: null,
23
- KeyboardController: null,
24
- KeyboardEvents: null,
25
- KeyboardStickyView: null,
26
- }
27
- }
28
- return g[GLOBAL_KEY]
29
- }
6
+ const state = createGlobalState<KeyboardControllerState>(`keyboard_controller`, {
7
+ enabled: false,
8
+ KeyboardProvider: null,
9
+ KeyboardAwareScrollView: null,
10
+ useKeyboardHandler: null,
11
+ useReanimatedKeyboardAnimation: null,
12
+ KeyboardController: null,
13
+ KeyboardEvents: null,
14
+ KeyboardStickyView: null,
15
+ })
30
16
 
31
17
  export function isKeyboardControllerEnabled(): boolean {
32
- return getGlobalState().enabled
18
+ return state.get().enabled
33
19
  }
34
20
 
35
21
  export function getKeyboardControllerState(): KeyboardControllerState {
36
- return getGlobalState()
22
+ return state.get()
37
23
  }
38
24
 
39
25
  export function setKeyboardControllerState(
40
26
  updates: Partial<KeyboardControllerState>
41
27
  ): void {
42
- const state = getGlobalState()
43
- Object.assign(state, updates)
28
+ Object.assign(state.get(), updates)
44
29
  }
@@ -1,6 +1,10 @@
1
+ import { createGlobalState } from './globalState'
1
2
  import type { LinearGradientState } from './types'
2
3
 
3
- let state: LinearGradientState = { enabled: false, Component: null }
4
+ const state = createGlobalState<LinearGradientState>(`linear_gradient`, {
5
+ enabled: false,
6
+ Component: null,
7
+ })
4
8
 
5
9
  export interface LinearGradientAccessor {
6
10
  readonly isEnabled: boolean
@@ -11,13 +15,13 @@ export interface LinearGradientAccessor {
11
15
  export function getLinearGradient(): LinearGradientAccessor {
12
16
  return {
13
17
  get isEnabled(): boolean {
14
- return state.enabled
18
+ return state.get().enabled
15
19
  },
16
20
  get state(): LinearGradientState {
17
- return state
21
+ return state.get()
18
22
  },
19
23
  set(newState: LinearGradientState): void {
20
- state = newState
24
+ state.set(newState)
21
25
  },
22
26
  }
23
27
  }
@@ -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)
@@ -1,6 +1,10 @@
1
+ import { createGlobalState } from './globalState'
1
2
  import type { NativePortalState } from './types'
2
3
 
3
- let state: NativePortalState = { enabled: false, type: null }
4
+ const state = createGlobalState<NativePortalState>(`portal`, {
5
+ enabled: false,
6
+ type: null,
7
+ })
4
8
 
5
9
  export interface PortalAccessor {
6
10
  readonly isEnabled: boolean
@@ -11,13 +15,13 @@ export interface PortalAccessor {
11
15
  export function getPortal(): PortalAccessor {
12
16
  return {
13
17
  get isEnabled(): boolean {
14
- return state.enabled
18
+ return state.get().enabled
15
19
  },
16
20
  get state(): NativePortalState {
17
- return state
21
+ return state.get()
18
22
  },
19
23
  set(newState: NativePortalState): void {
20
- state = newState
24
+ state.set(newState)
21
25
  },
22
26
  }
23
27
  }
@@ -1,19 +1,12 @@
1
+ import { createGlobalState } from './globalState'
1
2
  import type { SafeAreaState, SafeAreaInsets, SafeAreaFrame } from './types'
2
3
 
3
- const GLOBAL_KEY = '__tamagui_native_safe_area_state__'
4
-
5
- function getGlobalState(): SafeAreaState {
6
- const g = globalThis as any
7
- if (!g[GLOBAL_KEY]) {
8
- g[GLOBAL_KEY] = {
9
- enabled: false,
10
- useSafeAreaInsets: null,
11
- useSafeAreaFrame: null,
12
- initialMetrics: null,
13
- }
14
- }
15
- return g[GLOBAL_KEY]
16
- }
4
+ const state = createGlobalState<SafeAreaState>(`safe_area`, {
5
+ enabled: false,
6
+ useSafeAreaInsets: null,
7
+ useSafeAreaFrame: null,
8
+ initialMetrics: null,
9
+ })
17
10
 
18
11
  const defaultInsets: SafeAreaInsets = { top: 0, right: 0, bottom: 0, left: 0 }
19
12
  const defaultFrame: SafeAreaFrame = { x: 0, y: 0, width: 0, height: 0 }
@@ -31,27 +24,27 @@ export interface SafeAreaAccessor {
31
24
  export function getSafeArea(): SafeAreaAccessor {
32
25
  return {
33
26
  get isEnabled() {
34
- return getGlobalState().enabled
27
+ return state.get().enabled
35
28
  },
36
29
  get state() {
37
- return getGlobalState()
30
+ return state.get()
38
31
  },
39
32
  set(updates: Partial<SafeAreaState>) {
40
- Object.assign(getGlobalState(), updates)
33
+ Object.assign(state.get(), updates)
41
34
  },
42
35
  getInsets() {
43
- const state = getGlobalState()
44
- if (!state.enabled || !state.initialMetrics) {
36
+ const s = state.get()
37
+ if (!s.enabled || !s.initialMetrics) {
45
38
  return defaultInsets
46
39
  }
47
- return state.initialMetrics.insets
40
+ return s.initialMetrics.insets
48
41
  },
49
42
  getFrame() {
50
- const state = getGlobalState()
51
- if (!state.enabled || !state.initialMetrics) {
43
+ const s = state.get()
44
+ if (!s.enabled || !s.initialMetrics) {
52
45
  return defaultFrame
53
46
  }
54
- return state.initialMetrics.frame
47
+ return s.initialMetrics.frame
55
48
  },
56
49
  }
57
50
  }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Setup burnt for Tamagui native toasts.
3
+ *
4
+ * Simply import this module at the top of your app entry point:
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * import '@tamagui/native/setup-burnt'
9
+ * ```
10
+ *
11
+ * This automatically detects and configures burnt for use with
12
+ * native Toast functionality.
13
+ */
14
+
15
+ import { getBurnt } from './burntState'
16
+
17
+ function setup(): void {
18
+ const g = globalThis as any
19
+ if (g.__tamagui_native_burnt_setup) return
20
+ g.__tamagui_native_burnt_setup = true
21
+
22
+ try {
23
+ const Burnt = require('burnt') as typeof import('burnt')
24
+
25
+ if (Burnt) {
26
+ getBurnt().set({
27
+ enabled: true,
28
+ toast: Burnt.toast,
29
+ dismissAllAlerts: Burnt.dismissAllAlerts,
30
+ })
31
+ }
32
+ } catch {
33
+ // burnt not installed
34
+ }
35
+ }
36
+
37
+ // run setup immediately on import
38
+ setup()
@@ -5,7 +5,12 @@
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
@@ -14,11 +19,32 @@
14
19
 
15
20
  import { getGestureHandler } from './gestureState'
16
21
 
17
- function setup() {
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
+ }
37
+
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
21
44
  }
45
+
46
+ // allow re-running setup to change config
47
+ const isFirstRun = !g.__tamagui_native_gesture_setup_complete
22
48
  g.__tamagui_native_gesture_setup_complete = true
23
49
 
24
50
  try {
@@ -27,16 +53,17 @@ function setup() {
27
53
  const { Gesture, GestureDetector, ScrollView } = rngh
28
54
 
29
55
  if (Gesture && GestureDetector) {
56
+ // only enable if pressEvents is true
30
57
  getGestureHandler().set({
31
- enabled: true,
58
+ enabled: currentConfig.pressEvents !== false,
32
59
  Gesture,
33
60
  GestureDetector,
34
61
  ScrollView: ScrollView || null,
35
62
  })
36
63
 
37
- // also set on the legacy key for backward compat with @tamagui/sheet
64
+ // sheet state - only enable if sheet is true
38
65
  g.__tamagui_sheet_gesture_state__ = {
39
- enabled: true,
66
+ enabled: currentConfig.sheet !== false,
40
67
  Gesture,
41
68
  GestureDetector,
42
69
  ScrollView: ScrollView || null,
@@ -47,5 +74,5 @@ function setup() {
47
74
  }
48
75
  }
49
76
 
50
- // run setup immediately on import
51
- setup()
77
+ // run setup immediately on import (can be overridden by calling setupGestureHandler)
78
+ setupGestureHandler()
@@ -30,7 +30,10 @@ function setup(): void {
30
30
  ContextMenu,
31
31
  })
32
32
  }
33
- } catch {
33
+ } catch (err) {
34
+ if (process.env.NODE_ENV === 'development') {
35
+ console.warn(`Error setting up Zeego`, err)
36
+ }
34
37
  // zeego not installed
35
38
  }
36
39
  }
package/src/types.ts CHANGED
@@ -69,3 +69,20 @@ export interface ZeegoState {
69
69
  DropdownMenu: any
70
70
  ContextMenu: any
71
71
  }
72
+
73
+ export interface BurntState {
74
+ enabled: boolean
75
+ toast: ((options: any) => void) | null
76
+ dismissAllAlerts: (() => void) | null
77
+ }
78
+
79
+ export interface KeyboardControllerState {
80
+ enabled: boolean
81
+ KeyboardProvider: any
82
+ KeyboardAwareScrollView: any
83
+ useKeyboardHandler: any
84
+ useReanimatedKeyboardAnimation: any
85
+ KeyboardController: any
86
+ KeyboardEvents: any
87
+ KeyboardStickyView: any
88
+ }