Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
323 commits
Select commit Hold shift + click to select a range
e93030d
fix relations (#3722)
akwasniewski Sep 29, 2025
430b92e
Rename argument `ev` to `event` (#3695)
tomekzaw Aug 28, 2025
1328672
Fix `Pressable`'s `onPress` being called on cancellation (#3678)
latekvo Sep 9, 2025
676d0d7
Update `metro.config.js` in example apps (#3718)
m-bert Sep 19, 2025
738a33c
fix: ensure SwipeDirection is imported as a value in ReanimatedSwipea…
christianbach Sep 29, 2025
1165900
[Web] Remove mouse buttons map (#3728)
m-bert Oct 2, 2025
e590283
[Web] Add `name` property to handlers (#3729)
m-bert Oct 3, 2025
4a12b70
Add `changeEventCalculator` to handlers (#3708)
m-bert Oct 3, 2025
50805b0
Add `SharedValue` type to config. (#3717)
m-bert Oct 3, 2025
215968f
Logic Detector (#3689)
akwasniewski Oct 6, 2025
f83e085
Fix composed types (#3744)
m-bert Oct 13, 2025
5f2d438
Filter config (#3710)
m-bert Oct 14, 2025
735ddc4
Remove deprecated components (#3734)
m-bert Oct 14, 2025
470ed63
Do not use `handleGestureEvent` for `Animated.Event` (#3748)
m-bert Oct 14, 2025
2d3116e
Change logic of `worklet` detection in config (#3745)
m-bert Oct 15, 2025
8b15836
[Web] Disable `onPointerMove` on hover on gestures other than `Hover`…
m-bert Oct 15, 2025
07edd7a
Split `utils` into multiple files (#3746)
m-bert Oct 15, 2025
a724f16
Add `runOnJS` to config (#3743)
m-bert Oct 15, 2025
1df7e30
Add missing types (#3731)
akwasniewski Oct 16, 2025
6605a36
Split types (#3750)
m-bert Oct 17, 2025
d2cbb50
Fix `hasWorkletEventHandlers` (#3758)
m-bert Oct 20, 2025
6eb7261
[Web] Fix handling of `enabled` prop (#3726)
m-bert Oct 23, 2025
b41e8da
Fix `Fling` tsdoc (#3724)
m-bert Oct 1, 2025
23bec9a
Fix: exclude libfbjni.so (#3721)
Maschga Oct 1, 2025
cda8f22
Support `react-native` 0.82 (#3699)
m-bert Oct 9, 2025
7230eda
[Android] `build.gradle` cleanup (#3741)
m-bert Oct 13, 2025
4a1aba5
fix: gesture not activating due to outdated handler tag (#3578)
hannojg Oct 14, 2025
e1cfca0
Fix grabbing delegate in `setPressed` (#3742)
akwasniewski Oct 15, 2025
5aac02c
Bump `node` on CI (#3753)
m-bert Oct 17, 2025
209c716
[iOS] Fix gestures not ending properly on `iOS` 26 (#3740)
m-bert Oct 17, 2025
bafdd9d
Bump `react-native-builder-bob` (#3751)
m-bert Oct 17, 2025
d5a4f18
[iOS] Fix gestures on iOS 26 (#3756)
m-bert Oct 20, 2025
d16a257
Release 2.29.0 (#3755)
m-bert Oct 21, 2025
fb736ec
Add workflow for releases (#3760)
m-bert Oct 22, 2025
c08f479
Add working directory to publish workflow (#3762)
m-bert Oct 22, 2025
d72966a
Allow `GestureHandlerRootView` to be manually made active (#2401)
j-piasecki Oct 22, 2025
1cd2bba
Fix swipeable on iOS (#3747)
akwasniewski Oct 22, 2025
7fcbcc6
Fix SSR error with `useLayoutEffect` (#3752)
akwasniewski Oct 23, 2025
a49f799
Fix memory leak with mixed use of `useMemo` (#3763)
akwasniewski Oct 24, 2025
a889f7c
Bump `node` in DFS CI (#3774)
m-bert Oct 27, 2025
e44fade
Reattach gestures when the Detector moves back to the window on iOS (…
j-piasecki Oct 27, 2025
6f3ac13
Update props whitelists (#3773)
m-bert Oct 27, 2025
b64ba44
Clean callbacks when unregistering gesture (#3775)
j-piasecki Oct 27, 2025
915e410
Remove `RNGestureHandlerEnabledRootView` and `gestureHandlerRootHOC` …
m-bert Oct 28, 2025
225fad6
Add support for nested Text to LogicDetector (#3778)
j-piasecki Oct 28, 2025
f26e305
Remove remaining paper references (#3783)
m-bert Oct 29, 2025
50d6d7b
Remove checks for React 19 (#3785)
m-bert Oct 30, 2025
2d739ec
One detector to rule them all (#3732)
akwasniewski Oct 31, 2025
99daffa
[Android] Remove workaround for touch events allowing to change state…
j-piasecki Nov 3, 2025
83110b2
[General] Fix `DiagonalDirections` type (#3795)
j-piasecki Nov 3, 2025
441a011
Remove incorrectly passed `gestureEvents` (#3799)
m-bert Nov 3, 2025
8dd560f
Rename logic detector to virtual detector (#3796)
akwasniewski Nov 3, 2025
76caf44
Virtual detector native gestures (#3765)
akwasniewski Nov 4, 2025
ad2029d
Throw error when detectors are not placed inside `GestureHandlerRootV…
m-bert Nov 5, 2025
8e64fef
[Web] Remove workaround for touch events allowing to change state too…
j-piasecki Nov 12, 2025
7b2ecaa
[Types] Remove `onUpdate` from discrete gestures (#3811)
j-piasecki Nov 12, 2025
8d5eec6
[Web] Don't try to remove context menu listeners when not initialized…
j-piasecki Nov 13, 2025
34c70f2
[iOS] Correctly attach `Native` gesture (#3802)
m-bert Nov 13, 2025
a2216e2
Memoize internal event handlers (#3812)
j-piasecki Nov 14, 2025
dfff6e9
Rename `onTouchesCancelled` to `onTouchesCancel` (#3818)
j-piasecki Nov 14, 2025
e26bc01
Rename relation props in config (#3817)
j-piasecki Nov 14, 2025
e594da5
Memoize cloned configs in gesture hooks (#3816)
j-piasecki Nov 14, 2025
48e3a79
Apply more granular memoization (#3815)
j-piasecki Nov 17, 2025
2a90922
[iOS] Remove dropped native handlers (#3819)
m-bert Nov 17, 2025
daa841d
Swipeable and drawer, new api (#3803)
akwasniewski Nov 17, 2025
255c72c
Simplify `VirtualDetector`/`InterceptingGestureDetector` and reduce t…
j-piasecki Nov 19, 2025
2ebe247
[General] Make `VirtualDetector` part of the public API (#3825)
j-piasecki Nov 20, 2025
8b43cf5
[Android][iOS] Don't handle events on the detector surface (#3823)
j-piasecki Nov 20, 2025
1cf805a
[General] Allow explicit opt-in for the Animated codepaths when not u…
j-piasecki Nov 20, 2025
c202c8a
Extracted `useIsomorphicLayoutEffect` to a separate file (#3766)
akwasniewski Oct 27, 2025
26eb9f6
[iOS] Fix `Pressable` `onPressOut` callback (#3777)
m-bert Oct 28, 2025
046c685
Rename `event` parameter (#3782)
m-bert Oct 28, 2025
47b8a86
[android] fix ripple effect after #3742 (#3781)
akwasniewski Oct 30, 2025
c4b013e
Add automated release scripts (#3784)
j-piasecki Oct 30, 2025
c6202b8
Update actions for automatic releases (#3788)
j-piasecki Oct 30, 2025
8a178ed
Fix memory leak in ReanimatedSwipeable on programmatic close (#3790)
kulak91 Nov 3, 2025
46bc3c8
chore: fix typos in docs for force touch gesture (#3797)
a1isaeed Nov 3, 2025
51c5a8c
[Web] Fixed `Accessing element.ref was removed in React 19` error (#3…
rmarquois Nov 6, 2025
a39e03c
[android] fixed experimental pointers breaking after pan (#3801)
akwasniewski Nov 12, 2025
3df1f96
Hide incorrectly exposed `ReanimatedSwipeable` props. (#3820)
m-bert Nov 17, 2025
6519696
Add `null` to `GestureRef` type (#3821)
m-bert Nov 17, 2025
93de5e1
[General] Make `InterceptingGestureDetector` throw when not rendered …
j-piasecki Nov 21, 2025
2f5c443
[Web] Fix context menu (#3826)
m-bert Nov 24, 2025
a5fc2c6
[General] Rename gesture hooks to include `Gesture` suffix (#3828)
j-piasecki Nov 24, 2025
12ffcc4
[General] Schedule flushes instead of flushing immediately (#3830)
j-piasecki Nov 24, 2025
2b7a1a0
[Web] Use correct config field for Reanimated flag (#3835)
j-piasecki Nov 24, 2025
a4f1074
Rename gesture composition hooks (#3834)
j-piasecki Nov 25, 2025
5fb9999
[General] Batch native operations (#3831)
j-piasecki Nov 25, 2025
e7eaa40
[General] Reduce the number of calls to `useEvent` (#3836)
j-piasecki Nov 25, 2025
7feb18d
[General] Unwrap `handlerData` when passing event to user-defined cal…
j-piasecki Nov 27, 2025
1fbdbcc
[iOS] Fix Animated events with no native driver (#3841)
j-piasecki Nov 28, 2025
bf76e72
[General] Rename `useMultipleGestures` to `useCompetingGestures` (#3848)
j-piasecki Nov 28, 2025
48cb976
[General] Rename `onStart`/`onEnd` to `onActivate`/`onDeactivate` (#3…
j-piasecki Nov 28, 2025
d77d1f7
Fix imports (#3845)
m-bert Nov 28, 2025
6a6dc33
Update `InterceptingGestureDetector` with Text example (#3851)
j-piasecki Dec 1, 2025
ae41fec
[General] Listen for Reanimated events directly, without `createAnima…
j-piasecki Dec 1, 2025
b27c7c4
[General] Hide internal fields from gesture events (#3844)
j-piasecki Dec 1, 2025
80006ff
[General] Reduce number of created closures (#3853)
j-piasecki Dec 3, 2025
71ab149
Change components implementation (#3800)
m-bert Dec 3, 2025
0885d75
Change exports (#3858)
m-bert Dec 8, 2025
6afb378
Handle `testID` prop (#3838)
m-bert Dec 8, 2025
84550ec
[Android] Fix `ScrollView` (#3867)
m-bert Dec 9, 2025
f1bd691
Correctly expose `avgTouches` (#3869)
m-bert Dec 10, 2025
8556825
Bring back missing fields from events (#3871)
m-bert Dec 10, 2025
ad481c4
Add missing `cancelsTouchesInView` (#3870)
m-bert Dec 10, 2025
bfa97c8
Change `direction` type in `Fling` (#3872)
m-bert Dec 11, 2025
2c0277a
Revert "Change direction type" (#3876)
m-bert Dec 15, 2025
ba7a96b
Change `runCallback` types (#3860)
m-bert Dec 16, 2025
1afd4b8
ReanimatedDrawerLayout: fix buttons not receiving onPress (#3832)
peterpme Nov 24, 2025
eaa0f34
[Web] Fix press out (#3833)
akwasniewski Nov 27, 2025
bdc278b
[android] fix scroll actions interpreted as touch (#3850)
kosmydel Dec 1, 2025
70204d4
[iOS] Fix pan not triggering `onFinalize` when blocked (#3849)
j-piasecki Dec 1, 2025
4621071
[iOS] Fix `onFinalize` callbacks on iOS 26 (#3855)
m-bert Dec 4, 2025
76861a1
[General] Change nightly version name (#3862)
j-piasecki Dec 4, 2025
f591bf2
Support `react-native` 0.83 (#3822)
m-bert Dec 11, 2025
480a494
Change `hoverEffect` to `effect` (#3878)
m-bert Dec 16, 2025
f8f47af
[General] Restore `handlerTag` to events (#3881)
j-piasecki Dec 16, 2025
08c46d8
[Web] Detector DOM props (#3877)
m-bert Dec 16, 2025
ed1b1ef
[docs] Gesture hooks (#3868)
m-bert Dec 23, 2025
2dfec2d
[docs] Update team (#3892)
m-bert Dec 23, 2025
029d670
[Docs] Add compatibility table (#3882)
m-bert Dec 23, 2025
b2d6281
State Manager (#3880)
akwasniewski Jan 7, 2026
990f48e
State manager deactivate (#3910)
akwasniewski Jan 9, 2026
6352af3
[web] Fix handlers not sending events (#3911)
m-bert Jan 9, 2026
59c3de7
[iOS] Fix `ScrollView` detection when used with NativeDetector (#3888)
j-piasecki Jan 12, 2026
c54d604
[General] Pass `testID` to native side in dev (#3883)
j-piasecki Jan 12, 2026
a2f2d1d
Increase maximum number of tracked pointers (#3915)
m-bert Jan 12, 2026
08c008f
Rename `tag` to `handlerTag` (#3916)
m-bert Jan 13, 2026
ef4a33e
Add CMakeLists.txt to package (#3917)
m-bert Jan 13, 2026
e62525e
add manualActivation prop (#3923)
akwasniewski Jan 19, 2026
8e70b11
[General] Cleanup duplicated callbacks (#3885)
j-piasecki Jan 23, 2026
5e1605f
V3 pressable (#3907)
akwasniewski Jan 26, 2026
d548122
[General] Fix layout jumps with native detector (#3930)
j-piasecki Jan 26, 2026
3da9a68
[docs] Gesture detectors (#3894)
m-bert Jan 27, 2026
7a4f774
[Native] `display: contents` based button styling (#3634)
j-piasecki Jan 27, 2026
6825dbb
[iOS] Restore scroll view behavior on gesture unbind (#3931)
j-piasecki Jan 27, 2026
e1185cd
[General] Fix `onBegin` not being called when the native recognizer s…
j-piasecki Jan 27, 2026
c48d653
[docs] Update quick start (#3895)
m-bert Jan 28, 2026
0c130e3
Move `Reanimated` availability check to `JS` side (#3935)
m-bert Jan 29, 2026
2bdd543
[web] fix context menu (#3939)
akwasniewski Jan 30, 2026
d519ea3
Fix state manager on unregistered gestures (#3913)
akwasniewski Jan 30, 2026
c6051ca
[iOS] Prevent gesture recognizers from beginning, when they should no…
j-piasecki Jan 30, 2026
4fc247e
[General] Throw when no gesture is passed to the `GestureDetector` (#…
j-piasecki Dec 17, 2025
0971094
Fixing number of touches becoming 0 issue for pan gestures in apple t…
DImuthuUpe Dec 17, 2025
956a665
[iOS] Fix manual activation crash (#3890)
m-bert Dec 19, 2025
377bdf5
[docs] Add sorn25 banner to readme (#3893)
p-malecki Dec 23, 2025
9aec429
[docs] Remove sorn25 banner from readme (#3922)
p-malecki Jan 16, 2026
a313557
fix(iOS): handles `pointerEvents` for `Pressable` component (#3925)
huextrat Jan 21, 2026
c744948
fix(android): handles `pointerEvents` for `Pressable` component (#3927)
huextrat Jan 22, 2026
550be45
Update the script responsible for updating the package version (#3934)
j-piasecki Jan 28, 2026
5f4b7e8
Update mocks (#3854)
akwasniewski Jan 30, 2026
e0e3a91
Cleaning manually activated handlers (#3943)
akwasniewski Jan 30, 2026
028fbf6
[Native] Fix `shouldCancelWhenOutside` not tracking the view (#3942)
j-piasecki Feb 2, 2026
0d892af
[docs] State management (#3905)
m-bert Feb 2, 2026
993f77f
[docs] Migration guide (#3896)
m-bert Feb 3, 2026
8de3322
Fix `HitSlop` type in config. (#3946)
m-bert Feb 4, 2026
5fee6f3
V3 examples (#3857)
akwasniewski Feb 4, 2026
789c720
[General] Update existing events tests (#3944)
j-piasecki Feb 2, 2026
df29e98
Update release flow to be more robust (#3938)
j-piasecki Feb 4, 2026
044f839
Bump github pages workflow (#3949)
akwasniewski Feb 4, 2026
599b47c
[docs] Rename callback and update migration guide (#3951)
m-bert Feb 5, 2026
0f13426
Fix intercepting detector props (#3952)
akwasniewski Feb 5, 2026
d7ce634
Temporarily disable commitly releases (#3953)
j-piasecki Feb 5, 2026
f2b71fd
Merge branch 'main' into next
j-piasecki Feb 5, 2026
77fa524
Merge Gesture Handler 3 working branch to main (#3954)
j-piasecki Feb 5, 2026
edab187
Update compatibility table for Gesture Handler 3 beta (#3955)
m-bert Feb 5, 2026
e262a63
Add missing semicolons and improve indentation (#3957)
tomekzaw Feb 6, 2026
6edaba5
Publish proper nightly releases (#3956)
j-piasecki Feb 6, 2026
d95aa05
Fix reattaching (#3960)
akwasniewski Feb 6, 2026
e99cf63
Add LLM skill for migration to RNGH3 (#3947)
j-piasecki Feb 6, 2026
7e597d0
[Android] Handle gestures on transparent views directly under the Det…
j-piasecki Feb 10, 2026
b8ac9ea
[Native] Automatically unflatten detector children (#3963)
j-piasecki Feb 10, 2026
746564b
[Native] Fix host detector when used alongside `Activity` (#3967)
j-piasecki Feb 10, 2026
3c7c287
[docs] Add gtm (#3969)
p-malecki Feb 11, 2026
18af65a
Do not export `PureNativeButton` (#3972)
m-bert Feb 12, 2026
8fc4f04
Test examples (#3961)
akwasniewski Feb 13, 2026
06aab22
[Native] Fix ButtonWrapper Shadow Node custom layout logic (#3974)
akwasniewski Feb 13, 2026
67006d6
[docs] Update docs (#3959)
m-bert Feb 13, 2026
3f91ea5
[docs] `GestureHandlerRootView` (#3970)
m-bert Feb 13, 2026
bdf353d
Export new `createNativeWrapper` (#3971)
m-bert Feb 13, 2026
0e74233
[docs] Buttons (#3968)
m-bert Feb 17, 2026
81c5b06
Update `GestureButton` props type (#3973)
m-bert Feb 18, 2026
35cb78c
[General] Only overwrite ref if the dropped handler didn't change (#3…
j-piasecki Feb 19, 2026
560d1b5
Fix GestureDetector unresponsive after display:none toggle (New Arch)…
janicduplessis Feb 19, 2026
0cdf520
[docs] Redirects (#3976)
m-bert Feb 19, 2026
74cfcd6
[iOS] Add wrapper for `handleGesture:fromReset:` (#3983)
m-bert Feb 19, 2026
a4f618c
[docs] Add platform badges (#3975)
m-bert Feb 19, 2026
1f40473
Support React Native 0.84 (#3912)
m-bert Feb 19, 2026
0572462
Change handler reference to weak pointer to prevent memleaks (#3987)
WoLewicki Feb 20, 2026
495db78
Fix failing `Jest` CI (#3988)
m-bert Feb 20, 2026
e566b99
[ios] Force going through begin in state manager (#3979)
akwasniewski Feb 23, 2026
554e668
[docs] Add version badges (#3978)
m-bert Feb 23, 2026
b8c72e2
[docs] Make `platforms` optional parameter (#3992)
m-bert Feb 24, 2026
4285b4f
[web] handle common props in virtual detector (#3982)
akwasniewski Feb 24, 2026
1b135f7
Use shared release action (#3994)
j-piasecki Feb 24, 2026
1fafb43
[iOS] Fix wrong `pointerType` in `Hover` gesture (#3989)
m-bert Feb 25, 2026
2e34b85
[docs] Components' props (#3990)
m-bert Feb 25, 2026
2e59a47
Pin nightlies to 3.0.0 (#3998)
j-piasecki Feb 26, 2026
952729b
Use action from the main organization (#3999)
j-piasecki Feb 26, 2026
957eed3
Split `HandlerData` (#3980)
m-bert Feb 26, 2026
6b2d59d
docs: Add banner rotator (#4000)
p-malecki Feb 27, 2026
9a72a5c
`FlatList` & `Ref` types (#4002)
m-bert Feb 27, 2026
64ba931
Fix `fillInDefaultValues` warning (#4004)
m-bert Feb 27, 2026
13c05f2
[docs] Add analytics and close banner btn (#4005)
p-malecki Feb 27, 2026
831c711
Depracate old components (#4006)
m-bert Mar 2, 2026
8ec0820
[macOS] Bump example app (#3993)
m-bert Mar 2, 2026
75a6102
[docs] Add React Native 0.81 to compatibility table (#4007)
m-bert Mar 2, 2026
cefb702
[General] Allow gesture detector to have multiple children (#3981)
j-piasecki Mar 2, 2026
19b619b
Revert "Export new `createNativeWrapper` (#3971)" (#4001)
m-bert Mar 2, 2026
7406046
Memoize `Text` component (#4003)
m-bert Mar 2, 2026
41fbd37
[iOS] Distinguish between mouse and stylus when hovering (#3991)
AndreasHogstrom Mar 2, 2026
5429e5e
Import legacy pressables in examples (#4009)
akwasniewski Mar 3, 2026
23c6413
[Android] Check all pointers in move events (#4010)
m-bert Mar 4, 2026
edef276
Move @types/react-test-renderer to dependencies (#4015)
YevheniiKotyrlo Mar 5, 2026
58c4641
Enable `exactOptionalPropertyTypes` support (#4012)
YevheniiKotyrlo Mar 5, 2026
f46080a
[iOS] Fix concurrent modification crash (#4008)
m-bert Mar 5, 2026
af8b121
[ios] not calling activation callback on inactive gestures (#3986)
akwasniewski Mar 5, 2026
864cffe
[android] dont cancel manually activated gestures (#4011)
akwasniewski Mar 6, 2026
ee266bb
Fix `LegacyPressable` (#4016)
m-bert Mar 6, 2026
0ec1cd2
[Android] Clear blocking relations on drop (#4020)
m-bert Mar 11, 2026
3918d8a
[iOS] Add `numberOfPointers` to `Native` gesture events (#4023)
m-bert Mar 13, 2026
9e8c54c
[iOS] Fix missing `onFinalize` callback in `Tap` (#4029)
m-bert Mar 18, 2026
154f204
Add missing handlers callbacks to buttons (#4033)
m-bert Mar 19, 2026
0e91d90
Bring back `onUpdate` to `Native` gesture (#4034)
m-bert Mar 19, 2026
b60257b
Remove begin from StateManager (#4024)
akwasniewski Mar 20, 2026
bfb24af
Update `yarn` (#4035)
m-bert Mar 20, 2026
1a7aea1
Do not import `NativeWrapperProps` as type (#4030)
m-bert Mar 20, 2026
4a7639d
[General] Implement basic button interactions using native primitives…
j-piasecki Mar 23, 2026
b33f704
docs: remove paradise banner (#4037)
p-malecki Mar 23, 2026
c173e17
[android] fix talkback on pressable (#4017)
akwasniewski Mar 24, 2026
5587435
Add `Pan` offset props to `PropsToFilter` (#4026)
m-bert Mar 24, 2026
6c06cc4
[iOS] Handle `FullWindowOverlay` as the native root (#4039)
j-piasecki Mar 27, 2026
23d96d9
Bump Reanimated (#4040)
m-bert Mar 31, 2026
768d75d
[iOS] Ignore Apple's default retention offset for buttons and rely st…
j-piasecki Mar 31, 2026
9d671cb
Make buttons activate immediately (#4036)
m-bert Mar 31, 2026
1e87668
`Clickable` component (#4018)
m-bert Apr 1, 2026
ea83410
fix(ios): guard +load with #ifdef RCT_DYNAMIC_FRAMEWORKS (#4047)
DavidDuarte22 Apr 2, 2026
a555989
Fix GestureDetector unresponsive after display:none toggle (New Arch)…
janicduplessis Feb 19, 2026
aad6b20
[iOS] Add wrapper for `handleGesture:fromReset:` (#3983)
m-bert Feb 19, 2026
38a6ad9
Change handler reference to weak pointer to prevent memleaks (#3987)
WoLewicki Feb 20, 2026
54a9ef0
[iOS] Fix wrong `pointerType` in `Hover` gesture (#3989)
m-bert Feb 25, 2026
424784c
Memoize `Text` component (#4003)
m-bert Mar 2, 2026
ee722f5
[iOS] Distinguish between mouse and stylus when hovering (#3991)
AndreasHogstrom Mar 2, 2026
45ce4e9
[Android] Check all pointers in move events (#4010)
m-bert Mar 4, 2026
4b15fb0
Move @types/react-test-renderer to dependencies (#4015)
YevheniiKotyrlo Mar 5, 2026
0d434ed
Enable `exactOptionalPropertyTypes` support (#4012)
YevheniiKotyrlo Mar 5, 2026
dbbe34c
[iOS] Add `numberOfPointers` to `Native` gesture events (#4023)
m-bert Mar 13, 2026
c3b0600
[iOS] Fix missing `onFinalize` callback in `Tap` (#4029)
m-bert Mar 18, 2026
d83eb42
fix(ios): guard +load with #ifdef RCT_DYNAMIC_FRAMEWORKS (#4047)
DavidDuarte22 Apr 2, 2026
34852bf
Merge remote branch to enable push
Copilot Apr 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -577,11 +577,22 @@ open class GestureHandler {
onStateChange(newState, oldState)
}

fun wantsEvent(event: MotionEvent): Boolean = isEnabled &&
state != STATE_FAILED &&
state != STATE_CANCELLED &&
state != STATE_END &&
isTrackingPointer(event.getPointerId(event.actionIndex))
fun wantsEvent(event: MotionEvent): Boolean {
if (!isEnabled || state == STATE_FAILED || state == STATE_CANCELLED || state == STATE_END) {
return false
}

if (event.actionMasked == MotionEvent.ACTION_MOVE) {
for (i in 0 until event.pointerCount) {
if (isTrackingPointer(event.getPointerId(i))) {
return true
}
}
return false
} else {
return isTrackingPointer(event.getPointerId(event.actionIndex))
}
}

open fun shouldRequireToWaitForFailure(handler: GestureHandler): Boolean {
if (handler === this) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ @implementation RNBetterSwipeGestureRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
_lastPoint = CGPointZero;
_hasBegan = NO;
Expand All @@ -26,7 +26,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler

- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
{
[_gestureHandler setCurrentPointerType:event];
[_gestureHandler setCurrentPointerTypeForEvent:event];
_lastPoint = [[[touches allObjects] objectAtIndex:0] locationInView:_gestureHandler.recognizer.view];
[_gestureHandler reset];
[super touchesBegan:touches withEvent:event];
Expand Down Expand Up @@ -119,7 +119,7 @@ @implementation RNBetterSwipeGestureRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;

maxDuration = 1.0;
Expand All @@ -132,9 +132,9 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
return self;
}

- (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer fromReset:(BOOL)fromReset
- (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer
{
[_gestureHandler handleGesture:self fromReset:fromReset];
[_gestureHandler handleGesture:self];
}

- (void)mouseDown:(NSEvent *)event
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ @implementation RNForceTouchGestureRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
_force = defaultForce;
_minForce = defaultMinForce;
Expand All @@ -40,7 +40,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler

- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
{
[_gestureHandler setCurrentPointerType:event];
[_gestureHandler setCurrentPointerTypeForEvent:event];
if (_firstTouch) {
// ignore rest of fingers
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,22 @@ @implementation RNBetterHoverGestureRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
_hoverEffect = RNGestureHandlerHoverEffectNone;
}
return self;
}

- (void)handleGesture:(UIHoverGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateBegan) {
[_gestureHandler setCurrentPointerType:RNGestureHandlerMouse];
}

[_gestureHandler handleGesture:self];
}

- (void)triggerAction
{
[_gestureHandler handleGesture:self fromReset:NO];
Expand Down Expand Up @@ -153,11 +162,22 @@ - (void)configure:(NSDictionary *)config
#endif
}

- (void)setCurrentPointerType:(RNGestureHandlerPointerType)pointerType
{
_pointerType = pointerType;

if (@available(iOS 16.1, *)) {
if (((UIHoverGestureRecognizer *)self.recognizer).zOffset > 0.0) {
_pointerType = RNGestureHandlerStylus;
}
}
}

- (RNGestureHandlerEventExtraData *)eventExtraData:(UIGestureRecognizer *)recognizer
{
return [RNGestureHandlerEventExtraData forPosition:[recognizer locationInView:recognizer.view]
withAbsolutePosition:[recognizer locationInView:recognizer.view.window]
withPointerType:UITouchTypePencil];
withPointerType:_pointerType];
}

@end
Expand All @@ -173,6 +193,7 @@ - (instancetype)initWithTag:(NSNumber *)tag
{
if ((self = [super initWithTag:tag])) {
_recognizer = [NSGestureRecognizer alloc];
_pointerType = RNGestureHandlerMouse;
}

return self;
Expand All @@ -199,21 +220,29 @@ - (void)mouseEntered:(NSEvent *)event
{
[self sendEventsInState:RNGestureHandlerStateBegan
forViewWithTag:_view.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
withNumberOfTouches:1
withPointerType:_pointerType]];
[self sendEventsInState:RNGestureHandlerStateActive
forViewWithTag:_view.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
withNumberOfTouches:1
withPointerType:_pointerType]];
}

- (void)mouseExited:(NSEvent *)theEvent
{
[self sendEventsInState:RNGestureHandlerStateEnd
forViewWithTag:_view.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
withNumberOfTouches:1
withPointerType:_pointerType]];

[self sendEventsInState:RNGestureHandlerStateUndetermined
forViewWithTag:_view.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
withNumberOfTouches:1
withPointerType:_pointerType]];
}

@end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
- (NSUInteger)getDuration;

#if !TARGET_OS_OSX
- (void)handleGesture:(UIGestureRecognizer *)recognizer;
- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset;
#else
- (void)handleGesture:(NSGestureRecognizer *)recognizer;
- (void)handleGesture:(NSGestureRecognizer *)recognizer fromReset:(BOOL)fromReset;
#endif

Expand All @@ -47,12 +49,18 @@ @implementation RNBetterLongPressGestureRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
}
return self;
}

- (void)handleGesture:(UIGestureRecognizer *)recognizer
{
previousTime = CACurrentMediaTime();
[_gestureHandler handleGesture:recognizer fromReset:NO];
}

- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset
{
previousTime = CACurrentMediaTime();
Expand All @@ -79,7 +87,7 @@ - (CGPoint)translationInView

- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
{
[_gestureHandler setCurrentPointerType:event];
[_gestureHandler setCurrentPointerTypeForEvent:event];
[super touchesBegan:touches withEvent:event];
[_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ @implementation RNManualRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
_shouldSendBeginEvent = YES;
}
Expand Down Expand Up @@ -59,7 +59,7 @@ - (void)interactionsEnded:(NSSet *)touches withEvent:(UIEvent *)event
#if !TARGET_OS_OSX
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
{
[_gestureHandler setCurrentPointerType:event];
[_gestureHandler setCurrentPointerTypeForEvent:event];
[super touchesBegan:touches withEvent:event];

[self interactionsBegan:touches withEvent:event];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ @implementation RNDummyGestureRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
}
return self;
Expand All @@ -38,7 +38,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
#if !TARGET_OS_OSX
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
{
[_gestureHandler setCurrentPointerType:event];
[_gestureHandler setCurrentPointerTypeForEvent:event];
[_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
}

Expand Down Expand Up @@ -166,7 +166,7 @@ - (void)bindToView:(UIView *)view

- (void)handleTouchDown:(UIView *)sender forEvent:(UIEvent *)event
{
[self setCurrentPointerType:event];
[self setCurrentPointerTypeForEvent:event];
[self reset];

if (_disallowInterruption) {
Expand All @@ -182,21 +182,27 @@ - (void)handleTouchDown:(UIView *)sender forEvent:(UIEvent *)event

[self sendEventsInState:RNGestureHandlerStateActive
forViewWithTag:sender.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
withNumberOfTouches:event.allTouches.count
withPointerType:_pointerType]];
}

- (void)handleTouchUpOutside:(UIView *)sender forEvent:(UIEvent *)event
{
[self sendEventsInState:RNGestureHandlerStateEnd
forViewWithTag:sender.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
withNumberOfTouches:event.allTouches.count
withPointerType:_pointerType]];
}

- (void)handleTouchUpInside:(UIView *)sender forEvent:(UIEvent *)event
{
[self sendEventsInState:RNGestureHandlerStateEnd
forViewWithTag:sender.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
withNumberOfTouches:event.allTouches.count
withPointerType:_pointerType]];
}

- (void)handleDragExit:(UIView *)sender forEvent:(UIEvent *)event
Expand All @@ -207,33 +213,42 @@ - (void)handleDragExit:(UIView *)sender forEvent:(UIEvent *)event
[control cancelTrackingWithEvent:event];
[self sendEventsInState:RNGestureHandlerStateEnd
forViewWithTag:sender.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
withNumberOfTouches:event.allTouches.count
withPointerType:_pointerType]];
} else {
[self sendEventsInState:RNGestureHandlerStateActive
forViewWithTag:sender.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
withNumberOfTouches:event.allTouches.count
withPointerType:_pointerType]];
}
}

- (void)handleDragEnter:(UIView *)sender forEvent:(UIEvent *)event
{
[self sendEventsInState:RNGestureHandlerStateActive
forViewWithTag:sender.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
withNumberOfTouches:event.allTouches.count
withPointerType:_pointerType]];
}

- (void)handleTouchCancel:(UIView *)sender forEvent:(UIEvent *)event
{
[self sendEventsInState:RNGestureHandlerStateCancelled
forViewWithTag:sender.reactTag
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
withNumberOfTouches:event.allTouches.count
withPointerType:_pointerType]];
}

#else

- (RNGestureHandlerEventExtraData *)eventExtraData:(RNDummyGestureRecognizer *)recognizer
{
return [RNGestureHandlerEventExtraData forPointerInside:[self containsPointInView]
withNumberOfTouches:1
withPointerType:RNGestureHandlerMouse];
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ @implementation RNBetterPanGestureRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
_minDistSq = NAN;
_minVelocityX = NAN;
Expand Down Expand Up @@ -233,7 +233,7 @@ - (void)mouseUp:(NSEvent *)event

- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
{
[_gestureHandler setCurrentPointerType:event];
[_gestureHandler setCurrentPointerTypeForEvent:event];
// super call was moved to interactionsBegan method to keep the
// original order of calls
[self interactionsBegan:touches withEvent:event];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ @implementation RNBetterPinchRecognizer {

- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
{
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
_gestureHandler = gestureHandler;
}
#if TARGET_OS_OSX
Expand All @@ -43,7 +43,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
return self;
}

- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset
- (void)handleGesture:(UIGestureRecognizer *)recognizer
{
if (self.state == UIGestureRecognizerStateBegan) {
#if TARGET_OS_OSX
Expand All @@ -52,7 +52,8 @@ - (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromRese
self.scale = 1;
#endif
}
[_gestureHandler handleGesture:recognizer fromReset:fromReset];

[_gestureHandler handleGesture:recognizer fromReset:NO];
}

- (void)interactionsBegan:(NSSet *)touches withEvent:(UIEvent *)event
Expand Down Expand Up @@ -103,7 +104,7 @@ - (void)magnifyWithEvent:(NSEvent *)event
#else
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
{
[_gestureHandler setCurrentPointerType:event];
[_gestureHandler setCurrentPointerTypeForEvent:event];
[super touchesBegan:touches withEvent:event];
[self interactionsBegan:touches withEvent:event];
}
Expand Down
Loading