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

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 (436) hide show
  1. package/README.md +1 -2
  2. package/RNScreens.podspec +2 -6
  3. package/android/build.gradle +26 -1
  4. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +5 -0
  5. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  6. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +22 -6
  7. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackFragment.kt +39 -10
  8. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenViewManager.kt +5 -0
  9. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAppearanceCoordinator.kt → native/coordinator/FormSheetAppearanceCoordinator.kt} +2 -1
  10. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetBehaviorController.kt → native/coordinator/FormSheetBehaviorController.kt} +25 -1
  11. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDimensionsCoordinator.kt → native/coordinator/FormSheetDimensionsCoordinator.kt} +4 -1
  12. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetNativeDismissCoordinator.kt +50 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContainer.kt → native/core/FormSheetContainer.kt} +1 -1
  14. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDialog.kt → native/core/FormSheetDialog.kt} +24 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDialogManager.kt → native/core/FormSheetDialogManager.kt} +25 -1
  16. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeDelegate.kt → native/interfaces/FormSheetContentSizeChangeDelegate.kt} +1 -1
  17. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeProvider.kt → native/interfaces/FormSheetContentSizeChangeProvider.kt} +1 -1
  18. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDialogEventEmitter.kt → native/interfaces/FormSheetDialogEventEmitter.kt} +3 -1
  19. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetConfig.kt → native/model/FormSheetConfig.kt} +5 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDetents.kt → native/model/FormSheetDetents.kt} +1 -1
  21. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAnimatorFactory.kt → native/presentation/FormSheetAnimatorFactory.kt} +1 -1
  22. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetPresentationManager.kt → native/presentation/FormSheetPresentationManager.kt} +3 -12
  23. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetPresentationState.kt → native/presentation/FormSheetPresentationState.kt} +1 -1
  24. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapper.kt → react/contentwrapper/FormSheetContentWrapper.kt} +3 -1
  25. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapperViewManager.kt → react/contentwrapper/FormSheetContentWrapperViewManager.kt} +1 -1
  26. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDetentChangedEvent.kt → react/event/FormSheetDetentChangedEvent.kt} +1 -1
  27. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidAppearEvent.kt → react/event/FormSheetDidAppearEvent.kt} +1 -1
  28. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidDisappearEvent.kt → react/event/FormSheetDidDisappearEvent.kt} +1 -1
  29. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetNativeDismissEvent.kt → react/event/FormSheetNativeDismissEvent.kt} +1 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/react/event/FormSheetNativeDismissPreventedEvent.kt +29 -0
  31. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetSyncFlushEvent.kt → react/event/FormSheetSyncFlushEvent.kt} +1 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillAppearEvent.kt → react/event/FormSheetWillAppearEvent.kt} +1 -1
  33. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillDisappearEvent.kt → react/event/FormSheetWillDisappearEvent.kt} +1 -1
  34. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentView.kt → react/host/FormSheetContentView.kt} +3 -1
  35. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHost.kt → react/host/FormSheetHost.kt} +6 -1
  36. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostEventEmitter.kt → react/host/FormSheetHostEventEmitter.kt} +16 -1
  37. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostViewManager.kt → react/host/FormSheetHostViewManager.kt} +11 -2
  38. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +30 -418
  39. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +36 -113
  40. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderFrameSynchronizer.kt +63 -0
  41. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderAppBarLayout.kt → appbar/StackHeaderAppBarLayout.kt} +1 -6
  42. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderAppBarLayoutBehavior.kt → appbar/StackHeaderAppBarLayoutBehavior.kt} +1 -1
  43. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderScrollingViewBehavior.kt → appbar/StackHeaderScrollingViewBehavior.kt} +1 -1
  44. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +28 -6
  45. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +8 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +1 -1
  47. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +2 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +2 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +448 -0
  50. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +17 -3
  51. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuSelectionController.kt +83 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuConfig.kt → model/StackHeaderToolbarMenuConfig.kt} +1 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuElementConfig.kt → model/StackHeaderToolbarMenuElementConfig.kt} +1 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuGroupConfig.kt → model/StackHeaderToolbarMenuGroupConfig.kt} +1 -1
  55. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuGroupMetadata.kt → model/StackHeaderToolbarMenuGroupMetadata.kt} +5 -1
  56. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemConfig.kt → model/StackHeaderToolbarMenuItemConfig.kt} +1 -1
  57. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemDefaults.kt → model/StackHeaderToolbarMenuItemDefaults.kt} +1 -1
  58. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemIconSource.kt → model/StackHeaderToolbarMenuItemIconSource.kt} +1 -1
  59. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemShowAsAction.kt → model/StackHeaderToolbarMenuItemShowAsAction.kt} +1 -1
  60. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemType.kt → model/StackHeaderToolbarMenuItemType.kt} +1 -1
  61. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarFieldUpdate.kt → update/StackHeaderToolbarFieldUpdate.kt} +1 -1
  62. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuElementOptions.kt → update/StackHeaderToolbarMenuElementOptions.kt} +2 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +13 -0
  64. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +10 -0
  65. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +17 -0
  66. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuUpdateQueue.kt → update/StackHeaderToolbarMenuUpdateQueue.kt} +1 -43
  67. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueueDelegate.kt +9 -0
  68. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +1 -0
  69. package/common/cpp/react/renderer/components/rnscreens/legacy/RNSScreenShadowNode.cpp +10 -5
  70. package/ios/RNSEnums.h +0 -2
  71. package/ios/RNSOrientationProviding.h +0 -2
  72. package/ios/RNSReactMountingTransactionObserving.h +15 -0
  73. package/ios/legacy/RNSBarButtonItem.mm +12 -5
  74. package/ios/legacy/RNSScreen.h +8 -1
  75. package/ios/legacy/RNSScreen.mm +39 -17
  76. package/ios/legacy/RNSScreenContentWrapper.mm +9 -0
  77. package/ios/legacy/RNSScreenFooter.mm +2 -0
  78. package/ios/legacy/RNSScreenStack.mm +9 -4
  79. package/ios/modals/form-sheet/RNSFormSheetContentWrapperComponentView.mm +9 -0
  80. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.h +17 -0
  81. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.mm +57 -0
  82. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.h +28 -0
  83. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.mm +64 -0
  84. package/ios/split/RNSSplitAppearanceApplicator.h +36 -0
  85. package/ios/split/RNSSplitAppearanceApplicator.mm +185 -0
  86. package/ios/split/RNSSplitAppearanceCoordinator.h +26 -0
  87. package/ios/split/RNSSplitAppearanceCoordinator.mm +27 -0
  88. package/ios/split/RNSSplitAppearanceUpdateFlags.h +14 -0
  89. package/ios/split/RNSSplitHostComponentView.mm +1 -1
  90. package/ios/split/RNSSplitHostController.h +86 -0
  91. package/ios/split/RNSSplitHostController.mm +560 -0
  92. package/ios/split/RNSSplitNavigationController.h +31 -0
  93. package/ios/split/RNSSplitNavigationController.mm +44 -0
  94. package/ios/split/RNSSplitNavigationControllerFrameObserver.h +32 -0
  95. package/ios/split/RNSSplitNavigationControllerFrameObserver.mm +80 -0
  96. package/ios/split/RNSSplitNavigationControllerFrameOriginChangeDelegate.h +15 -0
  97. package/ios/split/RNSSplitScreenComponentView.mm +8 -9
  98. package/ios/split/RNSSplitScreenController.h +45 -0
  99. package/ios/split/RNSSplitScreenController.mm +130 -0
  100. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +1 -0
  101. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +47 -9
  102. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +3 -0
  103. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +9 -0
  104. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +15 -0
  105. package/ios/stack/header/RNSStackHeaderMenuFinder.h +18 -3
  106. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +21 -3
  107. package/ios/stack/host/RNSStackHostComponentView.mm +3 -1
  108. package/ios/stack/host/RNSStackNavigationController.mm +1 -1
  109. package/ios/stack/screen/RNSStackScreenComponentView.mm +0 -2
  110. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +6 -1
  111. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +61 -12
  112. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +3 -0
  113. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +4 -1
  114. package/ios/tabs/host/RNSTabBarController.h +5 -12
  115. package/ios/tabs/host/RNSTabBarController.mm +1 -1
  116. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +25 -0
  117. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  118. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js +24 -0
  119. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  120. package/lib/commonjs/components/scroll-to-top-guard/index.js +13 -0
  121. package/lib/commonjs/components/scroll-to-top-guard/index.js.map +1 -0
  122. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +11 -12
  123. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  124. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  125. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  126. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js +33 -2
  127. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  128. package/lib/commonjs/components/stack/header/utils.js +6 -9
  129. package/lib/commonjs/components/stack/header/utils.js.map +1 -1
  130. package/lib/commonjs/experimental/index.js +11 -0
  131. package/lib/commonjs/experimental/index.js.map +1 -1
  132. package/lib/commonjs/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  133. package/lib/commonjs/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  134. package/lib/commonjs/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  135. package/lib/commonjs/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  136. package/lib/commonjs/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  137. package/lib/commonjs/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  138. package/lib/commonjs/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  139. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  140. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  141. package/lib/commonjs/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  142. package/lib/commonjs/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  143. package/lib/commonjs/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  144. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +12 -0
  145. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  146. package/lib/commonjs/fabric/split/SplitHostNativeComponent.js.map +1 -1
  147. package/lib/commonjs/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  148. package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  149. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  150. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  151. package/lib/commonjs/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  152. package/lib/commonjs/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  153. package/lib/commonjs/fabric/stack/StackHostNativeComponent.js.map +1 -1
  154. package/lib/commonjs/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  155. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  156. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  157. package/lib/commonjs/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  158. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  159. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  160. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  161. package/lib/commonjs/flags.js +22 -1
  162. package/lib/commonjs/flags.js.map +1 -1
  163. package/lib/commonjs/legacy/components/Screen.js +6 -1
  164. package/lib/commonjs/legacy/components/Screen.js.map +1 -1
  165. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js +5 -0
  166. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  167. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  168. package/lib/commonjs/legacy/components/SearchBar.js +16 -16
  169. package/lib/commonjs/legacy/components/SearchBar.js.map +1 -1
  170. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js +3 -0
  171. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  172. package/lib/commonjs/legacy/gesture-handler/fabricUtils.js.map +1 -1
  173. package/lib/commonjs/legacy/useTransitionProgress.js.map +1 -1
  174. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +20 -0
  175. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  176. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js +18 -0
  177. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  178. package/lib/module/components/scroll-to-top-guard/index.js +2 -0
  179. package/lib/module/components/scroll-to-top-guard/index.js.map +1 -0
  180. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +14 -15
  181. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  182. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  183. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  184. package/lib/module/components/stack/header/ios/iconUtils.ios.js +31 -2
  185. package/lib/module/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  186. package/lib/module/components/stack/header/utils.js +5 -8
  187. package/lib/module/components/stack/header/utils.js.map +1 -1
  188. package/lib/module/experimental/index.js +1 -0
  189. package/lib/module/experimental/index.js.map +1 -1
  190. package/lib/module/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  191. package/lib/module/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  192. package/lib/module/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  193. package/lib/module/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  194. package/lib/module/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  195. package/lib/module/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  196. package/lib/module/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  197. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  198. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  199. package/lib/module/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  200. package/lib/module/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  201. package/lib/module/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  202. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +7 -0
  203. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  204. package/lib/module/fabric/split/SplitHostNativeComponent.js.map +1 -1
  205. package/lib/module/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  206. package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  207. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  208. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  209. package/lib/module/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  210. package/lib/module/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  211. package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
  212. package/lib/module/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  213. package/lib/module/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  214. package/lib/module/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  215. package/lib/module/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  216. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  217. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  218. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  219. package/lib/module/flags.js +22 -1
  220. package/lib/module/flags.js.map +1 -1
  221. package/lib/module/legacy/components/Screen.js +6 -1
  222. package/lib/module/legacy/components/Screen.js.map +1 -1
  223. package/lib/module/legacy/components/ScreenStackHeaderConfig.js +5 -0
  224. package/lib/module/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  225. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  226. package/lib/module/legacy/components/SearchBar.js +17 -17
  227. package/lib/module/legacy/components/SearchBar.js.map +1 -1
  228. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js +4 -0
  229. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  230. package/lib/module/legacy/gesture-handler/fabricUtils.js.map +1 -1
  231. package/lib/module/legacy/useTransitionProgress.js.map +1 -1
  232. package/lib/module/private/hooks/useRenderDebugInfo.js.map +1 -1
  233. package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +2 -2
  234. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts +5 -2
  235. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts.map +1 -1
  236. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts +15 -0
  237. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts.map +1 -0
  238. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts +12 -0
  239. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts.map +1 -0
  240. package/lib/typescript/components/scroll-to-top-guard/index.d.ts +2 -0
  241. package/lib/typescript/components/scroll-to-top-guard/index.d.ts.map +1 -0
  242. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +24 -0
  243. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  244. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  245. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +13 -0
  246. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  247. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +5 -2
  248. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +1 -1
  249. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  250. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts +3 -0
  251. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts.map +1 -1
  252. package/lib/typescript/components/stack/header/utils.d.ts +1 -2
  253. package/lib/typescript/components/stack/header/utils.d.ts.map +1 -1
  254. package/lib/typescript/components/stack/host/StackHost.types.d.ts +2 -2
  255. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  256. package/lib/typescript/components/stack/host/StackHost.web.d.ts +6 -2
  257. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  258. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts +5 -2
  259. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts.map +1 -1
  260. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +5 -2
  261. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +1 -1
  262. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts +7 -3
  263. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts.map +1 -1
  264. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +5 -2
  265. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +1 -1
  266. package/lib/typescript/experimental/index.d.ts +1 -0
  267. package/lib/typescript/experimental/index.d.ts.map +1 -1
  268. package/lib/typescript/fabric/NativeScreensModule.d.ts +1 -1
  269. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts +2 -2
  270. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts.map +1 -1
  271. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts +2 -2
  272. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts.map +1 -1
  273. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts +3 -2
  274. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts.map +1 -1
  275. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts +2 -2
  276. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts.map +1 -1
  277. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts +2 -2
  278. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts.map +1 -1
  279. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts +2 -2
  280. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts.map +1 -1
  281. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts +3 -2
  282. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts.map +1 -1
  283. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts +2 -2
  284. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts.map +1 -1
  285. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts +3 -3
  286. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  287. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -2
  288. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  289. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +2 -2
  290. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  291. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts +6 -6
  292. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts.map +1 -1
  293. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts +2 -2
  294. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts.map +1 -1
  295. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts +2 -2
  296. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts.map +1 -1
  297. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts +2 -2
  298. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts.map +1 -1
  299. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts +6 -0
  300. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts.map +1 -0
  301. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts +1 -1
  302. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts.map +1 -1
  303. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts +2 -2
  304. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts.map +1 -1
  305. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +1 -0
  306. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
  307. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +2 -1
  308. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  309. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +2 -2
  310. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  311. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts +2 -2
  312. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts.map +1 -1
  313. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts +2 -2
  314. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts.map +1 -1
  315. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +2 -2
  316. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
  317. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts +2 -2
  318. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts.map +1 -1
  319. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts +2 -2
  320. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts.map +1 -1
  321. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts +2 -2
  322. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts.map +1 -1
  323. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts +2 -2
  324. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts.map +1 -1
  325. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +2 -2
  326. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  327. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +2 -2
  328. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  329. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +2 -2
  330. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  331. package/lib/typescript/flags.d.ts +13 -0
  332. package/lib/typescript/flags.d.ts.map +1 -1
  333. package/lib/typescript/legacy/TransitionProgressContext.d.ts +1 -1
  334. package/lib/typescript/legacy/TransitionProgressContext.d.ts.map +1 -1
  335. package/lib/typescript/legacy/components/Screen.d.ts +5 -3
  336. package/lib/typescript/legacy/components/Screen.d.ts.map +1 -1
  337. package/lib/typescript/legacy/components/Screen.web.d.ts +10 -2
  338. package/lib/typescript/legacy/components/Screen.web.d.ts.map +1 -1
  339. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts +5 -2
  340. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts.map +1 -1
  341. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts +5 -2
  342. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts.map +1 -1
  343. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts +5 -2
  344. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts.map +1 -1
  345. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts +10 -3
  346. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts.map +1 -1
  347. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts +10 -3
  348. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts.map +1 -1
  349. package/lib/typescript/legacy/components/ScreenStack.web.d.ts +5 -2
  350. package/lib/typescript/legacy/components/ScreenStack.web.d.ts.map +1 -1
  351. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts +3 -1
  352. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts.map +1 -1
  353. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +3 -2
  354. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  355. package/lib/typescript/legacy/components/SearchBar.d.ts +3 -3
  356. package/lib/typescript/legacy/components/SearchBar.d.ts.map +1 -1
  357. package/lib/typescript/legacy/components/SearchBar.web.d.ts +5 -2
  358. package/lib/typescript/legacy/components/SearchBar.web.d.ts.map +1 -1
  359. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +15 -12
  360. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  361. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts +3 -2
  362. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts.map +1 -1
  363. package/lib/typescript/legacy/types.d.ts +25 -5
  364. package/lib/typescript/legacy/types.d.ts.map +1 -1
  365. package/lib/typescript/legacy/useTransitionProgress.d.ts +2 -5
  366. package/lib/typescript/legacy/useTransitionProgress.d.ts.map +1 -1
  367. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts +2 -2
  368. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts.map +1 -1
  369. package/package.json +17 -17
  370. package/src/components/modals/form-sheet/FormSheet.types.ts +2 -2
  371. package/src/components/scroll-to-top-guard/ScrollToTopGuard.ios.tsx +17 -0
  372. package/src/components/scroll-to-top-guard/ScrollToTopGuard.tsx +18 -0
  373. package/src/components/scroll-to-top-guard/index.ts +1 -0
  374. package/src/components/stack/header/StackHeaderConfig.android.types.ts +24 -0
  375. package/src/components/stack/header/StackHeaderConfig.ios.tsx +32 -22
  376. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +13 -0
  377. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +1 -23
  378. package/src/components/stack/header/ios/iconUtils.ios.ts +38 -2
  379. package/src/components/stack/header/utils.ts +6 -11
  380. package/src/components/stack/host/StackHost.types.ts +2 -4
  381. package/src/components/tabs/screen/TabsScreen.types.ts +7 -3
  382. package/src/experimental/index.ts +1 -0
  383. package/src/fabric/ScrollViewMarkerNativeComponent.ts +8 -2
  384. package/src/fabric/legacy/FullWindowOverlayNativeComponent.ts +6 -2
  385. package/src/fabric/legacy/ModalScreenNativeComponent.ts +8 -2
  386. package/src/fabric/legacy/ScreenContainerNativeComponent.ts +5 -2
  387. package/src/fabric/legacy/ScreenContentWrapperNativeComponent.ts +2 -2
  388. package/src/fabric/legacy/ScreenFooterNativeComponent.ts +5 -2
  389. package/src/fabric/legacy/ScreenNativeComponent.ts +8 -2
  390. package/src/fabric/legacy/ScreenNavigationContainerNativeComponent.ts +2 -2
  391. package/src/fabric/legacy/ScreenStackHeaderConfigNativeComponent.ts +8 -3
  392. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -2
  393. package/src/fabric/legacy/ScreenStackNativeComponent.ts +10 -2
  394. package/src/fabric/legacy/SearchBarNativeComponent.ts +10 -7
  395. package/src/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.ts +2 -2
  396. package/src/fabric/modals/form-sheet/FormSheetHostNativeComponent.ts +7 -2
  397. package/src/fabric/safe-area/SafeAreaViewNativeComponent.ts +6 -2
  398. package/src/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.ts +10 -0
  399. package/src/fabric/split/SplitHostNativeComponent.ts +5 -2
  400. package/src/fabric/split/SplitScreenNativeComponent.ts +6 -2
  401. package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +3 -1
  402. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +7 -2
  403. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +2 -1
  404. package/src/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.ts +6 -2
  405. package/src/fabric/stack/StackHeaderSubviewAndroidNativeComponent.ts +6 -2
  406. package/src/fabric/stack/StackHostNativeComponent.ts +5 -2
  407. package/src/fabric/stack/StackScreenNativeComponent.ts +6 -2
  408. package/src/fabric/tabs/TabsBottomAccessoryContentNativeComponent.ts +6 -2
  409. package/src/fabric/tabs/TabsBottomAccessoryNativeComponent.ts +6 -2
  410. package/src/fabric/tabs/TabsHostAndroidNativeComponent.ts +7 -2
  411. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +7 -2
  412. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +2 -1
  413. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +2 -1
  414. package/src/flags.ts +26 -0
  415. package/src/legacy/TransitionProgressContext.tsx +1 -1
  416. package/src/legacy/components/Screen.tsx +14 -6
  417. package/src/legacy/components/ScreenStackHeaderConfig.tsx +7 -1
  418. package/src/legacy/components/ScreenStackItem.tsx +3 -4
  419. package/src/legacy/components/SearchBar.tsx +34 -44
  420. package/src/legacy/components/helpers/prepareHeaderBarButtonItems.ts +7 -1
  421. package/src/legacy/gesture-handler/fabricUtils.ts +5 -2
  422. package/src/legacy/types.ts +28 -5
  423. package/src/legacy/useTransitionProgress.tsx +4 -2
  424. package/src/private/hooks/useRenderDebugInfo.tsx +2 -2
  425. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetNativeDismissCoordinator.kt +0 -25
  426. package/ios/ReactMountingTransactionObserving.swift +0 -7
  427. package/ios/bridging/Swift-Bridging.h +0 -7
  428. package/ios/orientation/RNSOrientationProviding.swift +0 -6
  429. package/ios/orientation/RNSOrientationSwift.swift +0 -14
  430. package/ios/split/RNSSplitAppearanceApplicator.swift +0 -199
  431. package/ios/split/RNSSplitAppearanceCoordinator.swift +0 -26
  432. package/ios/split/RNSSplitAppearanceUpdateFlags.swift +0 -11
  433. package/ios/split/RNSSplitHostController.swift +0 -570
  434. package/ios/split/RNSSplitNavigationController.swift +0 -46
  435. package/ios/split/RNSSplitScreenController.swift +0 -133
  436. package/ios/utils/RNSLog.swift +0 -6
@@ -12,16 +12,23 @@ import com.facebook.react.bridge.ReactContext
12
12
  import com.google.android.material.R
13
13
  import com.google.android.material.appbar.AppBarLayout
14
14
  import com.google.android.material.appbar.MaterialToolbar
15
+ import com.swmansion.rnscreens.stack.header.appbar.StackHeaderAppBarLayout
16
+ import com.swmansion.rnscreens.stack.header.appbar.StackHeaderScrollingViewBehavior
15
17
  import com.swmansion.rnscreens.stack.header.config.OnHeaderConfigurationAttachListener
16
18
  import com.swmansion.rnscreens.stack.header.config.StackHeaderConfigurationObserver
17
19
  import com.swmansion.rnscreens.stack.header.config.StackHeaderConfigurationProviding
18
20
  import com.swmansion.rnscreens.stack.header.config.StackHeaderDelegate
19
21
  import com.swmansion.rnscreens.stack.header.config.StackHeaderInvalidationFlags
20
- import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubviewProviding
21
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuElementUpdate
22
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuGroupMetadata
22
+ import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuApplicator
23
+ import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuSelectionController
24
+ import com.swmansion.rnscreens.stack.header.toolbar.update.StackHeaderToolbarMenuElementUpdate
23
25
  import com.swmansion.rnscreens.stack.screen.StackScreen
24
26
 
27
+ /**
28
+ * Root CoordinatorLayout for a screen's header: hosts the app bar and the
29
+ * content wrapper, wires header-config attach/observe, routes config
30
+ * invalidations to the applicators, and owns header lifecycle/teardown.
31
+ */
25
32
  @SuppressLint("ViewConstructor")
26
33
  internal class StackHeaderCoordinatorLayout(
27
34
  context: Context,
@@ -80,15 +87,15 @@ internal class StackHeaderCoordinatorLayout(
80
87
  // then emit a single coalesced event per affected group.
81
88
  val affectedGroups = LinkedHashSet<String>()
82
89
  for (update in updates) {
83
- applicator.updateToolbarMenuElement(
90
+ StackHeaderToolbarMenuApplicator.updateToolbarMenuElement(
84
91
  toolbar,
85
- toolbarMenuForwardIdMap,
92
+ selectionController.forwardIdMap,
86
93
  update.id,
87
94
  update.options,
88
95
  )
89
96
  val checked = update.options.checked
90
97
  if (checked != null) {
91
- applyGroupItemStateChange(toolbar, update.id, checked)?.let(affectedGroups::add)
98
+ selectionController.applyGroupItemStateChange(toolbar, update.id, checked)?.let(affectedGroups::add)
92
99
  }
93
100
  }
94
101
  affectedGroups.forEach { groupId -> emitGroupSelection(toolbar, groupId) }
@@ -123,49 +130,7 @@ internal class StackHeaderCoordinatorLayout(
123
130
  val delegate = currentDelegate ?: return
124
131
  val provider = currentProvider ?: return
125
132
  val appBar = appBarLayout ?: return
126
-
127
- // When config is transparent, the StackScreen is static so we need to offset the header
128
- // config by the offset of the AppBarLayout (which is 0 or is negative). When config is
129
- // opaque, the Screen always moves with the config, that's why we need to offset the
130
- // header config by the negative value of AppBarLayout's height.
131
- val configOffset = if (provider.transparent) appBar.top else appBar.top - appBar.bottom
132
-
133
- delegate.onHeaderFrameChanged(
134
- appBar.width,
135
- appBar.height,
136
- configOffset,
137
- )
138
-
139
- updateSubviewOffsets(appBar, provider)
140
- }
141
-
142
- private fun updateSubviewOffsets(
143
- appBar: StackHeaderAppBarLayout,
144
- config: StackHeaderConfigurationProviding,
145
- ) {
146
- config.leadingSubview?.let { updateSubviewOffset(it, appBar) }
147
- config.centerSubview?.let { updateSubviewOffset(it, appBar) }
148
- config.trailingSubview?.let { updateSubviewOffset(it, appBar) }
149
- config.backgroundSubview?.let { updateSubviewOffset(it, appBar) }
150
- }
151
-
152
- private fun updateSubviewOffset(
153
- subview: StackHeaderSubviewProviding,
154
- appBar: StackHeaderAppBarLayout,
155
- ) {
156
- val view = subview.view
157
- if (view.width == 0 && view.height == 0) return
158
-
159
- val appBarPos = IntArray(2)
160
- val subviewPos = IntArray(2)
161
- appBar.getLocationInWindow(appBarPos)
162
- view.getLocationInWindow(subviewPos)
163
-
164
- currentDelegate?.onSubviewOriginChanged(
165
- subview.type,
166
- x = subviewPos[0] - appBarPos[0],
167
- y = subviewPos[1] - appBarPos[1],
168
- )
133
+ StackHeaderFrameSynchronizer.sync(appBar, provider, delegate)
169
134
  }
170
135
 
171
136
  // endregion
@@ -180,10 +145,9 @@ internal class StackHeaderCoordinatorLayout(
180
145
 
181
146
  private val applicator = StackHeaderApplicator(wrappedContext)
182
147
 
183
- private var appBarLayout: StackHeaderAppBarLayout? = null
148
+ private val selectionController = StackHeaderToolbarMenuSelectionController()
184
149
 
185
- private var toolbarMenuForwardIdMap = emptyMap<String, Int>()
186
- private var toolbarMenuGroupMetadata = StackHeaderToolbarMenuGroupMetadata.EMPTY
150
+ private var appBarLayout: StackHeaderAppBarLayout? = null
187
151
 
188
152
  private val onNavigationIconClick: () -> Unit = {
189
153
  val activity =
@@ -230,26 +194,36 @@ internal class StackHeaderCoordinatorLayout(
230
194
  provider.clearInvalidationFlags(StackHeaderInvalidationFlags.SCROLL_FLAGS)
231
195
  }
232
196
 
197
+ if (needsRebuild || provider.invalidationFlags.containsAny(StackHeaderInvalidationFlags.LIFT_ON_SCROLL)) {
198
+ // Lift-on-scroll is disabled in transparent mode: there is no content
199
+ // scrolling behavior installed and the app bar overlays the content.
200
+ applicator.applyLiftOnScroll(
201
+ appBar,
202
+ enabled = provider.liftOnScroll && !provider.transparent,
203
+ targetScrollView = stackScreen.findContentScrollView(),
204
+ )
205
+ provider.clearInvalidationFlags(StackHeaderInvalidationFlags.LIFT_ON_SCROLL)
206
+ }
207
+
233
208
  if (provider.invalidationFlags.containsAny(StackHeaderInvalidationFlags.TOOLBAR_MENU)) {
234
209
  val (forwardIdMap, reverseIdMap) =
235
- applicator.generateToolbarMenuItemMappings(
210
+ StackHeaderToolbarMenuApplicator.generateToolbarMenuItemMappings(
236
211
  provider.toolbarMenu,
237
212
  )
238
213
  val forwardGroupIdMap =
239
- applicator.generateToolbarMenuGroupMappings(
214
+ StackHeaderToolbarMenuApplicator.generateToolbarMenuGroupMappings(
240
215
  provider.toolbarMenu,
241
216
  )
242
217
  val groupMetadata =
243
- applicator.computeGroupMetadata(
218
+ StackHeaderToolbarMenuApplicator.computeGroupMetadata(
244
219
  provider.toolbarMenu,
245
220
  )
246
221
 
247
- applicator.validateRadioInitialSelection(provider.toolbarMenu)
222
+ StackHeaderToolbarMenuApplicator.validateRadioInitialSelection(provider.toolbarMenu)
248
223
 
249
- toolbarMenuForwardIdMap = forwardIdMap
250
- toolbarMenuGroupMetadata = groupMetadata
224
+ selectionController.setMenuMaps(forwardIdMap, groupMetadata)
251
225
 
252
- applicator.rebuildToolbarMenu(
226
+ StackHeaderToolbarMenuApplicator.rebuildToolbarMenu(
253
227
  appBar.toolbar,
254
228
  provider.toolbarMenu,
255
229
  forwardIdMap,
@@ -258,7 +232,7 @@ internal class StackHeaderCoordinatorLayout(
258
232
  groupDividerEnabled = provider.toolbarMenuGroupDividerEnabled,
259
233
  onItemClicked = { id, menuItem ->
260
234
  if (menuItem.isCheckable) {
261
- applyGroupItemStateChange(appBar.toolbar, id)?.let { groupId ->
235
+ selectionController.applyGroupItemStateChange(appBar.toolbar, id)?.let { groupId ->
262
236
  emitGroupSelection(appBar.toolbar, groupId)
263
237
  }
264
238
  } else {
@@ -278,63 +252,13 @@ internal class StackHeaderCoordinatorLayout(
278
252
 
279
253
  // region Group selection
280
254
 
281
- /**
282
- * Mutates the checked state of [itemId] within its group and returns the id of the group
283
- * whose selection changed, or `null` when nothing changed (the item is not in a group, an
284
- * invalid attempt to uncheck a single-selection item, or the item was already in the
285
- * target state). Does not emit — callers decide when to emit so that batched updates can
286
- * coalesce into one event per group.
287
- */
288
- private fun applyGroupItemStateChange(
289
- toolbar: MaterialToolbar,
290
- itemId: String,
291
- explicitCheckedValue: Boolean? = null,
292
- ): String? {
293
- val groupId = toolbarMenuGroupMetadata.itemGroupMap[itemId] ?: return null
294
- val singleSelection = toolbarMenuGroupMetadata.groupSingleSelection[groupId] ?: return null
295
- val intId = toolbarMenuForwardIdMap[itemId] ?: return null
296
- val menuItem = toolbar.menu.findItem(intId) ?: return null
297
-
298
- if (singleSelection && explicitCheckedValue == false) {
299
- Log.w(
300
- TAG,
301
- "[RNScreens] Cannot uncheck item '$itemId' in single-selection group '$groupId'. " +
302
- "Check a different item instead.",
303
- )
304
- return null
305
- }
306
-
307
- val newChecked =
308
- if (singleSelection) {
309
- true
310
- } else {
311
- explicitCheckedValue ?: !menuItem.isChecked
312
- }
313
- if (menuItem.isChecked == newChecked) return null
314
- menuItem.isChecked = newChecked
315
-
316
- return groupId
317
- }
318
-
319
255
  private fun emitGroupSelection(
320
256
  toolbar: MaterialToolbar,
321
257
  groupId: String,
322
258
  ) {
323
- currentDelegate?.onGroupSelectionChanged(groupId, collectSelectedIds(toolbar, groupId))
259
+ currentDelegate?.onGroupSelectionChanged(groupId, selectionController.collectSelectedIds(toolbar, groupId))
324
260
  }
325
261
 
326
- private fun collectSelectedIds(
327
- toolbar: MaterialToolbar,
328
- groupId: String,
329
- ): List<String> =
330
- toolbarMenuGroupMetadata
331
- .groupMemberItems[groupId]
332
- .orEmpty()
333
- .filter { memberId ->
334
- val intId = toolbarMenuForwardIdMap[memberId] ?: return@filter false
335
- toolbar.menu.findItem(intId)?.isChecked == true
336
- }
337
-
338
262
  // endregion
339
263
 
340
264
  // region Header lifecycle
@@ -345,8 +269,7 @@ internal class StackHeaderCoordinatorLayout(
345
269
  removeView(it)
346
270
  }
347
271
  appBarLayout = null
348
- toolbarMenuForwardIdMap = emptyMap()
349
- toolbarMenuGroupMetadata = StackHeaderToolbarMenuGroupMetadata.EMPTY
272
+ selectionController.clear()
350
273
  }
351
274
 
352
275
  private fun removeHeader() {
@@ -0,0 +1,63 @@
1
+ package com.swmansion.rnscreens.stack.header
2
+
3
+ import com.swmansion.rnscreens.stack.header.appbar.StackHeaderAppBarLayout
4
+ import com.swmansion.rnscreens.stack.header.config.StackHeaderConfigurationProviding
5
+ import com.swmansion.rnscreens.stack.header.config.StackHeaderDelegate
6
+ import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubviewProviding
7
+
8
+ /**
9
+ * Reports the header's frame and subview origins to the delegate as the app bar
10
+ * lays out or scrolls.
11
+ */
12
+ internal object StackHeaderFrameSynchronizer {
13
+ internal fun sync(
14
+ appBar: StackHeaderAppBarLayout,
15
+ provider: StackHeaderConfigurationProviding,
16
+ delegate: StackHeaderDelegate,
17
+ ) {
18
+ // When config is transparent, the StackScreen is static so we need to offset the header
19
+ // config by the offset of the AppBarLayout (which is 0 or is negative). When config is
20
+ // opaque, the Screen always moves with the config, that's why we need to offset the
21
+ // header config by the negative value of AppBarLayout's height.
22
+ val configOffset = if (provider.transparent) appBar.top else appBar.top - appBar.bottom
23
+
24
+ delegate.onHeaderFrameChanged(
25
+ appBar.width,
26
+ appBar.height,
27
+ configOffset,
28
+ )
29
+
30
+ updateSubviewOffsets(appBar, provider, delegate)
31
+ }
32
+
33
+ private fun updateSubviewOffsets(
34
+ appBar: StackHeaderAppBarLayout,
35
+ config: StackHeaderConfigurationProviding,
36
+ delegate: StackHeaderDelegate,
37
+ ) {
38
+ config.leadingSubview?.let { updateSubviewOffset(it, appBar, delegate) }
39
+ config.centerSubview?.let { updateSubviewOffset(it, appBar, delegate) }
40
+ config.trailingSubview?.let { updateSubviewOffset(it, appBar, delegate) }
41
+ config.backgroundSubview?.let { updateSubviewOffset(it, appBar, delegate) }
42
+ }
43
+
44
+ private fun updateSubviewOffset(
45
+ subview: StackHeaderSubviewProviding,
46
+ appBar: StackHeaderAppBarLayout,
47
+ delegate: StackHeaderDelegate,
48
+ ) {
49
+ val view = subview.view
50
+ if (view.width == 0 && view.height == 0) return
51
+
52
+ val appBarPos = IntArray(2)
53
+ val subviewPos = IntArray(2)
54
+ appBar.getLocationInWindow(appBarPos)
55
+ view.getLocationInWindow(subviewPos)
56
+
57
+ delegate.onSubviewOriginChanged(
58
+ subview.type,
59
+ x = subviewPos[0] - appBarPos[0],
60
+ y = subviewPos[1] - appBarPos[1],
61
+ )
62
+ }
63
+ }
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.stack.header
1
+ package com.swmansion.rnscreens.stack.header.appbar
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
@@ -24,11 +24,6 @@ internal sealed class StackHeaderAppBarLayout(
24
24
  behavior = StackHeaderAppBarLayoutBehavior()
25
25
  }
26
26
 
27
- // TODO: this should be exposed in the future via prop. Also, it might not work correctly
28
- // until we set liftOnScrollView manually. Also, we should disable it in transparent
29
- // mode or set elevation higher.
30
- isLiftOnScroll = true
31
-
32
27
  // TODO: this won't work with nested header but there were some problems with lift on scroll
33
28
  // without it when I was researching this.
34
29
  fitsSystemWindows = true
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.stack.header
1
+ package com.swmansion.rnscreens.stack.header.appbar
2
2
 
3
3
  import android.view.View
4
4
  import androidx.coordinatorlayout.widget.CoordinatorLayout
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.stack.header
1
+ package com.swmansion.rnscreens.stack.header.appbar
2
2
 
3
3
  import android.view.View
4
4
  import androidx.coordinatorlayout.widget.CoordinatorLayout
@@ -17,12 +17,12 @@ import com.swmansion.rnscreens.helpers.resolveImage
17
17
  import com.swmansion.rnscreens.stack.header.subview.OnStackHeaderSubviewChangeListener
18
18
  import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubview
19
19
  import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubviewType
20
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarFieldUpdate
21
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuConfig
22
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuElementRawUpdate
23
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuIconResolver
24
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuItemIconSource
25
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuUpdateQueue
20
+ import com.swmansion.rnscreens.stack.header.toolbar.model.StackHeaderToolbarMenuConfig
21
+ import com.swmansion.rnscreens.stack.header.toolbar.model.StackHeaderToolbarMenuItemIconSource
22
+ import com.swmansion.rnscreens.stack.header.toolbar.update.StackHeaderToolbarFieldUpdate
23
+ import com.swmansion.rnscreens.stack.header.toolbar.update.StackHeaderToolbarMenuElementRawUpdate
24
+ import com.swmansion.rnscreens.stack.header.toolbar.update.StackHeaderToolbarMenuIconResolver
25
+ import com.swmansion.rnscreens.stack.header.toolbar.update.StackHeaderToolbarMenuUpdateQueue
26
26
  import java.lang.ref.WeakReference
27
27
  import kotlin.properties.Delegates
28
28
 
@@ -141,6 +141,11 @@ internal class StackHeaderConfig(
141
141
  }
142
142
  internal set
143
143
 
144
+ override var liftOnScroll: Boolean by Delegates.observable(true) { _, old, new ->
145
+ if (old != new) invalidate(StackHeaderInvalidationFlags.LIFT_ON_SCROLL)
146
+ }
147
+ internal set
148
+
144
149
  override var toolbarMenu: StackHeaderToolbarMenuConfig
145
150
  by Delegates.observable(StackHeaderToolbarMenuConfig(emptyList(), emptyList())) { _, old, new ->
146
151
  if (old != new) invalidate(StackHeaderInvalidationFlags.TOOLBAR_MENU)
@@ -157,6 +162,23 @@ internal class StackHeaderConfig(
157
162
 
158
163
  // endregion
159
164
 
165
+ // region Content scroll view
166
+
167
+ /**
168
+ * Called by the owning [com.swmansion.rnscreens.stack.screen.StackScreen]
169
+ * when its content scroll view changes (e.g. a `ScrollViewMarker` registered
170
+ * one). Re-triggers lift-on-scroll so the coordinator can resolve and apply
171
+ * the up-to-date `liftOnScrollTargetView`.
172
+ */
173
+ internal fun onContentScrollViewChanged() {
174
+ invalidate(StackHeaderInvalidationFlags.LIFT_ON_SCROLL)
175
+ if (!isInsideMountTransaction) {
176
+ flushUpdates()
177
+ }
178
+ }
179
+
180
+ // endregion
181
+
160
182
  // region Back button icon resolution
161
183
 
162
184
  // Staging fields for back button icon resolution.
@@ -15,8 +15,8 @@ import com.facebook.react.uimanager.ViewManagerDelegate
15
15
  import com.facebook.react.viewmanagers.RNSStackHeaderConfigAndroidManagerDelegate
16
16
  import com.facebook.react.viewmanagers.RNSStackHeaderConfigAndroidManagerInterface
17
17
  import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubview
18
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuElementRawUpdate
19
18
  import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuMapper
19
+ import com.swmansion.rnscreens.stack.header.toolbar.update.StackHeaderToolbarMenuElementRawUpdate
20
20
 
21
21
  @ReactModule(name = StackHeaderConfigViewManager.REACT_CLASS)
22
22
  internal open class StackHeaderConfigViewManager :
@@ -218,6 +218,13 @@ internal open class StackHeaderConfigViewManager :
218
218
  view.scrollFlagSnap = value
219
219
  }
220
220
 
221
+ override fun setLiftOnScroll(
222
+ view: StackHeaderConfig,
223
+ value: Boolean,
224
+ ) {
225
+ view.liftOnScroll = value
226
+ }
227
+
221
228
  override fun setToolbarMenuGroupDividerEnabled(
222
229
  view: StackHeaderConfig,
223
230
  value: Boolean,
@@ -1,6 +1,6 @@
1
1
  package com.swmansion.rnscreens.stack.header.config
2
2
 
3
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuElementUpdate
3
+ import com.swmansion.rnscreens.stack.header.toolbar.update.StackHeaderToolbarMenuElementUpdate
4
4
 
5
5
  internal interface StackHeaderConfigurationObserver {
6
6
  fun onConfigChanged(config: StackHeaderConfigurationProviding)
@@ -2,7 +2,7 @@ package com.swmansion.rnscreens.stack.header.config
2
2
 
3
3
  import android.graphics.drawable.Drawable
4
4
  import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubviewProviding
5
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuConfig
5
+ import com.swmansion.rnscreens.stack.header.toolbar.model.StackHeaderToolbarMenuConfig
6
6
 
7
7
  internal interface StackHeaderConfigurationProviding {
8
8
  val type: StackHeaderType
@@ -19,6 +19,7 @@ internal interface StackHeaderConfigurationProviding {
19
19
  val scrollFlagEnterAlwaysCollapsed: Boolean
20
20
  val scrollFlagExitUntilCollapsed: Boolean
21
21
  val scrollFlagSnap: Boolean
22
+ val liftOnScroll: Boolean
22
23
  val leadingSubview: StackHeaderSubviewProviding?
23
24
  val centerSubview: StackHeaderSubviewProviding?
24
25
  val trailingSubview: StackHeaderSubviewProviding?
@@ -12,9 +12,10 @@ internal value class StackHeaderInvalidationFlags(
12
12
  val BACK_BUTTON = StackHeaderInvalidationFlags(1 shl 3)
13
13
  val SCROLL_FLAGS = StackHeaderInvalidationFlags(1 shl 4)
14
14
  val TOOLBAR_MENU = StackHeaderInvalidationFlags(1 shl 5)
15
+ val LIFT_ON_SCROLL = StackHeaderInvalidationFlags(1 shl 6)
15
16
 
16
17
  val APPEARANCE = TITLE or BACK_BUTTON
17
- val ALL = STRUCTURE or SUBVIEWS or APPEARANCE or SCROLL_FLAGS or TOOLBAR_MENU
18
+ val ALL = STRUCTURE or SUBVIEWS or APPEARANCE or SCROLL_FLAGS or TOOLBAR_MENU or LIFT_ON_SCROLL
18
19
  }
19
20
 
20
21
  infix fun or(other: StackHeaderInvalidationFlags) = StackHeaderInvalidationFlags(raw or other.raw)