react-native-screens 5.0.0-alpha.1 → 5.0.0-alpha.3

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 (585) hide show
  1. package/Package.swift +87 -0
  2. package/README.md +0 -8
  3. package/RNScreens.podspec +2 -6
  4. package/android/build.gradle +26 -1
  5. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +5 -0
  6. package/android/src/main/cpp/NativeProxy.cpp +30 -6
  7. package/android/src/main/cpp/NativeProxy.h +7 -1
  8. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  9. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +8 -0
  10. package/android/src/main/java/com/swmansion/rnscreens/common/container/ContainerItem.kt +13 -1
  11. package/android/src/main/java/com/swmansion/rnscreens/common/text/ReactTextAppearance.kt +62 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearance.kt +20 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearanceDefaults.kt +65 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/helpers/PropIconResolver.kt +17 -23
  15. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +25 -7
  16. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +2 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackFragment.kt +39 -10
  18. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenViewManager.kt +5 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAppearanceCoordinator.kt → native/coordinator/FormSheetAppearanceCoordinator.kt} +2 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetBehaviorController.kt → native/coordinator/FormSheetBehaviorController.kt} +74 -19
  21. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetDimensionsCoordinator.kt +159 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetKeyboardCoordinator.kt +101 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetNativeDismissCoordinator.kt +44 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetAvailableHeightProvider.kt +44 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContainer.kt → native/core/FormSheetContainer.kt} +1 -1
  26. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialog.kt +115 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialogManager.kt +89 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeDelegate.kt → native/interfaces/FormSheetContentSizeChangeDelegate.kt} +1 -1
  29. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeProvider.kt → native/interfaces/FormSheetContentSizeChangeProvider.kt} +1 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDialogEventEmitter.kt → native/interfaces/FormSheetDialogEventEmitter.kt} +5 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetConfig.kt → native/model/FormSheetConfig.kt} +5 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/model/FormSheetDetents.kt +152 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAnimatorFactory.kt → native/presentation/FormSheetAnimatorFactory.kt} +9 -10
  34. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetDimmingManager.kt +115 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetDismissalOrigin.kt +22 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentation.kt +173 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentationManager.kt +290 -0
  38. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetPresentationState.kt → native/presentation/FormSheetPresentationState.kt} +2 -2
  39. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetStackRegistry.kt +28 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapper.kt → react/contentwrapper/FormSheetContentWrapper.kt} +3 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapperViewManager.kt → react/contentwrapper/FormSheetContentWrapperViewManager.kt} +1 -1
  42. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDetentChangedEvent.kt → react/event/FormSheetDetentChangedEvent.kt} +1 -1
  43. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidAppearEvent.kt → react/event/FormSheetDidAppearEvent.kt} +1 -1
  44. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidDisappearEvent.kt → react/event/FormSheetDidDisappearEvent.kt} +1 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/react/event/FormSheetDismissEvent.kt +29 -0
  46. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetNativeDismissEvent.kt → react/event/FormSheetNativeDismissEvent.kt} +1 -1
  47. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/react/event/FormSheetNativeDismissPreventedEvent.kt +29 -0
  48. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetSyncFlushEvent.kt → react/event/FormSheetSyncFlushEvent.kt} +1 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillAppearEvent.kt → react/event/FormSheetWillAppearEvent.kt} +1 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillDisappearEvent.kt → react/event/FormSheetWillDisappearEvent.kt} +1 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentView.kt → react/host/FormSheetContentView.kt} +3 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHost.kt → react/host/FormSheetHost.kt} +6 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostEventEmitter.kt → react/host/FormSheetHostEventEmitter.kt} +23 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostViewManager.kt → react/host/FormSheetHostViewManager.kt} +13 -2
  55. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +380 -457
  56. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderBackPressHandler.kt +11 -0
  57. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +150 -182
  58. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderFrameSynchronizer.kt +63 -0
  59. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +240 -0
  60. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderAppBarLayoutBehavior.kt → appbar/StackHeaderAppBarLayoutBehavior.kt} +1 -1
  61. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderContentScrimDrawable.kt +36 -0
  62. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderScrollingViewBehavior.kt → appbar/StackHeaderScrollingViewBehavior.kt} +1 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderCollapsedTitleGravityMode.kt +6 -0
  64. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +192 -167
  65. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +393 -13
  66. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +0 -4
  67. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +33 -3
  68. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderDelegate.kt +0 -7
  69. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +9 -3
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +195 -0
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuController.kt +448 -0
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuDelegate.kt +10 -0
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +43 -21
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuConfig.kt +8 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuElementConfig.kt → model/StackHeaderToolbarMenuElementConfig.kt} +1 -1
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuGroupConfig.kt → model/StackHeaderToolbarMenuGroupConfig.kt} +1 -1
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuGroupMetadata.kt +11 -0
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemConfig.kt → model/StackHeaderToolbarMenuItemConfig.kt} +2 -4
  79. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemDefaults.kt → model/StackHeaderToolbarMenuItemDefaults.kt} +1 -1
  80. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemIconSource.kt → model/StackHeaderToolbarMenuItemIconSource.kt} +1 -1
  81. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemShowAsAction.kt → model/StackHeaderToolbarMenuItemShowAsAction.kt} +1 -1
  82. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemType.kt → model/StackHeaderToolbarMenuItemType.kt} +1 -1
  83. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuModel.kt +180 -0
  84. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarFieldUpdate.kt → update/StackHeaderToolbarFieldUpdate.kt} +1 -1
  85. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementOptions.kt +84 -0
  86. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +15 -0
  87. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +11 -0
  88. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +18 -0
  89. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuUpdateQueue.kt → update/StackHeaderToolbarMenuUpdateQueue.kt} +24 -52
  90. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueueDelegate.kt +9 -0
  91. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +103 -3
  92. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +13 -0
  93. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHostViewManager.kt +14 -0
  94. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +5 -0
  95. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +20 -1
  96. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragmentDelegate.kt +12 -0
  97. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +2 -4
  98. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/MenuHelpers.kt +5 -23
  99. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +46 -25
  100. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +10 -0
  101. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHostA11yCoordinator.kt +23 -2
  102. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +17 -0
  103. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenFragment.kt +3 -0
  104. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +7 -0
  105. package/android/src/main/java/com/swmansion/rnscreens/utils/StyleUtils.kt +22 -0
  106. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_available_space.xml +8 -0
  107. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_entire_space.xml +8 -0
  108. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_available_space.xml +8 -0
  109. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_entire_space.xml +8 -0
  110. package/common/cpp/react/renderer/components/rnscreens/legacy/RNSScreenShadowNode.cpp +10 -5
  111. package/cpp/legacy/RNSScreenRemovalListener.cpp +31 -1
  112. package/cpp/legacy/RNSScreenRemovalListener.h +18 -3
  113. package/ios/RNSEnums.h +2 -2
  114. package/ios/RNSOrientationProviding.h +0 -2
  115. package/ios/RNSReactMountingTransactionObserving.h +15 -0
  116. package/ios/conversion/RNSConversions.h +7 -108
  117. package/ios/legacy/RNSBarButtonItem.mm +12 -5
  118. package/ios/legacy/RNSFullWindowOverlay.mm +1 -1
  119. package/ios/legacy/RNSModalScreen.mm +1 -1
  120. package/ios/legacy/RNSScreen.h +8 -1
  121. package/ios/legacy/RNSScreen.mm +47 -36
  122. package/ios/legacy/RNSScreenContentWrapper.mm +9 -0
  123. package/ios/legacy/RNSScreenFooter.mm +2 -0
  124. package/ios/legacy/RNSScreenStack.mm +9 -4
  125. package/ios/legacy/RNSScreenStackHeaderConfig.mm +3 -1
  126. package/ios/legacy/RNSScreenStackHeaderSubview.mm +1 -1
  127. package/ios/legacy/RNSScreenWindowTraits.mm +5 -13
  128. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.h +1 -3
  129. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.mm +11 -22
  130. package/ios/modals/form-sheet/RNSFormSheetContentController.h +1 -1
  131. package/ios/modals/form-sheet/RNSFormSheetContentController.mm +7 -18
  132. package/ios/modals/form-sheet/RNSFormSheetContentWrapperComponentView.mm +9 -0
  133. package/ios/modals/form-sheet/RNSFormSheetHostComponentView.mm +4 -4
  134. package/ios/modals/form-sheet/RNSFormSheetHostShadowStateProxy.mm +2 -2
  135. package/ios/modals/form-sheet/RNSFormSheetUpdateFlags.h +3 -0
  136. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +2 -2
  137. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.h +17 -0
  138. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.mm +57 -0
  139. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.h +28 -0
  140. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.mm +64 -0
  141. package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.mm +2 -3
  142. package/ios/split/RNSSplitAppearanceApplicator.h +36 -0
  143. package/ios/split/RNSSplitAppearanceApplicator.mm +182 -0
  144. package/ios/split/RNSSplitAppearanceCoordinator.h +26 -0
  145. package/ios/split/RNSSplitAppearanceCoordinator.mm +27 -0
  146. package/ios/split/RNSSplitAppearanceUpdateFlags.h +14 -0
  147. package/ios/split/RNSSplitHostComponentEventEmitter.h +1 -0
  148. package/ios/split/RNSSplitHostComponentEventEmitter.mm +1 -1
  149. package/ios/split/RNSSplitHostComponentView.h +5 -15
  150. package/ios/split/RNSSplitHostComponentView.mm +56 -7
  151. package/ios/split/RNSSplitHostController.h +105 -0
  152. package/ios/split/RNSSplitHostController.mm +492 -0
  153. package/ios/split/RNSSplitHostProviders.h +67 -0
  154. package/ios/split/RNSSplitNavigationController.h +31 -0
  155. package/ios/split/RNSSplitNavigationController.mm +44 -0
  156. package/ios/split/RNSSplitNavigationControllerFrameObserver.h +32 -0
  157. package/ios/split/RNSSplitNavigationControllerFrameObserver.mm +80 -0
  158. package/ios/split/RNSSplitNavigationControllerFrameOriginChangeDelegate.h +15 -0
  159. package/ios/split/RNSSplitScreenComponentView.h +0 -39
  160. package/ios/split/RNSSplitScreenComponentView.mm +35 -19
  161. package/ios/split/RNSSplitScreenController.h +68 -0
  162. package/ios/split/RNSSplitScreenController.mm +113 -0
  163. package/ios/split/RNSSplitScreenShadowStateProxy.h +1 -40
  164. package/ios/split/RNSSplitScreenShadowStateProxy.mm +1 -26
  165. package/ios/split/conversion/RNSConversions-SplitView.h +56 -0
  166. package/ios/{conversion → split/conversion}/RNSConversions-SplitView.mm +4 -1
  167. package/ios/stack/conversion/RNSConversions-Stack.h +32 -0
  168. package/ios/stack/conversion/RNSConversions-Stack.mm +55 -0
  169. package/ios/stack/header/RNSStackHeaderAppearanceMapper.h +26 -0
  170. package/ios/stack/header/RNSStackHeaderAppearanceMapper.mm +88 -0
  171. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +11 -1
  172. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +108 -38
  173. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +9 -0
  174. package/ios/stack/header/RNSStackHeaderConfigShadowStateProxy.mm +1 -1
  175. package/ios/stack/header/RNSStackHeaderIconResolver.mm +7 -0
  176. package/ios/stack/header/RNSStackHeaderItemComponentView.h +3 -1
  177. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +15 -2
  178. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +2 -0
  179. package/ios/stack/header/RNSStackHeaderItemShadowStateProxy.mm +1 -1
  180. package/ios/stack/header/RNSStackHeaderItemSpacerComponentView.mm +2 -1
  181. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +9 -0
  182. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +15 -0
  183. package/ios/stack/header/RNSStackHeaderMenuFinder.h +18 -3
  184. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +21 -3
  185. package/ios/stack/header/RNSStackHeaderMenuMapper.mm +4 -0
  186. package/ios/stack/host/RNSStackHostComponentView.mm +3 -1
  187. package/ios/stack/host/RNSStackNavigationBar.h +25 -0
  188. package/ios/stack/host/RNSStackNavigationBar.mm +80 -0
  189. package/ios/stack/host/RNSStackNavigationBarCoordinator.h +8 -0
  190. package/ios/stack/host/RNSStackNavigationBarCoordinator.mm +11 -0
  191. package/ios/stack/host/RNSStackNavigationController.mm +14 -6
  192. package/ios/stack/host/RNSStackOperation.h +0 -2
  193. package/ios/stack/screen/RNSStackScreenComponentView.mm +9 -4
  194. package/ios/stack/screen/RNSStackScreenController.mm +12 -0
  195. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +14 -1
  196. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +159 -28
  197. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +40 -9
  198. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +1 -1
  199. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +4 -1
  200. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +5 -2
  201. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm +1 -1
  202. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm +1 -1
  203. package/ios/tabs/conversion/RNSConversions-Tabs.h +78 -0
  204. package/ios/{conversion → tabs/conversion}/RNSConversions-Tabs.mm +8 -71
  205. package/ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h +1 -1
  206. package/ios/tabs/host/RNSTabBarController.h +5 -12
  207. package/ios/tabs/host/RNSTabBarController.mm +1 -1
  208. package/ios/tabs/host/RNSTabsHostComponentView.h +2 -0
  209. package/ios/tabs/host/RNSTabsHostComponentView.mm +10 -3
  210. package/ios/tabs/host/RNSTabsHostEventEmitter.mm +1 -1
  211. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +20 -5
  212. package/ios/utils/RNSDefines.h +3 -0
  213. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +25 -0
  214. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  215. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js +24 -0
  216. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  217. package/lib/commonjs/components/scroll-to-top-guard/index.js +13 -0
  218. package/lib/commonjs/components/scroll-to-top-guard/index.js.map +1 -0
  219. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +34 -19
  220. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  221. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +44 -13
  222. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  223. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  224. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  225. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js +33 -2
  226. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  227. package/lib/commonjs/components/stack/header/utils.js +6 -9
  228. package/lib/commonjs/components/stack/header/utils.js.map +1 -1
  229. package/lib/commonjs/components/stack/host/StackHost.js +9 -6
  230. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  231. package/lib/commonjs/components/stack/index.js.map +1 -1
  232. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +1 -0
  233. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  234. package/lib/commonjs/experimental/index.js +11 -0
  235. package/lib/commonjs/experimental/index.js.map +1 -1
  236. package/lib/commonjs/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  237. package/lib/commonjs/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  238. package/lib/commonjs/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  239. package/lib/commonjs/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  240. package/lib/commonjs/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  241. package/lib/commonjs/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  242. package/lib/commonjs/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  243. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  244. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  245. package/lib/commonjs/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  246. package/lib/commonjs/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  247. package/lib/commonjs/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  248. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +12 -0
  249. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  250. package/lib/commonjs/fabric/split/SplitHostNativeComponent.js.map +1 -1
  251. package/lib/commonjs/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  252. package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  253. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  254. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  255. package/lib/commonjs/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  256. package/lib/commonjs/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  257. package/lib/commonjs/fabric/stack/StackHostNativeComponent.js.map +1 -1
  258. package/lib/commonjs/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  259. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  260. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  261. package/lib/commonjs/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  262. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  263. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  264. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  265. package/lib/commonjs/flags.js +22 -1
  266. package/lib/commonjs/flags.js.map +1 -1
  267. package/lib/commonjs/legacy/components/Screen.js +6 -1
  268. package/lib/commonjs/legacy/components/Screen.js.map +1 -1
  269. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js +5 -0
  270. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  271. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  272. package/lib/commonjs/legacy/components/SearchBar.js +16 -16
  273. package/lib/commonjs/legacy/components/SearchBar.js.map +1 -1
  274. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js +3 -0
  275. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  276. package/lib/commonjs/legacy/gesture-handler/fabricUtils.js.map +1 -1
  277. package/lib/commonjs/legacy/useTransitionProgress.js.map +1 -1
  278. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +20 -0
  279. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  280. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js +18 -0
  281. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  282. package/lib/module/components/scroll-to-top-guard/index.js +2 -0
  283. package/lib/module/components/scroll-to-top-guard/index.js.map +1 -0
  284. package/lib/module/components/stack/header/StackHeaderConfig.android.js +35 -20
  285. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  286. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +48 -17
  287. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  288. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  289. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  290. package/lib/module/components/stack/header/ios/iconUtils.ios.js +31 -2
  291. package/lib/module/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  292. package/lib/module/components/stack/header/utils.js +5 -8
  293. package/lib/module/components/stack/header/utils.js.map +1 -1
  294. package/lib/module/components/stack/host/StackHost.js +9 -6
  295. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  296. package/lib/module/components/stack/index.js.map +1 -1
  297. package/lib/module/components/tabs/host/TabsHost.ios.js +1 -0
  298. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  299. package/lib/module/experimental/index.js +1 -0
  300. package/lib/module/experimental/index.js.map +1 -1
  301. package/lib/module/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  302. package/lib/module/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  303. package/lib/module/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  304. package/lib/module/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  305. package/lib/module/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  306. package/lib/module/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  307. package/lib/module/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  308. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  309. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  310. package/lib/module/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  311. package/lib/module/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  312. package/lib/module/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  313. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +7 -0
  314. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  315. package/lib/module/fabric/split/SplitHostNativeComponent.js.map +1 -1
  316. package/lib/module/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  317. package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  318. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  319. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  320. package/lib/module/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  321. package/lib/module/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  322. package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
  323. package/lib/module/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  324. package/lib/module/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  325. package/lib/module/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  326. package/lib/module/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  327. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  328. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  329. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  330. package/lib/module/flags.js +22 -1
  331. package/lib/module/flags.js.map +1 -1
  332. package/lib/module/legacy/components/Screen.js +6 -1
  333. package/lib/module/legacy/components/Screen.js.map +1 -1
  334. package/lib/module/legacy/components/ScreenStackHeaderConfig.js +5 -0
  335. package/lib/module/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  336. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  337. package/lib/module/legacy/components/SearchBar.js +17 -17
  338. package/lib/module/legacy/components/SearchBar.js.map +1 -1
  339. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js +4 -0
  340. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  341. package/lib/module/legacy/gesture-handler/fabricUtils.js.map +1 -1
  342. package/lib/module/legacy/useTransitionProgress.js.map +1 -1
  343. package/lib/module/private/hooks/useRenderDebugInfo.js.map +1 -1
  344. package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +3 -3
  345. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts +5 -2
  346. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts.map +1 -1
  347. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts +15 -0
  348. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts.map +1 -0
  349. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts +12 -0
  350. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts.map +1 -0
  351. package/lib/typescript/components/scroll-to-top-guard/index.d.ts +2 -0
  352. package/lib/typescript/components/scroll-to-top-guard/index.d.ts.map +1 -0
  353. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  354. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +639 -20
  355. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  356. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  357. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +239 -2
  358. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  359. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +2 -2
  360. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +5 -2
  361. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +1 -1
  362. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  363. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +2 -0
  364. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  365. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts +3 -0
  366. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts.map +1 -1
  367. package/lib/typescript/components/stack/header/utils.d.ts +1 -2
  368. package/lib/typescript/components/stack/header/utils.d.ts.map +1 -1
  369. package/lib/typescript/components/stack/host/StackHost.d.ts +1 -1
  370. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  371. package/lib/typescript/components/stack/host/StackHost.types.d.ts +26 -2
  372. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  373. package/lib/typescript/components/stack/host/StackHost.web.d.ts +6 -2
  374. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  375. package/lib/typescript/components/stack/index.d.ts +2 -2
  376. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  377. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts +5 -2
  378. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts.map +1 -1
  379. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  380. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +16 -0
  381. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  382. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +3 -0
  383. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -1
  384. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +5 -2
  385. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +1 -1
  386. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts +7 -3
  387. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts.map +1 -1
  388. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +5 -2
  389. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +1 -1
  390. package/lib/typescript/experimental/index.d.ts +1 -0
  391. package/lib/typescript/experimental/index.d.ts.map +1 -1
  392. package/lib/typescript/fabric/NativeScreensModule.d.ts +1 -1
  393. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts +2 -2
  394. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts.map +1 -1
  395. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts +2 -2
  396. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts.map +1 -1
  397. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts +3 -2
  398. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts.map +1 -1
  399. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts +2 -2
  400. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts.map +1 -1
  401. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts +2 -2
  402. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts.map +1 -1
  403. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts +2 -2
  404. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts.map +1 -1
  405. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts +3 -2
  406. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts.map +1 -1
  407. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts +2 -2
  408. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts.map +1 -1
  409. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts +3 -3
  410. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  411. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -2
  412. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  413. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +2 -2
  414. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  415. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts +6 -6
  416. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts.map +1 -1
  417. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts +2 -2
  418. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts.map +1 -1
  419. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts +2 -2
  420. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts.map +1 -1
  421. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts +2 -2
  422. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts.map +1 -1
  423. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts +6 -0
  424. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts.map +1 -0
  425. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts +1 -1
  426. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts.map +1 -1
  427. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts +2 -2
  428. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts.map +1 -1
  429. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +53 -0
  430. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
  431. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +27 -2
  432. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  433. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +4 -2
  434. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  435. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts +2 -2
  436. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts.map +1 -1
  437. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts +2 -2
  438. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts.map +1 -1
  439. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +4 -2
  440. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
  441. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts +2 -2
  442. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts.map +1 -1
  443. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts +2 -2
  444. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts.map +1 -1
  445. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts +2 -2
  446. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts.map +1 -1
  447. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts +2 -2
  448. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts.map +1 -1
  449. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +3 -2
  450. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  451. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +2 -2
  452. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  453. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +2 -2
  454. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  455. package/lib/typescript/flags.d.ts +13 -0
  456. package/lib/typescript/flags.d.ts.map +1 -1
  457. package/lib/typescript/legacy/TransitionProgressContext.d.ts +1 -1
  458. package/lib/typescript/legacy/TransitionProgressContext.d.ts.map +1 -1
  459. package/lib/typescript/legacy/components/Screen.d.ts +5 -3
  460. package/lib/typescript/legacy/components/Screen.d.ts.map +1 -1
  461. package/lib/typescript/legacy/components/Screen.web.d.ts +10 -2
  462. package/lib/typescript/legacy/components/Screen.web.d.ts.map +1 -1
  463. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts +5 -2
  464. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts.map +1 -1
  465. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts +5 -2
  466. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts.map +1 -1
  467. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts +5 -2
  468. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts.map +1 -1
  469. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts +10 -3
  470. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts.map +1 -1
  471. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts +10 -3
  472. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts.map +1 -1
  473. package/lib/typescript/legacy/components/ScreenStack.web.d.ts +5 -2
  474. package/lib/typescript/legacy/components/ScreenStack.web.d.ts.map +1 -1
  475. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts +3 -1
  476. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts.map +1 -1
  477. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +3 -2
  478. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  479. package/lib/typescript/legacy/components/SearchBar.d.ts +3 -3
  480. package/lib/typescript/legacy/components/SearchBar.d.ts.map +1 -1
  481. package/lib/typescript/legacy/components/SearchBar.web.d.ts +5 -2
  482. package/lib/typescript/legacy/components/SearchBar.web.d.ts.map +1 -1
  483. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +15 -12
  484. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  485. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts +3 -2
  486. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts.map +1 -1
  487. package/lib/typescript/legacy/types.d.ts +25 -5
  488. package/lib/typescript/legacy/types.d.ts.map +1 -1
  489. package/lib/typescript/legacy/useTransitionProgress.d.ts +2 -5
  490. package/lib/typescript/legacy/useTransitionProgress.d.ts.map +1 -1
  491. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts +2 -2
  492. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts.map +1 -1
  493. package/package.json +18 -17
  494. package/react-native.config.js +3 -0
  495. package/src/components/modals/form-sheet/FormSheet.types.ts +3 -3
  496. package/src/components/scroll-to-top-guard/ScrollToTopGuard.ios.tsx +17 -0
  497. package/src/components/scroll-to-top-guard/ScrollToTopGuard.tsx +18 -0
  498. package/src/components/scroll-to-top-guard/index.ts +1 -0
  499. package/src/components/stack/header/StackHeaderConfig.android.tsx +48 -23
  500. package/src/components/stack/header/StackHeaderConfig.android.types.ts +660 -20
  501. package/src/components/stack/header/StackHeaderConfig.ios.tsx +77 -23
  502. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +251 -2
  503. package/src/components/stack/header/StackHeaderConfig.types.ts +2 -2
  504. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +1 -23
  505. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +2 -0
  506. package/src/components/stack/header/ios/iconUtils.ios.ts +38 -2
  507. package/src/components/stack/header/utils.ts +6 -11
  508. package/src/components/stack/host/StackHost.tsx +4 -2
  509. package/src/components/stack/host/StackHost.types.ts +28 -4
  510. package/src/components/stack/index.ts +6 -1
  511. package/src/components/tabs/host/TabsHost.ios.tsx +1 -0
  512. package/src/components/tabs/host/TabsHost.ios.types.ts +16 -0
  513. package/src/components/tabs/host/TabsHost.types.ts +3 -0
  514. package/src/components/tabs/screen/TabsScreen.types.ts +7 -3
  515. package/src/experimental/index.ts +1 -0
  516. package/src/fabric/ScrollViewMarkerNativeComponent.ts +8 -2
  517. package/src/fabric/legacy/FullWindowOverlayNativeComponent.ts +6 -2
  518. package/src/fabric/legacy/ModalScreenNativeComponent.ts +8 -2
  519. package/src/fabric/legacy/ScreenContainerNativeComponent.ts +5 -2
  520. package/src/fabric/legacy/ScreenContentWrapperNativeComponent.ts +2 -2
  521. package/src/fabric/legacy/ScreenFooterNativeComponent.ts +5 -2
  522. package/src/fabric/legacy/ScreenNativeComponent.ts +8 -2
  523. package/src/fabric/legacy/ScreenNavigationContainerNativeComponent.ts +2 -2
  524. package/src/fabric/legacy/ScreenStackHeaderConfigNativeComponent.ts +8 -3
  525. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -2
  526. package/src/fabric/legacy/ScreenStackNativeComponent.ts +10 -2
  527. package/src/fabric/legacy/SearchBarNativeComponent.ts +10 -7
  528. package/src/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.ts +2 -2
  529. package/src/fabric/modals/form-sheet/FormSheetHostNativeComponent.ts +7 -2
  530. package/src/fabric/safe-area/SafeAreaViewNativeComponent.ts +6 -2
  531. package/src/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.ts +10 -0
  532. package/src/fabric/split/SplitHostNativeComponent.ts +5 -2
  533. package/src/fabric/split/SplitScreenNativeComponent.ts +6 -2
  534. package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +81 -1
  535. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +39 -2
  536. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +4 -1
  537. package/src/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.ts +6 -2
  538. package/src/fabric/stack/StackHeaderSubviewAndroidNativeComponent.ts +6 -2
  539. package/src/fabric/stack/StackHostNativeComponent.ts +15 -3
  540. package/src/fabric/stack/StackScreenNativeComponent.ts +6 -2
  541. package/src/fabric/tabs/TabsBottomAccessoryContentNativeComponent.ts +6 -2
  542. package/src/fabric/tabs/TabsBottomAccessoryNativeComponent.ts +6 -2
  543. package/src/fabric/tabs/TabsHostAndroidNativeComponent.ts +7 -2
  544. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +8 -2
  545. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +2 -1
  546. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +2 -1
  547. package/src/flags.ts +26 -0
  548. package/src/legacy/TransitionProgressContext.tsx +1 -1
  549. package/src/legacy/components/Screen.tsx +14 -6
  550. package/src/legacy/components/ScreenStackHeaderConfig.tsx +7 -1
  551. package/src/legacy/components/ScreenStackItem.tsx +3 -4
  552. package/src/legacy/components/SearchBar.tsx +34 -44
  553. package/src/legacy/components/helpers/prepareHeaderBarButtonItems.ts +7 -1
  554. package/src/legacy/gesture-handler/fabricUtils.ts +5 -2
  555. package/src/legacy/types.ts +28 -5
  556. package/src/legacy/useTransitionProgress.tsx +4 -2
  557. package/src/private/hooks/useRenderDebugInfo.tsx +2 -2
  558. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingView.kt +0 -83
  559. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewManager.kt +0 -89
  560. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewPointerEvents.kt +0 -18
  561. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDetents.kt +0 -106
  562. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDialog.kt +0 -60
  563. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDialogManager.kt +0 -138
  564. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDimensionsCoordinator.kt +0 -131
  565. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetNativeDismissCoordinator.kt +0 -25
  566. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetPresentationManager.kt +0 -207
  567. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderAppBarLayout.kt +0 -113
  568. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuConfig.kt +0 -60
  569. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuElementOptions.kt +0 -32
  570. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuGroupMetadata.kt +0 -16
  571. package/ios/ReactMountingTransactionObserving.swift +0 -7
  572. package/ios/bridging/Swift-Bridging.h +0 -7
  573. package/ios/conversion/RNSConversions-Stack.h +0 -32
  574. package/ios/conversion/RNSConversions-Stack.mm +0 -41
  575. package/ios/conversion/always_false.h +0 -31
  576. package/ios/orientation/RNSOrientationProviding.swift +0 -6
  577. package/ios/orientation/RNSOrientationSwift.swift +0 -14
  578. package/ios/split/RNSSplitAppearanceApplicator.swift +0 -199
  579. package/ios/split/RNSSplitAppearanceCoordinator.swift +0 -26
  580. package/ios/split/RNSSplitAppearanceUpdateFlags.swift +0 -11
  581. package/ios/split/RNSSplitHostController.swift +0 -570
  582. package/ios/split/RNSSplitNavigationController.swift +0 -46
  583. package/ios/split/RNSSplitScreenController.swift +0 -133
  584. package/ios/utils/RNSLog.swift +0 -6
  585. /package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.h +0 -0
package/Package.swift ADDED
@@ -0,0 +1,87 @@
1
+ // swift-tools-version: 6.0
2
+ import PackageDescription
3
+
4
+ // Header search paths for quoted cross-directory imports (SPM has no CocoaPods header maps).
5
+ // Keep in sync when adding new ios/ subdirectories that contain headers.
6
+ let headerSearchPaths: [String] = [
7
+ "ios",
8
+ "ios/bridging",
9
+ "ios/conversion",
10
+ "ios/helpers/container",
11
+ "ios/helpers/image",
12
+ "ios/helpers/scroll-view",
13
+ "ios/legacy",
14
+ "ios/legacy/events",
15
+ "ios/legacy/integrations",
16
+ "ios/legacy/utils",
17
+ "ios/modals/form-sheet",
18
+ "ios/modals/utils",
19
+ "ios/safe-area",
20
+ "ios/scroll-to-top-guard",
21
+ "ios/scroll-view-marker",
22
+ "ios/scroll-view-marker/conversion",
23
+ "ios/split",
24
+ "ios/split/conversion",
25
+ "ios/stack",
26
+ "ios/stack/conversion",
27
+ "ios/stack/header",
28
+ "ios/stack/host",
29
+ "ios/stack/screen",
30
+ "ios/tabs",
31
+ "ios/tabs/bottom-accessory",
32
+ "ios/tabs/conversion",
33
+ "ios/tabs/extensions",
34
+ "ios/tabs/host",
35
+ "ios/tabs/screen",
36
+ "ios/utils",
37
+ "ios/utils/extensions",
38
+ "common/cpp",
39
+ "cpp/legacy",
40
+ ]
41
+
42
+ let cSettings: [CSetting] = headerSearchPaths.map { .headerSearchPath($0) }
43
+
44
+ let cxxSettings: [CXXSetting] = [
45
+ .define("DEBUG", .when(configuration: .debug)),
46
+ .define("NDEBUG", .when(configuration: .release)),
47
+ ] + headerSearchPaths.map { .headerSearchPath($0) }
48
+
49
+ let package = Package(
50
+ name: "RNScreens",
51
+ platforms: [.iOS(.v15)],
52
+ products: [
53
+ .library(name: "RNScreens", targets: ["RNScreens"]),
54
+ ],
55
+ dependencies: [
56
+ // Resolved from the autolinker symlink `<app>/ios/build/generated/autolinking/libs/RNScreens`,
57
+ // not from node_modules: `../../../../xcframeworks` -> `<app>/ios/build/xcframeworks`,
58
+ // `../../../ios` -> `<app>/ios/build/generated/ios`. Same layout `npx react-native spm scaffold` emits.
59
+ // Making this self-contained (remote RN package URL + shipping our own codegen output) is blocked
60
+ // on RN publishing a remote SPM package and would require `codegenConfig.includesGeneratedCode`, see:
61
+ // https://github.com/react/react-native/blob/v0.87.1/packages/react-native/scripts/spm/__docs__/spm-header-paths-contract.md#hand-authored-community-library-contract
62
+ .package(name: "ReactNative", path: "../../../../xcframeworks"),
63
+ .package(name: "React-GeneratedCode", path: "../../../ios"),
64
+ ],
65
+ targets: [
66
+ .target(
67
+ name: "RNScreens",
68
+ dependencies: [
69
+ .product(name: "ReactHeaders", package: "ReactNative"),
70
+ .product(name: "ReactNativeHeaders", package: "ReactNative"),
71
+ .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"),
72
+ .product(name: "ReactAppHeaders", package: "React-GeneratedCode"),
73
+ ],
74
+ path: ".",
75
+ exclude: ["ios/RNScreens.xcodeproj"],
76
+ sources: ["ios", "common/cpp", "cpp"],
77
+ publicHeadersPath: "ios",
78
+ cSettings: cSettings,
79
+ cxxSettings: cxxSettings,
80
+ linkerSettings: [
81
+ .linkedFramework("UIKit"),
82
+ .linkedFramework("Foundation"),
83
+ ]
84
+ ),
85
+ ],
86
+ cxxLanguageStandard: .cxx20
87
+ )
package/README.md CHANGED
@@ -254,14 +254,6 @@ There are many ways to contribute to this project. See [CONTRIBUTING](https://gi
254
254
 
255
255
  React native screens library is licensed under [The MIT License](LICENSE).
256
256
 
257
- ## Credits
258
-
259
- This project has been build and is maintained thanks to the support from [Shopify](https://shopify.com), [Expo.io](https://expo.io), and [Software Mansion](https://swmansion.com).
260
-
261
- [![shopify](https://avatars1.githubusercontent.com/u/8085?v=3&s=100 'Shopify.com')](https://shopify.com)
262
- [![expo](https://avatars2.githubusercontent.com/u/12504344?v=3&s=100 'Expo.io')](https://expo.io)
263
- [![swm](https://logo.swmansion.com/logo?color=white&variant=desktop&width=150&tag=react-native-reanimated-github 'Software Mansion')](https://swmansion.com)
264
-
265
257
  ## React Native Screens is created by Software Mansion
266
258
 
267
259
  Since 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues. We can help you build your next dream product – [Hire us](https://swmansion.com/contact/projects?utm_source=screens&utm_medium=readme).
package/RNScreens.podspec CHANGED
@@ -6,7 +6,7 @@ debug_logging_enabled = ENV['RNS_DEBUG_LOGGING'] == '1'
6
6
  use_cxxbridge = ENV['RNS_USE_CXXBRIDGE'] == '1'
7
7
 
8
8
 
9
- source_files_exts = '{h,m,mm,cpp,swift}'
9
+ source_files_exts = '{h,m,mm,cpp}'
10
10
  source_files = ["ios/**/*.#{source_files_exts}"]
11
11
 
12
12
  min_supported_ios_version = "15.1"
@@ -14,17 +14,14 @@ min_supported_tvos_version = "15.1"
14
14
  min_supported_visionos_version = "1.0"
15
15
 
16
16
  rnscreens_cpp_flags = []
17
- rnscreens_swift_flags = []
18
17
 
19
18
  if debug_logging_enabled
20
19
  rnscreens_cpp_flags << "-DRNS_DEBUG_LOGGING=1"
21
- rnscreens_swift_flags << "-DRNS_DEBUG_LOGGING"
22
20
  end
23
21
  rnscreens_cpp_flags << "-DRNS_USE_CXXBRIDGE=1" if use_cxxbridge
24
22
 
25
23
  rnscreens_config = {
26
- 'OTHER_CPLUSPLUSFLAGS' => rnscreens_cpp_flags.join(" "),
27
- 'OTHER_SWIFT_FLAGS' => rnscreens_swift_flags.join(" ")
24
+ 'OTHER_CPLUSPLUSFLAGS' => rnscreens_cpp_flags.join(" ")
28
25
  }
29
26
 
30
27
  rnscreens_config['DEFINES_MODULE'] = 'YES'
@@ -42,7 +39,6 @@ Pod::Spec.new do |s|
42
39
  s.platforms = { :ios => min_supported_ios_version, :tvos => min_supported_tvos_version, :visionos => min_supported_visionos_version }
43
40
  s.source = { :git => "https://github.com/software-mansion/react-native-screens.git", :tag => "#{s.version}" }
44
41
  s.source_files = source_files
45
- s.project_header_files = "ios/bridging/Swift-Bridging.h"
46
42
  s.requires_arc = true
47
43
 
48
44
  if debug_logging_enabled
@@ -82,7 +82,27 @@ if (isRunningInContextOfScreensRepo()) {
82
82
  apply plugin: "com.facebook.react"
83
83
  }
84
84
  apply plugin: 'com.android.library'
85
- apply plugin: 'kotlin-android'
85
+
86
+ // AGP 9 ships built-in Kotlin support enabled by default. When it is active, AGP compiles
87
+ // our Kotlin sources itself and *additionally* applying the Kotlin Android plugin fails the build.
88
+ // Consuming apps may opt out with `android.builtInKotlin=false` in which case AGP does NOT
89
+ // provide Kotlin and we MUST apply the plugin ourselves.
90
+ // AGP < 9 had no built-in Kotlin at all, so we always apply it there.
91
+ def shouldEnableAgpFallback() {
92
+ def agpMajorVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger()
93
+ if (agpMajorVersion <= 8) {
94
+ return true
95
+ }
96
+
97
+ def propertyVal = providers.gradleProperty("android.builtInKotlin").orNull
98
+ def isBuiltInKotlinEnabled = propertyVal != null ? propertyVal.toBoolean() : true
99
+
100
+ return !isBuiltInKotlinEnabled
101
+ }
102
+
103
+ if (shouldEnableAgpFallback()) {
104
+ apply plugin: 'kotlin-android'
105
+ }
86
106
 
87
107
  def reactNativeArchitectures() {
88
108
  def value = project.getProperties().get("reactNativeArchitectures")
@@ -165,6 +185,11 @@ android {
165
185
  }
166
186
  sourceSets.main {
167
187
  ext.androidResDir = "src/main/res"
188
+ kotlin {
189
+ srcDirs += [
190
+ "src/fabric/java",
191
+ ]
192
+ }
168
193
  java {
169
194
  srcDirs += [
170
195
  "src/fabric/java",
@@ -64,6 +64,11 @@ class NativeProxy {
64
64
 
65
65
  val screen = weakScreeRef.get()
66
66
  if (screen is Screen) {
67
+ // Fabric's mounting transaction removes the screen on a Choreographer frame callback,
68
+ // which can execute before `startRemovalTransition` (scheduled via `Handler.post`).
69
+ // To prevent `Screen.isBeingRemoved` from being read as false during teardown,
70
+ // we must set this flag synchronously here.
71
+ screen.markAsBeingRemoved()
67
72
  val isScheduled =
68
73
  screen.post {
69
74
  screen.startRemovalTransition()
@@ -2,6 +2,7 @@
2
2
  #include <react/fabric/Binding.h>
3
3
  #include <react/renderer/scheduler/Scheduler.h>
4
4
 
5
+ #include <memory>
5
6
  #include <string>
6
7
 
7
8
  #include "NativeProxy.h"
@@ -11,6 +12,19 @@ using namespace react;
11
12
 
12
13
  namespace rnscreens {
13
14
 
15
+ namespace {
16
+ // Keep this listener process-lifetime to avoid races during initialization,
17
+ // when nativeAddMutationsListener() can be called concurrently from different
18
+ // threads. A function-local static initializes thread-safely, and an immortal
19
+ // instance suits core's delegate list, which is append-only. For more details:
20
+ // https://github.com/software-mansion/react-native-screens/pull/4413
21
+ const std::shared_ptr<RNSScreenRemovalListener> &removalListener() {
22
+ static const std::shared_ptr<RNSScreenRemovalListener> instance =
23
+ std::make_shared<RNSScreenRemovalListener>();
24
+ return instance;
25
+ }
26
+ } // namespace
27
+
14
28
  NativeProxy::NativeProxy(jni::alias_ref<NativeProxy::javaobject> jThis)
15
29
  : javaPart_(jni::make_global(jThis)) {}
16
30
 
@@ -32,13 +46,18 @@ void NativeProxy::nativeAddMutationsListener(
32
46
  auto uiManager =
33
47
  fabricUIManager->getBinding()->getScheduler()->getUIManager();
34
48
 
35
- if (!screenRemovalListener_) {
36
- screenRemovalListener_ =
37
- std::make_shared<RNSScreenRemovalListener>([this](int tag) {
49
+ {
50
+ // Capture a copy of the global ref, never `this`: the listener outlives
51
+ // this NativeProxy, and the old live read of javaPart_ at call time raced
52
+ // invalidateNative(). installMutex_ keeps the copy from racing the
53
+ // invalidation write and keeps the stored token matching the last install.
54
+ std::lock_guard<std::mutex> lock(installMutex_);
55
+ removalListenerToken_ =
56
+ removalListener()->setListener([javaPart = javaPart_](int tag) {
38
57
  static const auto method =
39
- javaPart_->getClass()->getMethod<void(jint)>(
58
+ javaPart->getClass()->getMethod<void(jint)>(
40
59
  "notifyScreenRemoved");
41
- method(javaPart_, tag);
60
+ method(javaPart, tag);
42
61
  });
43
62
  }
44
63
 
@@ -79,7 +98,7 @@ void NativeProxy::addMountingCoordinatorIfNeeded(
79
98
  });
80
99
 
81
100
  if (!wasRegistered) {
82
- coordinator->setMountingOverrideDelegate(screenRemovalListener_);
101
+ coordinator->setMountingOverrideDelegate(removalListener());
83
102
  coordinatorsWithMountingOverrides_.push_back(coordinator);
84
103
  }
85
104
  }
@@ -90,6 +109,11 @@ jni::local_ref<NativeProxy::jhybriddata> NativeProxy::initHybrid(
90
109
  }
91
110
 
92
111
  void NativeProxy::invalidateNative() {
112
+ // Disarm before the hybrid is collected; also releases the captured global
113
+ // ref so the Java NativeProxy stays collectable. Serialized with the install
114
+ // path so the token is never stale and javaPart_ is not nulled mid-capture.
115
+ std::lock_guard<std::mutex> lock(installMutex_);
116
+ removalListener()->clearListener(removalListenerToken_);
93
117
  javaPart_ = nullptr;
94
118
  }
95
119
 
@@ -4,6 +4,7 @@
4
4
  #include <react/fabric/JFabricUIManager.h>
5
5
  #include "RNSScreenRemovalListener.h"
6
6
 
7
+ #include <cstdint>
7
8
  #include <mutex>
8
9
  #include <string>
9
10
 
@@ -13,7 +14,6 @@ using namespace facebook::jni;
13
14
 
14
15
  class NativeProxy : public jni::HybridClass<NativeProxy> {
15
16
  public:
16
- std::shared_ptr<RNSScreenRemovalListener> screenRemovalListener_;
17
17
  std::vector<std::weak_ptr<const facebook::react::MountingCoordinator>>
18
18
  coordinatorsWithMountingOverrides_;
19
19
  static auto constexpr kJavaDescriptor =
@@ -28,6 +28,12 @@ class NativeProxy : public jni::HybridClass<NativeProxy> {
28
28
 
29
29
  std::mutex coordinatorsMutex_;
30
30
 
31
+ // Serializes callback install (nativeAddMutationsListener) with
32
+ // invalidateNative: the install-time copy of javaPart_ must not race the
33
+ // invalidation write, and the stored token must match the last install.
34
+ std::mutex installMutex_;
35
+ uint64_t removalListenerToken_{0};
36
+
31
37
  explicit NativeProxy(jni::alias_ref<NativeProxy::javaobject> jThis);
32
38
 
33
39
  void nativeAddMutationsListener(
@@ -18,8 +18,8 @@ import com.swmansion.rnscreens.legacy.ScreenStackViewManager
18
18
  import com.swmansion.rnscreens.legacy.ScreenViewManager
19
19
  import com.swmansion.rnscreens.legacy.SearchBarManager
20
20
  import com.swmansion.rnscreens.legacy.utils.ScreenDummyLayoutHelper
21
- import com.swmansion.rnscreens.modals.formsheet.FormSheetContentWrapperViewManager
22
- import com.swmansion.rnscreens.modals.formsheet.FormSheetHostViewManager
21
+ import com.swmansion.rnscreens.modals.formsheet.react.contentwrapper.FormSheetContentWrapperViewManager
22
+ import com.swmansion.rnscreens.modals.formsheet.react.host.FormSheetHostViewManager
23
23
  import com.swmansion.rnscreens.safearea.SafeAreaViewManager
24
24
  import com.swmansion.rnscreens.scrollviewmarker.ScrollViewMarkerViewManager
25
25
  import com.swmansion.rnscreens.stack.header.config.StackHeaderConfigViewManager
@@ -9,4 +9,12 @@ interface Container {
9
9
  * (if any).
10
10
  */
11
11
  fun resolveCurrentContentScrollView(): ViewGroup?
12
+
13
+ /**
14
+ * Asked when this container's whole subtree is about to be natively dismissed,
15
+ * e.g. the screen hosting this container is popped. Returns the item that
16
+ * vetoes the dismissal via `preventNativeDismiss`, or null when nothing
17
+ * in the subtree does.
18
+ */
19
+ fun wantsToPreventStackNativeDismiss(): ContainerItem?
12
20
  }
@@ -2,7 +2,7 @@ package com.swmansion.rnscreens.common.container
2
2
 
3
3
  import android.view.ViewGroup
4
4
 
5
- internal interface ContainerItem {
5
+ interface ContainerItem {
6
6
  // region Nested Container handling
7
7
 
8
8
  /**
@@ -27,4 +27,16 @@ internal interface ContainerItem {
27
27
  fun findContentScrollView(): ViewGroup?
28
28
 
29
29
  // endregion
30
+
31
+ // region Native dismissal
32
+
33
+ /**
34
+ * Asked when this item (screen) is about to be natively dismissed together
35
+ * with its subtree. The nested container (if any) is consulted first; its
36
+ * non-null answer wins, otherwise the item answers for itself, returning
37
+ * itself when it vetoes the dismissal or null otherwise.
38
+ */
39
+ fun wantsToPreventStackNativeDismiss(): ContainerItem?
40
+
41
+ // endregion
30
42
  }
@@ -0,0 +1,62 @@
1
+ package com.swmansion.rnscreens.common.text
2
+
3
+ import android.content.res.AssetManager
4
+ import android.graphics.Typeface
5
+ import android.os.Build
6
+ import com.facebook.react.common.ReactConstants
7
+ import com.facebook.react.common.assets.ReactFontManager.TypefaceStyle
8
+ import com.facebook.react.views.text.ReactTypefaceUtils
9
+ import kotlin.properties.Delegates
10
+ import kotlin.properties.ReadWriteProperty
11
+
12
+ /**
13
+ * [TextAppearance] driven by React props. Font family, weight and style are kept as the raw
14
+ * React values and turned into a [Typeface]. [onChanged] is invoked whenever a property
15
+ * actually changes value.
16
+ */
17
+ internal class ReactTextAppearance(
18
+ private val assets: AssetManager,
19
+ onChanged: () -> Unit,
20
+ ) : TextAppearance {
21
+ override var color: Int? by changeNotifying(onChanged)
22
+ override var fontSize: Float? by changeNotifying(onChanged)
23
+ internal var fontFamily: String? by changeNotifying(onChanged)
24
+ internal var fontWeight: String? by changeNotifying(onChanged)
25
+ internal var fontStyle: String? by changeNotifying(onChanged)
26
+
27
+ override fun resolveTypeface(base: Typeface): Typeface {
28
+ val weight = ReactTypefaceUtils.parseFontWeight(fontWeight)
29
+ val style = ReactTypefaceUtils.parseFontStyle(fontStyle)
30
+
31
+ if (fontFamily == null && weight == ReactConstants.UNSET && style == ReactConstants.UNSET) {
32
+ return base
33
+ }
34
+
35
+ // ReactFontManager.TypefaceStyle turns an unset weight into 400 and an unset style into
36
+ // "not italic" rather than deriving them from the base. This would drop default styling
37
+ // from base typeface. Resolve both up front so it never receives UNSET style or weight.
38
+ return ReactTypefaceUtils.applyStyles(
39
+ base,
40
+ if (style != ReactConstants.UNSET) style else base.resolveStyle(),
41
+ if (weight != ReactConstants.UNSET) weight else base.resolveWeight(),
42
+ fontFamily,
43
+ assets,
44
+ )
45
+ }
46
+ }
47
+
48
+ private fun <T> changeNotifying(onChanged: () -> Unit): ReadWriteProperty<Any?, T?> =
49
+ Delegates.observable(null) { _, old, new -> if (old != new) onChanged() }
50
+
51
+ /**
52
+ * Numeric weight of this typeface. [Typeface.getWeight] requires API 28; below it only bold
53
+ * can be told apart from regular.
54
+ */
55
+ private fun Typeface.resolveWeight(): Int =
56
+ when {
57
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -> weight
58
+ isBold -> TypefaceStyle.BOLD
59
+ else -> TypefaceStyle.NORMAL
60
+ }
61
+
62
+ private fun Typeface.resolveStyle(): Int = if (isItalic) Typeface.ITALIC else Typeface.NORMAL
@@ -0,0 +1,20 @@
1
+ package com.swmansion.rnscreens.common.text
2
+
3
+ import android.graphics.Typeface
4
+
5
+ /**
6
+ * Provides text styling for some given part of the interface. Interface is React-agnostic. A `null`
7
+ * value means "keep the default".
8
+ */
9
+ internal interface TextAppearance {
10
+ val color: Int?
11
+
12
+ /** Font size in SP. */
13
+ val fontSize: Float?
14
+
15
+ /**
16
+ * Returns the modified typeface based on [base] typeface. Properties that are not overridden
17
+ * are inherited from [base], which is returned unchanged when there are no overrides at all.
18
+ */
19
+ fun resolveTypeface(base: Typeface): Typeface
20
+ }
@@ -0,0 +1,65 @@
1
+ package com.swmansion.rnscreens.common.text
2
+
3
+ import android.content.Context
4
+ import android.graphics.Typeface
5
+ import androidx.annotation.AttrRes
6
+ import com.swmansion.rnscreens.utils.resolveColorAttr
7
+ import com.swmansion.rnscreens.utils.resolveStyleResAttr
8
+
9
+ /**
10
+ * Default text styling of a single title/subtitle slot, resolved from the M3 type-scale
11
+ * style behind [textAppearanceAttr] and the color behind [textColorAttr].
12
+ *
13
+ * Resolved from the style rather than read back from the widget: Material resolves a slot's
14
+ * default typeface asynchronously, so until that lands the widget reports [Typeface.DEFAULT].
15
+ */
16
+ internal class TextAppearanceDefaults(
17
+ val color: Int,
18
+ val textSizePx: Float,
19
+ val typeface: Typeface,
20
+ ) {
21
+ companion object {
22
+ fun resolve(
23
+ context: Context,
24
+ @AttrRes textAppearanceAttr: Int,
25
+ @AttrRes textColorAttr: Int,
26
+ ): TextAppearanceDefaults {
27
+ val appearanceRes = resolveStyleResAttr(context, textAppearanceAttr)
28
+ val attrs = context.obtainStyledAttributes(appearanceRes, APPEARANCE_ATTRS)
29
+ try {
30
+ val textSizePx = attrs.getDimension(IDX_TEXT_SIZE, 0f)
31
+ require(textSizePx > 0f) { "[RNScreens] Text appearance defines no text size." }
32
+
33
+ // android:fontFamily is either a font resource (@font/…, resolvable only
34
+ // asynchronously) or a family name. The M3 type scale always declares a family
35
+ // name (@string/m3_ref_typeface_* — "sans-serif" / "sans-serif-medium"),
36
+ // so we can unconditionally take the synchronous path (Material's own fallback and
37
+ // AppCompatTextHelper do the same).
38
+ val textStyle = attrs.getInt(IDX_TEXT_STYLE, Typeface.NORMAL)
39
+ val typeface =
40
+ attrs.getString(IDX_FONT_FAMILY)?.let { Typeface.create(it, textStyle) }
41
+ ?: Typeface.defaultFromStyle(textStyle)
42
+
43
+ return TextAppearanceDefaults(
44
+ resolveColorAttr(context, textColorAttr),
45
+ textSizePx,
46
+ typeface,
47
+ )
48
+ } finally {
49
+ attrs.recycle()
50
+ }
51
+ }
52
+
53
+ // Framework attr ids are compile-time constants; the array must stay sorted
54
+ // ascending (obtainStyledAttributes requirement).
55
+ private val APPEARANCE_ATTRS =
56
+ intArrayOf(
57
+ android.R.attr.textSize,
58
+ android.R.attr.textStyle,
59
+ android.R.attr.fontFamily,
60
+ )
61
+ private const val IDX_TEXT_SIZE = 0
62
+ private const val IDX_TEXT_STYLE = 1
63
+ private const val IDX_FONT_FAMILY = 2
64
+ }
65
+ }
@@ -1,6 +1,5 @@
1
1
  package com.swmansion.rnscreens.helpers
2
2
 
3
- import android.content.Context
4
3
  import android.graphics.drawable.Drawable
5
4
 
6
5
  /**
@@ -21,27 +20,28 @@ internal sealed interface IconResolution {
21
20
 
22
21
  /**
23
22
  * Stateful, latest-wins icon resolver for a single declaratively-driven icon slot — a `toolbarMenu`
24
- * prop menu item, or the back button — that is re-evaluated on every prop transaction. It
25
- * deduplicates unchanged sources ([IconResolution.Unchanged]) to avoid needless reloads/flicker,
26
- * and drops stale async results so a slow load cannot clobber a newer source.
23
+ * prop menu item, or the back button — that is re-evaluated on every source change. It deduplicates
24
+ * unchanged sources ([IconResolution.Unchanged]) to avoid needless reloads/flicker, and drops stale
25
+ * async results so a slow load cannot clobber a newer source.
26
+ *
27
+ * [load] must invoke its completion callback exactly once — synchronously or asynchronously,
28
+ * always on the main thread — with the loaded drawable, or `null` when the source resolves to
29
+ * no icon or fails to load (see e.g. [resolveImage]).
27
30
  */
28
- internal class PropIconResolver {
31
+ internal class PropIconResolver(
32
+ private val load: (drawableIconResourceName: String?, imageIconUri: String?, onComplete: (Drawable?) -> Unit) -> Unit,
33
+ ) {
29
34
  private var lastDrawableName: String? = null
30
35
  private var lastImageUri: String? = null
31
36
  private var lastEmittedDrawableName: String? = null
32
37
  private var lastEmittedImageUri: String? = null
33
38
 
34
39
  /**
35
- * Resolves an icon from a drawable resource name or an image uri.
36
- *
37
- * The result is delivered to [onResult] synchronously for drawable resources and empty sources,
38
- * and asynchronously for image uris. For image uris, the callback is only invoked if the
39
- * resolved uri is still the latest requested source (stale requests are dropped). On a failed
40
- * image load the latest request still emits [IconResolution.Resolved] with a `null` drawable, so
41
- * the icon is cleared rather than left stale.
40
+ * Resolves an icon from a drawable resource name or an image uri. The result is delivered
41
+ * to [onResult] only if the requested source is still the latest one (stale async results
42
+ * are dropped).
42
43
  */
43
44
  fun resolve(
44
- context: Context,
45
45
  drawableIconResourceName: String?,
46
46
  imageIconUri: String?,
47
47
  onResult: (IconResolution) -> Unit,
@@ -56,16 +56,10 @@ internal class PropIconResolver {
56
56
  }
57
57
  lastEmittedDrawableName = drawableIconResourceName
58
58
  lastEmittedImageUri = imageIconUri
59
- when {
60
- drawableIconResourceName != null ->
61
- onResult(IconResolution.Resolved(getSystemDrawableResource(context, drawableIconResourceName)))
62
- imageIconUri != null ->
63
- loadImage(context, imageIconUri) { drawable ->
64
- if (imageIconUri == lastImageUri && lastDrawableName == null) {
65
- onResult(IconResolution.Resolved(drawable))
66
- }
67
- }
68
- else -> onResult(IconResolution.Resolved(null))
59
+ load(drawableIconResourceName, imageIconUri) { drawable ->
60
+ if (drawableIconResourceName == lastDrawableName && imageIconUri == lastImageUri) {
61
+ onResult(IconResolution.Resolved(drawable))
62
+ }
69
63
  }
70
64
  }
71
65
  }
@@ -71,7 +71,14 @@ class Screen(
71
71
  private set
72
72
  var screenId: String? = null
73
73
  var isStatusBarAnimated: Boolean? = null
74
+
75
+ // Can be set on the mounting coordinator's thread (see `markAsBeingRemoved`), read on the UI thread.
76
+ @Volatile
74
77
  var isBeingRemoved = false
78
+ private set
79
+
80
+ // Keeps `startTransitionRecursive` / `endTransitionRecursive` calls paired. Should be used on UI thread only.
81
+ private var isRemovalTransitionStarted = false
75
82
 
76
83
  // Props for controlling modal presentation
77
84
  var isSheetGrabberVisible: Boolean = false
@@ -439,19 +446,28 @@ class Screen(
439
446
 
440
447
  var nativeBackButtonDismissalEnabled: Boolean = true
441
448
 
449
+ /**
450
+ * Marks this screen as being removed from the native stack. Safe to call off the UI thread;
451
+ * must run before the mount transaction removing this screen executes.
452
+ */
453
+ fun markAsBeingRemoved() {
454
+ isBeingRemoved = true
455
+ }
456
+
442
457
  fun startRemovalTransition() {
443
- if (!isBeingRemoved) {
444
- isBeingRemoved = true
458
+ isBeingRemoved = true
459
+ if (!isRemovalTransitionStarted) {
460
+ isRemovalTransitionStarted = true
445
461
  startTransitionRecursive(this)
446
462
  }
447
463
  }
448
464
 
449
465
  fun endRemovalTransition() {
450
- if (!isBeingRemoved) {
451
- return
466
+ if (isRemovalTransitionStarted) {
467
+ isRemovalTransitionStarted = false
468
+ isBeingRemoved = false
469
+ endTransitionRecursive(this)
452
470
  }
453
- isBeingRemoved = false
454
- endTransitionRecursive(this)
455
471
  }
456
472
 
457
473
  private fun endTransitionRecursive(parent: ViewGroup) {
@@ -479,8 +495,10 @@ class Screen(
479
495
  // It has a custom `getChildDrawingOrder` method which returns
480
496
  // wrong index if we called `startViewTransition` on the views on new arch.
481
497
  // We add a simple View to bump the number of children to make it work.
498
+ // Appended, not inserted at `i`: a filler before the circle inflates the
499
+ // index `onMeasure` caches for it, which then outlives the child it points at.
482
500
  // TODO: find a better way to handle this scenario
483
- it.addView(View(context), i)
501
+ it.addView(View(context))
484
502
  } else {
485
503
  child?.let { view -> it.startViewTransition(view) }
486
504
  }
@@ -282,6 +282,8 @@ class ScreenStack(
282
282
  screenWrappers
283
283
  .asSequence()
284
284
  .dropWhile { it !== visibleBottom } // ignore all screens beneath the visible bottom
285
+ // dismissed screens are already removed above & preloaded ones must stay detached
286
+ .filter { !dismissedWrappers.contains(it) && it.screen.activityState !== Screen.ActivityState.INACTIVE }
285
287
  .forEach { wrapper ->
286
288
  // TODO: It should be enough to dispatch this on commit action once.
287
289
  transaction.add(id, wrapper.fragment).runOnCommit {