From 96003ff3c0699dae7ec720546cc815e317d6811d Mon Sep 17 00:00:00 2001 From: Oleksii Bulenok Date: Thu, 27 Aug 2026 13:44:46 +0200 Subject: [PATCH] Fix bsky logo appearing during screen back transition --- patches/react-native-screens@4.26.2.patch | 109 +++++++++++++++++++ patches/react-native-screens@4.26.2.patch.md | 32 ++++++ pnpm-lock.yaml | 24 ++-- 3 files changed, 153 insertions(+), 12 deletions(-) diff --git a/patches/react-native-screens@4.26.2.patch b/patches/react-native-screens@4.26.2.patch index 471757be87..c49bf5c69f 100644 --- a/patches/react-native-screens@4.26.2.patch +++ b/patches/react-native-screens@4.26.2.patch @@ -31,3 +31,112 @@ index 76bb694854b29d7f779f38244cd48113b429ea1f..fd402ac938862e8d39c5467c1b5c86c4 startTransitionRecursive(child) } } +diff --git a/ios/RNSScreen.mm b/ios/RNSScreen.mm +index 9b66012dc8db1e3af0cb5457f8dad86e7f2fe5e3..a7f1f613c291de8421f6f117c06d35ba34a2d908 100644 +--- a/ios/RNSScreen.mm ++++ b/ios/RNSScreen.mm +@@ -1,4 +1,5 @@ + #import ++#import + + #import "RNSModalScreen.h" + #import "RNSScreen.h" +@@ -1180,9 +1181,82 @@ - (BOOL)hasHeaderConfig + return _config != nil; + } + ++/* ++ * PATCH (secure-snapshot): content protected by an isSecureTextEntry canvas ++ * (per-view capture protection, e.g. expo-privacy-sensitive) is stripped from ++ * the render-server snapshot RNSScreen takes for JS-driven pops, so the user ++ * sees the hidden fallback (the GrowthHack butterfly) during the transition. ++ * The capture-exclusion flag is only consulted for layers INSIDE a captured ++ * subtree, so a snapshot rooted BELOW the flagged canvas still includes the ++ * content. ++ * ++ * By the time setViewToSnapshot runs, the screen's children are already ++ * unmounted (only the pixels survive on the render server), so the secure ++ * subtrees must be captured HERE - before the transaction's mutations apply, ++ * while the subtree is intact. The overlays are stashed on the screen view ++ * and composited over the main snapshot in setViewToSnapshot, each re-wrapped ++ * in a fresh secure canvas so real captures (screenshots/recordings) taken ++ * during the transition still exclude them. ++ */ ++static void RNSCollectPrivacySensitiveViews(UIView *view, NSMutableArray *out) ++{ ++ // Swift classes are namespaced in the ObjC runtime ("Module.ClassName") ++ if ([NSStringFromClass([view class]) hasSuffix:@"ExpoPrivacySensitiveView"]) { ++ [out addObject:view]; ++ return; ++ } ++ for (UIView *subview in view.subviews) { ++ RNSCollectPrivacySensitiveViews(subview, out); ++ } ++} ++ ++static UIView *_Nullable RNSMakeSecureCanvas(void) ++{ ++ UITextField *field = [UITextField new]; ++ field.secureTextEntry = YES; ++ field.userInteractionEnabled = NO; ++ UIView *canvas = (UIView *)field.layer.sublayers.firstObject.delegate; ++ if (![canvas isKindOfClass:[UIView class]]) { ++ return nil; ++ } ++ canvas.clipsToBounds = NO; ++ canvas.backgroundColor = UIColor.clearColor; ++ // retain the field alongside the canvas in case the capture exclusion ever ++ // depends on the owning field staying alive ++ objc_setAssociatedObject(canvas, "RNSSecureCanvasField", field, OBJC_ASSOCIATION_RETAIN_NONATOMIC); ++ return canvas; ++} ++ ++static char RNSSecureOverlaysKey; ++ + - (void)willBeUnmountedInUpcomingTransaction + { + _markedForUnmountInCurrentTransaction = YES; ++ ++ NSMutableArray *sensitiveViews = [NSMutableArray new]; ++ RNSCollectPrivacySensitiveViews(self, sensitiveViews); ++ NSMutableArray *overlays = [NSMutableArray new]; ++ for (UIView *sensitiveView in sensitiveViews) { ++ UIView *canvas = sensitiveView.subviews.firstObject; ++ for (UIView *content in canvas.subviews) { ++ UIView *pieceSnapshot = [content snapshotViewAfterScreenUpdates:NO]; ++ if (pieceSnapshot == nil) { ++ continue; ++ } ++ CGRect frameInScreen = [content convertRect:content.bounds toView:self]; ++ UIView *secureWrap = RNSMakeSecureCanvas(); ++ if (secureWrap != nil) { ++ secureWrap.frame = frameInScreen; ++ pieceSnapshot.frame = secureWrap.bounds; ++ [secureWrap addSubview:pieceSnapshot]; ++ [overlays addObject:secureWrap]; ++ } else { ++ pieceSnapshot.frame = frameInScreen; ++ [overlays addObject:pieceSnapshot]; ++ } ++ } ++ } ++ objc_setAssociatedObject(self, &RNSSecureOverlaysKey, overlays.count > 0 ? overlays : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + + + (react::ComponentDescriptorProvider)componentDescriptorProvider +@@ -1999,6 +2073,15 @@ - (void)setViewToSnapshot + auto afterUpdates = self.screenView.snapshotAfterUpdates; + UIView *snapshot = [self.view snapshotViewAfterScreenUpdates:afterUpdates]; + snapshot.frame = self.view.frame; ++ ++ // PATCH (secure-snapshot): composite the secure-content overlays captured ++ // in willBeUnmountedInUpcomingTransaction (see comment there) ++ NSArray *overlays = objc_getAssociatedObject(self.screenView, &RNSSecureOverlaysKey); ++ for (UIView *overlay in overlays) { ++ [snapshot addSubview:overlay]; ++ } ++ objc_setAssociatedObject(self.screenView, &RNSSecureOverlaysKey, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC); ++ + [self.view removeFromSuperview]; + self.view = snapshot; + [superView addSubview:snapshot]; diff --git a/patches/react-native-screens@4.26.2.patch.md b/patches/react-native-screens@4.26.2.patch.md index 7b1c19600a..d6b90409bb 100644 --- a/patches/react-native-screens@4.26.2.patch.md +++ b/patches/react-native-screens@4.26.2.patch.md @@ -13,3 +13,35 @@ The patch transitions a RecyclerView as a single unit without recursively transi Related issues: - https://github.com/callstack/react-native-pager-view/issues/1005 - https://github.com/software-mansion/react-native-screens/issues/2461 + +## iOS: composite secure-view content into JS-pop transition snapshots + +Fixes the GrowthHack Follow button flashing to the butterfly logo during +JS-driven pops (custom back button, programmatic `goBack()`). + +For a JS-driven pop, React unmounts the screen before the native dismiss +animation runs, so `RNSScreen setViewToSnapshot` freezes the screen with +`snapshotViewAfterScreenUpdates:`. That is a render-server capture, and the +render server excludes `isSecureTextEntry` canvas layers from every capture - +the mechanism expo-privacy-sensitive borrows - so the Follow button is +stripped from the frozen frame and the butterfly behind it shows for the +whole pop animation. Native-first pops (swipe-back, native header back) are +unaffected because they animate the live views and never snapshot. + +The exclusion flag is only consulted for layers inside the captured subtree, +so a snapshot rooted below the flagged canvas still includes the content. By +`setViewToSnapshot` time the screen's children are already unmounted (only +the rendered pixels survive on the render server), so the patch captures the +secure subtrees in `willBeUnmountedInUpcomingTransaction` - before the +transaction's mutations apply - stashes them on the screen view via an +associated object, and composites them over the main snapshot at their +converted frames. Each overlay is re-wrapped in a fresh secure canvas so +screenshots/recordings taken during the transition still exclude it. + +Known limitation: capturing AVPlayer-backed content this way is racy (the +frozen video is sometimes blank); the overlay still covers the hidden +fallback either way. Plain views (the Follow button) capture reliably. + +Verified in a minimal repro (Expo 57 / RN 0.86 / RNS 4.26 / New Arch) at +~/work/rns-secure-pop-repro: zero fallback frames across recorded JS pops +with the patch, ~700ms of visible fallback without it. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fda57cac7c..1cfb8bb28c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -231,7 +231,7 @@ patchedDependencies: react-native-drawer-layout@4.2.3: 74f2c043cc22ab87054f219e7c7373a509b779b18bfa79d27e7d051d73355130 react-native-keyboard-controller@1.21.9: ac52bf7502ff3ad34a8594b5e1a916b96bf87a2523b6abc87c31f03607d52271 react-native-pager-view@6.8.0: c8316acd33c9aef6531e8c272c2bfab7bd02af1255969eeaab2bad5ab48531cc - react-native-screens@4.26.2: ba3295d44434a729f143a6b2c24e4a9b2f911ab200b2bc47e46cdfeaa1536f7c + react-native-screens@4.26.2: 64db79e069eed40559b3621792683842e9785a55a8617d138459817cf27b1926 react-native-svg@15.15.4: ae309e9542214f5ae54935e253dedd236765feedac7be343f81d532d7fe09310 react-native@0.86.0: 239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06 @@ -346,13 +346,13 @@ importers: version: 2.2.0(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1)) '@react-navigation/bottom-tabs': specifier: ^7.15.5 - version: 7.16.0(e010b3b7e876375fdd4841f6f289d0a2) + version: 7.16.0(b84f2744bb45878bbf4b7905dbd795ed) '@react-navigation/native': specifier: ^7.1.33 version: 7.2.4(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) '@react-navigation/native-stack': specifier: ^7.14.4 - version: 7.15.0(e010b3b7e876375fdd4841f6f289d0a2) + version: 7.15.0(b84f2744bb45878bbf4b7905dbd795ed) '@sentry/react-native': specifier: ~8.18.0 version: 8.18.0(@expo/env@2.4.2(supports-color@8.1.1))(dotenv@16.6.1)(expo@57.0.8)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) @@ -670,7 +670,7 @@ importers: version: 5.7.0(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) react-native-screens: specifier: 4.26.2 - version: 4.26.2(patch_hash=ba3295d44434a729f143a6b2c24e4a9b2f911ab200b2bc47e46cdfeaa1536f7c)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) + version: 4.26.2(patch_hash=64db79e069eed40559b3621792683842e9785a55a8617d138459817cf27b1926)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) react-native-scroll-forwarder: specifier: link:./modules/react-native-scroll-forwarder version: link:modules/react-native-scroll-forwarder @@ -715,7 +715,7 @@ importers: version: 2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) sonner-native: specifier: 0.26.4 - version: 0.26.4(a1115538eb9b7f01f00730be61406201) + version: 0.26.4(6d731ba3ee1df1ed81210cada156b13a) tippy.js: specifier: ^6.3.7 version: 6.3.7 @@ -13111,7 +13111,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@react-navigation/bottom-tabs@7.16.0(e010b3b7e876375fdd4841f6f289d0a2)': + '@react-navigation/bottom-tabs@7.16.0(b84f2744bb45878bbf4b7905dbd795ed)': dependencies: '@react-navigation/elements': 2.9.17(6eb0e0bcf95273feb037f25c3e10784e) '@react-navigation/native': 7.2.4(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) @@ -13119,7 +13119,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1) react-native-safe-area-context: 5.7.0(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) - react-native-screens: 4.26.2(patch_hash=ba3295d44434a729f143a6b2c24e4a9b2f911ab200b2bc47e46cdfeaa1536f7c)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) + react-native-screens: 4.26.2(patch_hash=64db79e069eed40559b3621792683842e9785a55a8617d138459817cf27b1926)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) sf-symbols-typescript: 2.2.0 transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -13146,7 +13146,7 @@ snapshots: use-latest-callback: 0.2.6(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) - '@react-navigation/native-stack@7.15.0(e010b3b7e876375fdd4841f6f289d0a2)': + '@react-navigation/native-stack@7.15.0(b84f2744bb45878bbf4b7905dbd795ed)': dependencies: '@react-navigation/elements': 2.9.17(6eb0e0bcf95273feb037f25c3e10784e) '@react-navigation/native': 7.2.4(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) @@ -13154,7 +13154,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1) react-native-safe-area-context: 5.7.0(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) - react-native-screens: 4.26.2(patch_hash=ba3295d44434a729f143a6b2c24e4a9b2f911ab200b2bc47e46cdfeaa1536f7c)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) + react-native-screens: 4.26.2(patch_hash=64db79e069eed40559b3621792683842e9785a55a8617d138459817cf27b1926)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) sf-symbols-typescript: 2.2.0 warn-once: 0.1.1 transitivePeerDependencies: @@ -18552,7 +18552,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1) - react-native-screens@4.26.2(patch_hash=ba3295d44434a729f143a6b2c24e4a9b2f911ab200b2bc47e46cdfeaa1536f7c)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3): + react-native-screens@4.26.2(patch_hash=64db79e069eed40559b3621792683842e9785a55a8617d138459817cf27b1926)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3): dependencies: react: 19.2.3 react-freeze: 1.0.4(react@19.2.3) @@ -19164,14 +19164,14 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner-native@0.26.4(a1115538eb9b7f01f00730be61406201): + sonner-native@0.26.4(6d731ba3ee1df1ed81210cada156b13a): dependencies: react: 19.2.3 react-native: 0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1) react-native-gesture-handler: 2.32.0(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) react-native-reanimated: 4.6.0(92d1a74bc123f334ae9968fa1c80814f) react-native-safe-area-context: 5.7.0(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) - react-native-screens: 4.26.2(patch_hash=ba3295d44434a729f143a6b2c24e4a9b2f911ab200b2bc47e46cdfeaa1536f7c)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) + react-native-screens: 4.26.2(patch_hash=64db79e069eed40559b3621792683842e9785a55a8617d138459817cf27b1926)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) react-native-svg: 15.15.4(patch_hash=ae309e9542214f5ae54935e253dedd236765feedac7be343f81d532d7fe09310)(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3) react-native-worklets: 0.12.1(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(react-native@0.86.0(patch_hash=239208992c380d6785576d1fae2e3f60f60f509d7b09d56bf552be29d6c42a06)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1)