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
@@ -2,13 +2,11 @@ package com.swmansion.rnscreens.stack.header
2
2
 
3
3
  import android.content.res.ColorStateList
4
4
  import android.graphics.drawable.Drawable
5
- import android.os.Build
6
5
  import android.text.TextUtils
7
6
  import android.util.Log
8
7
  import android.view.Gravity
9
- import android.view.Menu
10
- import android.view.MenuItem
11
8
  import android.view.View
9
+ import android.view.ViewGroup
12
10
  import android.view.ViewGroup.LayoutParams.MATCH_PARENT
13
11
  import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
14
12
  import android.widget.FrameLayout
@@ -16,7 +14,6 @@ import androidx.appcompat.view.ContextThemeWrapper
16
14
  import androidx.appcompat.widget.AppCompatTextView
17
15
  import androidx.appcompat.widget.Toolbar
18
16
  import androidx.core.graphics.drawable.DrawableCompat
19
- import androidx.core.view.MenuItemCompat
20
17
  import androidx.core.widget.TextViewCompat
21
18
  import com.google.android.material.R
22
19
  import com.google.android.material.appbar.AppBarLayout
@@ -28,25 +25,21 @@ import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_
28
25
  import com.google.android.material.appbar.CollapsingToolbarLayout
29
26
  import com.google.android.material.appbar.MaterialToolbar
30
27
  import com.swmansion.rnscreens.ext.detachFromCurrentParent
28
+ import com.swmansion.rnscreens.stack.header.appbar.StackHeaderAppBarLayout
31
29
  import com.swmansion.rnscreens.stack.header.config.StackHeaderConfigurationProviding
32
30
  import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubview
33
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarFieldUpdate
34
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuConfig
35
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuElementConfig
36
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuElementOptions
37
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuGroupConfig
38
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuGroupMetadata
39
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuItemConfig
40
- import com.swmansion.rnscreens.stack.header.toolbar.StackHeaderToolbarMenuItemType
41
- import com.swmansion.rnscreens.stack.header.toolbar.valueOrNull
42
31
  import com.swmansion.rnscreens.utils.resolveDrawableAttr
43
32
 
33
+ /**
34
+ * Builds and applies the Material app bar — type, subviews, title, back button,
35
+ * scroll flags — from the header configuration.
36
+ */
44
37
  internal class StackHeaderApplicator(
45
38
  private val wrappedContext: ContextThemeWrapper,
46
39
  ) {
47
40
  // region Rebuild
48
41
 
49
- fun rebuild(
42
+ internal fun rebuild(
50
43
  coordinatorLayout: StackHeaderCoordinatorLayout,
51
44
  config: StackHeaderConfigurationProviding,
52
45
  ): StackHeaderAppBarLayout {
@@ -180,7 +173,7 @@ internal class StackHeaderApplicator(
180
173
 
181
174
  // region In-place updates
182
175
 
183
- fun applyTitle(
176
+ internal fun applyTitle(
184
177
  appBar: StackHeaderAppBarLayout,
185
178
  config: StackHeaderConfigurationProviding,
186
179
  ) {
@@ -196,7 +189,7 @@ internal class StackHeaderApplicator(
196
189
  }
197
190
  }
198
191
 
199
- fun applyBackButton(
192
+ internal fun applyBackButton(
200
193
  toolbar: MaterialToolbar,
201
194
  config: StackHeaderConfigurationProviding,
202
195
  canNavigateBack: Boolean,
@@ -230,7 +223,7 @@ internal class StackHeaderApplicator(
230
223
  toolbar.setNavigationOnClickListener { onNavigationIconClick() }
231
224
  }
232
225
 
233
- fun applyScrollFlags(
226
+ internal fun applyScrollFlags(
234
227
  appBar: StackHeaderAppBarLayout,
235
228
  config: StackHeaderConfigurationProviding,
236
229
  ) {
@@ -249,298 +242,32 @@ internal class StackHeaderApplicator(
249
242
  appBar.setExpanded(true, false)
250
243
  }
251
244
 
252
- // endregion
253
-
254
- // region Toolbar menu
255
-
256
- fun generateToolbarMenuItemMappings(menuConfig: StackHeaderToolbarMenuConfig): Pair<Map<String, Int>, Map<Int, String>> {
257
- val forwardIdMap = mutableMapOf<String, Int>()
258
- val reverseIdMap = mutableMapOf<Int, String>()
259
- var counter = 1
260
- assignElementIds(menuConfig.children, forwardIdMap, reverseIdMap) { counter++ }
261
- return Pair(forwardIdMap.toMap(), reverseIdMap.toMap())
262
- }
263
-
264
- fun generateToolbarMenuGroupMappings(menuConfig: StackHeaderToolbarMenuConfig): Map<String, Int> {
265
- val forwardGroupIdMap = mutableMapOf<String, Int>()
266
- var counter = 1
267
- assignGroupIds(menuConfig, forwardGroupIdMap) { counter++ }
268
- return forwardGroupIdMap.toMap()
269
- }
270
-
271
- fun computeGroupMetadata(menuConfig: StackHeaderToolbarMenuConfig): StackHeaderToolbarMenuGroupMetadata {
272
- val itemGroupMap = mutableMapOf<String, String>()
273
- val groupSingleSelection = mutableMapOf<String, Boolean>()
274
- val groupMemberItems = mutableMapOf<String, MutableList<String>>()
275
- collectGroupMetadata(menuConfig, itemGroupMap, groupSingleSelection, groupMemberItems)
276
- return StackHeaderToolbarMenuGroupMetadata(
277
- itemGroupMap,
278
- groupSingleSelection,
279
- groupMemberItems.mapValues { it.value.toList() },
280
- )
281
- }
282
-
283
- fun validateRadioInitialSelection(menuConfig: StackHeaderToolbarMenuConfig) {
284
- for (group in menuConfig.groups) {
285
- if (!group.singleSelection) continue
286
- var count = 0
287
- for (element in menuConfig.children) {
288
- if (element.item.groupId == group.groupId && element.item.initialToggleState) {
289
- count++
290
- }
291
- }
292
- require(count <= 1) {
293
- "[RNScreens] Radio group '${group.groupId}' has $count items with " +
294
- "initialToggleState=true. At most 1 is allowed for single-selection groups."
295
- }
296
- }
297
- for (element in menuConfig.children) {
298
- if (element is StackHeaderToolbarMenuElementConfig.Submenu) {
299
- validateRadioInitialSelection(element.menu)
300
- }
301
- }
302
- }
303
-
304
245
  /**
305
- * Recursively traverses menu elements and maps user-friendly string item IDs to integers
306
- * expected by Android.
246
+ * Applies lift-on-scroll in-place. `setLiftOnScroll` is a plain field
247
+ * setter (re-read on the next layout / nested-scroll pass), so this needs
248
+ * no header rebuild.
307
249
  *
308
- * @param elements List of menu elements.
309
- * @param forwardIdMap Reference to String->Int ID map to which ID entries will be added.
310
- * @param reverseIdMap Reference to Int->String ID map to which ID entries will be added.
311
- * @param nextId Function that returns next ID integer. New unique integer should be returned
312
- * each time the function is called. The function is used to handle recursive
313
- * element traversal.
314
- */
315
- private fun assignElementIds(
316
- elements: List<StackHeaderToolbarMenuElementConfig>,
317
- forwardIdMap: MutableMap<String, Int>,
318
- reverseIdMap: MutableMap<Int, String>,
319
- nextId: () -> Int,
320
- ) {
321
- for (element in elements) {
322
- require(element.item.id !in forwardIdMap) {
323
- "[RNScreens] Duplicate toolbar menu item id: '${element.item.id}'. Item IDs must be unique across the entire menu."
324
- }
325
- val nativeId = nextId()
326
- forwardIdMap[element.item.id] = nativeId
327
- reverseIdMap[nativeId] = element.item.id
328
- if (element is StackHeaderToolbarMenuElementConfig.Submenu) {
329
- assignElementIds(element.menu.children, forwardIdMap, reverseIdMap, nextId)
330
- }
331
- }
332
- }
333
-
334
- /**
335
- * Recursively traverses menu elements and maps user-friendly string group IDs to integers
336
- * expected by Android.
250
+ * Only the small header participates: medium/large (collapsing) headers
251
+ * derive their elevation from the `CollapsingToolbarLayout` content scrim,
252
+ * not from lift-on-scroll, so we leave their app bar untouched.
337
253
  *
338
- * @param elements List of menu elements.
339
- * @param forwardIdMap Reference to String->Int ID map to which ID entries will be added.
340
- * @param reverseIdMap Reference to Int->String ID map to which ID entries will be added.
341
- * @param nextId Function that returns next ID integer. New unique integer should be returned
342
- * each time the function is called. The function is used to handle recursive
343
- * element traversal.
254
+ * [targetScrollView] is the resolved content scroll view (see
255
+ * [com.swmansion.rnscreens.common.container.ContainerItem.findContentScrollView]).
256
+ * Without it, Material's `findFirstScrollingChild` only inspects the
257
+ * CoordinatorLayout's direct children which is our wrapper `FrameLayout`,
258
+ * not the (deeply nested) scroll view so the lifted state is miscomputed
259
+ * and the small header flashes while scrolling.
344
260
  */
345
- private fun assignGroupIds(
346
- menuConfig: StackHeaderToolbarMenuConfig,
347
- forwardMap: MutableMap<String, Int>,
348
- nextId: () -> Int,
349
- ) {
350
- for (group in menuConfig.groups) {
351
- require(group.groupId !in forwardMap) {
352
- "[RNScreens] Duplicate toolbar menu group id: '${group.groupId}'. Group IDs must be unique across the entire menu."
353
- }
354
- forwardMap[group.groupId] = nextId()
355
- }
356
- for (element in menuConfig.children) {
357
- if (element is StackHeaderToolbarMenuElementConfig.Submenu) {
358
- assignGroupIds(element.menu, forwardMap, nextId)
359
- }
360
- }
361
- }
362
-
363
- private fun collectGroupMetadata(
364
- config: StackHeaderToolbarMenuConfig,
365
- itemGroupMap: MutableMap<String, String>,
366
- groupSingleSelection: MutableMap<String, Boolean>,
367
- groupMemberItems: MutableMap<String, MutableList<String>>,
368
- ) {
369
- val localGroupIds = config.groups.map { it.groupId }.toSet()
370
- for (group in config.groups) {
371
- groupSingleSelection[group.groupId] = group.singleSelection
372
- groupMemberItems.getOrPut(group.groupId) { mutableListOf() }
373
- }
374
- for (element in config.children) {
375
- element.item.groupId?.let { gid ->
376
- require(gid in localGroupIds) {
377
- "[RNScreens] Menu item '${element.item.id}' references group '$gid' " +
378
- "which is not defined at the same menu level. " +
379
- "Groups cannot span submenus."
380
- }
381
- itemGroupMap[element.item.id] = gid
382
- groupMemberItems[gid]!!.add(element.item.id)
383
- }
384
- if (element is StackHeaderToolbarMenuElementConfig.Submenu) {
385
- collectGroupMetadata(element.menu, itemGroupMap, groupSingleSelection, groupMemberItems)
386
- }
387
- }
388
- }
389
-
390
- fun rebuildToolbarMenu(
391
- toolbar: MaterialToolbar,
392
- menuConfig: StackHeaderToolbarMenuConfig,
393
- forwardIdMap: Map<String, Int>,
394
- reverseIdMap: Map<Int, String>,
395
- forwardGroupIdMap: Map<String, Int>,
396
- groupDividerEnabled: Boolean,
397
- onItemClicked: (id: String, menuItem: MenuItem) -> Unit,
398
- ) {
399
- toolbar.menu.clear()
400
- addElements(toolbar, toolbar.menu, menuConfig, forwardIdMap, forwardGroupIdMap)
401
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
402
- toolbar.menu.setGroupDividerEnabled(groupDividerEnabled)
403
- }
404
- toolbar.setOnMenuItemClickListener { menuItem ->
405
- val stringId = reverseIdMap[menuItem.itemId]
406
- if (stringId != null) {
407
- onItemClicked(stringId, menuItem)
408
- }
409
- true
410
- }
411
- }
412
-
413
- private fun addElements(
414
- toolbar: MaterialToolbar,
415
- menu: Menu,
416
- menuConfig: StackHeaderToolbarMenuConfig,
417
- forwardIdMap: Map<String, Int>,
418
- forwardGroupIdMap: Map<String, Int>,
419
- ) {
420
- menuConfig.children.forEachIndexed { index, element ->
421
- val itemId =
422
- requireNotNull(forwardIdMap[element.item.id]) {
423
- "[RNScreens] Invalid forwardIdMap received. Missing item: ${element.item}."
424
- }
425
- val groupIntId =
426
- element.item.groupId
427
- ?.let { forwardGroupIdMap[it] ?: Menu.NONE }
428
- ?: Menu.NONE
429
- when (element) {
430
- is StackHeaderToolbarMenuElementConfig.MenuItem -> {
431
- val menuItem = menu.add(groupIntId, itemId, index, null)
432
- applyMenuElementOptions(toolbar, menuItem, element.item.toOptions())
433
- applyCheckability(menuItem, element.item)
434
- }
435
- is StackHeaderToolbarMenuElementConfig.Submenu -> {
436
- val subMenu = menu.addSubMenu(groupIntId, itemId, index, null)
437
- applyMenuElementOptions(toolbar, subMenu.item, element.item.toOptions())
438
- element.menuTitle?.let { subMenu.setHeaderTitle(it) }
439
- addElements(toolbar, subMenu, element.menu, forwardIdMap, forwardGroupIdMap)
440
- }
441
- }
442
- }
443
- configureGroupCheckability(menu, menuConfig.groups, forwardGroupIdMap)
444
- }
445
-
446
- private fun configureGroupCheckability(
447
- menu: Menu,
448
- groups: List<StackHeaderToolbarMenuGroupConfig>,
449
- forwardGroupIdMap: Map<String, Int>,
450
- ) {
451
- for (group in groups) {
452
- val groupIntId = forwardGroupIdMap[group.groupId] ?: continue
453
- menu.setGroupCheckable(groupIntId, true, group.singleSelection)
454
- }
455
- }
456
-
457
- private fun applyCheckability(
458
- menuItem: MenuItem,
459
- itemConfig: StackHeaderToolbarMenuItemConfig,
460
- ) {
461
- val shouldBeCheckable =
462
- when (itemConfig.itemType) {
463
- StackHeaderToolbarMenuItemType.TOGGLE -> {
464
- require(itemConfig.groupId != null) {
465
- "[RNScreens] Menu item '${itemConfig.id}' has itemType=TOGGLE but no groupId. " +
466
- "Toggle items must belong to a group."
467
- }
468
- true
469
- }
470
- StackHeaderToolbarMenuItemType.AUTOMATIC -> itemConfig.groupId != null
471
- StackHeaderToolbarMenuItemType.ACTION -> {
472
- require(itemConfig.groupId == null) {
473
- "[RNScreens] Menu item '${itemConfig.id}' has itemType=ACTION " +
474
- "and belongs to a group. Action items cannot belong to groups."
475
- }
476
- false
477
- }
478
- }
479
- if (shouldBeCheckable) {
480
- menuItem.isCheckable = true
481
- menuItem.isChecked = itemConfig.initialToggleState
482
- }
483
- }
484
-
485
- fun updateToolbarMenuElement(
486
- toolbar: MaterialToolbar,
487
- forwardIdMap: Map<String, Int>,
488
- id: String,
489
- options: StackHeaderToolbarMenuElementOptions,
261
+ internal fun applyLiftOnScroll(
262
+ appBar: StackHeaderAppBarLayout,
263
+ enabled: Boolean,
264
+ targetScrollView: ViewGroup?,
490
265
  ) {
491
- val item =
492
- forwardIdMap[id]?.let { toolbar.menu.findItem(it) } ?: run {
493
- Log.e(TAG, "[RNScreens] Unable to find menu element.")
494
- return
495
- }
496
- applyMenuElementOptions(toolbar, item, options)
497
- }
266
+ if (appBar !is StackHeaderAppBarLayout.Small) return
498
267
 
499
- private fun applyMenuElementOptions(
500
- toolbar: MaterialToolbar,
501
- menuItem: MenuItem,
502
- options: StackHeaderToolbarMenuElementOptions,
503
- ) {
504
- options.title?.let { menuItem.title = it.valueOrNull() }
505
- options.titleCondensed?.let { menuItem.titleCondensed = it.valueOrNull() }
506
- options.tooltipText?.let { MenuItemCompat.setTooltipText(menuItem, it.valueOrNull()) }
507
- options.accessibilityLabel?.let {
508
- // Setting `null` will restore Android's default (`title` for items
509
- // in toolbar, `null` otherwise).
510
- MenuItemCompat.setContentDescription(menuItem, it.valueOrNull())
511
- }
512
- options.hidden?.let { menuItem.isVisible = !it }
513
- options.disabled?.let { menuItem.isEnabled = !it }
514
- options.showAsAction?.let { menuItem.setShowAsAction(it.toNativeShowAsAction()) }
515
-
516
- // checked is intentionally not handled here. The coordinator layout manages it in
517
- // applyGroupItemStateChange because toggling checked state requires group metadata
518
- // (radio vs checkbox) and may emit onGroupSelectionChanged events.
519
-
520
- options.icon?.let {
521
- when (it) {
522
- StackHeaderToolbarFieldUpdate.Reset -> menuItem.icon = null
523
- is StackHeaderToolbarFieldUpdate.Set<Drawable> ->
524
- menuItem.icon = getResizedDrawable(toolbar, it.value)
525
- }
526
- }
527
-
528
- if (options.requiresIconTintColorUpdate || options.icon != null) {
529
- MenuItemCompat.setIconTintList(menuItem, getResolvedIconTintList(menuItem, options))
530
- }
531
-
532
- options.menuTitle?.let { update ->
533
- val subMenu = menuItem.subMenu
534
- if (subMenu != null) {
535
- // In order to match native behavior, we need to clear the header first and then use
536
- // regular title if menuTitle is not provided. If title is also null, there will be
537
- // no submenu header at all.
538
- subMenu.clearHeader()
539
- subMenu.setHeaderTitle(update.valueOrNull() ?: menuItem.title)
540
- } else {
541
- Log.w(TAG, "[RNScreens] menuTitle ignored: target is not a submenu.")
542
- }
543
- }
268
+ appBar.isLiftOnScroll = enabled
269
+ appBar.setLiftOnScrollTargetView(if (enabled) targetScrollView else null)
270
+ appBar.requestLayout()
544
271
  }
545
272
 
546
273
  // endregion
@@ -613,22 +340,6 @@ internal class StackHeaderApplicator(
613
340
  }
614
341
  }
615
342
 
616
- private fun StackHeaderToolbarMenuItemConfig.toOptions() =
617
- StackHeaderToolbarMenuElementOptions(
618
- title = StackHeaderToolbarFieldUpdate.from(title),
619
- titleCondensed = StackHeaderToolbarFieldUpdate.from(titleCondensed),
620
- tooltipText = StackHeaderToolbarFieldUpdate.from(tooltipText),
621
- accessibilityLabel = StackHeaderToolbarFieldUpdate.from(accessibilityLabel),
622
- hidden = hidden,
623
- disabled = disabled,
624
- showAsAction = showAsAction,
625
- icon = StackHeaderToolbarFieldUpdate.from(icon),
626
- iconTintColorNormal = StackHeaderToolbarFieldUpdate.from(iconTintColorNormal),
627
- iconTintColorPressed = StackHeaderToolbarFieldUpdate.from(iconTintColorPressed),
628
- iconTintColorFocused = StackHeaderToolbarFieldUpdate.from(iconTintColorFocused),
629
- iconTintColorDisabled = StackHeaderToolbarFieldUpdate.from(iconTintColorDisabled),
630
- )
631
-
632
343
  private fun resolveBackButtonTintList(config: StackHeaderConfigurationProviding): ColorStateList? {
633
344
  val normal = config.backButtonTintColorNormal
634
345
  val pressed = config.backButtonTintColorPressed
@@ -655,108 +366,9 @@ internal class StackHeaderApplicator(
655
366
  return ColorStateList(states.toTypedArray(), colors.toIntArray())
656
367
  }
657
368
 
658
- private fun getResolvedIconTintList(
659
- menuItem: MenuItem,
660
- options: StackHeaderToolbarMenuElementOptions,
661
- ): ColorStateList? {
662
- val currentTintList = MenuItemCompat.getIconTintList(menuItem)
663
- // The currently-applied normal (catch-all) color, if any. Used both as the "leave
664
- // unchanged" value for normal and to dedup read-back overrides: when a normal entry
665
- // exists every override probe also matches it, so an override equal to the current
666
- // normal is the catch-all leaking through rather than an explicit override.
667
- val currentNormal = currentTintList?.resolvedColorOrNull(intArrayOf(android.R.attr.state_enabled))
668
-
669
- val finalNormal =
670
- when (val update = options.iconTintColorNormal) {
671
- StackHeaderToolbarFieldUpdate.Reset -> null
672
- is StackHeaderToolbarFieldUpdate.Set -> update.value
673
- null -> currentNormal
674
- }
675
-
676
- val finalDisabled =
677
- when (val update = options.iconTintColorDisabled) {
678
- StackHeaderToolbarFieldUpdate.Reset -> null
679
- is StackHeaderToolbarFieldUpdate.Set -> update.value
680
- null ->
681
- currentTintList
682
- ?.resolvedColorOrNull(intArrayOf(-android.R.attr.state_enabled))
683
- ?.takeIf { it != currentNormal }
684
- }
685
-
686
- val finalPressed =
687
- when (val update = options.iconTintColorPressed) {
688
- StackHeaderToolbarFieldUpdate.Reset -> null
689
- is StackHeaderToolbarFieldUpdate.Set -> update.value
690
- null ->
691
- currentTintList
692
- ?.resolvedColorOrNull(intArrayOf(android.R.attr.state_enabled, android.R.attr.state_pressed))
693
- ?.takeIf { it != currentNormal }
694
- }
695
-
696
- val finalFocused =
697
- when (val update = options.iconTintColorFocused) {
698
- StackHeaderToolbarFieldUpdate.Reset -> null
699
- is StackHeaderToolbarFieldUpdate.Set -> update.value
700
- null ->
701
- currentTintList
702
- ?.resolvedColorOrNull(intArrayOf(android.R.attr.state_enabled, android.R.attr.state_focused))
703
- ?.takeIf { it != currentNormal }
704
- }
705
-
706
- val states = mutableListOf<IntArray>()
707
- val colors = mutableListOf<Int>()
708
-
709
- finalDisabled?.let {
710
- states.add(intArrayOf(-android.R.attr.state_enabled))
711
- colors.add(it)
712
- }
713
-
714
- finalPressed?.let {
715
- states.add(intArrayOf(android.R.attr.state_pressed))
716
- colors.add(it)
717
- }
718
-
719
- finalFocused?.let {
720
- states.add(intArrayOf(android.R.attr.state_focused))
721
- colors.add(it)
722
- }
723
-
724
- finalNormal?.let {
725
- states.add(intArrayOf())
726
- colors.add(it)
727
- }
728
-
729
- return if (states.isNotEmpty()) {
730
- ColorStateList(states.toTypedArray(), colors.toIntArray())
731
- } else {
732
- null
733
- }
734
- }
735
-
736
- /**
737
- * Resolves the color the receiver applies to [stateSet], or `null` when no state spec
738
- * matches it.
739
- *
740
- * `getColorForState` returns the caller-supplied fallback when nothing matches, so we
741
- * probe twice with two distinct sentinels: equal results mean a real spec matched (the
742
- * actual color), differing results mean the slot is absent. This is robust for any color
743
- * value and keeps the read-back stateless — see [getResolvedIconTintList].
744
- */
745
- private fun ColorStateList.resolvedColorOrNull(stateSet: IntArray): Int? {
746
- val a = getColorForState(stateSet, SENTINEL_A)
747
- val b = getColorForState(stateSet, SENTINEL_B)
748
- return if (a == b) a else null
749
- }
750
-
751
369
  // endregion
752
370
 
753
371
  companion object {
754
372
  private const val TAG = "StackHeaderApplicator"
755
-
756
- // Two distinct sentinel fallbacks used to detect whether a ColorStateList actually
757
- // defines a color for a given state. Their concrete values are irrelevant as long as
758
- // they differ — see resolvedColorOrNull.
759
- private const val SENTINEL_A = 0x00000001
760
- private const val SENTINEL_B = 0x00000002
761
373
  }
762
374
  }