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

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 (337) hide show
  1. package/README.md +0 -4
  2. package/android/build.gradle +1 -0
  3. package/android/consumer-rules.pro +3 -0
  4. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderConfigViewGroup.kt +2 -0
  5. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderSubviewViewGroup.kt +2 -0
  6. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledViewGroup.kt +18 -3
  7. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  8. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +7 -3
  9. package/android/src/main/java/com/swmansion/rnscreens/common/colorscheme/ColorSchemeCoordinator.kt +11 -1
  10. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +9 -0
  11. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetAppearanceCoordinator.kt +2 -2
  12. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetBehaviorController.kt +2 -2
  13. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetDimensionsCoordinator.kt +6 -6
  14. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetKeyboardCoordinator.kt +1 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetNativeDismissCoordinator.kt +2 -2
  16. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetAvailableHeightProvider.kt +1 -1
  17. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetContainer.kt +1 -1
  18. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialog.kt +1 -1
  19. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialogManager.kt +26 -8
  20. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeDelegate.kt +1 -1
  21. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeProvider.kt +1 -1
  22. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetDialogEventEmitter.kt +1 -1
  23. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetConfig.kt +1 -1
  24. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetDetents.kt +1 -1
  25. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetAnimatorFactory.kt +1 -1
  26. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetDimmingManager.kt +6 -18
  27. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetDismissalOrigin.kt +1 -1
  28. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentation.kt +10 -10
  29. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationManager.kt +1 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationState.kt +1 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetStackRegistry.kt +1 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/ext/FragmentManagerExt.kt +6 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/helpers/FragmentManagerHelper.kt +0 -3
  34. package/android/src/main/java/com/swmansion/rnscreens/helpers/NoTintDrawable.kt +31 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/helpers/ViewFinder.kt +0 -17
  36. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +29 -2
  37. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenContainer.kt +35 -3
  38. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +13 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderConfig.kt +7 -1
  40. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderSubviewManager.kt +7 -0
  41. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackViewManager.kt +6 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/DimmingView.kt +2 -0
  43. package/android/src/main/java/com/swmansion/rnscreens/legacy/stack/views/ScreensCoordinatorLayout.kt +2 -0
  44. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapper.kt +3 -3
  45. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapperViewManager.kt +1 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDetentChangedEvent.kt +1 -1
  47. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidAppearEvent.kt +1 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidDisappearEvent.kt +1 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDismissEvent.kt +1 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissEvent.kt +1 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissPreventedEvent.kt +1 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetSyncFlushEvent.kt +1 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillAppearEvent.kt +1 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillDisappearEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetContentView.kt +3 -3
  56. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHost.kt +5 -3
  57. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostEventEmitter.kt +11 -11
  58. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostViewManager.kt +10 -10
  59. package/android/src/main/java/com/swmansion/rnscreens/safearea/OnInterfaceInsetsChangeListener.kt +15 -0
  60. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaProvider.kt +8 -8
  61. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaView.kt +3 -2
  62. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +0 -52
  63. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +112 -59
  64. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +1 -1
  65. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderToolbar.kt +74 -0
  66. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +4 -73
  67. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +5 -2
  68. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +0 -6
  69. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +3 -7
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperation.kt +1 -0
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperationExecutor.kt +2 -1
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +57 -19
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerDelegate.kt +7 -0
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerUpdateCoordinator.kt +5 -3
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +14 -5
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackUpdateBatchStateProviding.kt +10 -0
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/PreventNativeDismissCallback.kt +2 -2
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +33 -12
  79. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceApplicator.kt +106 -10
  80. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +44 -3
  81. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceModel.kt +3 -0
  82. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/CustomBottomNavigationView.kt +21 -1
  83. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +28 -13
  84. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainerDelegate.kt +11 -0
  85. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +12 -2
  86. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +41 -17
  87. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenDelegate.kt +6 -0
  88. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIcon.kt +82 -0
  89. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIconTinting.kt +17 -0
  90. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenViewManager.kt +26 -19
  91. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +14 -7
  92. package/android/src/main/java/com/swmansion/rnscreens/utils/RNSLog.kt +22 -6
  93. package/ios/RNSEnums.h +14 -1
  94. package/ios/helpers/image/RNSImageLoadingHelper.h +7 -0
  95. package/ios/helpers/image/RNSImageLoadingHelper.mm +9 -0
  96. package/ios/legacy/RNSBarButtonItem.mm +15 -0
  97. package/ios/legacy/RNSConvert.h +6 -0
  98. package/ios/legacy/RNSConvert.mm +17 -0
  99. package/ios/legacy/RNSNavigationBar.h +31 -0
  100. package/ios/legacy/RNSNavigationBar.mm +15 -0
  101. package/ios/legacy/RNSScreen.mm +122 -12
  102. package/ios/legacy/RNSScreenContentWrapper.mm +4 -1
  103. package/ios/legacy/RNSScreenStack.mm +202 -15
  104. package/ios/legacy/RNSScreenStackHeaderConfig.h +30 -0
  105. package/ios/legacy/RNSScreenStackHeaderConfig.mm +70 -17
  106. package/ios/legacy/RNSScreenStackHeaderSubview.mm +33 -0
  107. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +1 -12
  108. package/ios/stack/conversion/RNSConversions-Stack.h +30 -0
  109. package/ios/stack/conversion/RNSConversions-Stack.mm +79 -0
  110. package/ios/stack/header/RNSHeaderItemVisibilityPriority.h +9 -0
  111. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +4 -0
  112. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +40 -6
  113. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +5 -0
  114. package/ios/stack/header/RNSStackHeaderContentFactory.mm +3 -0
  115. package/ios/stack/header/RNSStackHeaderItemComponentView.h +9 -2
  116. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +57 -3
  117. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +5 -0
  118. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +13 -0
  119. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +24 -0
  120. package/ios/stack/header/RNSStackHeaderMenuFinder.h +8 -1
  121. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +26 -9
  122. package/ios/stack/screen/RNSStackScreenComponentView.h +2 -1
  123. package/ios/stack/screen/RNSStackScreenComponentView.mm +23 -0
  124. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +81 -8
  125. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +79 -16
  126. package/ios/tabs/RNSTabBarItemCoordinator.h +16 -0
  127. package/ios/tabs/RNSTabBarItemCoordinator.mm +143 -0
  128. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.h +24 -0
  129. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.mm +22 -0
  130. package/ios/tabs/conversion/RNSConversions-Tabs.h +22 -0
  131. package/ios/tabs/conversion/RNSConversions-Tabs.mm +97 -3
  132. package/ios/tabs/host/RNSTabBarController.h +16 -0
  133. package/ios/tabs/host/RNSTabBarController.mm +516 -107
  134. package/ios/tabs/host/RNSTabsHostComponentView.h +2 -0
  135. package/ios/tabs/host/RNSTabsHostComponentView.mm +32 -2
  136. package/ios/tabs/screen/RNSTabsScreenComponentView.h +21 -0
  137. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +54 -69
  138. package/ios/tabs/screen/RNSTabsScreenViewController.mm +1 -0
  139. package/ios/utils/RNSDefines.h +12 -7
  140. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +3 -2
  141. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  142. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +8 -3
  143. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  144. package/lib/commonjs/components/stack/header/StackHeaderConfig.js +17 -0
  145. package/lib/commonjs/components/stack/header/StackHeaderConfig.js.map +1 -0
  146. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  147. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  148. package/lib/commonjs/components/stack/host/StackHost.js +8 -1
  149. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  150. package/lib/commonjs/components/stack/host/StackHost.web.js +0 -2
  151. package/lib/commonjs/components/stack/host/StackHost.web.js.map +1 -1
  152. package/lib/commonjs/components/stack/index.js.map +1 -1
  153. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +2 -0
  154. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  155. package/lib/commonjs/components/tabs/host/{TabsHost.web.js → TabsHost.js} +1 -1
  156. package/lib/commonjs/components/tabs/host/TabsHost.js.map +1 -0
  157. package/lib/commonjs/components/tabs/index.js.map +1 -1
  158. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js +3 -1
  159. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js.map +1 -1
  160. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js +10 -1
  161. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  162. package/lib/commonjs/components/tabs/screen/{TabsScreen.web.js → TabsScreen.js} +1 -1
  163. package/lib/commonjs/components/tabs/screen/TabsScreen.js.map +1 -0
  164. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js → tabs/screen/TabsScreenIcon.types.js} +1 -1
  165. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  166. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  167. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  168. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  169. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  170. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  171. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  172. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  173. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  174. package/lib/commonjs/legacy/components/ScreenStackItem.js +31 -11
  175. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  176. package/lib/module/components/stack/header/StackHeaderConfig.android.js +4 -3
  177. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  178. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +9 -4
  179. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  180. package/lib/module/components/stack/header/StackHeaderConfig.js +10 -0
  181. package/lib/module/components/stack/header/StackHeaderConfig.js.map +1 -0
  182. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  183. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  184. package/lib/module/components/stack/host/StackHost.js +9 -2
  185. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  186. package/lib/module/components/stack/host/StackHost.web.js +0 -3
  187. package/lib/module/components/stack/host/StackHost.web.js.map +1 -1
  188. package/lib/module/components/stack/index.js.map +1 -1
  189. package/lib/module/components/tabs/host/TabsHost.ios.js +2 -0
  190. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  191. package/{src/components/tabs/host/TabsHost.web.tsx → lib/module/components/tabs/host/TabsHost.js} +1 -2
  192. package/lib/module/components/tabs/host/TabsHost.js.map +1 -0
  193. package/lib/module/components/tabs/index.js.map +1 -1
  194. package/lib/module/components/tabs/screen/TabsScreen.android.js +3 -1
  195. package/lib/module/components/tabs/screen/TabsScreen.android.js.map +1 -1
  196. package/lib/module/components/tabs/screen/TabsScreen.ios.js +10 -1
  197. package/lib/module/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  198. package/{src/components/tabs/screen/TabsScreen.web.tsx → lib/module/components/tabs/screen/TabsScreen.js} +1 -2
  199. package/lib/module/components/tabs/screen/TabsScreen.js.map +1 -0
  200. package/lib/module/components/tabs/screen/TabsScreenIcon.types.js +2 -0
  201. package/lib/module/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  202. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  203. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  204. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  205. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  206. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  207. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  208. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  209. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  210. package/lib/module/legacy/components/ScreenStackItem.js +31 -11
  211. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  212. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts +6 -3
  213. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  214. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +4 -3
  215. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  216. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts +8 -0
  217. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts.map +1 -0
  218. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts +6 -3
  219. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  220. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +137 -2
  221. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  222. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +2 -0
  223. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts.map +1 -1
  224. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  225. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +5 -0
  226. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  227. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  228. package/lib/typescript/components/stack/host/StackHost.types.d.ts +24 -1
  229. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  230. package/lib/typescript/components/stack/host/StackHost.web.d.ts +1 -3
  231. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  232. package/lib/typescript/components/stack/index.d.ts +4 -3
  233. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  234. package/lib/typescript/components/tabs/host/TabsHost.d.ts +5 -0
  235. package/lib/typescript/components/tabs/host/TabsHost.d.ts.map +1 -0
  236. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  237. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +56 -0
  238. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  239. package/lib/typescript/components/tabs/index.d.ts +4 -6
  240. package/lib/typescript/components/tabs/index.d.ts.map +1 -1
  241. package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts.map +1 -1
  242. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts +42 -7
  243. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts.map +1 -1
  244. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts +5 -0
  245. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts.map +1 -0
  246. package/lib/typescript/components/tabs/screen/TabsScreen.ios.d.ts.map +1 -1
  247. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts +78 -13
  248. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts.map +1 -1
  249. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts +91 -0
  250. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts.map +1 -0
  251. package/lib/typescript/components/tabs/screen/index.d.ts +1 -0
  252. package/lib/typescript/components/tabs/screen/index.d.ts.map +1 -1
  253. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -0
  254. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  255. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +1 -0
  256. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  257. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +4 -0
  258. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  259. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +6 -0
  260. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  261. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +3 -0
  262. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  263. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +6 -0
  264. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  265. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +10 -1
  266. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  267. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +25 -0
  268. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  269. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +4 -0
  270. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  271. package/lib/typescript/legacy/types.d.ts +30 -0
  272. package/lib/typescript/legacy/types.d.ts.map +1 -1
  273. package/package.json +4 -2
  274. package/src/components/stack/header/StackHeaderConfig.android.tsx +6 -20
  275. package/src/components/stack/header/StackHeaderConfig.android.types.ts +4 -3
  276. package/src/components/stack/header/StackHeaderConfig.ios.tsx +10 -16
  277. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +148 -2
  278. package/src/components/stack/header/StackHeaderConfig.tsx +12 -0
  279. package/src/components/stack/header/StackHeaderConfig.types.ts +2 -0
  280. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +9 -1
  281. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +5 -0
  282. package/src/components/stack/host/StackHost.tsx +10 -3
  283. package/src/components/stack/host/StackHost.types.ts +25 -1
  284. package/src/components/stack/host/StackHost.web.tsx +1 -4
  285. package/src/components/stack/index.ts +9 -1
  286. package/src/components/tabs/host/TabsHost.ios.tsx +2 -0
  287. package/src/components/tabs/host/TabsHost.ios.types.ts +60 -0
  288. package/src/components/tabs/host/TabsHost.tsx +7 -0
  289. package/src/components/tabs/index.ts +9 -0
  290. package/src/components/tabs/screen/TabsScreen.android.tsx +8 -3
  291. package/src/components/tabs/screen/TabsScreen.android.types.ts +42 -7
  292. package/src/components/tabs/screen/TabsScreen.ios.tsx +22 -5
  293. package/src/components/tabs/screen/TabsScreen.ios.types.ts +79 -17
  294. package/src/components/tabs/screen/TabsScreen.tsx +7 -0
  295. package/src/components/tabs/screen/TabsScreenIcon.types.ts +117 -0
  296. package/src/components/tabs/screen/index.ts +1 -0
  297. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -0
  298. package/src/fabric/legacy/ScreenStackNativeComponent.ts +2 -0
  299. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +11 -0
  300. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +11 -0
  301. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +7 -0
  302. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +9 -0
  303. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +20 -2
  304. package/src/legacy/components/ScreenStackItem.tsx +59 -12
  305. package/src/legacy/types.ts +31 -0
  306. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenModalFragment.kt +0 -281
  307. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogRootView.kt +0 -104
  308. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogScreen.kt +0 -26
  309. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js +0 -10
  310. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  311. package/lib/commonjs/components/tabs/host/TabsHost.d.js +0 -2
  312. package/lib/commonjs/components/tabs/host/TabsHost.d.js.map +0 -1
  313. package/lib/commonjs/components/tabs/host/TabsHost.web.js.map +0 -1
  314. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js +0 -2
  315. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js.map +0 -1
  316. package/lib/commonjs/components/tabs/screen/TabsScreen.web.js.map +0 -1
  317. package/lib/module/components/stack/header/StackHeaderConfig.d.js +0 -2
  318. package/lib/module/components/stack/header/StackHeaderConfig.web.js +0 -4
  319. package/lib/module/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  320. package/lib/module/components/tabs/host/TabsHost.d.js +0 -2
  321. package/lib/module/components/tabs/host/TabsHost.d.js.map +0 -1
  322. package/lib/module/components/tabs/host/TabsHost.web.js +0 -4
  323. package/lib/module/components/tabs/host/TabsHost.web.js.map +0 -1
  324. package/lib/module/components/tabs/screen/TabsScreen.d.js +0 -2
  325. package/lib/module/components/tabs/screen/TabsScreen.d.js.map +0 -1
  326. package/lib/module/components/tabs/screen/TabsScreen.web.js +0 -4
  327. package/lib/module/components/tabs/screen/TabsScreen.web.js.map +0 -1
  328. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +0 -7
  329. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +0 -1
  330. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +0 -7
  331. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +0 -1
  332. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +0 -7
  333. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +0 -1
  334. package/src/components/stack/header/StackHeaderConfig.d.ts +0 -22
  335. package/src/components/stack/header/StackHeaderConfig.web.tsx +0 -5
  336. package/src/components/tabs/host/TabsHost.d.ts +0 -12
  337. package/src/components/tabs/screen/TabsScreen.d.ts +0 -12
@@ -3,6 +3,7 @@
3
3
  #if defined(__cplusplus)
4
4
  #import <React/RCTConvert.h>
5
5
  #endif // __cplusplus
6
+ #import "RNSDefines.h"
6
7
  #import "RNSReactBaseView.h"
7
8
  #import "RNSScreen.h"
8
9
  #import "RNSScreenStackHeaderSubview.h"
@@ -58,6 +59,17 @@ NS_ASSUME_NONNULL_END
58
59
  animated:(BOOL)animated
59
60
  withConfig:(nonnull RNSScreenStackHeaderConfig *)config;
60
61
 
62
+ /**
63
+ * Returns `YES` when screens in the legacy stack are always laid out under the navigation bar
64
+ * (`edgesForExtendedLayout = UIRectEdgeAll`), also when the header is opaque. In that case the content is inset below
65
+ * an opaque bar by the `SafeAreaView` rendered by `ScreenStackItem` (JS) and the screen's origin in the navigation
66
+ * controller's view is always 0. Otherwise (iOS < 26, tvOS, visionOS) a screen with a visible, opaque header is laid
67
+ * out below the bar (`UIRectEdgeAll - UIRectEdgeTop`).
68
+ *
69
+ * Keep in sync with `getSafeAreaEdges` in `src/legacy/components/ScreenStackItem.tsx`.
70
+ */
71
+ + (BOOL)screensExtendUnderOpaqueNavigationBar;
72
+
61
73
  /**
62
74
  * Returns true iff subview of given `type` is present.
63
75
  *
@@ -99,6 +111,24 @@ NS_ASSUME_NONNULL_END
99
111
  */
100
112
  - (void)updateHeaderStateInShadowTreeInContextOfNavigationBar:(nullable UINavigationBar *)navBar;
101
113
 
114
+ /**
115
+ * Requests `updateViewControllerIfNeeded` to be called once, after the current
116
+ * mounting transaction finishes. Use this instead of calling `updateViewControllerIfNeeded`
117
+ * directly from subviews, so that a single transaction updating several subviews
118
+ * re-applies the config only once, with all subviews already updated.
119
+ */
120
+ - (void)setNeedsViewControllerUpdate;
121
+
122
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
123
+ /**
124
+ * Requests layout of all header subviews attached to the view hierarchy. Header subview updates its state in shadow
125
+ * tree when it is laid out, therefore this method should be called when `navBar` lays out its subviews - the header
126
+ * subviews are laid out later in the same layout pass, after UIKit has positioned the content of the navigation bar.
127
+ * When the content of `navBar` is moved out of the bar (bar minimization on iOS 27+) this method does nothing.
128
+ */
129
+ - (void)setNeedsLayoutForHeaderSubviewsInNavigationBar:(nonnull UINavigationBar *)navBar;
130
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
131
+
102
132
  @end
103
133
 
104
134
  #pragma mark - Experimental
@@ -13,8 +13,8 @@
13
13
  #import <react/renderer/components/rnscreens/EventEmitters.h>
14
14
  #import <react/renderer/components/rnscreens/Props.h>
15
15
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
16
- #import <react/utils/ManagedObjectWrapper.h>
17
16
  #import <react/renderer/components/rnscreens/legacy/RNSScreenStackHeaderConfigComponentDescriptor.h>
17
+ #import <react/utils/ManagedObjectWrapper.h>
18
18
  #import "RCTImageComponentView+RNSScreenStackHeaderConfig.h"
19
19
  #import "RNSBackBarButtonItem.h"
20
20
  #import "RNSBarButtonItem.h"
@@ -58,6 +58,9 @@ static const NSNumber *const DEFAULT_TITLE_LARGE_FONT_SIZE = @34;
58
58
  /// Whether a react subview has been added / removed in current transaction. This flag is reset after each react
59
59
  /// transaction via RCTMountingTransactionObserving protocol.
60
60
  bool _addedReactSubviewsInCurrentTransaction;
61
+ /// Whether a react subview requested the config to be re-applied in current transaction.
62
+ /// Consumed & reset in `mountingTransactionDidMount:withSurfaceTelemetry:`.
63
+ bool _needsViewControllerUpdateInCurrentTransaction;
61
64
  RCTImageLoader *_imageLoader;
62
65
  }
63
66
 
@@ -69,6 +72,7 @@ static const NSNumber *const DEFAULT_TITLE_LARGE_FONT_SIZE = @34;
69
72
  _show = YES;
70
73
  _translucent = NO;
71
74
  _addedReactSubviewsInCurrentTransaction = false;
75
+ _needsViewControllerUpdateInCurrentTransaction = false;
72
76
  _lastSendState = react::RNSScreenStackHeaderConfigState(react::Size{}, react::EdgeInsets{}, react::Point{});
73
77
  [self initProps];
74
78
  }
@@ -157,11 +161,18 @@ RNS_IGNORE_SUPER_CALL_END
157
161
  }
158
162
  }
159
163
 
164
+ - (void)setNeedsViewControllerUpdate
165
+ {
166
+ _needsViewControllerUpdateInCurrentTransaction = true;
167
+ }
168
+
160
169
  - (void)layoutNavigationControllerView
161
170
  {
162
- // We need to layout navigation controller view after translucent prop changes, because otherwise
163
- // frame of RNSScreen will not be changed and screen content will remain the same size.
164
- // For more details look at https://github.com/software-mansion/react-native-screens/issues/1158
171
+ // We need to layout navigation controller view after `translucent` / `hidden` prop changes. Below iOS 26 the frame
172
+ // of RNSScreen depends on them (`edgesForExtendedLayout`), so without the layout pass the screen content would
173
+ // remain the same size (https://github.com/software-mansion/react-native-screens/issues/1158). On iOS 26+ the frame
174
+ // does not change, but the layout pass still refreshes the header layout info in the shadow tree and the safe area
175
+ // insets consumed by the `SafeAreaView` rendered by `ScreenStackItem`.
165
176
  UIViewController *vc = _screenView.controller;
166
177
  UINavigationController *navctr = vc.navigationController;
167
178
  [navctr.view setNeedsLayout];
@@ -194,17 +205,10 @@ RNS_IGNORE_SUPER_CALL_END
194
205
  return;
195
206
  }
196
207
 
208
+ // Screen's content offset in shadow tree matches its actual native origin (see `-[RNSScreenView updateBounds]`),
209
+ // therefore navigation bar's frame in screen's coordinate space can be used directly.
197
210
  CGRect navBarFrameInScreenView = [navigationBar convertRect:navigationBar.bounds toView:_screenView];
198
211
 
199
- // On iOS 26+ in landscape mode there is a bug with `edgesForExtendedLayout` for non-transparent
200
- // header. We're applying SAV to fix it but we need to take it into account for HeaderConfig's
201
- // origin as well.
202
- #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
203
- if (!_translucent && self.shouldHeaderBeVisible) {
204
- navBarFrameInScreenView.origin.y -= _screenView.safeAreaInsets.top;
205
- }
206
- #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
207
-
208
212
  [self updateShadowStateWithSize:navigationBar.frame.size
209
213
  edgeInsets:[self computeEdgeInsetsOfNavigationBar:navigationBar]
210
214
  frameOrigin:navBarFrameInScreenView.origin];
@@ -213,6 +217,24 @@ RNS_IGNORE_SUPER_CALL_END
213
217
  }
214
218
  }
215
219
 
220
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
221
+ - (void)setNeedsLayoutForHeaderSubviewsInNavigationBar:(nonnull UINavigationBar *)navigationBar
222
+ {
223
+ // During the bar minimization (iOS 27+) UIKit moves the content view of the navigation bar above the bar, on each
224
+ // frame of the scroll. The header subviews are not visible then, therefore we do not follow their position, to
225
+ // avoid state update on each frame. When the bar is restored, its content view is back at the origin of the bar.
226
+ if (CGRectGetMinY(navigationBar.rnscreens_findContentView.frame) < 0) {
227
+ return;
228
+ }
229
+
230
+ for (RNSScreenStackHeaderSubview *subview in self.reactSubviews) {
231
+ if (subview.window != nil) {
232
+ [subview setNeedsLayout];
233
+ }
234
+ }
235
+ }
236
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
237
+
216
238
  - (NSDirectionalEdgeInsets)computeEdgeInsetsOfNavigationBar:(nonnull UINavigationBar *)navigationBar
217
239
  {
218
240
  NSDirectionalEdgeInsets navBarMargins = [navigationBar directionalLayoutMargins];
@@ -353,6 +375,18 @@ RNS_IGNORE_SUPER_CALL_END
353
375
  return nil;
354
376
  }
355
377
 
378
+ + (BOOL)screensExtendUnderOpaqueNavigationBar
379
+ {
380
+ #if TARGET_OS_TV || TARGET_OS_VISION
381
+ return NO;
382
+ #else // TARGET_OS_TV || TARGET_OS_VISION
383
+ if (@available(iOS 26.0, *)) {
384
+ return YES;
385
+ }
386
+ return NO;
387
+ #endif // TARGET_OS_TV || TARGET_OS_VISION
388
+ }
389
+
356
390
  + (void)willShowViewController:(UIViewController *)vc
357
391
  animated:(BOOL)animated
358
392
  withConfig:(RNSScreenStackHeaderConfig *)config
@@ -494,12 +528,16 @@ RNS_IGNORE_SUPER_CALL_END
494
528
  BOOL wasHidden = navctr.navigationBarHidden;
495
529
  BOOL shouldHide = config == nil || !config.shouldHeaderBeVisible;
496
530
 
497
- if (!shouldHide && !config.translucent) {
498
- // when nav bar is not translucent we change edgesForExtendedLayout to avoid system laying out
499
- // the screen underneath navigation controllers
531
+ if (!shouldHide && !config.translucent && ![self screensExtendUnderOpaqueNavigationBar]) {
532
+ // When nav bar is not translucent we change edgesForExtendedLayout to avoid system laying out
533
+ // the screen underneath navigation controllers.
500
534
  vc.edgesForExtendedLayout = UIRectEdgeAll - UIRectEdgeTop;
501
535
  } else {
502
- // system default is UIRectEdgeAll
536
+ // System default is UIRectEdgeAll - the screen is laid out under the navigation bar.
537
+ // On iOS 26+ this is also the case for an opaque header: UIKit does not reliably lay out the screen right below
538
+ // the bar when the top edge is excluded (it ignores the bar's origin offset, e.g. in landscape or on iPhone Duo),
539
+ // so we let the screen extend under the bar and inset the content with the `SafeAreaView` rendered by
540
+ // `ScreenStackItem`. See https://github.com/software-mansion/react-native-screens-labs/issues/1841
503
541
  vc.edgesForExtendedLayout = UIRectEdgeAll;
504
542
  }
505
543
 
@@ -523,6 +561,16 @@ RNS_IGNORE_SUPER_CALL_END
523
561
  }
524
562
  navitem.largeTitleDisplayMode =
525
563
  config.largeTitle ? UINavigationItemLargeTitleDisplayModeAlways : UINavigationItemLargeTitleDisplayModeNever;
564
+
565
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
566
+ if (@available(iOS 27.0, *)) {
567
+ // Due to native limitations related to opaque header and minimization behavior, we disable it for opaque headers.
568
+ UIBarMinimization *minimization = [UIBarMinimization new];
569
+ minimization.minimizationBehavior =
570
+ config.translucent ? UIBarMinimizationBehaviorAutomatic : UIBarMinimizationBehaviorNever;
571
+ navitem.navigationBarMinimization = minimization;
572
+ }
573
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
526
574
  #endif
527
575
 
528
576
  UINavigationBarAppearance *appearance = [self buildAppearance:vc withConfig:config];
@@ -905,8 +953,13 @@ RNS_IGNORE_SUPER_CALL_END
905
953
  if (self.shouldHeaderBeVisible) {
906
954
  [self layoutNavigationControllerView];
907
955
  }
956
+ } else if (_needsViewControllerUpdateInCurrentTransaction) {
957
+ // Subviews (e.g. their `visibilityPriority`) changed in this transaction. Re-apply the config once,
958
+ // now that all of them have already received their new props.
959
+ [self updateViewControllerIfNeeded];
908
960
  }
909
961
  _addedReactSubviewsInCurrentTransaction = false;
962
+ _needsViewControllerUpdateInCurrentTransaction = false;
910
963
  }
911
964
 
912
965
  - (void)replaceNavigationBarViewsWithSnapshotOfSubview:(RNSScreenStackHeaderSubview *)childComponentView
@@ -21,6 +21,7 @@ namespace react = facebook::react;
21
21
  // The cycle is cleared via `invalidateUIBarButtonItem` method, called by `invalidate` callback.
22
22
  UIBarButtonItem *_barButtonItem;
23
23
  BOOL _hidesSharedBackground;
24
+ react::RNSScreenStackHeaderSubviewVisibilityPriority _visibilityPriority;
24
25
  }
25
26
 
26
27
  #pragma mark - Common
@@ -112,6 +113,7 @@ namespace react = facebook::react;
112
113
  _props = defaultProps;
113
114
  _lastScheduledFrame = CGRectZero;
114
115
  _synchronousShadowStateUpdatesEnabled = YES;
116
+ _visibilityPriority = react::RNSScreenStackHeaderSubviewVisibilityPriority::Standard;
115
117
  }
116
118
 
117
119
  return self;
@@ -125,6 +127,7 @@ namespace react = facebook::react;
125
127
 
126
128
  [self setType:[RNSConvert RNSScreenStackHeaderSubviewTypeFromCppEquivalent:newHeaderSubviewProps.type]];
127
129
  [self setHidesSharedBackground:newHeaderSubviewProps.hidesSharedBackground];
130
+ [self setVisibilityPriority:newHeaderSubviewProps.visibilityPriority];
128
131
  [self setSynchronousShadowStateUpdatesEnabled:newHeaderSubviewProps.synchronousShadowStateUpdatesEnabled];
129
132
  [super updateProps:props oldProps:oldProps];
130
133
  }
@@ -280,6 +283,17 @@ RNS_IGNORE_SUPER_CALL_END
280
283
  }
281
284
  }
282
285
  #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
286
+
287
+ // tvOS and visionOS are excluded on purpose: `visibilityPriority` exists there, but the only
288
+ // supported value is `standard`, which is already the default.
289
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0) && !TARGET_OS_TV && !TARGET_OS_VISION
290
+ if (@available(iOS 27.0, *)) {
291
+ if (_barButtonItem != nil) {
292
+ _barButtonItem.visibilityPriority =
293
+ [RNSConvert UIBarButtonItemVisibilityPriorityFromCppEquivalent:_visibilityPriority];
294
+ }
295
+ }
296
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(27_0) && !TARGET_OS_TV && !TARGET_OS_VISION
283
297
  }
284
298
 
285
299
  - (void)setHidesSharedBackground:(BOOL)hidesSharedBackground
@@ -288,6 +302,25 @@ RNS_IGNORE_SUPER_CALL_END
288
302
  [self configureBarButtonItem];
289
303
  }
290
304
 
305
+ - (void)setVisibilityPriority:(react::RNSScreenStackHeaderSubviewVisibilityPriority)visibilityPriority
306
+ {
307
+ if (visibilityPriority == _visibilityPriority) {
308
+ return;
309
+ }
310
+
311
+ _visibilityPriority = visibilityPriority;
312
+ [self configureBarButtonItem];
313
+
314
+ // Changing the priority of an item that is already in the bar is not enough:
315
+ // the bar only re-evaluates which items fit when it is handed its items again,
316
+ // which the header does whenever it re-applies its config. We defer that until
317
+ // the end of the mounting transaction, so that sibling subviews updated in the
318
+ // same transaction are taken into account & the config is re-applied only once.
319
+ if (_barButtonItem != nil) {
320
+ [[self getHeaderConfig] setNeedsViewControllerUpdate];
321
+ }
322
+ }
323
+
291
324
  #pragma mark - Dynamic frameworks support
292
325
 
293
326
  // Needed because of this: https://github.com/facebook/react-native/pull/37274
@@ -3,7 +3,6 @@
3
3
 
4
4
  #import "RNSSafeAreaViewComponentView.h"
5
5
  #import <React/RCTConversions.h>
6
- #import <React/RCTUtils.h>
7
6
  #import "RNSSafeAreaProviding.h"
8
7
  #import "RNSSafeAreaViewNotifications.h"
9
8
 
@@ -14,8 +13,6 @@
14
13
 
15
14
  namespace react = facebook::react;
16
15
 
17
- static BOOL UIEdgeInsetsEqualToEdgeInsetsWithThreshold(UIEdgeInsets insets1, UIEdgeInsets insets2, CGFloat threshold);
18
-
19
16
  #pragma mark - View implementation
20
17
 
21
18
  @implementation RNSSafeAreaViewComponentView {
@@ -87,7 +84,7 @@ static BOOL UIEdgeInsetsEqualToEdgeInsetsWithThreshold(UIEdgeInsets insets1, UIE
87
84
 
88
85
  UIEdgeInsets safeAreaInsets = _providerView.providerSafeAreaInsets;
89
86
 
90
- if (UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale())) {
87
+ if (UIEdgeInsetsEqualToEdgeInsets(safeAreaInsets, _currentSafeAreaInsets)) {
91
88
  return;
92
89
  }
93
90
 
@@ -152,14 +149,6 @@ static BOOL UIEdgeInsetsEqualToEdgeInsetsWithThreshold(UIEdgeInsets insets1, UIE
152
149
 
153
150
  @end
154
151
 
155
- #pragma mark - Utility functions
156
-
157
- static BOOL UIEdgeInsetsEqualToEdgeInsetsWithThreshold(UIEdgeInsets insets1, UIEdgeInsets insets2, CGFloat threshold)
158
- {
159
- return ABS(insets1.left - insets2.left) <= threshold && ABS(insets1.right - insets2.right) <= threshold &&
160
- ABS(insets1.top - insets2.top) <= threshold && ABS(insets1.bottom - insets2.bottom) <= threshold;
161
- }
162
-
163
152
  #pragma mark - View class exposure
164
153
 
165
154
  Class<RCTComponentViewProtocol> RNSSafeAreaView(void)
@@ -3,8 +3,10 @@
3
3
  #if defined(__cplusplus)
4
4
 
5
5
  #import <react/renderer/components/rnscreens/Props.h>
6
+ #import "RNSDefines.h"
6
7
  #import "RNSHeaderItemPlacement.h"
7
8
  #import "RNSHeaderItemSpacerPlacement.h"
9
+ #import "RNSHeaderItemVisibilityPriority.h"
8
10
  #import "RNSStackScreenComponentView.h"
9
11
 
10
12
  namespace rnscreens::conversion {
@@ -23,10 +25,38 @@ RNSHeaderItemSpacerPlacement
23
25
  RNSHeaderItemSpacerPlacementFromReactRNSStackHeaderItemSpacerIOSPlacement(
24
26
  react::RNSStackHeaderItemSpacerIOSPlacement placement);
25
27
 
28
+ UIBarButtonItemStyle UIBarButtonItemStyleFromReactRNSStackHeaderItemIOSVariant(
29
+ react::RNSStackHeaderItemIOSVariant variant);
30
+
26
31
  UINavigationItemBackButtonDisplayMode
27
32
  UINavigationItemBackButtonDisplayModeFromReactRNSStackHeaderConfigIOSBackButtonDisplayMode(
28
33
  react::RNSStackHeaderConfigIOSBackButtonDisplayMode displayMode);
29
34
 
35
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
36
+
37
+ API_AVAILABLE(ios(27.0))
38
+ UIBarMinimizationBehavior
39
+ UIBarMinimizationBehaviorFromReactRNSStackHeaderConfigIOSMinimizationBehavior(
40
+ react::RNSStackHeaderConfigIOSMinimizationBehavior minimizationBehavior);
41
+
42
+ API_AVAILABLE(ios(27.0))
43
+ UIBarMinimizationRestorationBehavior
44
+ UIBarMinimizationRestorationBehaviorFromReactRNSStackHeaderConfigIOSRestorationBehavior(
45
+ react::RNSStackHeaderConfigIOSRestorationBehavior restorationBehavior);
46
+
47
+ #endif // Check for iOS >= 27
48
+
49
+ RNSHeaderItemVisibilityPriority
50
+ RNSHeaderItemVisibilityPriorityFromReactRNSStackHeaderItemIOSVisibilityPriority(
51
+ react::RNSStackHeaderItemIOSVisibilityPriority visibilityPriority);
52
+
53
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0) && !TARGET_OS_TV && !TARGET_OS_VISION
54
+ API_AVAILABLE(ios(27.0))
55
+ UIBarButtonItemVisibilityPriority
56
+ UIBarButtonItemVisibilityPriorityFromRNSHeaderItemVisibilityPriority(
57
+ RNSHeaderItemVisibilityPriority visibilityPriority);
58
+ #endif // Check for iOS >= 27 && !TARGET_OS_TV && !TARGET_OS_VISION
59
+
30
60
  }; // namespace rnscreens::conversion
31
61
 
32
62
  #endif // defined(__cplusplus)
@@ -1,4 +1,5 @@
1
1
  #import "RNSConversions-Stack.h"
2
+ #import "RNSDefines.h"
2
3
 
3
4
  namespace rnscreens::conversion {
4
5
 
@@ -27,6 +28,23 @@ RNSHeaderItemPlacement RNSHeaderItemPlacementFromReactRNSStackHeaderItemIOSPlace
27
28
  }
28
29
  }
29
30
 
31
+ UIBarButtonItemStyle UIBarButtonItemStyleFromReactRNSStackHeaderItemIOSVariant(
32
+ react::RNSStackHeaderItemIOSVariant variant)
33
+ {
34
+ switch (variant) {
35
+ case react::RNSStackHeaderItemIOSVariant::Plain:
36
+ return UIBarButtonItemStylePlain;
37
+ case react::RNSStackHeaderItemIOSVariant::Prominent:
38
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
39
+ if (@available(iOS 26.0, *)) {
40
+ return UIBarButtonItemStyleProminent;
41
+ }
42
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
43
+ // Bold text look, closest counterpart of prominent style before iOS 26
44
+ return UIBarButtonItemStyleDone;
45
+ }
46
+ }
47
+
30
48
  RNSHeaderItemSpacerPlacement RNSHeaderItemSpacerPlacementFromReactRNSStackHeaderItemSpacerIOSPlacement(
31
49
  react::RNSStackHeaderItemSpacerIOSPlacement placement)
32
50
  {
@@ -52,4 +70,65 @@ UINavigationItemBackButtonDisplayModeFromReactRNSStackHeaderConfigIOSBackButtonD
52
70
  }
53
71
  }
54
72
 
73
+
74
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
75
+
76
+ UIBarMinimizationBehavior UIBarMinimizationBehaviorFromReactRNSStackHeaderConfigIOSMinimizationBehavior(
77
+ react::RNSStackHeaderConfigIOSMinimizationBehavior minimizationBehavior)
78
+ {
79
+ switch (minimizationBehavior) {
80
+ case react::RNSStackHeaderConfigIOSMinimizationBehavior::Automatic:
81
+ return UIBarMinimizationBehaviorAutomatic;
82
+ case react::RNSStackHeaderConfigIOSMinimizationBehavior::Never:
83
+ return UIBarMinimizationBehaviorNever;
84
+ case react::RNSStackHeaderConfigIOSMinimizationBehavior::OnScrollDown:
85
+ return UIBarMinimizationBehaviorOnScrollDown;
86
+ case react::RNSStackHeaderConfigIOSMinimizationBehavior::OnScrollUp:
87
+ return UIBarMinimizationBehaviorOnScrollUp;
88
+ }
89
+ }
90
+
91
+ UIBarMinimizationRestorationBehavior
92
+ UIBarMinimizationRestorationBehaviorFromReactRNSStackHeaderConfigIOSRestorationBehavior(
93
+ react::RNSStackHeaderConfigIOSRestorationBehavior restorationBehavior)
94
+ {
95
+ switch (restorationBehavior) {
96
+ case react::RNSStackHeaderConfigIOSRestorationBehavior::Automatic:
97
+ return UIBarMinimizationRestorationBehaviorAutomatic;
98
+ case react::RNSStackHeaderConfigIOSRestorationBehavior::AtScrollEdge:
99
+ return UIBarMinimizationRestorationBehaviorAtScrollEdge;
100
+ }
101
+ }
102
+
103
+ #endif // Check for iOS >= 27
104
+
105
+ RNSHeaderItemVisibilityPriority RNSHeaderItemVisibilityPriorityFromReactRNSStackHeaderItemIOSVisibilityPriority(
106
+ react::RNSStackHeaderItemIOSVisibilityPriority visibilityPriority)
107
+ {
108
+ switch (visibilityPriority) {
109
+ case react::RNSStackHeaderItemIOSVisibilityPriority::Low:
110
+ return RNSHeaderItemVisibilityPriorityLow;
111
+ case react::RNSStackHeaderItemIOSVisibilityPriority::Standard:
112
+ return RNSHeaderItemVisibilityPriorityStandard;
113
+ case react::RNSStackHeaderItemIOSVisibilityPriority::High:
114
+ return RNSHeaderItemVisibilityPriorityHigh;
115
+ }
116
+ }
117
+
118
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0) && !TARGET_OS_TV && !TARGET_OS_VISION
119
+ API_AVAILABLE(ios(27.0))
120
+ UIBarButtonItemVisibilityPriority UIBarButtonItemVisibilityPriorityFromRNSHeaderItemVisibilityPriority(
121
+ RNSHeaderItemVisibilityPriority visibilityPriority)
122
+ {
123
+ switch (visibilityPriority) {
124
+ case RNSHeaderItemVisibilityPriorityLow:
125
+ return UIBarButtonItemVisibilityPriorityLow;
126
+ case RNSHeaderItemVisibilityPriorityStandard:
127
+ return UIBarButtonItemVisibilityPriorityStandard;
128
+ case RNSHeaderItemVisibilityPriorityHigh:
129
+ return UIBarButtonItemVisibilityPriorityHigh;
130
+ }
131
+ }
132
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(27_0) && !TARGET_OS_TV && !TARGET_OS_VISION
133
+
55
134
  }; // namespace rnscreens::conversion
@@ -0,0 +1,9 @@
1
+ #pragma once
2
+
3
+ #import <Foundation/Foundation.h>
4
+
5
+ typedef NS_ENUM(NSInteger, RNSHeaderItemVisibilityPriority) {
6
+ RNSHeaderItemVisibilityPriorityLow,
7
+ RNSHeaderItemVisibilityPriorityStandard,
8
+ RNSHeaderItemVisibilityPriorityHigh,
9
+ };
@@ -23,6 +23,10 @@ NS_ASSUME_NONNULL_BEGIN
23
23
  @property (nonatomic, readonly, nullable) NSString *largeSubtitle;
24
24
  @property (nonatomic, readonly) BOOL largeTitleEnabled;
25
25
  @property (nonatomic, readonly, nullable) NSString *prompt;
26
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
27
+ @property (nonatomic, readonly) UIBarMinimizationBehavior minimizationBehavior API_AVAILABLE(ios(27.0));
28
+ @property (nonatomic, readonly) UIBarMinimizationRestorationBehavior restorationBehavior API_AVAILABLE(ios(27.0));
29
+ #endif // Check for iOS >= 27
26
30
  @property (nonatomic, readonly, nullable) NSString *backButtonTitle;
27
31
  @property (nonatomic, readonly) UINavigationItemBackButtonDisplayMode backButtonDisplayMode;
28
32
  @property (nonatomic, readonly) BOOL backButtonMenuEnabled;
@@ -1,6 +1,6 @@
1
1
  #import "RNSStackHeaderConfigComponentView.h"
2
- #import "RNSConversions.h"
3
2
  #import "RNSConversions-Stack.h"
3
+ #import "RNSConversions.h"
4
4
  #import "RNSImageLoadingHelper.h"
5
5
  #import "RNSStackHeaderAppearanceMapper.h"
6
6
  #import "RNSStackHeaderConfigEventEmitter.h"
@@ -21,8 +21,8 @@
21
21
  #import <React/RCTLog.h>
22
22
  #import <react/renderer/components/rnscreens/Props.h>
23
23
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
24
- #import <react/utils/ManagedObjectWrapper.h>
25
24
  #import <react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
25
+ #import <react/utils/ManagedObjectWrapper.h>
26
26
 
27
27
  namespace react = facebook::react;
28
28
 
@@ -69,6 +69,12 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
69
69
  _largeSubtitle = nil;
70
70
  _largeTitleEnabled = NO;
71
71
  _prompt = nil;
72
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
73
+ if (@available(iOS 27.0, *)) {
74
+ _minimizationBehavior = UIBarMinimizationBehaviorAutomatic;
75
+ _restorationBehavior = UIBarMinimizationRestorationBehaviorAutomatic;
76
+ }
77
+ #endif // Check for iOS >= 27
72
78
  _backButtonTitle = nil;
73
79
  _backButtonDisplayMode = UINavigationItemBackButtonDisplayModeDefault;
74
80
  _backButtonMenuEnabled = YES;
@@ -305,7 +311,8 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
305
311
  [static_cast<RNSStackHeaderItemComponentView *>(locator.headerItem)
306
312
  updateMenuElementWithId:menuItemId
307
313
  withElement:newItemData
308
- parentMenu:locator.searchResult.parentMenu];
314
+ parentMenu:locator.searchResult.parentMenu
315
+ inMenuRepresentation:locator.inMenuRepresentation];
309
316
  break;
310
317
  case RNSMenuElementPositionTitle:
311
318
  if (locator.searchResult.parentMenu != nil) {
@@ -351,7 +358,8 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
351
358
  [static_cast<RNSStackHeaderItemComponentView *>(locator.headerItem)
352
359
  updateMenuElementWithId:menuElementId
353
360
  withElement:newMenuItem
354
- parentMenu:locator.searchResult.parentMenu];
361
+ parentMenu:locator.searchResult.parentMenu
362
+ inMenuRepresentation:locator.inMenuRepresentation];
355
363
  break;
356
364
  case RNSMenuElementPositionTitle:
357
365
  if (locator.searchResult.parentMenu == nil) {
@@ -443,13 +451,39 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
443
451
  _prompt = RCTNSStringFromStringNilIfEmpty(newHeaderProps.prompt);
444
452
  }
445
453
 
454
+ if (oldHeaderProps.minimizationBehavior != newHeaderProps.minimizationBehavior) {
455
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
456
+ if (@available(iOS 27.0, *)) {
457
+ _minimizationBehavior =
458
+ rnscreens::conversion::UIBarMinimizationBehaviorFromReactRNSStackHeaderConfigIOSMinimizationBehavior(
459
+ newHeaderProps.minimizationBehavior);
460
+ } else
461
+ #endif // Check for iOS >= 27
462
+ if (newHeaderProps.minimizationBehavior != react::RNSStackHeaderConfigIOSMinimizationBehavior::Automatic) {
463
+ RCTLogWarn(@"[RNScreens] minimizationBehavior is supported for iOS >= 27");
464
+ }
465
+ }
466
+
467
+ if (oldHeaderProps.restorationBehavior != newHeaderProps.restorationBehavior) {
468
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
469
+ if (@available(iOS 27.0, *)) {
470
+ _restorationBehavior = rnscreens::conversion::
471
+ UIBarMinimizationRestorationBehaviorFromReactRNSStackHeaderConfigIOSRestorationBehavior(
472
+ newHeaderProps.restorationBehavior);
473
+ } else
474
+ #endif // Check for iOS >= 27
475
+ if (newHeaderProps.restorationBehavior != react::RNSStackHeaderConfigIOSRestorationBehavior::Automatic) {
476
+ RCTLogWarn(@"[RNScreens] restorationBehavior is supported for iOS >= 27");
477
+ }
478
+ }
479
+
446
480
  if (oldHeaderProps.backButtonTitle != newHeaderProps.backButtonTitle) {
447
481
  _backButtonTitle = RCTNSStringFromStringNilIfEmpty(newHeaderProps.backButtonTitle);
448
482
  }
449
483
 
450
484
  if (oldHeaderProps.backButtonDisplayMode != newHeaderProps.backButtonDisplayMode) {
451
- _backButtonDisplayMode =
452
- rnscreens::conversion::UINavigationItemBackButtonDisplayModeFromReactRNSStackHeaderConfigIOSBackButtonDisplayMode(
485
+ _backButtonDisplayMode = rnscreens::conversion::
486
+ UINavigationItemBackButtonDisplayModeFromReactRNSStackHeaderConfigIOSBackButtonDisplayMode(
453
487
  newHeaderProps.backButtonDisplayMode);
454
488
  }
455
489
 
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #import <UIKit/UIKit.h>
4
+ #import "RNSDefines.h"
4
5
 
5
6
  @class RNSStackHeaderMenuData;
6
7
 
@@ -15,6 +16,10 @@ NS_ASSUME_NONNULL_BEGIN
15
16
  @property (nonatomic, readonly, nullable) NSString *largeSubtitle;
16
17
  @property (nonatomic, readonly) BOOL largeTitleEnabled;
17
18
  @property (nonatomic, readonly, nullable) NSString *prompt;
19
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
20
+ @property (nonatomic, readonly) UIBarMinimizationBehavior minimizationBehavior API_AVAILABLE(ios(27.0));
21
+ @property (nonatomic, readonly) UIBarMinimizationRestorationBehavior restorationBehavior API_AVAILABLE(ios(27.0));
22
+ #endif // Check for iOS >= 27
18
23
  @property (nonatomic, readonly, nullable) NSString *backButtonTitle;
19
24
  @property (nonatomic, readonly) UINavigationItemBackButtonDisplayMode backButtonDisplayMode;
20
25
  @property (nonatomic, readonly) BOOL backButtonMenuEnabled;
@@ -51,6 +51,9 @@
51
51
  action:nil];
52
52
  }
53
53
 
54
+ barButtonItem.style = item.style;
55
+ barButtonItem.enabled = !item.disabled;
56
+
54
57
  if (item.icon != nil) {
55
58
  __weak UIBarButtonItem *weakBarButtonItem = barButtonItem;
56
59
  UIImage *syncImage = [RNSStackHeaderIconResolver resolveIcon:item.icon
@@ -16,25 +16,32 @@ NS_ASSUME_NONNULL_BEGIN
16
16
  @property (nonatomic, readonly, nullable) NSString *title;
17
17
  @property (nonatomic, readonly, nullable) RNSStackHeaderIconData *icon;
18
18
  @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menu;
19
+ @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menuRepresentation;
19
20
  @property (nonatomic, readonly, nullable) UIView *customView;
21
+ @property (nonatomic, readonly) UIBarButtonItemStyle style;
22
+ @property (nonatomic, readonly) BOOL disabled;
20
23
  @property (nonatomic, readonly) BOOL respondsToOnPress;
21
24
  @property (nonatomic, readonly) BOOL hidesSharedBackground;
25
+ @property (nonatomic, readonly) RNSHeaderItemVisibilityPriority visibilityPriority;
22
26
 
23
27
  @property (nonatomic, nullable) NSString *titleProp;
24
28
  @property (nonatomic, nullable) RNSStackHeaderIconData *iconProp;
25
29
  @property (nonatomic, nullable) RNSStackHeaderMenuData *menuProp;
30
+ @property (nonatomic, nullable) RNSStackHeaderMenuData *menuRepresentationProp;
26
31
 
27
32
  @property (nonatomic, weak, nullable) id<RNSStackHeaderItemInvalidationDelegate> invalidationDelegate;
28
33
 
29
34
  - (void)emitOnPress;
30
35
 
31
36
  /**
32
- * Replaces a menu element in the item's menu tree with a new element constructed from command options.
37
+ * Replaces a menu element in the item's menu or menuRepresentation tree with a new element
38
+ * constructed from command options.
33
39
  * If parentMenu is nil, the element is the root menu and is replaced directly.
34
40
  */
35
41
  - (void)updateMenuElementWithId:(NSString *)elementId
36
42
  withElement:(id<RNSStackHeaderMenuElement>)newElement
37
- parentMenu:(nullable RNSStackHeaderMenuData *)parentMenu;
43
+ parentMenu:(nullable RNSStackHeaderMenuData *)parentMenu
44
+ inMenuRepresentation:(BOOL)inMenuRepresentation;
38
45
 
39
46
  @end
40
47