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
@@ -1,46 +1,4 @@
1
- package com.swmansion.rnscreens.stack.header.toolbar
2
-
3
- import android.graphics.drawable.Drawable
4
-
5
- /**
6
- * A single toolbar menu element update carried by an `updateToolbarMenuElements`
7
- * view command, before its icon (if any) has been resolved.
8
- */
9
- internal data class StackHeaderToolbarMenuElementRawUpdate(
10
- val id: String,
11
- val options: StackHeaderToolbarMenuElementOptions,
12
- val iconSource: StackHeaderToolbarMenuItemIconSource?,
13
- )
14
-
15
- /**
16
- * A single toolbar menu element update whose icon has already been resolved and merged
17
- * into [options], ready to be applied to the toolbar.
18
- */
19
- internal data class StackHeaderToolbarMenuElementUpdate(
20
- val id: String,
21
- val options: StackHeaderToolbarMenuElementOptions,
22
- )
23
-
24
- /**
25
- * Resolves the icon for a single menu element update.
26
- *
27
- * [onResolved] must be invoked exactly once — synchronously or asynchronously, always on the
28
- * main thread — with the resolved icon to merge into the element's options.
29
- */
30
- internal fun interface StackHeaderToolbarMenuIconResolver {
31
- fun resolve(
32
- iconSource: StackHeaderToolbarMenuItemIconSource,
33
- onResolved: (icon: StackHeaderToolbarFieldUpdate<Drawable>) -> Unit,
34
- )
35
- }
36
-
37
- /**
38
- * Receives a fully-resolved batch of menu element updates, to be applied to the toolbar
39
- * atomically.
40
- */
41
- internal fun interface StackHeaderToolbarMenuUpdateQueueDelegate {
42
- fun onUpdatesResolved(updates: List<StackHeaderToolbarMenuElementUpdate>)
43
- }
1
+ package com.swmansion.rnscreens.stack.header.toolbar.update
44
2
 
45
3
  /**
46
4
  * Serial, FIFO queue for `updateToolbarMenuElements` view command batches.
@@ -65,6 +23,7 @@ internal class StackHeaderToolbarMenuUpdateQueue(
65
23
  private val pendingBatches = ArrayDeque<List<StackHeaderToolbarMenuElementRawUpdate>>()
66
24
  private var isProcessing = false
67
25
  private var isTornDown = false
26
+ private var generation = 0
68
27
 
69
28
  internal fun enqueue(batch: List<StackHeaderToolbarMenuElementRawUpdate>) {
70
29
  if (batch.isEmpty()) {
@@ -76,6 +35,18 @@ internal class StackHeaderToolbarMenuUpdateQueue(
76
35
  }
77
36
  }
78
37
 
38
+ /**
39
+ * Drops every batch that has not been applied yet, including one whose
40
+ * icons are still resolving — its eventual dispatch becomes a no-op. Used
41
+ * when the menu configuration is replaced: commands sent against the old
42
+ * menu must never touch the new one. The queue stays usable.
43
+ */
44
+ internal fun clearPending() {
45
+ pendingBatches.clear()
46
+ generation++
47
+ isProcessing = false
48
+ }
49
+
79
50
  internal fun tearDown() {
80
51
  pendingBatches.clear()
81
52
  isTornDown = true
@@ -90,11 +61,12 @@ internal class StackHeaderToolbarMenuUpdateQueue(
90
61
  return
91
62
  }
92
63
  isProcessing = true
64
+ val batchGeneration = generation
93
65
 
94
66
  val updates = arrayOfNulls<StackHeaderToolbarMenuElementUpdate>(batch.size)
95
67
  var outstanding = batch.size
96
68
 
97
- var isProcessingBatch = true
69
+ var inSyncDispatchLoop = true
98
70
 
99
71
  fun dispatchResolvedBatch() {
100
72
  pendingBatches.removeFirst()
@@ -105,20 +77,20 @@ internal class StackHeaderToolbarMenuUpdateQueue(
105
77
  index: Int,
106
78
  options: StackHeaderToolbarMenuElementOptions,
107
79
  ) {
108
- check(updates[index] == null) {
109
- "[RNScreens] Unexpected duplicated element resolution."
80
+ if (isTornDown || batchGeneration != generation) {
81
+ return
110
82
  }
111
83
 
112
- if (isTornDown) {
113
- return
84
+ check(updates[index] == null) {
85
+ "[RNScreens] Unexpected duplicated element resolution."
114
86
  }
115
87
 
116
- updates[index] = StackHeaderToolbarMenuElementUpdate(batch[index].id, options)
88
+ updates[index] = StackHeaderToolbarMenuElementUpdate(batch[index].id, options, batch[index].checked)
117
89
  outstanding -= 1
118
90
 
119
91
  // A synchronous completion is applied by the loop below; only an asynchronous one
120
92
  // advances the queue processing from here.
121
- if (outstanding == 0 && !isProcessingBatch) {
93
+ if (outstanding == 0 && !inSyncDispatchLoop) {
122
94
  dispatchResolvedBatch()
123
95
  processNext()
124
96
  }
@@ -130,11 +102,11 @@ internal class StackHeaderToolbarMenuUpdateQueue(
130
102
  onElementResolved(index, update.options)
131
103
  } else {
132
104
  iconResolver.resolve(iconSource) { icon ->
133
- onElementResolved(index, update.options.copy(icon = icon))
105
+ onElementResolved(index, update.options.copy(icon = StackHeaderToolbarFieldUpdate.from(icon)))
134
106
  }
135
107
  }
136
108
  }
137
- isProcessingBatch = false
109
+ inSyncDispatchLoop = false
138
110
 
139
111
  if (outstanding > 0) {
140
112
  // An icon is still loading asynchronously; its callback will apply the batch
@@ -0,0 +1,9 @@
1
+ package com.swmansion.rnscreens.stack.header.toolbar.update
2
+
3
+ /**
4
+ * Receives a fully-resolved batch of menu element updates, to be applied to the toolbar
5
+ * atomically.
6
+ */
7
+ internal fun interface StackHeaderToolbarMenuUpdateQueueDelegate {
8
+ fun onUpdatesResolved(updates: List<StackHeaderToolbarMenuElementUpdate>)
9
+ }
@@ -2,18 +2,26 @@ package com.swmansion.rnscreens.stack.host
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
5
+ import android.content.res.Configuration
5
6
  import android.util.Log
6
7
  import android.view.ViewGroup
7
8
  import android.widget.FrameLayout
8
9
  import androidx.fragment.app.Fragment
9
10
  import androidx.fragment.app.FragmentManager
11
+ import com.swmansion.rnscreens.common.colorscheme.ColorScheme
12
+ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeCoordinator
13
+ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeListener
14
+ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeProviding
10
15
  import com.swmansion.rnscreens.common.container.Container
16
+ import com.swmansion.rnscreens.common.container.ContainerItem
11
17
  import com.swmansion.rnscreens.common.container.ParentContainerItemRegistry
12
18
  import com.swmansion.rnscreens.ext.isMeasured
13
19
  import com.swmansion.rnscreens.helpers.FragmentManagerHelper
14
20
  import com.swmansion.rnscreens.helpers.ViewIdGenerator
21
+ import com.swmansion.rnscreens.stack.header.StackHeaderBackPressHandler
15
22
  import com.swmansion.rnscreens.stack.screen.StackScreen
16
23
  import com.swmansion.rnscreens.stack.screen.StackScreenFragment
24
+ import com.swmansion.rnscreens.stack.screen.StackScreenFragmentDelegate
17
25
  import com.swmansion.rnscreens.utils.RNSLog
18
26
  import java.lang.ref.WeakReference
19
27
 
@@ -23,7 +31,10 @@ internal class StackContainer(
23
31
  private val delegate: WeakReference<StackContainerDelegate>,
24
32
  ) : FrameLayout(context),
25
33
  Container,
26
- FragmentManager.OnBackStackChangedListener {
34
+ FragmentManager.OnBackStackChangedListener,
35
+ ColorSchemeProviding,
36
+ StackHeaderBackPressHandler,
37
+ StackScreenFragmentDelegate {
27
38
  private var fragmentManager: FragmentManager? = null
28
39
 
29
40
  private fun requireFragmentManager(): FragmentManager =
@@ -51,6 +62,20 @@ internal class StackContainer(
51
62
  private val fragmentOpExecutor: FragmentOperationExecutor = FragmentOperationExecutor()
52
63
  private val fragmentOps: MutableList<FragmentOperation> = arrayListOf()
53
64
 
65
+ // region Color Scheme
66
+
67
+ private val colorSchemeCoordinator = ColorSchemeCoordinator()
68
+
69
+ internal var colorScheme: ColorScheme by colorSchemeCoordinator::colorScheme
70
+
71
+ override fun getResolvedUiNightMode() = colorSchemeCoordinator.getResolvedUiNightMode()
72
+
73
+ override fun addColorSchemeListener(listener: ColorSchemeListener) = colorSchemeCoordinator.addColorSchemeListener(listener)
74
+
75
+ override fun removeColorSchemeListener(listener: ColorSchemeListener) = colorSchemeCoordinator.removeColorSchemeListener(listener)
76
+
77
+ // endregion
78
+
54
79
  init {
55
80
  id = ViewIdGenerator.generateViewId()
56
81
  }
@@ -62,6 +87,10 @@ internal class StackContainer(
62
87
  parentContainerRegistry.attach(this)
63
88
  setupFragmentManger()
64
89
 
90
+ // StackContainer only provides container-level color scheme configuration for its screens
91
+ // but doesn't use any color scheme-dependent views, so we don't need the callback.
92
+ colorSchemeCoordinator.setup(this, null)
93
+
65
94
  // Following line works with a couple of assumptions.
66
95
  // First, that this view is laid out by our parent view, which is a component view.
67
96
  // Component views on new architecture receive their first layout after the view hierarchy is
@@ -81,8 +110,16 @@ internal class StackContainer(
81
110
  requireFragmentManager().removeOnBackStackChangedListener(this)
82
111
  fragmentManager = null
83
112
  parentContainerRegistry.detach(this)
113
+ colorSchemeCoordinator.teardown()
114
+ }
115
+
116
+ override fun onConfigurationChanged(newConfig: Configuration?) {
117
+ super.onConfigurationChanged(newConfig)
118
+ colorSchemeCoordinator.onConfigurationChanged(newConfig)
84
119
  }
85
120
 
121
+ override fun onFragmentConfigurationChanged(config: Configuration) = onConfigurationChanged(config)
122
+
86
123
  internal fun setupFragmentManger() {
87
124
  fragmentManager =
88
125
  checkNotNull(FragmentManagerHelper.findFragmentManagerForView(this)) {
@@ -164,7 +201,8 @@ internal class StackContainer(
164
201
  }
165
202
 
166
203
  pendingPushOperations.forEach { operation ->
167
- val newFragment = createFragmentForScreen(operation.screen, canNavigateBack = stackModel.isNotEmpty())
204
+ val newFragment =
205
+ createFragmentForScreen(operation.screen, canNavigateBack = stackModel.isNotEmpty())
168
206
 
169
207
  fragmentOps.add(
170
208
  AddAndSetAsPrimaryOp(
@@ -205,7 +243,12 @@ internal class StackContainer(
205
243
  screen: StackScreen,
206
244
  canNavigateBack: Boolean,
207
245
  ): StackScreenFragment =
208
- StackScreenFragment(screen, canNavigateBack).also {
246
+ StackScreenFragment(
247
+ screen,
248
+ canNavigateBack,
249
+ WeakReference(this),
250
+ backPressHandler = WeakReference(this),
251
+ ).also {
209
252
  Log.d(TAG, "Created Fragment $it for screen ${screen.screenKey}")
210
253
  }
211
254
 
@@ -290,6 +333,63 @@ internal class StackContainer(
290
333
  ?.stackScreen
291
334
  ?.findContentScrollView()
292
335
 
336
+ // Asked when this container's whole subtree is about to be dismissed (the screen
337
+ // hosting this container is popped) - every item gets a vote, back-to-front, so
338
+ // the deepest preventing screen wins.
339
+ override fun wantsToPreventStackNativeDismiss(): ContainerItem? =
340
+ stackModel
341
+ .asReversed()
342
+ .firstNotNullOfOrNull { it.stackScreen.wantsToPreventStackNativeDismiss() }
343
+
344
+ // endregion
345
+
346
+ // region Header back button
347
+
348
+ override fun handleHeaderBackButtonPress(pressedScreen: StackScreen) {
349
+ val fragmentManager = fragmentManager
350
+ if (fragmentManager == null) {
351
+ Log.w(TAG, "[RNScreens] Ignoring header back button press - container is detached")
352
+ return
353
+ }
354
+
355
+ val topScreen = stackModel.lastOrNull()?.stackScreen
356
+ if (topScreen !== pressedScreen || stackModel.size <= 1) {
357
+ Log.w(
358
+ TAG,
359
+ "[RNScreens] Ignoring header back button press for non-top screen ${pressedScreen.screenKey}",
360
+ )
361
+ return
362
+ }
363
+
364
+ // This pop dismisses only the top screen (together with its subtree), therefore
365
+ // only the top item is asked - screens below the top get no vote at this level.
366
+ val vetoingItem = topScreen.wantsToPreventStackNativeDismiss()
367
+ if (vetoingItem != null) {
368
+ // Only a StackScreen can veto - TabsScreen has no own flag and only forwards.
369
+ val vetoingScreen = vetoingItem as? StackScreen
370
+ if (vetoingScreen != null) {
371
+ vetoingScreen.onNativeDismissPrevented()
372
+ } else {
373
+ Log.w(
374
+ TAG,
375
+ "[RNScreens] Unexpected vetoing item type: ${vetoingItem.javaClass.simpleName}",
376
+ )
377
+ }
378
+ return
379
+ }
380
+
381
+ // Mirrors FragmentManager's internal OnBackPressedCallback, which also runs
382
+ // popBackStackImmediate. The synchronous pop makes the top-screen guard above
383
+ // reliable against double taps: onBackStackChangeCommitted -> onNativeFragmentPop
384
+ // updates stackModel before this call returns.
385
+ fragmentManager.popBackStackImmediate(
386
+ // key MUST BE present, otherwise the navigation action will be delegated to child primary navigation
387
+ // fragment.
388
+ checkNotNull(pressedScreen.screenKey) { "[RNScreens] Screen key is required" },
389
+ FragmentManager.POP_BACK_STACK_INCLUSIVE,
390
+ )
391
+ }
392
+
293
393
  // endregion
294
394
 
295
395
  companion object {
@@ -8,6 +8,7 @@ import com.facebook.react.bridge.UIManagerListener
8
8
  import com.facebook.react.common.annotations.UnstableReactNativeAPI
9
9
  import com.facebook.react.uimanager.ThemedReactContext
10
10
  import com.facebook.react.uimanager.UIManagerHelper
11
+ import com.swmansion.rnscreens.common.colorscheme.ColorScheme
11
12
  import com.swmansion.rnscreens.helpers.getFabricUIManagerNotNull
12
13
  import com.swmansion.rnscreens.stack.screen.StackScreen
13
14
  import com.swmansion.rnscreens.utils.RNSLog
@@ -26,6 +27,8 @@ class StackHost(
26
27
  private val containerUpdateCoordinator = StackContainerUpdateCoordinator()
27
28
  private var isLayoutEnqueued = false
28
29
 
30
+ internal var colorScheme: ColorScheme by container::colorScheme
31
+
29
32
  init {
30
33
  addView(container)
31
34
 
@@ -119,6 +122,16 @@ class StackHost(
119
122
  refreshLayout()
120
123
  }
121
124
 
125
+ // On window configuration changes ViewRootImpl calls forceLayout() recursively on every view
126
+ // in the hierarchy, bypassing requestLayout(). React views never lay out their children during
127
+ // framework traversals, so nothing would clear the force-layout flags in our subtree — and once
128
+ // they are set, any subsequent requestLayout() from a descendant short-circuits before reaching
129
+ // the override above, permanently disabling the manual pass. Schedule it from here as well.
130
+ override fun forceLayout() {
131
+ super.forceLayout()
132
+ refreshLayout()
133
+ }
134
+
122
135
  private fun refreshLayout() {
123
136
  if (!isLayoutEnqueued) {
124
137
  isLayoutEnqueued = true
@@ -1,12 +1,14 @@
1
1
  package com.swmansion.rnscreens.stack.host
2
2
 
3
3
  import android.view.View
4
+ import com.facebook.react.bridge.JSApplicationIllegalArgumentException
4
5
  import com.facebook.react.module.annotations.ReactModule
5
6
  import com.facebook.react.uimanager.ThemedReactContext
6
7
  import com.facebook.react.uimanager.ViewGroupManager
7
8
  import com.facebook.react.uimanager.ViewManagerDelegate
8
9
  import com.facebook.react.viewmanagers.RNSStackHostManagerDelegate
9
10
  import com.facebook.react.viewmanagers.RNSStackHostManagerInterface
11
+ import com.swmansion.rnscreens.common.colorscheme.ColorScheme
10
12
  import com.swmansion.rnscreens.stack.screen.StackScreen
11
13
 
12
14
  @ReactModule(name = StackHostViewManager.REACT_CLASS)
@@ -70,6 +72,18 @@ class StackHostViewManager :
70
72
  */
71
73
  override fun needsCustomLayoutForChildren() = true
72
74
 
75
+ override fun setColorScheme(
76
+ view: StackHost,
77
+ value: String?,
78
+ ) {
79
+ when (value) {
80
+ null, "inherit" -> view.colorScheme = ColorScheme.INHERIT
81
+ "light" -> view.colorScheme = ColorScheme.LIGHT
82
+ "dark" -> view.colorScheme = ColorScheme.DARK
83
+ else -> throw JSApplicationIllegalArgumentException("[RNScreens] Invalid color scheme: $value.")
84
+ }
85
+ }
86
+
73
87
  companion object {
74
88
  const val REACT_CLASS = "RNSStackHost"
75
89
  }
@@ -131,6 +131,7 @@ class StackScreen(
131
131
  scrollView: ViewGroup,
132
132
  ) {
133
133
  containerItemSupport.registerScrollView(scrollView)
134
+ headerConfig?.onContentScrollViewChanged()
134
135
  }
135
136
 
136
137
  // endregion
@@ -174,4 +175,8 @@ class StackScreen(
174
175
  override fun resolveNestedContainer(): Container? = containerItemSupport.resolveNestedContainer()
175
176
 
176
177
  override fun findContentScrollView(): ViewGroup? = containerItemSupport.findContentScrollView(this)
178
+
179
+ override fun wantsToPreventStackNativeDismiss(): ContainerItem? =
180
+ resolveNestedContainer()?.wantsToPreventStackNativeDismiss()
181
+ ?: takeIf { isPreventNativeDismissEnabled }
177
182
  }
@@ -1,17 +1,23 @@
1
1
  package com.swmansion.rnscreens.stack.screen
2
2
 
3
+ import android.content.res.Configuration
3
4
  import android.os.Bundle
5
+ import android.util.Log
4
6
  import android.view.Gravity
5
7
  import android.view.LayoutInflater
6
8
  import android.view.View
7
9
  import android.view.ViewGroup
8
10
  import androidx.fragment.app.Fragment
9
11
  import androidx.transition.Slide
12
+ import com.swmansion.rnscreens.stack.header.StackHeaderBackPressHandler
10
13
  import com.swmansion.rnscreens.stack.header.StackHeaderCoordinatorLayout
14
+ import java.lang.ref.WeakReference
11
15
 
12
16
  internal class StackScreenFragment(
13
17
  internal val stackScreen: StackScreen,
14
18
  private val canNavigateBack: Boolean,
19
+ private val delegate: WeakReference<StackScreenFragmentDelegate>,
20
+ private val backPressHandler: WeakReference<StackHeaderBackPressHandler>,
15
21
  ) : Fragment() {
16
22
  private var screenLifecycleEventEmitter: StackScreenAppearanceEventsEmitter? = null
17
23
 
@@ -45,7 +51,11 @@ internal class StackScreenFragment(
45
51
  inflater: LayoutInflater,
46
52
  container: ViewGroup?,
47
53
  savedInstanceState: Bundle?,
48
- ): View = StackHeaderCoordinatorLayout(requireContext(), stackScreen, canNavigateBack)
54
+ ): View =
55
+ StackHeaderCoordinatorLayout(requireContext(), stackScreen, canNavigateBack) { pressedScreen ->
56
+ backPressHandler.get()?.handleHeaderBackButtonPress(pressedScreen)
57
+ ?: Log.w(TAG, "[RNScreens] Header back button press dropped - handler is gone")
58
+ }
49
59
 
50
60
  override fun onViewCreated(
51
61
  view: View,
@@ -71,6 +81,11 @@ internal class StackScreenFragment(
71
81
  teardownPreventNativeDismissCallback()
72
82
  }
73
83
 
84
+ override fun onConfigurationChanged(newConfig: Configuration) {
85
+ super.onConfigurationChanged(newConfig)
86
+ delegate.get()?.onFragmentConfigurationChanged(newConfig)
87
+ }
88
+
74
89
  /**
75
90
  * Notifies this fragment that it has become "top fragment" in its fragment manager.
76
91
  * Call this only if the lifecycle of the fragment is at least at CREATED.
@@ -109,4 +124,8 @@ internal class StackScreenFragment(
109
124
  requireNativeDismissBackPressedCallback.remove()
110
125
  preventNativeDismissBackPressedCallback = null
111
126
  }
127
+
128
+ companion object {
129
+ private const val TAG = "StackScreenFragment"
130
+ }
112
131
  }
@@ -0,0 +1,12 @@
1
+ package com.swmansion.rnscreens.stack.screen
2
+
3
+ import android.content.res.Configuration
4
+
5
+ internal interface StackScreenFragmentDelegate {
6
+ /**
7
+ * Notifies the delegate that the fragment received a configuration update,
8
+ * e.g. theme change from JS via Appearance.setColorScheme. Fragments are
9
+ * the only place where such updates are delivered reliably.
10
+ */
11
+ fun onFragmentConfigurationChanged(config: Configuration)
12
+ }
@@ -4,7 +4,6 @@ import android.content.Context
4
4
  import android.view.MenuItem
5
5
  import com.google.android.material.bottomnavigation.BottomNavigationView
6
6
  import com.swmansion.rnscreens.tabs.container.TabsContainer
7
- import com.swmansion.rnscreens.tabs.container.menuItemIdForFragmentAtIndex
8
7
  import com.swmansion.rnscreens.tabs.screen.TabsScreen
9
8
  import com.swmansion.rnscreens.tabs.screen.TabsScreenFragment
10
9
 
@@ -28,13 +27,12 @@ internal class TabsAppearanceCoordinator(
28
27
  context: Context,
29
28
  tabsAppearance: TabsAppearance?,
30
29
  ) {
31
- tabsScreenFragments.forEachIndexed { index, fragment ->
32
- val menuItemId = menuItemIdForFragmentAtIndex(index)
30
+ tabsScreenFragments.forEach { fragment ->
31
+ val menuItemId = fragment.menuItemId
33
32
  val menuItem =
34
33
  checkNotNull(bottomNavigationView.menu.findItem(menuItemId)) {
35
34
  "[RNScreens] Missing MenuItem for id: $menuItemId"
36
35
  }
37
- check(menuItem.itemId == menuItemId) { "[RNScreens] Illegal state: menu items are shuffled" }
38
36
  updateMenuItemAppearance(context, menuItem, fragment.tabsScreen, tabsAppearance)
39
37
  }
40
38
  }
@@ -2,30 +2,12 @@ package com.swmansion.rnscreens.tabs.container
2
2
 
3
3
  import android.view.Menu
4
4
  import android.view.MenuItem
5
- import com.swmansion.rnscreens.tabs.screen.TabsScreen
5
+ import com.swmansion.rnscreens.tabs.screen.TabsScreenFragment
6
6
 
7
- // MenuItem ids are offset by one, because 0 has special meaning in the BottomNavigationMenuView API.
8
-
9
- /**
10
- * Compute MenuItem id for a fragment at given index in "tabsModel" of TabsContainer
11
- */
12
- internal fun menuItemIdForFragmentAtIndex(fragmentIndex: Int): Int = fragmentIndex + 1
13
-
14
- /**
15
- * Compute fragment index in "tabsModel" of TabsContainer for a MenuItem with given id.
16
- */
17
- internal fun fragmentIndexForMenuItemId(menuItemId: Int): Int {
18
- check(menuItemId >= 1) { "[RNScreens] MenuItem id must not be less than 1" }
19
- return menuItemId - 1
20
- }
21
-
22
- internal fun Menu.getOrCreateMenuItemForFragmentAt(
23
- index: Int,
24
- tabsScreen: TabsScreen,
25
- ): MenuItem =
26
- this.findItem(menuItemIdForFragmentAtIndex(index)) ?: this.add(
7
+ internal fun Menu.getOrCreateMenuItemForFragment(fragment: TabsScreenFragment): MenuItem =
8
+ this.findItem(fragment.menuItemId) ?: this.add(
27
9
  Menu.NONE,
28
- menuItemIdForFragmentAtIndex(index),
10
+ fragment.menuItemId,
29
11
  Menu.NONE,
30
- tabsScreen.tabTitle,
12
+ fragment.tabsScreen.tabTitle,
31
13
  )
@@ -24,6 +24,7 @@ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeCoordinator
24
24
  import com.swmansion.rnscreens.common.colorscheme.ColorSchemeListener
25
25
  import com.swmansion.rnscreens.common.colorscheme.ColorSchemeProviding
26
26
  import com.swmansion.rnscreens.common.container.Container
27
+ import com.swmansion.rnscreens.common.container.ContainerItem
27
28
  import com.swmansion.rnscreens.common.container.ParentContainerItemRegistry
28
29
  import com.swmansion.rnscreens.helpers.FragmentManagerHelper
29
30
  import com.swmansion.rnscreens.helpers.ViewFinder
@@ -67,7 +68,8 @@ class TabsContainer internal constructor(
67
68
  val selectedTabScreen = this@TabsContainer.selectedTab.tabsScreen
68
69
 
69
70
  if (selectedTabScreen.shouldUseRepeatedTabSelectionPopToRootSpecialEffect) {
70
- val screenStack = ViewFinder.findScreenStackInFirstDescendantChain(selectedTabScreen)
71
+ val screenStack =
72
+ ViewFinder.findScreenStackInFirstDescendantChain(selectedTabScreen)
71
73
  if (screenStack != null && screenStack.popToRoot()) {
72
74
  return true
73
75
  }
@@ -492,7 +494,10 @@ class TabsContainer internal constructor(
492
494
 
493
495
  private fun performSelectedTabUpdate() {
494
496
  if (pendingStateUpdateRequest == null) {
495
- RNSLog.w(TAG, "TabsContainer::performSelectedTabUpdate called w/o pending operation; skipping update")
497
+ RNSLog.w(
498
+ TAG,
499
+ "TabsContainer::performSelectedTabUpdate called w/o pending operation; skipping update",
500
+ )
496
501
  return
497
502
  }
498
503
 
@@ -516,7 +521,10 @@ class TabsContainer internal constructor(
516
521
  if (bottomNavigationView.selectedItemId != nextSelectedMenuItemId || navState.isEmpty()) {
517
522
  isInExternalOperationContext = true
518
523
  // This triggers on OnMenuItemClicked callback, where we perform actual update from
519
- bottomNavigationView.setSelectedItemIdWithActionOrigin(nextSelectedMenuItemId, stateUpdateRequest.actionOrigin)
524
+ bottomNavigationView.setSelectedItemIdWithActionOrigin(
525
+ nextSelectedMenuItemId,
526
+ stateUpdateRequest.actionOrigin,
527
+ )
520
528
  isInExternalOperationContext = false
521
529
  } else {
522
530
  observerRegistry.emitOnNavigationStateUpdateRejected(
@@ -530,17 +538,19 @@ class TabsContainer internal constructor(
530
538
  }
531
539
 
532
540
  private fun updateNavigationMenuStructure() {
533
- if (bottomNavigationView.menu.size != tabsModel.size) {
534
- // Most likely first render or some tab has been removed. Let's nuke the menu (easiest option).
535
- bottomNavigationView.menu.clear()
536
- }
537
- tabsModel.forEachIndexed { index, fragment ->
538
- val menuItem =
539
- bottomNavigationView.menu.getOrCreateMenuItemForFragmentAt(
540
- index,
541
- fragment.tabsScreen,
542
- )
543
- check(fragmentIndexForMenuItemId(menuItem.itemId) == index) { "[RNScreens] Illegal state: menu items are shuffled" }
541
+ val menu = bottomNavigationView.menu
542
+ val isMenuInSync =
543
+ menu.size == tabsModel.size &&
544
+ tabsModel.withIndex().all { (index, fragment) ->
545
+ menu.getItem(index).itemId == fragment.menuItemId
546
+ }
547
+
548
+ if (isMenuInSync) {
549
+ return
550
+ }
551
+ menu.clear()
552
+ tabsModel.forEach { fragment ->
553
+ menu.getOrCreateMenuItemForFragment(fragment)
544
554
  }
545
555
  }
546
556
 
@@ -573,7 +583,10 @@ class TabsContainer internal constructor(
573
583
  }
574
584
 
575
585
  progressNavigationState(nextSelectedFragment.requireScreenKey, actionOrigin)
576
- applyNextSelectedFragmentToFragmentManagerSync(currentSelectedFragment, nextSelectedFragment)
586
+ applyNextSelectedFragmentToFragmentManagerSync(
587
+ currentSelectedFragment,
588
+ nextSelectedFragment,
589
+ )
577
590
  return true
578
591
  }
579
592
 
@@ -643,7 +656,8 @@ class TabsContainer internal constructor(
643
656
  return false
644
657
  }
645
658
 
646
- val stateChanged = updateNavigationStateAndSelectedFragment(nextSelectedFragment, actionOrigin)
659
+ val stateChanged =
660
+ updateNavigationStateAndSelectedFragment(nextSelectedFragment, actionOrigin)
647
661
 
648
662
  val hasTriggeredSpecialEffect =
649
663
  if (isRepeated) specialEffectsHandler.handleRepeatedTabSelection() else false
@@ -688,7 +702,8 @@ class TabsContainer internal constructor(
688
702
 
689
703
  // We expect at most a single fragment added (detached fragments are not returned from
690
704
  // FragmentManager.getFragments call) and it being the currently selected tab.
691
- val isInUpToDateState = currentFragments.size == 1 && currentFragments.first() === selectedTab
705
+ val isInUpToDateState =
706
+ currentFragments.size == 1 && currentFragments.first() === selectedTab
692
707
  if (isInUpToDateState) {
693
708
  return
694
709
  } else if (currentFragments.isEmpty()) {
@@ -717,12 +732,10 @@ class TabsContainer internal constructor(
717
732
  appearanceCoordinator.updateTabAppearance(themedContext, this)
718
733
  }
719
734
 
720
- private fun getFragmentForMenuItemId(itemId: Int): TabsScreenFragment? = tabsModel.getOrNull(fragmentIndexForMenuItemId(itemId))
735
+ private fun getFragmentForMenuItemId(itemId: Int): TabsScreenFragment? = tabsModel.find { it.menuItemId == itemId }
721
736
 
722
737
  private fun getMenuItemIdForFragment(tabsScreenFragment: TabsScreenFragment): Int? =
723
- tabsModel.indexOfFirst { it === tabsScreenFragment }.takeIf { it != -1 }?.let {
724
- menuItemIdForFragmentAtIndex(it)
725
- }
738
+ tabsScreenFragment.menuItemId.takeIf { tabsModel.any { it === tabsScreenFragment } }
726
739
 
727
740
  private fun getSelectedTabsScreenFragmentId(): Int? =
728
741
  tabsModel
@@ -731,10 +744,9 @@ class TabsContainer internal constructor(
731
744
 
732
745
  private fun getMenuItemForTabsScreen(tabsScreen: TabsScreen): MenuItem? =
733
746
  tabsModel
734
- .indexOfFirst { it.tabsScreen === tabsScreen }
735
- .takeIf { it != -1 }
736
- ?.let { index ->
737
- bottomNavigationView.menu.findItem(menuItemIdForFragmentAtIndex(index))
747
+ .find { it.tabsScreen === tabsScreen }
748
+ ?.let { fragment ->
749
+ bottomNavigationView.menu.findItem(fragment.menuItemId)
738
750
  }
739
751
 
740
752
  private fun getFragmentForScreenKey(screenKey: String): TabsScreenFragment? = tabsModel.find { it.requireScreenKey == screenKey }
@@ -780,6 +792,15 @@ class TabsContainer internal constructor(
780
792
  return selectedTab.tabsScreen.findContentScrollView()
781
793
  }
782
794
 
795
+ // Only the active item is consulted - a preventing screen inside an inactive tab
796
+ // does not veto the dismissal.
797
+ override fun wantsToPreventStackNativeDismiss(): ContainerItem? =
798
+ if (navState.isNotEmpty()) {
799
+ selectedTab.tabsScreen.wantsToPreventStackNativeDismiss()
800
+ } else {
801
+ null
802
+ }
803
+
783
804
  // endregion
784
805
 
785
806
  companion object {