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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (585) hide show
  1. package/Package.swift +87 -0
  2. package/README.md +0 -8
  3. package/RNScreens.podspec +2 -6
  4. package/android/build.gradle +26 -1
  5. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +5 -0
  6. package/android/src/main/cpp/NativeProxy.cpp +30 -6
  7. package/android/src/main/cpp/NativeProxy.h +7 -1
  8. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  9. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +8 -0
  10. package/android/src/main/java/com/swmansion/rnscreens/common/container/ContainerItem.kt +13 -1
  11. package/android/src/main/java/com/swmansion/rnscreens/common/text/ReactTextAppearance.kt +62 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearance.kt +20 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearanceDefaults.kt +65 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/helpers/PropIconResolver.kt +17 -23
  15. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +25 -7
  16. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +2 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackFragment.kt +39 -10
  18. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenViewManager.kt +5 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAppearanceCoordinator.kt → native/coordinator/FormSheetAppearanceCoordinator.kt} +2 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetBehaviorController.kt → native/coordinator/FormSheetBehaviorController.kt} +74 -19
  21. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetDimensionsCoordinator.kt +159 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetKeyboardCoordinator.kt +101 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetNativeDismissCoordinator.kt +44 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetAvailableHeightProvider.kt +44 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContainer.kt → native/core/FormSheetContainer.kt} +1 -1
  26. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialog.kt +115 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialogManager.kt +89 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeDelegate.kt → native/interfaces/FormSheetContentSizeChangeDelegate.kt} +1 -1
  29. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentSizeChangeProvider.kt → native/interfaces/FormSheetContentSizeChangeProvider.kt} +1 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDialogEventEmitter.kt → native/interfaces/FormSheetDialogEventEmitter.kt} +5 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetConfig.kt → native/model/FormSheetConfig.kt} +5 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/model/FormSheetDetents.kt +152 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetAnimatorFactory.kt → native/presentation/FormSheetAnimatorFactory.kt} +9 -10
  34. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetDimmingManager.kt +115 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetDismissalOrigin.kt +22 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentation.kt +173 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentationManager.kt +290 -0
  38. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetPresentationState.kt → native/presentation/FormSheetPresentationState.kt} +2 -2
  39. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetStackRegistry.kt +28 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapper.kt → react/contentwrapper/FormSheetContentWrapper.kt} +3 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentWrapperViewManager.kt → react/contentwrapper/FormSheetContentWrapperViewManager.kt} +1 -1
  42. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDetentChangedEvent.kt → react/event/FormSheetDetentChangedEvent.kt} +1 -1
  43. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidAppearEvent.kt → react/event/FormSheetDidAppearEvent.kt} +1 -1
  44. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetDidDisappearEvent.kt → react/event/FormSheetDidDisappearEvent.kt} +1 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/react/event/FormSheetDismissEvent.kt +29 -0
  46. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetNativeDismissEvent.kt → react/event/FormSheetNativeDismissEvent.kt} +1 -1
  47. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/react/event/FormSheetNativeDismissPreventedEvent.kt +29 -0
  48. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetSyncFlushEvent.kt → react/event/FormSheetSyncFlushEvent.kt} +1 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillAppearEvent.kt → react/event/FormSheetWillAppearEvent.kt} +1 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetWillDisappearEvent.kt → react/event/FormSheetWillDisappearEvent.kt} +1 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetContentView.kt → react/host/FormSheetContentView.kt} +3 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHost.kt → react/host/FormSheetHost.kt} +6 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostEventEmitter.kt → react/host/FormSheetHostEventEmitter.kt} +23 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/{FormSheetHostViewManager.kt → react/host/FormSheetHostViewManager.kt} +13 -2
  55. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +380 -457
  56. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderBackPressHandler.kt +11 -0
  57. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +150 -182
  58. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderFrameSynchronizer.kt +63 -0
  59. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +240 -0
  60. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderAppBarLayoutBehavior.kt → appbar/StackHeaderAppBarLayoutBehavior.kt} +1 -1
  61. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderContentScrimDrawable.kt +36 -0
  62. package/android/src/main/java/com/swmansion/rnscreens/stack/header/{StackHeaderScrollingViewBehavior.kt → appbar/StackHeaderScrollingViewBehavior.kt} +1 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderCollapsedTitleGravityMode.kt +6 -0
  64. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +192 -167
  65. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +393 -13
  66. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +0 -4
  67. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +33 -3
  68. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderDelegate.kt +0 -7
  69. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +9 -3
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +195 -0
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuController.kt +448 -0
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuDelegate.kt +10 -0
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +43 -21
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuConfig.kt +8 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuElementConfig.kt → model/StackHeaderToolbarMenuElementConfig.kt} +1 -1
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuGroupConfig.kt → model/StackHeaderToolbarMenuGroupConfig.kt} +1 -1
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuGroupMetadata.kt +11 -0
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemConfig.kt → model/StackHeaderToolbarMenuItemConfig.kt} +2 -4
  79. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemDefaults.kt → model/StackHeaderToolbarMenuItemDefaults.kt} +1 -1
  80. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemIconSource.kt → model/StackHeaderToolbarMenuItemIconSource.kt} +1 -1
  81. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemShowAsAction.kt → model/StackHeaderToolbarMenuItemShowAsAction.kt} +1 -1
  82. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuItemType.kt → model/StackHeaderToolbarMenuItemType.kt} +1 -1
  83. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuModel.kt +180 -0
  84. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarFieldUpdate.kt → update/StackHeaderToolbarFieldUpdate.kt} +1 -1
  85. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementOptions.kt +84 -0
  86. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +15 -0
  87. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +11 -0
  88. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +18 -0
  89. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/{StackHeaderToolbarMenuUpdateQueue.kt → update/StackHeaderToolbarMenuUpdateQueue.kt} +24 -52
  90. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueueDelegate.kt +9 -0
  91. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +103 -3
  92. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +13 -0
  93. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHostViewManager.kt +14 -0
  94. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +5 -0
  95. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +20 -1
  96. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragmentDelegate.kt +12 -0
  97. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +2 -4
  98. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/MenuHelpers.kt +5 -23
  99. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +46 -25
  100. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +10 -0
  101. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHostA11yCoordinator.kt +23 -2
  102. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +17 -0
  103. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenFragment.kt +3 -0
  104. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +7 -0
  105. package/android/src/main/java/com/swmansion/rnscreens/utils/StyleUtils.kt +22 -0
  106. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_available_space.xml +8 -0
  107. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_entire_space.xml +8 -0
  108. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_available_space.xml +8 -0
  109. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_entire_space.xml +8 -0
  110. package/common/cpp/react/renderer/components/rnscreens/legacy/RNSScreenShadowNode.cpp +10 -5
  111. package/cpp/legacy/RNSScreenRemovalListener.cpp +31 -1
  112. package/cpp/legacy/RNSScreenRemovalListener.h +18 -3
  113. package/ios/RNSEnums.h +2 -2
  114. package/ios/RNSOrientationProviding.h +0 -2
  115. package/ios/RNSReactMountingTransactionObserving.h +15 -0
  116. package/ios/conversion/RNSConversions.h +7 -108
  117. package/ios/legacy/RNSBarButtonItem.mm +12 -5
  118. package/ios/legacy/RNSFullWindowOverlay.mm +1 -1
  119. package/ios/legacy/RNSModalScreen.mm +1 -1
  120. package/ios/legacy/RNSScreen.h +8 -1
  121. package/ios/legacy/RNSScreen.mm +47 -36
  122. package/ios/legacy/RNSScreenContentWrapper.mm +9 -0
  123. package/ios/legacy/RNSScreenFooter.mm +2 -0
  124. package/ios/legacy/RNSScreenStack.mm +9 -4
  125. package/ios/legacy/RNSScreenStackHeaderConfig.mm +3 -1
  126. package/ios/legacy/RNSScreenStackHeaderSubview.mm +1 -1
  127. package/ios/legacy/RNSScreenWindowTraits.mm +5 -13
  128. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.h +1 -3
  129. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.mm +11 -22
  130. package/ios/modals/form-sheet/RNSFormSheetContentController.h +1 -1
  131. package/ios/modals/form-sheet/RNSFormSheetContentController.mm +7 -18
  132. package/ios/modals/form-sheet/RNSFormSheetContentWrapperComponentView.mm +9 -0
  133. package/ios/modals/form-sheet/RNSFormSheetHostComponentView.mm +4 -4
  134. package/ios/modals/form-sheet/RNSFormSheetHostShadowStateProxy.mm +2 -2
  135. package/ios/modals/form-sheet/RNSFormSheetUpdateFlags.h +3 -0
  136. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +2 -2
  137. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.h +17 -0
  138. package/ios/scroll-to-top-guard/RNSScrollToTopGuard.mm +57 -0
  139. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.h +28 -0
  140. package/ios/scroll-to-top-guard/RNSScrollToTopGuardGestureRecognizer.mm +64 -0
  141. package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.mm +2 -3
  142. package/ios/split/RNSSplitAppearanceApplicator.h +36 -0
  143. package/ios/split/RNSSplitAppearanceApplicator.mm +182 -0
  144. package/ios/split/RNSSplitAppearanceCoordinator.h +26 -0
  145. package/ios/split/RNSSplitAppearanceCoordinator.mm +27 -0
  146. package/ios/split/RNSSplitAppearanceUpdateFlags.h +14 -0
  147. package/ios/split/RNSSplitHostComponentEventEmitter.h +1 -0
  148. package/ios/split/RNSSplitHostComponentEventEmitter.mm +1 -1
  149. package/ios/split/RNSSplitHostComponentView.h +5 -15
  150. package/ios/split/RNSSplitHostComponentView.mm +56 -7
  151. package/ios/split/RNSSplitHostController.h +105 -0
  152. package/ios/split/RNSSplitHostController.mm +492 -0
  153. package/ios/split/RNSSplitHostProviders.h +67 -0
  154. package/ios/split/RNSSplitNavigationController.h +31 -0
  155. package/ios/split/RNSSplitNavigationController.mm +44 -0
  156. package/ios/split/RNSSplitNavigationControllerFrameObserver.h +32 -0
  157. package/ios/split/RNSSplitNavigationControllerFrameObserver.mm +80 -0
  158. package/ios/split/RNSSplitNavigationControllerFrameOriginChangeDelegate.h +15 -0
  159. package/ios/split/RNSSplitScreenComponentView.h +0 -39
  160. package/ios/split/RNSSplitScreenComponentView.mm +35 -19
  161. package/ios/split/RNSSplitScreenController.h +68 -0
  162. package/ios/split/RNSSplitScreenController.mm +113 -0
  163. package/ios/split/RNSSplitScreenShadowStateProxy.h +1 -40
  164. package/ios/split/RNSSplitScreenShadowStateProxy.mm +1 -26
  165. package/ios/split/conversion/RNSConversions-SplitView.h +56 -0
  166. package/ios/{conversion → split/conversion}/RNSConversions-SplitView.mm +4 -1
  167. package/ios/stack/conversion/RNSConversions-Stack.h +32 -0
  168. package/ios/stack/conversion/RNSConversions-Stack.mm +55 -0
  169. package/ios/stack/header/RNSStackHeaderAppearanceMapper.h +26 -0
  170. package/ios/stack/header/RNSStackHeaderAppearanceMapper.mm +88 -0
  171. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +11 -1
  172. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +108 -38
  173. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +9 -0
  174. package/ios/stack/header/RNSStackHeaderConfigShadowStateProxy.mm +1 -1
  175. package/ios/stack/header/RNSStackHeaderIconResolver.mm +7 -0
  176. package/ios/stack/header/RNSStackHeaderItemComponentView.h +3 -1
  177. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +15 -2
  178. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +2 -0
  179. package/ios/stack/header/RNSStackHeaderItemShadowStateProxy.mm +1 -1
  180. package/ios/stack/header/RNSStackHeaderItemSpacerComponentView.mm +2 -1
  181. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +9 -0
  182. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +15 -0
  183. package/ios/stack/header/RNSStackHeaderMenuFinder.h +18 -3
  184. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +21 -3
  185. package/ios/stack/header/RNSStackHeaderMenuMapper.mm +4 -0
  186. package/ios/stack/host/RNSStackHostComponentView.mm +3 -1
  187. package/ios/stack/host/RNSStackNavigationBar.h +25 -0
  188. package/ios/stack/host/RNSStackNavigationBar.mm +80 -0
  189. package/ios/stack/host/RNSStackNavigationBarCoordinator.h +8 -0
  190. package/ios/stack/host/RNSStackNavigationBarCoordinator.mm +11 -0
  191. package/ios/stack/host/RNSStackNavigationController.mm +14 -6
  192. package/ios/stack/host/RNSStackOperation.h +0 -2
  193. package/ios/stack/screen/RNSStackScreenComponentView.mm +9 -4
  194. package/ios/stack/screen/RNSStackScreenController.mm +12 -0
  195. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +14 -1
  196. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +159 -28
  197. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +40 -9
  198. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +1 -1
  199. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +4 -1
  200. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +5 -2
  201. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm +1 -1
  202. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm +1 -1
  203. package/ios/tabs/conversion/RNSConversions-Tabs.h +78 -0
  204. package/ios/{conversion → tabs/conversion}/RNSConversions-Tabs.mm +8 -71
  205. package/ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h +1 -1
  206. package/ios/tabs/host/RNSTabBarController.h +5 -12
  207. package/ios/tabs/host/RNSTabBarController.mm +1 -1
  208. package/ios/tabs/host/RNSTabsHostComponentView.h +2 -0
  209. package/ios/tabs/host/RNSTabsHostComponentView.mm +10 -3
  210. package/ios/tabs/host/RNSTabsHostEventEmitter.mm +1 -1
  211. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +20 -5
  212. package/ios/utils/RNSDefines.h +3 -0
  213. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +25 -0
  214. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  215. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js +24 -0
  216. package/lib/commonjs/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  217. package/lib/commonjs/components/scroll-to-top-guard/index.js +13 -0
  218. package/lib/commonjs/components/scroll-to-top-guard/index.js.map +1 -0
  219. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +34 -19
  220. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  221. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +44 -13
  222. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  223. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  224. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  225. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js +33 -2
  226. package/lib/commonjs/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  227. package/lib/commonjs/components/stack/header/utils.js +6 -9
  228. package/lib/commonjs/components/stack/header/utils.js.map +1 -1
  229. package/lib/commonjs/components/stack/host/StackHost.js +9 -6
  230. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  231. package/lib/commonjs/components/stack/index.js.map +1 -1
  232. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +1 -0
  233. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  234. package/lib/commonjs/experimental/index.js +11 -0
  235. package/lib/commonjs/experimental/index.js.map +1 -1
  236. package/lib/commonjs/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  237. package/lib/commonjs/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  238. package/lib/commonjs/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  239. package/lib/commonjs/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  240. package/lib/commonjs/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  241. package/lib/commonjs/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  242. package/lib/commonjs/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  243. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  244. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  245. package/lib/commonjs/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  246. package/lib/commonjs/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  247. package/lib/commonjs/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  248. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +12 -0
  249. package/lib/commonjs/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  250. package/lib/commonjs/fabric/split/SplitHostNativeComponent.js.map +1 -1
  251. package/lib/commonjs/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  252. package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  253. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  254. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  255. package/lib/commonjs/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  256. package/lib/commonjs/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  257. package/lib/commonjs/fabric/stack/StackHostNativeComponent.js.map +1 -1
  258. package/lib/commonjs/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  259. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  260. package/lib/commonjs/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  261. package/lib/commonjs/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  262. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  263. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  264. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  265. package/lib/commonjs/flags.js +22 -1
  266. package/lib/commonjs/flags.js.map +1 -1
  267. package/lib/commonjs/legacy/components/Screen.js +6 -1
  268. package/lib/commonjs/legacy/components/Screen.js.map +1 -1
  269. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js +5 -0
  270. package/lib/commonjs/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  271. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  272. package/lib/commonjs/legacy/components/SearchBar.js +16 -16
  273. package/lib/commonjs/legacy/components/SearchBar.js.map +1 -1
  274. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js +3 -0
  275. package/lib/commonjs/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  276. package/lib/commonjs/legacy/gesture-handler/fabricUtils.js.map +1 -1
  277. package/lib/commonjs/legacy/useTransitionProgress.js.map +1 -1
  278. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js +20 -0
  279. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.ios.js.map +1 -0
  280. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js +18 -0
  281. package/lib/module/components/scroll-to-top-guard/ScrollToTopGuard.js.map +1 -0
  282. package/lib/module/components/scroll-to-top-guard/index.js +2 -0
  283. package/lib/module/components/scroll-to-top-guard/index.js.map +1 -0
  284. package/lib/module/components/stack/header/StackHeaderConfig.android.js +35 -20
  285. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  286. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +48 -17
  287. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  288. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +1 -22
  289. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  290. package/lib/module/components/stack/header/ios/iconUtils.ios.js +31 -2
  291. package/lib/module/components/stack/header/ios/iconUtils.ios.js.map +1 -1
  292. package/lib/module/components/stack/header/utils.js +5 -8
  293. package/lib/module/components/stack/header/utils.js.map +1 -1
  294. package/lib/module/components/stack/host/StackHost.js +9 -6
  295. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  296. package/lib/module/components/stack/index.js.map +1 -1
  297. package/lib/module/components/tabs/host/TabsHost.ios.js +1 -0
  298. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  299. package/lib/module/experimental/index.js +1 -0
  300. package/lib/module/experimental/index.js.map +1 -1
  301. package/lib/module/fabric/ScrollViewMarkerNativeComponent.js.map +1 -1
  302. package/lib/module/fabric/legacy/FullWindowOverlayNativeComponent.js.map +1 -1
  303. package/lib/module/fabric/legacy/ModalScreenNativeComponent.js.map +1 -1
  304. package/lib/module/fabric/legacy/ScreenContainerNativeComponent.js.map +1 -1
  305. package/lib/module/fabric/legacy/ScreenFooterNativeComponent.js.map +1 -1
  306. package/lib/module/fabric/legacy/ScreenNativeComponent.js.map +1 -1
  307. package/lib/module/fabric/legacy/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  308. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  309. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  310. package/lib/module/fabric/legacy/SearchBarNativeComponent.js.map +1 -1
  311. package/lib/module/fabric/modals/form-sheet/FormSheetHostNativeComponent.js.map +1 -1
  312. package/lib/module/fabric/safe-area/SafeAreaViewNativeComponent.js.map +1 -1
  313. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js +7 -0
  314. package/lib/module/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.js.map +1 -0
  315. package/lib/module/fabric/split/SplitHostNativeComponent.js.map +1 -1
  316. package/lib/module/fabric/split/SplitScreenNativeComponent.js.map +1 -1
  317. package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  318. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  319. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  320. package/lib/module/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.js.map +1 -1
  321. package/lib/module/fabric/stack/StackHeaderSubviewAndroidNativeComponent.js.map +1 -1
  322. package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
  323. package/lib/module/fabric/stack/StackScreenNativeComponent.js.map +1 -1
  324. package/lib/module/fabric/tabs/TabsBottomAccessoryContentNativeComponent.js.map +1 -1
  325. package/lib/module/fabric/tabs/TabsBottomAccessoryNativeComponent.js.map +1 -1
  326. package/lib/module/fabric/tabs/TabsHostAndroidNativeComponent.js.map +1 -1
  327. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  328. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  329. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  330. package/lib/module/flags.js +22 -1
  331. package/lib/module/flags.js.map +1 -1
  332. package/lib/module/legacy/components/Screen.js +6 -1
  333. package/lib/module/legacy/components/Screen.js.map +1 -1
  334. package/lib/module/legacy/components/ScreenStackHeaderConfig.js +5 -0
  335. package/lib/module/legacy/components/ScreenStackHeaderConfig.js.map +1 -1
  336. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  337. package/lib/module/legacy/components/SearchBar.js +17 -17
  338. package/lib/module/legacy/components/SearchBar.js.map +1 -1
  339. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js +4 -0
  340. package/lib/module/legacy/components/helpers/prepareHeaderBarButtonItems.js.map +1 -1
  341. package/lib/module/legacy/gesture-handler/fabricUtils.js.map +1 -1
  342. package/lib/module/legacy/useTransitionProgress.js.map +1 -1
  343. package/lib/module/private/hooks/useRenderDebugInfo.js.map +1 -1
  344. package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +3 -3
  345. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts +5 -2
  346. package/lib/typescript/components/safe-area/SafeAreaView.web.d.ts.map +1 -1
  347. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts +15 -0
  348. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.d.ts.map +1 -0
  349. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts +12 -0
  350. package/lib/typescript/components/scroll-to-top-guard/ScrollToTopGuard.ios.d.ts.map +1 -0
  351. package/lib/typescript/components/scroll-to-top-guard/index.d.ts +2 -0
  352. package/lib/typescript/components/scroll-to-top-guard/index.d.ts.map +1 -0
  353. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  354. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +639 -20
  355. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  356. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  357. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +239 -2
  358. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  359. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +2 -2
  360. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +5 -2
  361. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +1 -1
  362. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  363. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +2 -0
  364. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  365. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts +3 -0
  366. package/lib/typescript/components/stack/header/ios/iconUtils.ios.d.ts.map +1 -1
  367. package/lib/typescript/components/stack/header/utils.d.ts +1 -2
  368. package/lib/typescript/components/stack/header/utils.d.ts.map +1 -1
  369. package/lib/typescript/components/stack/host/StackHost.d.ts +1 -1
  370. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  371. package/lib/typescript/components/stack/host/StackHost.types.d.ts +26 -2
  372. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  373. package/lib/typescript/components/stack/host/StackHost.web.d.ts +6 -2
  374. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  375. package/lib/typescript/components/stack/index.d.ts +2 -2
  376. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  377. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts +5 -2
  378. package/lib/typescript/components/stack/screen/StackScreen.web.d.ts.map +1 -1
  379. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  380. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +16 -0
  381. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  382. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +3 -0
  383. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -1
  384. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +5 -2
  385. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +1 -1
  386. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts +7 -3
  387. package/lib/typescript/components/tabs/screen/TabsScreen.types.d.ts.map +1 -1
  388. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +5 -2
  389. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +1 -1
  390. package/lib/typescript/experimental/index.d.ts +1 -0
  391. package/lib/typescript/experimental/index.d.ts.map +1 -1
  392. package/lib/typescript/fabric/NativeScreensModule.d.ts +1 -1
  393. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts +2 -2
  394. package/lib/typescript/fabric/ScrollViewMarkerNativeComponent.d.ts.map +1 -1
  395. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts +2 -2
  396. package/lib/typescript/fabric/legacy/FullWindowOverlayNativeComponent.d.ts.map +1 -1
  397. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts +3 -2
  398. package/lib/typescript/fabric/legacy/ModalScreenNativeComponent.d.ts.map +1 -1
  399. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts +2 -2
  400. package/lib/typescript/fabric/legacy/ScreenContainerNativeComponent.d.ts.map +1 -1
  401. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts +2 -2
  402. package/lib/typescript/fabric/legacy/ScreenContentWrapperNativeComponent.d.ts.map +1 -1
  403. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts +2 -2
  404. package/lib/typescript/fabric/legacy/ScreenFooterNativeComponent.d.ts.map +1 -1
  405. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts +3 -2
  406. package/lib/typescript/fabric/legacy/ScreenNativeComponent.d.ts.map +1 -1
  407. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts +2 -2
  408. package/lib/typescript/fabric/legacy/ScreenNavigationContainerNativeComponent.d.ts.map +1 -1
  409. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts +3 -3
  410. package/lib/typescript/fabric/legacy/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  411. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -2
  412. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  413. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +2 -2
  414. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  415. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts +6 -6
  416. package/lib/typescript/fabric/legacy/SearchBarNativeComponent.d.ts.map +1 -1
  417. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts +2 -2
  418. package/lib/typescript/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.d.ts.map +1 -1
  419. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts +2 -2
  420. package/lib/typescript/fabric/modals/form-sheet/FormSheetHostNativeComponent.d.ts.map +1 -1
  421. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts +2 -2
  422. package/lib/typescript/fabric/safe-area/SafeAreaViewNativeComponent.d.ts.map +1 -1
  423. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts +6 -0
  424. package/lib/typescript/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.d.ts.map +1 -0
  425. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts +1 -1
  426. package/lib/typescript/fabric/split/SplitHostNativeComponent.d.ts.map +1 -1
  427. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts +2 -2
  428. package/lib/typescript/fabric/split/SplitScreenNativeComponent.d.ts.map +1 -1
  429. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +53 -0
  430. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
  431. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +27 -2
  432. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  433. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +4 -2
  434. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  435. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts +2 -2
  436. package/lib/typescript/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.d.ts.map +1 -1
  437. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts +2 -2
  438. package/lib/typescript/fabric/stack/StackHeaderSubviewAndroidNativeComponent.d.ts.map +1 -1
  439. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +4 -2
  440. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
  441. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts +2 -2
  442. package/lib/typescript/fabric/stack/StackScreenNativeComponent.d.ts.map +1 -1
  443. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts +2 -2
  444. package/lib/typescript/fabric/tabs/TabsBottomAccessoryContentNativeComponent.d.ts.map +1 -1
  445. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts +2 -2
  446. package/lib/typescript/fabric/tabs/TabsBottomAccessoryNativeComponent.d.ts.map +1 -1
  447. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts +2 -2
  448. package/lib/typescript/fabric/tabs/TabsHostAndroidNativeComponent.d.ts.map +1 -1
  449. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +3 -2
  450. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  451. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +2 -2
  452. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  453. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +2 -2
  454. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  455. package/lib/typescript/flags.d.ts +13 -0
  456. package/lib/typescript/flags.d.ts.map +1 -1
  457. package/lib/typescript/legacy/TransitionProgressContext.d.ts +1 -1
  458. package/lib/typescript/legacy/TransitionProgressContext.d.ts.map +1 -1
  459. package/lib/typescript/legacy/components/Screen.d.ts +5 -3
  460. package/lib/typescript/legacy/components/Screen.d.ts.map +1 -1
  461. package/lib/typescript/legacy/components/Screen.web.d.ts +10 -2
  462. package/lib/typescript/legacy/components/Screen.web.d.ts.map +1 -1
  463. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts +5 -2
  464. package/lib/typescript/legacy/components/ScreenContainer.web.d.ts.map +1 -1
  465. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts +5 -2
  466. package/lib/typescript/legacy/components/ScreenContentWrapper.web.d.ts.map +1 -1
  467. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts +5 -2
  468. package/lib/typescript/legacy/components/ScreenContentWrapper.windows.d.ts.map +1 -1
  469. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts +10 -3
  470. package/lib/typescript/legacy/components/ScreenFooter.web.d.ts.map +1 -1
  471. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts +10 -3
  472. package/lib/typescript/legacy/components/ScreenFooter.windows.d.ts.map +1 -1
  473. package/lib/typescript/legacy/components/ScreenStack.web.d.ts +5 -2
  474. package/lib/typescript/legacy/components/ScreenStack.web.d.ts.map +1 -1
  475. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts +3 -1
  476. package/lib/typescript/legacy/components/ScreenStackHeaderConfig.d.ts.map +1 -1
  477. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +3 -2
  478. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  479. package/lib/typescript/legacy/components/SearchBar.d.ts +3 -3
  480. package/lib/typescript/legacy/components/SearchBar.d.ts.map +1 -1
  481. package/lib/typescript/legacy/components/SearchBar.web.d.ts +5 -2
  482. package/lib/typescript/legacy/components/SearchBar.web.d.ts.map +1 -1
  483. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +15 -12
  484. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  485. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts +3 -2
  486. package/lib/typescript/legacy/gesture-handler/fabricUtils.d.ts.map +1 -1
  487. package/lib/typescript/legacy/types.d.ts +25 -5
  488. package/lib/typescript/legacy/types.d.ts.map +1 -1
  489. package/lib/typescript/legacy/useTransitionProgress.d.ts +2 -5
  490. package/lib/typescript/legacy/useTransitionProgress.d.ts.map +1 -1
  491. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts +2 -2
  492. package/lib/typescript/private/hooks/useRenderDebugInfo.d.ts.map +1 -1
  493. package/package.json +18 -17
  494. package/react-native.config.js +3 -0
  495. package/src/components/modals/form-sheet/FormSheet.types.ts +3 -3
  496. package/src/components/scroll-to-top-guard/ScrollToTopGuard.ios.tsx +17 -0
  497. package/src/components/scroll-to-top-guard/ScrollToTopGuard.tsx +18 -0
  498. package/src/components/scroll-to-top-guard/index.ts +1 -0
  499. package/src/components/stack/header/StackHeaderConfig.android.tsx +48 -23
  500. package/src/components/stack/header/StackHeaderConfig.android.types.ts +660 -20
  501. package/src/components/stack/header/StackHeaderConfig.ios.tsx +77 -23
  502. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +251 -2
  503. package/src/components/stack/header/StackHeaderConfig.types.ts +2 -2
  504. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +1 -23
  505. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +2 -0
  506. package/src/components/stack/header/ios/iconUtils.ios.ts +38 -2
  507. package/src/components/stack/header/utils.ts +6 -11
  508. package/src/components/stack/host/StackHost.tsx +4 -2
  509. package/src/components/stack/host/StackHost.types.ts +28 -4
  510. package/src/components/stack/index.ts +6 -1
  511. package/src/components/tabs/host/TabsHost.ios.tsx +1 -0
  512. package/src/components/tabs/host/TabsHost.ios.types.ts +16 -0
  513. package/src/components/tabs/host/TabsHost.types.ts +3 -0
  514. package/src/components/tabs/screen/TabsScreen.types.ts +7 -3
  515. package/src/experimental/index.ts +1 -0
  516. package/src/fabric/ScrollViewMarkerNativeComponent.ts +8 -2
  517. package/src/fabric/legacy/FullWindowOverlayNativeComponent.ts +6 -2
  518. package/src/fabric/legacy/ModalScreenNativeComponent.ts +8 -2
  519. package/src/fabric/legacy/ScreenContainerNativeComponent.ts +5 -2
  520. package/src/fabric/legacy/ScreenContentWrapperNativeComponent.ts +2 -2
  521. package/src/fabric/legacy/ScreenFooterNativeComponent.ts +5 -2
  522. package/src/fabric/legacy/ScreenNativeComponent.ts +8 -2
  523. package/src/fabric/legacy/ScreenNavigationContainerNativeComponent.ts +2 -2
  524. package/src/fabric/legacy/ScreenStackHeaderConfigNativeComponent.ts +8 -3
  525. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -2
  526. package/src/fabric/legacy/ScreenStackNativeComponent.ts +10 -2
  527. package/src/fabric/legacy/SearchBarNativeComponent.ts +10 -7
  528. package/src/fabric/modals/form-sheet/FormSheetContentWrapperNativeComponent.ts +2 -2
  529. package/src/fabric/modals/form-sheet/FormSheetHostNativeComponent.ts +7 -2
  530. package/src/fabric/safe-area/SafeAreaViewNativeComponent.ts +6 -2
  531. package/src/fabric/scroll-to-top-guard/ScrollToTopGuardNativeComponent.ts +10 -0
  532. package/src/fabric/split/SplitHostNativeComponent.ts +5 -2
  533. package/src/fabric/split/SplitScreenNativeComponent.ts +6 -2
  534. package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +81 -1
  535. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +39 -2
  536. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +4 -1
  537. package/src/fabric/stack/StackHeaderItemSpacerIOSNativeComponent.ts +6 -2
  538. package/src/fabric/stack/StackHeaderSubviewAndroidNativeComponent.ts +6 -2
  539. package/src/fabric/stack/StackHostNativeComponent.ts +15 -3
  540. package/src/fabric/stack/StackScreenNativeComponent.ts +6 -2
  541. package/src/fabric/tabs/TabsBottomAccessoryContentNativeComponent.ts +6 -2
  542. package/src/fabric/tabs/TabsBottomAccessoryNativeComponent.ts +6 -2
  543. package/src/fabric/tabs/TabsHostAndroidNativeComponent.ts +7 -2
  544. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +8 -2
  545. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +2 -1
  546. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +2 -1
  547. package/src/flags.ts +26 -0
  548. package/src/legacy/TransitionProgressContext.tsx +1 -1
  549. package/src/legacy/components/Screen.tsx +14 -6
  550. package/src/legacy/components/ScreenStackHeaderConfig.tsx +7 -1
  551. package/src/legacy/components/ScreenStackItem.tsx +3 -4
  552. package/src/legacy/components/SearchBar.tsx +34 -44
  553. package/src/legacy/components/helpers/prepareHeaderBarButtonItems.ts +7 -1
  554. package/src/legacy/gesture-handler/fabricUtils.ts +5 -2
  555. package/src/legacy/types.ts +28 -5
  556. package/src/legacy/useTransitionProgress.tsx +4 -2
  557. package/src/private/hooks/useRenderDebugInfo.tsx +2 -2
  558. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingView.kt +0 -83
  559. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewManager.kt +0 -89
  560. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewPointerEvents.kt +0 -18
  561. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDetents.kt +0 -106
  562. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDialog.kt +0 -60
  563. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDialogManager.kt +0 -138
  564. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetDimensionsCoordinator.kt +0 -131
  565. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetNativeDismissCoordinator.kt +0 -25
  566. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/FormSheetPresentationManager.kt +0 -207
  567. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderAppBarLayout.kt +0 -113
  568. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuConfig.kt +0 -60
  569. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuElementOptions.kt +0 -32
  570. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuGroupMetadata.kt +0 -16
  571. package/ios/ReactMountingTransactionObserving.swift +0 -7
  572. package/ios/bridging/Swift-Bridging.h +0 -7
  573. package/ios/conversion/RNSConversions-Stack.h +0 -32
  574. package/ios/conversion/RNSConversions-Stack.mm +0 -41
  575. package/ios/conversion/always_false.h +0 -31
  576. package/ios/orientation/RNSOrientationProviding.swift +0 -6
  577. package/ios/orientation/RNSOrientationSwift.swift +0 -14
  578. package/ios/split/RNSSplitAppearanceApplicator.swift +0 -199
  579. package/ios/split/RNSSplitAppearanceCoordinator.swift +0 -26
  580. package/ios/split/RNSSplitAppearanceUpdateFlags.swift +0 -11
  581. package/ios/split/RNSSplitHostController.swift +0 -570
  582. package/ios/split/RNSSplitNavigationController.swift +0 -46
  583. package/ios/split/RNSSplitScreenController.swift +0 -133
  584. package/ios/utils/RNSLog.swift +0 -6
  585. /package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.h +0 -0
@@ -0,0 +1,26 @@
1
+ #pragma once
2
+
3
+ #import <UIKit/UIKit.h>
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ @interface RNSStackHeaderAppearanceMapper : NSObject
8
+
9
+ /**
10
+ * Maps appearance props to a UINavigationBarAppearance object.
11
+ * `appearanceDict` should be an NSDictionary with a flat structure, where entries correspond
12
+ * to UIKit attributes, e.g. `titleFontFamily`, `subtitleFontColor`, or empty, for UIKit defaults.
13
+ */
14
+ + (nullable UINavigationBarAppearance *)appearanceFromDictionary:(nullable NSDictionary *)appearanceDict;
15
+
16
+ /**
17
+ * Maps scroll edge appearance props to a UINavigationBarAppearance object.
18
+ * `appearanceDict` should be an NSDictionary with a flat structure, where entries correspond
19
+ * to UIKit attributes, e.g. `titleFontFamily`, `subtitleFontColor`, or empty, for UIKit defaults.
20
+ * The appearance object is built with transparent background configured by default, matching UIKit.
21
+ */
22
+ + (nullable UINavigationBarAppearance *)scrollEdgeAppearanceFromDictionary:(nullable NSDictionary *)appearanceDict;
23
+
24
+ @end
25
+
26
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,88 @@
1
+ #import "RNSStackHeaderAppearanceMapper.h"
2
+ #import "RNSDefines.h"
3
+
4
+ #import <React/RCTConvert.h>
5
+ #import <React/RCTFont.h>
6
+
7
+ @implementation RNSStackHeaderAppearanceMapper
8
+
9
+ + (nullable UINavigationBarAppearance *)appearanceFromDictionary:(nullable NSDictionary *)appearanceDict
10
+ {
11
+ if (appearanceDict.count == 0) {
12
+ return nil;
13
+ }
14
+
15
+ UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
16
+ [self applyTextAttributesFromDictionary:appearanceDict toAppearance:appearance];
17
+ return appearance;
18
+ }
19
+
20
+ + (nullable UINavigationBarAppearance *)scrollEdgeAppearanceFromDictionary:(nullable NSDictionary *)appearanceDict
21
+ {
22
+ if (appearanceDict.count == 0) {
23
+ return nil;
24
+ }
25
+
26
+ UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
27
+
28
+ // A nil navigationItem.scrollEdgeAppearance natively resolves to the item's (or bar's)
29
+ // standard appearance with a transparent background. Start the explicit scroll edge
30
+ // appearance from the same transparent base so that a text-only appearance prop does
31
+ // not suddenly bring back the default bar background at the scroll edge.
32
+ [appearance configureWithTransparentBackground];
33
+
34
+ [self applyTextAttributesFromDictionary:appearanceDict toAppearance:appearance];
35
+ return appearance;
36
+ }
37
+
38
+ + (void)applyTextAttributesFromDictionary:(nullable NSDictionary *)appearanceDict
39
+ toAppearance:(nonnull UINavigationBarAppearance *)appearance
40
+ {
41
+ appearance.titleTextAttributes = [self textAttributes:appearance.titleTextAttributes
42
+ updatedWithDictionary:appearanceDict
43
+ keyPrefix:@"title"];
44
+ appearance.largeTitleTextAttributes = [self textAttributes:appearance.largeTitleTextAttributes
45
+ updatedWithDictionary:appearanceDict
46
+ keyPrefix:@"largeTitle"];
47
+
48
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
49
+ if (@available(iOS 26.0, *)) {
50
+ // UIKit derives both the regular and the large subtitle appearance from
51
+ // subtitleTextAttributes; largeSubtitleTextAttributes is ignored.
52
+ appearance.subtitleTextAttributes = [self textAttributes:appearance.subtitleTextAttributes
53
+ updatedWithDictionary:appearanceDict
54
+ keyPrefix:@"subtitle"];
55
+ }
56
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
57
+ }
58
+
59
+ + (nonnull NSDictionary *)textAttributes:(nullable NSDictionary *)baseAttributes
60
+ updatedWithDictionary:(nullable NSDictionary *)appearanceDict
61
+ keyPrefix:(nonnull NSString *)keyPrefix
62
+ {
63
+ id fontFamily = appearanceDict[[keyPrefix stringByAppendingString:@"FontFamily"]];
64
+ id fontSize = appearanceDict[[keyPrefix stringByAppendingString:@"FontSize"]];
65
+ id fontWeight = appearanceDict[[keyPrefix stringByAppendingString:@"FontWeight"]];
66
+ id fontStyle = appearanceDict[[keyPrefix stringByAppendingString:@"FontStyle"]];
67
+ id fontColor = appearanceDict[[keyPrefix stringByAppendingString:@"FontColor"]];
68
+
69
+ NSMutableDictionary *textAttributes = [baseAttributes mutableCopy] ?: [NSMutableDictionary new];
70
+
71
+ if (fontFamily != nil || fontSize != nil || fontWeight != nil || fontStyle != nil) {
72
+ textAttributes[NSFontAttributeName] = [RCTFont updateFont:baseAttributes[NSFontAttributeName]
73
+ withFamily:fontFamily
74
+ size:fontSize
75
+ weight:fontWeight
76
+ style:fontStyle
77
+ variant:nil
78
+ scaleMultiplier:1.0];
79
+ }
80
+
81
+ if (fontColor != nil) {
82
+ textAttributes[NSForegroundColorAttributeName] = [RCTConvert UIColor:fontColor];
83
+ }
84
+
85
+ return textAttributes;
86
+ }
87
+
88
+ @end
@@ -5,6 +5,7 @@
5
5
  #import "RNSStackHeaderConfigDataProviding.h"
6
6
  #import "RNSStackHeaderEventsDelegate.h"
7
7
  #import "RNSStackHeaderItemInvalidationDelegate.h"
8
+ #import "RNSStackScreenHeaderCoordinator.h"
8
9
  #import "RNSViewFrameChangeDelegate.h"
9
10
 
10
11
  NS_ASSUME_NONNULL_BEGIN
@@ -21,8 +22,17 @@ NS_ASSUME_NONNULL_BEGIN
21
22
  @property (nonatomic, readonly, nullable) NSString *largeTitle;
22
23
  @property (nonatomic, readonly, nullable) NSString *largeSubtitle;
23
24
  @property (nonatomic, readonly) BOOL largeTitleEnabled;
25
+ @property (nonatomic, readonly, nullable) NSString *prompt;
26
+ @property (nonatomic, readonly, nullable) NSString *backButtonTitle;
27
+ @property (nonatomic, readonly) UINavigationItemBackButtonDisplayMode backButtonDisplayMode;
28
+ @property (nonatomic, readonly) BOOL backButtonMenuEnabled;
29
+ @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *titleMenu;
30
+ @property (nonatomic, readonly, nullable) UINavigationBarAppearance *standardAppearance;
31
+ @property (nonatomic, readonly, nullable) UINavigationBarAppearance *scrollEdgeAppearance;
24
32
  @property (nonatomic, readonly) NSArray<id> *children;
25
33
 
34
+ @property (nonatomic, weak, nullable) RNSStackScreenHeaderCoordinator *headerCoordinator;
35
+
26
36
  - (void)resetProps;
27
37
 
28
38
  @end
@@ -33,7 +43,7 @@ NS_ASSUME_NONNULL_END
33
43
 
34
44
  #if defined(__cplusplus)
35
45
 
36
- #import <rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
46
+ #import <react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
37
47
 
38
48
  @interface RNSStackHeaderConfigComponentView ()
39
49
 
@@ -1,15 +1,19 @@
1
1
  #import "RNSStackHeaderConfigComponentView.h"
2
+ #import "RNSConversions.h"
3
+ #import "RNSConversions-Stack.h"
2
4
  #import "RNSImageLoadingHelper.h"
5
+ #import "RNSStackHeaderAppearanceMapper.h"
3
6
  #import "RNSStackHeaderConfigEventEmitter.h"
4
7
  #import "RNSStackHeaderConfigShadowStateProxy.h"
5
8
  #import "RNSStackHeaderItemComponentView.h"
6
9
  #import "RNSStackHeaderItemSpacerComponentView.h"
10
+ #import "RNSStackHeaderMenuCoordinator.h"
7
11
  #import "RNSStackHeaderMenuFinder.h"
12
+ #import "RNSStackHeaderMenuMapper.h"
8
13
  #import "RNSStackHeaderMenuUpdateOptions.h"
9
14
  #import "RNSStackNavigationController.h"
10
15
  #import "RNSStackScreenComponentView.h"
11
16
  #import "RNSStackScreenController.h"
12
- #import "RNSStackScreenHeaderCoordinator.h"
13
17
 
14
18
  #import <React/RCTConversions.h>
15
19
  #import <React/RCTConvert.h>
@@ -18,7 +22,7 @@
18
22
  #import <react/renderer/components/rnscreens/Props.h>
19
23
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
20
24
  #import <react/utils/ManagedObjectWrapper.h>
21
- #import <rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
25
+ #import <react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
22
26
 
23
27
  namespace react = facebook::react;
24
28
 
@@ -64,6 +68,13 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
64
68
  _largeTitle = nil;
65
69
  _largeSubtitle = nil;
66
70
  _largeTitleEnabled = NO;
71
+ _prompt = nil;
72
+ _backButtonTitle = nil;
73
+ _backButtonDisplayMode = UINavigationItemBackButtonDisplayModeDefault;
74
+ _backButtonMenuEnabled = YES;
75
+ _titleMenu = nil;
76
+ _standardAppearance = nil;
77
+ _scrollEdgeAppearance = nil;
67
78
  }
68
79
 
69
80
  - (NSArray<id> *)children
@@ -119,18 +130,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
119
130
  {
120
131
  if (self.window != nil) {
121
132
  [[self requireNavigationController] setNavigationBarFrameChangeDelegate:self];
122
- RNSStackScreenHeaderCoordinator *coordinator = [self headerCoordinator];
123
- coordinator.configDataProvider = self;
124
- coordinator.frameChangeDelegate = self;
125
- coordinator.eventsDelegate = self;
126
- coordinator.imageLoader = self;
127
- [coordinator rebuild];
128
- } else {
129
- RNSStackScreenHeaderCoordinator *coordinator = [self headerCoordinator];
130
- coordinator.configDataProvider = nil;
131
- coordinator.frameChangeDelegate = nil;
132
- coordinator.eventsDelegate = nil;
133
- coordinator.imageLoader = nil;
133
+ [self.headerCoordinator rebuild];
134
134
  }
135
135
  [super didMoveToWindow];
136
136
  }
@@ -151,7 +151,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
151
151
  ((RNSStackHeaderItemSpacerComponentView *)childComponentView).invalidationDelegate = self;
152
152
  }
153
153
 
154
- [[self headerCoordinator] rebuild];
154
+ [self.headerCoordinator rebuild];
155
155
  }
156
156
 
157
157
  - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
@@ -165,7 +165,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
165
165
  }
166
166
 
167
167
  [_children removeObjectAtIndex:index];
168
- [[self headerCoordinator] rebuild];
168
+ [self.headerCoordinator rebuild];
169
169
  }
170
170
 
171
171
  #pragma mark - RNSStackHeaderItemInvalidationDelegate
@@ -174,22 +174,21 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
174
174
  {
175
175
  if (itemId == nil) {
176
176
  RCTLogWarn(@"[RNScreens] headerItemDidInvalidateWithId called with nil id, will run full header rebuild");
177
- [[self headerCoordinator] rebuild];
177
+ [self.headerCoordinator rebuild];
178
178
  return;
179
179
  }
180
- [[self headerCoordinator] rebuildItemWithId:itemId];
180
+ [self.headerCoordinator rebuildItemWithId:itemId];
181
181
  }
182
182
 
183
183
  - (void)headerItemMenuDidChangeWithId:(NSString *)itemId
184
184
  {
185
185
  if (itemId == nil) {
186
186
  RCTLogWarn(@"[RNScreens] headerItemMenuDidChangeWithId called with nil id, will run full header rebuild");
187
- [[self headerCoordinator] rebuild];
187
+ [self.headerCoordinator rebuild];
188
188
  return;
189
189
  }
190
- RNSStackScreenHeaderCoordinator *coordinator = [self headerCoordinator];
191
- [coordinator resetTrackerForItemWithId:itemId];
192
- [coordinator reapplyMenuForItemWithId:itemId];
190
+ [self.headerCoordinator resetTrackerForItemWithId:itemId];
191
+ [self.headerCoordinator reapplyMenuForItemWithId:itemId];
193
192
  }
194
193
 
195
194
  /**
@@ -200,15 +199,15 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
200
199
  if (itemId == nil) {
201
200
  RCTLogWarn(
202
201
  @"[RNScreens] headerItemMenuDidUpdateFromCommandWithId called with nil id, will run full header rebuild");
203
- [[self headerCoordinator] rebuild];
202
+ [self.headerCoordinator rebuild];
204
203
  return;
205
204
  }
206
- [[self headerCoordinator] reapplyMenuForItemWithId:itemId];
205
+ [self.headerCoordinator reapplyMenuForItemWithId:itemId];
207
206
  }
208
207
 
209
208
  - (void)headerItemSpacerDidInvalidate
210
209
  {
211
- [[self headerCoordinator] rebuild];
210
+ [self.headerCoordinator rebuild];
212
211
  }
213
212
 
214
213
  #pragma mark - RNSStackHeaderEventsDelegate
@@ -270,7 +269,8 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
270
269
  }
271
270
 
272
271
  RNSMenuElementLocator *locator = [RNSStackHeaderMenuFinder findMenuElementWithId:menuItemId
273
- inHeaderItems:[self headerItems]];
272
+ inHeaderItems:[self headerItems]
273
+ titleMenu:_titleMenu];
274
274
  if (locator == nil) {
275
275
  RCTLogWarn(@"[RNScreens] setMenuItemOptions: element with id \"%@\" not found", menuItemId);
276
276
  return;
@@ -285,16 +285,16 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
285
285
  RNSStackHeaderMenuItemData *newItemData = [RNSMenuItemUpdateOptions applyOptions:updateOptions
286
286
  toMenuItem:oldItemData];
287
287
 
288
- if (updateOptions.hasToggleState) {
288
+ if (updateOptions.hasToggleState && locator.rootMenu != nil && locator.trackerItemId != nil) {
289
289
  BOOL isToggle = oldItemData.itemType == RNSMenuItemTypeToggle ||
290
- (oldItemData.itemType == RNSMenuItemTypeAutomatic && locator.headerItem.menu != nil &&
291
- [RNSStackHeaderMenuFinder singleSelectionRootForElementWithId:menuItemId
292
- inMenu:locator.headerItem.menu] != nil);
290
+ (oldItemData.itemType == RNSMenuItemTypeAutomatic &&
291
+ [RNSStackHeaderMenuFinder singleSelectionRootForElementWithId:menuItemId inMenu:locator.rootMenu] != nil);
293
292
  if (isToggle) {
294
- [[self headerCoordinator] setToggleState:updateOptions.toggleState
295
- forMenuElementId:menuItemId
296
- withItemId:locator.headerItem.itemId
297
- parentMenu:locator.searchResult.parentMenu];
293
+ [self.headerCoordinator setToggleState:updateOptions.toggleState
294
+ forMenuElementId:menuItemId
295
+ trackerItemId:locator.trackerItemId
296
+ rootMenu:locator.rootMenu
297
+ parentMenu:locator.searchResult.parentMenu];
298
298
  }
299
299
  }
300
300
 
@@ -308,8 +308,15 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
308
308
  parentMenu:locator.searchResult.parentMenu];
309
309
  break;
310
310
  case RNSMenuElementPositionTitle:
311
+ if (locator.searchResult.parentMenu != nil) {
312
+ _titleMenu = [RNSStackHeaderMenuCoordinator menu:_titleMenu
313
+ replacingChildWithId:menuItemId
314
+ withElement:newItemData];
315
+ }
316
+ [self.headerCoordinator reapplyTitleMenu];
317
+ break;
311
318
  case RNSMenuElementPositionOverflow:
312
- // TODO: handle title menu and overflow menu
319
+ // TODO: handle overflow menu
313
320
  break;
314
321
  }
315
322
  }
@@ -322,7 +329,8 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
322
329
  }
323
330
 
324
331
  RNSMenuElementLocator *locator = [RNSStackHeaderMenuFinder findMenuElementWithId:menuElementId
325
- inHeaderItems:[self headerItems]];
332
+ inHeaderItems:[self headerItems]
333
+ titleMenu:_titleMenu];
326
334
  if (locator == nil) {
327
335
  RCTLogWarn(@"[RNScreens] setMenuOptions: element with id \"%@\" not found", menuElementId);
328
336
  return;
@@ -346,8 +354,17 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
346
354
  parentMenu:locator.searchResult.parentMenu];
347
355
  break;
348
356
  case RNSMenuElementPositionTitle:
357
+ if (locator.searchResult.parentMenu == nil) {
358
+ _titleMenu = (RNSStackHeaderMenuData *)newMenuItem;
359
+ } else {
360
+ _titleMenu = [RNSStackHeaderMenuCoordinator menu:_titleMenu
361
+ replacingChildWithId:menuElementId
362
+ withElement:newMenuItem];
363
+ }
364
+ [self.headerCoordinator reapplyTitleMenu];
365
+ break;
349
366
  case RNSMenuElementPositionOverflow:
350
- // TODO: handle title menu and overflow menu
367
+ // TODO: handle overflow menu
351
368
  break;
352
369
  }
353
370
  }
@@ -396,6 +413,8 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
396
413
  const auto &newHeaderProps = *std::static_pointer_cast<const react::RNSStackHeaderConfigIOSProps>(props);
397
414
  const auto &oldHeaderProps = *std::static_pointer_cast<const react::RNSStackHeaderConfigIOSProps>(_props);
398
415
 
416
+ BOOL titleMenuDidChange = NO;
417
+
399
418
  if (oldHeaderProps.title != newHeaderProps.title) {
400
419
  _title = RCTNSStringFromStringNilIfEmpty(newHeaderProps.title);
401
420
  }
@@ -420,9 +439,51 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
420
439
  _largeTitleEnabled = newHeaderProps.largeTitleEnabled;
421
440
  }
422
441
 
442
+ if (oldHeaderProps.prompt != newHeaderProps.prompt) {
443
+ _prompt = RCTNSStringFromStringNilIfEmpty(newHeaderProps.prompt);
444
+ }
445
+
446
+ if (oldHeaderProps.backButtonTitle != newHeaderProps.backButtonTitle) {
447
+ _backButtonTitle = RCTNSStringFromStringNilIfEmpty(newHeaderProps.backButtonTitle);
448
+ }
449
+
450
+ if (oldHeaderProps.backButtonDisplayMode != newHeaderProps.backButtonDisplayMode) {
451
+ _backButtonDisplayMode =
452
+ rnscreens::conversion::UINavigationItemBackButtonDisplayModeFromReactRNSStackHeaderConfigIOSBackButtonDisplayMode(
453
+ newHeaderProps.backButtonDisplayMode);
454
+ }
455
+
456
+ if (oldHeaderProps.backButtonMenuEnabled != newHeaderProps.backButtonMenuEnabled) {
457
+ _backButtonMenuEnabled = newHeaderProps.backButtonMenuEnabled;
458
+ }
459
+
460
+ if (oldHeaderProps.standardAppearance != newHeaderProps.standardAppearance) {
461
+ _standardAppearance = [RNSStackHeaderAppearanceMapper
462
+ appearanceFromDictionary:[self dictionaryFromAppearanceProp:newHeaderProps.standardAppearance]];
463
+ }
464
+
465
+ if (oldHeaderProps.scrollEdgeAppearance != newHeaderProps.scrollEdgeAppearance) {
466
+ _scrollEdgeAppearance = [RNSStackHeaderAppearanceMapper
467
+ scrollEdgeAppearanceFromDictionary:[self dictionaryFromAppearanceProp:newHeaderProps.scrollEdgeAppearance]];
468
+ }
469
+
470
+ if (oldHeaderProps.titleMenu != newHeaderProps.titleMenu) {
471
+ _titleMenu = [RNSStackHeaderMenuMapper
472
+ menuFromDictionary:rnscreens::conversion::RNSConvertFollyDynamicToId(newHeaderProps.titleMenu)];
473
+ titleMenuDidChange = YES;
474
+ }
475
+
423
476
  [super updateProps:props oldProps:oldProps];
424
477
 
425
- [[self headerCoordinator] applyConfigProperties];
478
+ [self.headerCoordinator applyConfigProperties];
479
+
480
+ if (titleMenuDidChange) {
481
+ // title menu is a prop on the navigation item, not on one of the bar button items
482
+ // thus it is not configured with matching RNSStackHeaderItemComponentView
483
+ // but here directly
484
+ [self.headerCoordinator resetTitleMenuTracker];
485
+ [self.headerCoordinator reapplyTitleMenu];
486
+ }
426
487
  }
427
488
 
428
489
  + (react::ComponentDescriptorProvider)componentDescriptorProvider
@@ -444,6 +505,15 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
444
505
 
445
506
  #pragma mark - Private
446
507
 
508
+ - (nullable NSDictionary *)dictionaryFromAppearanceProp:(const folly::dynamic &)appearanceProp
509
+ {
510
+ if (appearanceProp.type() != folly::dynamic::OBJECT) {
511
+ return nil;
512
+ }
513
+
514
+ return rnscreens::conversion::RNSConvertFollyDynamicToId(appearanceProp);
515
+ }
516
+
447
517
  - (nullable RNSStackScreenHeaderCoordinator *)headerCoordinator
448
518
  {
449
519
  if (self.superview == nil) {
@@ -2,6 +2,8 @@
2
2
 
3
3
  #import <UIKit/UIKit.h>
4
4
 
5
+ @class RNSStackHeaderMenuData;
6
+
5
7
  NS_ASSUME_NONNULL_BEGIN
6
8
 
7
9
  @protocol RNSStackHeaderConfigDataProviding <NSObject>
@@ -12,6 +14,13 @@ NS_ASSUME_NONNULL_BEGIN
12
14
  @property (nonatomic, readonly, nullable) NSString *largeTitle;
13
15
  @property (nonatomic, readonly, nullable) NSString *largeSubtitle;
14
16
  @property (nonatomic, readonly) BOOL largeTitleEnabled;
17
+ @property (nonatomic, readonly, nullable) NSString *prompt;
18
+ @property (nonatomic, readonly, nullable) NSString *backButtonTitle;
19
+ @property (nonatomic, readonly) UINavigationItemBackButtonDisplayMode backButtonDisplayMode;
20
+ @property (nonatomic, readonly) BOOL backButtonMenuEnabled;
21
+ @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *titleMenu;
22
+ @property (nonatomic, readonly, nullable) UINavigationBarAppearance *standardAppearance;
23
+ @property (nonatomic, readonly, nullable) UINavigationBarAppearance *scrollEdgeAppearance;
15
24
 
16
25
  /**
17
26
  Children are expected to conform to either RNSStackHeaderItemDataProviding
@@ -2,7 +2,7 @@
2
2
  #import "RNSStackHeaderConfigComponentView.h"
3
3
 
4
4
  #import <React/RCTConversions.h>
5
- #import <rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
5
+ #import <react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
6
6
 
7
7
  namespace react = facebook::react;
8
8
 
@@ -1,4 +1,5 @@
1
1
  #import "RNSStackHeaderIconResolver.h"
2
+ #import <React/RCTLog.h>
2
3
 
3
4
  @implementation RNSStackHeaderIconResolver
4
5
 
@@ -18,11 +19,17 @@
18
19
  switch (iconData.iconType) {
19
20
  case RNSStackHeaderIconTypeSfSymbol: {
20
21
  UIImage *image = [UIImage systemImageNamed:iconData.resourceName];
22
+ if (image == nil && iconData.resourceName != nil) {
23
+ RCTLogWarn(@"[RNScreens] Failed to load SF Symbol \"%@\" for header icon", iconData.resourceName);
24
+ }
21
25
  iconData.resolvedImage = image;
22
26
  return image;
23
27
  }
24
28
  case RNSStackHeaderIconTypeXcasset: {
25
29
  UIImage *image = [UIImage imageNamed:iconData.resourceName];
30
+ if (image == nil && iconData.resourceName != nil) {
31
+ RCTLogWarn(@"[RNScreens] Failed to load xcasset \"%@\" for header icon", iconData.resourceName);
32
+ }
26
33
  iconData.resolvedImage = image;
27
34
  return image;
28
35
  }
@@ -12,11 +12,13 @@ NS_ASSUME_NONNULL_BEGIN
12
12
 
13
13
  @property (nonatomic, readonly) RNSHeaderItemPlacement placement;
14
14
  @property (nonatomic, readonly, nullable) NSString *itemId;
15
+ @property (nonatomic, readonly, nullable) NSString *identifier;
15
16
  @property (nonatomic, readonly, nullable) NSString *title;
16
17
  @property (nonatomic, readonly, nullable) RNSStackHeaderIconData *icon;
17
18
  @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menu;
18
19
  @property (nonatomic, readonly, nullable) UIView *customView;
19
20
  @property (nonatomic, readonly) BOOL respondsToOnPress;
21
+ @property (nonatomic, readonly) BOOL hidesSharedBackground;
20
22
 
21
23
  @property (nonatomic, nullable) NSString *titleProp;
22
24
  @property (nonatomic, nullable) RNSStackHeaderIconData *iconProp;
@@ -42,7 +44,7 @@ NS_ASSUME_NONNULL_END
42
44
 
43
45
  #if defined(__cplusplus)
44
46
 
45
- #import <rnscreens/RNSStackHeaderItemComponentDescriptor.h>
47
+ #import <react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h>
46
48
 
47
49
  @interface RNSStackHeaderItemComponentView ()
48
50
 
@@ -13,7 +13,7 @@
13
13
  #import <React/RCTLog.h>
14
14
  #import <react/renderer/components/rnscreens/Props.h>
15
15
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
16
- #import <rnscreens/RNSStackHeaderItemComponentDescriptor.h>
16
+ #import <react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h>
17
17
 
18
18
  namespace react = facebook::react;
19
19
 
@@ -45,12 +45,14 @@ namespace react = facebook::react;
45
45
  - (void)resetProps
46
46
  {
47
47
  _itemId = nil;
48
+ _identifier = nil;
48
49
  [self setTitleProp:nil];
49
50
  [self setIconProp:nil];
50
51
  [self setMenuProp:nil];
51
52
  _placement = RNSHeaderItemPlacementTrailing;
52
53
  _didSetHeaderItemPlacement = NO;
53
54
  _respondsToOnPress = NO;
55
+ _hidesSharedBackground = NO;
54
56
  }
55
57
 
56
58
  - (void)setTitleProp:(NSString *)titleProp
@@ -183,11 +185,17 @@ RNS_IGNORE_SUPER_CALL_END
183
185
  _itemId = RCTNSStringFromStringNilIfEmpty(newItemProps.itemId);
184
186
  }
185
187
 
188
+ if (oldItemProps.identifier != newItemProps.identifier) {
189
+ _identifier = RCTNSStringFromStringNilIfEmpty(newItemProps.identifier);
190
+ needsUpdate = YES;
191
+ }
192
+
186
193
  if (oldItemProps.placement != newItemProps.placement) {
187
194
  if (_didSetHeaderItemPlacement) {
188
195
  RCTLogWarn(@"[RNScreens] Changing header item placement at runtime is not supported");
189
196
  } else {
190
- _placement = rnscreens::conversion::convert<RNSHeaderItemPlacement>(newItemProps.placement);
197
+ _placement =
198
+ rnscreens::conversion::RNSHeaderItemPlacementFromReactRNSStackHeaderItemIOSPlacement(newItemProps.placement);
191
199
  }
192
200
  }
193
201
  _didSetHeaderItemPlacement = YES;
@@ -214,6 +222,11 @@ RNS_IGNORE_SUPER_CALL_END
214
222
  needsUpdate = YES;
215
223
  }
216
224
 
225
+ if (oldItemProps.hidesSharedBackground != newItemProps.hidesSharedBackground) {
226
+ _hidesSharedBackground = newItemProps.hidesSharedBackground;
227
+ needsUpdate = YES;
228
+ }
229
+
217
230
  [super updateProps:props oldProps:oldProps];
218
231
 
219
232
  if (needsUpdate) {
@@ -12,11 +12,13 @@ NS_ASSUME_NONNULL_BEGIN
12
12
 
13
13
  @property (nonatomic, readonly) RNSHeaderItemPlacement placement;
14
14
  @property (nonatomic, readonly, nullable) NSString *itemId;
15
+ @property (nonatomic, readonly, nullable) NSString *identifier;
15
16
  @property (nonatomic, readonly, nullable) NSString *title;
16
17
  @property (nonatomic, readonly, nullable) RNSStackHeaderIconData *icon;
17
18
  @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menu;
18
19
  @property (nonatomic, readonly, nullable) UIView *customView;
19
20
  @property (nonatomic, readonly) BOOL respondsToOnPress;
21
+ @property (nonatomic, readonly) BOOL hidesSharedBackground;
20
22
 
21
23
  @end
22
24
 
@@ -2,7 +2,7 @@
2
2
  #import "RNSStackHeaderItemComponentView.h"
3
3
 
4
4
  #import <React/RCTConversions.h>
5
- #import <rnscreens/RNSStackHeaderItemComponentDescriptor.h>
5
+ #import <react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h>
6
6
 
7
7
  namespace react = facebook::react;
8
8
 
@@ -43,7 +43,8 @@ namespace react = facebook::react;
43
43
  if (_didSetHeaderItemSpacerPlacement) {
44
44
  RCTLogWarn(@"[RNScreens] Changing header item spacer placement at runtime is not supported");
45
45
  } else {
46
- _placement = rnscreens::conversion::convert<RNSHeaderItemSpacerPlacement>(newSpacerProps.placement);
46
+ _placement = rnscreens::conversion::RNSHeaderItemSpacerPlacementFromReactRNSStackHeaderItemSpacerIOSPlacement(
47
+ newSpacerProps.placement);
47
48
  }
48
49
  }
49
50
  _didSetHeaderItemSpacerPlacement = YES;
@@ -35,6 +35,15 @@ NS_ASSUME_NONNULL_BEGIN
35
35
  */
36
36
  + (NSArray<NSString *> *)getToggleItemsIdsInMenu:(RNSStackHeaderMenuData *)menu;
37
37
 
38
+ /**
39
+ * Builds a UIMenu from the given menu data. Used for `UINavigationItem.titleMenuProvider`.
40
+ */
41
+ + (UIMenu *)buildUIMenuFromData:(RNSStackHeaderMenuData *)data
42
+ withHeaderEventsDelegate:(id<RNSStackHeaderEventsDelegate>)delegate
43
+ stateTracker:(RNSStackHeaderMenuToggleStateTracker *)tracker
44
+ withImageLoader:(id<RNSImageLoading>)imageLoader
45
+ menuInvalidatedCallback:(nullable void (^)(void))onMenuInvalidated;
46
+
38
47
  /**
39
48
  * Constructs a new menu tree with the child matching `elementId` replaced by `newElement`.
40
49
  * Returns the original menu unchanged if no matching child is found in the subtree.
@@ -88,6 +88,21 @@
88
88
  return [UIMenu menuWithTitle:data.title image:menuImage identifier:nil options:options children:elements];
89
89
  }
90
90
 
91
+ + (UIMenu *)buildUIMenuFromData:(RNSStackHeaderMenuData *)data
92
+ withHeaderEventsDelegate:(id<RNSStackHeaderEventsDelegate>)delegate
93
+ stateTracker:(RNSStackHeaderMenuToggleStateTracker *)tracker
94
+ withImageLoader:(id<RNSImageLoading>)imageLoader
95
+ menuInvalidatedCallback:(nullable void (^)(void))onMenuInvalidated
96
+ {
97
+ return [self buildMenuFromData:data
98
+ withHeaderEventsDelegate:delegate
99
+ stateTracker:tracker
100
+ singleSelectionRoot:nil
101
+ initialSingleSelectionStateClaimed:NULL
102
+ withImageLoader:imageLoader
103
+ menuInvalidatedCallback:onMenuInvalidated];
104
+ }
105
+
91
106
  + (nullable UIMenuElement *)buildElementFromData:(id<RNSStackHeaderMenuElement>)element
92
107
  withHeaderEventsDelegate:(id<RNSStackHeaderEventsDelegate>)delegate
93
108
  stateTracker:(RNSStackHeaderMenuToggleStateTracker *)tracker